diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4cf073a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +# Dependencies and compiled code +node_modules +dist + +# Secrets (CRITICAL) +.env +.env.* + +# Git and Docs +.git +.gitignore +*.md + +# Local Package Manager Configs +.npmrc diff --git a/.env b/.env deleted file mode 100644 index 6f348e4..0000000 --- a/.env +++ /dev/null @@ -1,4 +0,0 @@ -NEXT_PUBLIC_SUPABASE_URL=https://rjzrwnrapvrnuccqrjyo.supabase.co -NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InJqenJ3bnJhcHZybnVjY3FyanlvIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjE3MzA2MjMsImV4cCI6MjAzNzMwNjYyM30.aS0rG1chegdaG3cMP2-w7LoatSwxN-R3btlFFbOGinw -NEXT_PUBLIC_SITE_URL=https://do-note.vercel.app/ -NEXT_PUBLIC_PREVIEW_SITE_URL=https://do-note-git-preview-bennett1412s-projects.vercel.app/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index ce9c018..c61c8b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +s://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies /node_modules @@ -24,11 +24,8 @@ npm-debug.log* yarn-debug.log* yarn-error.log* -# local env files -.env*.local - -# vercel -.vercel +.env +.nev # typescript *.tsbuildinfo diff --git a/.nev b/.nev new file mode 100644 index 0000000..27a729f --- /dev/null +++ b/.nev @@ -0,0 +1 @@ +DB_PASSWORD=donote diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..d67f374 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +node-linker=hoisted diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..151d587 --- /dev/null +++ b/Caddyfile @@ -0,0 +1,33 @@ +{ + # Order rate limiting middleware before the reverse proxy + order rate_limit before reverse_proxy +} + +:80 { + # Apply security headers + header { + X-Frame-Options "DENY" + X-Content-Type-Options "nosniff" + Referrer-Policy "strict-origin-when-cross-origin" + Permissions-Policy "geolocation=(), microphone=(), camera=()" + X-XSS-Protection "1; mode=block" + } + + # Restrict request body sizes to 2 Megabytes + request_body { + max_size 2mb + } + + # Enforce Rate Limiting: Max 10 req/sec per client IP with a burst allowance of 15 + rate_limit { + zone api_limit { + key {client_ip} + events 10 + window 1s + burst 15 + } + } + + # Forward all traffic to the api container on port 3000 + reverse_proxy api:3000 +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..41a057f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +# ========================================== +# Stage 1: Core Setup (Official Base) +# ========================================== +FROM node:22-alpine AS base +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME/bin:$PATH" +RUN npm install -g corepack@latest && corepack enable + +# ========================================== +# Stage 2: Monorepo Build & Bundle Deployment +# ========================================== +FROM base AS build +COPY . /usr/src/app +WORKDIR /usr/src/app + +# 1. Install all dependencies across the workspace using BuildKit caching + +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile + +# 2. Run your tsup compilation script +RUN pnpm api:build + +# 3. Magic Step: Let pnpm safely extract your production API bundle +# This isolates your compiled code and production node_modules into a flat /prod/api directory +RUN pnpm deploy --filter=api --prod /prod/api + +# 4. Copy Drizzle migrations into the production bundle +COPY apps/api/drizzle /prod/api/drizzle + +# ========================================== +# Stage 3: Clean Production Runner +# ========================================== +FROM base AS runner +WORKDIR /prod/api +ENV NODE_ENV=production + +# Copy the completely flattened, self-contained production bundle from Stage 2 +COPY --from=build /prod/api /prod/api + +EXPOSE 3000 + +# Start your app directly using the package.json start script +CMD [ "pnpm", "start" ] diff --git a/README.md b/README.md index a113d9e..771b782 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,33 @@ -# Do Note -A Google Keep like note taking app with some rich text formating options inspired from Notion and some more improvements, will be integrated to a sticky note browser extension (a work in progress 😅). +````mermaid +flowchart TD ---- + client[Client / Next.js] + api[Go API] + pg[(Postgres)] -## Main Features that have to be implemented + rp[(Redpanda)] -- [X] Paste image from clipboard, positioned within the text -- [ ] Voice to text -- [ ] Works offline + curator[Feed Poller Worker] + parser[Feed Parser Worker] + analytics[Analytics Worker] ---- + rss[External RSS Feeds] -## To run the app -1. Install all the dependencies with: `pnpm install`. -2. Create a supabase project and add the following config variables in a .env file: -```env -NEXT_PUBLIC_SUPABASE_URL = {supabase_url} -NEXT_PUBLIC_SUPABASE_ANON_KEY = {secret_key} -``` -4. Run the project in development with: `pnpm run dev`. \ No newline at end of file + client <-->|CRUD + publish| api + + api <--> pg + + api -->|PostPublished event| rp + + curator -->|poll feeds| rss + curator -->|FeedFetched event| rp + + rp --> parser + parser -->|store normalized content| pg + + client -->|view article| api + api -->|ArticleViewed event| rp + + rp --> analytics + analytics -->|aggregate stats| pg ``` +```` diff --git a/apps/api/.env.example b/apps/api/.env.example new file mode 100644 index 0000000..99a95e8 --- /dev/null +++ b/apps/api/.env.example @@ -0,0 +1,10 @@ +# Server config +PORT=8080 +HOST=0.0.0.0 + +# Database config +# To run in Mock Mode (in-memory array, no Postgres required), set MOCK_DB=true +MOCK_DB=true + +# When MOCK_DB is false/unset, DATABASE_URL must be a valid Postgres connection string +DATABASE_URL=postgres://postgres:postgres@localhost:5432/donote diff --git a/apps/api/.gitignore b/apps/api/.gitignore new file mode 100644 index 0000000..d4a26bc --- /dev/null +++ b/apps/api/.gitignore @@ -0,0 +1,49 @@ + +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build +/dist + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# files generated by next-pwa +**/public/precache.*.*.js +**/public/sw.js +**/public/workbox-*.js +**/public/worker-*.js +**/public/fallback-*.js +**/public/precache.*.*.js.map +**/public/sw.js.map +**/public/workbox-*.js.map +**/public/worker-*.js.map +**/public/fallback-*.js diff --git a/apps/api/.npmignore b/apps/api/.npmignore new file mode 100644 index 0000000..e69de29 diff --git a/apps/api/drizzle.config.ts b/apps/api/drizzle.config.ts new file mode 100644 index 0000000..c92d39e --- /dev/null +++ b/apps/api/drizzle.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "drizzle-kit"; +import * as dotenv from "dotenv"; + +dotenv.config(); + +export default defineConfig({ + schema: "./src/db/schema.ts", + out: "./drizzle", + dialect: "postgresql", + dbCredentials: { + url: process.env.DATABASE_URL || "postgres://postgres:postgres@localhost:5432/donote", + }, +}); diff --git a/apps/api/drizzle/0000_stale_nico_minoru.sql b/apps/api/drizzle/0000_stale_nico_minoru.sql new file mode 100644 index 0000000..d9e6c44 --- /dev/null +++ b/apps/api/drizzle/0000_stale_nico_minoru.sql @@ -0,0 +1,29 @@ +CREATE TYPE "public"."user_role" AS ENUM('super_user', 'admin', 'user');--> statement-breakpoint +CREATE TABLE "notes" ( + "id" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "notes_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1), + "creator" uuid NOT NULL, + "note_title" varchar(255) NOT NULL, + "note_content" text DEFAULT '', + "color" varchar(7) DEFAULT '#ffffff', + "is_article" boolean DEFAULT false, + "is_active" boolean DEFAULT true, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "users" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "email" varchar(255) NOT NULL, + "password_hash" varchar(255) NOT NULL, + "role" "user_role" DEFAULT 'user' NOT NULL, + "max_notes" integer DEFAULT 5 NOT NULL, + "max_storage_bytes" bigint DEFAULT 1048576 NOT NULL, + "is_active" boolean DEFAULT true NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +ALTER TABLE "notes" ADD CONSTRAINT "notes_creator_users_id_fk" FOREIGN KEY ("creator") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +CREATE INDEX "idx_notes_creator" ON "notes" USING btree ("creator");--> statement-breakpoint +CREATE INDEX "idx_notes_creator_created" ON "notes" USING btree ("creator","created_at" DESC NULLS LAST);--> statement-breakpoint +CREATE UNIQUE INDEX "idx_users_email" ON "users" USING btree ("email"); \ No newline at end of file diff --git a/apps/api/drizzle/0001_small_susan_delgado.sql b/apps/api/drizzle/0001_small_susan_delgado.sql new file mode 100644 index 0000000..f71604a --- /dev/null +++ b/apps/api/drizzle/0001_small_susan_delgado.sql @@ -0,0 +1,2 @@ +ALTER TABLE "notes" ALTER COLUMN "color" SET DATA TYPE varchar(255);--> statement-breakpoint +ALTER TABLE "notes" ALTER COLUMN "color" SET DEFAULT '#ffffff'; \ No newline at end of file diff --git a/apps/api/drizzle/0002_rare_starhawk.sql b/apps/api/drizzle/0002_rare_starhawk.sql new file mode 100644 index 0000000..b5d0c47 --- /dev/null +++ b/apps/api/drizzle/0002_rare_starhawk.sql @@ -0,0 +1,2 @@ +ALTER TABLE "notes" ADD COLUMN "is_deleted" boolean DEFAULT false;--> statement-breakpoint +ALTER TABLE "notes" DROP COLUMN "is_active"; \ No newline at end of file diff --git a/apps/api/drizzle/meta/0000_snapshot.json b/apps/api/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..ba996a6 --- /dev/null +++ b/apps/api/drizzle/meta/0000_snapshot.json @@ -0,0 +1,255 @@ +{ + "id": "0d36201f-1795-4e11-af24-b1b4a6de0999", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.notes": { + "name": "notes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "bigint", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "byDefault", + "name": "notes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": "1", + "cycle": false + } + }, + "creator": { + "name": "creator", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "note_title": { + "name": "note_title", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "note_content": { + "name": "note_content", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "color": { + "name": "color", + "type": "varchar(7)", + "primaryKey": false, + "notNull": false, + "default": "'#ffffff'" + }, + "is_article": { + "name": "is_article", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idx_notes_creator": { + "name": "idx_notes_creator", + "columns": [ + { + "expression": "creator", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_notes_creator_created": { + "name": "idx_notes_creator_created", + "columns": [ + { + "expression": "creator", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "notes_creator_users_id_fk": { + "name": "notes_creator_users_id_fk", + "tableFrom": "notes", + "tableTo": "users", + "columnsFrom": [ + "creator" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "password_hash": { + "name": "password_hash", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "user_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'user'" + }, + "max_notes": { + "name": "max_notes", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "max_storage_bytes": { + "name": "max_storage_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "default": 1048576 + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idx_users_email": { + "name": "idx_users_email", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.user_role": { + "name": "user_role", + "schema": "public", + "values": [ + "super_user", + "admin", + "user" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/api/drizzle/meta/0001_snapshot.json b/apps/api/drizzle/meta/0001_snapshot.json new file mode 100644 index 0000000..d95e79d --- /dev/null +++ b/apps/api/drizzle/meta/0001_snapshot.json @@ -0,0 +1,255 @@ +{ + "id": "9c2a43e1-6257-4007-9c57-3996057c1ce7", + "prevId": "0d36201f-1795-4e11-af24-b1b4a6de0999", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.notes": { + "name": "notes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "bigint", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "byDefault", + "name": "notes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": "1", + "cycle": false + } + }, + "creator": { + "name": "creator", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "note_title": { + "name": "note_title", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "note_content": { + "name": "note_content", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "color": { + "name": "color", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'#ffffff'" + }, + "is_article": { + "name": "is_article", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idx_notes_creator": { + "name": "idx_notes_creator", + "columns": [ + { + "expression": "creator", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_notes_creator_created": { + "name": "idx_notes_creator_created", + "columns": [ + { + "expression": "creator", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "notes_creator_users_id_fk": { + "name": "notes_creator_users_id_fk", + "tableFrom": "notes", + "tableTo": "users", + "columnsFrom": [ + "creator" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "password_hash": { + "name": "password_hash", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "user_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'user'" + }, + "max_notes": { + "name": "max_notes", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "max_storage_bytes": { + "name": "max_storage_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "default": 1048576 + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idx_users_email": { + "name": "idx_users_email", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.user_role": { + "name": "user_role", + "schema": "public", + "values": [ + "super_user", + "admin", + "user" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/api/drizzle/meta/0002_snapshot.json b/apps/api/drizzle/meta/0002_snapshot.json new file mode 100644 index 0000000..330a7c4 --- /dev/null +++ b/apps/api/drizzle/meta/0002_snapshot.json @@ -0,0 +1,255 @@ +{ + "id": "be80e0ca-90f7-497e-aba5-1200ad01717f", + "prevId": "9c2a43e1-6257-4007-9c57-3996057c1ce7", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.notes": { + "name": "notes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "bigint", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "byDefault", + "name": "notes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": "1", + "cycle": false + } + }, + "creator": { + "name": "creator", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "note_title": { + "name": "note_title", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "note_content": { + "name": "note_content", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "color": { + "name": "color", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'#ffffff'" + }, + "is_article": { + "name": "is_article", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idx_notes_creator": { + "name": "idx_notes_creator", + "columns": [ + { + "expression": "creator", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_notes_creator_created": { + "name": "idx_notes_creator_created", + "columns": [ + { + "expression": "creator", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "notes_creator_users_id_fk": { + "name": "notes_creator_users_id_fk", + "tableFrom": "notes", + "tableTo": "users", + "columnsFrom": [ + "creator" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "password_hash": { + "name": "password_hash", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "user_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'user'" + }, + "max_notes": { + "name": "max_notes", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "max_storage_bytes": { + "name": "max_storage_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "default": 1048576 + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idx_users_email": { + "name": "idx_users_email", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.user_role": { + "name": "user_role", + "schema": "public", + "values": [ + "super_user", + "admin", + "user" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/api/drizzle/meta/_journal.json b/apps/api/drizzle/meta/_journal.json new file mode 100644 index 0000000..782edbc --- /dev/null +++ b/apps/api/drizzle/meta/_journal.json @@ -0,0 +1,27 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1783826016193, + "tag": "0000_stale_nico_minoru", + "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1784462950531, + "tag": "0001_small_susan_delgado", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1786453054652, + "tag": "0002_rare_starhawk", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 0000000..caf9bf5 --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,44 @@ +{ + "name": "api", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "dev": "tsx watch src/server.ts", + "build": "tsup src/server.ts src/db/migrate.ts src/db/seed.ts --format esm --clean", + "start": "node dist/server.js", + "db:generate": "drizzle-kit generate", + "db:migrate": "tsx src/db/migrate.ts", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.24.0", + "dependencies": { + "@fastify/cors": "^11.2.0", + "@fastify/jwt": "^10.2.1", + "bcryptjs": "^2.4.3", + "dotenv": "^17.4.2", + "drizzle-orm": "^0.45.2", + "drizzle-zod": "^0.8.3", + "fastify": "^5.8.5", + "fastify-type-provider-zod": "^6.1.0", + "jsonwebtoken": "^9.0.2", + "postgres": "^3.4.9", + "zod": "^4.4.3" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/jsonwebtoken": "^9.0.7", + "@types/node": "^25.6.0", + "drizzle-kit": "^0.31.10", + "nodemon": "^3.1.14", + "pino-pretty": "^13.1.3", + "ts-node": "^10.9.2", + "tsup": "^8.5.1", + "tsx": "^4.22.3", + "typescript": "^6.0.3" + } +} diff --git a/apps/api/src/auth.ts b/apps/api/src/auth.ts new file mode 100644 index 0000000..4322cc4 --- /dev/null +++ b/apps/api/src/auth.ts @@ -0,0 +1,20 @@ +import bcrypt from "bcryptjs"; + +const BCRYPT_ROUNDS = 10; + +export interface JwtPayload { + sub: string; // user id + email: string; + role: "super_user" | "admin" | "user"; +} + +export async function hashPassword(password: string): Promise { + return bcrypt.hash(password, BCRYPT_ROUNDS); +} + +export async function verifyPassword( + password: string, + hash: string, +): Promise { + return bcrypt.compare(password, hash); +} \ No newline at end of file diff --git a/apps/api/src/db/index.ts b/apps/api/src/db/index.ts new file mode 100644 index 0000000..67a5298 --- /dev/null +++ b/apps/api/src/db/index.ts @@ -0,0 +1,244 @@ +import { drizzle, type PostgresJsDatabase } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; +import * as schema from "./schema"; +import { + users, + notes, + type User, + type NewUser, + type Note, + type NewNote, +} from "./schema"; +import { eq, and, count, sql, gte } from "drizzle-orm"; +import * as dotenv from "dotenv"; + +// ── Public user type (without password hash) ──────────────────── +export type PublicUser = Omit; + +dotenv.config(); + +// ── Repository interface ──────────────────────────────────────── +export interface IDatabaseRepository { + // Auth + getUserByEmail(email: string): Promise; + getUserById(id: string): Promise; + createUser(user: NewUser): Promise; + updateUser(id: string, fields: Partial): Promise; + + // Notes + getNotes(creatorId: string): Promise; + getNote(id: number, creatorId: string): Promise; + createNote( + note: Omit, + ): Promise; + updateNote( + id: number, + creatorId: string, + fields: Partial, + ): Promise; + deleteNote(id: number, creatorId: string): Promise; + + // Limits + getUserNoteCount(creatorId: string): Promise; + getUserStorageUsed(creatorId: string): Promise; + + // Admin / monitoring + getDbStats(): Promise; + getAllUsers(): Promise; + + close(): Promise; +} + +export interface DbStats { + totalUsers: number; + totalNotes: number; + activeUsers7d: number; + estimatedDbSizeBytes: number; +} + +// ── Implementation ────────────────────────────────────────────── +class DrizzleRepository implements IDatabaseRepository { + constructor( + private db: PostgresJsDatabase, + private client: postgres.Sql, + ) {} + + // -- Auth ------------------------------------------------------- + + async getUserByEmail(email: string): Promise { + const result = await this.db + .select() + .from(users) + .where(eq(users.email, email.toLowerCase().trim())) + .limit(1); + return result[0] ?? null; + } + + async getUserById(id: string): Promise { + const result = await this.db + .select() + .from(users) + .where(eq(users.id, id)) + .limit(1); + return result[0] ?? null; + } + + async createUser(user: NewUser): Promise { + const result = await this.db.insert(users).values(user).returning(); + if (!result[0]) throw new Error("Failed to create user"); + return result[0]; + } + + async updateUser(id: string, fields: Partial): Promise { + const result = await this.db + .update(users) + .set({ ...fields, updatedAt: new Date() }) + .where(eq(users.id, id)) + .returning(); + return result[0] ?? null; + } + + // -- Notes ------------------------------------------------------ + + async getNotes(creatorId: string): Promise { + return this.db + .select() + .from(notes) + .where(and(eq(notes.creator, creatorId), eq(notes.isDeleted, false))) + .orderBy(sql`${notes.updatedAt} DESC`); + } + + async getNote(id: number, creatorId: string): Promise { + const result = await this.db + .select() + .from(notes) + .where(and(eq(notes.id, id), eq(notes.creator, creatorId), eq(notes.isDeleted, false))) + .limit(1); + return result[0] ?? null; + } + + async createNote( + note: Omit, + ): Promise { + const result = await this.db.insert(notes).values(note).returning(); + if (!result[0]) throw new Error("Failed to create note"); + return result[0]; + } + + async updateNote( + id: number, + creatorId: string, + fields: Partial, + ): Promise { + const result = await this.db + .update(notes) + .set({ ...fields, updatedAt: new Date() }) + .where(and(eq(notes.id, id), eq(notes.creator, creatorId))) + .returning(); + return result[0] ?? null; + } + + async deleteNote(id: number, creatorId: string): Promise { + // Soft delete: mark as deleted instead of hard delete + const result = await this.db + .update(notes) + .set({ isDeleted: true, updatedAt: new Date() }) + .where(and(eq(notes.id, id), eq(notes.creator, creatorId))) + .returning({ id: notes.id }); + return result.length > 0; + } + + // -- Limits ----------------------------------------------------- + + async getUserNoteCount(creatorId: string): Promise { + const result = await this.db + .select({ count: count() }) + .from(notes) + .where(and(eq(notes.creator, creatorId), eq(notes.isDeleted, false))); + return result[0]?.count ?? 0; + } + + async getUserStorageUsed(creatorId: string): Promise { + const result = await this.db + .select({ + total: sql`COALESCE(SUM(LENGTH(${notes.noteContent})), 0)::int`, + }) + .from(notes) + .where(and(eq(notes.creator, creatorId), eq(notes.isDeleted, false))); + return result[0]?.total ?? 0; + } + + // -- Monitoring ------------------------------------------------- + + async getDbStats(): Promise { + const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); + + const [totalUsers, totalNotes, activeUsers7d, dbSize] = await Promise.all([ + this.db.select({ count: count() }).from(users), + this.db + .select({ count: count() }) + .from(notes) + .where(eq(notes.isDeleted, false)), + this.db + .select({ count: count() }) + .from(notes) + .where(gte(notes.updatedAt, sevenDaysAgo)), + this.db.execute<{ size_bytes: string }>( + sql`SELECT pg_database_size(current_database()) AS size_bytes`, + ), + ]); + + const activeCount = await this.db + .select({ count: sql`COUNT(DISTINCT ${notes.creator})` }) + .from(notes) + .where(gte(notes.updatedAt, sevenDaysAgo)); + + return { + totalUsers: totalUsers[0]?.count ?? 0, + totalNotes: totalNotes[0]?.count ?? 0, + activeUsers7d: activeCount[0]?.count ?? 0, + estimatedDbSizeBytes: Number(dbSize[0]?.size_bytes ?? 0), + }; + } + + async getAllUsers(): Promise { + return this.db + .select({ + id: users.id, + email: users.email, + role: users.role, + maxNotes: users.maxNotes, + maxStorageBytes: users.maxStorageBytes, + isActive: users.isActive, + createdAt: users.createdAt, + updatedAt: users.updatedAt, + }) + .from(users) + .orderBy(sql`${users.createdAt} DESC`); + } + + async close(): Promise { + console.log("Closing PostgreSQL connection pool..."); + await this.client.end(); + console.log("PostgreSQL connection pool closed."); + } +} + +// ── Bootstrap ─────────────────────────────────────────────────── +function createDrizzleConnection() { + const connectionString = process.env.DATABASE_URL; + if (!connectionString) { + throw new Error("DATABASE_URL environment variable is missing."); + } + const maxConnections = Number(process.env.DB_MAX_CONNECTIONS) || 10; + + const client = postgres(connectionString, { max: maxConnections }); + const db = drizzle(client, { schema }); + console.log( + `PostgreSQL connection pool initialized (max: ${maxConnections}).`, + ); + return { db, client }; +} + +const { db, client } = createDrizzleConnection(); +export const dbClient: IDatabaseRepository = new DrizzleRepository(db, client); diff --git a/apps/api/src/db/migrate.ts b/apps/api/src/db/migrate.ts new file mode 100644 index 0000000..d35aa15 --- /dev/null +++ b/apps/api/src/db/migrate.ts @@ -0,0 +1,47 @@ +import { migrate } from "drizzle-orm/postgres-js/migrator"; +import { drizzle } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; +import * as dotenv from "dotenv"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import { fileURLToPath } from "node:url"; + +dotenv.config(); + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export async function runMigrations() { + const databaseUrl = process.env.DATABASE_URL; + if (!databaseUrl) { + console.error("DATABASE_URL is required for running migrations."); + process.exit(1); + } + + // In dev (src/): __dirname = apps/api/src/db, need ../../drizzle + // In production (dist/): __dirname = apps/api/dist/db, need ../../drizzle + const migrationsFolder = path.resolve(__dirname, "..", "..", "drizzle"); + + if (!fs.existsSync(migrationsFolder)) { + console.log( + `Migrations folder not found at ${migrationsFolder}, skipping migrations.`, + ); + return; + } + + console.log(`Running migrations from: ${migrationsFolder}`); + + const migrationClient = postgres(databaseUrl, { max: 1 }); + + try { + await migrate(drizzle(migrationClient), { + migrationsFolder, + }); + console.log("Migrations completed successfully."); + } catch (error) { + console.error("Migration failed:", error); + process.exit(1); + } finally { + await migrationClient.end(); + } +} diff --git a/apps/api/src/db/schema.ts b/apps/api/src/db/schema.ts new file mode 100644 index 0000000..af543db --- /dev/null +++ b/apps/api/src/db/schema.ts @@ -0,0 +1,81 @@ +import { + pgTable, + pgEnum, + uuid, + bigint, + varchar, + text, + boolean, + integer, + bigint as pgBigInt, + timestamp, + uniqueIndex, + index, +} from "drizzle-orm/pg-core"; + +// ── User role enum ────────────────────────────────────────────── +export const userRoleEnum = pgEnum("user_role", [ + "super_user", + "admin", + "user", +]); + +// ── Users table ───────────────────────────────────────────────── +export const users = pgTable( + "users", + { + id: uuid("id").primaryKey().defaultRandom(), + email: varchar("email", { length: 255 }).notNull(), + passwordHash: varchar("password_hash", { length: 255 }).notNull(), + role: userRoleEnum("role").notNull().default("user"), + maxNotes: integer("max_notes").notNull().default(5), + maxStorageBytes: pgBigInt("max_storage_bytes", { mode: "number" }) + .notNull() + .default(1_048_576), // 1 MB + isActive: boolean("is_active").notNull().default(true), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .defaultNow() + .notNull(), + }, + (table) => [uniqueIndex("idx_users_email").on(table.email)], +); + +// ── Notes table ───────────────────────────────────────────────── +export const notes = pgTable( + "notes", + { + id: bigint("id", { mode: "number" }) + .primaryKey() + .generatedByDefaultAsIdentity(), + creator: uuid("creator") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + noteTitle: varchar("note_title", { length: 255 }).notNull(), + noteContent: text("note_content").default(""), + color: varchar("color", { length: 255 }).default("#ffffff"), + isArticle: boolean("is_article").default(false), + isDeleted: boolean("is_deleted").default(false), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .defaultNow() + .notNull(), + }, + (table) => [ + index("idx_notes_creator").on(table.creator), + index("idx_notes_creator_created").on( + table.creator, + table.createdAt.desc(), + ), + ], +); + +// ── Exported types ────────────────────────────────────────────── +export type User = typeof users.$inferSelect; +export type NewUser = typeof users.$inferInsert; +export type Note = typeof notes.$inferSelect; +export type NewNote = typeof notes.$inferInsert; diff --git a/apps/api/src/db/seed.ts b/apps/api/src/db/seed.ts new file mode 100644 index 0000000..0fc4911 --- /dev/null +++ b/apps/api/src/db/seed.ts @@ -0,0 +1,65 @@ +import postgres from "postgres"; +import { drizzle } from "drizzle-orm/postgres-js"; +import { users } from "../db/schema.js"; +import { eq } from "drizzle-orm"; +import * as dotenv from "dotenv"; +import { hashPassword } from "../auth.js"; + +dotenv.config(); + +async function main() { + const args = process.argv.slice(2); + const emailFlag = args.indexOf("--email"); + const passwordFlag = args.indexOf("--password"); + + if (emailFlag === -1 || passwordFlag === -1) { + console.error("Usage: node dist/db/seed.js --email --password "); + process.exit(1); + } + + const email = args[emailFlag + 1]?.toLowerCase().trim(); + const password = args[passwordFlag + 1]; + + if (!email || !password) { + console.error("Both --email and --password are required."); + process.exit(1); + } + + const databaseUrl = process.env.DATABASE_URL; + if (!databaseUrl) { + console.error("DATABASE_URL environment variable is required."); + process.exit(1); + } + + const client = postgres(databaseUrl, { max: 1 }); + const db = drizzle(client); + + const existing = await db + .select() + .from(users) + .where(eq(users.email, email)) + .limit(1); + + if (existing.length > 0) { + console.log(`User ${email} already exists.`); + await client.end(); + return; + } + + const passwordHash = await hashPassword(password); + await db.insert(users).values({ + email, + passwordHash, + role: "super_user", + maxNotes: 999_999, + maxStorageBytes: 1_073_741_824, // 1 GB + }); + + console.log(`Super user ${email} created successfully.`); + await client.end(); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/apps/api/src/routes.ts b/apps/api/src/routes.ts new file mode 100644 index 0000000..8fefa6a --- /dev/null +++ b/apps/api/src/routes.ts @@ -0,0 +1,423 @@ +import type { FastifyPluginAsync } from "fastify"; +import type { FastifyRequest, FastifyReply } from "fastify"; +import fastifyJwt from "@fastify/jwt"; +import { dbClient } from "./db/index.js"; +import { hashPassword, verifyPassword } from "./auth.js"; + +// ── Types ──────────────────────────────────────────────────────── + +interface AuthUser { + id: string; + email: string; + role: "super_user" | "admin" | "user"; +} + +interface JwtPayload { + sub: string; + email: string; + role: "super_user" | "admin" | "user"; +} + +declare module "@fastify/jwt" { + interface FastifyJWT { + payload: JwtPayload; + user: AuthUser; + } +} + +// ── Auth middleware ───────────────────────────────────────────── + +async function authMiddleware(request: FastifyRequest, reply: FastifyReply) { + try { + await request.jwtVerify(); + const payload = request.user as unknown as JwtPayload; + const user = await dbClient.getUserById(payload.sub); + if (!user || !user.isActive) { + return reply.status(401).send({ error: "User not found or inactive" }); + } + request.user = { id: user.id, email: user.email, role: user.role }; + } catch (err: any) { + if (err?.code === "FAST_JWT_EXPIRED") { + return reply.status(401).send({ error: "Token expired" }); + } + return reply.status(401).send({ error: "Invalid token" }); + } +} + +function requireRole(...roles: string[]) { + return async (request: FastifyRequest, reply: FastifyReply) => { + if (!request.user || !roles.includes(request.user.role)) { + return reply.status(403).send({ error: "Forbidden" }); + } + }; +} + +// ── Routes ────────────────────────────────────────────────────── +export const routes: FastifyPluginAsync = async (fastify) => { + // Register JWT plugin + fastify.register(fastifyJwt, { + secret: process.env.JWT_SECRET || "dev-secret-change-me-in-production", + sign: { expiresIn: "7d" }, + }); + + // ================================================================ + // AUTH + // ================================================================ + + // -- Register -- + fastify.post( + "/api/auth/register", + { + schema: { + body: { + type: "object", + required: ["email", "password"], + properties: { + email: { type: "string", format: "email" }, + password: { type: "string", minLength: 8 }, + }, + }, + }, + }, + async (request, reply) => { + const { email, password } = request.body as { + email: string; + password: string; + }; + const normalized = email.toLowerCase().trim(); + + const existing = await dbClient.getUserByEmail(normalized); + if (existing) { + return reply.status(409).send({ error: "Email already registered" }); + } + + const passwordHash = await hashPassword(password); + const user = await dbClient.createUser({ + email: normalized, + passwordHash, + role: "user", + }); + + const token = fastify.jwt.sign({ + sub: user.id, + email: user.email, + role: user.role, + }); + return reply.status(201).send({ + user: { id: user.id, email: user.email, role: user.role }, + token, + }); + }, + ); + + // -- Login -- + fastify.post( + "/api/auth/login", + { + schema: { + body: { + type: "object", + required: ["email", "password"], + properties: { + email: { type: "string", format: "email" }, + password: { type: "string" }, + }, + }, + }, + }, + async (request, reply) => { + const { email, password } = request.body as { + email: string; + password: string; + }; + const user = await dbClient.getUserByEmail(email.toLowerCase().trim()); + if (!user || !user.isActive) { + return reply.status(401).send({ error: "Invalid credentials" }); + } + + const valid = await verifyPassword(password, user.passwordHash); + if (!valid) { + return reply.status(401).send({ error: "Invalid credentials" }); + } + + const token = fastify.jwt.sign({ + sub: user.id, + email: user.email, + role: user.role, + }); + return { + user: { id: user.id, email: user.email, role: user.role }, + token, + }; + }, + ); + + // -- Get current user from token -- + fastify.get( + "/api/auth/me", + { preHandler: [authMiddleware] }, + async (request, reply) => { + return { + id: request.user!.id, + email: request.user!.email, + role: request.user!.role, + }; + }, + ); + + // -- Refresh token -- + fastify.post( + "/api/auth/refresh", + { + schema: { + body: { + type: "object", + required: ["token"], + properties: { + token: { type: "string" }, + }, + }, + }, + }, + async (request, reply) => { + const { token } = request.body as { token: string }; + try { + const payload = fastify.jwt.verify<{ sub: string; email: string; role: AuthUser["role"] }>(token); + const user = await dbClient.getUserById(payload.sub); + if (!user || !user.isActive) { + return reply.status(401).send({ error: "User not found or inactive" }); + } + // Issue a fresh token + const newToken = fastify.jwt.sign({ + sub: user.id, + email: user.email, + role: user.role, + }); + return { token: newToken }; + } catch { + return reply.status(401).send({ error: "Invalid or expired token" }); + } + }, + ); + + // ================================================================ + // NOTES (protected) + // ================================================================ + + // -- List notes -- + fastify.get( + "/api/notes", + { preHandler: [authMiddleware] }, + async (request, reply) => { + const notesList = await dbClient.getNotes(request.user!.id); + return notesList; + }, + ); + + // -- Get single note -- + fastify.get( + "/api/notes/:id", + { + preHandler: [authMiddleware], + schema: { + params: { + type: "object", + required: ["id"], + properties: { id: { type: "integer" } }, + }, + }, + }, + async (request, reply) => { + const { id } = request.params as { id: string }; + const note = await dbClient.getNote(Number(id), request.user!.id); + if (!note) return reply.status(404).send({ error: "Note not found" }); + return note; + }, + ); + + // -- Create note (with limit checks) -- + fastify.post( + "/api/notes", + { + preHandler: [authMiddleware], + schema: { + body: { + type: "object", + properties: { + noteTitle: { type: "string", maxLength: 255 }, + noteContent: { type: "string", default: "" }, + color: { type: "string" }, + isArticle: { type: "boolean" }, + }, + }, + }, + }, + async (request, reply) => { + const userId = request.user!.id; + const user = await dbClient.getUserById(userId); + if (!user) return reply.status(401).send({ error: "User not found" }); + + const body = request.body as { + noteTitle: string; + noteContent?: string; + color?: string; + isArticle?: boolean; + }; + + // Limit checks (super_user and admin bypass limits) + if (user.role === "user") { + const noteCount = await dbClient.getUserNoteCount(userId); + if (noteCount >= user.maxNotes) { + return reply.status(403).send({ + error: `Note limit reached (${user.maxNotes} max). Upgrade your account for more.`, + }); + } + } + + const note = await dbClient.createNote({ + creator: userId, + noteTitle: body.noteTitle ?? "Untitled", + noteContent: body.noteContent ?? "", + color: body.color ?? "#ffffff", + isArticle: body.isArticle ?? false, + }); + + return reply.status(201).send(note); + }, + ); + + // -- Update note -- + fastify.patch( + "/api/notes/:id", + { + preHandler: [authMiddleware], + schema: { + params: { + type: "object", + required: ["id"], + properties: { id: { type: "integer" } }, + }, + }, + }, + async (request, reply) => { + const { id } = request.params as { id: string }; + const userId = request.user!.id; + const user = await dbClient.getUserById(userId); + if (!user) return reply.status(401).send({ error: "User not found" }); + + const body = request.body as Record; + + // Storage check for normal users + if (user.role === "user" && typeof body.noteContent === "string") { + const currentUsed = await dbClient.getUserStorageUsed(userId); + const existingNote = await dbClient.getNote(Number(id), userId); + const existingLength = existingNote?.noteContent?.length ?? 0; + const delta = body.noteContent.length - existingLength; + if (delta > 0 && currentUsed + delta > user.maxStorageBytes) { + return reply.status(403).send({ + error: `Storage limit reached (${( + user.maxStorageBytes / + 1024 / + 1024 + ).toFixed(1)} MB).`, + }); + } + } + + const updated = await dbClient.updateNote(Number(id), userId, body); + if (!updated) return reply.status(404).send({ error: "Note not found" }); + return updated; + }, + ); + + // -- Delete note (soft delete) -- + fastify.delete( + "/api/notes/:id", + { + preHandler: [authMiddleware], + schema: { + params: { + type: "object", + required: ["id"], + properties: { id: { type: "integer" } }, + }, + }, + }, + async (request, reply) => { + const { id } = request.params as { id: string }; + const deleted = await dbClient.deleteNote(Number(id), request.user!.id); + if (!deleted) return reply.status(404).send({ error: "Note not found" }); + return reply.status(204).send(); + }, + ); + + // ================================================================ + // ADMIN / MONITORING (requires admin or super_user) + // ================================================================ + + // -- DB stats -- + fastify.get( + "/api/admin/stats", + { + preHandler: [authMiddleware, requireRole("super_user", "admin")], + }, + async (request, reply) => { + const stats = await dbClient.getDbStats(); + return stats; + }, + ); + + // -- List all users (passwords stripped) -- + fastify.get( + "/api/admin/users", + { + preHandler: [authMiddleware, requireRole("super_user", "admin")], + }, + async (request, reply) => { + const allUsers = await dbClient.getAllUsers(); + return allUsers; + }, + ); + + // -- Update user limits (super_user only) -- + fastify.patch( + "/api/admin/users/:id", + { + preHandler: [authMiddleware, requireRole("super_user")], + schema: { + params: { + type: "object", + required: ["id"], + properties: { id: { type: "string", format: "uuid" } }, + }, + body: { + type: "object", + properties: { + maxNotes: { type: "integer", minimum: 0 }, + maxStorageBytes: { type: "integer", minimum: 0 }, + role: { type: "string", enum: ["user", "admin"] }, + isActive: { type: "boolean" }, + }, + }, + }, + }, + async (request, reply) => { + const { id } = request.params as { id: string }; + const body = request.body as Record; + + const updated = await dbClient.updateUser(id, body); + if (!updated) return reply.status(404).send({ error: "User not found" }); + return updated; + }, + ); + + // -- Health / metrics -- + fastify.get("/health", async () => { + const stats = await dbClient.getDbStats(); + return { + status: "ok", + uptime: process.uptime(), + db: stats, + }; + }); +}; \ No newline at end of file diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts new file mode 100644 index 0000000..fb14e03 --- /dev/null +++ b/apps/api/src/server.ts @@ -0,0 +1,72 @@ +import Fastify from "fastify"; +import type { FastifyError } from "fastify"; +import cors from "@fastify/cors"; +import dotenv from "dotenv"; + +import { routes } from "./routes.js"; +import { dbClient } from "./db/index.js"; +import { runMigrations } from "./db/migrate.js"; + +dotenv.config(); + +const server = Fastify({ + logger: { + transport: + process.env.NODE_ENV === "production" + ? undefined + : { + target: "pino-pretty", + options: { + translateTime: "HH:MM:ss Z", + ignore: "pid,hostname", + }, + }, + }, +}); + +// Register CORS +server.register(cors, { + origin: "*", + methods: ["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE"], +}); + +// Register all routes +server.register(routes); + +// Gracefully close DB on shutdown +server.addHook("onClose", async () => { + await dbClient.close(); +}); + +// Custom error handler +server.setErrorHandler((error: FastifyError, request, reply) => { + if (error.validation) { + return reply.status(400).send({ + error: "Bad Request", + message: "Validation failed", + details: error.validation.map((err: any) => ({ + field: err.instancePath.replace(/^\//, "") || "body", + message: err.message, + })), + }); + } + server.log.error(error); + return reply.status(500).send({ error: "Internal Server Error" }); +}); + +const start = async () => { + try { + // Run migrations on startup + await runMigrations(); + + const port = Number(process.env.PORT) || 3000; + const host = process.env.HOST || "0.0.0.0"; + await server.listen({ port, host }); + console.log(`Server listening on http://${host}:${port}`); + } catch (err: unknown) { + server.log.error(err as Error); + process.exit(1); + } +}; + +start(); diff --git a/apps/api/src/validation.ts b/apps/api/src/validation.ts new file mode 100644 index 0000000..2ecf538 --- /dev/null +++ b/apps/api/src/validation.ts @@ -0,0 +1,46 @@ +import { z } from "zod"; + +// ── Auth ──────────────────────────────────────────────────────── +export const registerSchema = z.object({ + email: z + .string() + .email() + .max(255) + .transform((e) => e.toLowerCase().trim()), + password: z.string().min(8).max(128), +}); + +export const loginSchema = registerSchema; + +// ── Notes ─────────────────────────────────────────────────────── +export const createNoteSchema = z.object({ + noteTitle: z.string().min(1).max(255), + noteContent: z.string().max(1_000_000).default(""), // 1 MB per note + color: z + .string() + .regex(/^#[0-9a-fA-F]{6}$/) + .default("#ffffff"), + isArticle: z.boolean().default(false), +}); + +export const updateNoteSchema = z.object({ + noteTitle: z.string().min(1).max(255).optional(), + noteContent: z.string().max(1_000_000).optional(), + color: z + .string() + .regex(/^#[0-9a-fA-F]{6}$/) + .optional(), + isArticle: z.boolean().optional(), +}); + +export const noteIdParamSchema = z.object({ + id: z.coerce.number().int().positive(), +}); + +// ── Admin ─────────────────────────────────────────────────────── +export const updateUserLimitsSchema = z.object({ + maxNotes: z.number().int().min(0).optional(), + maxStorageBytes: z.number().int().min(0).optional(), + role: z.enum(["user", "admin"]).optional(), + isActive: z.boolean().optional(), +}); diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json new file mode 100644 index 0000000..e940afc --- /dev/null +++ b/apps/api/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + // File Layout + "rootDir": "./src", + "outDir": "./dist", + + // Environment Settings + "module": "ESNext", + "target": "esnext", + "types": [], + + // Other Outputs + "sourceMap": true, + "declaration": true, + "declarationMap": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": false, + + // Recommended Options + "strict": true, + "jsx": "react-jsx", + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true, + "moduleResolution": "bundler", + }, + "exclude": ["node_modules", "dist", "drizzle.config.ts"], +} diff --git a/apps/web/.gitignore b/apps/web/.gitignore new file mode 100644 index 0000000..ce9c018 --- /dev/null +++ b/apps/web/.gitignore @@ -0,0 +1,47 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# files generated by next-pwa +**/public/precache.*.*.js +**/public/sw.js +**/public/workbox-*.js +**/public/worker-*.js +**/public/fallback-*.js +**/public/precache.*.*.js.map +**/public/sw.js.map +**/public/workbox-*.js.map +**/public/worker-*.js.map +**/public/fallback-*.js diff --git a/.prettierignore b/apps/web/.prettierignore similarity index 100% rename from .prettierignore rename to apps/web/.prettierignore diff --git a/.prettierrc.json b/apps/web/.prettierrc.json similarity index 100% rename from .prettierrc.json rename to apps/web/.prettierrc.json diff --git a/.vscode/launch.json b/apps/web/.vscode/launch.json similarity index 100% rename from .vscode/launch.json rename to apps/web/.vscode/launch.json diff --git a/LICENSE b/apps/web/LICENSE similarity index 100% rename from LICENSE rename to apps/web/LICENSE diff --git a/apps/web/README.md b/apps/web/README.md new file mode 100644 index 0000000..9a430dd --- /dev/null +++ b/apps/web/README.md @@ -0,0 +1,27 @@ +# Donote Web + +Frontend for the Donote note-taking app — a Google Keep / Notion inspired rich-text note and article editor. + +## Stack + +- **Next.js 16** (pages router) + **TypeScript** +- **Mantine v8** for the component library & theming +- **Tiptap 2** for the rich-text editor (checklists, floating menus, resizable images) +- **TanStack Query v4** for server state (note CRUD, optimistic updates) +- **Zustand** for UI/offline-sync state +- **Framer Motion** for animations + +## Development + +```bash +pnpm install +pnpm dev +``` + +Set a local environment variable pointing at the API: + +```bash +NEXT_PUBLIC_API_URL=http://localhost:80 +``` + +The backend is a Fastify + Postgres API running alongside this frontend — see the monorepo root `docker-compose.yml`. \ No newline at end of file diff --git a/biome.json b/apps/web/biome.json similarity index 100% rename from biome.json rename to apps/web/biome.json diff --git a/apps/web/components/Article/ArticleSidebarMenu.tsx b/apps/web/components/Article/ArticleSidebarMenu.tsx new file mode 100644 index 0000000..3251eda --- /dev/null +++ b/apps/web/components/Article/ArticleSidebarMenu.tsx @@ -0,0 +1,86 @@ +import React, { memo, useContext, useState } from "react"; +import type { Editor } from "@tiptap/react"; +import { ActionIcon, Tooltip, Stack, Paper } from "@mantine/core"; +import { CopyIcon, CheckIcon, DeleteIcon } from "@/utils/icons"; +import { useRouter } from "next/router"; +import { NotesContext } from "@/components/Home/components/NotesList"; +import { useNoteContext } from "@/components/Home/components/NoteContext"; +import type { NotesContextValue } from "@/types/Note"; + +type Props = { + editor: Editor | null; +}; + +const ArticleSidebarMenu: React.FC = ({ editor }) => { + const router = useRouter(); + const { deleteNote } = useContext(NotesContext) as NotesContextValue; + const { fsId } = useNoteContext(); + const [copying, setCopying] = useState(false); + + const handleCopy = () => { + setCopying(true); + editor?.chain().focus().copyToClipboard().run(); + setTimeout(() => setCopying(false), 2000); + }; + + const handleDelete = () => { + if (window.confirm("Delete this article?")) { + deleteNote(fsId); + router.push("/notes"); + } + }; + + return ( + + + + + {copying ? ( + + ) : ( + + )} + + + + + + + + + + + ); +}; + +export default memo(ArticleSidebarMenu); diff --git a/apps/web/components/Article/ArticleTiptap.tsx b/apps/web/components/Article/ArticleTiptap.tsx new file mode 100644 index 0000000..4a73a69 --- /dev/null +++ b/apps/web/components/Article/ArticleTiptap.tsx @@ -0,0 +1,56 @@ +import React from "react"; +import { useEditor, EditorContent } from "@tiptap/react"; +import FloatingMenu from "@/components/Home/components/minorComponents/FloatingMenu"; +import StarterKit from "@tiptap/starter-kit"; +import styles from "@/components/Home/styles/note.module.scss"; +import TaskList from "@tiptap/extension-task-list"; +import TaskItem from "@tiptap/extension-task-item"; +import { Placeholder } from "@tiptap/extension-placeholder"; +import FloatingMenuExtension from "@tiptap/extension-floating-menu"; +import CustomImageExtension from "@/components/Home/components/extensions/resizableImage/ImageExtension"; +import CopyToClipboardExtension from "@/components/Home/components/extensions/CopyToClipboard/CopyToClipboardExtension"; +import type { CustomStyle } from "@/types/Styles"; +import { useNoteContext } from "@/components/Home/components/NoteContext"; +import ArticleSidebarMenu from "./ArticleSidebarMenu"; +type Props = { + style?: CustomStyle; +}; + +const ArticleTiptap: React.FC = ({ style }) => { + const { content, setContent } = useNoteContext(); + const editor = useEditor({ + editorProps: { + attributes: { + class: styles.ProseMirror, + }, + }, + immediatelyRender: false, + extensions: [ + StarterKit, + TaskList, + TaskItem.configure({ nested: true }), + Placeholder.configure({ + placeholder: "Start writing your article...", + showOnlyWhenEditable: false, + }), + FloatingMenuExtension, + CustomImageExtension, + CopyToClipboardExtension, + ], + editable: true, + content: content ? JSON.parse(content) : undefined, + onUpdate: ({ editor }) => { + setContent(JSON.stringify(editor.getJSON())); + }, + }); + + return ( + <> + + + + + ); +}; + +export default ArticleTiptap; \ No newline at end of file diff --git a/apps/web/components/Article/ArticleView.tsx b/apps/web/components/Article/ArticleView.tsx new file mode 100644 index 0000000..453b2ea --- /dev/null +++ b/apps/web/components/Article/ArticleView.tsx @@ -0,0 +1,63 @@ +import React, { useEffect } from "react"; +import type { Note, NotesContextValue } from "@/types/Note"; +import useDeleteNote from "@/hooks/useDeleteNote"; +import { NotesContext } from "@/components/Home/components/NotesList"; +import ArticleTiptap from "./ArticleTiptap"; +import { Box, Divider, TextInput } from "@mantine/core"; +import styles from "./article_view.module.scss"; +import { NoteProvider, useNoteContext } from "@/components/Home/components/NoteContext"; + +type ArticleViewProps = { + note: Note; +}; + +const ArticleViewInner: React.FC = () => { + const { noteTitle: note_title, setTitle } = useNoteContext(); + const { mutate: deleteMutate } = useDeleteNote({}); + + const notesContextValue: NotesContextValue = { + addingNote: false, + addNote: () => {}, + updateNote: () => Promise.resolve({} as Note), + deleteNote: deleteMutate, + }; + + return ( + + + + setTitle(e.currentTarget.value)} + placeholder="Untitled" + aria-label="Article title" + /> + + + + + + + + ); +}; + +const ArticleView: React.FC = ({ note }) => { + return ( + + + + ); +}; + +export default ArticleView; diff --git a/apps/web/components/Article/ArticlesList.tsx b/apps/web/components/Article/ArticlesList.tsx new file mode 100644 index 0000000..d3b728a --- /dev/null +++ b/apps/web/components/Article/ArticlesList.tsx @@ -0,0 +1,59 @@ +import React from "react"; +import Link from "next/link"; +import { Card, Text, Title, Stack, Group, Badge, SimpleGrid } from "@mantine/core"; +import type { Note as NoteType } from "@/types/Note"; + +type ArticlesListProps = { + articles: NoteType[]; +}; + +const ArticlesList: React.FC = ({ articles }) => { + return ( + + {articles.map((article) => ( + + + + + {article.noteTitle || "Untitled Article"} + + + Content preview... + + + + {new Date(article.updatedAt).toLocaleDateString()} + + + Article + + + + + + ))} + + ); +}; + +export default ArticlesList; diff --git a/apps/web/components/Article/article_sidebar_menu.module.scss b/apps/web/components/Article/article_sidebar_menu.module.scss new file mode 100644 index 0000000..cbae1e9 --- /dev/null +++ b/apps/web/components/Article/article_sidebar_menu.module.scss @@ -0,0 +1,39 @@ + +.sidebar_menu { + position: fixed; + right: 20px; + top: 50%; + transform: translateY(-50%); + display: flex; + flex-direction: column; + gap: 12px; + z-index: 100; + padding: 8px; + background-color: var(--color-surface-200); + border: 1px solid var(--color-surface-300); + border-radius: 12px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); +} + +.menu_button { + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 8px; + background: transparent; + color: var(--color-primary-100); + transition: all 0.2s ease; + cursor: pointer; + + &:hover { + background-color: var(--color-surface-300); + transform: scale(1.05); + } + + &.active { + background-color: var(--color-primary-100); + color: var(--color-surface-100); + } +} diff --git a/apps/web/components/Article/article_view.module.scss b/apps/web/components/Article/article_view.module.scss new file mode 100644 index 0000000..b49d6c6 --- /dev/null +++ b/apps/web/components/Article/article_view.module.scss @@ -0,0 +1,31 @@ +.article_container { + padding: 3rem 4rem; + min-height: 100vh; + max-width: 900px; + margin: 0 auto; + display: flex; + flex-direction: column; +} + +.editor_wrapper { + flex: 1; + display: flex; + flex-direction: column; + + :global(.ProseMirror) { + flex: 1; + padding: 0; + font-size: 1.1rem; + line-height: 1.7; + outline: none; + } + + :global(.ProseMirror p.is-editor-empty:first-child::before) { + content: attr(data-placeholder); + float: left; + color: var(--text-secondary); + opacity: 0.5; + pointer-events: none; + height: 0; + } +} diff --git a/apps/web/components/Article/articles_list.module.scss b/apps/web/components/Article/articles_list.module.scss new file mode 100644 index 0000000..5d2e770 --- /dev/null +++ b/apps/web/components/Article/articles_list.module.scss @@ -0,0 +1,23 @@ + +.articles_grid { + display: grid; + gap: 2rem; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + padding: 2rem; +} + +.article_card { + transition: transform 0.2s ease, box-shadow 0.2s ease; + background-color: var(--color-surface-200); + border-color: var(--color-surface-300); + + &:hover { + transform: translateY(-5px); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); + background-color: var(--color-surface-300); + } +} + +.article_title { + color: var(--color-primary-100); +} diff --git a/apps/web/components/Article/index.tsx b/apps/web/components/Article/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/apps/web/components/Auth/index.tsx b/apps/web/components/Auth/index.tsx new file mode 100644 index 0000000..e7d54ec --- /dev/null +++ b/apps/web/components/Auth/index.tsx @@ -0,0 +1,111 @@ +import React, { useState, useEffect } from "react"; +import { toast } from "react-hot-toast"; +import { useSession } from "@/hooks/useSession"; +import { Button, Stack, Title, Text, TextInput, PasswordInput } from "@mantine/core"; +import { useRouter } from "next/router"; + +const Auth = () => { + const { status, login, register } = useSession(); + const router = useRouter(); + const [isLogin, setIsLogin] = useState(true); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [loading, setLoading] = useState(false); + + useEffect(() => { + if (status === "authenticated") { + toast.success("Logged in, redirecting...", { id: "loggedin" }); + router.push("/"); + } + }, [status, router]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + try { + if (isLogin) { + await login(email, password); + } else { + await register(email, password); + } + } catch { + toast.error(isLogin ? "Login failed" : "Registration failed", { + id: "auth-error", + }); + } finally { + setLoading(false); + } + }; + + const authLoading = status === "loading" || status === "authenticated"; + + return ( + + + + Do Note + + + A lightweight note taking app for your hyper productive self. + + + +
+ + setEmail(e.currentTarget.value)} + required + disabled={authLoading} + /> + setPassword(e.currentTarget.value)} + required + minLength={8} + disabled={authLoading} + /> + + + +
+
+ ); +}; + +export default Auth; diff --git a/components/Auth/styles/auth.module.scss b/apps/web/components/Auth/styles/auth.module.scss similarity index 100% rename from components/Auth/styles/auth.module.scss rename to apps/web/components/Auth/styles/auth.module.scss diff --git a/apps/web/components/Common/ColorMenu.tsx b/apps/web/components/Common/ColorMenu.tsx new file mode 100644 index 0000000..d54eba9 --- /dev/null +++ b/apps/web/components/Common/ColorMenu.tsx @@ -0,0 +1,45 @@ +import { PaletteIcon } from "@/utils/icons"; +import { ActionIcon, ColorSwatch, Menu, SimpleGrid } from "@mantine/core"; + +type ColorMenuProps = { + setColor: (color: string) => void; +}; + +const paletteColors = [ + "var(--note-bg-light-1)", + "var(--note-bg-light-2)", + "var(--note-bg-dark-1)", + "var(--note-bg-dark-2)", + "var(--note-bg-dark-3)", + "var(--note-bg-dark-4)", +]; + +const ColorMenu = ({ setColor }: ColorMenuProps) => { + return ( + + + + + + + + + {paletteColors.map((color) => ( + setColor(color)} + style={{ cursor: "pointer" }} + /> + ))} + + + + ); +}; + +export default ColorMenu; \ No newline at end of file diff --git a/apps/web/components/Common/Loader.tsx b/apps/web/components/Common/Loader.tsx new file mode 100644 index 0000000..738cafd --- /dev/null +++ b/apps/web/components/Common/Loader.tsx @@ -0,0 +1,34 @@ +import { Loader } from "@mantine/core"; +import React from "react"; + +export const OvalLoader = ({ magnify }: { magnify: string }) => { + return ( + + ); +}; + +export const DotsLoader = () => { + return ( + + ); +}; \ No newline at end of file diff --git a/apps/web/components/Common/MobileSidebar.tsx b/apps/web/components/Common/MobileSidebar.tsx new file mode 100644 index 0000000..61efeb3 --- /dev/null +++ b/apps/web/components/Common/MobileSidebar.tsx @@ -0,0 +1,91 @@ +import type React from "react"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import { HomeIcon, FileTextIcon, LogOutIcon } from "@/utils/icons"; +import { useSession } from "@/hooks/useSession"; +import { Box, Group, UnstyledButton } from "@mantine/core"; + +export const MOBILE_TAB_BAR_HEIGHT = 56; + +const MobileSidebar: React.FC = () => { + const router = useRouter(); + const { user, signOut } = useSession(); + + if (!user?.id) return null; + + const isActive = (path: string) => router.pathname === path; + + return ( + + + + + + + + + + + + + + + + ); +}; + +export default MobileSidebar; diff --git a/apps/web/components/Common/Navbar.tsx b/apps/web/components/Common/Navbar.tsx new file mode 100644 index 0000000..e383240 --- /dev/null +++ b/apps/web/components/Common/Navbar.tsx @@ -0,0 +1,78 @@ +import Link from "next/link"; +import OfflineToggle from "./OfflineToggle"; +import SyncIndicator from "./SyncIndicator"; +import { LogOutIcon } from "@/utils/icons"; +import { useSession } from "@/hooks/useSession"; +import { Group, Box, Avatar, Menu } from "@mantine/core"; + +const Navbar = () => { + const { user, signOut } = useSession(); + const handleLogout = async () => { + signOut(); + }; + return ( + + + DoNote + + + {user.id && ( + <> + + + + + {user.email[0]?.toUpperCase() ?? "U"} + + + + + } + style={{ + justifyContent: "space-around", + paddingLeft: "0.5rem", + paddingRight: "0.5rem", + }} + > + Logout + + + + + + + + + + )} + + + ); +}; + +export default Navbar; diff --git a/apps/web/components/Common/NotesLoader.tsx b/apps/web/components/Common/NotesLoader.tsx new file mode 100644 index 0000000..8637563 --- /dev/null +++ b/apps/web/components/Common/NotesLoader.tsx @@ -0,0 +1,24 @@ +import { Card, SimpleGrid, Skeleton, Stack } from "@mantine/core"; + +const SkeletonNote = () => ( + + + + + + + + +); + +const NotesLoader = () => { + return ( + + {[1, 2, 3, 4, 5, 6].map((i) => ( + + ))} + + ); +}; + +export default NotesLoader; \ No newline at end of file diff --git a/apps/web/components/Common/OfflineToggle.tsx b/apps/web/components/Common/OfflineToggle.tsx new file mode 100644 index 0000000..a1fd699 --- /dev/null +++ b/apps/web/components/Common/OfflineToggle.tsx @@ -0,0 +1,19 @@ +import React, { useState } from "react"; +import { Switch, Group, Text } from "@mantine/core"; + +const OfflineToggle = () => { + const [offline, setOffline] = useState(false); + return ( + + setOffline(event.currentTarget.checked)} + disabled + size="xs" + /> + Offline + + ); +}; + +export default OfflineToggle; diff --git a/apps/web/components/Common/Sidebar.tsx b/apps/web/components/Common/Sidebar.tsx new file mode 100644 index 0000000..7ffc3a2 --- /dev/null +++ b/apps/web/components/Common/Sidebar.tsx @@ -0,0 +1,112 @@ +import type React from "react"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import { HomeIcon, FileTextIcon, LogOutIcon } from "@/utils/icons"; +import { useSession } from "@/hooks/useSession"; +import { Stack, NavLink, ActionIcon, Tooltip, Loader } from "@mantine/core"; +import useStore from "@/hooks/useStore"; + +const Sidebar: React.FC = () => { + const router = useRouter(); + const { user, signOut } = useSession(); + const syncing = useStore((state) => state.syncing); + + const handleLogout = () => { + signOut(); + }; + + const isActive = (path: string) => router.pathname === path; + + if (!user?.id) return null; + + return ( + + + + + {syncing ? : "Dn"} + + + + + } + active={isActive("/notes")} + variant="filled" + w={48} + h={48} + styles={{ + root: { borderRadius: "12px" }, + label: { display: "none" }, + }} + /> + + + + } + active={isActive("/articles")} + variant="filled" + w={48} + h={48} + styles={{ + root: { borderRadius: "12px" }, + label: { display: "none" }, + }} + /> + + + + + + + + + + + + ); +}; + +export default Sidebar; diff --git a/apps/web/components/Common/SyncIndicator.tsx b/apps/web/components/Common/SyncIndicator.tsx new file mode 100644 index 0000000..c1394cd --- /dev/null +++ b/apps/web/components/Common/SyncIndicator.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { Loader } from "@mantine/core"; +import { CloudCheckIcon } from "@/utils/icons"; +import useStore from "@/hooks/useStore"; +import { AppState } from "@/types/AppState"; + +const SyncIndicator = () => { + const syncing = useStore((state) => state.syncing); + return ( + <> + {syncing ? ( + + ) : ( + + )} + + ); +}; + +export default SyncIndicator; diff --git a/components/Common/styles/button.module.scss b/apps/web/components/Common/styles/button.module.scss similarity index 89% rename from components/Common/styles/button.module.scss rename to apps/web/components/Common/styles/button.module.scss index add68ed..cc2565f 100644 --- a/components/Common/styles/button.module.scss +++ b/apps/web/components/Common/styles/button.module.scss @@ -50,6 +50,12 @@ border-radius: 100%; margin: auto; border: none; + background-color: var(--color-surface-300); + transition: background-color 0.2s; + + &:hover { + background-color: var(--color-surface-400); + } svg { position: absolute; diff --git a/components/Common/styles/colormenu.module.scss b/apps/web/components/Common/styles/colormenu.module.scss similarity index 100% rename from components/Common/styles/colormenu.module.scss rename to apps/web/components/Common/styles/colormenu.module.scss diff --git a/components/Common/styles/layout.page.scss b/apps/web/components/Common/styles/layout.page.scss similarity index 100% rename from components/Common/styles/layout.page.scss rename to apps/web/components/Common/styles/layout.page.scss diff --git a/components/Common/styles/loader.module.scss b/apps/web/components/Common/styles/loader.module.scss similarity index 100% rename from components/Common/styles/loader.module.scss rename to apps/web/components/Common/styles/loader.module.scss diff --git a/components/Common/styles/menu.module.scss b/apps/web/components/Common/styles/menu.module.scss similarity index 96% rename from components/Common/styles/menu.module.scss rename to apps/web/components/Common/styles/menu.module.scss index 4c68d27..b49334c 100644 --- a/components/Common/styles/menu.module.scss +++ b/apps/web/components/Common/styles/menu.module.scss @@ -25,6 +25,9 @@ border-radius: 0.5rem; min-width: 8rem; overflow: hidden; + display: flex; + flex-direction: column; + padding: 0.5rem 0; } .menu_transition { diff --git a/components/Common/styles/navbar.module.scss b/apps/web/components/Common/styles/navbar.module.scss similarity index 100% rename from components/Common/styles/navbar.module.scss rename to apps/web/components/Common/styles/navbar.module.scss diff --git a/apps/web/components/Common/styles/sidebar.module.scss b/apps/web/components/Common/styles/sidebar.module.scss new file mode 100644 index 0000000..f406351 --- /dev/null +++ b/apps/web/components/Common/styles/sidebar.module.scss @@ -0,0 +1,108 @@ +.sidebar { + position: fixed; + left: 0; + top: 0; + height: 100vh; + width: 72px; + background-color: var(--color-surface-100); + border-right: 1px solid var(--color-surface-200); + display: flex; + justify-content: space-between; + flex-direction: column; + align-items: center; + z-index: 50; + transition: width 0.3s ease; + + + .logo_container { + + .logo { + font-weight: 700; + font-size: 1.5rem; + color: var(--color-primary-500); + text-decoration: none; + } + } + + .nav_links { + padding-top: 1.5rem; + display: flex; + flex-direction: column; + gap: 1rem; + width: 100%; + align-items: center; + + .nav_item { + display: flex; + align-items: center; + justify-content: center; + padding: 0.75rem; + border-radius: 12px; + color: var(--text-secondary); + transition: all 0.2s ease; + position: relative; + + &:hover { + background-color: var(--color-surface-200); + color: var(--text-primary); + + .tooltip { + opacity: 1; + transform: translateX(0); + pointer-events: auto; + } + } + + &.active { + background-color: var(--color-primary-100); + color: var(--color-surface-100); + } + + .tooltip { + position: absolute; + left: 100%; + top: 50%; + transform: translateY(-50%) translateX(-10px); + background-color: var(--color-surface-300); + padding: 0.5rem 0.75rem; + border-radius: 6px; + font-size: 0.875rem; + white-space: nowrap; + opacity: 0; + pointer-events: none; + transition: all 0.2s ease; + margin-left: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + z-index: 100; + } + } + } + + .bottom_actions { + display: flex; + flex-direction: column; + gap: 1rem; + align-items: center; + + .user_profile { + .avatar { + border-radius: 50%; + } + } + + .logout_btn { + background: none; + border: none; + padding: 0.75rem; + cursor: pointer; + color: var(--text-secondary); + border-radius: 12px; + transition: all 0.2s ease; + + &:hover { + background-color: var(--color-error-100); + color: var(--color-error-500); + } + } + } +} \ No newline at end of file diff --git a/components/Common/styles/toggle.module.scss b/apps/web/components/Common/styles/toggle.module.scss similarity index 100% rename from components/Common/styles/toggle.module.scss rename to apps/web/components/Common/styles/toggle.module.scss diff --git a/apps/web/components/Home/components/Backdrop.tsx b/apps/web/components/Home/components/Backdrop.tsx new file mode 100644 index 0000000..b99ca4d --- /dev/null +++ b/apps/web/components/Home/components/Backdrop.tsx @@ -0,0 +1,29 @@ +import { ReactNode } from "react"; +import { Box } from "@mantine/core"; + +type BackdropProps = { + onClick: () => void; +}; + +const Backdrop = ({ onClick }: BackdropProps) => { + return ( + + ); +}; + +export default Backdrop; \ No newline at end of file diff --git a/apps/web/components/Home/components/BottomMenu.tsx b/apps/web/components/Home/components/BottomMenu.tsx new file mode 100644 index 0000000..cfe4f55 --- /dev/null +++ b/apps/web/components/Home/components/BottomMenu.tsx @@ -0,0 +1,118 @@ +import { type EventHandler, type SyntheticEvent, memo, useContext, useState } from "react"; +import { useRouter } from "next/router"; +import { FileTextIcon, CheckIcon, CopyIcon, DeleteIcon } from "@/utils/icons"; +import type { NotesContextValue } from "@/types/Note"; +import { NotesContext } from "./NotesList"; +import { useNoteContext } from "./NoteContext"; +import type { Editor } from "@tiptap/react"; +import { ActionIcon, Group } from "@mantine/core"; +import clsx from "clsx"; +import styles from "../styles/note.module.scss"; + +type BottomMenuProps = { + editor: Editor | null; +}; + +const isNoteDarkThemed = (c: string): boolean => /dark/i.test(c); + +const BottomMenu = memo(function BottomMenu({ editor }: BottomMenuProps): JSX.Element { + const { deleteNote } = useContext(NotesContext) as NotesContextValue; + const { editMode, fsId, color } = useNoteContext(); + const router = useRouter(); + const pathname = router?.pathname || ""; + const isArticle = pathname.includes("/articles/"); + const [copying, setCopying] = useState(false); + + const handleDelete: EventHandler = async (e) => { + const confirm = window.confirm("Are you sure you want to delete this note?"); + if (confirm) { + deleteNote(fsId); + } + e.stopPropagation(); + }; + + const handleCopy: EventHandler = (e) => { + setCopying(true); + editor?.chain().copyToClipboard(); + setTimeout(() => { + setCopying(false); + }, 500); + e.stopPropagation(); + }; + + return ( + +
e.stopPropagation()} + > + + {copying ? : } + + + + + {editMode && !isArticle && ( + { + if (window.confirm("Convert to long-form Article? This cannot be undone.")) { + const { updateNote } = await import("@/utils/notesApi"); + await updateNote(Number(fsId), { isArticle: true }); + router.push(`/articles/${fsId}`); + } + }} + variant="subtle" + color="gray" + radius="xl" + size="sm" + > + + + )} +
+
+ ); +}); + +export default BottomMenu; diff --git a/apps/web/components/Home/components/Note.tsx b/apps/web/components/Home/components/Note.tsx new file mode 100644 index 0000000..2ea05a9 --- /dev/null +++ b/apps/web/components/Home/components/Note.tsx @@ -0,0 +1,121 @@ +import type React from "react"; +import { useRef, useEffect } from "react"; +import Tiptap from "./Tiptap"; +import styles from "../styles/note.module.scss"; +import clsx from "clsx"; +import { CloseIcon } from "@/utils/icons"; +import { AnimatePresence, motion } from "framer-motion"; +import type { CustomStyle } from "@/types/Styles"; +import Backdrop from "./Backdrop"; +import { NoteProvider, useNoteContext } from "./NoteContext"; + +type NoteProps = { + title: string; + content: string; + fsId: string; + color: string; + setSelectedId: (id: string | null) => void; +}; + +const NoteInner: React.FC<{ + fsId: string; + color: string; + setSelectedId: (id: string | null) => void; +}> = ({ fsId, color: noteColor, setSelectedId }) => { + const { noteTitle: note_title, color, editMode, setEditMode, setTitle } = useNoteContext(); + const ref = useRef(null); + const noteRef = useRef(null); + + useEffect(() => { + if (noteRef.current && editMode) noteRef.current.style.zIndex = "3"; + }, [editMode]); + + const closeNote = () => { + setEditMode(false); + setSelectedId(null); + }; + + const handleClick = () => { + if (!editMode) { + setEditMode(true); + setSelectedId(fsId); + } + }; + + const isNoteDarkThemed = (c: string): boolean => /dark/i.test(c); + + const handleAnimationComplete = () => { + if (noteRef.current && editMode === false) { + noteRef.current.style.zIndex = "0"; + } + }; + + return ( + + null}> + {editMode && } + + +
+ {(note_title != "" || editMode) && ( + setTitle(e.target.value)} + /> + )} + {editMode && ( + + )} +
+ +
+
+
+
+ ); +}; + +const Note: React.FC = ({ title, content, fsId, color, setSelectedId }) => { + return ( + + + + ); +}; + +export default Note; \ No newline at end of file diff --git a/apps/web/components/Home/components/NoteContext.tsx b/apps/web/components/Home/components/NoteContext.tsx new file mode 100644 index 0000000..bafd0bc --- /dev/null +++ b/apps/web/components/Home/components/NoteContext.tsx @@ -0,0 +1,123 @@ +import { + useRef, + useState, + useCallback, + useMemo, + createContext, + useContext, + type ReactNode, +} from "react"; +import useUpdateNote from "@/hooks/useUpdateNote"; +import useStore from "@/hooks/useStore"; +import type { NoteContextType } from "@/types/Note"; +import { useDebouncedCallback } from "@mantine/hooks"; + +const DEBOUNCE_TIME_MS = 3000; +export const NoteContext = createContext(undefined); + +export const useNoteContext = () => { + const ctx = useContext(NoteContext); + if (!ctx) throw new Error("useNoteContext must be used within NoteContext.Provider"); + return ctx; +}; + +type AutosaveNote = { + id: number; + noteTitle: string; + noteContent: string; + color: string; +}; + +export const NoteProvider = ({ + note: savedNote, + children, + defaultEditMode = false, +}: { + note: AutosaveNote; + children: ReactNode; + defaultEditMode?: boolean; +}) => { + const updateNoteMutation = useUpdateNote(); + const syncing = useStore((state) => state.syncing); + const updateSync = useStore((state) => state.updateSync); + const [note, setNote] = useState(savedNote); + + const [editMode, setEditMode] = useState(defaultEditMode); + + // Mirror state into a ref so the debounced callback always reads the latest values + const noteRef = useRef(note); + noteRef.current = note; + + // Tracks the last content confirmed saved by the server. `setContent` is a + // no-op when given this value, so echoing loaded content back (e.g. TipTap's + // initial onUpdate) never triggers a spurious save. Only updated once the + // PATCH has succeeded. + const lastSavedContentRef = useRef(savedNote.noteContent); + + const saveNote = useDebouncedCallback(async () => { + const latest = noteRef.current; + try { + await updateNoteMutation.mutateAsync({ + noteId: latest.id, + data: { + noteTitle: latest.noteTitle, + noteContent: latest.noteContent, + color: latest.color, + }, + }); + lastSavedContentRef.current = latest.noteContent; + } finally { + updateSync(false); + } + }, DEBOUNCE_TIME_MS); + + const setTitle = useCallback( + (next: string) => { + setNote((prevNote) => ({ ...prevNote, noteTitle: next })); + updateSync(true); + saveNote(); + }, + [saveNote, updateSync], + ); + + const setContent = useCallback( + (next: string) => { + // Ignore changes that just re-echo the last server-confirmed content + // (e.g. content loaded into the editor triggering onUpdate on mount). + if (next === lastSavedContentRef.current) return; + setNote((prevNote) => ({ ...prevNote, noteContent: next })); + updateSync(true); + saveNote(); + }, + [saveNote, updateSync], + ); + + const setColor = useCallback( + (next: string) => { + setNote((prevNote) => ({ ...prevNote, color: next })); + updateSync(true); + // Flush immediately for color changes so the UI updates right away + saveNote.flush(); + }, + [saveNote, updateSync], + ); + + const contextValue = useMemo( + () => ({ + noteTitle: note.noteTitle, + content: note.noteContent, + color: note.color, + editMode, + dirty: false, + syncing, + fsId: String(note.id), + setEditMode, + setColor, + setTitle, + setContent, + }), + [note.noteTitle, note.noteContent, note.color, editMode, syncing, note.id, setColor, setTitle, setContent], + ); + + return {children}; +}; \ No newline at end of file diff --git a/apps/web/components/Home/components/NotesList.tsx b/apps/web/components/Home/components/NotesList.tsx new file mode 100644 index 0000000..dc4d09a --- /dev/null +++ b/apps/web/components/Home/components/NotesList.tsx @@ -0,0 +1,87 @@ +import type React from "react"; +import { type MouseEventHandler, useState, createContext } from "react"; +import Note from "./Note"; +import { PlusIcon } from "@/utils/icons"; +import { Loader } from "@mantine/core"; +import type { + DeleteMutation, + Note as NoteType, + NotesContextValue, + UpdateNoteFn, +} from "@/types/Note"; +import { Box, Button } from "@mantine/core"; + +export const NotesContext = createContext(undefined); + +type NoteListProps = { + addingNote: boolean; + notes?: NoteType[]; + addNote: MouseEventHandler; + deleteNote: DeleteMutation; + updateNote: UpdateNoteFn; +}; + +const NotesList: React.FC = ({ + addingNote, + addNote, + notes, + updateNote, + deleteNote, +}) => { + const [_, setSelectedId] = useState(null); + return ( + + + {notes?.map((note) => { + return ( + + ); + })} + + + + + ); +}; + +export default NotesList; diff --git a/apps/web/components/Home/components/Tiptap.tsx b/apps/web/components/Home/components/Tiptap.tsx new file mode 100644 index 0000000..63dd89f --- /dev/null +++ b/apps/web/components/Home/components/Tiptap.tsx @@ -0,0 +1,61 @@ +import React, { useEffect } from "react"; +import { useEditor, EditorContent } from "@tiptap/react"; +import FloatingMenu from "./minorComponents/FloatingMenu"; +import StarterKit from "@tiptap/starter-kit"; +import TaskList from "@tiptap/extension-task-list"; +import TaskItem from "@tiptap/extension-task-item"; +import { Placeholder } from "@tiptap/extension-placeholder"; +import FloatingMenuExtension from "@tiptap/extension-floating-menu"; +import CustomImageExtension from "./extensions/resizableImage/ImageExtension"; +import CopyToClipboardExtension from "./extensions/CopyToClipboard/CopyToClipboardExtension"; +import type { CustomStyle } from "@/types/Styles"; +import BottomMenu from "./BottomMenu"; +import { useNoteContext } from "./NoteContext"; + +type TiptapProps = { + style?: CustomStyle; + editable?: boolean; +}; + +const Tiptap: React.FC = ({ style, editable }) => { + const { content, setContent } = useNoteContext(); + + const editor = useEditor({ + editorProps: { + attributes: { + class: "ProseMirror", + }, + }, + immediatelyRender: false, + extensions: [ + StarterKit, + TaskList, + TaskItem.configure({ nested: true }), + Placeholder.configure({ showOnlyWhenEditable: false }), + FloatingMenuExtension, + CustomImageExtension, + CopyToClipboardExtension, + ], + editable: false, + content: content ? JSON.parse(content) : undefined, + onUpdate: ({ editor }) => { + setContent(JSON.stringify(editor.getJSON())); + }, + }); + + useEffect(() => { + if (editor && !editor.isDestroyed) { + editor.setEditable(Boolean(editable)); + } + }, [editor, editable]); + + return ( + <> + + + + + ); +}; + +export default Tiptap; \ No newline at end of file diff --git a/components/Home/components/extensions/CopyToClipboard/CopyToClipboardExtension.ts b/apps/web/components/Home/components/extensions/CopyToClipboard/CopyToClipboardExtension.ts similarity index 100% rename from components/Home/components/extensions/CopyToClipboard/CopyToClipboardExtension.ts rename to apps/web/components/Home/components/extensions/CopyToClipboard/CopyToClipboardExtension.ts diff --git a/components/Home/components/extensions/resizableImage/ImageExtension.ts b/apps/web/components/Home/components/extensions/resizableImage/ImageExtension.ts similarity index 100% rename from components/Home/components/extensions/resizableImage/ImageExtension.ts rename to apps/web/components/Home/components/extensions/resizableImage/ImageExtension.ts diff --git a/components/Home/components/extensions/resizableImage/ImageWrapper.tsx b/apps/web/components/Home/components/extensions/resizableImage/ImageWrapper.tsx similarity index 95% rename from components/Home/components/extensions/resizableImage/ImageWrapper.tsx rename to apps/web/components/Home/components/extensions/resizableImage/ImageWrapper.tsx index 81e1089..4c803ee 100644 --- a/components/Home/components/extensions/resizableImage/ImageWrapper.tsx +++ b/apps/web/components/Home/components/extensions/resizableImage/ImageWrapper.tsx @@ -1,7 +1,7 @@ import { NodeViewProps, NodeViewWrapper } from "@tiptap/react"; import React, { MouseEventHandler, useRef } from "react"; -import styles from "./styles/customimg.module.scss"; -import { MdDeleteForever } from "react-icons/md"; +import styles from "./styles/customimg.module.css"; +import { DeleteIcon } from "@/utils/icons"; const ImageWrapper = ({ node, deleteNode, updateAttributes, editor }: NodeViewProps) => { const imgRef = useRef(null); @@ -91,7 +91,7 @@ const ImageWrapper = ({ node, deleteNode, updateAttributes, editor }: NodeViewPr
diff --git a/apps/web/components/Home/components/extensions/resizableImage/styles/customimg.module.css b/apps/web/components/Home/components/extensions/resizableImage/styles/customimg.module.css new file mode 100644 index 0000000..7770e4a --- /dev/null +++ b/apps/web/components/Home/components/extensions/resizableImage/styles/customimg.module.css @@ -0,0 +1,89 @@ +.node_image { + display: flex; + justify-content: center; + height: auto; + width: 100%; + flex-grow: 1; +} + +.node_image .controller_wrapper { + position: relative; + display: inline-flex; +} + +.node_image .controller_wrapper img { + position: relative; + max-width: 100%; + max-height: 100%; +} + +.node_image .controller_wrapper img:active { + outline: rgba(126, 126, 255, 0.715) solid 1px; +} + +.node_image .controller_wrapper .img_ops { + opacity: 0; + position: absolute; + top: 5%; + left: 5%; +} + +.node_image .controller_wrapper .img_ops button { + border-radius: 100%; + position: relative; + width: 1.5rem; + height: 1.5rem; + background: none; + border: none; +} + +.node_image .controller_wrapper .img_ops button:hover { + background-color: rgba(93, 93, 93, 0.279); + mix-blend-mode: difference; +} + +.node_image .controller_wrapper .img_ops button svg { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + mix-blend-mode: difference; +} + +.node_image .controller_wrapper .size_control { + opacity: 0; + position: absolute; + top: 50%; + right: 2%; + transform: translate(0, -50%); + height: 50%; +} + +.node_image .controller_wrapper .size_control .cursor { + height: 100%; + width: 0.5rem; + cursor: ew-resize; + border-radius: 30px; + border: none; + background-color: rgba(65, 65, 65, 0.418); + border: 1px rgba(255, 255, 255, 0.589) solid; +} + +.node_image .controller_wrapper .size_control .cursor :active { + cursor: ew-resize; +} + +.node_image .controller_wrapper .size_control .cursor :focus { + cursor: ew-resize; +} + +.node_image .controller_wrapper:hover .img_ops, +.node_image .controller_wrapper:hover .size_control { + opacity: 1; +} + +@media (hover: none) { + .size_control { + display: none; + } +} diff --git a/apps/web/components/Home/components/minorComponents/FloatingMenu.tsx b/apps/web/components/Home/components/minorComponents/FloatingMenu.tsx new file mode 100644 index 0000000..3f9c382 --- /dev/null +++ b/apps/web/components/Home/components/minorComponents/FloatingMenu.tsx @@ -0,0 +1,75 @@ +import React, { useCallback } from "react"; +import { Editor, FloatingMenu as TiptapFloatingMenu } from "@tiptap/react"; +import { ListIcon, HeadingIcon, ChecklistIcon, ImageIcon } from "@/utils/icons"; +import { ActionIcon, Paper } from "@mantine/core"; + +type Props = { editor: Editor | null }; + +const CustomFloatingMenu: React.FC = ({ editor }) => { + const addImage = useCallback(() => { + const url = window.prompt("URL"); + if (url && editor) { + editor.chain().focus().setImage({ src: url }).run(); + } + }, [editor]); + + if (!editor) return null; + + const items = [ + { + icon: , + onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), + isActive: editor.isActive("heading", { level: 3 }), + label: "Heading", + }, + { + icon: , + onClick: () => editor.chain().focus().toggleBulletList().run(), + isActive: editor.isActive("bulletList"), + label: "Bullet list", + }, + { + icon: , + onClick: addImage, + isActive: editor.isActive("image"), + label: "Image", + }, + { + icon: , + onClick: () => editor.chain().focus().toggleTaskList().run(), + isActive: editor.isActive("taskList"), + label: "Checklist", + }, + ]; + + return ( + + + {items.map((item, idx) => ( + + {item.icon} + + ))} + + + ); +}; + +export default CustomFloatingMenu; diff --git a/apps/web/components/Home/components/minorComponents/Tags.jsx b/apps/web/components/Home/components/minorComponents/Tags.jsx new file mode 100644 index 0000000..0fa8616 --- /dev/null +++ b/apps/web/components/Home/components/minorComponents/Tags.jsx @@ -0,0 +1,16 @@ +import React from "react"; +import { Group, Badge } from "@mantine/core"; + +const Tags = ({ tags = ["books", "coding"] }) => { + return ( + + {tags.map((tag, i) => ( + + {tag} + + ))} + + ); +}; + +export default Tags; diff --git a/components/Home/index.tsx b/apps/web/components/Home/index.tsx similarity index 66% rename from components/Home/index.tsx rename to apps/web/components/Home/index.tsx index c901428..63d5fc8 100644 --- a/components/Home/index.tsx +++ b/apps/web/components/Home/index.tsx @@ -1,25 +1,18 @@ -import React, { } from "react"; +import React from "react"; import NotesList from "./components/NotesList"; import { toast } from "react-hot-toast"; import useAddNote from "@/hooks/useAddNote"; import useGetNotes from "@/hooks/useGetNotes"; -import { updateNote } from "@/utils/supabase/db_operations"; -import { NoteContent } from "@/types/Note"; +import { updateNote } from "@/utils/notesApi"; +import type { NoteCreate } from "@/types/Note"; import useDeleteNote from "@/hooks/useDeleteNote"; -// import NotesLoader from "@/components/Common/NotesLoader"; -import Navbar from "../Common/Navbar"; import { DotsLoader } from "../Common/Loader"; import Head from "next/head"; -import { useSession } from "@/hooks/useSession"; const Home: React.FC = () => { - const { user } = useSession(); - const userId = user.id ?? null; - - const { data: notes, isLoading } = useGetNotes(userId); + const { data: notes, isLoading } = useGetNotes(); const { mutate: addMutate, isLoading: addingNote } = useAddNote({ - creatorId: userId, errorCb: () => { toast.error("Something went wrong please try later", { id: "note-creation-error", @@ -27,7 +20,6 @@ const Home: React.FC = () => { }, }); const { mutate: deleteMutate } = useDeleteNote({ - creatorId: userId, errorCb: () => { toast.error("Deletion failed, pls try later", { id: "delete-error", @@ -36,9 +28,9 @@ const Home: React.FC = () => { }); const handleAdd = async () => { - const newNote: NoteContent = { - note_title: "", - note_content: JSON.stringify({ + const newNote: NoteCreate = { + noteTitle: "", + noteContent: JSON.stringify({ type: "doc", content: [ { @@ -48,11 +40,7 @@ const Home: React.FC = () => { }), color: "var(--note-bg-dark-4)", }; - // return; - addMutate({ - newNote: newNote, - creatorId: userId, - }); + addMutate(newNote); }; return ( @@ -60,7 +48,6 @@ const Home: React.FC = () => { Notes - {isLoading ? ( ) : ( diff --git a/components/Home/styles/backdrop.module.scss b/apps/web/components/Home/styles/backdrop.module.scss similarity index 100% rename from components/Home/styles/backdrop.module.scss rename to apps/web/components/Home/styles/backdrop.module.scss diff --git a/components/Home/styles/bottommenu.module.scss b/apps/web/components/Home/styles/bottommenu.module.scss similarity index 100% rename from components/Home/styles/bottommenu.module.scss rename to apps/web/components/Home/styles/bottommenu.module.scss diff --git a/apps/web/components/Home/styles/floatmenu.module.scss b/apps/web/components/Home/styles/floatmenu.module.scss new file mode 100644 index 0000000..b5d9d6c --- /dev/null +++ b/apps/web/components/Home/styles/floatmenu.module.scss @@ -0,0 +1,43 @@ +.float_menu { + background-color: var(--color-surface-300); + border-radius: 10px; + display: flex; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); + overflow: hidden; + + .float_item { + width: 2.5rem; + height: 2.5rem; + border-radius: 0; + position: relative; + color: var(--color-primary-100); + transition: background-color 0.2s; + display: flex; + align-items: center; + justify-content: center; + + svg { + // position: absolute; // Removed to let flexbox center it + // top: 50%; + // left: 50%; + // transform: translate(-50%, -50%); + font-size: 1.2rem; + } + + &:hover { + background-color: var(--color-surface-400); + } + + &.is_active { + background-color: var(--color-primary-100); + color: var(--color-surface-100); + } + + &:first-child { + border-radius: 10px 0 0 10px; + } + &:last-child { + border-radius: 0 10px 10px 0; + } + } +} diff --git a/components/Home/styles/note.module.scss b/apps/web/components/Home/styles/note.module.scss similarity index 62% rename from components/Home/styles/note.module.scss rename to apps/web/components/Home/styles/note.module.scss index 0e6a14d..e930a25 100644 --- a/components/Home/styles/note.module.scss +++ b/apps/web/components/Home/styles/note.module.scss @@ -9,6 +9,7 @@ width: 18rem; border-radius: 10px; display: flex; + overflow: visible; /* Prevent clipping note_container shadows */ } .note_container { @@ -37,20 +38,58 @@ .note_main { flex-grow: 1; - overflow-y: hidden; + min-height: 0; + overflow: hidden; position: relative; + display: flex; + flex-direction: column; // overflow blur &::after { content: " "; - height: 20px; + height: 3.8rem; width: 100%; background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, var(--note-bg) 100%); display: block; position: absolute; bottom: 0px; - transition: background 5s 2s; + transition: opacity 0.15s linear; z-index: inherit; + opacity: 0; + pointer-events: none; + } + } + + &:hover .note_main::after, + &.note_active .note_main::after { + opacity: 1; + } + + // The editor is the single scroll region for note content. It flexes to fill + // the card (min-height: 0 is required so it never grows the card), and clips + // when inactive so the card keeps its fixed height. See + // `.note_active :global(.tiptap-editor)` below for the scroll-on-edit state. + .note_main :global(.tiptap-editor) { + flex: 1; + min-width: 0; + min-height: 0; + overflow: hidden; + + &::-webkit-scrollbar { + width: 8px; + } + + &::-webkit-scrollbar-thumb { + background: rgba(139, 139, 139, 0.42); + border-radius: 30px; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: rgba(99, 99, 99, 0.676); + } + + &::-webkit-scrollbar-track { + background: transparent; } } &:hover { @@ -59,9 +98,18 @@ box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); } + .titleRow { + display: flex; + align-items: center; + gap: 0.5rem; + flex-shrink: 0; + min-width: 0; + position: relative; + z-index: 1; + } + .title { font-size: x-large; - height: 10%; width: 100%; outline: none; border: none; @@ -69,34 +117,40 @@ overflow: hidden; text-overflow: ellipsis; margin-bottom: 0.5rem; + flex-shrink: 0; transition-property: background, color; transition-duration: 0.2s; color: inherit; } .note_button { - position: relative; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + width: 2rem; + height: 2rem; + margin-left: 0.5rem; + padding: 0; + border: none; + border-radius: 8px; background-color: transparent; box-shadow: none; - border-radius: 10px; + cursor: pointer; - &:active { - background: rgba(135, 141, 141, 0.441); + svg { + width: 1.25rem; + height: 1.25rem; } + &:hover { background: rgba(135, 141, 141, 0.25); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); - border-radius: 10px; } - svg { - position: absolute; - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - width: 1rem; - height: 1rem; + + &:active { + background: rgba(135, 141, 141, 0.441); } } @@ -129,10 +183,8 @@ -webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); -moz-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); - // related to tiptap - .ProseMirror, - .ProseMirror-focused { - height: 100%; + // The editor becomes the single scroll region when active. + :global(.tiptap-editor) { overflow-y: auto; } } @@ -167,7 +219,7 @@ opacity: 0; transition: opacity 0.1s linear; position: absolute; - bottom: 10px; + bottom: 5px; } .note_container:hover .toolbar { @@ -178,10 +230,59 @@ opacity: 1; } +// frosted-glass pill wrapping the copy/delete actions +.toolbarPill { + display: flex; + align-items: center; + gap: 0.15rem; + padding: 0.3rem 0.35rem; + border-radius: 14px; + background-color: rgba(20, 22, 21, 0.38); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.18); + + // hidden until the card is hovered (desktop) or note is active + opacity: 0; + transform: translateY(4px); + pointer-events: none; + transition: opacity 0.15s linear, transform 0.15s linear; + + svg { + color: rgba(255, 255, 255, 0.92); + stroke: rgba(255, 255, 255, 0.92); + } +} + +// darker notes get a lighter pill so the buttons stay visible +.toolbarPill_dark { + background-color: rgba(245, 245, 245, 0.28); +} + +// Desktop / mouse: the pill comes up on hover of the card. +// Only applies to pointer devices that support hover — on touch it stays visible. +@media (hover: hover) and (pointer: fine) { + .note_container:hover .toolbarPill, + .note_active .toolbarPill { + opacity: 1; + transform: translateY(0); + pointer-events: auto; + } +} + +// Touch devices: no hover, so always show the pill. +@media (hover: none) { + .toolbarPill { + opacity: 1; + transform: none; + pointer-events: auto; + } +} + // tiptap styles .editor { // @extend .masked-overflow; - height: 90%; + height: 89%; width: 100%; outline: none; border: none; diff --git a/components/Home/styles/noteslist.module.scss b/apps/web/components/Home/styles/noteslist.module.scss similarity index 73% rename from components/Home/styles/noteslist.module.scss rename to apps/web/components/Home/styles/noteslist.module.scss index fab2dfc..9c3f829 100644 --- a/components/Home/styles/noteslist.module.scss +++ b/apps/web/components/Home/styles/noteslist.module.scss @@ -1,10 +1,11 @@ .notes_list { // position: relative; display: grid; - gap: 1rem; + gap: 1.5rem; /* Increased gap slightly for shadows */ grid-template-columns: repeat(auto-fill, minmax(min(18rem, 100%), 1fr)); - padding: 1rem; + padding: 1.5rem; /* Increased padding to prevent edge clipping */ justify-items: center; + overflow: visible; /* Ensure shadows aren't clipped */ .add_button { display: flex; diff --git a/components/Home/styles/tagbar.scss b/apps/web/components/Home/styles/tagbar.scss similarity index 100% rename from components/Home/styles/tagbar.scss rename to apps/web/components/Home/styles/tagbar.scss diff --git a/components/Home/styles/tags.scss b/apps/web/components/Home/styles/tags.scss similarity index 100% rename from components/Home/styles/tags.scss rename to apps/web/components/Home/styles/tags.scss diff --git a/components/Home/styles/tiptap.module.scss b/apps/web/components/Home/styles/tiptap.module.scss similarity index 100% rename from components/Home/styles/tiptap.module.scss rename to apps/web/components/Home/styles/tiptap.module.scss diff --git a/apps/web/components/Layout/AppLayout.tsx b/apps/web/components/Layout/AppLayout.tsx new file mode 100644 index 0000000..08941b7 --- /dev/null +++ b/apps/web/components/Layout/AppLayout.tsx @@ -0,0 +1,41 @@ + +import type React from "react"; +import Sidebar from "../Common/Sidebar"; +import MobileSidebar, { MOBILE_TAB_BAR_HEIGHT } from "../Common/MobileSidebar"; +import { Box, useMatches } from "@mantine/core"; + +type AppLayoutProps = { + children: React.ReactNode; +}; + +const AppLayout: React.FC = ({ children }) => { + const sidebarVisible = useMatches({ + base: false, + sm: true, + }); + const mobileBottomPadding = useMatches({ + base: MOBILE_TAB_BAR_HEIGHT, + sm: 0, + }); + return ( + + + + {children} + + + + ); +}; + +export default AppLayout; diff --git a/apps/web/components/Layout/styles/layout.module.scss b/apps/web/components/Layout/styles/layout.module.scss new file mode 100644 index 0000000..b8e8287 --- /dev/null +++ b/apps/web/components/Layout/styles/layout.module.scss @@ -0,0 +1,14 @@ + +.layout_container { + display: flex; + min-height: 100vh; + background-color: var(--color-background, var(--color-surface-100)); +} + +.main_content { + flex: 1; + margin-left: 72px; /* Match Sidebar width */ + width: calc(100% - 72px); + position: relative; + transition: margin-left 0.3s ease, width 0.3s ease; +} diff --git a/components/Offline/index.tsx b/apps/web/components/Offline/index.tsx similarity index 100% rename from components/Offline/index.tsx rename to apps/web/components/Offline/index.tsx diff --git a/apps/web/hooks/useAddNote.tsx b/apps/web/hooks/useAddNote.tsx new file mode 100644 index 0000000..ed0370f --- /dev/null +++ b/apps/web/hooks/useAddNote.tsx @@ -0,0 +1,46 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { addNote } from "@/utils/notesApi"; +import useStore from "./useStore"; +import type { Note, NoteCreate } from "@/types/Note"; + +const useAddNote = ({ successCb, errorCb }: { successCb?: () => void; errorCb?: () => void }) => { + const queryClient = useQueryClient(); + const updateSync = useStore((state) => state.updateSync); + const AddNoteMutation = useMutation({ + mutationFn: (data: NoteCreate) => addNote(data), + onMutate: () => { + updateSync(true); + }, + onSuccess: (id: number, variables: NoteCreate) => { + if (successCb) successCb(); + queryClient.setQueryData(["notes"], (oldNotes) => { + if (oldNotes) { + return [ + { + id, + noteTitle: variables.noteTitle, + noteContent: variables.noteContent ?? "", + color: variables.color ?? "#ffffff", + isArticle: variables.isArticle ?? false, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + ...oldNotes, + ]; + } + return oldNotes; + }); + }, + onError: () => { + if (errorCb) errorCb(); + }, + // Silently refetch in background to sync server state + onSettled: () => { + updateSync(false); + queryClient.invalidateQueries({ queryKey: ["notes"] }); + }, + }); + return AddNoteMutation; +}; + +export default useAddNote; diff --git a/apps/web/hooks/useAuth.tsx b/apps/web/hooks/useAuth.tsx new file mode 100644 index 0000000..521577d --- /dev/null +++ b/apps/web/hooks/useAuth.tsx @@ -0,0 +1,211 @@ +/** + * React Query hooks for auth. + * + * Provides: + * - useAuth() — main hook: user, status, login, register, signOut + * - useLogin() — mutation for login + * - useRegister() — mutation for registration + * + * Token is stored in localStorage and managed by lib/auth.ts. + * React Query handles caching, refetching, and stale state. + */ + +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; +import { useRouter } from "next/router"; +import { + fetchCurrentUser, + loginUser, + registerUser, + refreshToken, + getToken, + setToken, + clearToken, + isTokenExpired, + type AuthUser, +} from "@/lib/auth"; + +// ── Query key ──────────────────────────────────────────────────── + +const AUTH_QUERY_KEY = ["auth", "currentUser"]; + +// ── Hook: useAuth ──────────────────────────────────────────────── + +export function useAuth() { + const queryClient = useQueryClient(); + const router = useRouter(); + + // Check if we have a token — determines whether to fetch user + const token = typeof window !== "undefined" ? getToken() : null; + const hasToken = token !== null && !isTokenExpired(token); + + const { + data: user, + isLoading, + isError, + error, + refetch, + } = useQuery({ + queryKey: AUTH_QUERY_KEY, + queryFn: async () => { + const storedToken = getToken(); + if (!storedToken) return null; + + // Quick local expiry check + if (isTokenExpired(storedToken)) { + // Try to refresh + try { + const { token: newToken } = await refreshToken(storedToken); + setToken(newToken); + } catch { + clearToken(); + return null; + } + } + + // Verify with server + try { + return await fetchCurrentUser(); + } catch { + // Token invalid — try refresh + const currentToken = getToken(); + if (!currentToken) return null; + try { + const { token: newToken } = await refreshToken(currentToken); + setToken(newToken); + return await fetchCurrentUser(); + } catch { + clearToken(); + return null; + } + } + }, + enabled: hasToken, + retry: false, + staleTime: 5 * 60 * 1000, // 5 minutes before refetch + refetchOnWindowFocus: false, + }); + + // When there's no token, isLoading stays true because the query is disabled. + // We need to treat "no token" as "unauthenticated", not "loading". + const status: "loading" | "authenticated" | "unauthenticated" = + !hasToken + ? "unauthenticated" + : isLoading + ? "loading" + : user + ? "authenticated" + : "unauthenticated"; + + // ── Login mutation ─────────────────────────────────────────── + + const loginMutation = useMutation({ + mutationFn: async ({ + email, + password, + }: { + email: string; + password: string; + }) => { + const res = await loginUser(email, password); + setToken(res.token); + return res.user; + }, + onSuccess: (user) => { + queryClient.setQueryData(AUTH_QUERY_KEY, user); + router.push("/notes"); + }, + }); + + // ── Register mutation ──────────────────────────────────────── + + const registerMutation = useMutation({ + mutationFn: async ({ + email, + password, + }: { + email: string; + password: string; + }) => { + const res = await registerUser(email, password); + setToken(res.token); + return res.user; + }, + onSuccess: (user) => { + queryClient.setQueryData(AUTH_QUERY_KEY, user); + router.push("/notes"); + }, + }); + + // ── Sign out ───────────────────────────────────────────────── + + const signOut = () => { + clearToken(); + queryClient.setQueryData(AUTH_QUERY_KEY, null); + queryClient.invalidateQueries({ queryKey: AUTH_QUERY_KEY }); + router.push("/auth"); + }; + + return { + user: user ?? null, + status, + isLoading, + isAuthenticated: status === "authenticated", + error: error ? (error as Error).message : loginMutation.error + ? (loginMutation.error as Error).message + : registerMutation.error + ? (registerMutation.error as Error).message + : null, + login: loginMutation.mutateAsync, + register: registerMutation.mutateAsync, + signOut, + refetch, + }; +} + +// ── Standalone mutations (if you need them separately) ─────────── + +export function useLogin() { + const queryClient = useQueryClient(); + const router = useRouter(); + + return useMutation({ + mutationFn: async ({ + email, + password, + }: { + email: string; + password: string; + }) => { + const res = await loginUser(email, password); + setToken(res.token); + return res.user; + }, + onSuccess: (user) => { + queryClient.setQueryData(AUTH_QUERY_KEY, user); + router.push("/notes"); + }, + }); +} + +export function useRegister() { + const queryClient = useQueryClient(); + const router = useRouter(); + + return useMutation({ + mutationFn: async ({ + email, + password, + }: { + email: string; + password: string; + }) => { + const res = await registerUser(email, password); + setToken(res.token); + return res.user; + }, + onSuccess: (user) => { + queryClient.setQueryData(AUTH_QUERY_KEY, user); + router.push("/notes"); + }, + }); +} \ No newline at end of file diff --git a/hooks/useDarkMode.tsx b/apps/web/hooks/useDarkMode.tsx similarity index 100% rename from hooks/useDarkMode.tsx rename to apps/web/hooks/useDarkMode.tsx diff --git a/apps/web/hooks/useDeleteNote.tsx b/apps/web/hooks/useDeleteNote.tsx new file mode 100644 index 0000000..b826bcb --- /dev/null +++ b/apps/web/hooks/useDeleteNote.tsx @@ -0,0 +1,48 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { deleteNote } from "@/utils/notesApi"; +import useStore from "./useStore"; +import type { Note } from "@/types/Note"; + +const useDeleteNote = ({ + successCb, + errorCb, +}: { + successCb?: () => void; + errorCb?: () => void; +}) => { + const queryClient = useQueryClient(); + const updateSync = useStore((state) => state.updateSync); + + const deleteMutation = useMutation({ + mutationFn: (noteId: string) => deleteNote(Number(noteId)), + // Optimistic: remove the note from cache immediately + onMutate: async (deletedNoteId) => { + updateSync(true); + await queryClient.cancelQueries({ queryKey: ["notes"] }); + const previousNotes = queryClient.getQueryData(["notes"]); + queryClient.setQueryData(["notes"], (oldNotes) => { + if (oldNotes) return oldNotes.filter((note) => note.id !== Number(deletedNoteId)); + return oldNotes; + }); + return { previousNotes }; + }, + onSuccess: (_data, _deletedNoteId) => { + if (successCb) successCb(); + }, + onError: (_err, _deletedNoteId, context) => { + if (context?.previousNotes) { + queryClient.setQueryData(["notes"], context.previousNotes); + } + if (errorCb) errorCb(); + }, + // Silently refetch in background to sync server state + onSettled: () => { + updateSync(false); + queryClient.invalidateQueries({ queryKey: ["notes"] }); + }, + }); + + return deleteMutation; +}; + +export default useDeleteNote; diff --git a/apps/web/hooks/useGetNote.tsx b/apps/web/hooks/useGetNote.tsx new file mode 100644 index 0000000..0df5034 --- /dev/null +++ b/apps/web/hooks/useGetNote.tsx @@ -0,0 +1,12 @@ +import { useQuery } from "@tanstack/react-query"; +import { getNote } from "@/utils/notesApi"; +import type { Note } from "@/types/Note"; + +const useGetNote = (noteId: number | null | undefined) => { + return useQuery(["note", noteId], () => getNote(noteId!), { + enabled: !!noteId, + refetchOnWindowFocus: false, + }); +}; + +export default useGetNote; diff --git a/hooks/useGetNotes.tsx b/apps/web/hooks/useGetNotes.tsx similarity index 58% rename from hooks/useGetNotes.tsx rename to apps/web/hooks/useGetNotes.tsx index 927984c..e230b81 100644 --- a/hooks/useGetNotes.tsx +++ b/apps/web/hooks/useGetNotes.tsx @@ -1,12 +1,11 @@ import { useQuery } from "@tanstack/react-query"; -import { getNotes } from "../utils/supabase/db_operations"; +import { getNotes } from "../utils/notesApi"; import { toast } from "react-hot-toast"; -const useGetNotes = (creatorId: string | null) => { +const useGetNotes = () => { const notesQuery = useQuery({ - queryKey: ["notes", creatorId], - queryFn: () => getNotes(creatorId), - enabled: !!creatorId, + queryKey: ["notes"], + queryFn: () => getNotes(), onError: () => { toast.error("Failed to fetch notes", { id: "note-fetch-error", diff --git a/hooks/useOnClickOutside.tsx b/apps/web/hooks/useOnClickOutside.tsx similarity index 100% rename from hooks/useOnClickOutside.tsx rename to apps/web/hooks/useOnClickOutside.tsx diff --git a/apps/web/hooks/useSession.tsx b/apps/web/hooks/useSession.tsx new file mode 100644 index 0000000..9b35b13 --- /dev/null +++ b/apps/web/hooks/useSession.tsx @@ -0,0 +1,67 @@ +/** + * Session context — thin wrapper around useAuth() for backward compatibility. + * + * Existing components import { useSession } from "@/hooks/useSession". + * Under the hood it uses React Query via useAuth(). + */ + +import type { ReactNode } from "react"; +import { createContext, useContext } from "react"; +import { useAuth } from "./useAuth"; + +interface User { + id: string; + email: string; + role: "super_user" | "admin" | "user"; +} + +type SessionType = { + user: User; + login: (email: string, password: string) => Promise; + register: (email: string, password: string) => Promise; + signOut: () => void; + error: string | null; + status: string; +}; + +const defaultSession: SessionType = { + user: { id: "", email: "", role: "user" }, + login: async () => {}, + register: async () => {}, + signOut: () => {}, + error: null, + status: "loading", +}; + +const SessionContext = createContext(defaultSession); + +export function SessionProvider({ children }: { children: ReactNode }) { + const auth = useAuth(); + + const value: SessionType = { + user: auth.user ?? { id: "", email: "", role: "user" }, + login: async (email: string, password: string) => { + await auth.login({ email, password }); + }, + register: async (email: string, password: string) => { + await auth.register({ email, password }); + }, + signOut: auth.signOut, + error: auth.error, + status: auth.status, + }; + + return ( + + {children} + + ); +} + +export const useSession = () => { + const context = useContext(SessionContext); + if (!context) { + throw new Error("useSession hook must be used within SessionProvider"); + } + return context; +}; \ No newline at end of file diff --git a/hooks/useStore.tsx b/apps/web/hooks/useStore.tsx similarity index 100% rename from hooks/useStore.tsx rename to apps/web/hooks/useStore.tsx diff --git a/apps/web/hooks/useUpdateNote.tsx b/apps/web/hooks/useUpdateNote.tsx new file mode 100644 index 0000000..fa528be --- /dev/null +++ b/apps/web/hooks/useUpdateNote.tsx @@ -0,0 +1,49 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { updateNote } from "@/utils/notesApi"; +import type { Note, NoteUpdate } from "@/types/Note"; + +const useUpdateNote = () => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: ({ noteId, data }: { noteId: number; data: NoteUpdate }) => + updateNote(noteId, data), + // Optimistic update: immediately reflect the change in the cache + onMutate: async ({ noteId, data }) => { + // Cancel any in-flight refetches to avoid overwriting optimistic update + await queryClient.cancelQueries({ queryKey: ["notes"] }); + + // Snapshot previous value for rollback + const previousNotes = queryClient.getQueryData(["notes"]); + + // Optimistically update the cache + queryClient.setQueryData(["notes"], (oldNotes) => { + if (!oldNotes) return oldNotes; + return oldNotes.map((note) => + note.id === noteId ? { ...note, ...data } : note, + ); + }); + + // Return snapshot for rollback + return { previousNotes }; + }, + // Merge the server-confirmed note into the cache instead of refetching the + // whole list. Avoids a full GET /api/notes after every save. + onSuccess: (savedNote) => { + queryClient.setQueryData(["notes"], (oldNotes) => { + if (!oldNotes) return oldNotes; + return oldNotes.map((note) => + note.id === savedNote.id ? savedNote : note, + ); + }); + }, + // If mutation fails, roll back to the previous value + onError: (_err, _vars, context) => { + if (context?.previousNotes) { + queryClient.setQueryData(["notes"], context.previousNotes); + } + }, + }); +}; + +export default useUpdateNote; diff --git a/apps/web/lib/auth.ts b/apps/web/lib/auth.ts new file mode 100644 index 0000000..f9b6922 --- /dev/null +++ b/apps/web/lib/auth.ts @@ -0,0 +1,90 @@ +/** + * Auth service — thin wrapper around localStorage + React Query. + * + * This is the single source of truth for auth state. + * Components use `useAuth()` (React Query hook) instead of reading localStorage directly. + */ + +import { api } from "@/utils/api"; + +// ── Types ──────────────────────────────────────────────────────── + +export interface AuthUser { + id: string; + email: string; + role: "super_user" | "admin" | "user"; +} + +// ── Token helpers ──────────────────────────────────────────────── + +const TOKEN_KEY = "token"; + +export function getToken(): string | null { + if (typeof window === "undefined") return null; + return localStorage.getItem(TOKEN_KEY); +} + +export function setToken(token: string): void { + localStorage.setItem(TOKEN_KEY, token); +} + +export function clearToken(): void { + localStorage.removeItem(TOKEN_KEY); +} + +/** + * Decode a JWT without verifying the signature (client-side only). + * Returns null if the token is malformed. + */ +function decodeToken(token: string): Record | null { + try { + const parts = token.split("."); + if (parts.length !== 3) return null; + return JSON.parse(atob(parts[1])); + } catch { + return null; + } +} + +/** + * Check if a JWT is expired by inspecting its `exp` claim. + * Returns true if expired, malformed, or missing exp. + */ +export function isTokenExpired(token: string): boolean { + const payload = decodeToken(token); + if (!payload || typeof payload.exp !== "number") return true; + // Add a 30-second buffer to avoid race conditions + return Date.now() >= payload.exp * 1000 - 30_000; +} + +// ── API calls ──────────────────────────────────────────────────── + +export async function fetchCurrentUser(): Promise { + return api.get("/api/auth/me"); +} + +export async function loginUser( + email: string, + password: string, +): Promise<{ user: AuthUser; token: string }> { + return api.post<{ user: AuthUser; token: string }>("/api/auth/login", { + email, + password, + }); +} + +export async function registerUser( + email: string, + password: string, +): Promise<{ user: AuthUser; token: string }> { + return api.post<{ user: AuthUser; token: string }>("/api/auth/register", { + email, + password, + }); +} + +export async function refreshToken( + token: string, +): Promise<{ token: string }> { + return api.post<{ token: string }>("/api/auth/refresh", { token }); +} \ No newline at end of file diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs new file mode 100644 index 0000000..e163482 --- /dev/null +++ b/apps/web/next.config.mjs @@ -0,0 +1,17 @@ +/** @type {import('next').NextConfig} */ + +const nextConfig = { + reactStrictMode: true, + redirects: () => { + return [ + { + source: "/", + destination: "/auth", + permanent: false, + }, + ]; + }, + turbopack: {}, +}; + +export default nextConfig; diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..55d7f6d --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,45 @@ +{ + "name": "web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "type": "module", + "dependencies": { + "@floating-ui/react": "^0.19.2", + "@mantine/core": "^8.3.10", + "@mantine/hooks": "^8.3.10", + "@radix-ui/react-icons": "^1.3.2", + "@tanstack/react-query": "^4.42.0", + "@tanstack/react-query-devtools": "^4.42.0", + "@tiptap/extension-floating-menu": "^2.27.1", + "@tiptap/extension-image": "^2.27.1", + "@tiptap/extension-placeholder": "^2.27.1", + "@tiptap/extension-task-item": "^2.27.1", + "@tiptap/extension-task-list": "^2.27.1", + "@tiptap/react": "^2.27.1", + "@tiptap/starter-kit": "^2.27.1", + "@types/node": "18.15.12", + "@types/react": "18.0.37", + "@types/react-dom": "18.0.11", + "clsx": "^1.2.1", + "copy-to-clipboard": "^3.3.3", + "framer-motion": "^9.1.7", + "idb": "^7.1.1", + "next": "^16.0.7", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hot-toast": "^2.6.0", + "react-toggle": "^4.1.3", + "zustand": "^4.5.7" + }, + "devDependencies": { + "@biomejs/biome": "2.3.8", + "prettier": "2.8.8", + "typescript": "^5.9.3" + } +} diff --git a/pages/404.tsx b/apps/web/pages/404.tsx similarity index 100% rename from pages/404.tsx rename to apps/web/pages/404.tsx diff --git a/apps/web/pages/_app.tsx b/apps/web/pages/_app.tsx new file mode 100644 index 0000000..d32e934 --- /dev/null +++ b/apps/web/pages/_app.tsx @@ -0,0 +1,69 @@ +import "@mantine/core/styles.css"; +import "@/styles/globals.css"; +import type { AppProps } from "next/app"; +import { Hydrate, QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { useRef } from "react"; + +import Head from "next/head"; +import { SessionProvider } from "@/hooks/useSession"; +import { Toaster } from "react-hot-toast"; +import AppLayout from "@/components/Layout/AppLayout"; +import { theme } from "@/styles/theme"; +import { MantineProvider } from "@mantine/core"; + +export default function App({ Component, pageProps }: AppProps) { + const queryClient = useRef( + new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, // default: true + }, + }, + }) + ); + const descp = + "A lightweight note-taking app that aims to combine the best of Google Keep and Notion"; + return ( + + + + + + + + + + + + + + {/*twitter meta tags*/} + + + + + + + + + + + + + + + + + ); +} diff --git a/pages/_document.tsx b/apps/web/pages/_document.tsx similarity index 96% rename from pages/_document.tsx rename to apps/web/pages/_document.tsx index 1f8e458..b05a678 100644 --- a/pages/_document.tsx +++ b/apps/web/pages/_document.tsx @@ -1,8 +1,6 @@ import { Html, Head, Main, NextScript } from "next/document"; -import { Toaster } from "react-hot-toast"; export default function Document() { - return ( diff --git a/apps/web/pages/articles/[id].tsx b/apps/web/pages/articles/[id].tsx new file mode 100644 index 0000000..efb91f8 --- /dev/null +++ b/apps/web/pages/articles/[id].tsx @@ -0,0 +1,48 @@ +import React from "react"; +import { useRouter } from "next/router"; +import ArticleView from "@/components/Article/ArticleView"; +import useGetNote from "@/hooks/useGetNote"; +import { DotsLoader } from "@/components/Common/Loader"; +import styles from "./styles/article_page.module.scss"; +import Head from "next/head"; +import { Button } from "@mantine/core"; + +const ArticlePage = () => { + const router = useRouter(); + const { id } = router.query; + + const noteId = typeof id === "string" ? Number(id) : null; + + const { data: note, isLoading, error } = useGetNote(noteId); + + if (isLoading) { + return ( + <> + + Untitled Article + + + + ); + } + + if (error || !note) { + return ( +
+

Note not found

+ +
+ ); + } + + return ( + <> + + {note.noteTitle || "Untitled Article"} + + + + ); +}; + +export default ArticlePage; diff --git a/apps/web/pages/articles/index.tsx b/apps/web/pages/articles/index.tsx new file mode 100644 index 0000000..9b69369 --- /dev/null +++ b/apps/web/pages/articles/index.tsx @@ -0,0 +1,50 @@ +import React from "react"; +import Head from "next/head"; +import { useQuery } from "@tanstack/react-query"; +import { getArticles } from "@/utils/notesApi"; +import ArticlesList from "@/components/Article/ArticlesList"; +import { DotsLoader } from "@/components/Common/Loader"; +import { Center, Title, Stack, Container } from "@mantine/core"; + +const ArticlesIndex = () => { + const { + data: articles, + isLoading, + error, + } = useQuery({ + queryKey: ["articles"], + queryFn: () => getArticles(), + }); + + if (isLoading) return ; + + if (error) + return ( +
+ + Error loading articles + +
+ ); + + return ( + + + My Articles | DoNote + + + {articles && articles.length > 0 ? ( + + ) : ( +
+ + No articles yet. Convert a note to an article to see it here! + +
+ )} +
+
+ ); +}; + +export default ArticlesIndex; diff --git a/apps/web/pages/articles/styles/article_page.module.scss b/apps/web/pages/articles/styles/article_page.module.scss new file mode 100644 index 0000000..861e7ff --- /dev/null +++ b/apps/web/pages/articles/styles/article_page.module.scss @@ -0,0 +1,9 @@ + +.loading_container, .error_container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; + gap: 1rem; +} diff --git a/pages/auth.tsx b/apps/web/pages/auth.tsx similarity index 100% rename from pages/auth.tsx rename to apps/web/pages/auth.tsx diff --git a/apps/web/pages/index.tsx b/apps/web/pages/index.tsx new file mode 100644 index 0000000..8fe9c4a --- /dev/null +++ b/apps/web/pages/index.tsx @@ -0,0 +1,10 @@ +import { useEffect } from "react"; +import { useRouter } from "next/router"; + +export default function Home() { + const router = useRouter(); + useEffect(() => { + router.replace("/notes"); + }, [router]); + return null; +} diff --git a/pages/notes/index.tsx b/apps/web/pages/notes/index.tsx similarity index 100% rename from pages/notes/index.tsx rename to apps/web/pages/notes/index.tsx diff --git a/pages/notes/offline.tsx b/apps/web/pages/notes/offline.tsx similarity index 100% rename from pages/notes/offline.tsx rename to apps/web/pages/notes/offline.tsx diff --git a/public/android-chrome-192x192.png b/apps/web/public/android-chrome-192x192.png similarity index 100% rename from public/android-chrome-192x192.png rename to apps/web/public/android-chrome-192x192.png diff --git a/public/android-chrome-512x512.png b/apps/web/public/android-chrome-512x512.png similarity index 100% rename from public/android-chrome-512x512.png rename to apps/web/public/android-chrome-512x512.png diff --git a/public/android-chrome-dark-192x192.png b/apps/web/public/android-chrome-dark-192x192.png similarity index 100% rename from public/android-chrome-dark-192x192.png rename to apps/web/public/android-chrome-dark-192x192.png diff --git a/public/android-chrome-dark-512x512.png b/apps/web/public/android-chrome-dark-512x512.png similarity index 100% rename from public/android-chrome-dark-512x512.png rename to apps/web/public/android-chrome-dark-512x512.png diff --git a/public/animated_text.svg b/apps/web/public/animated_text.svg similarity index 100% rename from public/animated_text.svg rename to apps/web/public/animated_text.svg diff --git a/public/apple-touch-icon-dark.png b/apps/web/public/apple-touch-icon-dark.png similarity index 100% rename from public/apple-touch-icon-dark.png rename to apps/web/public/apple-touch-icon-dark.png diff --git a/public/apple-touch-icon.png b/apps/web/public/apple-touch-icon.png similarity index 100% rename from public/apple-touch-icon.png rename to apps/web/public/apple-touch-icon.png diff --git a/public/favicon-16x16.png b/apps/web/public/favicon-16x16.png similarity index 100% rename from public/favicon-16x16.png rename to apps/web/public/favicon-16x16.png diff --git a/public/favicon-32x32.png b/apps/web/public/favicon-32x32.png similarity index 100% rename from public/favicon-32x32.png rename to apps/web/public/favicon-32x32.png diff --git a/public/favicon-dark-16x16.png b/apps/web/public/favicon-dark-16x16.png similarity index 100% rename from public/favicon-dark-16x16.png rename to apps/web/public/favicon-dark-16x16.png diff --git a/public/favicon-dark-32x32.png b/apps/web/public/favicon-dark-32x32.png similarity index 100% rename from public/favicon-dark-32x32.png rename to apps/web/public/favicon-dark-32x32.png diff --git a/public/favicon-dark.ico b/apps/web/public/favicon-dark.ico similarity index 100% rename from public/favicon-dark.ico rename to apps/web/public/favicon-dark.ico diff --git a/public/favicon.ico b/apps/web/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to apps/web/public/favicon.ico diff --git a/public/manifest.json b/apps/web/public/manifest.json similarity index 100% rename from public/manifest.json rename to apps/web/public/manifest.json diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css new file mode 100644 index 0000000..0f71e42 --- /dev/null +++ b/apps/web/styles/globals.css @@ -0,0 +1,227 @@ +:root { + --weak-border: #0b0e0d1c; + --color-background: #0b0e0d; + + /* Dark theme (default) — light text on dark surface */ + --color-primary-100: #eff2f1; + --color-primary-200: #f1f3f3; + --color-primary-300: #f3f5f4; + --color-primary-400: #f4f6f6; + --color-primary-500: #f6f8f7; + --color-primary-600: #f8f9f9; + + --color-surface-100: #0b0e0d; + --color-surface-200: #232524; + --color-surface-300: #3a3c3b; + --color-surface-400: #535554; + --color-surface-500: #6d6f6e; + --color-surface-600: #898a89; + + /* note background colors */ + --note-bg-light-1: #ffc6c6; + --note-bg-light-2: #dbd5ff; + --note-bg-dark-1: #0d5c63; + --note-bg-dark-2: #241623; + --note-bg-dark-3: #071e22; + --note-bg-dark-4: var(--color-surface-200); + + color: var(--color-primary-100); + background-color: var(--color-surface-100); + + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + color-scheme: light dark; + box-sizing: border-box; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + transition: color 0.3s, background-color 0.3s; +} + +@media (prefers-color-scheme: light) { + :root { + --weak-border: #c0c4c31c; + --color-background: #eff2f1; + + /* Light theme — dark text on light surface */ + --color-primary-100: #0b0e0d; + --color-primary-200: #2e2e2e; + --color-primary-300: #595a5a; + --color-primary-400: #888a89; + --color-primary-500: #babcbc; + --color-primary-600: #eff2f1; + + --color-surface-100: #ffffff; + --color-surface-200: #f0f2f1; + --color-surface-300: #e0e4e3; + --color-surface-400: #d0d4d3; + --color-surface-500: #bcc0bf; + --color-surface-600: #a8acab; + + color: var(--color-primary-100); + background-color: var(--color-surface-100); + } +} + +html, +body { + margin: 0; + width: 100%; + min-height: 100%; +} + +#__next { + min-height: 100%; + min-width: 100%; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#root { + height: 100%; +} + +#root, +.App { + margin: 0; + display: flex; + flex-flow: column; + flex-grow: 1; +} + +.icon_button { + position: relative; + background-color: transparent; + border-radius: 10px; + width: 1.5rem; + height: 1.5rem; + border: 1px solid transparent; +} + +.icon_button:active { + background: rgba(135, 141, 141, 0.441); + mix-blend-mode: difference; +} + +.icon_button:hover { + background: rgba(135, 141, 141, 0.25); + mix-blend-mode: difference; + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + border-radius: 10px; +} + +.icon_button svg { + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +/* Global Tiptap Editor Styling */ +.tiptap-editor { + width: 100%; + outline: none; + border: none; + position: relative; +} + +.tiptap-editor ::-webkit-scrollbar { + width: 8px; + height: 8px; + border-radius: 30px; + position: relative; + z-index: 3; +} + +.tiptap-editor ::-webkit-scrollbar-thumb { + background: rgba(139, 139, 139, 0.42); + cursor: pointer; + border-radius: 30px; +} + +.tiptap-editor ::-webkit-scrollbar-thumb:hover { + background-color: rgba(99, 99, 99, 0.676); +} + +.tiptap-editor ::-webkit-scrollbar-thumb:active { + background-color: rgba(99, 99, 99); +} + +.tiptap-editor ::-webkit-scrollbar-track { + background: transparent; + cursor: pointer; + border-radius: 30px; +} + +.tiptap-editor .ProseMirror, +.tiptap-editor .ProseMirror-focused { + height: 100%; + width: 100%; + outline: none; + border: none; +} + +.tiptap-editor .ProseMirror .is-editor-empty, +.tiptap-editor .ProseMirror-focused .is-editor-empty { + color: var(--text-secondary, #898a89); + opacity: 0.5; +} + +.tiptap-editor .ProseMirror p, +.tiptap-editor .ProseMirror-focused p { + margin-block-start: 0.5em; + margin-block-end: 0.5em; +} + +.tiptap-editor .ProseMirror ul, +.tiptap-editor .ProseMirror-focused ul { + padding-inline-start: 15px; +} + +.tiptap-editor .ProseMirror ul[data-type="taskList"], +.tiptap-editor .ProseMirror-focused ul[data-type="taskList"] { + list-style: none; + padding-inline-start: 8px; +} + +.tiptap-editor .ProseMirror ul[data-type="taskList"] p, +.tiptap-editor .ProseMirror-focused ul[data-type="taskList"] p { + margin: 0; +} + +.tiptap-editor .ProseMirror ul[data-type="taskList"] li, +.tiptap-editor .ProseMirror-focused ul[data-type="taskList"] li { + display: flex; +} + +.tiptap-editor .ProseMirror ul[data-type="taskList"] li > label, +.tiptap-editor .ProseMirror-focused ul[data-type="taskList"] li > label { + flex: 0 0 auto; + margin-right: 0.5rem; + user-select: none; +} + +.tiptap-editor .ProseMirror ul[data-type="taskList"] li > div, +.tiptap-editor .ProseMirror-focused ul[data-type="taskList"] li > div { + flex: 1 1 auto; +} + +.tiptap-editor .ProseMirror img, +.tiptap-editor .ProseMirror-focused img { + height: auto; + max-width: 80%; + position: relative; + left: 50%; + transform: translate(-50%); +} + +.tiptap-editor .ProseMirror img.ProseMirror-selectednode, +.tiptap-editor .ProseMirror-focused img.ProseMirror-selectednode { + outline: 3px solid #121225; +} diff --git a/styles/pages/notfound.module.scss b/apps/web/styles/pages/notfound.module.scss similarity index 100% rename from styles/pages/notfound.module.scss rename to apps/web/styles/pages/notfound.module.scss diff --git a/apps/web/styles/theme.ts b/apps/web/styles/theme.ts new file mode 100644 index 0000000..d387972 --- /dev/null +++ b/apps/web/styles/theme.ts @@ -0,0 +1,90 @@ +import { + createTheme, + type MantineTheme, + type MantineThemeColors, + type MantineColorsTuple, +} from "@mantine/core"; + +const surfaceDark: MantineColorsTuple = [ + "#0b0e0d", // 0 + "#232524", // 1 + "#3a3c3b", // 2 + "#535554", // 3 + "#6d6f6e", // 4 + "#898a89", // 5 + "#a0a2a1", // 6 + "#b6b8b7", // 7 + "#dce0de", // 8 + "#eff2f1", // 9 +]; + +const surfaceLight: MantineColorsTuple = [ + "#ffffff", // 0 + "#f0f2f1", // 1 + "#e0e4e3", // 2 + "#d0d4d3", // 3 + "#bcc0bf", // 4 + "#a8acab", // 5 + "#949897", // 6 + "#808483", // 7 + "#6c706f", // 8 + "#585c5b", // 9 +]; + +const primaryDark: MantineColorsTuple = [ + "#eff2f1", // 0 + "#f1f3f3", // 1 + "#f3f5f4", // 2 + "#f4f6f6", // 3 + "#f6f8f7", // 4 + "#f8f9f9", // 5 + "#ffffff", // 6 + "#ffffff", // 7 + "#ffffff", // 8 + "#ffffff", // 9 +]; + +const primaryLight: MantineColorsTuple = [ + "#0b0e0d", // 0 + "#2e2e2e", // 1 + "#595a5a", // 2 + "#888a89", // 3 + "#babcbc", // 4 + "#eff2f1", // 5 + "#ffffff", // 6 + "#ffffff", // 7 + "#ffffff", // 8 + "#ffffff", // 9 +]; + +export const theme = createTheme({ + colors: { + surface: surfaceDark, + primary: primaryDark, + } as unknown as MantineThemeColors, + primaryColor: "primary", + defaultRadius: "md", + fontFamily: "Inter, Avenir, Helvetica, Arial, sans-serif", + autoContrast: true, + luminanceThreshold: 0.4, + components: { + Button: { + vars: (_: MantineTheme, props: any) => { + if (props.variant === "subtle" && props.color === "gray") { + return { + root: { + "--button-hover": "var(--mantine-color-surface-2)", + "--button-active": "var(--mantine-color-surface-3)", + }, + }; + } + return { root: {} }; + }, + }, + }, +}); + +export const themeColors = { + dark: { surface: surfaceDark, primary: primaryDark } as const, + light: { surface: surfaceLight, primary: primaryLight } as const, +}; diff --git a/styles/utilities/_buttons.scss b/apps/web/styles/utilities/_buttons.scss similarity index 100% rename from styles/utilities/_buttons.scss rename to apps/web/styles/utilities/_buttons.scss diff --git a/styles/utilities/_colors.scss b/apps/web/styles/utilities/_colors.scss similarity index 100% rename from styles/utilities/_colors.scss rename to apps/web/styles/utilities/_colors.scss diff --git a/styles/utilities/_effects.scss b/apps/web/styles/utilities/_effects.scss similarity index 100% rename from styles/utilities/_effects.scss rename to apps/web/styles/utilities/_effects.scss diff --git a/tsconfig.json b/apps/web/tsconfig.json similarity index 88% rename from tsconfig.json rename to apps/web/tsconfig.json index 8471497..107c42e 100644 --- a/tsconfig.json +++ b/apps/web/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es2017", "lib": [ "dom", "dom.iterable", @@ -13,12 +13,11 @@ "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "react-jsx", "incremental": true, - "baseUrl": ".", "paths": { "@/*": [ "./*" diff --git a/types/AppState.ts b/apps/web/types/AppState.ts similarity index 100% rename from types/AppState.ts rename to apps/web/types/AppState.ts diff --git a/types/Auth.ts b/apps/web/types/Auth.ts similarity index 100% rename from types/Auth.ts rename to apps/web/types/Auth.ts diff --git a/apps/web/types/Note.ts b/apps/web/types/Note.ts new file mode 100644 index 0000000..cfd6b78 --- /dev/null +++ b/apps/web/types/Note.ts @@ -0,0 +1,80 @@ +import { UseMutateFunction } from "@tanstack/react-query"; +import { Editor } from "@tiptap/react"; +import { MouseEventHandler, MutableRefObject } from "react"; + +// ── API types (camelCase, matching backend) ───────────────────── + +export interface Note { + id: number; + noteTitle: string; + noteContent: string; + color: string; + isArticle?: boolean; + createdAt: string; + updatedAt: string; +} + +export interface NoteCreate { + noteTitle: string; + noteContent?: string; + color?: string; + isArticle?: boolean; +} + +export interface NoteUpdate { + noteTitle?: string; + noteContent?: string; + color?: string; + isArticle?: boolean; +} + +// ── Legacy types kept for component compatibility ─────────────── + +export type AddNoteParams = { + newNote: NoteCreate; + creatorId: string | null; +}; + +type cbFn = () => void; + +export type AddNoteMutationParams = { + creatorId: string | null; + successCb?: cbFn; + errorCb?: cbFn; +}; + +export type DeleteNoteMutationParams = { + creatorId: string | null; + successCb?: cbFn; + errorCb?: cbFn; +}; + +export type UpdateNoteFn = (noteId: number, newNote: NoteUpdate) => Promise; + +export type DeleteMutation = UseMutateFunction; + +export type NotesContextValue = { + addingNote: boolean; + addNote: MouseEventHandler; + deleteNote: DeleteMutation; + updateNote: UpdateNoteFn; +}; + +export type NoteContextType = { + noteTitle: string; + content: string; + color: string; + dirty: boolean; + syncing: boolean; + editMode: boolean; + fsId: string; + setEditMode: (state: boolean) => void; + setColor: (color: string) => void; + setTitle: (title: string) => void; + setContent: (content: string) => void; + onEditModeChange?: (cb: (editable: boolean) => void) => void; +}; + +export type EditorContextType = { + editor: Editor | null; +}; diff --git a/types/Styles.ts b/apps/web/types/Styles.ts similarity index 100% rename from types/Styles.ts rename to apps/web/types/Styles.ts diff --git a/apps/web/utils/api.ts b/apps/web/utils/api.ts new file mode 100644 index 0000000..6a824df --- /dev/null +++ b/apps/web/utils/api.ts @@ -0,0 +1,45 @@ +const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3000"; + +export class ApiError extends Error { + constructor(public status: number, message: string) { + super(message); + this.name = "ApiError"; + } +} + +async function request(path: string, options: RequestInit = {}): Promise { + const token = typeof window !== "undefined" ? localStorage.getItem("token") : null; + const headers: Record = { + ...(options.headers as Record), + }; + // Only set Content-Type when there's a body to send. + // Fastify rejects empty JSON bodies (e.g. DELETE with no body). + if (options.body) { + headers["Content-Type"] = "application/json"; + } + if (token) { + headers["Authorization"] = `Bearer ${token}`; + } + const res = await fetch(`${API_URL}${path}`, { ...options, headers }); + if (!res.ok) { + const body = await res.json().catch(() => ({ error: res.statusText })); + throw new ApiError(res.status, body.error || "Request failed"); + } + if (res.status === 204) return undefined as T; + return res.json(); +} + +export const api = { + get: (path: string) => request(path), + post: (path: string, body?: unknown) => + request(path, { + method: "POST", + body: body ? JSON.stringify(body) : undefined, + }), + patch: (path: string, body?: unknown) => + request(path, { + method: "PATCH", + body: body ? JSON.stringify(body) : undefined, + }), + delete: (path: string) => request(path, { method: "DELETE" }), +}; \ No newline at end of file diff --git a/utils/common/noteColors.ts b/apps/web/utils/common/noteColors.ts similarity index 100% rename from utils/common/noteColors.ts rename to apps/web/utils/common/noteColors.ts diff --git a/apps/web/utils/icons.tsx b/apps/web/utils/icons.tsx new file mode 100644 index 0000000..f638332 --- /dev/null +++ b/apps/web/utils/icons.tsx @@ -0,0 +1,43 @@ +import React from "react"; +import type { IconProps as RadixIconProps } from "@radix-ui/react-icons/dist/types"; + +// Radix icons use width/height, not size. Wrap them for convenience. +function wrap(Icon: React.ForwardRefExoticComponent) { + return ({ size, width, height, ...props }: RadixIconProps & { size?: number }) => + // eslint-disable-next-line @typescript-eslint/no-explicit-any + React.createElement(Icon as any, { + width: size ?? width ?? 24, + height: size ?? height ?? 24, + ...props, + }); +} + +import { PlusIcon as _PlusIcon } from "@radix-ui/react-icons"; +import { Cross2Icon as _CloseIcon } from "@radix-ui/react-icons"; +import { HomeIcon as _HomeIcon } from "@radix-ui/react-icons"; +import { FileTextIcon as _FileTextIcon } from "@radix-ui/react-icons"; +import { ExitIcon as _LogOutIcon } from "@radix-ui/react-icons"; +import { CopyIcon as _CopyIcon } from "@radix-ui/react-icons"; +import { CheckIcon as _CheckIcon } from "@radix-ui/react-icons"; +import { TrashIcon as _DeleteIcon } from "@radix-ui/react-icons"; +import { ListBulletIcon as _ListIcon } from "@radix-ui/react-icons"; +import { HeadingIcon as _HeadingIcon } from "@radix-ui/react-icons"; +import { CheckboxIcon as _ChecklistIcon } from "@radix-ui/react-icons"; +import { ImageIcon as _ImageIcon } from "@radix-ui/react-icons"; +import { CheckCircledIcon as _CloudCheckIcon } from "@radix-ui/react-icons"; +import { GearIcon as _PaletteIcon } from "@radix-ui/react-icons"; + +export const PlusIcon = wrap(_PlusIcon); +export const CloseIcon = wrap(_CloseIcon); +export const HomeIcon = wrap(_HomeIcon); +export const FileTextIcon = wrap(_FileTextIcon); +export const LogOutIcon = wrap(_LogOutIcon); +export const CopyIcon = wrap(_CopyIcon); +export const CheckIcon = wrap(_CheckIcon); +export const DeleteIcon = wrap(_DeleteIcon); +export const ListIcon = wrap(_ListIcon); +export const HeadingIcon = wrap(_HeadingIcon); +export const ChecklistIcon = wrap(_ChecklistIcon); +export const ImageIcon = wrap(_ImageIcon); +export const CloudCheckIcon = wrap(_CloudCheckIcon); +export const PaletteIcon = wrap(_PaletteIcon); diff --git a/apps/web/utils/notesApi.ts b/apps/web/utils/notesApi.ts new file mode 100644 index 0000000..488178e --- /dev/null +++ b/apps/web/utils/notesApi.ts @@ -0,0 +1,28 @@ +import type { Note, NoteCreate, NoteUpdate } from "@/types/Note"; +import { api } from "@/utils/api"; + +export const addNote = async (data: NoteCreate): Promise => { + const note = await api.post("/api/notes", data); + return note.id; +}; + +export const getNotes = async (): Promise => { + return api.get("/api/notes"); +}; + +export const getArticles = async (): Promise => { + const notes = await api.get("/api/notes"); + return notes.filter((n) => n.isArticle); +}; + +export const getNote = async (noteId: number): Promise => { + return api.get(`/api/notes/${noteId}`); +}; + +export const updateNote = async (noteId: number, data: NoteUpdate): Promise => { + return api.patch(`/api/notes/${noteId}`, data); +}; + +export const deleteNote = async (noteId: number): Promise => { + await api.delete(`/api/notes/${noteId}`); +}; \ No newline at end of file diff --git a/caddy.Dockerfile b/caddy.Dockerfile new file mode 100644 index 0000000..93eba9a --- /dev/null +++ b/caddy.Dockerfile @@ -0,0 +1,10 @@ +# Stage 1: Build Caddy with the rate-limit plugin using xcaddy +FROM caddy:2.8-builder-alpine AS builder + +RUN xcaddy build \ + --with github.com/mholt/caddy-ratelimit + +# Stage 2: Final runner image containing the compiled Caddy binary +FROM caddy:2.8-alpine + +COPY --from=builder /usr/bin/caddy /usr/bin/caddy diff --git a/components/Auth/index.tsx b/components/Auth/index.tsx deleted file mode 100644 index b819ef5..0000000 --- a/components/Auth/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React, { useEffect } from "react"; -import styles from "./styles/auth.module.scss"; -import { FcGoogle } from "react-icons/fc"; - -import { toast } from "react-hot-toast"; -import { useSession } from "@/hooks/useSession"; - -const Auth = () => { - const { status, signInWithGoogle } = useSession(); - const handleGoogleSignup = async () => { - toast.loading("Signing you in..."); - signInWithGoogle(); - }; - useEffect(() => { - if (status === "authenticated") { - toast.success("Logged in, redirecting to home...", { id: "loggedin" }); - } - }, [status]); - const authLoading = status === "loading" || status === "authenticated"; - return ( -
-
-
Do Note
-

- A lightweight note taking app for your hyper productive self. -

-
- - -
- ); -}; - -export default Auth; diff --git a/components/Common/Button.tsx b/components/Common/Button.tsx deleted file mode 100644 index aa048c6..0000000 --- a/components/Common/Button.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import type React from "react"; -import type { FC } from "react"; -import styles from "./styles/button.module.scss"; -import clsx from "clsx"; - -export interface ButtonProps extends React.ComponentPropsWithoutRef<"button"> { - specialProp?: string; -} - -const Button: FC = ({ - children, - style, - className, - onClick, - disabled, -}) => { - return ( - - ); -}; - -export default Button; diff --git a/components/Common/ColorMenu.tsx b/components/Common/ColorMenu.tsx deleted file mode 100644 index cd7d9e3..0000000 --- a/components/Common/ColorMenu.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { IoIosColorPalette } from "react-icons/io"; -import styles from "./styles/colormenu.module.scss"; -import button from "./styles/button.module.scss"; -import clsx from "clsx"; -import Menu, { MenuButton } from "./Menu"; - -type ColorMenuProps = { - setColor: (color: string) => void; -}; - -const ColorMenu = ({ setColor }: ColorMenuProps) => { - const lightColorCount = 2; - const lightColorPrefix = "--note-bg-light-"; - const darkColorCount = 4; - const darkColorPrefix = "--note-bg-dark-"; - - const getColorPallete = () => { - const getColors = (cssPrefix: string, colorCount: number): string[] => { - const colorList = []; - for (let i = 1; i <= colorCount; i++) { - colorList.push(`var(${cssPrefix}${i})`); - } - return colorList; - }; - let palletteList = getColors(lightColorPrefix, lightColorCount); - palletteList = palletteList.concat(getColors(darkColorPrefix, darkColorCount)); - return palletteList.map((color, i) => ( - - } - direction={"bottom"} - offsetY={12} - align="center" - > -
- {getColorPallete()} -
- - ); -}; - -export default ColorMenu; diff --git a/components/Common/Loader.tsx b/components/Common/Loader.tsx deleted file mode 100644 index acc499a..0000000 --- a/components/Common/Loader.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { MutatingDots, Oval } from "react-loader-spinner"; -import React from "react"; -import styles from "./styles/loader.module.scss"; -import useDarkModeDetection from "@/hooks/useDarkMode"; -export const OvalLoader = ({ magnify }: { magnify: string }) => { - const style = { - position: "fixed", - top: "50%", - left: "50%", - transform: `translate(-50%,-50%) scale(${magnify})`, - }; - return ( - - ); -}; - -export const DotsLoader = () => { - const isDarkTheme = useDarkModeDetection(); - - return ( - - ); -}; diff --git a/components/Common/Menu.tsx b/components/Common/Menu.tsx deleted file mode 100644 index 9c724dc..0000000 --- a/components/Common/Menu.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { - useFloating, - offset as fuOffset, - flip, - shift, - autoUpdate, - useInteractions, - useClick, - useDismiss, - useRole, - type Placement, -} from "@floating-ui/react"; -import styles from "./styles/menu.module.scss"; -import clsx from "clsx"; - -type Direction = "bottom" | "top"; -type Align = "start" | "center" | "end"; - -interface MenuProps { - menuButton: React.ReactNode; - direction?: Direction; - offsetY?: number; - align?: Align; - menuStyle?: React.CSSProperties; - className?: string; - transition?: boolean; - children?: React.ReactNode; -} - -interface KeepableMouseEvent extends React.MouseEvent { - keepOpen?: boolean; -} - -interface MenuItemProps { - onClick?: (e: KeepableMouseEvent) => void; - disabled?: boolean; - className?: string; - children?: React.ReactNode; -} - -export const MenuItem: React.FC = ({ - onClick, - disabled, - className, - children, -}) => { - const handleClick = (ev: React.MouseEvent) => { - if (disabled) return; - const proxy = ev as KeepableMouseEvent; - proxy.keepOpen = proxy.keepOpen ?? false; - if (onClick) onClick(proxy); - }; - - return ( - - ); -}; - -export const MenuDivider: React.FC = () => { - return
; -}; - -interface MenuButtonProps { - title?: string; - className?: string; - children?: React.ReactNode; -} - -export const MenuButton: React.FC = ({ title, className, children }) => { - return ( - - {children} - - ); -}; - -const Menu: React.FC = ({ - menuButton, - direction = "bottom", - offsetY = 8, - align = "start", - menuStyle, - className, - transition, - children, -}) => { - const [open, setOpen] = useState(false); - const [renderPanel, setRenderPanel] = useState(open); - const TRANSITION_MS = 150; - - const placement = (`${direction === "bottom" ? "bottom" : "top"}${align === "start" ? "-start" : align === "end" ? "-end" : "" - }`) as Placement; - - const { x, y, reference, floating, strategy, context } = useFloating({ - open, - onOpenChange: setOpen, - placement, - middleware: [fuOffset(offsetY), flip(), shift({ padding: 8 })], - whileElementsMounted: autoUpdate, - }); - - const { getReferenceProps, getFloatingProps } = useInteractions([ - useClick(context), - useDismiss(context), - useRole(context, { role: "menu" }), - ]); - - // wrapper for children clicks -- closes menu unless handler set .keepOpen - const handleChildClick = (ev: KeepableMouseEvent) => { - if (ev?.keepOpen) return; - setOpen(false); - }; - - const clonedChildren = React.Children.map(children, (child) => { - if (!React.isValidElement(child)) return child; - const childProps = (child as React.ReactElement>).props; - const orig = childProps.onClick as ((e: KeepableMouseEvent) => void) | undefined; - const disabled = childProps.disabled as boolean | undefined; - return React.cloneElement(child as React.ReactElement, { - onClick: (e: React.MouseEvent) => { - const proxy = e as KeepableMouseEvent; - proxy.keepOpen = proxy.keepOpen ?? false; - if (orig) orig(proxy); - if (!proxy.keepOpen && !disabled) handleChildClick(proxy); - }, - }); - }); - - // floating-ui handles dismiss via useDismiss; no manual outside-click needed - - // manage mount/unmount for transitions - useEffect(() => { - if (open) { - setRenderPanel(true); - return; - } - if (!open && transition) { - const t = setTimeout(() => setRenderPanel(false), TRANSITION_MS + 10); - return () => clearTimeout(t); - } - if (!open) setRenderPanel(false); - }, [open, transition]); - - const panelClass = `${styles.menu_panel} ${transition ? (open ? styles.panel_enter : styles.panel_exit) : ""}`; - - const userProps = React.isValidElement(menuButton) ? menuButton.props : {}; - const referenceProps = getReferenceProps({ - ...userProps, - ref: reference, - "aria-haspopup": "menu", - "aria-expanded": open, - }) as React.HTMLAttributes; - - const floatingStyle: React.CSSProperties = { - position: strategy, - left: x != null ? `${Math.round(x)}px` : undefined, - top: y != null ? `${Math.round(y)}px` : undefined, - minWidth: "8rem", - zIndex: 9999, - ...menuStyle, - }; - - return ( - <> - {React.isValidElement(menuButton) - ? React.cloneElement(menuButton as React.ReactElement, referenceProps) - : menuButton} - - {renderPanel && ( -
- {clonedChildren} -
- )} - - ); -}; - -export default Menu; diff --git a/components/Common/Navbar.tsx b/components/Common/Navbar.tsx deleted file mode 100644 index a3e30b2..0000000 --- a/components/Common/Navbar.tsx +++ /dev/null @@ -1,65 +0,0 @@ -// import { useAuthUser } from "@/hooks/useAuthUser"; -import Image from "next/image"; -import Link from "next/link"; -import OfflineToggle from "./OfflineToggle"; -import SyncIndicator from "./SyncIndicator"; -import styles from "./styles/navbar.module.scss"; -import { FiLogOut } from "react-icons/fi"; -import { useSession } from "@/hooks/useSession"; -import Menu, { MenuDivider, MenuItem } from "./Menu"; - -const Navbar = () => { - const { user, signOut } = useSession(); - const handleLogout = async () => { - signOut(); - }; - return ( - - ); -}; - -export default Navbar; diff --git a/components/Common/NotesLoader.tsx b/components/Common/NotesLoader.tsx deleted file mode 100644 index 0b741f9..0000000 --- a/components/Common/NotesLoader.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React from "react"; -import ContentLoader from "react-content-loader"; - -const StickyNoteLoader: React.FC = () => ( - - - - -); - -const NotesLoader = () => { - return ( -
- {[1, 2, 3, 4, 5, 6, 7, 9].map((i) => { - return ; - })} -
- ); -}; - -export default NotesLoader; diff --git a/components/Common/OfflineToggle.tsx b/components/Common/OfflineToggle.tsx deleted file mode 100644 index 620c903..0000000 --- a/components/Common/OfflineToggle.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React, { useState } from "react"; -import Toggle from "react-toggle"; -import "react-toggle/style.css"; -import styles from "./styles/toggle.module.scss"; - -const OfflineToggle = () => { - const [offline, setOffline] = useState(false); - return ( - <> - setOffline(!offline)} - disabled - /> - Offline - - ); -}; - -export default OfflineToggle; diff --git a/components/Common/SyncIndicator.tsx b/components/Common/SyncIndicator.tsx deleted file mode 100644 index 6ec5bf5..0000000 --- a/components/Common/SyncIndicator.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from "react"; -import { ColorRing } from "react-loader-spinner"; -import { BsCloudCheck } from "react-icons/bs"; -import useStore from "@/hooks/useStore"; -import { AppState } from "@/types/AppState"; - -const SyncIndicator = () => { - const ringColor = "#939393c7"; - const syncing = useStore((state) => state.syncing); - return ( - <> - {syncing ? ( - - ) : ( - - )} - - ); -}; - -export default SyncIndicator; diff --git a/components/Home/components/Backdrop.tsx b/components/Home/components/Backdrop.tsx deleted file mode 100644 index c19123a..0000000 --- a/components/Home/components/Backdrop.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { motion } from "framer-motion"; -import { ReactNode } from "react"; -import styles from '../styles/backdrop.module.scss'; -type BackdropProps = { - // children: ReactNode, - onClick: () => void -} -const Backdrop = ({ onClick }:BackdropProps) => { - - return ( -
- ); -}; - -export default Backdrop; \ No newline at end of file diff --git a/components/Home/components/BottomMenu.tsx b/components/Home/components/BottomMenu.tsx deleted file mode 100644 index 1962757..0000000 --- a/components/Home/components/BottomMenu.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { - type EventHandler, - type SyntheticEvent, - memo, - useContext, - useState, -} from "react"; -import styles from "../styles/note.module.scss"; -import button from "@/components/Common/styles/button.module.scss"; -import { FiEdit3 } from "react-icons/fi"; -// import { TbPinned } from "react-icons/tb"; -import { BiCheck, BiCopy } from "react-icons/bi"; -import { MdOutlineDelete } from "react-icons/md"; -import ColorMenu from "@/components/Common/ColorMenu"; -import { clsx } from "clsx"; -import type { NoteContextType, NotesContextValue } from "@/types/Note"; -import Button from "@/components/Common/Button"; -import { NoteContext } from "./Note"; -import { NotesContext } from "./NotesList"; -import type { Editor } from "@tiptap/react"; - -type BottomMenuProps = { - // setEditMode: (flag: boolean) => void; - // active: boolean; - // fsId: string; - // setColor: (colorIndex: number) => void; - // theme: string; - // deleteNote: DeleteMutation; - // isDeleting?: boolean; - editor: Editor | null; -}; - -const BottomMenu = memo(function BottomMenu({ - editor, -}: BottomMenuProps): JSX.Element { - const { deleteNote } = useContext(NotesContext) as NotesContextValue; - const { editMode, fsId, setEditMode, setColor } = useContext( - NoteContext, - ) as NoteContextType; - const [copying, setCopying] = useState(false); - const handleDelete = async () => { - const confirm = window.confirm( - "Are you sure you want to delete this note?", - ); - if (confirm) { - deleteNote(fsId); - } - }; - - const handleCopy: EventHandler = (e) => { - setCopying(true); - editor?.chain().copyToClipboard(); - setTimeout(() => { - setCopying(false); - }, 500); - e.stopPropagation(); - }; - - return ( - // todo: update theme change to css var change - -
- - - - {editMode && ( - <> - - - )} -
- ); -}); - -export default BottomMenu; diff --git a/components/Home/components/Note.tsx b/components/Home/components/Note.tsx deleted file mode 100644 index 4e8bcb6..0000000 --- a/components/Home/components/Note.tsx +++ /dev/null @@ -1,203 +0,0 @@ -import type React from "react"; -import { useRef, useEffect, useState, useContext, createContext } from "react"; -import Tiptap from "./Tiptap"; -import styles from "../styles/note.module.scss"; -import clsx from "clsx"; -import { IoClose } from "react-icons/io5"; -// import { colors } from "../../../utils/common/noteColors"; -import { AnimatePresence, motion } from "framer-motion"; -import type { NoteContextType, NotesContextValue } from "@/types/Note"; -import Button from "@/components/Common/Button"; -import type { CustomStyle } from "@/types/Styles"; -import { NotesContext } from "./NotesList"; -import Backdrop from "./Backdrop"; - -type NoteProps = { - title: string; - content: string; - active: boolean; - fsId: string; - color: string; - setSelectedId: (id: string | null) => void; -}; - -export const NoteContext = createContext( - undefined, -); - -const Note: React.FC = ({ - title: note_title, - content, - active, - fsId, - color: noteColor, - // updateNote, - // deleteNote, - setSelectedId, -}) => { - const { updateNote } = useContext(NotesContext) as NotesContextValue; - const [editMode, setEditMode] = useState(active); - const [title, setTitle] = useState(note_title); - const [color, setColor] = useState( - noteColor ?? "var(--note-bg-dark-4)", - ); - const ref = useRef(null); - const noteRef = useRef(null); - // const [inTransition, setInTransition] = useState(false); - useEffect(() => { - const titleHandler = setTimeout(() => { - if (title !== "" && title !== note_title) { - updateNote(fsId, { - note_title: title, - }); - } - }, 3000); - return () => { - clearTimeout(titleHandler); - }; - }, [fsId, title, note_title, updateNote]); - - useEffect(() => { - if (color !== noteColor) { - updateNote(fsId, { - color: color, - }); - } - }, [noteColor, color, fsId, updateNote]); - - const closeNote = () => { - setEditMode(false); - - setSelectedId(null); - }; - - // useOnClickOutside(noteRef, () => closeNote()); - useEffect(() => { - if (noteRef.current && editMode) noteRef.current.style.zIndex = "3"; - }, [editMode]); - - const handleClick = () => { - if (!editMode) { - setEditMode(true); - setSelectedId(fsId); - } - }; - - // const getColor = (index: number | undefined) => { - // if (index) return colors[index]; - // return isDarkMode ? "var(--color-surface-200)" : "var(--color-primary-200)"; - // }; - - const isNoteDarkThemed = (color: string): boolean => { - return /dark/i.test(color); - }; - // const handleAnimationStart = () => { - // if(noteRef.current && editMode) noteRef.current.style.zIndex = '2' - // } - const handleAnimationComplete = () => { - if (noteRef.current && editMode === false) { - noteRef.current.style.zIndex = "0"; - } - }; - return ( - - - null} - > - {editMode && } - - -
- {(title != "" || editMode) && ( - setTitle(e.target.value)} - /> - )} - {editMode && ( - - )} -
- {/* text editor component */} - -
- - {/* */} - {/* { */} - {/* if (noteRef.current) noteRef.current.scrollIntoView(); */} - {/* setEditMode(flag); */} - {/* }} */} - {/* setColor={setcolor} */} - {/* theme={color ?? 2 < 3 ? "light" : "dark"} */} - {/* /> */} -
-
-
-
- ); -}; - -export default Note; diff --git a/components/Home/components/NotesList.tsx b/components/Home/components/NotesList.tsx deleted file mode 100644 index e461bc9..0000000 --- a/components/Home/components/NotesList.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import type React from "react"; -import { type MouseEventHandler, useState, createContext } from "react" -import Note from "./Note"; -import styles from "../styles/noteslist.module.scss"; -import { IoAddOutline } from "react-icons/io5"; -import { Oval } from "react-loader-spinner"; -import type { DeleteMutation, Note as NoteType, NotesContextValue, UpdateNoteFn } from "@/types/Note"; -import Button from "@/components/Common/Button"; - -export const NotesContext = createContext(undefined); - -type NoteListProps = { - addingNote: boolean; - notes?: NoteType[]; - addNote: MouseEventHandler; - deleteNote: DeleteMutation; - updateNote: UpdateNoteFn; -}; - -const NotesList: React.FC = ({ - addingNote, - addNote, - notes, - updateNote, - deleteNote, -}) => { - const [_, setSelectedId] = useState(null); - return ( - -
- {notes?.map((note) => { - return ( - - ); - })} - - -
-
- ); -}; - -export default NotesList; diff --git a/components/Home/components/Tiptap.tsx b/components/Home/components/Tiptap.tsx deleted file mode 100644 index de0bdc9..0000000 --- a/components/Home/components/Tiptap.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import React, { useState, useEffect, useContext } from "react"; -import { useEditor, EditorContent } from "@tiptap/react"; -import FloatingMenu from "./minorComponents/FloatingMenu"; -import StarterKit from "@tiptap/starter-kit"; -import styles from "../styles/note.module.scss"; -import TaskList from "@tiptap/extension-task-list"; -import TaskItem from "@tiptap/extension-task-item"; -import { Placeholder } from "@tiptap/extension-placeholder"; -import useStore from "../../../hooks/useStore"; -import CustomImageExtension from "./extensions/resizableImage/ImageExtension"; -import CopyToClipboardExtension from "./extensions/CopyToClipboard/CopyToClipboardExtension"; -import { NoteContextType, NotesContextValue } from "@/types/Note"; -import { CustomStyle } from "@/types/Styles"; -import BottomMenu from "./BottomMenu"; -import { NotesContext } from "./NotesList"; -import { NoteContext } from "./Note"; - -type TiptapProps = { - // editMode: boolean; - // content: string; - // fsId: string; - // updateNote: UpdateNoteFn; - style?: CustomStyle; -}; - -const Tiptap: React.FC = ({ style }) => { - // function Tiptap({ style }: TiptapProps) { - const { updateNote } = useContext(NotesContext) as NotesContextValue; - const { editMode, content, fsId } = useContext(NoteContext) as NoteContextType; - const updateSync = useStore((state) => state.updateSync); - const [noteContent, setNoteContent] = useState(content); - const editor = useEditor({ - editorProps: { - attributes: { - class: styles.ProseMirror, - }, - }, - extensions: [ - StarterKit, - TaskList, - TaskItem.configure({ - nested: true, - }), - Placeholder.configure({ - showOnlyWhenEditable: false, - }), - CustomImageExtension, - CopyToClipboardExtension, - ], - editable: false, - content: JSON.parse(noteContent), - onUpdate: ({ editor }) => { - setNoteContent(JSON.stringify(editor.getJSON())); - }, - }); - - useEffect(() => { - if (editor && !editor.isDestroyed) { - if (editMode) { - editor.setEditable(true); - // editor.commands.focus(); - } else { - editor.setEditable(false); - } - } - }, [editMode, editor]); - - // debounce logic to save notes - useEffect(() => { - if (noteContent !== content) updateSync(true); - const handler = setTimeout(() => { - if (editor && !editor.isDestroyed && noteContent !== content) { - const syncNote = async () => { - await updateNote(fsId, { - note_content: JSON.stringify(editor.getJSON()), - }); - }; - syncNote(); - updateSync(false); - } - }, 3000); - return () => { - clearTimeout(handler); - }; - }, [noteContent, content, updateSync, editor, fsId, updateNote]); - - return ( - <> - - - - - ); -}; - -export default Tiptap; diff --git a/components/Home/components/extensions/resizableImage/styles/customimg.module.scss b/components/Home/components/extensions/resizableImage/styles/customimg.module.scss deleted file mode 100644 index f177dc7..0000000 --- a/components/Home/components/extensions/resizableImage/styles/customimg.module.scss +++ /dev/null @@ -1,79 +0,0 @@ -.node_image { - display: flex; - justify-content: center; - height: auto; - width: 100%; - flex-grow: 1; - .controller_wrapper { - position: relative; - display: inline-flex; - img { - position: relative; - max-width: 100%; - max-height: 100%; - &:active { - outline: rgba(126, 126, 255, 0.715) solid 1px; - } - } - .img_ops { - opacity: 0; - position: absolute; - top: 5%; - left: 5%; - button { - border-radius: 100%; - position: relative; - width: 1.5rem; - height: 1.5rem; - background: none; - border: none; - &:hover { - background-color: rgba(93, 93, 93, 0.279); - mix-blend-mode: difference; - } - - svg { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - mix-blend-mode: difference; - } - } - } - .size_control { - opacity: 0; - position: absolute; - top: 50%; - right: 2%; - transform: translate(0, -50%); - - height: 50%; - .cursor { - height: 100%; - width: 0.5rem; - cursor: ew-resize; - border-radius: 30px; - border: none; - background-color: rgba(65, 65, 65, 0.418); - border: 1px rgba(255, 255, 255, 0.589) solid; - :active { - cursor: ew-resize; - } - :focus { - cursor: ew-resize; - } - } - } - &:hover .img_ops, - &:hover .size_control { - opacity: 1; - } - } -} -@media (hover: none) { - .size_control { - /* Styles for hover-able devices */ - display: none; - } -} diff --git a/components/Home/components/minorComponents/CustomOutsideClickHandler.jsx b/components/Home/components/minorComponents/CustomOutsideClickHandler.jsx deleted file mode 100644 index c54fea7..0000000 --- a/components/Home/components/minorComponents/CustomOutsideClickHandler.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import React, { useRef, useEffect } from 'react' -import OutsideClickHandler from 'react-outside-click-handler' -const CustomOutsideClickHandler = ({ children, className, onOutsideClick, refProp }) => { - const ref = useRef(); - useEffect(() => { - ref.current.class = className; - }, [className]) - - return ( - - {children} - - ) -} - -export default CustomOutsideClickHandler \ No newline at end of file diff --git a/components/Home/components/minorComponents/FloatingMenu.tsx b/components/Home/components/minorComponents/FloatingMenu.tsx deleted file mode 100644 index f1e7f50..0000000 --- a/components/Home/components/minorComponents/FloatingMenu.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useCallback } from "react"; -import { Editor, FloatingMenu } from "@tiptap/react"; -import clsx from "clsx"; -import styles from "../../styles/floatmenu.module.scss"; -import { MdFormatListBulleted } from "react-icons/md"; -import { RxHeading } from "react-icons/rx"; -import { BsUiChecks, BsCardImage } from "react-icons/bs"; -import Button from "@/components/Common/Button"; - -type Props = { editor: Editor | null }; - -const CustomFloatingMenu: React.FC = ({ editor }) => { - const addImage = useCallback(() => { - const url = window.prompt("URL"); - if (url && editor) { - editor.chain().focus().setImage({ src: url }).run(); - } - }, [editor]); - - return ( - <> - {editor ? ( - - - - - - - - ) : null} - - ); -}; - -export default CustomFloatingMenu; diff --git a/components/Home/components/minorComponents/Tags.jsx b/components/Home/components/minorComponents/Tags.jsx deleted file mode 100644 index 889a2c1..0000000 --- a/components/Home/components/minorComponents/Tags.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from "react"; -import "../../../../styles/home/tags.scss"; -const Tags = ({ tags = ["books", "coding"] }) => { - return ( -
- {tags.map((tag, i) => { - return
{tag}
; - })} -
- ); -}; - -export default Tags; diff --git a/components/Home/styles/floatmenu.module.scss b/components/Home/styles/floatmenu.module.scss deleted file mode 100644 index d1b11b4..0000000 --- a/components/Home/styles/floatmenu.module.scss +++ /dev/null @@ -1,25 +0,0 @@ -@use "../../../styles/utilities/colors"; -// @use "../../../styles/utilities/bu"; -.float_menu { - background-color: var(--color-surface-300); - border-radius: 10px; - display: flex; - .float_item { - width: 0.5em; - height: 0.5em; - border-radius: unset; - position: relative; - svg { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - &:first-child { - border-radius: 10px 0 0 10px; - } - &:last-child { - border-radius: 0 10px 10px 0; - } - } -} diff --git a/context.md b/context.md new file mode 100644 index 0000000..47a2508 --- /dev/null +++ b/context.md @@ -0,0 +1,61 @@ +# Project Context + +Monorepo for a full-stack note-taking app with a notes feed, rich text editor, and a separate "article" view. + +## Repo layout + +- `apps/api` — Fastify + Kysely backend (`src/routes.ts`, `src/db/*`). +- `apps/web` — Next.js 16 (App/pages hybrid; uses `pages/`), React 18, TypeScript frontend. +- pnpm workspaces (`pnpm --filter web|api ...`). + +## Stack + +- **Frontend:** Next.js 16, React 18, TipTap v2.27, @tanstack/react-query v4, Zustand, Mantine, framer-motion, idb (IndexedDB offline). +- **Backend:** Fastify, @fastify/jwt, Kysely (SQLite/Postgres via `dbClient`). + +## Commands (root) + +- `pnpm dev` / `pnpm build` / `pnpm lint` — web app. +- `pnpm api:dev` / `pnpm api:build` / `pnpm api:start` — API. +- Backend bootstraps `GET /health`; auth via `POST /api/auth/register|login`. + +## Key files (notes feature) + +| Concern | File | +| --- | --- | +| Notes list page | `apps/web/components/Home/index.tsx` | +| Note list + editor mount | `apps/web/components/Home/components/NotesList.tsx`, `Note.tsx` | +| Note state + autosave context | `apps/web/components/Home/components/NoteContext.tsx` | +| TipTap editor (notes) | `apps/web/components/Home/components/Tiptap.tsx` | +| TipTap editor (articles) | `apps/web/components/Article/ArticleTiptap.tsx` | +| Note API client | `apps/web/utils/notesApi.ts`, `apps/web/utils/api.ts` | +| React Query hooks | `apps/web/hooks/useGetNotes.tsx`, `useUpdateNote.tsx`, `useAddNote.tsx`, `useDeleteNote.tsx`, `useGetNote.tsx` | +| Shared types | `apps/web/types/Note.ts` | +| API routes (Fastify) | `apps/api/src/routes.ts` | + +## Notes: load / save data flow + +### Load +`GET /api/notes` → `useGetNotes` (query key `["notes"]`) → `NotesList` → `Note` → +`NoteProvider` (initial state) → `useNoteContext().content` → TipTap `content` prop. + +Notes render content from the **list** endpoint. `useGetNote`/`GET /api/notes/:id` exist but are not wired into the notes UI. + +### Save +TipTap `onUpdate` → context `setContent(next)` → local state + debounced (3s) `saveNote()` → +`useUpdateNote` mutation (`PATCH /api/notes/:id`) → optimistic cache update → `onSuccess` merges the server response back into the `["notes"]` cache. + +- Debounce constant: `DEBOUNCE_TIME_MS = 3000` in `NoteContext.tsx`. +- PATCH **returns the saved note** (server `routes.ts`), which is merged into the cache. + +## Important: save-loop guard (do not regress) + +Editing a note used to trigger the whole flow: editor load → `onUpdate` → save → cache→refetch. +This caused (1) a spurious PATCH on load and (2) a full `GET /api/notes` refetch after every save (from `onSettled` invalidate). + +Current defense (intentional): +1. `NoteContext.tsx` — `lastSavedContentRef` tracks the last server-confirmed content. `setContent` is a no-op if `next === lastSavedContentRef.current`, so re-echoed loaded content never triggers a save. +2. `useUpdateNote.tsx` — **no** `invalidateQueries` after save; the cache is updated via the optimistic `onMutate` + confirmed `onSuccess` merge. Do not restore a blanket `refetch` of `["notes"]` on every save. + +### Editor updates are one-directional +Editor `content` is only read on mount (`useEditor` options are not reactive). There is deliberately **no** `editor.commands.setContent(...)` sync from context back into the editor. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0bf3528 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,62 @@ +services: + api: + build: + context: . + dockerfile: Dockerfile + environment: + - PORT=3000 + - HOST=0.0.0.0 + - NODE_ENV=production + - DATABASE_URL=postgres://donote:${DB_PASSWORD:-donote}@db:5432/donote + - JWT_SECRET=${JWT_SECRET:-change-me-in-production} + - DB_MAX_CONNECTIONS=5 + expose: + - "3000" + depends_on: + db: + condition: service_healthy + restart: unless-stopped + + db: + image: postgres:16-alpine + environment: + - POSTGRES_USER=donote + - POSTGRES_PASSWORD=${DB_PASSWORD:-donote} + - POSTGRES_DB=donote + volumes: + - pgdata:/var/lib/postgresql/data + expose: + - "5432" + ports: + - "5432:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U donote"] + interval: 5s + timeout: 3s + retries: 5 + restart: unless-stopped + # Resource limits to keep costs down on a 4GB VPS + deploy: + resources: + limits: + memory: 512M + + caddy: + build: + context: . + dockerfile: caddy.Dockerfile + restart: unless-stopped + ports: + - "80:80" + - "443:443" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + - caddy_config:/config + depends_on: + - api + +volumes: + pgdata: + caddy_data: + caddy_config: diff --git a/hooks/useAddNote.tsx b/hooks/useAddNote.tsx deleted file mode 100644 index ee28ef5..0000000 --- a/hooks/useAddNote.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { addNote } from "@/utils/supabase/db_operations"; -import type { Note, AddNoteParams, AddNoteMutationParams } from "@/types/Note"; - -const useAddNote = ({ creatorId, successCb, errorCb }: AddNoteMutationParams) => { - const queryClient = useQueryClient(); - const AddNoteMutation = useMutation({ - mutationFn: addNote, - onSuccess: (data: string, variables: AddNoteParams) => { - if (successCb) successCb(); - queryClient.setQueryData(["notes", creatorId], (oldNotes: Note[] | undefined) => { - if (oldNotes) { - return [{ ...variables.newNote, id: data, active: true }, ...oldNotes]; - } - }); - }, - onError: () => { - if (errorCb) errorCb(); - }, - }); - return AddNoteMutation; -}; - -export default useAddNote; diff --git a/hooks/useDeleteNote.tsx b/hooks/useDeleteNote.tsx deleted file mode 100644 index da0d29f..0000000 --- a/hooks/useDeleteNote.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { useMutation, useQueryClient, UseMutationResult } from "@tanstack/react-query"; -import { deleteNote } from "@/utils/supabase/db_operations"; -import { DeleteNoteMutationParams, Note } from "@/types/Note"; - -const useDeleteNote = ({ - creatorId, - successCb, - errorCb, -}: DeleteNoteMutationParams): UseMutationResult => { - const queryClient = useQueryClient(); - - const deleteMutation = useMutation( - (noteId: string) => deleteNote(noteId), - { - // todo: add some check for verifying creatorid before deleting - onSuccess: (_, deletedNoteId) => { - if (successCb) successCb(); - queryClient.setQueryData(["notes", creatorId], (oldNotes) => { - if (oldNotes) return oldNotes.filter((note) => note.id !== deletedNoteId); - return oldNotes; - }); - }, - onError: (error) => { - // console.error("Error deleting note:", error); - if (errorCb) errorCb(); - }, - } - ); - - return deleteMutation; -}; - -export default useDeleteNote; diff --git a/hooks/useSession.tsx b/hooks/useSession.tsx deleted file mode 100644 index e162a80..0000000 --- a/hooks/useSession.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import type { ReactNode } from "react"; -import { createContext, useContext, useEffect, useState } from "react"; - -import { supabase } from "@/utils/supabase/init"; -import { useRouter } from "next/router"; - -interface User { - id?: string; - name?: string; - email?: string; - picture?: string; -} - -type SessionType = { - user: User; - signInWithGoogle: () => void; - signOut: () => void; - error: string | null; - status: string; -}; - -const getURL = () => { - const site_url = - process?.env?.VERCEL_ENV === "preview" - ? process?.env?.NEXT_PUBLIC_PREVIEW_SITE_URL - : process?.env?.NEXT_PUBLIC_SITE_URL; - let url = - site_url ?? // Set this to your site URL in production env. - "http://localhost:3000/"; - // Make sure to include `https://` when not localhost. - url = url.startsWith("http") ? url : `https://${url}`; - // Make sure to include a trailing `/`. - url = url.endsWith("/") ? url : `${url}/`; - return url; -}; - -const signInWithGoogle = () => { - supabase.auth.signInWithOAuth({ - provider: "google", - options: { - redirectTo: "https://do-note.vercel.app/", - }, - }); -}; - -const signOut = () => { - supabase.auth.signOut(); -}; - -const defaultSession = { - user: { - id: "", - name: "", - email: "", - picture: "", - }, - signInWithGoogle, - signOut, - error: null, - status: "loading", -}; - -const SessionContext = createContext(defaultSession); - -export function SessionProvider({ children }: { children: ReactNode }) { - // const [session, setSession] = useState(defaultSession); - const [status, setStatus] = useState("loading"); - const [user, setUser] = useState({ - id: "", - name: "", - email: "", - picture: "", - }); - - const router = useRouter(); - // biome-ignore lint/correctness/useExhaustiveDependencies: need it to run once the component is mounted - useEffect(() => { - const setUserData = (userData: User | void) => { - setUser({ - id: userData?.id ?? "", - name: userData?.name ?? "", - email: userData?.email ?? "", - picture: userData?.picture ?? "", - }); - }; - const getCurrentSession = async () => { - setStatus("loading"); - try { - const { - data: { session }, - error, - } = await supabase.auth.getSession(); - if (session?.user) { - setStatus("authenticated"); - setUserData({ - id: session?.user.id, - name: session?.user.user_metadata.name, - email: session?.user.email, - picture: session?.user.user_metadata.picture, - }); - router.push("/notes"); - } else { - setStatus("unauthenticated"); - setUserData(); - if (error) { - // # todo: add some instruction here - } - router.push("/auth"); - } - } catch (error) { - setStatus("unauthenticated"); - // might wanna logout user - router.push("/auth"); - } - }; - - getCurrentSession(); - - const { data: authListener } = supabase.auth.onAuthStateChange( - async (event, newSession) => { - switch (event) { - case "SIGNED_IN": - setUser({ - id: newSession?.user.id, - name: newSession?.user.user_metadata.name, - email: newSession?.user.email, - picture: newSession?.user.user_metadata.picture, - }); - break; - case "SIGNED_OUT": - setStatus("unauthenticated"); - router.push("/auth"); - break; - default: - break; - } - }, - ); - return () => { - authListener.subscription.unsubscribe(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return ( - - {children} - - ); -} - -export const useSession = () => { - const context = useContext(SessionContext); - - if (!context) { - throw new Error("useSession hook must be used within SessionProvider"); - } - - return context; -}; diff --git a/next.config.mjs b/next.config.mjs deleted file mode 100644 index cb60f0a..0000000 --- a/next.config.mjs +++ /dev/null @@ -1,28 +0,0 @@ -/** @type {import('next').NextConfig} */ -import pwa from "next-pwa"; - -const withPWA = pwa({ - dest: "public", -}) - -const nextConfig = { - reactStrictMode: true, - images: { - remotePatterns: [{ - protocol: 'https', - hostname: 'lh3.googleusercontent.com' - }] - }, - redirects: () => { - return [ - { - source: '/', - destination: '/auth', - permanent: false - }, - ] - }, - turbopack: {} -} - -export default withPWA(nextConfig); diff --git a/package.json b/package.json index 9f99c5c..29ae409 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,14 @@ { - "name": "do-note-ts", - "version": "0.1.0", + "name": "do-note-monorepo", + "version": "1.0.0", "private": true, "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "type": "module", - "dependencies": { - "@floating-ui/react": "^0.19.2", - "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "^2.86.2", - "@tanstack/react-query": "^4.42.0", - "@tanstack/react-query-devtools": "^4.42.0", - "@tiptap/extension-floating-menu": "^2.27.1", - "@tiptap/extension-image": "^2.27.1", - "@tiptap/extension-placeholder": "^2.27.1", - "@tiptap/extension-task-item": "^2.27.1", - "@tiptap/extension-task-list": "^2.27.1", - "@tiptap/react": "^2.27.1", - "@tiptap/starter-kit": "^2.27.1", - "@types/node": "18.15.12", - "@types/react": "18.0.37", - "@types/react-dom": "18.0.11", - "@vercel/analytics": "^1.6.1", - "clsx": "^1.2.1", - "copy-to-clipboard": "^3.3.3", - "framer-motion": "^9.1.7", - "idb": "^7.1.1", - "next": "^16.0.7", - "next-pwa": "^5.6.0", - "react": "18.2.0", - "react-content-loader": "^6.2.1", - "react-dom": "18.2.0", - "react-hot-toast": "^2.6.0", - "react-icons": "^4.12.0", - "react-loader-spinner": "^5.4.5", - "react-toggle": "^4.1.3", - "sass": "^1.94.2", - "use-debounce": "^9.0.4", - "zustand": "^4.5.7" - }, - "devDependencies": { - "@biomejs/biome": "2.3.8", - "@tailwindcss/postcss": "^4.1.18", - "@types/react-toggle": "^4.0.5", - "autoprefixer": "^10.4.23", - "daisyui": "^5.5.14", - "prettier": "2.8.8", - "tailwindcss": "^4.1.18", - "typescript": "^5.9.3" + "dev": "pnpm --filter web dev", + "build": "pnpm --filter web build", + "start": "pnpm --filter web start", + "lint": "pnpm --filter web lint", + "api:dev": "pnpm --filter api dev", + "api:build": "pnpm --filter api build", + "api:start": "pnpm --filter api start" } } diff --git a/pages/_app.tsx b/pages/_app.tsx deleted file mode 100644 index 0f61c2d..0000000 --- a/pages/_app.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import "@/styles/globals.scss"; -import type { AppProps } from "next/app"; -import { Hydrate, QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { useRef } from "react"; -import { Analytics } from "@vercel/analytics/react"; -import Head from "next/head"; -import { SessionProvider } from "@/hooks/useSession"; -import { Toaster } from "react-hot-toast"; - -export default function App({ Component, pageProps }: AppProps) { - const queryClient = useRef( - new QueryClient({ - defaultOptions: { - queries: { - refetchOnWindowFocus: false, // default: true - }, - }, - }) - ); - const descp = - "A lightweight note-taking app that aims to combine the best of Google Keep and Notion"; - return ( - - - - - - - - - - - - - {/*twitter meta tags*/} - - - - - - - - - - - - - - - ); -} diff --git a/pages/index.tsx b/pages/index.tsx deleted file mode 100644 index 9b4ba10..0000000 --- a/pages/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ - -export default function Home() { - return ( - <> - ) -} - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db4300d..4f5c625 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,47 +3,120 @@ lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false + injectWorkspacePackages: true importers: - .: + .: {} + + apps/api: + dependencies: + '@fastify/cors': + specifier: ^11.2.0 + version: 11.2.0 + '@fastify/jwt': + specifier: ^10.2.1 + version: 10.2.1 + bcryptjs: + specifier: ^2.4.3 + version: 2.4.3 + dotenv: + specifier: ^17.4.2 + version: 17.4.2 + drizzle-orm: + specifier: ^0.45.2 + version: 0.45.2(postgres@3.4.9) + drizzle-zod: + specifier: ^0.8.3 + version: 0.8.3(drizzle-orm@0.45.2(postgres@3.4.9))(zod@4.4.3) + fastify: + specifier: ^5.8.5 + version: 5.8.5 + fastify-type-provider-zod: + specifier: ^6.1.0 + version: 6.1.0(@fastify/swagger@9.7.0)(fastify@5.8.5)(openapi-types@12.1.3)(zod@4.4.3) + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.3 + postgres: + specifier: ^3.4.9 + version: 3.4.9 + zod: + specifier: ^4.4.3 + version: 4.4.3 + devDependencies: + '@types/bcryptjs': + specifier: ^2.4.6 + version: 2.4.6 + '@types/jsonwebtoken': + specifier: ^9.0.7 + version: 9.0.10 + '@types/node': + specifier: ^25.6.0 + version: 25.9.1 + drizzle-kit: + specifier: ^0.31.10 + version: 0.31.10 + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + pino-pretty: + specifier: ^13.1.3 + version: 13.1.3 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@25.9.1)(typescript@6.0.3) + tsup: + specifier: ^8.5.1 + version: 8.5.1(postcss@8.4.31)(tsx@4.22.3)(typescript@6.0.3)(yaml@2.9.0) + tsx: + specifier: ^4.22.3 + version: 4.22.3 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + + apps/web: dependencies: '@floating-ui/react': specifier: ^0.19.2 version: 0.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mantine/core': + specifier: ^8.3.10 + version: 8.3.18(@mantine/hooks@8.3.18(react@18.2.0))(@types/react@18.0.37)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mantine/hooks': + specifier: ^8.3.10 + version: 8.3.18(react@18.2.0) '@radix-ui/react-icons': specifier: ^1.3.2 version: 1.3.2(react@18.2.0) - '@supabase/supabase-js': - specifier: ^2.86.2 - version: 2.86.2 '@tanstack/react-query': specifier: ^4.42.0 - version: 4.42.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.44.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/react-query-devtools': specifier: ^4.42.0 - version: 4.42.0(@tanstack/react-query@4.42.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.44.0(@tanstack/react-query@4.44.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tiptap/extension-floating-menu': specifier: ^2.27.1 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) '@tiptap/extension-image': specifier: ^2.27.1 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) '@tiptap/extension-placeholder': specifier: ^2.27.1 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) '@tiptap/extension-task-item': specifier: ^2.27.1 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) '@tiptap/extension-task-list': specifier: ^2.27.1 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) '@tiptap/react': specifier: ^2.27.1 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tiptap/starter-kit': specifier: ^2.27.1 - version: 2.27.1 + version: 2.27.2 '@types/node': specifier: 18.15.12 version: 18.15.12 @@ -53,9 +126,6 @@ importers: '@types/react-dom': specifier: 18.0.11 version: 18.0.11 - '@vercel/analytics': - specifier: ^1.6.1 - version: 1.6.1(next@16.1.1(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.94.2))(react@18.2.0) clsx: specifier: ^1.2.1 version: 1.2.1 @@ -70,37 +140,19 @@ importers: version: 7.1.1 next: specifier: ^16.0.7 - version: 16.1.1(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.94.2) - next-pwa: - specifier: ^5.6.0 - version: 5.6.0(@babel/core@7.28.5)(next@16.1.1(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.94.2))(webpack@5.82.0) + version: 16.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.100.0) react: specifier: 18.2.0 version: 18.2.0 - react-content-loader: - specifier: ^6.2.1 - version: 6.2.1(react@18.2.0) react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) react-hot-toast: specifier: ^2.6.0 version: 2.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-icons: - specifier: ^4.12.0 - version: 4.12.0(react@18.2.0) - react-loader-spinner: - specifier: ^5.4.5 - version: 5.4.5(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-toggle: specifier: ^4.1.3 version: 4.1.3(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - sass: - specifier: ^1.94.2 - version: 1.94.2 - use-debounce: - specifier: ^9.0.4 - version: 9.0.4(react@18.2.0) zustand: specifier: ^4.5.7 version: 4.5.7(@types/react@18.0.37)(react@18.2.0) @@ -108,620 +160,728 @@ importers: '@biomejs/biome': specifier: 2.3.8 version: 2.3.8 - '@tailwindcss/postcss': - specifier: ^4.1.18 - version: 4.1.18 - '@types/react-toggle': - specifier: ^4.0.5 - version: 4.0.5 - autoprefixer: - specifier: ^10.4.23 - version: 10.4.23(postcss@8.5.6) - daisyui: - specifier: ^5.5.14 - version: 5.5.14 prettier: specifier: 2.8.8 version: 2.8.8 - tailwindcss: - specifier: ^4.1.18 - version: 4.1.18 typescript: specifier: ^5.9.3 version: 5.9.3 packages: - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@apideck/better-ajv-errors@0.3.6': - resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} - engines: {node: '>=10'} - peerDependencies: - ajv: '>=8' - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} - engines: {node: '>=6.9.0'} + '@biomejs/biome@2.3.8': + resolution: {integrity: sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==} + engines: {node: '>=14.21.3'} + hasBin: true - '@babel/core@7.28.5': - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} - engines: {node: '>=6.9.0'} + '@biomejs/cli-darwin-arm64@2.3.8': + resolution: {integrity: sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} - engines: {node: '>=6.9.0'} + '@biomejs/cli-darwin-x64@2.3.8': + resolution: {integrity: sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} + '@biomejs/cli-linux-arm64-musl@2.3.8': + resolution: {integrity: sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} + '@biomejs/cli-linux-arm64@2.3.8': + resolution: {integrity: sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] - '@babel/helper-create-class-features-plugin@7.28.5': - resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@biomejs/cli-linux-x64-musl@2.3.8': + resolution: {integrity: sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@biomejs/cli-linux-x64@2.3.8': + resolution: {integrity: sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@biomejs/cli-win32-arm64@2.3.8': + resolution: {integrity: sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} + '@biomejs/cli-win32-x64@2.3.8': + resolution: {integrity: sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.hirok.io' - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.hirok.io' - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - '@babel/helper-wrap-function@7.28.3': - resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} - engines: {node: '>=6.9.0'} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} - engines: {node: '>=6.0.0'} - hasBin: true + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': - resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@babel/plugin-transform-block-scoping@7.28.5': - resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@babel/plugin-transform-class-static-block@7.28.3': - resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - '@babel/plugin-transform-classes@7.28.4': - resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@babel/plugin-transform-explicit-resource-management@7.28.0': - resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - '@babel/plugin-transform-exponentiation-operator@7.28.5': - resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@babel/plugin-transform-logical-assignment-operators@7.28.5': - resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - '@babel/plugin-transform-object-rest-spread@7.28.4': - resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@babel/plugin-transform-optional-chaining@7.28.5': - resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] - '@babel/plugin-transform-regenerator@7.28.4': - resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] - '@babel/preset-env@7.28.5': - resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} - engines: {node: '>=6.9.0'} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} - engines: {node: '>=6.9.0'} + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - '@biomejs/biome@2.3.8': - resolution: {integrity: sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==} - engines: {node: '>=14.21.3'} - hasBin: true + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - '@biomejs/cli-darwin-arm64@2.3.8': - resolution: {integrity: sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==} - engines: {node: '>=14.21.3'} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} cpu: [arm64] - os: [darwin] + os: [openbsd] - '@biomejs/cli-darwin-x64@2.3.8': - resolution: {integrity: sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==} - engines: {node: '>=14.21.3'} + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} cpu: [x64] - os: [darwin] + os: [openbsd] - '@biomejs/cli-linux-arm64-musl@2.3.8': - resolution: {integrity: sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==} - engines: {node: '>=14.21.3'} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} cpu: [arm64] - os: [linux] + os: [openharmony] - '@biomejs/cli-linux-arm64@2.3.8': - resolution: {integrity: sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==} - engines: {node: '>=14.21.3'} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} cpu: [arm64] - os: [linux] + os: [openharmony] - '@biomejs/cli-linux-x64-musl@2.3.8': - resolution: {integrity: sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==} - engines: {node: '>=14.21.3'} + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} cpu: [x64] - os: [linux] + os: [sunos] - '@biomejs/cli-linux-x64@2.3.8': - resolution: {integrity: sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==} - engines: {node: '>=14.21.3'} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] - os: [linux] + os: [sunos] - '@biomejs/cli-win32-arm64@2.3.8': - resolution: {integrity: sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==} - engines: {node: '>=14.21.3'} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.8': - resolution: {integrity: sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==} - engines: {node: '>=14.21.3'} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} cpu: [x64] os: [win32] - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@emotion/is-prop-valid@0.8.8': - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@emotion/is-prop-valid@1.4.0': - resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@emotion/memoize@0.7.4': - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + '@fastify/ajv-compiler@4.0.5': + resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} + + '@fastify/cors@11.2.0': + resolution: {integrity: sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==} + + '@fastify/error@4.2.0': + resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} + + '@fastify/fast-json-stringify-compiler@5.0.3': + resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} - '@emotion/memoize@0.9.0': - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@fastify/forwarded@3.0.1': + resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==} - '@emotion/stylis@0.8.5': - resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + '@fastify/jwt@10.2.1': + resolution: {integrity: sha512-8FHalB082a6HFj+neP9TdJZrUa65Aq6mtozVjd3vH3Yy7hmjRJUDKLPdxYRYF9S077JeN9RgimsautqnijbDlQ==} - '@emotion/unitless@0.7.5': - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + '@fastify/merge-json-schemas@0.2.1': + resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} - '@floating-ui/core@1.7.3': - resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + '@fastify/proxy-addr@5.1.0': + resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} - '@floating-ui/dom@1.7.4': - resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + '@fastify/swagger@9.7.0': + resolution: {integrity: sha512-Vp1SC1GC2Hrkd3faFILv86BzUNyFz5N4/xdExqtCgkGASOzn/x+eMe4qXIGq7cdT6wif/P/oa6r1Ruqx19paZA==} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} '@floating-ui/react-dom@1.3.0': resolution: {integrity: sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==} @@ -729,17 +889,29 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + '@floating-ui/react@0.19.2': resolution: {integrity: sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/react@0.27.19': + resolution: {integrity: sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.34.5': @@ -875,178 +1047,174 @@ packages: cpu: [x64] os: [win32] - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@next/env@16.1.1': - resolution: {integrity: sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} - '@next/swc-darwin-arm64@16.1.1': - resolution: {integrity: sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==} + '@mantine/core@8.3.18': + resolution: {integrity: sha512-9tph1lTVogKPjTx02eUxDUOdXacPzK62UuSqb4TdGliI54/Xgxftq0Dfqu6XuhCxn9J5MDJaNiLDvL/1KRkYqA==} + peerDependencies: + '@mantine/hooks': 8.3.18 + react: ^18.x || ^19.x + react-dom: ^18.x || ^19.x + + '@mantine/hooks@8.3.18': + resolution: {integrity: sha512-QoWr9+S8gg5050TQ06aTSxtlpGjYOpIllRbjYYXlRvZeTsUqiTbVfvQROLexu4rEaK+yy9Wwriwl9PMRgbLqPw==} + peerDependencies: + react: ^18.x || ^19.x + + '@next/env@16.2.6': + resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} + + '@next/swc-darwin-arm64@16.2.6': + resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.1.1': - resolution: {integrity: sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==} + '@next/swc-darwin-x64@16.2.6': + resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.1.1': - resolution: {integrity: sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==} + '@next/swc-linux-arm64-gnu@16.2.6': + resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.1.1': - resolution: {integrity: sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==} + '@next/swc-linux-arm64-musl@16.2.6': + resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.1.1': - resolution: {integrity: sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==} + '@next/swc-linux-x64-gnu@16.2.6': + resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.1.1': - resolution: {integrity: sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==} + '@next/swc-linux-x64-musl@16.2.6': + resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.1.1': - resolution: {integrity: sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==} + '@next/swc-win32-arm64-msvc@16.2.6': + resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.1': - resolution: {integrity: sha512-Ncwbw2WJ57Al5OX0k4chM68DKhEPlrXBaSXDCi2kPi5f4d8b3ejr3RRJGfKBLrn2YJL5ezNS7w2TZLHSti8CMw==} + '@next/swc-win32-x64-msvc@16.2.6': + resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -1058,168 +1226,150 @@ packages: '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} - '@rollup/plugin-babel@5.3.1': - resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} - engines: {node: '>= 10.0.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - '@types/babel__core': - optional: true - - '@rollup/plugin-node-resolve@11.2.1': - resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} - engines: {node: '>= 10.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - '@rollup/plugin-replace@2.4.2': - resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - - '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - '@supabase/auth-js@2.86.2': - resolution: {integrity: sha512-7k8IAhgSnZuD9Zex2+ohHKY3aWGDd4ls0xlxMGl3/jPyHSSXrIYfmtJyUH0+DPd4B3psBqHC0Ev0/nZEHdW58w==} - engines: {node: '>=20.0.0'} - - '@supabase/functions-js@2.86.2': - resolution: {integrity: sha512-OLpy3NIlj7q3yGMFwUpPkDPJbRx4aU+u73SiXqiMnA5ARwzVcOReSzI2u4oOqioE+3ud0fRx7sRsfoklBwYOmg==} - engines: {node: '>=20.0.0'} - - '@supabase/postgrest-js@2.86.2': - resolution: {integrity: sha512-KVgOF2QASvUfQnzMGAmxR7f3ZF/eZ8PFp2F5Q7SAPQlmB83FEaZ7C/QMzfVXXqkMbotfh96xcaBNSKnxowFObA==} - engines: {node: '>=20.0.0'} - - '@supabase/realtime-js@2.86.2': - resolution: {integrity: sha512-uLUYrOMeK1qXHISxdMFVfBs0sGV5PmqYewIHvLBnMYbb//LERojxfKlVSJBgZ+aAwxANmtQKcprjGZI7DJ6lNQ==} - engines: {node: '>=20.0.0'} - - '@supabase/storage-js@2.86.2': - resolution: {integrity: sha512-zyR4PkO7R4f4/xRBVJho3Dm7y4512BoCqGmD7LjNV2GVtWt8vEmambiuMB2Ty3l76mqw+ynQyHY8yFWSERrHXA==} - engines: {node: '>=20.0.0'} - - '@supabase/supabase-js@2.86.2': - resolution: {integrity: sha512-KXoiqFf7zZhL/+lj7oBFFUvVDQ6gy03v9wQ5E++f7xiJUuqmI4DuBhrv8uFo6B2EGTQTA3vkXjbxmYIug/zfWw==} - engines: {node: '>=20.0.0'} - - '@surma/rollup-plugin-off-main-thread@2.2.3': - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} - - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - - '@tailwindcss/node@4.1.18': - resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + '@rollup/rollup-android-arm-eabi@4.61.0': + resolution: {integrity: sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ==} + cpu: [arm] + os: [android] - '@tailwindcss/oxide-android-arm64@4.1.18': - resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} - engines: {node: '>= 10'} + '@rollup/rollup-android-arm64@4.61.0': + resolution: {integrity: sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg==} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.18': - resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} - engines: {node: '>= 10'} + '@rollup/rollup-darwin-arm64@4.61.0': + resolution: {integrity: sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w==} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.18': - resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} - engines: {node: '>= 10'} + '@rollup/rollup-darwin-x64@4.61.0': + resolution: {integrity: sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg==} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.18': - resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} - engines: {node: '>= 10'} + '@rollup/rollup-freebsd-arm64@4.61.0': + resolution: {integrity: sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.61.0': + resolution: {integrity: sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q==} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': - resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + resolution: {integrity: sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g==} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': - resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + resolution: {integrity: sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.61.0': + resolution: {integrity: sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q==} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': - resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm64-musl@4.61.0': + resolution: {integrity: sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw==} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': - resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-loong64-gnu@4.61.0': + resolution: {integrity: sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.61.0': + resolution: {integrity: sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + resolution: {integrity: sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.61.0': + resolution: {integrity: sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + resolution: {integrity: sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.61.0': + resolution: {integrity: sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.61.0': + resolution: {integrity: sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.61.0': + resolution: {integrity: sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA==} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.18': - resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-x64-musl@4.61.0': + resolution: {integrity: sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw==} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.18': - resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': - resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} - engines: {node: '>= 10'} + '@rollup/rollup-openbsd-x64@4.61.0': + resolution: {integrity: sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.61.0': + resolution: {integrity: sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.61.0': + resolution: {integrity: sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg==} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': - resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} - engines: {node: '>= 10'} + '@rollup/rollup-win32-ia32-msvc@4.61.0': + resolution: {integrity: sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.61.0': + resolution: {integrity: sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ==} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.18': - resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} - engines: {node: '>= 10'} + '@rollup/rollup-win32-x64-msvc@4.61.0': + resolution: {integrity: sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw==} + cpu: [x64] + os: [win32] - '@tailwindcss/postcss@4.1.18': - resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@tanstack/match-sorter-utils@8.19.4': resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@4.41.0': - resolution: {integrity: sha512-193R4Jp9hjvlij6LryxrB5Mpbffd2L9PeWh3KlIy/hJV4SkBOfiQZ+jc5qAZLDCrdbkA5FjGj+UoDYw6TcNnyA==} + '@tanstack/query-core@4.44.0': + resolution: {integrity: sha512-swSgb7OiPRR3UuIL7NuDrZNSMGmQD+wdtHxPD7j60SvBEnxbXurl5XOirtGEX2gm2hbK6mC8kMV1I+uO3l0UOw==} - '@tanstack/react-query-devtools@4.42.0': - resolution: {integrity: sha512-N35fQ+tayyyNhKfkyH5OJdJL5eBx5S8lsyagtJre8rxtkyEjyQSEGyF+Xusao8LiqbYsi1ZMQgC7+e3zrwH3Kw==} + '@tanstack/react-query-devtools@4.44.0': + resolution: {integrity: sha512-ld07jweiS0/5iy8tITRbBsrj4jRcnU2/6tLPt9uHc9x3pvXWonTujmSPEoJ8pkDO4xtzHQl+N6dLiyZjvRKxJw==} peerDependencies: - '@tanstack/react-query': ^4.42.0 + '@tanstack/react-query': ^4.44.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/react-query@4.42.0': - resolution: {integrity: sha512-j0tiofkzE3CSrYKmVRaKuwGgvCE+P2OOEDlhmfjeZf5ufcuFHwYwwgw3j08n4WYPVZ+OpsHblcFYezhKA3jDwg==} + '@tanstack/react-query@4.44.0': + resolution: {integrity: sha512-RuIqHYrS98LrK/8kJJOJMMSQ/BCpojwsXDh7p0fBmp38ZOz6dlk+uyFRRusH+V+t3POoCsDOQ2zhomEYOeReXw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1230,176 +1380,179 @@ packages: react-native: optional: true - '@tiptap/core@2.27.1': - resolution: {integrity: sha512-nkerkl8syHj44ZzAB7oA2GPmmZINKBKCa79FuNvmGJrJ4qyZwlkDzszud23YteFZEytbc87kVd/fP76ROS6sLg==} + '@tiptap/core@2.27.2': + resolution: {integrity: sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==} peerDependencies: '@tiptap/pm': ^2.7.0 - '@tiptap/extension-blockquote@2.27.1': - resolution: {integrity: sha512-QrUX3muElDrNjKM3nqCSAtm3H3pT33c6ON8kwRiQboOAjT/9D57Cs7XEVY7r6rMaJPeKztrRUrNVF9w/w/6B0A==} + '@tiptap/extension-blockquote@2.27.2': + resolution: {integrity: sha512-oIGZgiAeA4tG3YxbTDfrmENL4/CIwGuP3THtHsNhwRqwsl9SfMk58Ucopi2GXTQSdYXpRJ0ahE6nPqB5D6j/Zw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bold@2.27.1': - resolution: {integrity: sha512-g4l4p892x/r7mhea8syp3fNYODxsDrimgouQ+q4DKXIgQmm5+uNhyuEPexP3I8TFNXqQ4DlMNFoM9yCqk97etQ==} + '@tiptap/extension-bold@2.27.2': + resolution: {integrity: sha512-bR7J5IwjCGQ0s3CIxyMvOCnMFMzIvsc5OVZKscTN5UkXzFsaY6muUAIqtKxayBUucjtUskm5qZowJITCeCb1/A==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bubble-menu@2.27.1': - resolution: {integrity: sha512-ki1R27VsSvY2tT9Q2DIlcATwLOoEjf5DsN+5sExarQ8S/ZxT/tvIjRxB8Dx7lb2a818W5f/NER26YchGtmHfpg==} + '@tiptap/extension-bubble-menu@2.27.2': + resolution: {integrity: sha512-VkwlCOcr0abTBGzjPXklJ92FCowG7InU8+Od9FyApdLNmn0utRYGRhw0Zno6VgE9EYr1JY4BRnuSa5f9wlR72w==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-bullet-list@2.27.1': - resolution: {integrity: sha512-5FmnfXkJ76wN4EbJNzBhAlmQxho8yEMIJLchTGmXdsD/n/tsyVVtewnQYaIOj/Z7naaGySTGDmjVtLgTuQ+Sxw==} + '@tiptap/extension-bullet-list@2.27.2': + resolution: {integrity: sha512-gmFuKi97u5f8uFc/GQs+zmezjiulZmFiDYTh3trVoLRoc2SAHOjGEB7qxdx7dsqmMN7gwiAWAEVurLKIi1lnnw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-code-block@2.27.1': - resolution: {integrity: sha512-wCI5VIOfSAdkenCWFvh4m8FFCJ51EOK+CUmOC/PWUjyo2Dgn8QC8HMi015q8XF7886T0KvYVVoqxmxJSUDAYNg==} + '@tiptap/extension-code-block@2.27.2': + resolution: {integrity: sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code@2.27.1': - resolution: {integrity: sha512-i65wUGJevzBTIIUBHBc1ggVa27bgemvGl/tY1/89fEuS/0Xmre+OQjw8rCtSLevoHSiYYLgLRlvjtUSUhE4kgg==} + '@tiptap/extension-code@2.27.2': + resolution: {integrity: sha512-7X9AgwqiIGXoZX7uvdHQsGsjILnN/JaEVtqfXZnPECzKGaWHeK/Ao4sYvIIIffsyZJA8k5DC7ny2/0sAgr2TuA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-document@2.27.1': - resolution: {integrity: sha512-NtJzJY7Q/6XWjpOm5OXKrnEaofrcc1XOTYlo/SaTwl8k2bZo918Vl0IDBWhPVDsUN7kx767uHwbtuQZ+9I82hA==} + '@tiptap/extension-document@2.27.2': + resolution: {integrity: sha512-CFhAYsPnyYnosDC4639sCJnBUnYH4Cat9qH5NZWHVvdgtDwu8GZgZn2eSzaKSYXWH1vJ9DSlCK+7UyC3SNXIBA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-dropcursor@2.27.1': - resolution: {integrity: sha512-3MBQRGHHZ0by3OT0CWbLKS7J3PH9PpobrXjmIR7kr0nde7+bHqxXiVNuuIf501oKU9rnEUSedipSHkLYGkmfsA==} + '@tiptap/extension-dropcursor@2.27.2': + resolution: {integrity: sha512-oEu/OrktNoQXq1x29NnH/GOIzQZm8ieTQl3FK27nxfBPA89cNoH4mFEUmBL5/OFIENIjiYG3qWpg6voIqzswNw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-floating-menu@2.27.1': - resolution: {integrity: sha512-nUk/8DbiXO69l6FDwkWso94BTf52IBoWALo+YGWT6o+FO6cI9LbUGghEX2CdmQYXCvSvwvISF2jXeLQWNZvPZQ==} + '@tiptap/extension-floating-menu@2.27.2': + resolution: {integrity: sha512-GUN6gPIGXS7ngRJOwdSmtBRBDt9Kt9CM/9pSwKebhLJ+honFoNA+Y6IpVyDvvDMdVNgBchiJLs6qA5H97gAePQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-gapcursor@2.27.1': - resolution: {integrity: sha512-A9e1jr+jGhDWzNSXtIO6PYVYhf5j/udjbZwMja+wCE/3KvZU9V3IrnGKz1xNW+2Q2BDOe1QO7j5uVL9ElR6nTA==} + '@tiptap/extension-gapcursor@2.27.2': + resolution: {integrity: sha512-/c9VF1HBxj+AP54XGVgCmD9bEGYc5w5OofYCFQgM7l7PB1J00A4vOke0oPkHJnqnOOyPlFaxO/7N6l3XwFcnKA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-hard-break@2.27.1': - resolution: {integrity: sha512-W4hHa4Io6QCTwpyTlN6UAvqMIQ7t56kIUByZhyY9EWrg/+JpbfpxE1kXFLPB4ZGgwBknFOw+e4bJ1j3oAbTJFw==} + '@tiptap/extension-hard-break@2.27.2': + resolution: {integrity: sha512-kSRVGKlCYK6AGR0h8xRkk0WOFGXHIIndod3GKgWU49APuIGDiXd8sziXsSlniUsWmqgDmDXcNnSzPcV7AQ8YNg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-heading@2.27.1': - resolution: {integrity: sha512-6xoC7igZlW1EmnQ5WVH9IL7P1nCQb3bBUaIDLvk7LbweEogcTUECI4Xg1vxMOVmj9tlDe1I4BsgfcKpB5KEsZw==} + '@tiptap/extension-heading@2.27.2': + resolution: {integrity: sha512-iM3yeRWuuQR/IRQ1djwNooJGfn9Jts9zF43qZIUf+U2NY8IlvdNsk2wTOdBgh6E0CamrStPxYGuln3ZS4fuglw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-history@2.27.1': - resolution: {integrity: sha512-K8PHC9gegSAt0wzSlsd4aUpoEyIJYOmVVeyniHr1P1mIblW1KYEDbRGbDlrLALTyUEfMcBhdIm8zrB9X2Nihvg==} + '@tiptap/extension-history@2.27.2': + resolution: {integrity: sha512-+hSyqERoFNTWPiZx4/FCyZ/0eFqB9fuMdTB4AC/q9iwu3RNWAQtlsJg5230bf/qmyO6bZxRUc0k8p4hrV6ybAw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-horizontal-rule@2.27.1': - resolution: {integrity: sha512-WxXWGEEsqDmGIF2o9av+3r9Qje4CKrqrpeQY6aRO5bxvWX9AabQCfasepayBok6uwtvNzh3Xpsn9zbbSk09dNA==} + '@tiptap/extension-horizontal-rule@2.27.2': + resolution: {integrity: sha512-WGWUSgX+jCsbtf9Y9OCUUgRZYuwjVoieW5n6mAUohJ9/6gc6sGIOrUpBShf+HHo6WD+gtQjRd+PssmX3NPWMpg==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-image@2.27.1': - resolution: {integrity: sha512-wu3vMKDYWJwKS6Hrw5PPCKBO2RxyHNeFLiA/uDErEV7axzNpievK/U9DyaDXmtK3K/h1XzJAJz19X+2d/pY68w==} + '@tiptap/extension-image@2.27.2': + resolution: {integrity: sha512-5zL/BY41FIt72azVrCrv3n+2YJ/JyO8wxCcA4Dk1eXIobcgVyIdo4rG39gCqIOiqziAsqnqoj12QHTBtHsJ6mQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-italic@2.27.1': - resolution: {integrity: sha512-rcm0GyniWW0UhcNI9+1eIK64GqWQLyIIrWGINslvqSUoBc+WkfocLvv4CMpRkzKlfsAxwVIBuH2eLxHKDtAREA==} + '@tiptap/extension-italic@2.27.2': + resolution: {integrity: sha512-1OFsw2SZqfaqx5Fa5v90iNlPRcqyt+lVSjBwTDzuPxTPFY4Q0mL89mKgkq2gVHYNCiaRkXvFLDxaSvBWbmthgg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-list-item@2.27.1': - resolution: {integrity: sha512-dtsxvtzxfwOJP6dKGf0vb2MJAoDF2NxoiWzpq0XTvo7NGGYUHfuHjX07Zp0dYqb4seaDXjwsi5BIQUOp3+WMFQ==} + '@tiptap/extension-list-item@2.27.2': + resolution: {integrity: sha512-eJNee7IEGXMnmygM5SdMGDC8m/lMWmwNGf9fPCK6xk0NxuQRgmZHL6uApKcdH6gyNcRPHCqvTTkhEP7pbny/fg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-ordered-list@2.27.1': - resolution: {integrity: sha512-U1/sWxc2TciozQsZjH35temyidYUjvroHj3PUPzPyh19w2fwKh1NSbFybWuoYs6jS3XnMSwnM2vF52tOwvfEmA==} + '@tiptap/extension-ordered-list@2.27.2': + resolution: {integrity: sha512-M7A4tLGJcLPYdLC4CI2Gwl8LOrENQW59u3cMVa+KkwG1hzSJyPsbDpa1DI6oXPC2WtYiTf22zrbq3gVvH+KA2w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-paragraph@2.27.1': - resolution: {integrity: sha512-R3QdrHcUdFAsdsn2UAIvhY0yWyHjqGyP/Rv8RRdN0OyFiTKtwTPqreKMHKJOflgX4sMJl/OpHTpNG1Kaf7Lo2A==} + '@tiptap/extension-paragraph@2.27.2': + resolution: {integrity: sha512-elYVn2wHJJ+zB9LESENWOAfI4TNT0jqEN34sMA/hCtA4im1ZG2DdLHwkHIshj/c4H0dzQhmsS/YmNC5Vbqab/A==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-placeholder@2.27.1': - resolution: {integrity: sha512-UbXaibHHFE+lOTlw/vs3jPzBoj1sAfbXuTAhXChjgYIcTTY5Cr6yxwcymLcimbQ79gf04Xkua2FCN3YsJxIFmw==} + '@tiptap/extension-placeholder@2.27.2': + resolution: {integrity: sha512-IjsgSVYJRjpAKmIoapU0E2R4E2FPY3kpvU7/1i7PUYisylqejSJxmtJPGYw0FOMQY9oxnEEvfZHMBA610tqKpg==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-strike@2.27.1': - resolution: {integrity: sha512-S9I//K8KPgfFTC5I5lorClzXk0g4lrAv9y5qHzHO5EOWt7AFl0YTg2oN8NKSIBK4bHRnPIrjJJKv+dDFnUp5jQ==} + '@tiptap/extension-strike@2.27.2': + resolution: {integrity: sha512-HHIjhafLhS2lHgfAsCwC1okqMsQzR4/mkGDm4M583Yftyjri1TNA7lzhzXWRFWiiMfJxKtdjHjUAQaHuteRTZw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-task-item@2.27.1': - resolution: {integrity: sha512-vaEtdos+9jApD6yRfD6F/xShikiZFHi7I0nswAmGKT/kE1wmHCUxme8OFMe7642e2OK0lqgHsUaOLxP/0nZJ5A==} + '@tiptap/extension-task-item@2.27.2': + resolution: {integrity: sha512-ZBSqj/dygB/Rp5K9qOxRVwASTZCmKVoTq8C59KvMgD/aFjJxhq/w2dZaWkCUEXEep+NmvJqo0kfeAEMY5UDnGg==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-task-list@2.27.1': - resolution: {integrity: sha512-KRlYOZ6kdURvAspUrLVsC7mLkVW2DYhpj+7QxH7gVDZuAuoPUEmpJVcBVPq7GhPF9PccaRLru+n1Ege5VqvZ+Q==} + '@tiptap/extension-task-list@2.27.2': + resolution: {integrity: sha512-5nupAewdzZ9F3599oAcaK0WkDH04wdACAVBPM4zG7InlIpkbho3txB7zWmm64OxfhCMIMGKiXY1q0bw9i0QBGQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-style@2.27.1': - resolution: {integrity: sha512-NagQ9qLk0Ril83gfrk+C65SvTqPjL3WVnLF2arsEVnCrxcx3uDOvdJW67f/K5HEwEHsoqJ4Zq9Irco/koXrOXA==} + '@tiptap/extension-text-style@2.27.2': + resolution: {integrity: sha512-Omk+uxjJLyEY69KStpCw5fA9asvV+MGcAX2HOxyISDFoLaL49TMrNjhGAuz09P1L1b0KGXo4ml7Q3v/Lfy4WPA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text@2.27.1': - resolution: {integrity: sha512-a4GCT+GZ9tUwl82F4CEum9/+WsuW0/De9Be/NqrMmi7eNfAwbUTbLCTFU0gEvv25WMHCoUzaeNk/qGmzeVPJ1Q==} + '@tiptap/extension-text@2.27.2': + resolution: {integrity: sha512-Xk7nYcigljAY0GO9hAQpZ65ZCxqOqaAlTPDFcKerXmlkQZP/8ndx95OgUb1Xf63kmPOh3xypurGS2is3v0MXSA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/pm@2.27.1': - resolution: {integrity: sha512-ijKo3+kIjALthYsnBmkRXAuw2Tswd9gd7BUR5OMfIcjGp8v576vKxOxrRfuYiUM78GPt//P0sVc1WV82H5N0PQ==} + '@tiptap/pm@2.27.2': + resolution: {integrity: sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==} - '@tiptap/react@2.27.1': - resolution: {integrity: sha512-leJximSjYJuhLJQv9azOP9R7w6zuxVgKOHYT4w83Gte7GhWMpNL6xRWzld280vyq/YW/cSYjPb/8ESEOgKNBdQ==} + '@tiptap/react@2.27.2': + resolution: {integrity: sha512-0EAs8Cpkfbvben1PZ34JN2Nd79Dhioynm2jML27DBbf1VWPk+FFWFGTMLUT0bu+Np5iVxio8fqV9t0mc4D6thA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@2.27.1': - resolution: {integrity: sha512-uQQlP0Nmn9eq19qm8YoOeloEfmcGbPpB1cujq54Q6nPgxaBozR7rE7tXbFTinxRW2+Hr7XyNWhpjB7DMNkdU2Q==} + '@tiptap/starter-kit@2.27.2': + resolution: {integrity: sha512-bb0gJvPoDuyRUQ/iuN52j1//EtWWttw+RXAv1uJxfR0uKf8X7uAqzaOOgwjknoCIDC97+1YHwpGdnRjpDkOBxw==} - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/bcryptjs@2.4.6': + resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -1410,15 +1563,14 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/minimatch@6.0.0': - resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} - deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/node@18.15.12': resolution: {integrity: sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg==} - '@types/phoenix@1.6.6': - resolution: {integrity: sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==} + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -1426,138 +1578,47 @@ packages: '@types/react-dom@18.0.11': resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} - '@types/react-toggle@4.0.5': - resolution: {integrity: sha512-MHHEDe7GnF/EhLtI5sT70Dqab8rwlgjRZtu/u6gmfbYd+HeYxWiUSRog16+1BCfkz7Wy2VU6+TPU2oCsDtqDzA==} - '@types/react@18.0.37': resolution: {integrity: sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==} - '@types/resolve@1.17.1': - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - '@types/scheduler@0.26.0': resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - '@vercel/analytics@1.6.1': - resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} - peerDependencies: - '@remix-run/react': ^2 - '@sveltejs/kit': ^1 || ^2 - next: '>= 13' - react: ^18 || ^19 || ^19.0.0-rc - svelte: '>= 4' - vue: ^3 - vue-router: ^4 - peerDependenciesMeta: - '@remix-run/react': - optional: true - '@sveltejs/kit': - optional: true - next: - optional: true - react: - optional: true - svelte: - optional: true - vue: - optional: true - vue-router: - optional: true - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - deprecated: package has been renamed to acorn-import-attributes - peerDependencies: - acorn: ^8 + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1566,145 +1627,77 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + avvio@9.2.0: + resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} - autoprefixer@10.4.23: - resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} - engines: {node: ^10 || ^12 || >=14} + baseline-browser-mapping@2.10.32: + resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} + engines: {node: '>=6.0.0'} hasBin: true - peerDependencies: - postcss: ^8.1.0 - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + bcryptjs@2.4.3: + resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} - babel-loader@8.4.1: - resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-styled-components@2.1.4: - resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} - peerDependencies: - styled-components: '>= 2' - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - baseline-browser-mapping@2.9.4: - resolution: {integrity: sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==} - hasBin: true - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + bn.js@4.12.5: + resolution: {integrity: sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' - camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} - caniuse-lite@1.0.30001759: - resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} - caniuse-lite@1.0.30001761: - resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clean-webpack-plugin@4.0.0: - resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==} - engines: {node: '>=10.0.0'} - peerDependencies: - webpack: '>=4.0.0 <6.0.0' - client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -1712,21 +1705,27 @@ packages: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} @@ -1735,40 +1734,17 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - core-js-compat@3.47.0: - resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - - css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - - css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - daisyui@5.5.14: - resolution: {integrity: sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg==} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -1779,158 +1755,235 @@ packages: supports-color: optional: true - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - del@4.1.1: - resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + drizzle-kit@0.31.10: + resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==} hasBin: true - electron-to-chromium@1.5.266: - resolution: {integrity: sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==} + drizzle-orm@0.45.2: + resolution: {integrity: sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1.13' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@upstash/redis': '>=1.34.7' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@upstash/redis': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + drizzle-zod@0.8.3: + resolution: {integrity: sha512-66yVOuvGhKJnTdiqj1/Xaaz9/qzOdRJADpDa68enqS6g3t0kpNkwNYjUuaeXgZfO/UWuIM9HIhSlJ6C5ZraMww==} + peerDependencies: + drizzle-orm: '>=0.36.0' + zod: ^3.25.0 || ^4.0.0 - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + fast-copy@4.0.3: + resolution: {integrity: sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==} - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stringify@6.4.0: + resolution: {integrity: sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ==} + + fast-jwt@6.3.2: + resolution: {integrity: sha512-JTQImpkXVvj+eq7tJImtsHRt1K6ngloEzIx62Qbf9x4tEM2P2EqGpYJSeUoPf/kMn78rImSHfhf08KShR8PauA==} + engines: {node: '>=20'} - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + + fastfall@1.5.1: + resolution: {integrity: sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==} engines: {node: '>=0.10.0'} - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + fastify-plugin@5.1.0: + resolution: {integrity: sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fastify-plugin@6.0.0: + resolution: {integrity: sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==} + + fastify-type-provider-zod@6.1.0: + resolution: {integrity: sha512-Sl19VZFSX4W/+AFl3hkL5YgWk3eDXZ4XYOdrq94HunK+o7GQBCAqgk7+3gPXoWkF0bNxOiIgfnFGJJ3i9a2BtQ==} + peerDependencies: + '@fastify/swagger': '>=9.5.1' + fastify: ^5.5.0 + openapi-types: ^12.1.3 + zod: '>=4.1.5' - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + fastify@5.8.5: + resolution: {integrity: sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fastparallel@2.4.1: + resolution: {integrity: sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastseries@1.7.2: + resolution: {integrity: sha512-dTPFrPGS8SNSzAt7u/CbMKCJ3s01N04s4JFbORHcmyvVfVKmbhMD1VtRbh5enGHxkaQDqWyLefiKOGGmohGDDQ==} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + find-my-way@9.6.0: + resolution: {integrity: sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==} + engines: {node: '>=20'} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} framer-motion@9.1.7: resolution: {integrity: sha512-nKxBkIO4IPkMEqcBbbATxsVjwPYShKl051yhBv9628iAH6JLeHD0siBHxkL62oQzMC1+GNX73XtPjgP753ufuw==} @@ -1938,502 +1991,181 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} - - goober@2.1.18: - resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} + goober@2.1.19: + resolution: {integrity: sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==} peerDependencies: csstype: ^3.0.10 - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - iceberg-js@0.8.1: - resolution: {integrity: sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==} - engines: {node: '>=20.0.0'} + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - immutable@5.1.4: - resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} + ipaddr.js@2.4.0: + resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} + engines: {node: '>= 10'} - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - - is-path-in-cwd@2.1.0: - resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} - engines: {node: '>=6'} - - is-path-inside@2.1.0: - resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} - engines: {node: '>=6'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - hasBin: true - - jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-ref-resolver@3.0.0: + resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-resolver@3.0.0: + resolution: {integrity: sha512-HqMnbz0tz2DaEJ3ntsqtx3ezzZyDE7G56A/pPY/NGmrPu76UzsWquOpHFRAf5beTNXoH2LU5cQePVvRli1nchA==} + engines: {node: '>=20'} json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - - jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] + light-my-request@6.6.0: + resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] + linkify-it@5.0.1: + resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} - engines: {node: '>= 12.0.0'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} - engines: {node: '>=6.11.5'} + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + markdown-it@14.2.0: + resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} hasBin: true - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} - engines: {node: 20 || >=22} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + mnemonist@0.40.4: + resolution: {integrity: sha512-ZAv+KNavneRVzu4tUeOgzkScI3W5BGwZ3rkxIpKtzzVgfTtWQFN1CgX0U72cyvyh3iTuHL3SiSmrQxTlryEIcw==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - next-pwa@5.6.0: - resolution: {integrity: sha512-XV8g8C6B7UmViXU8askMEYhWwQ4qc/XqJGnexbLV68hzKaGHZDMtHsm2TNxFcbR7+ypVuth/wwpiIlMwpRJJ5A==} - peerDependencies: - next: '>=9.0.0' - - next@16.1.1: - resolution: {integrity: sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==} + next@16.2.6: + resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -2456,125 +2188,112 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + nodemon@3.1.14: + resolution: {integrity: sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==} + engines: {node: '>=10'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + pino-abstract-transport@3.0.0: + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + pino-pretty@13.1.3: + resolution: {integrity: sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==} + hasBin: true - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pino@10.3.1: + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} + hasBin: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + postgres@3.4.9: + resolution: {integrity: sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw==} + engines: {node: '>=12'} prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - prosemirror-changeset@2.3.1: - resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + prosemirror-changeset@2.4.1: + resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} prosemirror-collab@1.3.1: resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} @@ -2585,8 +2304,8 @@ packages: prosemirror-dropcursor@1.8.2: resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} - prosemirror-gapcursor@1.4.0: - resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + prosemirror-gapcursor@1.4.1: + resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} prosemirror-history@1.5.0: resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} @@ -2597,14 +2316,14 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-markdown@1.13.2: - resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + prosemirror-markdown@1.13.4: + resolution: {integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==} - prosemirror-menu@1.2.5: - resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + prosemirror-menu@1.3.2: + resolution: {integrity: sha512-6VgUJTYod0nMBlCaYJGhXGLu7Gt4AvcwcOq0YfJCY/6Uh+3S7UsWhpy6rJFCBFOmonq1hD8KyWOtZhkppd4YPg==} - prosemirror-model@1.25.4: - resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + prosemirror-model@1.25.7: + resolution: {integrity: sha512-A79aN8QEFUwI6cax8Yq4Rpcx1TJZ3Kagn+ii7qLo4/V8H3mMiHrhFyhTyHHvpSnOgMPpWiDGSwM3etwrxE50ug==} prosemirror-schema-basic@1.2.4: resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} @@ -2615,8 +2334,8 @@ packages: prosemirror-state@1.4.4: resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} - prosemirror-tables@1.8.3: - resolution: {integrity: sha512-wbqCR/RlRPRe41a4LFtmhKElzBEfBTdtAYWNIGHM6X2e24NN/MTNUKyXjjphfAfdQce37Kh/5yf765mLPYDe7Q==} + prosemirror-tables@1.8.5: + resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} prosemirror-trailing-node@3.0.0: resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} @@ -2625,31 +2344,24 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: ^1.33.8 - prosemirror-transform@1.10.5: - resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + prosemirror-transform@1.12.0: + resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} + + prosemirror-view@1.41.8: + resolution: {integrity: sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==} - prosemirror-view@1.41.4: - resolution: {integrity: sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==} + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react-content-loader@6.2.1: - resolution: {integrity: sha512-6ONbFX+Hi3SHuP66JB8CPvJn372pj+qwltJV0J8z/8MFrq98I1cbFdZuhDWeQXu3CFxiiDTXJn7DFxx2ZvrO7g==} - engines: {node: '>=10'} - peerDependencies: - react: '>=16.0.0' + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} react-dom@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} @@ -2663,3007 +2375,2011 @@ packages: react: '>=16' react-dom: '>=16' - react-icons@4.12.0: - resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} - peerDependencies: - react: '*' - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react-loader-spinner@5.4.5: - resolution: {integrity: sha512-32f+sb/v2tnNfyvnCCOS4fpyVHsGXjSyNo6QLniHcaj1XjKLxx14L2z0h6szRugOL8IEJ+53GPwNAdbkDqmy4g==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - - react-toggle@4.1.3: - resolution: {integrity: sha512-WoPrvbwfQSvoagbrDnXPrlsxwzuhQIrs+V0I162j/s+4XPgY/YDAUmHSeWiroznfI73wj+MBydvW95zX8ABbSg==} - peerDependencies: - prop-types: '>= 15.3.0 < 19' - react: '>= 15.3.0 < 19' - react-dom: '>= 15.3.0 < 19' - - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regenerate-unicode-properties@10.2.2: - resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - regexpu-core@6.4.0: - resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} - engines: {node: '>=4'} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} - hasBin: true - - remove-accents@0.5.0: - resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rollup-plugin-terser@7.0.2: - resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + react-number-format@5.4.5: + resolution: {integrity: sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==} peerDependencies: - rollup: ^2.0.0 - - rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} - engines: {node: '>=10.0.0'} - hasBin: true - - rope-sequence@1.3.4: - resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - sass@1.94.2: - resolution: {integrity: sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==} - engines: {node: '>=14.0.0'} - hasBin: true - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - - serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - - shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions - - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} - - strip-comments@2.0.1: - resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} - engines: {node: '>=10'} - - styled-components@5.3.11: - resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - react-is: '>= 16.8.0' - - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: + '@types/react': optional: true - styled-tools@1.7.2: - resolution: {integrity: sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==} - - superjson@1.13.3: - resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} - engines: {node: '>=10'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tabbable@6.3.0: - resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} - - tailwindcss@4.1.18: - resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - - temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - - tempy@0.6.0: - resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} engines: {node: '>=10'} - - terser-webpack-plugin@5.3.15: - resolution: {integrity: sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ==} - engines: {node: '>= 10.13.0'} peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: + '@types/react': optional: true - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} - engines: {node: '>=10'} - hasBin: true - - tippy.js@6.3.7: - resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.1: - resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.2.0: - resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} - engines: {node: '>=4'} - - unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - - update-browserslist-db@1.2.2: - resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - use-debounce@9.0.4: - resolution: {integrity: sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ==} - engines: {node: '>= 10.0.0'} peerDependencies: - react: '>=16.8.0' + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + react-textarea-autosize@8.5.9: + resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} + engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - - watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} - engines: {node: '>=10.13.0'} - - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} - - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} - - webpack@5.82.0: - resolution: {integrity: sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg==} - engines: {node: '>=10.13.0'} - hasBin: true + react-toggle@4.1.3: + resolution: {integrity: sha512-WoPrvbwfQSvoagbrDnXPrlsxwzuhQIrs+V0I162j/s+4XPgY/YDAUmHSeWiroznfI73wj+MBydvW95zX8ABbSg==} peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + prop-types: '>= 15.3.0 < 19' + react: '>= 15.3.0 < 19' + react-dom: '>= 15.3.0 < 19' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} + real-require@1.0.0: + resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==} - workbox-background-sync@6.6.0: - resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - workbox-broadcast-update@6.6.0: - resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} - workbox-build@6.6.0: - resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} - engines: {node: '>=10.0.0'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} - workbox-cacheable-response@6.6.0: - resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} - deprecated: workbox-background-sync@6.6.0 + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - workbox-core@6.6.0: - resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} + engines: {node: '>=10'} - workbox-expiration@6.6.0: - resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - workbox-google-analytics@6.6.0: - resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} - deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - workbox-navigation-preload@6.6.0: - resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} + rollup@4.61.0: + resolution: {integrity: sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true - workbox-precaching@6.6.0: - resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - workbox-range-requests@6.6.0: - resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - workbox-recipes@6.6.0: - resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} + safe-regex2@5.1.1: + resolution: {integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==} + hasBin: true - workbox-routing@6.6.0: - resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} - workbox-strategies@6.6.0: - resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - workbox-streams@6.6.0: - resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} + sass@1.100.0: + resolution: {integrity: sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==} + engines: {node: '>=20.19.0'} + hasBin: true - workbox-sw@6.6.0: - resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - workbox-webpack-plugin@6.6.0: - resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} - engines: {node: '>=10.0.0'} - peerDependencies: - webpack: ^4.4.0 || ^5.9.0 + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} - workbox-window@6.6.0: - resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} - zustand@4.5.7: - resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0.6' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true + sonic-boom@4.2.1: + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} -snapshots: + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} - '@alloc/quick-lru@5.2.0': {} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': - dependencies: - ajv: 8.17.1 - json-schema: 0.4.0 - jsonpointer: 5.0.1 - leven: 3.1.0 + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} - '@babel/compat-data@7.28.5': {} - - '@babel/core@7.28.5': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - '@babel/types': 7.28.5 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} - '@babel/generator@7.28.5': - dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 + steed@1.1.3: + resolution: {integrity: sha512-EUkci0FAUiE4IvGTSKcDJIQ/eRUP2JJb56+fvZ4sdnguLTqIdKjSxUe138poW8mkvKWXW2sFPrgTsxqoISnmoA==} - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.28.5 + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.4.0 - semver: 6.3.1 + superjson@1.13.3: + resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} + engines: {node: '>=10'} - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.3(supports-color@5.5.0) - lodash.debounce: 4.0.8 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} - '@babel/helper-globals@7.28.0': {} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.28.5(supports-color@5.5.0) - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} - '@babel/helper-module-imports@7.27.1(supports-color@5.5.0)': - dependencies: - '@babel/traverse': 7.28.5(supports-color@5.5.0) - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + thread-stream@4.2.0: + resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==} + engines: {node: '>=20'} - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.28.5 + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - '@babel/helper-plugin-utils@7.27.1': {} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.28.5(supports-color@5.5.0) - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color + toad-cache@3.7.1: + resolution: {integrity: sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==} + engines: {node: '>=20'} - '@babel/helper-string-parser@7.27.1': {} + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - '@babel/helper-validator-identifier@7.28.5': {} + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true - '@babel/helper-validator-option@7.27.1': {} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true - '@babel/helper-wrap-function@7.28.3': - dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - '@babel/helpers@7.28.4': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true - '@babel/parser@7.28.5': - dependencies: - '@babel/types': 7.28.5 + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + tsx@4.22.3: + resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==} + engines: {node: '>=18.0.0'} + hasBin: true - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + use-composed-ref@1.4.0: + resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + use-isomorphic-layout-effect@1.2.1: + resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + use-latest@1.3.0: + resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + zustand@4.5.7: + resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 +snapshots: - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + '@babel/runtime@7.29.2': {} - '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@biomejs/biome@2.3.8': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.3.8 + '@biomejs/cli-darwin-x64': 2.3.8 + '@biomejs/cli-linux-arm64': 2.3.8 + '@biomejs/cli-linux-arm64-musl': 2.3.8 + '@biomejs/cli-linux-x64': 2.3.8 + '@biomejs/cli-linux-x64-musl': 2.3.8 + '@biomejs/cli-win32-arm64': 2.3.8 + '@biomejs/cli-win32-x64': 2.3.8 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@biomejs/cli-darwin-arm64@2.3.8': + optional: true - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color + '@biomejs/cli-darwin-x64@2.3.8': + optional: true - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + '@biomejs/cli-linux-arm64-musl@2.3.8': + optional: true - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@biomejs/cli-linux-arm64@2.3.8': + optional: true - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@biomejs/cli-linux-x64-musl@2.3.8': + optional: true - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@biomejs/cli-linux-x64@2.3.8': + optional: true - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@biomejs/cli-win32-arm64@2.3.8': + optional: true - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@biomejs/cli-win32-x64@2.3.8': + optional: true - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': + '@cspotcode/source-map-support@0.8.1': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@jridgewell/trace-mapping': 0.3.9 - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + '@drizzle-team/brocli@0.10.2': {} - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': + '@emnapi/runtime@1.10.0': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + tslib: 2.8.1 + optional: true - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + '@emotion/is-prop-valid@0.8.8': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@emotion/memoize': 0.7.4 + optional: true - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@emotion/memoize@0.7.4': + optional: true - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': + '@esbuild-kit/core-utils@3.3.2': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + esbuild: 0.18.20 + source-map-support: 0.5.21 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': + '@esbuild-kit/esm-loader@2.6.5': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.14.0 - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/traverse': 7.28.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + '@esbuild/aix-ppc64@0.25.12': + optional: true - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + '@esbuild/aix-ppc64@0.27.7': + optional: true - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@esbuild/aix-ppc64@0.28.0': + optional: true - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color + '@esbuild/android-arm64@0.18.20': + optional: true - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@esbuild/android-arm64@0.25.12': + optional: true - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@esbuild/android-arm64@0.27.7': + optional: true - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@esbuild/android-arm64@0.28.0': + optional: true - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@esbuild/android-arm@0.18.20': + optional: true - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@esbuild/android-arm@0.25.12': + optional: true - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@esbuild/android-arm@0.27.7': + optional: true - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@esbuild/android-arm@0.28.0': + optional: true - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@esbuild/android-x64@0.18.20': + optional: true - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color + '@esbuild/android-x64@0.25.12': + optional: true - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.47.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@esbuild/android-x64@0.27.7': + optional: true - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.5 - esutils: 2.0.3 + '@esbuild/android-x64@0.28.0': + optional: true - '@babel/runtime@7.28.4': {} + '@esbuild/darwin-arm64@0.18.20': + optional: true - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@esbuild/darwin-arm64@0.25.12': + optional: true - '@babel/traverse@7.28.5(supports-color@5.5.0)': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + '@esbuild/darwin-arm64@0.27.7': + optional: true - '@babel/types@7.28.5': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@esbuild/darwin-arm64@0.28.0': + optional: true - '@biomejs/biome@2.3.8': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.8 - '@biomejs/cli-darwin-x64': 2.3.8 - '@biomejs/cli-linux-arm64': 2.3.8 - '@biomejs/cli-linux-arm64-musl': 2.3.8 - '@biomejs/cli-linux-x64': 2.3.8 - '@biomejs/cli-linux-x64-musl': 2.3.8 - '@biomejs/cli-win32-arm64': 2.3.8 - '@biomejs/cli-win32-x64': 2.3.8 + '@esbuild/darwin-x64@0.18.20': + optional: true - '@biomejs/cli-darwin-arm64@2.3.8': + '@esbuild/darwin-x64@0.25.12': optional: true - '@biomejs/cli-darwin-x64@2.3.8': + '@esbuild/darwin-x64@0.27.7': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.8': + '@esbuild/darwin-x64@0.28.0': optional: true - '@biomejs/cli-linux-arm64@2.3.8': + '@esbuild/freebsd-arm64@0.18.20': optional: true - '@biomejs/cli-linux-x64-musl@2.3.8': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@biomejs/cli-linux-x64@2.3.8': + '@esbuild/freebsd-arm64@0.27.7': optional: true - '@biomejs/cli-win32-arm64@2.3.8': + '@esbuild/freebsd-arm64@0.28.0': optional: true - '@biomejs/cli-win32-x64@2.3.8': + '@esbuild/freebsd-x64@0.18.20': optional: true - '@emnapi/runtime@1.7.1': - dependencies: - tslib: 2.8.1 + '@esbuild/freebsd-x64@0.25.12': optional: true - '@emotion/is-prop-valid@0.8.8': - dependencies: - '@emotion/memoize': 0.7.4 + '@esbuild/freebsd-x64@0.27.7': optional: true - '@emotion/is-prop-valid@1.4.0': - dependencies: - '@emotion/memoize': 0.9.0 + '@esbuild/freebsd-x64@0.28.0': + optional: true - '@emotion/memoize@0.7.4': + '@esbuild/linux-arm64@0.18.20': optional: true - '@emotion/memoize@0.9.0': {} + '@esbuild/linux-arm64@0.25.12': + optional: true - '@emotion/stylis@0.8.5': {} + '@esbuild/linux-arm64@0.27.7': + optional: true - '@emotion/unitless@0.7.5': {} + '@esbuild/linux-arm64@0.28.0': + optional: true - '@floating-ui/core@1.7.3': - dependencies: - '@floating-ui/utils': 0.2.10 + '@esbuild/linux-arm@0.18.20': + optional: true - '@floating-ui/dom@1.7.4': - dependencies: - '@floating-ui/core': 1.7.3 - '@floating-ui/utils': 0.2.10 + '@esbuild/linux-arm@0.25.12': + optional: true - '@floating-ui/react-dom@1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@floating-ui/dom': 1.7.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@esbuild/linux-arm@0.27.7': + optional: true - '@floating-ui/react@0.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@floating-ui/react-dom': 1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - aria-hidden: 1.2.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tabbable: 6.3.0 + '@esbuild/linux-arm@0.28.0': + optional: true - '@floating-ui/utils@0.2.10': {} + '@esbuild/linux-ia32@0.18.20': + optional: true - '@img/colour@1.0.0': + '@esbuild/linux-ia32@0.25.12': optional: true - '@img/sharp-darwin-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@esbuild/linux-ia32@0.27.7': optional: true - '@img/sharp-darwin-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + '@esbuild/linux-ia32@0.28.0': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': + '@esbuild/linux-loong64@0.18.20': optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': + '@esbuild/linux-loong64@0.25.12': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': + '@esbuild/linux-loong64@0.27.7': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': + '@esbuild/linux-loong64@0.28.0': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': + '@esbuild/linux-mips64el@0.18.20': optional: true - '@img/sharp-libvips-linux-riscv64@1.2.4': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': + '@esbuild/linux-mips64el@0.28.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + '@esbuild/linux-ppc64@0.18.20': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@img/sharp-linux-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 + '@esbuild/linux-ppc64@0.27.7': optional: true - '@img/sharp-linux-arm@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 + '@esbuild/linux-ppc64@0.28.0': optional: true - '@img/sharp-linux-ppc64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@esbuild/linux-riscv64@0.18.20': optional: true - '@img/sharp-linux-riscv64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@esbuild/linux-riscv64@0.25.12': optional: true - '@img/sharp-linux-s390x@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 + '@esbuild/linux-riscv64@0.27.7': optional: true - '@img/sharp-linux-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 + '@esbuild/linux-riscv64@0.28.0': optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@esbuild/linux-s390x@0.18.20': optional: true - '@img/sharp-linuxmusl-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@esbuild/linux-s390x@0.25.12': optional: true - '@img/sharp-wasm32@0.34.5': - dependencies: - '@emnapi/runtime': 1.7.1 + '@esbuild/linux-s390x@0.27.7': optional: true - '@img/sharp-win32-arm64@0.34.5': + '@esbuild/linux-s390x@0.28.0': optional: true - '@img/sharp-win32-ia32@0.34.5': + '@esbuild/linux-x64@0.18.20': optional: true - '@img/sharp-win32-x64@0.34.5': + '@esbuild/linux-x64@0.25.12': optional: true - '@isaacs/balanced-match@4.0.1': {} + '@esbuild/linux-x64@0.27.7': + optional: true - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 + '@esbuild/linux-x64@0.28.0': + optional: true - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 + '@esbuild/netbsd-arm64@0.25.12': + optional: true - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@esbuild/netbsd-arm64@0.27.7': + optional: true - '@jridgewell/resolve-uri@3.1.2': {} + '@esbuild/netbsd-arm64@0.28.0': + optional: true - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@esbuild/netbsd-x64@0.18.20': + optional: true - '@jridgewell/sourcemap-codec@1.5.5': {} + '@esbuild/netbsd-x64@0.25.12': + optional: true - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@esbuild/netbsd-x64@0.27.7': + optional: true - '@next/env@16.1.1': {} + '@esbuild/netbsd-x64@0.28.0': + optional: true - '@next/swc-darwin-arm64@16.1.1': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@next/swc-darwin-x64@16.1.1': + '@esbuild/openbsd-arm64@0.27.7': optional: true - '@next/swc-linux-arm64-gnu@16.1.1': + '@esbuild/openbsd-arm64@0.28.0': optional: true - '@next/swc-linux-arm64-musl@16.1.1': + '@esbuild/openbsd-x64@0.18.20': optional: true - '@next/swc-linux-x64-gnu@16.1.1': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@next/swc-linux-x64-musl@16.1.1': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@next/swc-win32-arm64-msvc@16.1.1': + '@esbuild/openbsd-x64@0.28.0': optional: true - '@next/swc-win32-x64-msvc@16.1.1': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@esbuild/openharmony-arm64@0.27.7': + optional: true - '@nodelib/fs.stat@2.0.5': {} + '@esbuild/openharmony-arm64@0.28.0': + optional: true - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + '@esbuild/sunos-x64@0.18.20': + optional: true - '@parcel/watcher-android-arm64@2.5.1': + '@esbuild/sunos-x64@0.25.12': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@esbuild/sunos-x64@0.27.7': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@esbuild/sunos-x64@0.28.0': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@esbuild/win32-arm64@0.18.20': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@esbuild/win32-arm64@0.25.12': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@esbuild/win32-arm64@0.27.7': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@esbuild/win32-arm64@0.28.0': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@esbuild/win32-ia32@0.18.20': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@esbuild/win32-ia32@0.25.12': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + '@esbuild/win32-ia32@0.27.7': optional: true - '@parcel/watcher-win32-arm64@2.5.1': + '@esbuild/win32-ia32@0.28.0': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@esbuild/win32-x64@0.18.20': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@esbuild/win32-x64@0.25.12': optional: true - '@parcel/watcher@2.5.1': - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.8 - node-addon-api: 7.1.1 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@esbuild/win32-x64@0.27.7': optional: true - '@popperjs/core@2.11.8': {} + '@esbuild/win32-x64@0.28.0': + optional: true - '@radix-ui/react-icons@1.3.2(react@18.2.0)': + '@fastify/ajv-compiler@4.0.5': dependencies: - react: 18.2.0 + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + fast-uri: 3.1.2 - '@remirror/core-constants@3.0.0': {} + '@fastify/cors@11.2.0': + dependencies: + fastify-plugin: 5.1.0 + toad-cache: 3.7.1 + + '@fastify/error@4.2.0': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.28.5)(rollup@2.79.2)': + '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - rollup: 2.79.2 - transitivePeerDependencies: - - supports-color + fast-json-stringify: 6.4.0 - '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.2)': + '@fastify/forwarded@3.0.1': {} + + '@fastify/jwt@10.2.1': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - '@types/resolve': 1.17.1 - builtin-modules: 3.3.0 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.11 - rollup: 2.79.2 + '@fastify/error': 4.2.0 + '@lukeed/ms': 2.0.2 + fast-jwt: 6.3.2 + fastify-plugin: 6.0.0 + steed: 1.1.3 - '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': + '@fastify/merge-json-schemas@0.2.1': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - magic-string: 0.25.9 - rollup: 2.79.2 + dequal: 2.0.3 - '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + '@fastify/proxy-addr@5.1.0': dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.79.2 + '@fastify/forwarded': 3.0.1 + ipaddr.js: 2.4.0 - '@supabase/auth-js@2.86.2': + '@fastify/swagger@9.7.0': dependencies: - tslib: 2.8.1 + fastify-plugin: 5.1.0 + json-schema-resolver: 3.0.0 + openapi-types: 12.1.3 + rfdc: 1.4.1 + yaml: 2.9.0 + transitivePeerDependencies: + - supports-color - '@supabase/functions-js@2.86.2': + '@floating-ui/core@1.7.5': dependencies: - tslib: 2.8.1 + '@floating-ui/utils': 0.2.11 - '@supabase/postgrest-js@2.86.2': + '@floating-ui/dom@1.7.6': dependencies: - tslib: 2.8.1 + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 - '@supabase/realtime-js@2.86.2': + '@floating-ui/react-dom@1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@types/phoenix': 1.6.6 - '@types/ws': 8.18.1 - tslib: 2.8.1 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + '@floating-ui/dom': 1.7.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@supabase/storage-js@2.86.2': + '@floating-ui/react-dom@2.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - iceberg-js: 0.8.1 - tslib: 2.8.1 + '@floating-ui/dom': 1.7.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@supabase/supabase-js@2.86.2': + '@floating-ui/react@0.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@supabase/auth-js': 2.86.2 - '@supabase/functions-js': 2.86.2 - '@supabase/postgrest-js': 2.86.2 - '@supabase/realtime-js': 2.86.2 - '@supabase/storage-js': 2.86.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + '@floating-ui/react-dom': 1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + aria-hidden: 1.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tabbable: 6.4.0 - '@surma/rollup-plugin-off-main-thread@2.2.3': + '@floating-ui/react@0.27.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - ejs: 3.1.10 - json5: 2.2.3 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.12 + '@floating-ui/react-dom': 2.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/utils': 0.2.11 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tabbable: 6.4.0 - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 + '@floating-ui/utils@0.2.11': {} - '@tailwindcss/node@4.1.18': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.1.18 + '@img/colour@1.1.0': + optional: true - '@tailwindcss/oxide-android-arm64@4.1.18': + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.18': + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true - '@tailwindcss/oxide-darwin-x64@4.1.18': + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.18': + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.18': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.18': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true - '@tailwindcss/oxide@4.1.18': + '@img/sharp-linux-arm64@0.34.5': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-x64': 4.1.18 - '@tailwindcss/oxide-freebsd-x64': 4.1.18 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-x64-musl': 4.1.18 - '@tailwindcss/oxide-wasm32-wasi': 4.1.18 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - - '@tailwindcss/postcss@4.1.18': - dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.18 - '@tailwindcss/oxide': 4.1.18 - postcss: 8.5.6 - tailwindcss: 4.1.18 - - '@tanstack/match-sorter-utils@8.19.4': - dependencies: - remove-accents: 0.5.0 - - '@tanstack/query-core@4.41.0': {} - - '@tanstack/react-query-devtools@4.42.0(@tanstack/react-query@4.42.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-query': 4.42.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - superjson: 1.13.3 - use-sync-external-store: 1.6.0(react@18.2.0) + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true - '@tanstack/react-query@4.42.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@tanstack/query-core': 4.41.0 - react: 18.2.0 - use-sync-external-store: 1.6.0(react@18.2.0) + '@img/sharp-linux-arm@0.34.5': optionalDependencies: - react-dom: 18.2.0(react@18.2.0) - - '@tiptap/core@2.27.1(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/pm': 2.27.1 - - '@tiptap/extension-blockquote@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - - '@tiptap/extension-bold@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - - '@tiptap/extension-bubble-menu@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - tippy.js: 6.3.7 - - '@tiptap/extension-bullet-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - - '@tiptap/extension-code-block@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - - '@tiptap/extension-code@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - - '@tiptap/extension-document@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - - '@tiptap/extension-dropcursor@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - - '@tiptap/extension-floating-menu@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - tippy.js: 6.3.7 - - '@tiptap/extension-gapcursor@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true - '@tiptap/extension-hard-break@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true - '@tiptap/extension-heading@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true - '@tiptap/extension-history@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true - '@tiptap/extension-horizontal-rule@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true - '@tiptap/extension-image@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true - '@tiptap/extension-italic@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true - '@tiptap/extension-list-item@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@img/sharp-wasm32@0.34.5': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@emnapi/runtime': 1.10.0 + optional: true - '@tiptap/extension-ordered-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@img/sharp-win32-arm64@0.34.5': + optional: true - '@tiptap/extension-paragraph@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@img/sharp-win32-ia32@0.34.5': + optional: true - '@tiptap/extension-placeholder@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@img/sharp-win32-x64@0.34.5': + optional: true - '@tiptap/extension-strike@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@tiptap/extension-task-item@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@jridgewell/resolve-uri@3.1.2': {} - '@tiptap/extension-task-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@jridgewell/sourcemap-codec@1.5.5': {} - '@tiptap/extension-text-style@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@jridgewell/trace-mapping@0.3.31': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@tiptap/extension-text@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@jridgewell/trace-mapping@0.3.9': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@tiptap/pm@2.27.1': - dependencies: - prosemirror-changeset: 2.3.1 - prosemirror-collab: 1.3.1 - prosemirror-commands: 1.7.1 - prosemirror-dropcursor: 1.8.2 - prosemirror-gapcursor: 1.4.0 - prosemirror-history: 1.5.0 - prosemirror-inputrules: 1.5.1 - prosemirror-keymap: 1.2.3 - prosemirror-markdown: 1.13.2 - prosemirror-menu: 1.2.5 - prosemirror-model: 1.25.4 - prosemirror-schema-basic: 1.2.4 - prosemirror-schema-list: 1.5.1 - prosemirror-state: 1.4.4 - prosemirror-tables: 1.8.3 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4) - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.4 + '@lukeed/ms@2.0.2': {} - '@tiptap/react@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@18.2.0))(@types/react@18.0.37)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/extension-bubble-menu': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-floating-menu': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - '@types/use-sync-external-store': 0.0.6 - fast-deep-equal: 3.1.3 + '@floating-ui/react': 0.27.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mantine/hooks': 8.3.18(react@18.2.0) + clsx: 2.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - use-sync-external-store: 1.6.0(react@18.2.0) + react-number-format: 5.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-remove-scroll: 2.7.2(@types/react@18.0.37)(react@18.2.0) + react-textarea-autosize: 8.5.9(@types/react@18.0.37)(react@18.2.0) + type-fest: 4.41.0 + transitivePeerDependencies: + - '@types/react' - '@tiptap/starter-kit@2.27.1': + '@mantine/hooks@8.3.18(react@18.2.0)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/extension-blockquote': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-bold': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-bullet-list': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-code': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-code-block': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-document': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-dropcursor': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-gapcursor': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-hard-break': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-heading': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-history': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-horizontal-rule': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-italic': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-list-item': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-ordered-list': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-paragraph': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-strike': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-text': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-text-style': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/pm': 2.27.1 + react: 18.2.0 - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 + '@next/env@16.2.6': {} - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 + '@next/swc-darwin-arm64@16.2.6': + optional: true - '@types/estree@0.0.39': {} + '@next/swc-darwin-x64@16.2.6': + optional: true - '@types/estree@1.0.8': {} + '@next/swc-linux-arm64-gnu@16.2.6': + optional: true - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 6.0.0 - '@types/node': 18.15.12 + '@next/swc-linux-arm64-musl@16.2.6': + optional: true - '@types/json-schema@7.0.15': {} + '@next/swc-linux-x64-gnu@16.2.6': + optional: true - '@types/linkify-it@5.0.0': {} + '@next/swc-linux-x64-musl@16.2.6': + optional: true - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 + '@next/swc-win32-arm64-msvc@16.2.6': + optional: true - '@types/mdurl@2.0.0': {} + '@next/swc-win32-x64-msvc@16.2.6': + optional: true - '@types/minimatch@6.0.0': - dependencies: - minimatch: 10.1.1 + '@parcel/watcher-android-arm64@2.5.6': + optional: true - '@types/node@18.15.12': {} + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true - '@types/phoenix@1.6.6': {} + '@parcel/watcher-darwin-x64@2.5.6': + optional: true - '@types/prop-types@15.7.15': {} + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true - '@types/react-dom@18.0.11': - dependencies: - '@types/react': 18.0.37 + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true - '@types/react-toggle@4.0.5': - dependencies: - '@types/react': 18.0.37 + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true - '@types/react@18.0.37': - dependencies: - '@types/prop-types': 15.7.15 - '@types/scheduler': 0.26.0 - csstype: 3.2.3 + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true - '@types/resolve@1.17.1': - dependencies: - '@types/node': 18.15.12 + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true - '@types/scheduler@0.26.0': {} + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true - '@types/trusted-types@2.0.7': {} + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true - '@types/use-sync-external-store@0.0.6': {} + '@parcel/watcher-win32-arm64@2.5.6': + optional: true - '@types/ws@8.18.1': - dependencies: - '@types/node': 18.15.12 + '@parcel/watcher-win32-ia32@2.5.6': + optional: true - '@vercel/analytics@1.6.1(next@16.1.1(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.94.2))(react@18.2.0)': - optionalDependencies: - next: 16.1.1(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.94.2) - react: 18.2.0 + '@parcel/watcher-win32-x64@2.5.6': + optional: true - '@webassemblyjs/ast@1.14.1': + '@parcel/watcher@2.5.6': dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true - '@webassemblyjs/helper-api-error@1.13.2': {} + '@pinojs/redact@0.4.0': {} - '@webassemblyjs/helper-buffer@1.14.1': {} + '@popperjs/core@2.11.8': {} - '@webassemblyjs/helper-numbers@1.13.2': + '@radix-ui/react-icons@1.3.2(react@18.2.0)': dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 + react: 18.2.0 - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + '@remirror/core-constants@3.0.0': {} - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 + '@rollup/rollup-android-arm-eabi@4.61.0': + optional: true - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 + '@rollup/rollup-android-arm64@4.61.0': + optional: true - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 + '@rollup/rollup-darwin-arm64@4.61.0': + optional: true - '@webassemblyjs/utf8@1.13.2': {} + '@rollup/rollup-darwin-x64@4.61.0': + optional: true - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 + '@rollup/rollup-freebsd-arm64@4.61.0': + optional: true - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 + '@rollup/rollup-freebsd-x64@4.61.0': + optional: true - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + optional: true - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + optional: true - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 + '@rollup/rollup-linux-arm64-gnu@4.61.0': + optional: true - '@xtuc/ieee754@1.2.0': {} + '@rollup/rollup-linux-arm64-musl@4.61.0': + optional: true - '@xtuc/long@4.2.2': {} + '@rollup/rollup-linux-loong64-gnu@4.61.0': + optional: true - acorn-import-assertions@1.9.0(acorn@8.15.0): - dependencies: - acorn: 8.15.0 + '@rollup/rollup-linux-loong64-musl@4.61.0': + optional: true - acorn@8.15.0: {} + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + optional: true - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 + '@rollup/rollup-linux-ppc64-musl@4.61.0': + optional: true - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + optional: true - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 + '@rollup/rollup-linux-riscv64-musl@4.61.0': + optional: true - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + '@rollup/rollup-linux-s390x-gnu@4.61.0': + optional: true - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 + '@rollup/rollup-linux-x64-gnu@4.61.0': + optional: true - argparse@2.0.1: {} + '@rollup/rollup-linux-x64-musl@4.61.0': + optional: true - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 + '@rollup/rollup-openbsd-x64@4.61.0': + optional: true - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 + '@rollup/rollup-openharmony-arm64@4.61.0': + optional: true - array-union@1.0.2: - dependencies: - array-uniq: 1.0.3 + '@rollup/rollup-win32-arm64-msvc@4.61.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.61.0': + optional: true - array-union@2.1.0: {} + '@rollup/rollup-win32-x64-gnu@4.61.0': + optional: true - array-uniq@1.0.3: {} + '@rollup/rollup-win32-x64-msvc@4.61.0': + optional: true - arraybuffer.prototype.slice@1.0.4: + '@swc/helpers@0.5.15': dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - - async-function@1.0.0: {} + tslib: 2.8.1 - async@3.2.6: {} + '@tanstack/match-sorter-utils@8.19.4': + dependencies: + remove-accents: 0.5.0 - at-least-node@1.0.0: {} + '@tanstack/query-core@4.44.0': {} - autoprefixer@10.4.23(postcss@8.5.6): + '@tanstack/react-query-devtools@4.44.0(@tanstack/react-query@4.44.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001761 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 + '@tanstack/match-sorter-utils': 8.19.4 + '@tanstack/react-query': 4.44.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + superjson: 1.13.3 + use-sync-external-store: 1.6.0(react@18.2.0) - available-typed-arrays@1.0.7: + '@tanstack/react-query@4.44.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - possible-typed-array-names: 1.1.0 + '@tanstack/query-core': 4.44.0 + react: 18.2.0 + use-sync-external-store: 1.6.0(react@18.2.0) + optionalDependencies: + react-dom: 18.2.0(react@18.2.0) - babel-loader@8.4.1(@babel/core@7.28.5)(webpack@5.82.0): + '@tiptap/core@2.27.2(@tiptap/pm@2.27.2)': dependencies: - '@babel/core': 7.28.5 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.82.0 + '@tiptap/pm': 2.27.2 - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): + '@tiptap/extension-blockquote@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): + '@tiptap/extension-bold@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.47.0 - transitivePeerDependencies: - - supports-color + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): + '@tiptap/extension-bubble-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + tippy.js: 6.3.7 - babel-plugin-styled-components@2.1.4(@babel/core@7.28.5)(styled-components@5.3.11(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(supports-color@5.5.0): + '@tiptap/extension-bullet-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - lodash: 4.17.21 - picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) - transitivePeerDependencies: - - '@babel/core' - - supports-color - - balanced-match@1.0.2: {} - - baseline-browser-mapping@2.9.4: {} - - big.js@5.2.2: {} + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - brace-expansion@1.1.12: + '@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 - brace-expansion@2.0.2: + '@tiptap/extension-code@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - balanced-match: 1.0.2 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - braces@3.0.3: + '@tiptap/extension-document@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - fill-range: 7.1.1 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - browserslist@4.28.1: + '@tiptap/extension-dropcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - baseline-browser-mapping: 2.9.4 - caniuse-lite: 1.0.30001761 - electron-to-chromium: 1.5.266 - node-releases: 2.0.27 - update-browserslist-db: 1.2.2(browserslist@4.28.1) - - buffer-from@1.1.2: {} + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 - builtin-modules@3.3.0: {} - - call-bind-apply-helpers@1.0.2: + '@tiptap/extension-floating-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + tippy.js: 6.3.7 - call-bind@1.0.8: + '@tiptap/extension-gapcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 - call-bound@1.0.4: + '@tiptap/extension-hard-break@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - camelize@1.0.1: {} - - caniuse-lite@1.0.30001759: {} + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - caniuse-lite@1.0.30001761: {} - - chokidar@4.0.3: + '@tiptap/extension-heading@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - readdirp: 4.1.2 - - chrome-trace-event@1.0.4: {} + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - classnames@2.5.1: {} - - clean-webpack-plugin@4.0.0(webpack@5.82.0): + '@tiptap/extension-history@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - del: 4.1.1 - webpack: 5.82.0 - - client-only@0.0.1: {} + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 - clsx@1.2.1: {} - - commander@2.20.3: {} - - common-tags@1.8.2: {} - - commondir@1.0.1: {} - - concat-map@0.0.1: {} - - convert-source-map@2.0.0: {} - - copy-anything@3.0.5: + '@tiptap/extension-horizontal-rule@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - is-what: 4.1.16 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 - copy-to-clipboard@3.3.3: + '@tiptap/extension-image@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - toggle-selection: 1.0.6 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - core-js-compat@3.47.0: + '@tiptap/extension-italic@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - browserslist: 4.28.1 - - crelt@1.0.6: {} - - crypto-random-string@2.0.0: {} + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - css-color-keywords@1.0.0: {} - - css-to-react-native@3.2.0: + '@tiptap/extension-list-item@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - - csstype@3.2.3: {} - - daisyui@5.5.14: {} + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - data-view-buffer@1.0.2: + '@tiptap/extension-ordered-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - data-view-byte-length@1.0.2: + '@tiptap/extension-paragraph@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - data-view-byte-offset@1.0.1: + '@tiptap/extension-placeholder@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 - debug@4.4.3(supports-color@5.5.0): + '@tiptap/extension-strike@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - deepmerge@4.3.1: {} - - define-data-property@1.1.4: + '@tiptap/extension-task-item@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 - define-properties@1.2.1: + '@tiptap/extension-task-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - del@4.1.1: + '@tiptap/extension-text-style@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': dependencies: - '@types/glob': 7.2.0 - globby: 6.1.0 - is-path-cwd: 2.2.0 - is-path-in-cwd: 2.1.0 - p-map: 2.1.0 - pify: 4.0.1 - rimraf: 2.7.1 - - detect-libc@1.0.3: - optional: true + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - detect-libc@2.1.2: {} + '@tiptap/extension-text@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - dir-glob@3.0.1: + '@tiptap/pm@2.27.2': dependencies: - path-type: 4.0.0 + prosemirror-changeset: 2.4.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.1 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.4 + prosemirror-menu: 1.3.2 + prosemirror-model: 1.25.7 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8) + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 - dunder-proto@1.0.1: + '@tiptap/react@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-bubble-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-floating-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + '@types/use-sync-external-store': 0.0.6 + fast-deep-equal: 3.1.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.6.0(react@18.2.0) - ejs@3.1.10: + '@tiptap/starter-kit@2.27.2': dependencies: - jake: 10.9.4 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-blockquote': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bold': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bullet-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code-block': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-document': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-dropcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-gapcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-hard-break': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-heading': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-history': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-horizontal-rule': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-italic': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-list-item': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-ordered-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-paragraph': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-strike': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-text': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-text-style': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/pm': 2.27.2 - electron-to-chromium@1.5.266: {} + '@tsconfig/node10@1.0.12': {} - emojis-list@3.0.0: {} + '@tsconfig/node12@1.0.11': {} - enhanced-resolve@5.18.3: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 + '@tsconfig/node14@1.0.3': {} - entities@4.5.0: {} + '@tsconfig/node16@1.0.4': {} - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@1.7.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - escalade@3.2.0: {} + '@types/bcryptjs@2.4.6': {} - escape-string-regexp@4.0.0: {} + '@types/estree@1.0.9': {} - eslint-scope@5.1.1: + '@types/jsonwebtoken@9.0.10': dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 + '@types/ms': 2.1.0 + '@types/node': 25.9.1 + + '@types/linkify-it@5.0.0': {} - esrecurse@4.3.0: + '@types/markdown-it@14.1.2': dependencies: - estraverse: 5.3.0 + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 - estraverse@4.3.0: {} + '@types/mdurl@2.0.0': {} - estraverse@5.3.0: {} + '@types/ms@2.1.0': {} - estree-walker@1.0.1: {} + '@types/node@18.15.12': {} - esutils@2.0.3: {} + '@types/node@25.9.1': + dependencies: + undici-types: 7.24.6 - events@3.3.0: {} + '@types/prop-types@15.7.15': {} - fast-deep-equal@3.1.3: {} + '@types/react-dom@18.0.11': + dependencies: + '@types/react': 18.0.37 - fast-glob@3.3.3: + '@types/react@18.0.37': dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + '@types/prop-types': 15.7.15 + '@types/scheduler': 0.26.0 + csstype: 3.2.3 - fast-json-stable-stringify@2.1.0: {} + '@types/scheduler@0.26.0': {} - fast-uri@3.1.0: {} + '@types/use-sync-external-store@0.0.6': {} - fastq@1.19.1: - dependencies: - reusify: 1.1.0 + abstract-logging@2.0.1: {} - filelist@1.0.4: + acorn-walk@8.3.5: dependencies: - minimatch: 5.1.6 + acorn: 8.16.0 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 + acorn@8.16.0: {} - find-cache-dir@3.3.2: - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 - find-up@4.1.0: + ajv@8.20.0: dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + any-promise@1.3.0: {} - for-each@0.3.5: + anymatch@3.1.3: dependencies: - is-callable: 1.2.7 + normalize-path: 3.0.0 + picomatch: 2.3.2 - fraction.js@5.3.4: {} + arg@4.1.3: {} - framer-motion@9.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + argparse@2.0.1: {} + + aria-hidden@1.2.6: dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) tslib: 2.8.1 - optionalDependencies: - '@emotion/is-prop-valid': 0.8.8 - fs-extra@9.1.0: + asn1.js@5.4.1: dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true + bn.js: 4.12.5 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 - function-bind@1.1.2: {} + atomic-sleep@1.0.0: {} - function.prototype.name@1.1.8: + avvio@9.2.0: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 + '@fastify/error': 4.2.0 + fastq: 1.20.1 - functions-have-names@1.2.3: {} + balanced-match@4.0.4: {} - generator-function@2.0.1: {} + baseline-browser-mapping@2.10.32: {} - gensync@1.0.0-beta.2: {} + bcryptjs@2.4.3: {} - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 + binary-extensions@2.3.0: {} - get-own-enumerable-property-symbols@3.0.2: {} + bn.js@4.12.5: {} - get-proto@1.0.1: + brace-expansion@5.0.6: dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + balanced-match: 4.0.4 - get-symbol-description@1.1.0: + braces@3.0.3: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 + fill-range: 7.1.1 - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 + buffer-equal-constant-time@1.0.1: {} - glob-to-regexp@0.4.1: {} + buffer-from@1.1.2: {} - glob@7.2.3: + bundle-require@5.1.0(esbuild@0.27.7): dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + esbuild: 0.27.7 + load-tsconfig: 0.2.5 - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 + cac@6.7.14: {} + + caniuse-lite@1.0.30001793: {} - globby@11.1.0: + chokidar@3.6.0: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - globby@6.1.0: + chokidar@4.0.3: dependencies: - array-union: 1.0.2 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 + readdirp: 4.1.2 - goober@2.1.18(csstype@3.2.3): + chokidar@5.0.0: dependencies: - csstype: 3.2.3 + readdirp: 5.0.0 + optional: true - gopd@1.2.0: {} + classnames@2.5.1: {} - graceful-fs@4.2.11: {} + client-only@0.0.1: {} - has-bigints@1.1.0: {} + clsx@1.2.1: {} - has-flag@3.0.0: {} + clsx@2.1.1: {} - has-flag@4.0.0: {} + colorette@2.0.20: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 + commander@4.1.1: {} - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 + confbox@0.1.8: {} - has-symbols@1.1.0: {} + consola@3.4.2: {} - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 + cookie@1.1.1: {} - hasown@2.0.2: + copy-anything@3.0.5: dependencies: - function-bind: 1.1.2 + is-what: 4.1.16 - hoist-non-react-statics@3.3.2: + copy-to-clipboard@3.3.3: dependencies: - react-is: 16.13.1 + toggle-selection: 1.0.6 - iceberg-js@0.8.1: {} + create-require@1.1.1: {} - idb@7.1.1: {} + crelt@1.0.6: {} - ignore@5.3.2: {} + csstype@3.2.3: {} - immutable@5.1.4: {} + dateformat@4.6.3: {} - inflight@1.0.6: + debug@4.4.3(supports-color@5.5.0): dependencies: - once: 1.4.0 - wrappy: 1.0.2 + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 - inherits@2.0.4: {} + dequal@2.0.3: {} - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 + detect-libc@2.1.2: + optional: true - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + detect-node-es@1.1.0: {} - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 + diff@4.0.4: {} - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 + dotenv@17.4.2: {} - is-boolean-object@1.2.2: + drizzle-kit@0.31.10: dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.12 + tsx: 4.22.3 - is-callable@1.2.7: {} + drizzle-orm@0.45.2(postgres@3.4.9): + optionalDependencies: + postgres: 3.4.9 - is-core-module@2.16.1: + drizzle-zod@0.8.3(drizzle-orm@0.45.2(postgres@3.4.9))(zod@4.4.3): dependencies: - hasown: 2.0.2 + drizzle-orm: 0.45.2(postgres@3.4.9) + zod: 4.4.3 - is-data-view@1.0.2: + ecdsa-sig-formatter@1.0.11: dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 + safe-buffer: 5.2.1 - is-date-object@1.1.0: + end-of-stream@1.4.5: dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-extglob@2.1.1: {} + once: 1.4.0 - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 + entities@4.5.0: {} - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 + escape-string-regexp@4.0.0: {} - is-map@2.0.3: {} + fast-copy@4.0.3: {} - is-module@1.0.0: {} + fast-decode-uri-component@1.0.1: {} - is-negative-zero@2.0.3: {} + fast-deep-equal@3.1.3: {} - is-number-object@1.1.1: + fast-json-stringify@6.4.0: dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + '@fastify/merge-json-schemas': 0.2.1 + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + fast-uri: 3.1.2 + json-schema-ref-resolver: 3.0.0 + rfdc: 1.4.1 - is-number@7.0.0: {} + fast-jwt@6.3.2: + dependencies: + '@lukeed/ms': 2.0.2 + asn1.js: 5.4.1 + ecdsa-sig-formatter: 1.0.11 + mnemonist: 0.40.4 + safe-regex2: 5.1.1 - is-obj@1.0.1: {} + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 - is-path-cwd@2.2.0: {} + fast-safe-stringify@2.1.1: {} - is-path-in-cwd@2.1.0: - dependencies: - is-path-inside: 2.1.0 + fast-uri@3.1.2: {} - is-path-inside@2.1.0: + fastfall@1.5.1: dependencies: - path-is-inside: 1.0.2 + reusify: 1.1.0 - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + fastify-plugin@5.1.0: {} - is-regexp@1.0.0: {} + fastify-plugin@6.0.0: {} - is-set@2.0.3: {} + fastify-type-provider-zod@6.1.0(@fastify/swagger@9.7.0)(fastify@5.8.5)(openapi-types@12.1.3)(zod@4.4.3): + dependencies: + '@fastify/error': 4.2.0 + '@fastify/swagger': 9.7.0 + fastify: 5.8.5 + openapi-types: 12.1.3 + zod: 4.4.3 - is-shared-array-buffer@1.0.4: + fastify@5.8.5: dependencies: - call-bound: 1.0.4 + '@fastify/ajv-compiler': 4.0.5 + '@fastify/error': 4.2.0 + '@fastify/fast-json-stringify-compiler': 5.0.3 + '@fastify/proxy-addr': 5.1.0 + abstract-logging: 2.0.1 + avvio: 9.2.0 + fast-json-stringify: 6.4.0 + find-my-way: 9.6.0 + light-my-request: 6.6.0 + pino: 10.3.1 + process-warning: 5.0.0 + rfdc: 1.4.1 + secure-json-parse: 4.1.0 + semver: 7.8.1 + toad-cache: 3.7.1 - is-stream@2.0.1: {} + fastparallel@2.4.1: + dependencies: + reusify: 1.1.0 + xtend: 4.0.2 - is-string@1.1.1: + fastq@1.20.1: dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + reusify: 1.1.0 - is-symbol@1.1.1: + fastseries@1.7.2: dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 + reusify: 1.1.0 + xtend: 4.0.2 - is-typed-array@1.1.15: + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fill-range@7.1.1: dependencies: - which-typed-array: 1.1.19 + to-regex-range: 5.0.1 - is-weakmap@2.0.2: {} + find-my-way@9.6.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 5.1.1 - is-weakref@1.1.1: + fix-dts-default-cjs-exports@1.0.1: dependencies: - call-bound: 1.0.4 + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.61.0 - is-weakset@2.0.4: + framer-motion@9.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 - is-what@4.1.16: {} + fsevents@2.3.3: + optional: true - isarray@2.0.5: {} + get-nonce@1.0.1: {} - jake@10.9.4: + get-tsconfig@4.14.0: dependencies: - async: 3.2.6 - filelist: 1.0.4 - picocolors: 1.1.1 + resolve-pkg-maps: 1.0.0 - jest-worker@26.6.2: + glob-parent@5.1.2: dependencies: - '@types/node': 18.15.12 - merge-stream: 2.0.0 - supports-color: 7.2.0 + is-glob: 4.0.3 - jest-worker@27.5.1: + goober@2.1.19(csstype@3.2.3): dependencies: - '@types/node': 18.15.12 - merge-stream: 2.0.0 - supports-color: 8.1.1 + csstype: 3.2.3 - jiti@2.6.1: {} + has-flag@3.0.0: {} - js-tokens@4.0.0: {} + help-me@5.0.0: {} + + idb@7.1.1: {} - jsesc@3.1.0: {} + ignore-by-default@1.0.1: {} - json-parse-even-better-errors@2.3.1: {} + immutable@5.1.5: + optional: true - json-schema-traverse@0.4.1: {} + inherits@2.0.4: {} - json-schema-traverse@1.0.0: {} + ipaddr.js@2.4.0: {} - json-schema@0.4.0: {} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 - json5@2.2.3: {} + is-extglob@2.1.1: {} - jsonfile@6.2.0: + is-glob@4.0.3: dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 + is-extglob: 2.1.1 - jsonpointer@5.0.1: {} + is-number@7.0.0: {} - leven@3.1.0: {} + is-what@4.1.16: {} - lightningcss-android-arm64@1.30.2: - optional: true + joycon@3.1.1: {} - lightningcss-darwin-arm64@1.30.2: - optional: true + js-tokens@4.0.0: {} - lightningcss-darwin-x64@1.30.2: - optional: true + json-schema-ref-resolver@3.0.0: + dependencies: + dequal: 2.0.3 - lightningcss-freebsd-x64@1.30.2: - optional: true + json-schema-resolver@3.0.0: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + fast-uri: 3.1.2 + rfdc: 1.4.1 + transitivePeerDependencies: + - supports-color - lightningcss-linux-arm-gnueabihf@1.30.2: - optional: true + json-schema-traverse@1.0.0: {} - lightningcss-linux-arm64-gnu@1.30.2: - optional: true + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.8.1 - lightningcss-linux-arm64-musl@1.30.2: - optional: true + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 - lightningcss-linux-x64-gnu@1.30.2: - optional: true + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 - lightningcss-linux-x64-musl@1.30.2: - optional: true + light-my-request@6.6.0: + dependencies: + cookie: 1.1.1 + process-warning: 4.0.1 + set-cookie-parser: 2.7.2 - lightningcss-win32-arm64-msvc@1.30.2: - optional: true + lilconfig@3.1.3: {} - lightningcss-win32-x64-msvc@1.30.2: - optional: true + lines-and-columns@1.2.4: {} - lightningcss@1.30.2: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 - - linkify-it@5.0.0: + linkify-it@5.0.1: dependencies: uc.micro: 2.1.0 - loader-runner@4.3.1: {} + load-tsconfig@0.2.5: {} - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 + lodash.includes@4.3.0: {} - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 + lodash.isboolean@3.0.3: {} - lodash.debounce@4.0.8: {} + lodash.isinteger@4.0.4: {} - lodash.sortby@4.7.0: {} + lodash.isnumber@3.0.3: {} - lodash@4.17.21: {} + lodash.isplainobject@4.0.6: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 + lodash.isstring@4.0.1: {} - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 + lodash.once@4.1.1: {} - magic-string@0.25.9: + loose-envify@1.4.0: dependencies: - sourcemap-codec: 1.4.8 + js-tokens: 4.0.0 magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - make-dir@3.1.0: - dependencies: - semver: 6.3.1 + make-error@1.3.6: {} - markdown-it@14.1.0: + markdown-it@14.2.0: dependencies: argparse: 2.0.1 entities: 4.5.0 - linkify-it: 5.0.0 + linkify-it: 5.0.1 mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 - math-intrinsics@1.1.0: {} - mdurl@2.0.0: {} - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} + minimalistic-assert@1.0.1: {} - mime-types@2.1.35: + minimatch@10.2.5: dependencies: - mime-db: 1.52.0 + brace-expansion: 5.0.6 - minimatch@10.1.1: - dependencies: - '@isaacs/brace-expansion': 5.0.0 + minimist@1.2.8: {} - minimatch@3.1.2: + mlly@1.8.2: dependencies: - brace-expansion: 1.1.12 + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 - minimatch@5.1.6: + mnemonist@0.40.4: dependencies: - brace-expansion: 2.0.2 + obliterator: 2.0.5 ms@2.1.3: {} - nanoid@3.3.11: {} - - neo-async@2.6.2: {} - - next-pwa@5.6.0(@babel/core@7.28.5)(next@16.1.1(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.94.2))(webpack@5.82.0): + mz@2.7.0: dependencies: - babel-loader: 8.4.1(@babel/core@7.28.5)(webpack@5.82.0) - clean-webpack-plugin: 4.0.0(webpack@5.82.0) - globby: 11.1.0 - next: 16.1.1(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.94.2) - terser-webpack-plugin: 5.3.15(webpack@5.82.0) - workbox-webpack-plugin: 6.6.0(webpack@5.82.0) - workbox-window: 6.6.0 - transitivePeerDependencies: - - '@babel/core' - - '@swc/core' - - '@types/babel__core' - - esbuild - - supports-color - - uglify-js - - webpack + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 - next@16.1.1(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.94.2): + nanoid@3.3.12: {} + + next@16.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.100.0): dependencies: - '@next/env': 16.1.1 + '@next/env': 16.2.6 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.9.4 - caniuse-lite: 1.0.30001759 + baseline-browser-mapping: 2.10.32 + caniuse-lite: 1.0.30001793 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.6(@babel/core@7.28.5)(react@18.2.0) + styled-jsx: 5.1.6(react@18.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.1 - '@next/swc-darwin-x64': 16.1.1 - '@next/swc-linux-arm64-gnu': 16.1.1 - '@next/swc-linux-arm64-musl': 16.1.1 - '@next/swc-linux-x64-gnu': 16.1.1 - '@next/swc-linux-x64-musl': 16.1.1 - '@next/swc-win32-arm64-msvc': 16.1.1 - '@next/swc-win32-x64-msvc': 16.1.1 - sass: 1.94.2 + '@next/swc-darwin-arm64': 16.2.6 + '@next/swc-darwin-x64': 16.2.6 + '@next/swc-linux-arm64-gnu': 16.2.6 + '@next/swc-linux-arm64-musl': 16.2.6 + '@next/swc-linux-x64-gnu': 16.2.6 + '@next/swc-linux-x64-musl': 16.2.6 + '@next/swc-win32-arm64-msvc': 16.2.6 + '@next/swc-win32-x64-msvc': 16.2.6 + sass: 1.100.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -5672,94 +4388,108 @@ snapshots: node-addon-api@7.1.1: optional: true - node-releases@2.0.27: {} + nodemon@3.1.14: + dependencies: + chokidar: 3.6.0 + debug: 4.4.3(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 10.2.5 + pstree.remy: 1.1.8 + semver: 7.8.1 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + + normalize-path@3.0.0: {} object-assign@4.1.1: {} - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} + obliterator@2.0.5: {} - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 + on-exit-leak-free@2.1.2: {} once@1.4.0: dependencies: wrappy: 1.0.2 - orderedmap@2.1.1: {} - - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-map@2.1.0: {} - - p-try@2.2.0: {} + openapi-types@12.1.3: {} - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-is-inside@1.0.2: {} - - path-parse@1.0.7: {} + orderedmap@2.1.1: {} - path-type@4.0.0: {} + pathe@2.0.3: {} picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - pify@2.3.0: {} + picomatch@4.0.4: {} - pify@4.0.1: {} + pino-abstract-transport@3.0.0: + dependencies: + split2: 4.2.0 - pinkie-promise@2.0.1: + pino-pretty@13.1.3: dependencies: - pinkie: 2.0.4 + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 4.0.3 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pump: 3.0.4 + secure-json-parse: 4.1.0 + sonic-boom: 4.2.1 + strip-json-comments: 5.0.3 - pinkie@2.0.4: {} + pino-std-serializers@7.1.0: {} - pkg-dir@4.2.0: + pino@10.3.1: dependencies: - find-up: 4.1.0 + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.1 + thread-stream: 4.2.0 - possible-typed-array-names@1.1.0: {} + pirates@4.0.7: {} - postcss-value-parser@4.2.0: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 - postcss@8.4.31: + postcss-load-config@6.0.1(postcss@8.4.31)(tsx@4.22.3)(yaml@2.9.0): dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.4.31 + tsx: 4.22.3 + yaml: 2.9.0 - postcss@8.5.6: + postcss@8.4.31: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 + postgres@3.4.9: {} + prettier@2.8.8: {} - pretty-bytes@5.6.0: {} + process-warning@4.0.1: {} + + process-warning@5.0.0: {} prop-types@15.8.1: dependencies: @@ -5767,9 +4497,9 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - prosemirror-changeset@2.3.1: + prosemirror-changeset@2.4.1: dependencies: - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.12.0 prosemirror-collab@1.3.1: dependencies: @@ -5777,112 +4507,109 @@ snapshots: prosemirror-commands@1.7.1: dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.12.0 prosemirror-dropcursor@1.8.2: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 - prosemirror-gapcursor@1.4.0: + prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.4 + prosemirror-view: 1.41.8 prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.12.0 prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.2: + prosemirror-markdown@1.13.4: dependencies: '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 - prosemirror-model: 1.25.4 + markdown-it: 14.2.0 + prosemirror-model: 1.25.7 - prosemirror-menu@1.2.5: + prosemirror-menu@1.3.2: dependencies: crelt: 1.0.6 prosemirror-commands: 1.7.1 prosemirror-history: 1.5.0 prosemirror-state: 1.4.4 - prosemirror-model@1.25.4: + prosemirror-model@1.25.7: dependencies: orderedmap: 2.1.1 prosemirror-schema-basic@1.2.4: dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.7 prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.12.0 prosemirror-state@1.4.4: dependencies: - prosemirror-model: 1.25.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.4 + prosemirror-model: 1.25.7 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 - prosemirror-tables@1.8.3: + prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 - prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4): + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8): dependencies: '@remirror/core-constants': 3.0.0 escape-string-regexp: 4.0.0 - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.4 + prosemirror-view: 1.41.8 - prosemirror-transform@1.10.5: + prosemirror-transform@1.12.0: dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.7 - prosemirror-view@1.41.4: + prosemirror-view@1.41.8: dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 - - punycode.js@2.3.1: {} + prosemirror-transform: 1.12.0 - punycode@2.3.1: {} + pstree.remy@1.1.8: {} - queue-microtask@1.2.3: {} - - randombytes@2.1.0: + pump@3.0.4: dependencies: - safe-buffer: 5.2.1 + end-of-stream: 1.4.5 + once: 1.4.0 - react-content-loader@6.2.1(react@18.2.0): - dependencies: - react: 18.2.0 + punycode.js@2.3.1: {} + + quick-format-unescaped@4.0.4: {} react-dom@18.2.0(react@18.2.0): dependencies: @@ -5893,27 +4620,52 @@ snapshots: react-hot-toast@2.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: csstype: 3.2.3 - goober: 2.1.18(csstype@3.2.3) + goober: 2.1.19(csstype@3.2.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-icons@4.12.0(react@18.2.0): + react-is@16.13.1: {} + + react-number-format@5.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - react-is@16.13.1: {} + react-remove-scroll-bar@2.3.8(@types/react@18.0.37)(react@18.2.0): + dependencies: + react: 18.2.0 + react-style-singleton: 2.2.3(@types/react@18.0.37)(react@18.2.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.0.37 - react-is@18.3.1: {} + react-remove-scroll@2.7.2(@types/react@18.0.37)(react@18.2.0): + dependencies: + react: 18.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@18.0.37)(react@18.2.0) + react-style-singleton: 2.2.3(@types/react@18.0.37)(react@18.2.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.0.37)(react@18.2.0) + use-sidecar: 1.1.3(@types/react@18.0.37)(react@18.2.0) + optionalDependencies: + '@types/react': 18.0.37 - react-loader-spinner@5.4.5(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-style-singleton@2.2.3(@types/react@18.0.37)(react@18.2.0): dependencies: + get-nonce: 1.0.1 react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is: 18.3.1 - styled-components: 5.3.11(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) - styled-tools: 1.7.2 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.0.37 + + react-textarea-autosize@8.5.9(@types/react@18.0.37)(react@18.2.0): + dependencies: + '@babel/runtime': 7.29.2 + react: 18.2.0 + use-composed-ref: 1.4.0(@types/react@18.0.37)(react@18.2.0) + use-latest: 1.3.0(@types/react@18.0.37)(react@18.2.0) transitivePeerDependencies: - - '@babel/core' + - '@types/react' react-toggle@4.1.3(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: @@ -5926,177 +4678,100 @@ snapshots: dependencies: loose-envify: 1.4.0 - readdirp@4.1.2: {} - - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regenerate-unicode-properties@10.2.2: + readdirp@3.6.0: dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} + picomatch: 2.3.2 - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 + readdirp@4.1.2: {} - regexpu-core@6.4.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.2 - regjsgen: 0.8.0 - regjsparser: 0.13.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.1 + readdirp@5.0.0: + optional: true - regjsgen@0.8.0: {} + real-require@0.2.0: {} - regjsparser@0.13.0: - dependencies: - jsesc: 3.1.0 + real-require@1.0.0: {} remove-accents@0.5.0: {} require-from-string@2.0.2: {} - resolve@1.22.11: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + ret@0.5.0: {} reusify@1.1.0: {} - rimraf@2.7.1: - dependencies: - glob: 7.2.3 + rfdc@1.4.1: {} - rollup-plugin-terser@7.0.2(rollup@2.79.2): + rollup@4.61.0: dependencies: - '@babel/code-frame': 7.27.1 - jest-worker: 26.6.2 - rollup: 2.79.2 - serialize-javascript: 4.0.0 - terser: 5.44.1 - - rollup@2.79.2: + '@types/estree': 1.0.9 optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.61.0 + '@rollup/rollup-android-arm64': 4.61.0 + '@rollup/rollup-darwin-arm64': 4.61.0 + '@rollup/rollup-darwin-x64': 4.61.0 + '@rollup/rollup-freebsd-arm64': 4.61.0 + '@rollup/rollup-freebsd-x64': 4.61.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.0 + '@rollup/rollup-linux-arm-musleabihf': 4.61.0 + '@rollup/rollup-linux-arm64-gnu': 4.61.0 + '@rollup/rollup-linux-arm64-musl': 4.61.0 + '@rollup/rollup-linux-loong64-gnu': 4.61.0 + '@rollup/rollup-linux-loong64-musl': 4.61.0 + '@rollup/rollup-linux-ppc64-gnu': 4.61.0 + '@rollup/rollup-linux-ppc64-musl': 4.61.0 + '@rollup/rollup-linux-riscv64-gnu': 4.61.0 + '@rollup/rollup-linux-riscv64-musl': 4.61.0 + '@rollup/rollup-linux-s390x-gnu': 4.61.0 + '@rollup/rollup-linux-x64-gnu': 4.61.0 + '@rollup/rollup-linux-x64-musl': 4.61.0 + '@rollup/rollup-openbsd-x64': 4.61.0 + '@rollup/rollup-openharmony-arm64': 4.61.0 + '@rollup/rollup-win32-arm64-msvc': 4.61.0 + '@rollup/rollup-win32-ia32-msvc': 4.61.0 + '@rollup/rollup-win32-x64-gnu': 4.61.0 + '@rollup/rollup-win32-x64-msvc': 4.61.0 fsevents: 2.3.3 rope-sequence@1.3.4: {} - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: + safe-regex2@5.1.1: dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 + ret: 0.5.0 - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} - sass@1.94.2: + sass@1.100.0: dependencies: - chokidar: 4.0.3 - immutable: 5.1.4 + chokidar: 5.0.0 + immutable: 5.1.5 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.1 + '@parcel/watcher': 2.5.6 + optional: true scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - schema-utils@2.7.1: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@4.3.3: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - - semver@6.3.1: {} - - semver@7.7.3: - optional: true - - serialize-javascript@4.0.0: - dependencies: - randombytes: 2.1.0 - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + secure-json-parse@4.1.0: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 + semver@7.8.1: {} - shallowequal@1.1.0: {} + set-cookie-parser@2.7.2: {} sharp@0.34.5: dependencies: - '@img/colour': 1.0.0 + '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.7.3 + semver: 7.8.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -6124,37 +4799,13 @@ snapshots: '@img/sharp-win32-x64': 0.34.5 optional: true - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: + simple-update-notifier@2.0.0: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 + semver: 7.8.1 - side-channel@1.1.0: + sonic-boom@4.2.1: dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - slash@3.0.0: {} - - source-list-map@2.0.1: {} + atomic-sleep: 1.0.0 source-map-js@1.2.1: {} @@ -6165,90 +4816,34 @@ snapshots: source-map@0.6.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - - sourcemap-codec@1.4.8: {} - - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + source-map@0.7.6: {} - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + split2@4.2.0: {} - stringify-object@3.3.0: + steed@1.1.3: dependencies: - get-own-enumerable-property-symbols: 3.0.2 - is-obj: 1.0.1 - is-regexp: 1.0.0 - - strip-comments@2.0.1: {} + fastfall: 1.5.1 + fastparallel: 2.4.1 + fastq: 1.20.1 + fastseries: 1.7.2 + reusify: 1.1.0 - styled-components@5.3.11(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0): - dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/traverse': 7.28.5(supports-color@5.5.0) - '@emotion/is-prop-valid': 1.4.0 - '@emotion/stylis': 0.8.5 - '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.28.5)(styled-components@5.3.11(@babel/core@7.28.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(supports-color@5.5.0) - css-to-react-native: 3.2.0 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is: 18.3.1 - shallowequal: 1.1.0 - supports-color: 5.5.0 - transitivePeerDependencies: - - '@babel/core' + strip-json-comments@5.0.3: {} - styled-jsx@5.1.6(@babel/core@7.28.5)(react@18.2.0): + styled-jsx@5.1.6(react@18.2.0): dependencies: client-only: 0.0.1 react: 18.2.0 - optionalDependencies: - '@babel/core': 7.28.5 - styled-tools@1.7.2: {} + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 superjson@1.13.3: dependencies: @@ -6258,46 +4853,26 @@ snapshots: dependencies: has-flag: 3.0.0 - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 + tabbable@6.4.0: {} - supports-color@8.1.1: + thenify-all@1.6.0: dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - tabbable@6.3.0: {} + thenify: 3.3.1 - tailwindcss@4.1.18: {} - - tapable@2.3.0: {} - - temp-dir@2.0.0: {} - - tempy@0.6.0: + thenify@3.3.1: dependencies: - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 + any-promise: 1.3.0 - terser-webpack-plugin@5.3.15(webpack@5.82.0): + thread-stream@4.2.0: dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.44.1 - webpack: 5.82.0 + real-require: 1.0.0 - terser@5.44.1: + tinyexec@0.3.2: {} + + tinyglobby@0.2.17: dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tippy.js@6.3.7: dependencies: @@ -6307,321 +4882,135 @@ snapshots: dependencies: is-number: 7.0.0 - toggle-selection@1.0.6: {} - - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tslib@2.8.1: {} + toad-cache@3.7.1: {} - type-fest@0.16.0: {} + toggle-selection@1.0.6: {} - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 + touch@3.1.1: {} - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 + tree-kill@1.2.2: {} - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 + ts-interface-checker@0.1.13: {} - typed-array-length@1.0.7: + ts-node@10.9.2(@types/node@25.9.1)(typescript@6.0.3): dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - - typescript@5.9.3: {} + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 25.9.1 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 6.0.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 - uc.micro@2.1.0: {} + tslib@2.8.1: {} - unbox-primitive@1.1.0: + tsup@8.5.1(postcss@8.4.31)(tsx@4.22.3)(typescript@6.0.3)(yaml@2.9.0): dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - - unicode-canonical-property-names-ecmascript@2.0.1: {} + bundle-require: 5.1.0(esbuild@0.27.7) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3(supports-color@5.5.0) + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.4.31)(tsx@4.22.3)(yaml@2.9.0) + resolve-from: 5.0.0 + rollup: 4.61.0 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.31 + typescript: 6.0.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml - unicode-match-property-ecmascript@2.0.0: + tsx@4.22.3: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.2.0 + esbuild: 0.28.0 + optionalDependencies: + fsevents: 2.3.3 - unicode-match-property-value-ecmascript@2.2.1: {} + type-fest@4.41.0: {} - unicode-property-aliases-ecmascript@2.2.0: {} + typescript@5.9.3: {} - unique-string@2.0.0: - dependencies: - crypto-random-string: 2.0.0 + typescript@6.0.3: {} - universalify@2.0.1: {} + uc.micro@2.1.0: {} - upath@1.2.0: {} + ufo@1.6.4: {} - update-browserslist-db@1.2.2(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 + undefsafe@2.0.5: {} - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 + undici-types@7.24.6: {} - use-debounce@9.0.4(react@18.2.0): + use-callback-ref@1.3.3(@types/react@18.0.37)(react@18.2.0): dependencies: react: 18.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.0.37 - use-sync-external-store@1.6.0(react@18.2.0): + use-composed-ref@1.4.0(@types/react@18.0.37)(react@18.2.0): dependencies: react: 18.2.0 + optionalDependencies: + '@types/react': 18.0.37 - w3c-keyname@2.2.8: {} - - watchpack@2.4.4: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - webidl-conversions@4.0.2: {} - - webpack-sources@1.4.3: - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - - webpack-sources@3.3.3: {} - - webpack@5.82.0: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-assertions: 1.9.0(acorn@8.15.0) - browserslist: 4.28.1 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.15(webpack@5.82.0) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - workbox-background-sync@6.6.0: - dependencies: - idb: 7.1.1 - workbox-core: 6.6.0 - - workbox-broadcast-update@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-build@6.6.0: - dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.28.5 - '@babel/preset-env': 7.28.5(@babel/core@7.28.5) - '@babel/runtime': 7.28.4 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.5)(rollup@2.79.2) - '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.2) - '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) - '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.17.1 - common-tags: 1.8.2 - fast-json-stable-stringify: 2.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - lodash: 4.17.21 - pretty-bytes: 5.6.0 - rollup: 2.79.2 - rollup-plugin-terser: 7.0.2(rollup@2.79.2) - source-map: 0.8.0-beta.0 - stringify-object: 3.3.0 - strip-comments: 2.0.1 - tempy: 0.6.0 - upath: 1.2.0 - workbox-background-sync: 6.6.0 - workbox-broadcast-update: 6.6.0 - workbox-cacheable-response: 6.6.0 - workbox-core: 6.6.0 - workbox-expiration: 6.6.0 - workbox-google-analytics: 6.6.0 - workbox-navigation-preload: 6.6.0 - workbox-precaching: 6.6.0 - workbox-range-requests: 6.6.0 - workbox-recipes: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - workbox-streams: 6.6.0 - workbox-sw: 6.6.0 - workbox-window: 6.6.0 - transitivePeerDependencies: - - '@types/babel__core' - - supports-color - - workbox-cacheable-response@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-core@6.6.0: {} - - workbox-expiration@6.6.0: - dependencies: - idb: 7.1.1 - workbox-core: 6.6.0 - - workbox-google-analytics@6.6.0: - dependencies: - workbox-background-sync: 6.6.0 - workbox-core: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - - workbox-navigation-preload@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-precaching@6.6.0: - dependencies: - workbox-core: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - - workbox-range-requests@6.6.0: + use-isomorphic-layout-effect@1.2.1(@types/react@18.0.37)(react@18.2.0): dependencies: - workbox-core: 6.6.0 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.0.37 - workbox-recipes@6.6.0: + use-latest@1.3.0(@types/react@18.0.37)(react@18.2.0): dependencies: - workbox-cacheable-response: 6.6.0 - workbox-core: 6.6.0 - workbox-expiration: 6.6.0 - workbox-precaching: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 + react: 18.2.0 + use-isomorphic-layout-effect: 1.2.1(@types/react@18.0.37)(react@18.2.0) + optionalDependencies: + '@types/react': 18.0.37 - workbox-routing@6.6.0: + use-sidecar@1.1.3(@types/react@18.0.37)(react@18.2.0): dependencies: - workbox-core: 6.6.0 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.0.37 - workbox-strategies@6.6.0: + use-sync-external-store@1.6.0(react@18.2.0): dependencies: - workbox-core: 6.6.0 + react: 18.2.0 - workbox-streams@6.6.0: - dependencies: - workbox-core: 6.6.0 - workbox-routing: 6.6.0 + v8-compile-cache-lib@3.0.1: {} - workbox-sw@6.6.0: {} + w3c-keyname@2.2.8: {} - workbox-webpack-plugin@6.6.0(webpack@5.82.0): - dependencies: - fast-json-stable-stringify: 2.1.0 - pretty-bytes: 5.6.0 - upath: 1.2.0 - webpack: 5.82.0 - webpack-sources: 1.4.3 - workbox-build: 6.6.0 - transitivePeerDependencies: - - '@types/babel__core' - - supports-color + wrappy@1.0.2: {} - workbox-window@6.6.0: - dependencies: - '@types/trusted-types': 2.0.7 - workbox-core: 6.6.0 + xtend@4.0.2: {} - wrappy@1.0.2: {} + yaml@2.9.0: {} - ws@8.18.3: {} + yn@3.1.1: {} - yallist@3.1.1: {} + zod@4.4.3: {} zustand@4.5.7(@types/react@18.0.37)(react@18.2.0): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..3d0fc88 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,10 @@ +packages: + - "apps/*" + - "packages/*" +syncInjectedDepsAfterScripts: + - build +injectWorkspacePackages: true +allowBuilds: + "sharp": true + "esbuild": true + "@parcel/watcher": true diff --git a/postcss.config.mjs b/postcss.config.mjs deleted file mode 100644 index 5d6d845..0000000 --- a/postcss.config.mjs +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('postcss-load-config').Config} */ -const config = { - plugins: { - '@tailwindcss/postcss': {}, - }, -}; - -export default config; diff --git a/styles/globals.scss b/styles/globals.scss deleted file mode 100644 index 7b24c65..0000000 --- a/styles/globals.scss +++ /dev/null @@ -1,138 +0,0 @@ -:root { - // --font-color: #f8f9f9; - // --font-color-light: #213547; - // --bg: black; //change this - // --bg-light: #eff2f1; - // --button-bg: #4b4c4c; - // --button-bg-light: #1a1a1a; - // --button-font-color: #; - // --button-font-color-light: #e6e6e6; - --weak-border: #0b0e0d1c; - /** CSS DARK THEME PRIMARY COLORS */ - --color-primary-100: #eff2f1; - --color-primary-200: #f1f3f3; - --color-primary-300: #f3f5f4; - --color-primary-400: #f4f6f6; - --color-primary-500: #f6f8f7; - --color-primary-600: #f8f9f9; - - /* --color-primary-100: #eff2f1; */ - /* --color-primary-200: #babcbc; */ - /* --color-primary-300: #888a89; */ - /* --color-primary-400: #595a5a; */ - /* --color-primary-500: #2e2e2e; */ - /* --color-primary-600: #000000; */ - - /** CSS DARK THEME SURFACE COLORS */ - --color-surface-100: #0b0e0d; - --color-surface-200: #232524; - --color-surface-300: #3a3c3b; - --color-surface-400: #535554; - --color-surface-500: #6d6f6e; - --color-surface-600: #898a89; - - // note background colors - // --note-bg-default: var(--color-surface-200); - --note-bg-light-1: #ffc6c6; - --note-bg-light-2: #dbd5ff; - --note-bg-dark-1: #0d5c63; - --note-bg-dark-2: #241623; - --note-bg-dark-3: #071e22; - --note-bg-dark-4: var(--color-surface-200); - color: var(--color-primary-100); - background-color: var(--color-surface-100); - - font-family: Inter, Avenir, Helvetica, Arial, sans-serif; - color-scheme: light dark; - box-sizing: border-box; - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; - transition: color 0.3s, background-color 0.3s; -} - -/* Tailwind base/components/utilities - required for daisyUI classes after Tailwind is installed */ -@tailwind base; -@tailwind components; -@tailwind utilities; - -html, -body { - margin: 0; - width: 100%; - height: 100%; -} - -#__next { - min-height: 100%; - min-width: 100%; - // background: var(); -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -// settings for light mode -@media (prefers-color-scheme: light) { - :root { - color: var(--color-surface-100); - background-color: var(--color-primary-100); - } -} - -#root { - height: 100%; -} -#root, -.App { - margin: 0; - display: flex; - flex-flow: column; - flex-grow: 1; -} - -.icon_button { - position: relative; - background-color: transparent; - // padding: 0.5rem; - border-radius: 10px; - width: 1.5rem; - height: 1.5rem; - border: 1px solid transparent; - &:active { - background: rgba(135, 141, 141, 0.441); - mix-blend-mode: difference; - } - &:hover { - background: rgba(135, 141, 141, 0.25); - mix-blend-mode: difference; - backdrop-filter: blur(4px); - -webkit-backdrop-filter: blur(4px); - border-radius: 10px; - } - svg { - position: absolute; - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - } -} - -/* -Dark/Mixed - 100: For body background color - -Dark/Mixed - 200: For cards background color - -Dark/Mixed - 300: For chips buttons, dropdowns background color - -Dark/Mixed - 400: For sidebars, navbar background color - -Dark/Mixed - 500: For modal, dialogs background color - -Dark/Mixed - 600: For on background texts color -*/ diff --git a/tailwind.config.mjs b/tailwind.config.mjs deleted file mode 100644 index 3dcaa88..0000000 --- a/tailwind.config.mjs +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - content: [ - './pages/**/*.{js,ts,jsx,tsx}', - './components/**/*.{js,ts,jsx,tsx}', - './apps/**/*.{js,ts,jsx,tsx}', - './packages/**/*.{js,ts,jsx,tsx}', - './src/**/*.{js,ts,jsx,tsx}' - ], - theme: { - extend: {}, - }, - plugins: [require('daisyui')], - daisyui: { - styled: true, - themes: true, - base: true, - utils: true, - logs: false, - rtl: false, - }, -}; diff --git a/types/Note.ts b/types/Note.ts deleted file mode 100644 index 6daf79a..0000000 --- a/types/Note.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { UseMutateFunction } from '@tanstack/react-query'; -import { Editor } from '@tiptap/react'; -import { MouseEventHandler, MutableRefObject } from 'react'; - - -export interface NoteContent { - note_title: string; - note_content: string; - color: string; - active?: boolean; -} -export interface Note extends NoteContent { - id: string; -} - -export type AddNoteParams = { - newNote: NoteContent, - creatorId: string | null -} - -type cbFn = () => void; - -export type AddNoteMutationParams = { - creatorId: string | null; - successCb?: cbFn; - errorCb?: cbFn; -}; - -export type DeleteNoteMutationParams = { - creatorId: string | null, - successCb?: cbFn, - errorCb?: cbFn -} - -export type UpdateNoteFn = (noteId: string, - newNote: { - note_title?: string; - note_content?: string; - color?: string; - active?: boolean; - }) => Promise; - - -export type DeleteMutation = UseMutateFunction; - -// might wanna change this to noteslist or notelist -export type NotesContextValue = { - addingNote: boolean; - addNote: MouseEventHandler; - deleteNote: DeleteMutation; - updateNote: UpdateNoteFn; -}; - -export type NoteContextType = { - note_title: string; - content: string; - editMode: boolean; - fsId: string; - color: string; - noteRef?: MutableRefObject; - setEditMode: (state: boolean) => void; - setColor: (color: string) => void -}; - -export type EditorContextType = { - editor: Editor | null -} \ No newline at end of file diff --git a/utils/supabase/db_operations.ts b/utils/supabase/db_operations.ts deleted file mode 100644 index febe793..0000000 --- a/utils/supabase/db_operations.ts +++ /dev/null @@ -1,99 +0,0 @@ -import type { Note, AddNoteParams, UpdateNoteFn } from "@/types/Note"; -import { supabase } from "./init"; - -// * note related db operations - -export const addNote = async (data: AddNoteParams): Promise => { - if (data.creatorId === null) { - return Promise.reject(new Error("Invalid creatorId")); - } - try { - const { note_content, note_title, color } = data.newNote; - const { data: result, error } = await supabase - .from("notes") - .insert([ - { - note_title, - note_content, - color, - timestamp: new Date().toISOString(), - creator: data.creatorId, - }, - ]) - .select() - .single(); - - if (error) { - throw error; - } - - const addedNote = result as Note; - return addedNote.id; - } catch (error) { - // console.error("Error adding document: ", error); - throw new Error("Failed to add note."); - } -}; - -export const getNotes = async (creatorId: string | null): Promise => { - if (creatorId === null || creatorId === "") { - return Promise.reject(new Error("Invalid creatorId")); - } - try { - const { data: notes, error } = await supabase - .from("notes") - .select("*") - .eq("creator", creatorId) - .order("timestamp", { ascending: false }); - - if (error) { - // console.log(error); - throw new Error(error.message); - } - return notes as Note[]; - } catch (error) { - // console.log(error); - // console.log(error); - throw new Error("Failed to fetch notes"); - } -}; - -export const updateNote: UpdateNoteFn = async (noteId, newNote) => { - try { - const { data, error } = await supabase - .from("notes") - .update({ - ...newNote, - timestamp: new Date().toISOString(), - }) - .eq("id", noteId) - .single(); - - if (error) { - throw error; - } - - return data; - } catch (error) { - // console.log(error); - throw new Error("Updation Failed"); - } -}; - -export const deleteNote = async (noteId: string) => { - try { - const { data, error } = await supabase - .from("notes") - .delete() - .eq("id", noteId); - - if (error) { - throw error; - } - - return data; - } catch (error) { - // console.log(error); - throw new Error("Deletion Failed"); - } -}; diff --git a/utils/supabase/init.ts b/utils/supabase/init.ts deleted file mode 100644 index a6cdd8b..0000000 --- a/utils/supabase/init.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { createClient } from "@supabase/supabase-js"; - -const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!; -const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! ; - -export const supabase = createClient(supabaseUrl, supabaseKey); \ No newline at end of file