From 4addadb035acd2eb6f079b178e618e2d930ab2fa Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sun, 18 May 2025 15:34:12 +0800 Subject: [PATCH 01/24] update: the style in content.css --- packages/frontend/src/styles/content.css | 33 ------------------------ 1 file changed, 33 deletions(-) diff --git a/packages/frontend/src/styles/content.css b/packages/frontend/src/styles/content.css index dde9717..0ae7e49 100644 --- a/packages/frontend/src/styles/content.css +++ b/packages/frontend/src/styles/content.css @@ -1,14 +1,6 @@ @import "tailwindcss"; .content { - @apply text-gray-800 dark:text-zinc-100; - - h1, - h2, - h3, - h4 { - @apply font-medium text-gray-900 dark:text-white my-4; - } h1 { @apply text-3xl; @@ -30,10 +22,6 @@ @apply my-4; } - a { - @apply text-slate-800 dark:text-sky-300 hover:underline; - } - ul { @apply list-disc list-inside my-4; } @@ -46,27 +34,6 @@ @apply my-2; } - blockquote { - @apply border-l-4 border-gray-300 pl-4 italic my-4; - } - - code { - @apply bg-gray-100 text-gray-800 rounded px-1 duration-300; - } - - pre { - @apply bg-gray-100 p-4 rounded overflow-x-auto my-4 duration-300 h-0; - } - - table { - @apply w-full border-collapse my-4; - } - - th, - td { - @apply border border-gray-300 p-2; - } - th { @apply bg-gray-200 font-medium; } From f003e77d522c1c902d7ce69807a54aafb578bbd0 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sun, 18 May 2025 20:55:51 +0800 Subject: [PATCH 02/24] add: text fields and button in signup page --- packages/backend/middleware/index.ts | 2 + .../frontend/src/components/Dialog.svelte | 3 + .../src/components/NavigationDrawer.svelte | 17 ++- .../frontend/src/components/Portal.svelte | 8 ++ .../RegisterPage/RegisterForm.svelte | 78 ++++++++++++ .../frontend/src/components/TextField.svelte | 72 +++++++++++ .../src/components/TitleBarMobile.svelte | 33 ++--- .../src/components/icon/LeftArrow.astro | 8 ++ .../src/components/icon/LoadingSpinner.svelte | 15 +++ .../src/components/icon/MenuIcon.svelte | 13 +- .../src/components/icon/RightArrow.astro | 2 +- packages/frontend/src/lib/vdf.ts | 113 ++++++++++++++++++ .../frontend/src/pages/register/index.astro | 25 ++-- packages/frontend/tsconfig.json | 4 +- 14 files changed, 345 insertions(+), 48 deletions(-) create mode 100644 packages/frontend/src/components/Dialog.svelte create mode 100644 packages/frontend/src/components/Portal.svelte create mode 100644 packages/frontend/src/components/RegisterPage/RegisterForm.svelte create mode 100644 packages/frontend/src/components/TextField.svelte create mode 100644 packages/frontend/src/components/icon/LeftArrow.astro create mode 100644 packages/frontend/src/components/icon/LoadingSpinner.svelte create mode 100644 packages/frontend/src/lib/vdf.ts diff --git a/packages/backend/middleware/index.ts b/packages/backend/middleware/index.ts index 6f8e411..1aa05ca 100644 --- a/packages/backend/middleware/index.ts +++ b/packages/backend/middleware/index.ts @@ -8,8 +8,10 @@ import { logger } from "./logger.ts"; import { timing } from "hono/timing"; import { contentType } from "./contentType.ts"; import { captchaMiddleware } from "./captcha.ts"; +import { cors } from 'hono/cors'; export function configureMiddleWares(app: Hono<{ Variables: Variables }>) { + app.all("*", cors()); app.use("*", contentType); app.use(timing()); app.use("*", preetifyResponse); diff --git a/packages/frontend/src/components/Dialog.svelte b/packages/frontend/src/components/Dialog.svelte new file mode 100644 index 0000000..fd9d191 --- /dev/null +++ b/packages/frontend/src/components/Dialog.svelte @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/packages/frontend/src/components/NavigationDrawer.svelte b/packages/frontend/src/components/NavigationDrawer.svelte index 404c883..a13ebf2 100644 --- a/packages/frontend/src/components/NavigationDrawer.svelte +++ b/packages/frontend/src/components/NavigationDrawer.svelte @@ -6,7 +6,6 @@ export let show: boolean = false; export let onClose: () => void; - let drawer: HTMLDivElement; let cover: HTMLDivElement; onMount(() => { @@ -27,19 +26,17 @@
{#if show} {/if} diff --git a/packages/frontend/src/components/Portal.svelte b/packages/frontend/src/components/Portal.svelte new file mode 100644 index 0000000..a838ebd --- /dev/null +++ b/packages/frontend/src/components/Portal.svelte @@ -0,0 +1,8 @@ + + +
+ +
\ No newline at end of file diff --git a/packages/frontend/src/components/RegisterPage/RegisterForm.svelte b/packages/frontend/src/components/RegisterPage/RegisterForm.svelte new file mode 100644 index 0000000..c01471d --- /dev/null +++ b/packages/frontend/src/components/RegisterPage/RegisterForm.svelte @@ -0,0 +1,78 @@ + + +
+ + + + + \ No newline at end of file diff --git a/packages/frontend/src/components/TextField.svelte b/packages/frontend/src/components/TextField.svelte new file mode 100644 index 0000000..66b649c --- /dev/null +++ b/packages/frontend/src/components/TextField.svelte @@ -0,0 +1,72 @@ + + +
+
+
+
+ +
+ + {labelText} + +
+ +
+
+ + focus = true} + onblur={() => focus = false} + oninput={onValueChange} + type={type} + /> +
+ {#if supportingText || maxChar} +
+ {#if supportingText} + + {supportingText} + + {/if} + {#if maxChar} + + {inputText.length}/{maxChar} + + {/if} +
+ {/if} +
diff --git a/packages/frontend/src/components/TitleBarMobile.svelte b/packages/frontend/src/components/TitleBarMobile.svelte index 105aacc..ee1d7ff 100644 --- a/packages/frontend/src/components/TitleBarMobile.svelte +++ b/packages/frontend/src/components/TitleBarMobile.svelte @@ -9,6 +9,7 @@ import HomeIcon from "@components/icon/HomeIcon.svelte"; import InfoIcon from "@components/icon/InfoIcon.svelte"; import RegisterIcon from "@components/icon/RegisterIcon.svelte"; + import Portal from "@components/Portal.svelte"; let searchBox: SearchBox | null = null; let showSearchBox = false; @@ -19,22 +20,24 @@ } - showDrawer = false}> -
-
- - 首页 + + showDrawer = false}> +
+
+ + 首页 +
+
+ + 关于 +
+
+ + 注册 +
-
- - 关于 -
-
- - 注册 -
-
- + +
{#if !showSearchBox} diff --git a/packages/frontend/src/components/icon/LeftArrow.astro b/packages/frontend/src/components/icon/LeftArrow.astro new file mode 100644 index 0000000..975fceb --- /dev/null +++ b/packages/frontend/src/components/icon/LeftArrow.astro @@ -0,0 +1,8 @@ +--- +const { ...props } = Astro.props; +--- + + + diff --git a/packages/frontend/src/components/icon/LoadingSpinner.svelte b/packages/frontend/src/components/icon/LoadingSpinner.svelte new file mode 100644 index 0000000..bceffda --- /dev/null +++ b/packages/frontend/src/components/icon/LoadingSpinner.svelte @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + +
diff --git a/packages/frontend/src/components/icon/MenuIcon.svelte b/packages/frontend/src/components/icon/MenuIcon.svelte index 1c74e68..9522247 100644 --- a/packages/frontend/src/components/icon/MenuIcon.svelte +++ b/packages/frontend/src/components/icon/MenuIcon.svelte @@ -3,18 +3,7 @@
- - - Created with Pixso. - - - - - - - + - -
diff --git a/packages/frontend/src/components/icon/RightArrow.astro b/packages/frontend/src/components/icon/RightArrow.astro index b42a138..b4dc488 100644 --- a/packages/frontend/src/components/icon/RightArrow.astro +++ b/packages/frontend/src/components/icon/RightArrow.astro @@ -2,7 +2,7 @@ const {...props} = Astro.props; --- - + \ No newline at end of file diff --git a/packages/frontend/src/lib/vdf.ts b/packages/frontend/src/lib/vdf.ts new file mode 100644 index 0000000..edd623c --- /dev/null +++ b/packages/frontend/src/lib/vdf.ts @@ -0,0 +1,113 @@ + +// Define interfaces for input and output +interface VdfProgressCallback { + (progress: number): void; +} + +interface VdfResult { + result: bigint; + time: number; // Time taken in milliseconds +} + +// The content of the Web Worker script +const workerContent = `addEventListener("message", async (event) => { + const { g, N, difficulty } = event.data; + + // Although pow is not used in the iterative VDF, it's good to keep the original worker code structure. + // The iterative computeVDFWithProgress is better for progress reporting. + function pow(base, exponent, mod) { + let result = 1n; + base = base % mod; + while (exponent > 0n) { + if (exponent % 2n === 1n) { + result = (result * base) % mod; + } + base = (base * base) % mod; + exponent = exponent / 2n; + // Using BigInt division (/) which performs integer division + } + return result; + } + + // Compute VDF iteratively to report progress + function computeVDFWithProgress(g, N, T, postProgress) { + let result = g; + let latestTime = performance.now(); + const totalSteps = T; // T is the difficulty, representing 2^T squaring steps + + for (let i = 0n; i < totalSteps; i++) { + result = (result * result) % N; + // Report progress periodically (approx. every 16ms to match typical frame rate) + if (performance.now() - latestTime > 16) { + // Calculate progress as a percentage + const progress = Number((i + 1n) * 10000n / totalSteps) / 100; // Using 10000 for better precision before dividing by 100 + postProgress(progress); + latestTime = performance.now(); + } + } + // Ensure final progress is reported + postProgress(100); + return result; + } + + const startTime = performance.now(); + // The worker computes g^(2^difficulty) mod N. The loop runs 'difficulty' times, performing squaring. + const result = computeVDFWithProgress(g, N, difficulty, (progress) => { + // Post progress back to the main thread + postMessage({ type: "progress", progress: progress }); + }); + const endTime = performance.now(); + const timeTaken = endTime - startTime; + + // Post the final result and time taken back to the main thread + postMessage({ type: "result", result: result.toString(), time: timeTaken }); +}); +`; + +/** + * Computes the Verifiable Delay Function (VDF) result g^(2^difficulty) mod N + * in a Web Worker and reports progress. + * @param g - The base (bigint). + * @param N - The modulus (bigint). + * @param difficulty - The number of squaring steps (T) (bigint). + * @param onProgress - Optional callback function to receive progress updates (0-100). + * @returns A Promise that resolves with the VDF result and time taken. + */ +export function computeVdfInWorker(g: bigint, N: bigint, difficulty: bigint, onProgress?: VdfProgressCallback): Promise { + return new Promise((resolve, reject) => { + // Create a Blob containing the worker script + const blob = new Blob([workerContent], { type: "text/javascript" }); + // Create a URL for the Blob + const workerUrl = URL.createObjectURL(blob); + // Create a new Web Worker + const worker = new Worker(workerUrl); + + // Handle messages from the worker + worker.onmessage = (event) => { + const { type, progress, result, time } = event.data; + + if (type === "progress") { + if (onProgress) { + onProgress(progress); + } + } else if (type === "result") { + // Resolve the promise with the result and time + resolve({ result: BigInt(result), time }); + // Terminate the worker and revoke the URL + worker.terminate(); + URL.revokeObjectURL(workerUrl); + } + }; + + // Handle potential errors in the worker + worker.onerror = (error) => { + reject(error); + // Terminate the worker and revoke the URL in case of error + worker.terminate(); + URL.revokeObjectURL(workerUrl); + }; + + // Post the data to the worker to start the computation + worker.postMessage({ g, N, difficulty }); + }); +} diff --git a/packages/frontend/src/pages/register/index.astro b/packages/frontend/src/pages/register/index.astro index ede0a4b..6f345d6 100644 --- a/packages/frontend/src/pages/register/index.astro +++ b/packages/frontend/src/pages/register/index.astro @@ -1,13 +1,24 @@ --- import Layout from "@layouts/Layout.astro"; import RightArrow from "@components/icon/RightArrow.astro"; +import RegisterForm from "@components/RegisterPage/RegisterForm.svelte"; +import LeftArrow from "@components/icon/LeftArrow.astro"; + +const backendURL = import.meta.env.BACKEND_URL; --- -
-
+
+
+

+ + +

欢迎

-

+

欢迎来到中 V 档案馆。
这里是中文虚拟歌手相关信息的收集站与档案馆。

@@ -15,16 +26,14 @@ import RightArrow from "@components/icon/RightArrow.astro"; 注册一个账号,
让我们一起见证中 V 的历史,现在,与未来。

-

+

已有账户? 登录 -

-

很抱歉,但您现在无法注册。

-

因为目前还没有写好啦~

-

返回首页

+
diff --git a/packages/frontend/tsconfig.json b/packages/frontend/tsconfig.json index c99a382..cd25b55 100644 --- a/packages/frontend/tsconfig.json +++ b/packages/frontend/tsconfig.json @@ -7,10 +7,10 @@ "paths": { "@components/*": ["src/components/*"], "@layouts/*": ["src/layouts/*"], - "@utils/*": ["src/utils/*"], + "@lib/*": ["src/lib/*"], "@assets/*": ["src/assets/*"], "@styles": ["src/styles/*"], - "@core/*": ["../core/*"] + "@core/*": ["../core/*"], }, "verbatimModuleSyntax": true } From dd70543594a111a38f13a11ff8fc8beb35ac9d10 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Thu, 22 May 2025 03:15:07 +0800 Subject: [PATCH 03/24] init: next for frontend --- packages/next/.gitignore | 41 +++++ packages/next/app/globals.css | 123 +++++++++++++++ packages/next/app/layout.tsx | 25 +++ packages/next/app/page.tsx | 10 ++ packages/next/bun.lock | 252 +++++++++++++++++++++++++++++++ packages/next/next.config.ts | 7 + packages/next/package.json | 25 +++ packages/next/postcss.config.mjs | 5 + packages/next/tsconfig.json | 27 ++++ 9 files changed, 515 insertions(+) create mode 100644 packages/next/.gitignore create mode 100644 packages/next/app/globals.css create mode 100644 packages/next/app/layout.tsx create mode 100644 packages/next/app/page.tsx create mode 100644 packages/next/bun.lock create mode 100644 packages/next/next.config.ts create mode 100644 packages/next/package.json create mode 100644 packages/next/postcss.config.mjs create mode 100644 packages/next/tsconfig.json diff --git a/packages/next/.gitignore b/packages/next/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/packages/next/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/packages/next/app/globals.css b/packages/next/app/globals.css new file mode 100644 index 0000000..5a61b5e --- /dev/null +++ b/packages/next/app/globals.css @@ -0,0 +1,123 @@ +@import "tailwindcss"; + +@theme { + --color-surface-container-high: #f7e4e1; + --color-on-surface-variant: #534341; + --color-dark-on-surface-variant: #d8c2be; + --color-dark-surface-container-high: #322826; + --color-dark-surface-container: #271d1c; + --color-surface-container: #fceae7; + --color-on-surface: #231918; + --color-dark-on-surface: #f1dfdc; + --color-surface: #fff8f6; + --color-dark-surface: #1a1110; + --color-primary: #904b40; + --color-dark-primary: #ffb2b7; + --color-primary-container: #ffdad4; + --color-dark-primary-container: #73342a; + --color-on-primary: #ffffff; + --color-dark-on-primary: #561e16; + --color-dark-primary-fixed-dim: #ffb4a8; + --color-secondary-container: #ffdad4; + --color-dark-secondary-container: #5d3f3b; + + --color-surface-tint: rgb(144 75 64); + --color-dark-surface-tint: rgb(255 180 168); + --color-on-primary-container: rgb(115 52 42); + --color-dark-on-primary-container: rgb(255 218 212); + --color-secondary: rgb(119 86 81); + --color-dark-secondary: rgb(231 189 182); + --color-on-secondary: rgb(255 255 255); + --color-dark-on-secondary: rgb(68 41 37); + --color-on-secondary-container: rgb(93 63 59); + --color-dark-on-secondary-container: rgb(255 218 212); + --color-tertiary: rgb(112 92 46); + --color-dark-tertiary: rgb(222 196 140); + --color-on-tertiary: rgb(255 255 255); + --color-dark-on-tertiary: rgb(62 46 4); + --color-tertiary-container: rgb(251 223 166); + --color-dark-tertiary-container: rgb(86 68 25); + --color-on-tertiary-container: rgb(86 68 25); + --color-dark-on-tertiary-container: rgb(251 223 166); + --color-error: rgb(186 26 26); + --color-dark-error: rgb(255 180 171); + --color-on-error: rgb(255 255 255); + --color-dark-on-error: rgb(105 0 5); + --color-error-container: rgb(255 218 214); + --color-dark-error-container: rgb(147 0 10); + --color-on-error-container: rgb(147 0 10); + --color-dark-on-error-container: rgb(255 218 214); + --color-background: rgb(255 248 246); + --color-dark-background: rgb(26 17 16); + --color-on-background: rgb(35 25 24); + --color-dark-on-background: rgb(241 223 220); + --color-surface-variant: rgb(245 221 218); + --color-dark-surface-variant: rgb(83 67 65); + --color-outline: rgb(133 115 112); + --color-dark-outline: rgb(160 140 137); + --color-outline-variant: rgb(216 194 190); + --color-dark-outline-variant: rgb(83 67 65); + --color-shadow: rgb(0 0 0); + --color-dark-shadow: rgb(0 0 0); + --color-scrim: rgb(0 0 0); + --color-dark-scrim: rgb(0 0 0); + --color-inverse-surface: rgb(57 46 44); + --color-dark-inverse-surface: rgb(241 223 220); + --color-inverse-on-surface: rgb(255 237 234); + --color-dark-inverse-on-surface: rgb(57 46 44); + --color-inverse-primary: rgb(255 180 168); + --color-dark-inverse-primary: rgb(144 75 64); + --color-primary-fixed: rgb(255 218 212); + --color-dark-primary-fixed: rgb(255 218 212); + --color-on-primary-fixed: rgb(58 9 5); + --color-dark-on-primary-fixed: rgb(58 9 5); + --color-primary-fixed-dim: rgb(255 180 168); + --color-on-primary-fixed-variant: rgb(115 52 42); + --color-dark-on-primary-fixed-variant: rgb(115 52 42); + --color-secondary-fixed: rgb(255 218 212); + --color-dark-secondary-fixed: rgb(255 218 212); + --color-on-secondary-fixed: rgb(44 21 18); + --color-dark-on-secondary-fixed: rgb(44 21 18); + --color-secondary-fixed-dim: rgb(231 189 182); + --color-dark-secondary-fixed-dim: rgb(231 189 182); + --color-on-secondary-fixed-variant: rgb(93 63 59); + --color-dark-on-secondary-fixed-variant: rgb(93 63 59); + --color-tertiary-fixed: rgb(251 223 166); + --color-dark-tertiary-fixed: rgb(251 223 166); + --color-on-tertiary-fixed: rgb(37 26 0); + --color-dark-on-tertiary-fixed: rgb(37 26 0); + --color-tertiary-fixed-dim: rgb(222 196 140); + --color-dark-tertiary-fixed-dim: rgb(222 196 140); + --color-on-tertiary-fixed-variant: rgb(86 68 25); + --color-dark-on-tertiary-fixed-variant: rgb(86 68 25); + --color-surface-dim: rgb(232 214 211); + --color-dark-surface-dim: rgb(26 17 16); + --color-surface-bright: rgb(255 248 246); + --color-dark-surface-bright: rgb(66 55 53); + --color-surface-container-lowest: rgb(255 255 255); + --color-dark-surface-container-lowest: rgb(20 12 11); + --color-surface-container-low: rgb(255 240 238); + --color-dark-surface-container-low: rgb(35 25 24); + --color-surface-container-highest: rgb(241 223 220); + --color-dark-surface-container-highest: rgb(61 50 48); + + --font-zh: "InterVariable", "MiSans VF", sans-serif; +} + +a { + @apply text-primary dark:text-dark-primary; +} + +:root { + font-family: "MiSans", "Inter", sans-serif; + font-weight: 400; + @apply bg-surface dark:bg-dark-surface text-on-surface dark:text-dark-on-surface; +} + +@supports (font-variation-settings: normal) { + :root { + font-family: "InterVariable", "MiSans VF", sans-serif; + font-optical-sizing: auto; + font-weight: 330; + } +} diff --git a/packages/next/app/layout.tsx b/packages/next/app/layout.tsx new file mode 100644 index 0000000..b5c975e --- /dev/null +++ b/packages/next/app/layout.tsx @@ -0,0 +1,25 @@ +import type { Metadata } from "next"; +import "./globals.css"; +import React from "react"; + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app" +}; + +export default function RootLayout({ + children +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + + 中V档案馆 + + {children} + + ); +} diff --git a/packages/next/app/page.tsx b/packages/next/app/page.tsx new file mode 100644 index 0000000..ba696dd --- /dev/null +++ b/packages/next/app/page.tsx @@ -0,0 +1,10 @@ +export default function Home() { + return ( + <> +
+

正在施工中……

+

在搜索栏输入BV号或AV号,可以查询目前数据库收集到的信息~

+
+ + ); +} diff --git a/packages/next/bun.lock b/packages/next/bun.lock new file mode 100644 index 0000000..71ea2c4 --- /dev/null +++ b/packages/next/bun.lock @@ -0,0 +1,252 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "next", + "dependencies": { + "next": "15.3.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4", + "typescript": "^5", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.1.0", "", { "os": "linux", "cpu": "arm" }, "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.1.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.1.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.1.0" }, "os": "linux", "cpu": "arm" }, "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.1.0" }, "os": "linux", "cpu": "s390x" }, "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.2", "", { "dependencies": { "@emnapi/runtime": "^1.4.3" }, "cpu": "none" }, "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.2", "", { "os": "win32", "cpu": "x64" }, "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@next/env": ["@next/env@15.3.2", "", {}, "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g=="], + + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g=="], + + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w=="], + + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA=="], + + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg=="], + + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg=="], + + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w=="], + + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ=="], + + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.7", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.7" } }, "sha512-9rsOpdY9idRI2NH6CL4wORFY0+Q6fnx9XP9Ju+iq/0wJwGD5IByIgFmwVbyy4ymuyprj8Qh4ErxMKTUL4uNh3g=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.7", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.7", "@tailwindcss/oxide-darwin-arm64": "4.1.7", "@tailwindcss/oxide-darwin-x64": "4.1.7", "@tailwindcss/oxide-freebsd-x64": "4.1.7", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.7", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.7", "@tailwindcss/oxide-linux-arm64-musl": "4.1.7", "@tailwindcss/oxide-linux-x64-gnu": "4.1.7", "@tailwindcss/oxide-linux-x64-musl": "4.1.7", "@tailwindcss/oxide-wasm32-wasi": "4.1.7", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.7", "@tailwindcss/oxide-win32-x64-msvc": "4.1.7" } }, "sha512-5SF95Ctm9DFiUyjUPnDGkoKItPX/k+xifcQhcqX5RA85m50jw1pT/KzjdvlqxRja45Y52nR4MR9fD1JYd7f8NQ=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.7", "", { "os": "android", "cpu": "arm64" }, "sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7", "", { "os": "linux", "cpu": "arm" }, "sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.7", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.9", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.7", "", { "os": "win32", "cpu": "x64" }, "sha512-rYHGmvoHiLJ8hWucSfSOEmdCBIGZIq7SpkPRSqLsH2Ab2YUNgKeAPT1Fi2cx3+hnYOrAb0jp9cRyode3bBW4mQ=="], + + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.7", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.7", "@tailwindcss/oxide": "4.1.7", "postcss": "^8.4.41", "tailwindcss": "4.1.7" } }, "sha512-88g3qmNZn7jDgrrcp3ZXEQfp9CVox7xjP1HN2TFKI03CltPVd/c61ydn5qJJL8FYunn0OqBaW5HNUga0kmPVvw=="], + + "@types/node": ["@types/node@20.17.50", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-Mxiq0ULv/zo1OzOhwPqOA13I81CV/W3nvd3ChtQZRT5Cwz3cr0FKo/wMSsbTqL3EXpaBAEQhva2B8ByRkOIh9A=="], + + "@types/react": ["@types/react@19.1.5", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-piErsCVVbpMMT2r7wbawdZsq4xMvIAhQuac2gedQHysu1TZYEigE6pnFfgZT+/jQnrRuF5r+SHzuehFjfRjr4g=="], + + "@types/react-dom": ["@types/react-dom@19.1.5", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg=="], + + "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001718", "", {}, "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "next": ["next@15.3.2", "", { "dependencies": { "@next/env": "15.3.2", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.2", "@next/swc-darwin-x64": "15.3.2", "@next/swc-linux-arm64-gnu": "15.3.2", "@next/swc-linux-arm64-musl": "15.3.2", "@next/swc-linux-x64-gnu": "15.3.2", "@next/swc-linux-x64-musl": "15.3.2", "@next/swc-win32-arm64-msvc": "15.3.2", "@next/swc-win32-x64-msvc": "15.3.2", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], + + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], + + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "sharp": ["sharp@0.34.2", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.4", "semver": "^7.7.2" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.2", "@img/sharp-darwin-x64": "0.34.2", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", "@img/sharp-libvips-linux-arm64": "1.1.0", "@img/sharp-libvips-linux-ppc64": "1.1.0", "@img/sharp-libvips-linux-s390x": "1.1.0", "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", "@img/sharp-linux-arm": "0.34.2", "@img/sharp-linux-arm64": "0.34.2", "@img/sharp-linux-s390x": "0.34.2", "@img/sharp-linux-x64": "0.34.2", "@img/sharp-linuxmusl-arm64": "0.34.2", "@img/sharp-linuxmusl-x64": "0.34.2", "@img/sharp-wasm32": "0.34.2", "@img/sharp-win32-arm64": "0.34.2", "@img/sharp-win32-ia32": "0.34.2", "@img/sharp-win32-x64": "0.34.2" } }, "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg=="], + + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], + + "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + + "tailwindcss": ["tailwindcss@4.1.7", "", {}, "sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg=="], + + "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], + + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + } +} diff --git a/packages/next/next.config.ts b/packages/next/next.config.ts new file mode 100644 index 0000000..7921f35 --- /dev/null +++ b/packages/next/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/packages/next/package.json b/packages/next/package.json new file mode 100644 index 0000000..765598b --- /dev/null +++ b/packages/next/package.json @@ -0,0 +1,25 @@ +{ + "name": "next", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "start": "next start", + "lint": "next lint", + "format": "prettier --write ." + }, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0", + "next": "15.3.2" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@tailwindcss/postcss": "^4", + "tailwindcss": "^4" + } +} diff --git a/packages/next/postcss.config.mjs b/packages/next/postcss.config.mjs new file mode 100644 index 0000000..6f4b2ef --- /dev/null +++ b/packages/next/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"] +}; + +export default config; diff --git a/packages/next/tsconfig.json b/packages/next/tsconfig.json new file mode 100644 index 0000000..96f8e1b --- /dev/null +++ b/packages/next/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From fe2fd4fe36a3f5b00623236db81515e5206b32a2 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sat, 24 May 2025 03:08:32 +0800 Subject: [PATCH 04/24] feat: home page with header --- packages/next/app/globals.css | 6 + packages/next/app/layout.tsx | 8 +- packages/next/app/page.tsx | 3 + packages/next/bun.lock | 7 + packages/next/components/icons/CloseIcon.tsx | 12 ++ packages/next/components/icons/HomeIcon.tsx | 12 ++ packages/next/components/icons/InfoIcon.tsx | 12 ++ packages/next/components/icons/LeftArrow.tsx | 13 ++ packages/next/components/icons/MenuIcon.tsx | 15 +++ .../next/components/icons/RegisterIcon.tsx | 12 ++ packages/next/components/icons/RightArrow.tsx | 12 ++ packages/next/components/icons/SearchIcon.tsx | 12 ++ packages/next/components/shell/Header.tsx | 124 ++++++++++++++++++ .../next/components/shell/NavigatinDrawer.tsx | 61 +++++++++ packages/next/components/ui/SearchBox.tsx | 92 +++++++++++++ .../next/components/utils/DarkModeImage.tsx | 55 ++++++++ packages/next/components/utils/Portal.tsx | 14 ++ packages/next/package.json | 5 +- .../public/icons/TitleBar Mobile Dark.svg | 14 ++ .../public/icons/TitleBar Mobile Light.svg | 14 ++ packages/next/public/icons/标题-浅色.svg | 15 +++ packages/next/public/icons/标题-深色.svg | 4 + 22 files changed, 517 insertions(+), 5 deletions(-) create mode 100644 packages/next/components/icons/CloseIcon.tsx create mode 100644 packages/next/components/icons/HomeIcon.tsx create mode 100644 packages/next/components/icons/InfoIcon.tsx create mode 100644 packages/next/components/icons/LeftArrow.tsx create mode 100644 packages/next/components/icons/MenuIcon.tsx create mode 100644 packages/next/components/icons/RegisterIcon.tsx create mode 100644 packages/next/components/icons/RightArrow.tsx create mode 100644 packages/next/components/icons/SearchIcon.tsx create mode 100644 packages/next/components/shell/Header.tsx create mode 100644 packages/next/components/shell/NavigatinDrawer.tsx create mode 100644 packages/next/components/ui/SearchBox.tsx create mode 100644 packages/next/components/utils/DarkModeImage.tsx create mode 100644 packages/next/components/utils/Portal.tsx create mode 100644 packages/next/public/icons/TitleBar Mobile Dark.svg create mode 100644 packages/next/public/icons/TitleBar Mobile Light.svg create mode 100644 packages/next/public/icons/标题-浅色.svg create mode 100644 packages/next/public/icons/标题-深色.svg diff --git a/packages/next/app/globals.css b/packages/next/app/globals.css index 5a61b5e..9a2207c 100644 --- a/packages/next/app/globals.css +++ b/packages/next/app/globals.css @@ -114,6 +114,12 @@ a { @apply bg-surface dark:bg-dark-surface text-on-surface dark:text-dark-on-surface; } +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + appearance: none; +} + @supports (font-variation-settings: normal) { :root { font-family: "InterVariable", "MiSans VF", sans-serif; diff --git a/packages/next/app/layout.tsx b/packages/next/app/layout.tsx index b5c975e..25738da 100644 --- a/packages/next/app/layout.tsx +++ b/packages/next/app/layout.tsx @@ -3,8 +3,7 @@ import "./globals.css"; import React from "react"; export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app" + title: "中V档案馆" }; export default function RootLayout({ @@ -19,7 +18,10 @@ export default function RootLayout({ 中V档案馆 - {children} + + {children} +
+ ); } diff --git a/packages/next/app/page.tsx b/packages/next/app/page.tsx index ba696dd..a7b466b 100644 --- a/packages/next/app/page.tsx +++ b/packages/next/app/page.tsx @@ -1,6 +1,9 @@ +import { Header } from "@/components/shell/Header"; + export default function Home() { return ( <> +

正在施工中……

在搜索栏输入BV号或AV号,可以查询目前数据库收集到的信息~

diff --git a/packages/next/bun.lock b/packages/next/bun.lock index 71ea2c4..5e2826b 100644 --- a/packages/next/bun.lock +++ b/packages/next/bun.lock @@ -4,6 +4,7 @@ "": { "name": "next", "dependencies": { + "framer-motion": "^12.12.2", "next": "15.3.2", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -159,6 +160,8 @@ "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + "framer-motion": ["framer-motion@12.12.2", "", { "dependencies": { "motion-dom": "^12.12.1", "motion-utils": "^12.12.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-qCszZCiGWkilL40E3VuhIJJC/CS3SIBl2IHyGK8FU30nOUhTmhBNWPrNFyozAWH/bXxwzi19vJHIGVdALF0LCg=="], + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], @@ -195,6 +198,10 @@ "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + "motion-dom": ["motion-dom@12.12.1", "", { "dependencies": { "motion-utils": "^12.12.1" } }, "sha512-GXq/uUbZBEiFFE+K1Z/sxdPdadMdfJ/jmBALDfIuHGi0NmtealLOfH9FqT+6aNPgVx8ilq0DtYmyQlo6Uj9LKQ=="], + + "motion-utils": ["motion-utils@12.12.1", "", {}, "sha512-f9qiqUHm7hWSLlNW8gS9pisnsN7CRFRD58vNjptKdsqFLpkVnX00TNeD6Q0d27V9KzT7ySFyK1TZ/DShfVOv6w=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "next": ["next@15.3.2", "", { "dependencies": { "@next/env": "15.3.2", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.2", "@next/swc-darwin-x64": "15.3.2", "@next/swc-linux-arm64-gnu": "15.3.2", "@next/swc-linux-arm64-musl": "15.3.2", "@next/swc-linux-x64-gnu": "15.3.2", "@next/swc-linux-x64-musl": "15.3.2", "@next/swc-win32-arm64-msvc": "15.3.2", "@next/swc-win32-x64-msvc": "15.3.2", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ=="], diff --git a/packages/next/components/icons/CloseIcon.tsx b/packages/next/components/icons/CloseIcon.tsx new file mode 100644 index 0000000..88b2ffb --- /dev/null +++ b/packages/next/components/icons/CloseIcon.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +export const CloseIcon: React.FC> = (props) => ( +
+ + + +
+); diff --git a/packages/next/components/icons/HomeIcon.tsx b/packages/next/components/icons/HomeIcon.tsx new file mode 100644 index 0000000..f95154f --- /dev/null +++ b/packages/next/components/icons/HomeIcon.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +export const HomeIcon: React.FC> = (props) => ( +
+ + + +
+); diff --git a/packages/next/components/icons/InfoIcon.tsx b/packages/next/components/icons/InfoIcon.tsx new file mode 100644 index 0000000..f2b312a --- /dev/null +++ b/packages/next/components/icons/InfoIcon.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +export const InfoIcon: React.FC> = (props) => ( +
+ + + +
+); diff --git a/packages/next/components/icons/LeftArrow.tsx b/packages/next/components/icons/LeftArrow.tsx new file mode 100644 index 0000000..8d8cfcd --- /dev/null +++ b/packages/next/components/icons/LeftArrow.tsx @@ -0,0 +1,13 @@ +import React from "react"; + +export const LeftArrow: React.FC> = (props) => ( + + + +); diff --git a/packages/next/components/icons/MenuIcon.tsx b/packages/next/components/icons/MenuIcon.tsx new file mode 100644 index 0000000..5977c8c --- /dev/null +++ b/packages/next/components/icons/MenuIcon.tsx @@ -0,0 +1,15 @@ +import React from "react"; + +export const MenuIcon: React.FC> = (props) => ( +
+ + + +
+); diff --git a/packages/next/components/icons/RegisterIcon.tsx b/packages/next/components/icons/RegisterIcon.tsx new file mode 100644 index 0000000..5cd344c --- /dev/null +++ b/packages/next/components/icons/RegisterIcon.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +export const RegisterIcon: React.FC> = (props) => ( +
+ + + +
+); diff --git a/packages/next/components/icons/RightArrow.tsx b/packages/next/components/icons/RightArrow.tsx new file mode 100644 index 0000000..9c4784b --- /dev/null +++ b/packages/next/components/icons/RightArrow.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +export const RightArrow: React.FC> = (props) => ( + + + +); diff --git a/packages/next/components/icons/SearchIcon.tsx b/packages/next/components/icons/SearchIcon.tsx new file mode 100644 index 0000000..4f26208 --- /dev/null +++ b/packages/next/components/icons/SearchIcon.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +export const SearchIcon: React.FC> = (props) => ( +
+ + + +
+); diff --git a/packages/next/components/shell/Header.tsx b/packages/next/components/shell/Header.tsx new file mode 100644 index 0000000..bb4bf0e --- /dev/null +++ b/packages/next/components/shell/Header.tsx @@ -0,0 +1,124 @@ +"use client"; + +import TitleLight from "@/public/icons/标题-浅色.svg"; +import TitleDark from "@/public/icons/标题-深色.svg"; +import LogoMobileLight from "@/public/icons/TitleBar Mobile Light.svg"; +import LogoMobileDark from "@/public/icons/TitleBar Mobile Dark.svg"; +import DarkModeImage from "@/components/utils/DarkModeImage"; +import React, { useState } from "react"; +import { NavigationDrawer } from "@/components/shell/NavigatinDrawer"; +import { Portal } from "@/components/utils/Portal"; +import { RegisterIcon } from "@/components/icons/RegisterIcon"; +import { SearchBox } from "@/components/ui/SearchBox"; +import { MenuIcon } from "@/components/icons/MenuIcon"; +import { SearchIcon } from "@/components/icons/SearchIcon"; +import { InfoIcon } from "../icons/InfoIcon"; +import { HomeIcon } from "../icons/HomeIcon"; + +export const HeaderDestop = () => { + return ( +
+
+ + + +
+ + + +
+ 注册 + 关于 +
+
+ ); +}; + +export const HeaderMobile = () => { + const [showDrawer, setShowDrawer] = useState(false); + const [showsearchBox, setShowsearchBox] = useState(false); + return ( + <> + + setShowDrawer(false)}> + + + +
+ {!showsearchBox && ( + + )} + {!showsearchBox && ( +
+ + + +
+ )} + {showsearchBox && setShowsearchBox(false)} />} + {!showsearchBox && ( + + )} +
+ + ); +}; + +export const Header = () => { + return ( + <> + + + + ); +}; diff --git a/packages/next/components/shell/NavigatinDrawer.tsx b/packages/next/components/shell/NavigatinDrawer.tsx new file mode 100644 index 0000000..5e7967b --- /dev/null +++ b/packages/next/components/shell/NavigatinDrawer.tsx @@ -0,0 +1,61 @@ +import React, { useEffect, useRef } from "react"; +import { motion, AnimatePresence } from "framer-motion"; + +interface DrawerProps { + show?: boolean; + onClose: () => void; + children: React.ReactNode; +} + +export const NavigationDrawer = ({ show = false, onClose, children }: DrawerProps) => { + const coverRef = useRef(null); + + useEffect(() => { + const handleOutsideClick = (event: MouseEvent) => { + if (show && coverRef.current && event.target === coverRef.current) { + onClose(); + } + }; + + window.addEventListener("click", handleOutsideClick); + return () => { + window.removeEventListener("click", handleOutsideClick); + }; + }, [show, onClose]); + + return ( + + {show && ( + <> + {/* Backdrop - Fade in/out */} + + ); +}; + +export default NavigationDrawer; diff --git a/packages/next/components/ui/SearchBox.tsx b/packages/next/components/ui/SearchBox.tsx new file mode 100644 index 0000000..f6e1444 --- /dev/null +++ b/packages/next/components/ui/SearchBox.tsx @@ -0,0 +1,92 @@ +import React, { useState, useRef, useCallback } from "react"; +import { SearchIcon } from "@/components/icons/SearchIcon"; +import { CloseIcon } from "@/components/icons/CloseIcon"; + +interface SearchBoxProps { + close?: () => void; +} + +export const SearchBox: React.FC = ({ close = () => {} }) => { + const [inputValue, setInputValue] = useState(""); + const inputElement = useRef(null); + + const search = useCallback((query: string) => { + if (query.trim()) { + window.location.href = `/song/${query.trim()}/info`; + } + }, []); + + const handleInputChange = useCallback((event: React.ChangeEvent) => { + setInputValue(event.target.value); + }, []); + + const handleKeyDown = useCallback( + (event: React.KeyboardEvent) => { + if (event.key === "Enter") { + event.preventDefault(); + search(inputValue); + } + }, + [inputValue, search] + ); + + const handleClear = useCallback(() => { + setInputValue(""); + close(); + }, [close]); + + return ( +
+
+ +
+ +
+
+ +
+ + +
+
+ ); +}; diff --git a/packages/next/components/utils/DarkModeImage.tsx b/packages/next/components/utils/DarkModeImage.tsx new file mode 100644 index 0000000..1aed745 --- /dev/null +++ b/packages/next/components/utils/DarkModeImage.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { useState, useEffect } from "react"; +import Image from "next/image"; + +interface Props { + lightSrc: string; + darkSrc: string; + alt?: string; + className?: string; + width?: number; + height?: number; +} + +const DarkModeImage = ({ lightSrc, darkSrc, alt = "", className = "", width, height }: Props) => { + const [isDarkMode, setIsDarkMode] = useState(false); + const [currentSrc, setCurrentSrc] = useState(lightSrc); + const [opacity, setOpacity] = useState(0); + + useEffect(() => { + const handleDarkModeChange = (event: MediaQueryListEvent) => { + setIsDarkMode(event.matches); + setCurrentSrc(event.matches ? darkSrc : lightSrc); + setOpacity(1); + }; + + const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); + setIsDarkMode(darkModeMediaQuery.matches); + setCurrentSrc(darkModeMediaQuery.matches ? darkSrc : lightSrc); + setOpacity(1); + + darkModeMediaQuery.addEventListener("change", handleDarkModeChange); + + return () => { + darkModeMediaQuery.removeEventListener("change", handleDarkModeChange); + }; + }, [darkSrc, lightSrc]); + + useEffect(() => { + setCurrentSrc(isDarkMode ? darkSrc : lightSrc); + }, [isDarkMode, darkSrc, lightSrc]); + + return ( + {alt} + ); +}; + +export default DarkModeImage; diff --git a/packages/next/components/utils/Portal.tsx b/packages/next/components/utils/Portal.tsx new file mode 100644 index 0000000..d76d2d7 --- /dev/null +++ b/packages/next/components/utils/Portal.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import ReactDOM from "react-dom"; + +export const Portal = ({ children }: { children: React.ReactNode }) => { + const documentNotUndefined = typeof document !== "undefined"; + // Ensure portal root exists in your HTML + const portalRoot = documentNotUndefined ? document.getElementById("portal-root") : null; + + if (!portalRoot) { + return null; + } + + return ReactDOM.createPortal(children, portalRoot); +}; diff --git a/packages/next/package.json b/packages/next/package.json index 765598b..50fadc0 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -10,9 +10,10 @@ "format": "prettier --write ." }, "dependencies": { + "framer-motion": "^12.12.2", + "next": "15.3.2", "react": "^19.0.0", - "react-dom": "^19.0.0", - "next": "15.3.2" + "react-dom": "^19.0.0" }, "devDependencies": { "typescript": "^5", diff --git a/packages/next/public/icons/TitleBar Mobile Dark.svg b/packages/next/public/icons/TitleBar Mobile Dark.svg new file mode 100644 index 0000000..7a48bfb --- /dev/null +++ b/packages/next/public/icons/TitleBar Mobile Dark.svg @@ -0,0 +1,14 @@ + + + Created with Pixso. + + + + + + + + + + + diff --git a/packages/next/public/icons/TitleBar Mobile Light.svg b/packages/next/public/icons/TitleBar Mobile Light.svg new file mode 100644 index 0000000..87ffa43 --- /dev/null +++ b/packages/next/public/icons/TitleBar Mobile Light.svg @@ -0,0 +1,14 @@ + + + Created with Pixso. + + + + + + + + + + + diff --git a/packages/next/public/icons/标题-浅色.svg b/packages/next/public/icons/标题-浅色.svg new file mode 100644 index 0000000..c32ce5f --- /dev/null +++ b/packages/next/public/icons/标题-浅色.svg @@ -0,0 +1,15 @@ + + + Created with Pixso. + + + + + + + + + + + + diff --git a/packages/next/public/icons/标题-深色.svg b/packages/next/public/icons/标题-深色.svg new file mode 100644 index 0000000..acd623a --- /dev/null +++ b/packages/next/public/icons/标题-深色.svg @@ -0,0 +1,4 @@ + + + + From 6b93a781b7dc67ccbdda14954a85a3055235703b Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sat, 24 May 2025 17:13:26 +0800 Subject: [PATCH 05/24] add: sign up page --- bun.lock | 165 +----------------- package.json | 28 ++- packages/crawler/package.json | 1 + packages/next/app/signup/SignUpForm.tsx | 157 +++++++++++++++++ packages/next/app/signup/page.tsx | 40 +++++ packages/next/bun.lock | 13 +- .../next/components/icons/LoadingSpinner.tsx | 39 +++++ packages/next/components/ui/TextField.tsx | 93 ++++++++++ packages/next/lib/net.ts | 10 ++ packages/next/lib/vdf.ts | 117 +++++++++++++ packages/next/package.json | 9 +- 11 files changed, 489 insertions(+), 183 deletions(-) create mode 100644 packages/next/app/signup/SignUpForm.tsx create mode 100644 packages/next/app/signup/page.tsx create mode 100644 packages/next/components/icons/LoadingSpinner.tsx create mode 100644 packages/next/components/ui/TextField.tsx create mode 100644 packages/next/lib/net.ts create mode 100644 packages/next/lib/vdf.ts diff --git a/bun.lock b/bun.lock index 251cf70..6cc497e 100644 --- a/bun.lock +++ b/bun.lock @@ -3,14 +3,6 @@ "workspaces": { "": { "name": "cvsa", - "dependencies": { - "postgres": "^3.4.5", - }, - "devDependencies": { - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.1.2", - "vitest-tsconfig-paths": "^3.4.1", - }, }, "packages/backend": { "name": "backend", @@ -54,6 +46,7 @@ "express": "^5.1.0", "ioredis": "^5.6.1", "onnxruntime-node": "1.19.2", + "postgres": "^3.4.5", }, "devDependencies": { "concurrently": "^9.1.2", @@ -119,8 +112,6 @@ "@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="], - "@cush/relative": ["@cush/relative@1.0.0", "", {}, "sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA=="], - "@dabh/diagnostics": ["@dabh/diagnostics@2.0.3", "", { "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA=="], "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], @@ -221,8 +212,6 @@ "@ioredis/commands": ["@ioredis/commands@1.2.0", "", {}, "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="], - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], @@ -251,8 +240,6 @@ "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], @@ -383,8 +370,6 @@ "@types/ioredis": ["@types/ioredis@5.0.0", "", { "dependencies": { "ioredis": "*" } }, "sha512-zJbJ3FVE17CNl5KXzdeSPtdltc4tMT3TzC6fxQS0sQngkbFZ6h+0uTafsRqu+eSLIugf6Yb0Ea0SUuRr42Nk9g=="], - "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], - "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], "@types/mocha": ["@types/mocha@10.0.10", "", {}, "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q=="], @@ -405,20 +390,6 @@ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@vitest/expect": ["@vitest/expect@3.1.2", "", { "dependencies": { "@vitest/spy": "3.1.2", "@vitest/utils": "3.1.2", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA=="], - - "@vitest/mocker": ["@vitest/mocker@3.1.2", "", { "dependencies": { "@vitest/spy": "3.1.2", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw=="], - - "@vitest/pretty-format": ["@vitest/pretty-format@3.1.2", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w=="], - - "@vitest/runner": ["@vitest/runner@3.1.2", "", { "dependencies": { "@vitest/utils": "3.1.2", "pathe": "^2.0.3" } }, "sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g=="], - - "@vitest/snapshot": ["@vitest/snapshot@3.1.2", "", { "dependencies": { "@vitest/pretty-format": "3.1.2", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q=="], - - "@vitest/spy": ["@vitest/spy@3.1.2", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA=="], - - "@vitest/utils": ["@vitest/utils@3.1.2", "", { "dependencies": { "@vitest/pretty-format": "3.1.2", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" } }, "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg=="], - "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], @@ -431,8 +402,6 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], - "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], "argon2id": ["argon2id@1.0.1", "", {}, "sha512-rsiD3lX+0L0CsiZARp3bf9EGxprtuWAT7PpiJd+Fk53URV0/USOQkBIP1dLTV8t6aui0ECbymQ9W9YCcTd6XgA=="], @@ -443,7 +412,7 @@ "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], - "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + "assertion-error": ["assertion-error@1.1.0", "", {}, "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="], "astro": ["astro@5.7.8", "", { "dependencies": { "@astrojs/compiler": "^2.11.0", "@astrojs/internal-helpers": "0.6.1", "@astrojs/markdown-remark": "6.3.1", "@astrojs/telemetry": "3.2.1", "@capsizecss/unpack": "^2.4.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.4", "acorn": "^8.14.1", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.2.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.0.2", "cssesc": "^3.0.0", "debug": "^4.4.0", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.6.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.17", "magicast": "^0.3.5", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.0", "package-manager-detector": "^1.1.0", "picomatch": "^4.0.2", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.1", "shiki": "^3.2.1", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.12", "tsconfck": "^3.1.5", "ultrahtml": "^1.6.0", "unifont": "~0.4.1", "unist-util-visit": "^5.0.0", "unstorage": "^1.15.0", "vfile": "^6.0.3", "vite": "^6.2.6", "vitefu": "^1.0.6", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.1", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-82ku6+wOGXP5c5+YOkBzEGJ/k8/GVSeN0xD/TNUrPf5nvWpGGpngxtUAwuruKF6wIxRC1/SwlUVCs/4QT98iZQ=="], @@ -491,8 +460,6 @@ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], @@ -503,7 +470,7 @@ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], - "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], + "chai": ["chai@4.5.0", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.1.0" } }, "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw=="], "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], @@ -513,7 +480,7 @@ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], - "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + "check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="], "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], @@ -545,8 +512,6 @@ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], - "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], - "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], @@ -571,8 +536,6 @@ "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "crossws": ["crossws@0.3.4", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw=="], "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], @@ -589,7 +552,7 @@ "dedent-js": ["dedent-js@1.0.1", "", {}, "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ=="], - "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + "deep-eql": ["deep-eql@4.1.4", "", { "dependencies": { "type-detect": "^4.0.0" } }, "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg=="], "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], @@ -631,8 +594,6 @@ "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], @@ -679,8 +640,6 @@ "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], - "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], - "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], @@ -711,8 +670,6 @@ "fontkit": ["fontkit@2.0.4", "", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="], - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], - "form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="], "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], @@ -745,8 +702,6 @@ "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "glob-regex": ["glob-regex@0.3.2", "", {}, "sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw=="], - "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], @@ -849,10 +804,6 @@ "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - "jake": ["jake@10.9.2", "", { "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.4", "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" } }, "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA=="], "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], @@ -861,8 +812,6 @@ "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], - "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], "kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="], @@ -891,8 +840,6 @@ "limiter": ["limiter@3.0.0", "", {}, "sha512-hev7DuXojsTFl2YwyzUJMDnZ/qBDd3yZQLSH3aD4tdL1cqfc3TMnoecEJtWFaQFdErZsKoFMBTxF/FBSkgDbEg=="], - "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], @@ -911,7 +858,7 @@ "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], - "loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], + "loupe": ["loupe@2.3.7", "", { "dependencies": { "get-func-name": "^2.0.1" } }, "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA=="], "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], @@ -1023,8 +970,6 @@ "minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], @@ -1041,8 +986,6 @@ "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], - "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], @@ -1069,8 +1012,6 @@ "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], @@ -1105,8 +1046,6 @@ "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], - "package-manager-detector": ["package-manager-detector@1.2.0", "", {}, "sha512-PutJepsOtsqVfUsxCzgTTpyXmiAgvKptIgY4th5eq5UXXFhj5PxfQ9hnGkypMeovpAvVshFRItoFHYO18TCOqA=="], "pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="], @@ -1121,15 +1060,9 @@ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], + "pathval": ["pathval@1.1.1", "", {}, "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="], "pg": ["pg@8.15.6", "", { "dependencies": { "pg-connection-string": "^2.8.5", "pg-pool": "^3.9.6", "pg-protocol": "^1.9.5", "pg-types": "^2.1.0", "pgpass": "1.x" }, "optionalDependencies": { "pg-cloudflare": "^1.2.5" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg=="], @@ -1153,8 +1086,6 @@ "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], - "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], - "platform": ["platform@1.3.6", "", {}, "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="], "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], @@ -1203,8 +1134,6 @@ "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "recrawl-sync": ["recrawl-sync@2.2.3", "", { "dependencies": { "@cush/relative": "^1.0.0", "glob-regex": "^0.3.0", "slash": "^3.0.0", "sucrase": "^3.20.3", "tslib": "^1.9.3" } }, "sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ=="], - "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], "redis-info": ["redis-info@3.1.0", "", { "dependencies": { "lodash": "^4.17.11" } }, "sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg=="], @@ -1279,10 +1208,6 @@ "sharp": ["sharp@0.34.1", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.7.1" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.1", "@img/sharp-darwin-x64": "0.34.1", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", "@img/sharp-libvips-linux-arm64": "1.1.0", "@img/sharp-libvips-linux-ppc64": "1.1.0", "@img/sharp-libvips-linux-s390x": "1.1.0", "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", "@img/sharp-linux-arm": "0.34.1", "@img/sharp-linux-arm64": "0.34.1", "@img/sharp-linux-s390x": "0.34.1", "@img/sharp-linux-x64": "0.34.1", "@img/sharp-linuxmusl-arm64": "0.34.1", "@img/sharp-linuxmusl-x64": "0.34.1", "@img/sharp-wasm32": "0.34.1", "@img/sharp-win32-ia32": "0.34.1", "@img/sharp-win32-x64": "0.34.1" } }, "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg=="], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "shell-quote": ["shell-quote@1.8.2", "", {}, "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA=="], "shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="], @@ -1295,16 +1220,10 @@ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], - - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], - "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - "smol-toml": ["smol-toml@1.3.4", "", {}, "sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -1317,32 +1236,20 @@ "stack-trace": ["stack-trace@0.0.10", "", {}, "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="], - "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], - "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], "svelte": ["svelte@5.28.2", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^1.4.6", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-FbWBxgWOpQfhKvoGJv/TFwzqb4EhJbwCD17dB0tEpQiw1XyUEKZJtgm4nA4xq3LLsMo7hu5UY/BOFmroAxKTMg=="], @@ -1357,26 +1264,14 @@ "text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="], - "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], - - "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], - "tiny-case": ["tiny-case@1.0.3", "", {}, "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="], "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], - "tinypool": ["tinypool@1.0.2", "", {}, "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA=="], - - "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], - - "tinyspy": ["tinyspy@3.0.2", "", {}, "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q=="], - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], @@ -1393,12 +1288,8 @@ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], - "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], - "tsconfck": ["tsconfck@3.1.5", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg=="], - "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "type-detect": ["type-detect@4.1.0", "", {}, "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw=="], @@ -1467,28 +1358,18 @@ "vite": ["vite@6.3.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw=="], - "vite-node": ["vite-node@3.1.2", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA=="], - "vite-tsconfig-paths": ["vite-tsconfig-paths@5.1.4", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w=="], "vitefu": ["vitefu@1.0.6", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["vite"] }, "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA=="], - "vitest": ["vitest@3.1.2", "", { "dependencies": { "@vitest/expect": "3.1.2", "@vitest/mocker": "3.1.2", "@vitest/pretty-format": "^3.1.2", "@vitest/runner": "3.1.2", "@vitest/snapshot": "3.1.2", "@vitest/spy": "3.1.2", "@vitest/utils": "3.1.2", "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.13", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", "vite-node": "3.1.2", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.1.2", "@vitest/ui": "3.1.2", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ=="], - - "vitest-tsconfig-paths": ["vitest-tsconfig-paths@3.4.1", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "recrawl-sync": "^2.0.3", "tsconfig-paths": "^3.9.0" } }, "sha512-CnRpA/jcqgZfnkk0yvwFW92UmIpf03wX/wLiQBNWAcOG7nv6Sdz3GsPESAMEqbVy8kHBoWB3XeNamu6PUrFZLA=="], - "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="], - "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], "winston": ["winston@3.17.0", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw=="], @@ -1499,8 +1380,6 @@ "wrap-ansi": ["wrap-ansi@9.0.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="], - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], @@ -1537,14 +1416,6 @@ "@huggingface/transformers/onnxruntime-node": ["onnxruntime-node@1.21.0", "", { "dependencies": { "global-agent": "^3.0.0", "onnxruntime-common": "1.21.0", "tar": "^7.0.1" }, "os": [ "linux", "win32", "darwin", ] }, "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw=="], - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], - - "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - - "@koshnic/ratelimit/chai": ["chai@4.5.0", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.1.0" } }, "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw=="], - "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], @@ -1601,12 +1472,8 @@ "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "recrawl-sync/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], - "sucrase/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], - "unified/is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], "unstorage/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], @@ -1623,22 +1490,6 @@ "@huggingface/transformers/onnxruntime-node/onnxruntime-common": ["onnxruntime-common@1.21.0", "", {}, "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ=="], - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - - "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - - "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - - "@koshnic/ratelimit/chai/assertion-error": ["assertion-error@1.1.0", "", {}, "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="], - - "@koshnic/ratelimit/chai/check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="], - - "@koshnic/ratelimit/chai/deep-eql": ["deep-eql@4.1.4", "", { "dependencies": { "type-detect": "^4.0.0" } }, "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg=="], - - "@koshnic/ratelimit/chai/loupe": ["loupe@2.3.7", "", { "dependencies": { "get-func-name": "^2.0.1" } }, "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA=="], - - "@koshnic/ratelimit/chai/pathval": ["pathval@1.1.1", "", {}, "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="], - "astro/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], "astro/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], @@ -1705,8 +1556,6 @@ "pg/pg-types/postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "sucrase/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "unstorage/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], "widest-line/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="], diff --git a/package.json b/package.json index 2afb5de..673369c 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,12 @@ { - "name": "cvsa", - "version": "2.13.22", - "private": false, - "type": "module", - "workspaces": [ - "packages/frontend", - "packages/core", - "packages/backend", - "packages/crawler" - ], - "dependencies": { - "postgres": "^3.4.5" - }, - "devDependencies": { - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.1.2", - "vitest-tsconfig-paths": "^3.4.1" - } + "name": "cvsa", + "version": "2.13.22", + "private": true, + "type": "module", + "workspaces": [ + "packages/frontend", + "packages/core", + "packages/backend", + "packages/crawler" + ] } diff --git a/packages/crawler/package.json b/packages/crawler/package.json index 96abd83..82650c1 100644 --- a/packages/crawler/package.json +++ b/packages/crawler/package.json @@ -19,6 +19,7 @@ "bullmq": "^5.52.1", "express": "^5.1.0", "ioredis": "^5.6.1", + "postgres": "^3.4.5", "onnxruntime-node": "1.19.2" } } diff --git a/packages/next/app/signup/SignUpForm.tsx b/packages/next/app/signup/SignUpForm.tsx new file mode 100644 index 0000000..32be0bc --- /dev/null +++ b/packages/next/app/signup/SignUpForm.tsx @@ -0,0 +1,157 @@ +"use client"; + +import { useState } from "react"; +import TextField from "@/components/ui/TextField"; +import LoadingSpinner from "@/components/icons/LoadingSpinner"; +import { computeVdfInWorker } from "@/lib/vdf"; +import useSWR from "swr"; +import { ApiRequestError } from "@/lib/net"; + +interface CaptchaSessionResponse { + g: string; + n: string; + t: string; + id: string; +} + +interface CaptchaResultResponse { + token: string; +} + +async function fetcher(input: RequestInfo, init?: RequestInit): Promise { + const res = await fetch(input, init); + if (!res.ok) { + const error = new ApiRequestError("An error occurred while fetching the data."); + error.response = await res.json(); + error.code = res.status; + throw error; + } + return res.json(); +} + +interface RegistrationFormProps { + backendURL: string; +} + +const SignUpForm: React.FC = ({ backendURL }) => { + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [nickname, setNickname] = useState(""); + const [loading, setLoading] = useState(false); + + const { + data: captchaSession, + error: captchaSessionError, + mutate: createCaptchaSession + } = useSWR( + `${backendURL}/captcha/session`, + (url) => + fetcher(url, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ route: "POST-/user" }) + }), + { revalidateOnFocus: false, revalidateOnReconnect: false } + ); + + const getCaptchaResult = async (id: string, ans: string): Promise => { + const url = new URL(`${backendURL}/captcha/${id}/result`); + url.searchParams.set("ans", ans); + return fetcher(url.toString()); + }; + + const register = async () => { + setLoading(true); + try { + if (!captchaSession?.g || !captchaSession?.n || !captchaSession?.t || !captchaSession?.id) { + console.error("Captcha session data is missing."); + return; + } + const ans = await computeVdfInWorker( + BigInt(captchaSession.g), + BigInt(captchaSession.n), + BigInt(captchaSession.t) + ); + const captchaResult = await getCaptchaResult(captchaSession.id, ans.result.toString()); + + if (!captchaResult.token) { + } + // Proceed with user registration using username, password, and nickname + const registrationUrl = new URL(`${backendURL}/user`); + const registrationResponse = await fetch(registrationUrl.toString(), { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + username, + password, + nickname, + // Include the captcha result if needed by the backend + captchaId: captchaSession.id, + captchaAnswer: ans.result.toString() + }) + }); + + if (registrationResponse.ok) { + console.log("Registration successful!"); + // Optionally redirect the user or show a success message + //router.push("/login"); // Example redirection + } else { + console.error("Registration failed:", await registrationResponse.json()); + // Handle registration error + } + } catch (error) { + console.error("Registration process error:", error); + // Handle general error + } finally { + setLoading(false); + } + }; + + return ( +
{ + e.preventDefault(); + await register(); + }} + > + + + + + + ); +}; + +export default SignUpForm; diff --git a/packages/next/app/signup/page.tsx b/packages/next/app/signup/page.tsx new file mode 100644 index 0000000..1ad85cc --- /dev/null +++ b/packages/next/app/signup/page.tsx @@ -0,0 +1,40 @@ +import { LeftArrow } from "@/components/icons/LeftArrow"; +import { RightArrow } from "@/components/icons/RightArrow"; +import SignUpForm from "./SignUpForm"; + +export default function SignupPage() { + return ( +
+
+

+ + +

+

欢迎

+

+ 欢迎来到中 V 档案馆。 +
+ 这里是中文虚拟歌手相关信息的收集站与档案馆。 +

+

+ 注册一个账号, +
+ 让我们一起见证中 V 的历史,现在,与未来。 +

+

+ 已有账户? + + 登录 + +

+ +
+
+ ); +} diff --git a/packages/next/bun.lock b/packages/next/bun.lock index 5e2826b..86c3a87 100644 --- a/packages/next/bun.lock +++ b/packages/next/bun.lock @@ -5,9 +5,10 @@ "name": "next", "dependencies": { "framer-motion": "^12.12.2", - "next": "15.3.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "next": "^15.1.8", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "swr": "^2.3.3", }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -156,6 +157,8 @@ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], @@ -228,6 +231,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "swr": ["swr@2.3.3", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A=="], + "tailwindcss": ["tailwindcss@4.1.7", "", {}, "sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg=="], "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], @@ -240,6 +245,8 @@ "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], diff --git a/packages/next/components/icons/LoadingSpinner.tsx b/packages/next/components/icons/LoadingSpinner.tsx new file mode 100644 index 0000000..25abfff --- /dev/null +++ b/packages/next/components/icons/LoadingSpinner.tsx @@ -0,0 +1,39 @@ +import React from "react"; + +const LoadingSpinner: React.FC> = (props) => ( +
+ + + + + + + + + +
+); + +export default LoadingSpinner; diff --git a/packages/next/components/ui/TextField.tsx b/packages/next/components/ui/TextField.tsx new file mode 100644 index 0000000..2d23d01 --- /dev/null +++ b/packages/next/components/ui/TextField.tsx @@ -0,0 +1,93 @@ +"use client"; + +import React, { useState } from "react"; + +interface InputProps extends React.HTMLAttributes { + labelText?: string; + type?: React.HTMLInputTypeAttribute; + inputText?: string; + onInputTextChange?: (value: string) => void; + maxChar?: number; + supportingText?: string; +} + +const TextField: React.FC = ({ + labelText = "", + type = "text", + inputText: initialInputText = "", + onInputTextChange, + maxChar, + supportingText, + ...rest +}) => { + const [focus, setFocus] = useState(false); + const [inputText, setInputText] = useState(initialInputText); + + const handleValueChange = (event: React.ChangeEvent) => { + const { value } = event.target; + setInputText(value); + onInputTextChange?.(value); + }; + + return ( +
+
+
+
+ +
+ + {labelText} + +
+ +
+
+ + setFocus(true)} + onBlur={() => setFocus(false)} + onChange={handleValueChange} + type={type} + value={inputText} + /> +
+ {(supportingText || maxChar) && ( +
+ {supportingText && {supportingText}} + {maxChar && ( + + {inputText.length}/{maxChar} + + )} +
+ )} +
+ ); +}; + +export default TextField; diff --git a/packages/next/lib/net.ts b/packages/next/lib/net.ts new file mode 100644 index 0000000..995a7e2 --- /dev/null +++ b/packages/next/lib/net.ts @@ -0,0 +1,10 @@ +export class ApiRequestError extends Error { + public code: number | undefined; + public response: unknown | undefined; + constructor(message: string, res?: unknown, code?: number) { + super(message); + this.name = "ApiRequestError"; + this.code = code; + this.response = res; + } +} diff --git a/packages/next/lib/vdf.ts b/packages/next/lib/vdf.ts new file mode 100644 index 0000000..97f2b90 --- /dev/null +++ b/packages/next/lib/vdf.ts @@ -0,0 +1,117 @@ +// Define interfaces for input and output +interface VdfProgressCallback { + (progress: number): void; +} + +interface VdfResult { + result: bigint; + time: number; // Time taken in milliseconds +} + +// The content of the Web Worker script +const workerContent = `addEventListener("message", async (event) => { + const { g, N, difficulty } = event.data; + + // Although pow is not used in the iterative VDF, it's good to keep the original worker code structure. + // The iterative computeVDFWithProgress is better for progress reporting. + function pow(base, exponent, mod) { + let result = 1n; + base = base % mod; + while (exponent > 0n) { + if (exponent % 2n === 1n) { + result = (result * base) % mod; + } + base = (base * base) % mod; + exponent = exponent / 2n; + // Using BigInt division (/) which performs integer division + } + return result; + } + + // Compute VDF iteratively to report progress + function computeVDFWithProgress(g, N, T, postProgress) { + let result = g; + let latestTime = performance.now(); + const totalSteps = T; // T is the difficulty, representing 2^T squaring steps + + for (let i = 0n; i < totalSteps; i++) { + result = (result * result) % N; + // Report progress periodically (approx. every 16ms to match typical frame rate) + if (performance.now() - latestTime > 16) { + // Calculate progress as a percentage + const progress = Number((i + 1n) * 10000n / totalSteps) / 100; // Using 10000 for better precision before dividing by 100 + postProgress(progress); + latestTime = performance.now(); + } + } + // Ensure final progress is reported + postProgress(100); + return result; + } + + const startTime = performance.now(); + // The worker computes g^(2^difficulty) mod N. The loop runs 'difficulty' times, performing squaring. + const result = computeVDFWithProgress(g, N, difficulty, (progress) => { + // Post progress back to the main thread + postMessage({ type: "progress", progress: progress }); + }); + const endTime = performance.now(); + const timeTaken = endTime - startTime; + + // Post the final result and time taken back to the main thread + postMessage({ type: "result", result: result.toString(), time: timeTaken }); +}); +`; + +/** + * Computes the Verifiable Delay Function (VDF) result g^(2^difficulty) mod N + * in a Web Worker and reports progress. + * @param g - The base (bigint). + * @param N - The modulus (bigint). + * @param difficulty - The number of squaring steps (T) (bigint). + * @param onProgress - Optional callback function to receive progress updates (0-100). + * @returns A Promise that resolves with the VDF result and time taken. + */ +export function computeVdfInWorker( + g: bigint, + N: bigint, + difficulty: bigint, + onProgress?: VdfProgressCallback +): Promise { + return new Promise((resolve, reject) => { + // Create a Blob containing the worker script + const blob = new Blob([workerContent], { type: "text/javascript" }); + // Create a URL for the Blob + const workerUrl = URL.createObjectURL(blob); + // Create a new Web Worker + const worker = new window.Worker(workerUrl); + + // Handle messages from the worker + worker.onmessage = (event) => { + const { type, progress, result, time } = event.data; + + if (type === "progress") { + if (onProgress) { + onProgress(progress); + } + } else if (type === "result") { + // Resolve the promise with the result and time + resolve({ result: BigInt(result), time }); + // Terminate the worker and revoke the URL + worker.terminate(); + URL.revokeObjectURL(workerUrl); + } + }; + + // Handle potential errors in the worker + worker.onerror = (error) => { + reject(error); + // Terminate the worker and revoke the URL in case of error + worker.terminate(); + URL.revokeObjectURL(workerUrl); + }; + + // Post the data to the worker to start the computation + worker.postMessage({ g, N, difficulty }); + }); +} diff --git a/packages/next/package.json b/packages/next/package.json index 50fadc0..4ae6bb8 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev --turbopack", + "dev": "next dev --turbopack -p 7400", "build": "next build", "start": "next start", "lint": "next lint", @@ -11,9 +11,10 @@ }, "dependencies": { "framer-motion": "^12.12.2", - "next": "15.3.2", - "react": "^19.0.0", - "react-dom": "^19.0.0" + "next": "^15.1.8", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "swr": "^2.3.3" }, "devDependencies": { "typescript": "^5", From cbd46d4030af742356c8e9a73807bfa2e4b0ae07 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sun, 25 May 2025 03:15:10 +0800 Subject: [PATCH 06/24] improve: code style and some subtle changes --- packages/next/app/signup/SignUpForm.tsx | 4 +- packages/next/app/signup/page.tsx | 6 +-- packages/next/components/shell/Header.tsx | 4 +- packages/next/components/ui/TextField.css | 13 +++++++ packages/next/components/ui/TextField.tsx | 46 +++++++++++++++-------- packages/next/next.config.ts | 2 +- 6 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 packages/next/components/ui/TextField.css diff --git a/packages/next/app/signup/SignUpForm.tsx b/packages/next/app/signup/SignUpForm.tsx index 32be0bc..2f834d4 100644 --- a/packages/next/app/signup/SignUpForm.tsx +++ b/packages/next/app/signup/SignUpForm.tsx @@ -143,8 +143,8 @@ const SignUpForm: React.FC = ({ backendURL }) => { />
); diff --git a/packages/next/components/shell/Header.tsx b/packages/next/components/shell/Header.tsx index bb4bf0e..d7b8f81 100644 --- a/packages/next/components/shell/Header.tsx +++ b/packages/next/components/shell/Header.tsx @@ -35,7 +35,7 @@ export const HeaderDestop = () => { className="inline-flex relative gap-6 h-full lg:right-12 text-xl font-medium items-center w-[15rem] min-w-[8rem] mr-4 lg:mr-0 lg:w-[305px] justify-end" > - 注册 + 注册 关于
@@ -71,7 +71,7 @@ export const HeaderMobile = () => {
- + 注册 diff --git a/packages/next/components/ui/TextField.css b/packages/next/components/ui/TextField.css new file mode 100644 index 0000000..0288cc8 --- /dev/null +++ b/packages/next/components/ui/TextField.css @@ -0,0 +1,13 @@ +@import "tailwindcss"; + +.border-middle-idle-empty { + @apply border-y-[1px]; +} + +.border-middle-idle { + @apply border-y-[1px] border-t-0; +} + +.border-middle-focus { + @apply border-primary dark:border-dark-primary border-y-2 border-t-0; +} diff --git a/packages/next/components/ui/TextField.tsx b/packages/next/components/ui/TextField.tsx index 2d23d01..743945c 100644 --- a/packages/next/components/ui/TextField.tsx +++ b/packages/next/components/ui/TextField.tsx @@ -9,9 +9,10 @@ interface InputProps extends React.HTMLAttributes { onInputTextChange?: (value: string) => void; maxChar?: number; supportingText?: string; + variant: "filled" | "outlined" | "standard"; } -const TextField: React.FC = ({ +const OutlineTextField: React.FC = ({ labelText = "", type = "text", inputText: initialInputText = "", @@ -35,23 +36,28 @@ const TextField: React.FC = ({
{labelText} @@ -59,8 +65,10 @@ const TextField: React.FC = ({
@@ -75,12 +83,12 @@ const TextField: React.FC = ({
{(supportingText || maxChar) && (
{supportingText && {supportingText}} {maxChar && ( - + maxChar ? "text-red-500" : ""}`}> {inputText.length}/{maxChar} )} @@ -90,4 +98,10 @@ const TextField: React.FC = ({ ); }; +const TextField: React.FC = (props) => { + if (!props.variant || props.variant === "outlined") { + return ; + } +}; + export default TextField; diff --git a/packages/next/next.config.ts b/packages/next/next.config.ts index 7921f35..b8feafd 100644 --- a/packages/next/next.config.ts +++ b/packages/next/next.config.ts @@ -1,7 +1,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + devIndicators: false }; export default nextConfig; From 16cfae8bad75caf2af17822b7bdb262c97aea0f5 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sun, 25 May 2025 03:15:51 +0800 Subject: [PATCH 07/24] fix: unexpectedly set prop variant of TextField to required --- packages/next/components/ui/TextField.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/components/ui/TextField.tsx b/packages/next/components/ui/TextField.tsx index 743945c..a40795b 100644 --- a/packages/next/components/ui/TextField.tsx +++ b/packages/next/components/ui/TextField.tsx @@ -9,7 +9,7 @@ interface InputProps extends React.HTMLAttributes { onInputTextChange?: (value: string) => void; maxChar?: number; supportingText?: string; - variant: "filled" | "outlined" | "standard"; + variant?: "filled" | "outlined" | "standard"; } const OutlineTextField: React.FC = ({ From 557a013b42a876e52ea653d4624486d6feb4a018 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Tue, 27 May 2025 22:33:28 +0800 Subject: [PATCH 08/24] add: some components, fonts --- .../app/fonts/InterFont/Inter-Black.woff2 | 3 + .../fonts/InterFont/Inter-BlackItalic.woff2 | 3 + .../next/app/fonts/InterFont/Inter-Bold.woff2 | 3 + .../fonts/InterFont/Inter-BoldItalic.woff2 | 3 + .../app/fonts/InterFont/Inter-ExtraBold.woff2 | 3 + .../InterFont/Inter-ExtraBoldItalic.woff2 | 3 + .../fonts/InterFont/Inter-ExtraLight.woff2 | 3 + .../InterFont/Inter-ExtraLightItalic.woff2 | 3 + .../app/fonts/InterFont/Inter-Italic.woff2 | 3 + .../app/fonts/InterFont/Inter-Light.woff2 | 3 + .../fonts/InterFont/Inter-LightItalic.woff2 | 3 + .../app/fonts/InterFont/Inter-Medium.woff2 | 3 + .../fonts/InterFont/Inter-MediumItalic.woff2 | 3 + .../app/fonts/InterFont/Inter-Regular.woff2 | 3 + .../app/fonts/InterFont/Inter-SemiBold.woff2 | 3 + .../InterFont/Inter-SemiBoldItalic.woff2 | 3 + .../next/app/fonts/InterFont/Inter-Thin.woff2 | 3 + .../fonts/InterFont/Inter-ThinItalic.woff2 | 3 + packages/next/app/fonts/InterFont/Inter.css | 450 ++++++++++++++++++ .../fonts/InterFont/InterDisplay-Black.woff2 | 3 + .../InterFont/InterDisplay-BlackItalic.woff2 | 3 + .../fonts/InterFont/InterDisplay-Bold.woff2 | 3 + .../InterFont/InterDisplay-BoldItalic.woff2 | 3 + .../InterFont/InterDisplay-ExtraBold.woff2 | 3 + .../InterDisplay-ExtraBoldItalic.woff2 | 3 + .../InterFont/InterDisplay-ExtraLight.woff2 | 3 + .../InterDisplay-ExtraLightItalic.woff2 | 3 + .../fonts/InterFont/InterDisplay-Italic.woff2 | 3 + .../fonts/InterFont/InterDisplay-Light.woff2 | 3 + .../InterFont/InterDisplay-LightItalic.woff2 | 3 + .../fonts/InterFont/InterDisplay-Medium.woff2 | 3 + .../InterFont/InterDisplay-MediumItalic.woff2 | 3 + .../InterFont/InterDisplay-Regular.woff2 | 3 + .../InterFont/InterDisplay-SemiBold.woff2 | 3 + .../InterDisplay-SemiBoldItalic.woff2 | 3 + .../fonts/InterFont/InterDisplay-Thin.woff2 | 3 + .../InterFont/InterDisplay-ThinItalic.woff2 | 3 + .../InterFont/InterVariable-Italic.woff2 | 3 + .../app/fonts/InterFont/InterVariable.woff2 | 3 + .../next/app/fonts/MiSans/MiSans VF.woff2 | 3 + .../next/app/fonts/MiSans/MiSans-Bold.woff2 | 3 + .../app/fonts/MiSans/MiSans-Demibold.woff2 | 3 + .../app/fonts/MiSans/MiSans-ExtraLight.woff2 | 3 + .../next/app/fonts/MiSans/MiSans-Heavy.woff2 | 3 + .../next/app/fonts/MiSans/MiSans-Light.woff2 | 3 + .../next/app/fonts/MiSans/MiSans-Medium.woff2 | 3 + .../next/app/fonts/MiSans/MiSans-Normal.woff2 | 3 + .../app/fonts/MiSans/MiSans-Regular.woff2 | 3 + .../app/fonts/MiSans/MiSans-Semibold.woff2 | 3 + .../next/app/fonts/MiSans/MiSans-Thin.woff2 | 3 + packages/next/app/fonts/MiSans/MiSans.css | 88 ++++ packages/next/app/globals.css | 171 +++---- packages/next/app/signup/SignUpForm.tsx | 44 +- packages/next/components/shell/Header.tsx | 60 ++- .../components/ui/Buttons/FilledButton.tsx | 41 ++ .../next/components/ui/Buttons/TextButton.tsx | 41 ++ packages/next/components/ui/Dialog.tsx | 57 +++ .../{shell => ui}/NavigatinDrawer.tsx | 12 +- packages/next/components/ui/SearchBox.tsx | 2 +- packages/next/components/utils/ripple.css | 15 + packages/next/components/utils/useRipple.tsx | 90 ++++ 61 files changed, 1079 insertions(+), 139 deletions(-) create mode 100644 packages/next/app/fonts/InterFont/Inter-Black.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-BlackItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-Bold.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-BoldItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-ExtraBold.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-ExtraBoldItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-ExtraLight.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-ExtraLightItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-Italic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-Light.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-LightItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-Medium.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-MediumItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-Regular.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-SemiBold.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-SemiBoldItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-Thin.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter-ThinItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/Inter.css create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-Black.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-BlackItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-Bold.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-BoldItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-ExtraBold.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-ExtraBoldItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-ExtraLight.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-ExtraLightItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-Italic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-Light.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-LightItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-Medium.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-MediumItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-Regular.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-SemiBold.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-SemiBoldItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-Thin.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterDisplay-ThinItalic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterVariable-Italic.woff2 create mode 100644 packages/next/app/fonts/InterFont/InterVariable.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans VF.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Bold.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Demibold.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-ExtraLight.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Heavy.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Light.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Medium.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Normal.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Regular.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Semibold.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans-Thin.woff2 create mode 100644 packages/next/app/fonts/MiSans/MiSans.css create mode 100644 packages/next/components/ui/Buttons/FilledButton.tsx create mode 100644 packages/next/components/ui/Buttons/TextButton.tsx create mode 100644 packages/next/components/ui/Dialog.tsx rename packages/next/components/{shell => ui}/NavigatinDrawer.tsx (78%) create mode 100644 packages/next/components/utils/ripple.css create mode 100644 packages/next/components/utils/useRipple.tsx diff --git a/packages/next/app/fonts/InterFont/Inter-Black.woff2 b/packages/next/app/fonts/InterFont/Inter-Black.woff2 new file mode 100644 index 0000000..89b8df9 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-Black.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12ed0eed6749099b46c7b2e8198dc30c2d7e0f2a4e5fb1d12f0b6ae2c4f33cc4 +size 111668 diff --git a/packages/next/app/fonts/InterFont/Inter-BlackItalic.woff2 b/packages/next/app/fonts/InterFont/Inter-BlackItalic.woff2 new file mode 100644 index 0000000..71f56ab --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-BlackItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:308e101141e9dee3b6b121614da03969eb8179886975a9eeb5348021b04368fe +size 118420 diff --git a/packages/next/app/fonts/InterFont/Inter-Bold.woff2 b/packages/next/app/fonts/InterFont/Inter-Bold.woff2 new file mode 100644 index 0000000..07604e9 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-Bold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa888127b6da015b65569f0351f3b5c391ad928904951f1c20e9f8462a8d95ea +size 114840 diff --git a/packages/next/app/fonts/InterFont/Inter-BoldItalic.woff2 b/packages/next/app/fonts/InterFont/Inter-BoldItalic.woff2 new file mode 100644 index 0000000..ac216a9 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-BoldItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a10532d76c90c4597c0ad4bfc9284600e597d3012dd1ec16c1d44e0ad0058ab +size 121500 diff --git a/packages/next/app/fonts/InterFont/Inter-ExtraBold.woff2 b/packages/next/app/fonts/InterFont/Inter-ExtraBold.woff2 new file mode 100644 index 0000000..1f88168 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-ExtraBold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f75025856f8db1b2186e9cb89be9de9894932c8b7b20f4df5e65916ff714e34 +size 114856 diff --git a/packages/next/app/fonts/InterFont/Inter-ExtraBoldItalic.woff2 b/packages/next/app/fonts/InterFont/Inter-ExtraBoldItalic.woff2 new file mode 100644 index 0000000..25e52ce --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-ExtraBoldItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53bb20ba292e2ac28a0777bf0f56f31b98be432a3cc04359e2eb608c758349c7 +size 121516 diff --git a/packages/next/app/fonts/InterFont/Inter-ExtraLight.woff2 b/packages/next/app/fonts/InterFont/Inter-ExtraLight.woff2 new file mode 100644 index 0000000..1ab4d09 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-ExtraLight.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba4fc81dbb25871f1bcabc664b1e37703fca0a05f7248a923e7db497c6d211cc +size 112728 diff --git a/packages/next/app/fonts/InterFont/Inter-ExtraLightItalic.woff2 b/packages/next/app/fonts/InterFont/Inter-ExtraLightItalic.woff2 new file mode 100644 index 0000000..e88cd22 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-ExtraLightItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38bad3a6a9ad1a7fcd8082e6423ba5e0baea16598f2cf304e527844f697e32b2 +size 119320 diff --git a/packages/next/app/fonts/InterFont/Inter-Italic.woff2 b/packages/next/app/fonts/InterFont/Inter-Italic.woff2 new file mode 100644 index 0000000..6b36b21 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-Italic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d078cb3bc8f934740d53b39dd23b0678f2f97477e49ec785dd9d8acd8b96bfc +size 117700 diff --git a/packages/next/app/fonts/InterFont/Inter-Light.woff2 b/packages/next/app/fonts/InterFont/Inter-Light.woff2 new file mode 100644 index 0000000..1feb0f1 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-Light.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e111a1e2ad914ccda9179b95e83fb10234dd52a1932e0b93c480476227983fd9 +size 112592 diff --git a/packages/next/app/fonts/InterFont/Inter-LightItalic.woff2 b/packages/next/app/fonts/InterFont/Inter-LightItalic.woff2 new file mode 100644 index 0000000..5d65227 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-LightItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:050265b27d11860a26c66c054210852661abb5d229c4e0bb3525757a830f3790 +size 119608 diff --git a/packages/next/app/fonts/InterFont/Inter-Medium.woff2 b/packages/next/app/fonts/InterFont/Inter-Medium.woff2 new file mode 100644 index 0000000..f6354b1 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-Medium.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ff3e94614e1493eb556314fd247ae6c4a85a7783b4cc86be539940cf83f2a48 +size 114348 diff --git a/packages/next/app/fonts/InterFont/Inter-MediumItalic.woff2 b/packages/next/app/fonts/InterFont/Inter-MediumItalic.woff2 new file mode 100644 index 0000000..f578443 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-MediumItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b0df503de488a92082a8c5d72ddc4c0229183ceb645ae1c25c2d0d63778517c +size 120784 diff --git a/packages/next/app/fonts/InterFont/Inter-Regular.woff2 b/packages/next/app/fonts/InterFont/Inter-Regular.woff2 new file mode 100644 index 0000000..cd2b9fe --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-Regular.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e06f6b1bc553aaea4e4668023ed0ab0a147129c3107f511bc7d03d361b0ae085 +size 111268 diff --git a/packages/next/app/fonts/InterFont/Inter-SemiBold.woff2 b/packages/next/app/fonts/InterFont/Inter-SemiBold.woff2 new file mode 100644 index 0000000..6d48aeb --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-SemiBold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cb7103e4e605989afebc03d989c79201e54b21b5183db33981f70db9178a301 +size 114812 diff --git a/packages/next/app/fonts/InterFont/Inter-SemiBoldItalic.woff2 b/packages/next/app/fonts/InterFont/Inter-SemiBoldItalic.woff2 new file mode 100644 index 0000000..89d1089 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-SemiBoldItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e2a2bc3b5b9af0644f005693b10499dab18065d6aedbf46c8b74ccede27daeb +size 121416 diff --git a/packages/next/app/fonts/InterFont/Inter-Thin.woff2 b/packages/next/app/fonts/InterFont/Inter-Thin.woff2 new file mode 100644 index 0000000..8607f76 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-Thin.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70ca998635d9fc627dede8108f04d0989e6e03346183f0ad0917723e790f6973 +size 109548 diff --git a/packages/next/app/fonts/InterFont/Inter-ThinItalic.woff2 b/packages/next/app/fonts/InterFont/Inter-ThinItalic.woff2 new file mode 100644 index 0000000..5637118 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter-ThinItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:930d666b74e0dc0c26c2821f5643b701f8a41beaf3bb95ce146298104f29169c +size 116880 diff --git a/packages/next/app/fonts/InterFont/Inter.css b/packages/next/app/fonts/InterFont/Inter.css new file mode 100644 index 0000000..81a1a16 --- /dev/null +++ b/packages/next/app/fonts/InterFont/Inter.css @@ -0,0 +1,450 @@ +@font-face { + font-family: InterVariable; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url("InterVariable.woff2") format("woff2"); +} + +@font-face { + font-family: InterVariable; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url("InterVariable-Italic.woff2") format("woff2"); +} + +/* static fonts */ +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url("Inter-Thin.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 100; + font-display: swap; + src: url("Inter-ThinItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url("Inter-ExtraLight.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 200; + font-display: swap; + src: url("Inter-ExtraLightItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url("Inter-Light.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url("Inter-LightItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("Inter-Regular.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("Inter-Italic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url("Inter-Medium.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url("Inter-MediumItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("Inter-SemiBold.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 600; + font-display: swap; + src: url("Inter-SemiBoldItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("Inter-Bold.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url("Inter-BoldItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url("Inter-ExtraBold.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 800; + font-display: swap; + src: url("Inter-ExtraBoldItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url("Inter-Black.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 900; + font-display: swap; + src: url("Inter-BlackItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url("InterDisplay-Thin.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 100; + font-display: swap; + src: url("InterDisplay-ThinItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url("InterDisplay-ExtraLight.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 200; + font-display: swap; + src: url("InterDisplay-ExtraLightItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url("InterDisplay-Light.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url("InterDisplay-LightItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("InterDisplay-Regular.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("InterDisplay-Italic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url("InterDisplay-Medium.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url("InterDisplay-MediumItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("InterDisplay-SemiBold.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 600; + font-display: swap; + src: url("InterDisplay-SemiBoldItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("InterDisplay-Bold.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url("InterDisplay-BoldItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url("InterDisplay-ExtraBold.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 800; + font-display: swap; + src: url("InterDisplay-ExtraBoldItalic.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url("InterDisplay-Black.woff2") format("woff2"); +} + +@font-face { + font-family: "InterDisplay"; + font-style: italic; + font-weight: 900; + font-display: swap; + src: url("InterDisplay-BlackItalic.woff2") format("woff2"); +} + +@font-feature-values InterVariable { + @character-variant { + cv01: 1; + cv02: 2; + cv03: 3; + cv04: 4; + cv05: 5; + cv06: 6; + cv07: 7; + cv08: 8; + cv09: 9; + cv10: 10; + cv11: 11; + cv12: 12; + cv13: 13; + alt-1: 1; /* Alternate one */ + alt-3: 9; /* Flat-top three */ + open-4: 2; /* Open four */ + open-6: 3; /* Open six */ + open-9: 4; /* Open nine */ + lc-l-with-tail: 5; /* Lower-case L with tail */ + simplified-u: 6; /* Simplified u */ + alt-double-s: 7; /* Alternate German double s */ + uc-i-with-serif: 8; /* Upper-case i with serif */ + uc-g-with-spur: 10; /* Capital G with spur */ + single-story-a: 11; /* Single-story a */ + compact-lc-f: 12; /* Compact f */ + compact-lc-t: 13; /* Compact t */ + } + @styleset { + ss01: 1; + ss02: 2; + ss03: 3; + ss04: 4; + ss05: 5; + ss06: 6; + ss07: 7; + ss08: 8; + open-digits: 1; /* Open digits */ + disambiguation: 2; /* Disambiguation (with zero) */ + disambiguation-except-zero: 4; /* Disambiguation (no zero) */ + round-quotes-and-commas: 3; /* Round quotes & commas */ + square-punctuation: 7; /* Square punctuation */ + square-quotes: 8; /* Square quotes */ + circled-characters: 5; /* Circled characters */ + squared-characters: 6; /* Squared characters */ + } +} +@font-feature-values Inter { + + @character-variant { + cv01: 1; + cv02: 2; + cv03: 3; + cv04: 4; + cv05: 5; + cv06: 6; + cv07: 7; + cv08: 8; + cv09: 9; + cv10: 10; + cv11: 11; + cv12: 12; + cv13: 13; + alt-1: 1; /* Alternate one */ + alt-3: 9; /* Flat-top three */ + open-4: 2; /* Open four */ + open-6: 3; /* Open six */ + open-9: 4; /* Open nine */ + lc-l-with-tail: 5; /* Lower-case L with tail */ + simplified-u: 6; /* Simplified u */ + alt-double-s: 7; /* Alternate German double s */ + uc-i-with-serif: 8; /* Upper-case i with serif */ + uc-g-with-spur: 10; /* Capital G with spur */ + single-story-a: 11; /* Single-story a */ + compact-lc-f: 12; /* Compact f */ + compact-lc-t: 13; /* Compact t */ + } + @styleset { + ss01: 1; + ss02: 2; + ss03: 3; + ss04: 4; + ss05: 5; + ss06: 6; + ss07: 7; + ss08: 8; + open-digits: 1; /* Open digits */ + disambiguation: 2; /* Disambiguation (with zero) */ + disambiguation-except-zero: 4; /* Disambiguation (no zero) */ + round-quotes-and-commas: 3; /* Round quotes & commas */ + square-punctuation: 7; /* Square punctuation */ + square-quotes: 8; /* Square quotes */ + circled-characters: 5; /* Circled characters */ + squared-characters: 6; /* Squared characters */ + } +} +@font-feature-values InterDisplay { + @character-variant { + cv01: 1; + cv02: 2; + cv03: 3; + cv04: 4; + cv05: 5; + cv06: 6; + cv07: 7; + cv08: 8; + cv09: 9; + cv10: 10; + cv11: 11; + cv12: 12; + cv13: 13; + alt-1: 1; /* Alternate one */ + alt-3: 9; /* Flat-top three */ + open-4: 2; /* Open four */ + open-6: 3; /* Open six */ + open-9: 4; /* Open nine */ + lc-l-with-tail: 5; /* Lower-case L with tail */ + simplified-u: 6; /* Simplified u */ + alt-double-s: 7; /* Alternate German double s */ + uc-i-with-serif: 8; /* Upper-case i with serif */ + uc-g-with-spur: 10; /* Capital G with spur */ + single-story-a: 11; /* Single-story a */ + compact-lc-f: 12; /* Compact f */ + compact-lc-t: 13; /* Compact t */ + } + @styleset { + ss01: 1; + ss02: 2; + ss03: 3; + ss04: 4; + ss05: 5; + ss06: 6; + ss07: 7; + ss08: 8; + open-digits: 1; /* Open digits */ + disambiguation: 2; /* Disambiguation (with zero) */ + disambiguation-except-zero: 4; /* Disambiguation (no zero) */ + round-quotes-and-commas: 3; /* Round quotes & commas */ + square-punctuation: 7; /* Square punctuation */ + square-quotes: 8; /* Square quotes */ + circled-characters: 5; /* Circled characters */ + squared-characters: 6; /* Squared characters */ + } +} diff --git a/packages/next/app/fonts/InterFont/InterDisplay-Black.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-Black.woff2 new file mode 100644 index 0000000..d7dbac2 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-Black.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05650cb83c70fda2a465eade0c0a1a6c25d37ec49df3cd74b7e564683f9729f1 +size 110308 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-BlackItalic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-BlackItalic.woff2 new file mode 100644 index 0000000..98950fe --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-BlackItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9746bf2bd43fe158144b83ede747088e80396daad55b9e6ea7232e0e22ee6fce +size 116820 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-Bold.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-Bold.woff2 new file mode 100644 index 0000000..c6992e4 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-Bold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23bc37619593377e128f24660fedb2869d18277b4026cb46e5637be7643faf91 +size 113556 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-BoldItalic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-BoldItalic.woff2 new file mode 100644 index 0000000..30c6bfb --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-BoldItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a0fe1f01b8777fab4a5f73c757743fa52579c7723b0291777625cb53c0a792a +size 120432 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-ExtraBold.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-ExtraBold.woff2 new file mode 100644 index 0000000..a426fdb --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-ExtraBold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97eeee5a6f4f22fef1f607cf8836104d65968f03e59bc068a7586bf18364a8a7 +size 113636 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-ExtraBoldItalic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-ExtraBoldItalic.woff2 new file mode 100644 index 0000000..7358e69 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-ExtraBoldItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:159b72ba47887032915420aa1445ae6768197e7ea732230182998f14d1cdb932 +size 120712 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-ExtraLight.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-ExtraLight.woff2 new file mode 100644 index 0000000..f93b602 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-ExtraLight.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9031b6d2a1a559753d50b311ecb463ddf7acaaae1d992a7e9b009620d8ce6def +size 113108 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-ExtraLightItalic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-ExtraLightItalic.woff2 new file mode 100644 index 0000000..0c749bb --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-ExtraLightItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8d7078160ef92b82c2123857c1b3aefaa4a795a44b56df5fe3edade60d81576 +size 120124 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-Italic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-Italic.woff2 new file mode 100644 index 0000000..4d6a0e4 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-Italic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfd398d7372b61278e1505bfbdfc5ab0f6511ef887a47a2c90c13475eae585da +size 116988 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-Light.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-Light.woff2 new file mode 100644 index 0000000..c1cdf65 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-Light.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01dd2d491ed863177e61f6e9458813baa85453ad97b32c5c1216927d4eebfe65 +size 112976 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-LightItalic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-LightItalic.woff2 new file mode 100644 index 0000000..84336f7 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-LightItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59b5be56306fd353d067aa6995c2c92bc3feb3ace73684d94e3c6e73fe2beaac +size 119692 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-Medium.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-Medium.woff2 new file mode 100644 index 0000000..cccb58b --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-Medium.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1227907684853882ad00d7f97ce9f64bc17b89a2a291a7d4ec84fccfa442934 +size 113476 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-MediumItalic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-MediumItalic.woff2 new file mode 100644 index 0000000..7d96b60 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-MediumItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bf254c1a65c806c019f52818add66747da83595a314112917911bcf5fa2f5c5 +size 120560 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-Regular.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-Regular.woff2 new file mode 100644 index 0000000..8112f1d --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-Regular.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a9463a58c3e7ba1e3cd65b5dbff91a35c508ff78a104cd1121feff83efeb787 +size 108948 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-SemiBold.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-SemiBold.woff2 new file mode 100644 index 0000000..5b42dac --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-SemiBold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9f63a82b826fb0117c92715c3a52a2d2247bc321bc39341420bf52d91e8277a +size 113772 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-SemiBoldItalic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-SemiBoldItalic.woff2 new file mode 100644 index 0000000..257b0fa --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-SemiBoldItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd9d78314bdd5062302a73c7e2954008bab8158304fa7ac4f0ea8977b841dccb +size 120468 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-Thin.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-Thin.woff2 new file mode 100644 index 0000000..18ede47 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-Thin.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21cfe42e7f1031b410e247ed199f43fc362415af81b3a8e442a97f63b4dbe327 +size 108820 diff --git a/packages/next/app/fonts/InterFont/InterDisplay-ThinItalic.woff2 b/packages/next/app/fonts/InterFont/InterDisplay-ThinItalic.woff2 new file mode 100644 index 0000000..8b58c68 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterDisplay-ThinItalic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eff21589eacf1f6a596191038d7b47b4dd2455a096b175bb3572ecb6d026a611 +size 116040 diff --git a/packages/next/app/fonts/InterFont/InterVariable-Italic.woff2 b/packages/next/app/fonts/InterFont/InterVariable-Italic.woff2 new file mode 100644 index 0000000..318e720 --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterVariable-Italic.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e564f652916db6c139570fefb9524a77c4d48f30c92928de9db19b6b5c7a262a +size 387976 diff --git a/packages/next/app/fonts/InterFont/InterVariable.woff2 b/packages/next/app/fonts/InterFont/InterVariable.woff2 new file mode 100644 index 0000000..e511e5e --- /dev/null +++ b/packages/next/app/fonts/InterFont/InterVariable.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:693b77d4f32ee9b8bfc995589b5fad5e99adf2832738661f5402f9978429a8e3 +size 352240 diff --git a/packages/next/app/fonts/MiSans/MiSans VF.woff2 b/packages/next/app/fonts/MiSans/MiSans VF.woff2 new file mode 100644 index 0000000..1cd2a1d --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans VF.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09103434dc310743d51b5e66111848c75c76a00a5a5bc9e5d96200a7e63bf98b +size 11870264 diff --git a/packages/next/app/fonts/MiSans/MiSans-Bold.woff2 b/packages/next/app/fonts/MiSans/MiSans-Bold.woff2 new file mode 100644 index 0000000..69fecf9 --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Bold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb86bb54661547ed95a44ec099ab75f964a0b81e256845f56feaabf27541180b +size 5067652 diff --git a/packages/next/app/fonts/MiSans/MiSans-Demibold.woff2 b/packages/next/app/fonts/MiSans/MiSans-Demibold.woff2 new file mode 100644 index 0000000..31b9d31 --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Demibold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d22e2de2e994f7ad7336820129e0a27a97840d3591fdc3a0fb6ba382d7dbb569 +size 4981184 diff --git a/packages/next/app/fonts/MiSans/MiSans-ExtraLight.woff2 b/packages/next/app/fonts/MiSans/MiSans-ExtraLight.woff2 new file mode 100644 index 0000000..bc1c234 --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-ExtraLight.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc71ed05c3044ebdb3f69a5da9e8e1e0701f172837450d21157e3998e3eecce9 +size 4733240 diff --git a/packages/next/app/fonts/MiSans/MiSans-Heavy.woff2 b/packages/next/app/fonts/MiSans/MiSans-Heavy.woff2 new file mode 100644 index 0000000..a81da0d --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Heavy.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7891c8eb6cffe1910f239e4fc55646f5e1767445e1802a34d5f940977f5dd9ec +size 4999800 diff --git a/packages/next/app/fonts/MiSans/MiSans-Light.woff2 b/packages/next/app/fonts/MiSans/MiSans-Light.woff2 new file mode 100644 index 0000000..f32ebaf --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Light.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2918bcf6864e5a255c34f0ddbec83d32f4a7db9e7dfcff03ce6591ac540d3df +size 4798348 diff --git a/packages/next/app/fonts/MiSans/MiSans-Medium.woff2 b/packages/next/app/fonts/MiSans/MiSans-Medium.woff2 new file mode 100644 index 0000000..be26a7f --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Medium.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abd794688489b3c3ceeb9d2f61d5d9d09ae25381f40945c3aa6d0683cd78a197 +size 4928036 diff --git a/packages/next/app/fonts/MiSans/MiSans-Normal.woff2 b/packages/next/app/fonts/MiSans/MiSans-Normal.woff2 new file mode 100644 index 0000000..98d4976 --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Normal.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63c882e6994b4a572173881d777962418b803dc166d41405d77dba40b2d0dcd9 +size 4868672 diff --git a/packages/next/app/fonts/MiSans/MiSans-Regular.woff2 b/packages/next/app/fonts/MiSans/MiSans-Regular.woff2 new file mode 100644 index 0000000..89feb59 --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Regular.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d7a4ba4faf18306e446787c1ab1bd1e90c9f27bfa937cd8eb3469c7504e563f +size 4847960 diff --git a/packages/next/app/fonts/MiSans/MiSans-Semibold.woff2 b/packages/next/app/fonts/MiSans/MiSans-Semibold.woff2 new file mode 100644 index 0000000..01869ac --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Semibold.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14505bb0c0db9b33fd636ae5c13e1d48ec4cdb51fe35c993a63b2629f6547819 +size 5016928 diff --git a/packages/next/app/fonts/MiSans/MiSans-Thin.woff2 b/packages/next/app/fonts/MiSans/MiSans-Thin.woff2 new file mode 100644 index 0000000..5370b32 --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans-Thin.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8684502229233359f74b3d273d84214368b270e73a3e068678ef29738c90f2c +size 4470104 diff --git a/packages/next/app/fonts/MiSans/MiSans.css b/packages/next/app/fonts/MiSans/MiSans.css new file mode 100644 index 0000000..9c80a29 --- /dev/null +++ b/packages/next/app/fonts/MiSans/MiSans.css @@ -0,0 +1,88 @@ +@font-face { + font-family: "MiSans VF"; + font-style: normal; + font-weight: 150 700; + font-display: swap; + src: url("MiSans VF.woff2") format("woff2"); +} + + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url("MiSans-Thin.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url("MiSans-ExtraLight.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url("MiSans-Light.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 360; + font-display: swap; + src: url("MiSans-Normal.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("MiSans-Regular.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url("MiSans-Medium.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("MiSans-Demibold.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("MiSans-Semibold.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url("MiSans-Bold.woff2") format("woff2"); +} + +@font-face { + font-family: "MiSans"; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url("MiSans-Heavy.woff2") format("woff2"); +} \ No newline at end of file diff --git a/packages/next/app/globals.css b/packages/next/app/globals.css index 9a2207c..0b12f9a 100644 --- a/packages/next/app/globals.css +++ b/packages/next/app/globals.css @@ -1,105 +1,84 @@ +@import url("./fonts/InterFont/Inter.css"); +@import url("./fonts/MiSans/MiSans.css"); + @import "tailwindcss"; @theme { - --color-surface-container-high: #f7e4e1; - --color-on-surface-variant: #534341; - --color-dark-on-surface-variant: #d8c2be; - --color-dark-surface-container-high: #322826; - --color-dark-surface-container: #271d1c; - --color-surface-container: #fceae7; - --color-on-surface: #231918; - --color-dark-on-surface: #f1dfdc; + --color-background: #fff8f6; + --color-on-background: #2a1613; --color-surface: #fff8f6; - --color-dark-surface: #1a1110; - --color-primary: #904b40; - --color-dark-primary: #ffb2b7; - --color-primary-container: #ffdad4; - --color-dark-primary-container: #73342a; + --color-surface-dim: #f7d2cc; + --color-surface-bright: #fff8f6; + --color-surface-container-lowest: #ffffff; + --color-surface-container-low: #fff0ee; + --color-surface-container: #ffe9e6; + --color-surface-container-high: #ffe2dd; + --color-surface-container-highest: #ffdad4; + --color-on-surface: #2a1613; + --color-surface-variant: #ffdad4; + --color-on-surface-variant: #5f3e39; + --color-inverse-surface: #422b27; + --color-inverse-on-surface: #ffedea; + --color-outline: #946e68; + --color-outline-variant: #eabcb4; + --color-shadow: #000000; + --color-scrim: #000000; + --color-surface-tint: #c00100; + --color-primary: #a50100; --color-on-primary: #ffffff; - --color-dark-on-primary: #561e16; - --color-dark-primary-fixed-dim: #ffb4a8; - --color-secondary-container: #ffdad4; - --color-dark-secondary-container: #5d3f3b; + --color-primary-container: #eb0000; + --color-on-primary-container: #ffffff; + --color-inverse-primary: #ffb4a8; + --color-secondary: #b4271a; + --color-on-secondary: #ffffff; + --color-secondary-container: #ff7460; + --color-on-secondary-container: #2f0000; + --color-tertiary: #6f4800; + --color-on-tertiary: #ffffff; + --color-tertiary-container: #9f6900; + --color-on-tertiary-container: #ffffff; + --color-error: #ba1a1a; + --color-on-error: #ffffff; + --color-error-container: #ffdad6; + --color-on-error-container: #410002; - --color-surface-tint: rgb(144 75 64); - --color-dark-surface-tint: rgb(255 180 168); - --color-on-primary-container: rgb(115 52 42); - --color-dark-on-primary-container: rgb(255 218 212); - --color-secondary: rgb(119 86 81); - --color-dark-secondary: rgb(231 189 182); - --color-on-secondary: rgb(255 255 255); - --color-dark-on-secondary: rgb(68 41 37); - --color-on-secondary-container: rgb(93 63 59); - --color-dark-on-secondary-container: rgb(255 218 212); - --color-tertiary: rgb(112 92 46); - --color-dark-tertiary: rgb(222 196 140); - --color-on-tertiary: rgb(255 255 255); - --color-dark-on-tertiary: rgb(62 46 4); - --color-tertiary-container: rgb(251 223 166); - --color-dark-tertiary-container: rgb(86 68 25); - --color-on-tertiary-container: rgb(86 68 25); - --color-dark-on-tertiary-container: rgb(251 223 166); - --color-error: rgb(186 26 26); - --color-dark-error: rgb(255 180 171); - --color-on-error: rgb(255 255 255); - --color-dark-on-error: rgb(105 0 5); - --color-error-container: rgb(255 218 214); - --color-dark-error-container: rgb(147 0 10); - --color-on-error-container: rgb(147 0 10); - --color-dark-on-error-container: rgb(255 218 214); - --color-background: rgb(255 248 246); - --color-dark-background: rgb(26 17 16); - --color-on-background: rgb(35 25 24); - --color-dark-on-background: rgb(241 223 220); - --color-surface-variant: rgb(245 221 218); - --color-dark-surface-variant: rgb(83 67 65); - --color-outline: rgb(133 115 112); - --color-dark-outline: rgb(160 140 137); - --color-outline-variant: rgb(216 194 190); - --color-dark-outline-variant: rgb(83 67 65); - --color-shadow: rgb(0 0 0); - --color-dark-shadow: rgb(0 0 0); - --color-scrim: rgb(0 0 0); - --color-dark-scrim: rgb(0 0 0); - --color-inverse-surface: rgb(57 46 44); - --color-dark-inverse-surface: rgb(241 223 220); - --color-inverse-on-surface: rgb(255 237 234); - --color-dark-inverse-on-surface: rgb(57 46 44); - --color-inverse-primary: rgb(255 180 168); - --color-dark-inverse-primary: rgb(144 75 64); - --color-primary-fixed: rgb(255 218 212); - --color-dark-primary-fixed: rgb(255 218 212); - --color-on-primary-fixed: rgb(58 9 5); - --color-dark-on-primary-fixed: rgb(58 9 5); - --color-primary-fixed-dim: rgb(255 180 168); - --color-on-primary-fixed-variant: rgb(115 52 42); - --color-dark-on-primary-fixed-variant: rgb(115 52 42); - --color-secondary-fixed: rgb(255 218 212); - --color-dark-secondary-fixed: rgb(255 218 212); - --color-on-secondary-fixed: rgb(44 21 18); - --color-dark-on-secondary-fixed: rgb(44 21 18); - --color-secondary-fixed-dim: rgb(231 189 182); - --color-dark-secondary-fixed-dim: rgb(231 189 182); - --color-on-secondary-fixed-variant: rgb(93 63 59); - --color-dark-on-secondary-fixed-variant: rgb(93 63 59); - --color-tertiary-fixed: rgb(251 223 166); - --color-dark-tertiary-fixed: rgb(251 223 166); - --color-on-tertiary-fixed: rgb(37 26 0); - --color-dark-on-tertiary-fixed: rgb(37 26 0); - --color-tertiary-fixed-dim: rgb(222 196 140); - --color-dark-tertiary-fixed-dim: rgb(222 196 140); - --color-on-tertiary-fixed-variant: rgb(86 68 25); - --color-dark-on-tertiary-fixed-variant: rgb(86 68 25); - --color-surface-dim: rgb(232 214 211); - --color-dark-surface-dim: rgb(26 17 16); - --color-surface-bright: rgb(255 248 246); - --color-dark-surface-bright: rgb(66 55 53); - --color-surface-container-lowest: rgb(255 255 255); - --color-dark-surface-container-lowest: rgb(20 12 11); - --color-surface-container-low: rgb(255 240 238); - --color-dark-surface-container-low: rgb(35 25 24); - --color-surface-container-highest: rgb(241 223 220); - --color-dark-surface-container-highest: rgb(61 50 48); + --color-dark-background: #210e0b; + --color-dark-on-background: #ffdad4; + --color-dark-surface: #210e0b; + --color-dark-surface-dim: #210e0b; + --color-dark-surface-bright: #4b332f; + --color-dark-surface-container-lowest: #1b0907; + --color-dark-surface-container-low: #2a1613; + --color-dark-surface-container: #2f1a17; + --color-dark-surface-container-high: #3a2421; + --color-dark-surface-container-highest: #462f2b; + --color-dark-on-surface: #ffdad4; + --color-dark-surface-variant: #5f3e39; + --color-dark-on-surface-variant: #eabcb4; + --color-dark-inverse-surface: #ffdad4; + --color-dark-inverse-on-surface: #422b27; + --color-dark-outline: #b08780; + --color-dark-outline-variant: #5f3e39; + --color-dark-shadow: #000000; + --color-dark-scrim: #000000; + --color-dark-surface-tint: #ffb4a8; + --color-dark-primary: #ffb4a8; + --color-dark-on-primary: #690000; + --color-dark-primary-container: #de0000; + --color-dark-on-primary-container: #ffffff; + --color-dark-inverse-primary: #c00100; + --color-dark-secondary: #ffb4a8; + --color-dark-on-secondary: #690000; + --color-dark-secondary-container: #870100; + --color-dark-on-secondary-container: #ffc9c0; + --color-dark-tertiary: #feba54; + --color-dark-on-tertiary: #452b00; + --color-dark-tertiary-container: #966300; + --color-dark-on-tertiary-container: #ffffff; + --color-dark-error: #ffb4ab; + --color-dark-on-error: #690005; + --color-dark-error-container: #93000a; + --color-dark-on-error-container: #ffdad6; --font-zh: "InterVariable", "MiSans VF", sans-serif; } diff --git a/packages/next/app/signup/SignUpForm.tsx b/packages/next/app/signup/SignUpForm.tsx index 2f834d4..28ccddc 100644 --- a/packages/next/app/signup/SignUpForm.tsx +++ b/packages/next/app/signup/SignUpForm.tsx @@ -6,6 +6,9 @@ import LoadingSpinner from "@/components/icons/LoadingSpinner"; import { computeVdfInWorker } from "@/lib/vdf"; import useSWR from "swr"; import { ApiRequestError } from "@/lib/net"; +import { Portal } from "@/components/utils/Portal"; +import { Dialog, DialogHeadline, DialogSupportingText } from "@/components/ui/Dialog"; +import { FilledButton } from "@/components/ui/Buttons/FilledButton"; interface CaptchaSessionResponse { g: string; @@ -38,6 +41,8 @@ const SignUpForm: React.FC = ({ backendURL }) => { const [password, setPassword] = useState(""); const [nickname, setNickname] = useState(""); const [loading, setLoading] = useState(false); + const [showDialog, setShowDialog] = useState(false); + const [dialogContent, setDialogContent] = useState(<>); const { data: captchaSession, @@ -83,15 +88,13 @@ const SignUpForm: React.FC = ({ backendURL }) => { const registrationResponse = await fetch(registrationUrl.toString(), { method: "POST", headers: { - "Content-Type": "application/json" + "Content-Type": "application/json", + Authorization: `Bearer ${captchaResult.token}` }, body: JSON.stringify({ username, password, - nickname, - // Include the captcha result if needed by the backend - captchaId: captchaSession.id, - captchaAnswer: ans.result.toString() + nickname }) }); @@ -141,15 +144,32 @@ const SignUpForm: React.FC = ({ backendURL }) => { supportingText="昵称可以重复。" maxChar={30} /> - + + + setShowDialog(false)}> + {dialogContent} + + ); }; diff --git a/packages/next/components/shell/Header.tsx b/packages/next/components/shell/Header.tsx index d7b8f81..2ce8990 100644 --- a/packages/next/components/shell/Header.tsx +++ b/packages/next/components/shell/Header.tsx @@ -6,14 +6,17 @@ import LogoMobileLight from "@/public/icons/TitleBar Mobile Light.svg"; import LogoMobileDark from "@/public/icons/TitleBar Mobile Dark.svg"; import DarkModeImage from "@/components/utils/DarkModeImage"; import React, { useState } from "react"; -import { NavigationDrawer } from "@/components/shell/NavigatinDrawer"; +import { NavigationDrawer } from "@/components/ui/NavigatinDrawer"; import { Portal } from "@/components/utils/Portal"; import { RegisterIcon } from "@/components/icons/RegisterIcon"; import { SearchBox } from "@/components/ui/SearchBox"; import { MenuIcon } from "@/components/icons/MenuIcon"; import { SearchIcon } from "@/components/icons/SearchIcon"; -import { InfoIcon } from "../icons/InfoIcon"; -import { HomeIcon } from "../icons/HomeIcon"; +import { InfoIcon } from "@/components/icons/InfoIcon"; +import { HomeIcon } from "@/components/icons/HomeIcon"; +import { TextButton } from "@/components/ui/Buttons/TextButton"; +import { useRouter } from "next/navigation"; +import Link from "next/link"; export const HeaderDestop = () => { return ( @@ -45,37 +48,46 @@ export const HeaderDestop = () => { export const HeaderMobile = () => { const [showDrawer, setShowDrawer] = useState(false); const [showsearchBox, setShowsearchBox] = useState(false); + return ( <> setShowDrawer(false)}> -
-
+
+
- - - + + + +
+ + 首页 +
+
+ + + +
+ + 关于 +
+
+ + + + +
+ + 注册 +
+
+
diff --git a/packages/next/components/ui/Buttons/FilledButton.tsx b/packages/next/components/ui/Buttons/FilledButton.tsx new file mode 100644 index 0000000..2484b0c --- /dev/null +++ b/packages/next/components/ui/Buttons/FilledButton.tsx @@ -0,0 +1,41 @@ +import useRipple from "@/components/utils/useRipple"; + +interface FilledButtonProps extends React.ButtonHTMLAttributes { + size?: "xs" | "s" | "m" | "l" | "xl"; + shape?: "round" | "square"; + children?: React.ReactNode; + ripple?: boolean; +} + +export const FilledButton = ({ + children, + size = "s", + shape = "round", + className, + ripple = true, + ...rest +}: FilledButtonProps) => { + let sizeClasses = "text-sm leading-5 h-10 px-4"; + let shapeClasses = "rounded-full"; + + if (size === "m") { + sizeClasses = "text-base leading-6 h-14 px-6"; + shapeClasses = shape === "round" ? "rounded-full" : "rounded-2xl"; + } + + const { onMouseDown, onTouchStart } = useRipple({ ripple }); + + return ( + + ); +}; diff --git a/packages/next/components/ui/Buttons/TextButton.tsx b/packages/next/components/ui/Buttons/TextButton.tsx new file mode 100644 index 0000000..0ee83e2 --- /dev/null +++ b/packages/next/components/ui/Buttons/TextButton.tsx @@ -0,0 +1,41 @@ +import useRipple from "@/components/utils/useRipple"; + +interface TextButtonProps extends React.ButtonHTMLAttributes { + size?: "xs" | "s" | "m" | "l" | "xl"; + shape?: "round" | "square"; + children?: React.ReactNode; + ripple?: boolean; +} + +export const TextButton = ({ + children, + size = "s", + shape = "round", + className, + ripple = true, + ...rest +}: TextButtonProps) => { + let sizeClasses = "text-sm leading-5 h-10 px-4"; + let shapeClasses = "rounded-full"; + + if (size === "m") { + sizeClasses = "text-base leading-6 h-14 px-6"; + shapeClasses = shape === "round" ? "rounded-full" : "rounded-2xl"; + } + + const { onMouseDown, onTouchStart } = useRipple({ ripple }); + + return ( + + ); +}; diff --git a/packages/next/components/ui/Dialog.tsx b/packages/next/components/ui/Dialog.tsx new file mode 100644 index 0000000..1fc3d25 --- /dev/null +++ b/packages/next/components/ui/Dialog.tsx @@ -0,0 +1,57 @@ +import { motion, AnimatePresence } from "framer-motion"; +import React, { useEffect, useRef } from "react"; +import { TextButton } from "./Buttons/TextButton"; + +interface DialogProps { + show: boolean; + onClose: () => void; + children?: React.ReactNode; +} + +interface DialogHeadlineProps { + children?: React.ReactNode; +} + +interface DialogSupportingTextProps { + children?: React.ReactNode; +} + +export const DialogHeadline: React.FC = ({ children }: DialogHeadlineProps) => { + return

{children}

; +}; + +export const DialogSupportingText: React.FC = ({ children }: DialogHeadlineProps) => { + return
{children}
; +}; +export const Dialog: React.FC = ({ show, onClose, children }: DialogProps) => { + return ( + + {show && ( +
+
+ )} +
+ ); +}; diff --git a/packages/next/components/shell/NavigatinDrawer.tsx b/packages/next/components/ui/NavigatinDrawer.tsx similarity index 78% rename from packages/next/components/shell/NavigatinDrawer.tsx rename to packages/next/components/ui/NavigatinDrawer.tsx index 5e7967b..3be7013 100644 --- a/packages/next/components/shell/NavigatinDrawer.tsx +++ b/packages/next/components/ui/NavigatinDrawer.tsx @@ -8,11 +8,11 @@ interface DrawerProps { } export const NavigationDrawer = ({ show = false, onClose, children }: DrawerProps) => { - const coverRef = useRef(null); + const scrimRef = useRef(null); useEffect(() => { const handleOutsideClick = (event: MouseEvent) => { - if (show && coverRef.current && event.target === coverRef.current) { + if (show && scrimRef.current && event.target === scrimRef.current) { onClose(); } }; @@ -27,9 +27,9 @@ export const NavigationDrawer = ({ show = false, onClose, children }: DrawerProp {show && ( <> - {/* Backdrop - Fade in/out */} + {/* Scrim - Fade in/out */}