diff --git a/.gitignore b/.gitignore index a84107af3..57854c1fe 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +.env.local diff --git a/.vscode/typescriptreact.json.code-snippets b/.vscode/typescriptreact.json.code-snippets new file mode 100644 index 000000000..183c9a3e2 --- /dev/null +++ b/.vscode/typescriptreact.json.code-snippets @@ -0,0 +1,57 @@ +{ + // Place your dojangNext workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and + // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope + // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is + // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: + // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. + // Placeholders with the same ids are connected. + // Example: + // "Print to console": { + // "scope": "javascript,typescript", + // "prefix": "log", + // "body": [ + // "console.log('$1');", + // "$2" + // ], + // "description": "Log output to console" + // } + + + "comp": { + "prefix": "comp", + "body": [ + "const ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}} = () => {", + " return (", + "
${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}
", + " )", + "}", + "", + "export default ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}" + ], + "description": "Create a component" + }, +"compt": { + "prefix": "compt", + "body": [ + "const ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}} = () => {", + " return (", + "
${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}
", + " )", + "}", + "", + "export default ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}" + ], + "description": "Create a component with tailwind classname" + }, + +"divt": { + "prefix": "divt", + "body": [ + + "
", + ], + "description": "Create a component with tailwind classname" + } + + +} \ No newline at end of file diff --git a/calendarEvents.jsonl b/calendarEvents.jsonl new file mode 100644 index 000000000..aa6018ef2 --- /dev/null +++ b/calendarEvents.jsonl @@ -0,0 +1,10 @@ +{"title": "Math","allDay": false,"start": "","end": ""} +{"title": "English","allDay": false,"start": "","end": ""} +{"title": "Biology","allDay": false,"start": "","end": ""} +{"title": "Physics","allDay": false,"start": "","end": ""} +{"title": "Chemistry","allDay": false,"start": "","end": ""} +{"title": "History","allDay": false,"start": "","end": ""} +{"title": "English","allDay": false,"start": "","end": ""} +{"title": "Biology","allDay": false,"start": "","end": ""} +{"title": "Physics","allDay": false,"start": "","end": ""} +{"title": "History","allDay": false,"start": "","end": ""} \ No newline at end of file diff --git a/convex/README.md b/convex/README.md new file mode 100644 index 000000000..4d82e1363 --- /dev/null +++ b/convex/README.md @@ -0,0 +1,90 @@ +# Welcome to your Convex functions directory! + +Write your Convex functions here. +See https://docs.convex.dev/functions for more. + +A query function that takes two arguments looks like: + +```ts +// functions.js +import { query } from "./_generated/server"; +import { v } from "convex/values"; + +export const myQueryFunction = query({ + // Validators for arguments. + args: { + first: v.number(), + second: v.string(), + }, + + // Function implementation. + handler: async (ctx, args) => { + // Read the database as many times as you need here. + // See https://docs.convex.dev/database/reading-data. + const documents = await ctx.db.query("tablename").collect(); + + // Arguments passed from the client are properties of the args object. + console.log(args.first, args.second); + + // Write arbitrary JavaScript here: filter, aggregate, build derived data, + // remove non-public properties, or create new objects. + return documents; + }, +}); +``` + +Using this query function in a React component looks like: + +```ts +const data = useQuery(api.functions.myQueryFunction, { + first: 10, + second: "hello", +}); +``` + +A mutation function looks like: + +```ts +// functions.js +import { mutation } from "./_generated/server"; +import { v } from "convex/values"; + +export const myMutationFunction = mutation({ + // Validators for arguments. + args: { + first: v.string(), + second: v.string(), + }, + + // Function implementation. + handler: async (ctx, args) => { + // Insert or modify documents in the database here. + // Mutations can also read from the database like queries. + // See https://docs.convex.dev/database/writing-data. + const message = { body: args.first, author: args.second }; + const id = await ctx.db.insert("messages", message); + + // Optionally, return a value from your mutation. + return await ctx.db.get(id); + }, +}); +``` + +Using this mutation function in a React component looks like: + +```ts +const mutation = useMutation(api.functions.myMutationFunction); +function handleButtonPress() { + // fire and forget, the most common way to use mutations + mutation({ first: "Hello!", second: "me" }); + // OR + // use the result once the mutation has completed + mutation({ first: "Hello!", second: "me" }).then((result) => + console.log(result), + ); +} +``` + +Use the Convex CLI to push your functions to a deployment. See everything +the Convex CLI can do by running `npx convex -h` in your project root +directory. To learn more, launch the docs with `npx convex docs`. diff --git a/convex/_generated/api.d.ts b/convex/_generated/api.d.ts new file mode 100644 index 000000000..7ea88e4f4 --- /dev/null +++ b/convex/_generated/api.d.ts @@ -0,0 +1,40 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ +/** + * Generated `api` utility. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import type { + ApiFromModules, + FilterApi, + FunctionReference, +} from "convex/server"; +import type * as calendarEvents from "../calendarEvents.js"; + +/** + * A utility for referencing Convex functions in your app's API. + * + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` + */ +declare const fullApi: ApiFromModules<{ + calendarEvents: typeof calendarEvents; +}>; +export declare const api: FilterApi< + typeof fullApi, + FunctionReference +>; +export declare const internal: FilterApi< + typeof fullApi, + FunctionReference +>; + +/* prettier-ignore-end */ diff --git a/convex/_generated/api.js b/convex/_generated/api.js new file mode 100644 index 000000000..b5f2e089d --- /dev/null +++ b/convex/_generated/api.js @@ -0,0 +1,26 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ +/** + * Generated `api` utility. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import { anyApi } from "convex/server"; + +/** + * A utility for referencing Convex functions in your app's API. + * + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` + */ +export const api = anyApi; +export const internal = anyApi; + +/* prettier-ignore-end */ diff --git a/convex/_generated/dataModel.d.ts b/convex/_generated/dataModel.d.ts new file mode 100644 index 000000000..4c7c9f853 --- /dev/null +++ b/convex/_generated/dataModel.d.ts @@ -0,0 +1,62 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ +/** + * Generated data model types. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import { AnyDataModel } from "convex/server"; +import type { GenericId } from "convex/values"; + +/** + * No `schema.ts` file found! + * + * This generated code has permissive types like `Doc = any` because + * Convex doesn't know your schema. If you'd like more type safety, see + * https://docs.convex.dev/using/schemas for instructions on how to add a + * schema file. + * + * After you change a schema, rerun codegen with `npx convex dev`. + */ + +/** + * The names of all of your Convex tables. + */ +export type TableNames = string; + +/** + * The type of a document stored in Convex. + */ +export type Doc = any; + +/** + * An identifier for a document in Convex. + * + * Convex documents are uniquely identified by their `Id`, which is accessible + * on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids). + * + * Documents can be loaded using `db.get(id)` in query and mutation functions. + * + * IDs are just strings at runtime, but this type can be used to distinguish them from other + * strings when type checking. + */ +export type Id = + GenericId; + +/** + * A type describing your Convex data model. + * + * This type includes information about what tables you have, the type of + * documents stored in those tables, and the indexes defined on them. + * + * This type is used to parameterize methods like `queryGeneric` and + * `mutationGeneric` to make them type-safe. + */ +export type DataModel = AnyDataModel; + +/* prettier-ignore-end */ diff --git a/convex/_generated/server.d.ts b/convex/_generated/server.d.ts new file mode 100644 index 000000000..8190e1ff3 --- /dev/null +++ b/convex/_generated/server.d.ts @@ -0,0 +1,146 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ +/** + * Generated utilities for implementing server-side Convex query and mutation functions. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import { + ActionBuilder, + HttpActionBuilder, + MutationBuilder, + QueryBuilder, + GenericActionCtx, + GenericMutationCtx, + GenericQueryCtx, + GenericDatabaseReader, + GenericDatabaseWriter, +} from "convex/server"; +import type { DataModel } from "./dataModel.js"; + +/** + * Define a query in this Convex app's public API. + * + * This function will be allowed to read your Convex database and will be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export declare const query: QueryBuilder; + +/** + * Define a query that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to read from your Convex database. It will not be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export declare const internalQuery: QueryBuilder; + +/** + * Define a mutation in this Convex app's public API. + * + * This function will be allowed to modify your Convex database and will be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export declare const mutation: MutationBuilder; + +/** + * Define a mutation that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to modify your Convex database. It will not be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export declare const internalMutation: MutationBuilder; + +/** + * Define an action in this Convex app's public API. + * + * An action is a function which can execute any JavaScript code, including non-deterministic + * code and code with side-effects, like calling third-party services. + * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive. + * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}. + * + * @param func - The action. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped action. Include this as an `export` to name it and make it accessible. + */ +export declare const action: ActionBuilder; + +/** + * Define an action that is only accessible from other Convex functions (but not from the client). + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Include this as an `export` to name it and make it accessible. + */ +export declare const internalAction: ActionBuilder; + +/** + * Define an HTTP action. + * + * This function will be used to respond to HTTP requests received by a Convex + * deployment if the requests matches the path and method where this action + * is routed. Be sure to route your action in `convex/http.js`. + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up. + */ +export declare const httpAction: HttpActionBuilder; + +/** + * A set of services for use within Convex query functions. + * + * The query context is passed as the first argument to any Convex query + * function run on the server. + * + * This differs from the {@link MutationCtx} because all of the services are + * read-only. + */ +export type QueryCtx = GenericQueryCtx; + +/** + * A set of services for use within Convex mutation functions. + * + * The mutation context is passed as the first argument to any Convex mutation + * function run on the server. + */ +export type MutationCtx = GenericMutationCtx; + +/** + * A set of services for use within Convex action functions. + * + * The action context is passed as the first argument to any Convex action + * function run on the server. + */ +export type ActionCtx = GenericActionCtx; + +/** + * An interface to read from the database within Convex query functions. + * + * The two entry points are {@link DatabaseReader.get}, which fetches a single + * document by its {@link Id}, or {@link DatabaseReader.query}, which starts + * building a query. + */ +export type DatabaseReader = GenericDatabaseReader; + +/** + * An interface to read from and write to the database within Convex mutation + * functions. + * + * Convex guarantees that all writes within a single mutation are + * executed atomically, so you never have to worry about partial writes leaving + * your data in an inconsistent state. See [the Convex Guide](https://docs.convex.dev/understanding/convex-fundamentals/functions#atomicity-and-optimistic-concurrency-control) + * for the guarantees Convex provides your functions. + */ +export type DatabaseWriter = GenericDatabaseWriter; + +/* prettier-ignore-end */ diff --git a/convex/_generated/server.js b/convex/_generated/server.js new file mode 100644 index 000000000..33b487cd2 --- /dev/null +++ b/convex/_generated/server.js @@ -0,0 +1,93 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ +/** + * Generated utilities for implementing server-side Convex query and mutation functions. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import { + actionGeneric, + httpActionGeneric, + queryGeneric, + mutationGeneric, + internalActionGeneric, + internalMutationGeneric, + internalQueryGeneric, +} from "convex/server"; + +/** + * Define a query in this Convex app's public API. + * + * This function will be allowed to read your Convex database and will be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export const query = queryGeneric; + +/** + * Define a query that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to read from your Convex database. It will not be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export const internalQuery = internalQueryGeneric; + +/** + * Define a mutation in this Convex app's public API. + * + * This function will be allowed to modify your Convex database and will be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export const mutation = mutationGeneric; + +/** + * Define a mutation that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to modify your Convex database. It will not be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export const internalMutation = internalMutationGeneric; + +/** + * Define an action in this Convex app's public API. + * + * An action is a function which can execute any JavaScript code, including non-deterministic + * code and code with side-effects, like calling third-party services. + * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive. + * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}. + * + * @param func - The action. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped action. Include this as an `export` to name it and make it accessible. + */ +export const action = actionGeneric; + +/** + * Define an action that is only accessible from other Convex functions (but not from the client). + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Include this as an `export` to name it and make it accessible. + */ +export const internalAction = internalActionGeneric; + +/** + * Define a Convex HTTP action. + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument, and a `Request` object + * as its second. + * @returns The wrapped endpoint function. Route a URL path to this function in `convex/http.js`. + */ +export const httpAction = httpActionGeneric; + +/* prettier-ignore-end */ diff --git a/convex/calendarEvents.ts b/convex/calendarEvents.ts new file mode 100644 index 000000000..eb21e1a21 --- /dev/null +++ b/convex/calendarEvents.ts @@ -0,0 +1,6 @@ +import { query } from "./_generated/server"; + + +export const get= query(()=>{ + return "hello"; +}); \ No newline at end of file diff --git a/convex/tsconfig.json b/convex/tsconfig.json new file mode 100644 index 000000000..6fa874e81 --- /dev/null +++ b/convex/tsconfig.json @@ -0,0 +1,25 @@ +{ + /* This TypeScript project config describes the environment that + * Convex functions run in and is used to typecheck them. + * You can modify it, but some settings required to use Convex. + */ + "compilerOptions": { + /* These settings are not required by Convex and can be modified. */ + "allowJs": true, + "strict": true, + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + + /* These compiler options are required by Convex */ + "target": "ESNext", + "lib": ["ES2021", "dom"], + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "isolatedModules": true, + "noEmit": true + }, + "include": ["./**/*"], + "exclude": ["./_generated"] +} diff --git a/next.config.mjs b/next.config.mjs index 4678774e6..f9aeb06ad 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,4 +1,11 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + images:{ + remotePatterns:[ + {hostname:"images.pexels.com"}, + {hostname:"i.pravatar.cc"} + ], + } +}; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index cf999766d..d2cebe9d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,19 +8,32 @@ "name": "lama-dev-next-dashboard", "version": "0.1.0", "dependencies": { - "next": "14.2.5", + "@faker-js/faker": "^9.4.0", + "@hookform/resolvers": "^3.9.1", + "@prisma/client": "^6.5.0", + "@types/react-big-calendar": "^1.8.11", + "convex": "^1.16.0", + "moment": "^2.30.1", + "next": "^15.2.4", "react": "^18", - "react-dom": "^18" + "react-big-calendar": "^1.14.1", + "react-calendar": "^5.1.0", + "react-dom": "^18", + "react-hook-form": "^7.53.2", + "recharts": "^2.15.3", + "zod": "^3.23.8" }, "devDependencies": { - "@types/node": "^20", + "@types/node": "^20.17.16", "@types/react": "^18", "@types/react-dom": "^18", "eslint": "^8", "eslint-config-next": "14.2.5", "postcss": "^8", + "prisma": "^6.5.0", "tailwindcss": "^3.4.1", - "typescript": "^5" + "ts-node": "^10.9.2", + "typescript": "^5.7.3" } }, "node_modules/@alloc/quick-lru": { @@ -36,6 +49,436 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz", + "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -46,93 +489,479 @@ "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.4.0.tgz", + "integrity": "sha512-85+k0AxaZSTowL0gXp8zYWDIrWclTbRPg/pm/V0dSFZ6W6D4lhcG3uuZl4zLsEKfEvs69xDbLN2cHQudwp95JA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/@hookform/resolvers": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.1.tgz", + "integrity": "sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==", + "license": "MIT", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "license": "MIT", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "license": "MIT", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@emnapi/runtime": "^1.2.0" }, "engines": { - "node": ">=10.10.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12.22" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -235,9 +1064,9 @@ } }, "node_modules/@next/env": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", - "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.4.tgz", + "integrity": "sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -251,9 +1080,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", - "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.4.tgz", + "integrity": "sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==", "cpu": [ "arm64" ], @@ -267,9 +1096,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", - "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.4.tgz", + "integrity": "sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==", "cpu": [ "x64" ], @@ -283,9 +1112,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", - "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.4.tgz", + "integrity": "sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==", "cpu": [ "arm64" ], @@ -299,9 +1128,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", - "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.4.tgz", + "integrity": "sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==", "cpu": [ "arm64" ], @@ -315,9 +1144,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", - "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.4.tgz", + "integrity": "sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==", "cpu": [ "x64" ], @@ -331,9 +1160,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", - "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.4.tgz", + "integrity": "sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==", "cpu": [ "x64" ], @@ -347,9 +1176,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", - "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.4.tgz", + "integrity": "sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==", "cpu": [ "arm64" ], @@ -362,26 +1191,10 @@ "node": ">= 10" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", - "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", - "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.4.tgz", + "integrity": "sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==", "cpu": [ "x64" ], @@ -443,6 +1256,111 @@ "node": ">=14" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@prisma/client": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.5.0.tgz", + "integrity": "sha512-M6w1Ql/BeiGoZmhMdAZUXHu5sz5HubyVcKukbLs3l0ELcQb8hTUJxtGEChhv4SVJ0QJlwtLnwOLgIRQhpsm9dw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.5.0.tgz", + "integrity": "sha512-sOH/2Go9Zer67DNFLZk6pYOHj+rumSb0VILgltkoxOjYnlLqUpHPAN826vnx8HigqnOCxj9LRhT6U7uLiIIWgw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "esbuild": ">=0.12 <1", + "esbuild-register": "3.6.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.5.0.tgz", + "integrity": "sha512-fc/nusYBlJMzDmDepdUtH9aBsJrda2JNErP9AzuHbgUEQY0/9zQYZdNlXmKoIWENtio+qarPNe/+DQtrX5kMcQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.5.0.tgz", + "integrity": "sha512-FVPQYHgOllJklN9DUyujXvh3hFJCY0NX86sDmBErLvoZjy2OXGiZ5FNf3J/C4/RZZmCypZBYpBKEhx7b7rEsdw==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.5.0", + "@prisma/engines-version": "6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60", + "@prisma/fetch-engine": "6.5.0", + "@prisma/get-platform": "6.5.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60.tgz", + "integrity": "sha512-iK3EmiVGFDCmXjSpdsKGNqy9hOdLnvYBrJB61far/oP03hlIxrb04OWmDjNTwtmZ3UZdA5MCvI+f+3k2jPTflQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.5.0.tgz", + "integrity": "sha512-3LhYA+FXP6pqY8FLHCjewyE8pGXXJ7BxZw2rhPq+CZAhvflVzq4K8Qly3OrmOkn6wGlz79nyLQdknyCG2HBTuA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.5.0", + "@prisma/engines-version": "6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60", + "@prisma/get-platform": "6.5.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.5.0.tgz", + "integrity": "sha512-xYcvyJwNMg2eDptBYFqFLUCfgi+wZLcj6HDMsj0Qw0irvauG4IKmkbywnqwok0B+k+W+p+jThM2DKTSmoPCkzw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.5.0" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", @@ -457,15 +1375,111 @@ "license": "Apache-2.0" }, "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" + "tslib": "^2.8.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" } }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/date-arithmetic": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/date-arithmetic/-/date-arithmetic-4.1.4.tgz", + "integrity": "sha512-p9eZ2X9B80iKiTW4ukVj8B4K6q9/+xFtQ5MGYA5HWToY9nL4EkhV9+6ftT2VHpVMEZb5Tv00Iel516bVdO+yRw==", + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -474,33 +1488,42 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", - "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "version": "20.17.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz", + "integrity": "sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-big-calendar": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/react-big-calendar/-/react-big-calendar-1.8.11.tgz", + "integrity": "sha512-/j9WOY79Q9A3cLtAa/cEKCi9DPmzcjfG7WaKW/6xlJOLFRkqCb0d2BRxtBETLO0yzLY/nDC95z9Cnp9vG2EmjQ==", + "license": "MIT", + "dependencies": { + "@types/date-arithmetic": "*", + "@types/prop-types": "*", + "@types/react": "*" + } + }, "node_modules/@types/react-dom": { "version": "18.3.0", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", @@ -511,6 +1534,12 @@ "@types/react": "*" } }, + "node_modules/@types/warning": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", + "license": "MIT" + }, "node_modules/@typescript-eslint/parser": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", @@ -652,6 +1681,15 @@ "dev": true, "license": "ISC" }, + "node_modules/@wojtekmaj/date-utils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.5.1.tgz", + "integrity": "sha512-+i7+JmNiE/3c9FKxzWFi2IjRJ+KzZl1QPu6QNrsgaa2MuBgXvUy4gA1TVzf/JMdIIloB76xSKikTWuyYAIVLww==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/date-utils?sponsor=1" + } + }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", @@ -675,6 +1713,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1150,11 +2201,34 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -1167,9 +2241,20 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, + "devOptional": true, "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -1187,10 +2272,68 @@ "dev": true, "license": "MIT" }, + "node_modules/convex": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/convex/-/convex-1.16.0.tgz", + "integrity": "sha512-duu6ged8mL2WgN9Jxm/XykbRe8MW+Wotkj57KTX44l7TUlnwvNCKB3mmlAVCxbsd4epyU05TkQz8WGwb/4SssQ==", + "license": "Apache-2.0", + "dependencies": { + "esbuild": "0.23.0", + "globals": "~15.9.0", + "jwt-decode": "^3.1.2", + "prettier": "3.2.5" + }, + "bin": { + "convex": "bin/main.js" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=7.0.0" + }, + "peerDependencies": { + "@auth0/auth0-react": "^2.0.1", + "@clerk/clerk-react": "^4.12.8 || ^5.0.0", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@auth0/auth0-react": { + "optional": true + }, + "@clerk/clerk-react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/convex/node_modules/globals": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", + "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -1219,9 +2362,129 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -1283,11 +2546,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-arithmetic": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-4.1.0.tgz", + "integrity": "sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -1301,6 +2576,12 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -1377,6 +2658,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1384,6 +2684,16 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1417,6 +2727,16 @@ "node": ">=6.0.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1632,6 +2952,58 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2081,6 +3453,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2088,6 +3466,15 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -2346,6 +3733,18 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/get-user-locale": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/get-user-locale/-/get-user-locale-2.3.2.tgz", + "integrity": "sha512-O2GWvQkhnbDoWFUJfaBlDIKUEdND8ATpBXD6KXcbhxlfktyD/d8w6mkzM/IlQEqGZAMz/PW6j6Hv53BiigKLUQ==", + "license": "MIT", + "dependencies": { + "mem": "^8.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/get-user-locale?sponsor=1" + } + }, "node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -2408,6 +3807,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/globalize": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/globalize/-/globalize-0.1.1.tgz", + "integrity": "sha512-5e01v8eLGfuQSOvx2MsDMOWS0GFtCx1wPzQSmcHw4hkxFzrQDBO3Xwg/m8Hr/7qXMrHeOIE29qWVzyv06u1TZA==" + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -2479,6 +3883,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/graphemer": { @@ -2647,6 +4052,24 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -2681,6 +4104,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -3188,6 +4618,12 @@ "node": ">=4.0" } }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", + "license": "MIT" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3265,6 +4701,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3291,6 +4739,56 @@ "dev": true, "license": "ISC" }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3302,9 +4800,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -3315,6 +4813,15 @@ "node": ">=8.6" } }, + "node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3348,11 +4855,32 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/mz": { @@ -3368,9 +4896,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -3393,41 +4921,42 @@ "license": "MIT" }, "node_modules/next": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", - "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-15.2.4.tgz", + "integrity": "sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==", "license": "MIT", "dependencies": { - "@next/env": "14.2.5", - "@swc/helpers": "0.5.5", + "@next/env": "15.2.4", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", "postcss": "8.4.31", - "styled-jsx": "5.1.1" + "styled-jsx": "5.1.6" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=18.17.0" + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.5", - "@next/swc-darwin-x64": "14.2.5", - "@next/swc-linux-arm64-gnu": "14.2.5", - "@next/swc-linux-arm64-musl": "14.2.5", - "@next/swc-linux-x64-gnu": "14.2.5", - "@next/swc-linux-x64-musl": "14.2.5", - "@next/swc-win32-arm64-msvc": "14.2.5", - "@next/swc-win32-ia32-msvc": "14.2.5", - "@next/swc-win32-x64-msvc": "14.2.5" + "@next/swc-darwin-arm64": "15.2.4", + "@next/swc-darwin-x64": "15.2.4", + "@next/swc-linux-arm64-gnu": "15.2.4", + "@next/swc-linux-arm64-musl": "15.2.4", + "@next/swc-linux-x64-gnu": "15.2.4", + "@next/swc-linux-x64-musl": "15.2.4", + "@next/swc-win32-arm64-msvc": "15.2.4", + "@next/swc-win32-x64-msvc": "15.2.4", + "sharp": "^0.33.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "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" }, "peerDependenciesMeta": { @@ -3437,6 +4966,9 @@ "@playwright/test": { "optional": true }, + "babel-plugin-react-compiler": { + "optional": true + }, "sass": { "optional": true } @@ -3484,7 +5016,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3654,6 +5185,15 @@ "node": ">= 0.8.0" } }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -3985,11 +5525,54 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.5.0.tgz", + "integrity": "sha512-yUGXmWqv5F4PByMSNbYFxke/WbnyTLjnJ5bKr8fLkcnY7U5rU9rUTh/+Fja+gOrRxEgtCbCtca94IeITj4j/pg==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "6.5.0", + "@prisma/engines": "6.5.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -4040,6 +5623,68 @@ "node": ">=0.10.0" } }, + "node_modules/react-big-calendar": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.14.1.tgz", + "integrity": "sha512-6Le0kV/4yiV/mlqv5YYBBS+FaBeYBPNGjcYitLoVdPCiXsc0xzSHyX8+2FRqX9AM16XZYIjjomouK3wcnq6+XQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "clsx": "^1.2.1", + "date-arithmetic": "^4.1.0", + "dayjs": "^1.11.7", + "dom-helpers": "^5.2.1", + "globalize": "^0.1.1", + "invariant": "^2.2.4", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "luxon": "^3.2.1", + "memoize-one": "^6.0.0", + "moment": "^2.29.4", + "moment-timezone": "^0.5.40", + "prop-types": "^15.8.1", + "react-overlays": "^5.2.1", + "uncontrollable": "^7.2.1" + }, + "peerDependencies": { + "react": "^16.14.0 || ^17 || ^18", + "react-dom": "^16.14.0 || ^17 || ^18" + } + }, + "node_modules/react-big-calendar/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-calendar": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-calendar/-/react-calendar-5.1.0.tgz", + "integrity": "sha512-09o/rQHPZGEi658IXAJtWfra1N69D1eFnuJ3FQm9qUVzlzNnos1+GWgGiUeSs22QOpNm32aoVFOimq0p3Ug9Eg==", + "license": "MIT", + "dependencies": { + "@wojtekmaj/date-utils": "^1.1.3", + "clsx": "^2.0.0", + "get-user-locale": "^2.2.1", + "warning": "^4.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-calendar?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -4053,13 +5698,85 @@ "react": "^18.3.1" } }, + "node_modules/react-hook-form": { + "version": "7.53.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.2.tgz", + "integrity": "sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, + "node_modules/react-overlays": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", + "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.8", + "@popperjs/core": "^2.11.6", + "@restart/hooks": "^0.4.7", + "@types/warning": "^3.0.0", + "dom-helpers": "^5.2.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -4083,6 +5800,44 @@ "node": ">=8.10.0" } }, + "node_modules/recharts": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.3.tgz", + "integrity": "sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", @@ -4105,6 +5860,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -4286,7 +6047,7 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4329,6 +6090,46 @@ "node": ">= 0.4" } }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4384,6 +6185,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -4646,9 +6457,9 @@ } }, "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", "license": "MIT", "dependencies": { "client-only": "0.0.1" @@ -4657,7 +6468,7 @@ "node": ">= 12.0.0" }, "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" }, "peerDependenciesMeta": { "@babel/core": { @@ -4795,6 +6606,12 @@ "node": ">=0.8" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4828,6 +6645,57 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -4842,9 +6710,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/type-check": { @@ -4951,10 +6819,10 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -4980,10 +6848,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true, "license": "MIT" }, @@ -5004,6 +6887,44 @@ "dev": true, "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5234,6 +7155,16 @@ "node": ">= 14" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -5246,6 +7177,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index dd3389bbf..d6f6d73be 100644 --- a/package.json +++ b/package.json @@ -9,18 +9,34 @@ "lint": "next lint" }, "dependencies": { + "@faker-js/faker": "^9.4.0", + "@hookform/resolvers": "^3.9.1", + "@prisma/client": "^6.5.0", + "@types/react-big-calendar": "^1.8.11", + "convex": "^1.16.0", + "moment": "^2.30.1", + "next": "^15.2.4", "react": "^18", + "react-big-calendar": "^1.14.1", + "react-calendar": "^5.1.0", "react-dom": "^18", - "next": "14.2.5" + "react-hook-form": "^7.53.2", + "recharts": "^2.15.3", + "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5", - "@types/node": "^20", + "@types/node": "^20.17.16", "@types/react": "^18", "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.5", "postcss": "^8", + "prisma": "^6.5.0", "tailwindcss": "^3.4.1", - "eslint": "^8", - "eslint-config-next": "14.2.5" + "ts-node": "^10.9.2", + "typescript": "^5.7.3" + }, + "prisma": { + "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" } } diff --git a/prisma/migrations/20250329190622_init_new01/migration.sql b/prisma/migrations/20250329190622_init_new01/migration.sql new file mode 100644 index 000000000..c475f165e --- /dev/null +++ b/prisma/migrations/20250329190622_init_new01/migration.sql @@ -0,0 +1,211 @@ +-- CreateEnum +CREATE TYPE "MemberSex" AS ENUM ('MALE', 'FEMALE'); + +-- CreateEnum +CREATE TYPE "Itteration" AS ENUM ('MONTHLY', 'QUARTERLY', 'SEMESTERLY', 'ANNUALY', 'PERPETUALLY'); + +-- CreateEnum +CREATE TYPE "Day" AS ENUM ('MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'); + +-- CreateEnum +CREATE TYPE "BloodType" AS ENUM ('A_POSITIVE', 'A_NEGATIVE', 'B_POSITIVE', 'B_NEGATIVE', 'AB_POSITIVE', 'AB_NEGATIVE', 'O_POSITIVE', 'O_NEGATIVE'); + +-- CreateTable +CREATE TABLE "Academy" ( + "id" SERIAL NOT NULL, + "academyName" TEXT NOT NULL, + "academyLogo" TEXT, + "academyOwnerId" TEXT NOT NULL, + "academyIsActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Academy_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Admin" ( + "id" TEXT NOT NULL, + "latest002" TEXT NOT NULL, + "username" TEXT NOT NULL, + "email" TEXT NOT NULL, + + CONSTRAINT "Admin_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Member" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "name" TEXT NOT NULL, + "surname" TEXT NOT NULL, + "email" TEXT, + "phone" TEXT, + "address" TEXT, + "img" TEXT, + "bloodType" "BloodType", + "isBloodDonor" BOOLEAN DEFAULT false, + "sex" "MemberSex", + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Member_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Parent" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "name" TEXT NOT NULL, + "surname" TEXT NOT NULL, + "email" TEXT, + "phone" TEXT, + "address" TEXT, + "img" TEXT, + "bloodType" "BloodType", + "isBloodDonor" BOOLEAN DEFAULT false, + "sex" "MemberSex", + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "memberId" TEXT NOT NULL, + + CONSTRAINT "Parent_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Instructor" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "name" TEXT NOT NULL, + "surname" TEXT NOT NULL, + "email" TEXT, + "phone" TEXT, + "address" TEXT, + "img" TEXT, + "bloodType" "BloodType", + "isBloodDonor" BOOLEAN DEFAULT false, + "sex" "MemberSex", + + CONSTRAINT "Instructor_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Class" ( + "id" SERIAL NOT NULL, + "className" TEXT NOT NULL, + "classDescription" TEXT NOT NULL, + "capacity" INTEGER NOT NULL, + "day" "Day" NOT NULL, + "startTime" TIMESTAMP(3) NOT NULL, + "endTime" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Class_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MartialArtsDiscipline" ( + "id" TEXT NOT NULL, + "artName" TEXT NOT NULL, + "artDescription" TEXT NOT NULL, + + CONSTRAINT "MartialArtsDiscipline_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Belt" ( + "id" TEXT NOT NULL, + "beltName" TEXT NOT NULL, + "martialArtsDisciplineId" TEXT NOT NULL, + "instructorID" TEXT NOT NULL, + "memberId" TEXT NOT NULL, + + CONSTRAINT "Belt_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Certifications" ( + "id" TEXT NOT NULL, + "certName" TEXT NOT NULL, + "certDescription" TEXT NOT NULL, + "certCircle" "Itteration" NOT NULL, + "memberId" TEXT NOT NULL, + + CONSTRAINT "Certifications_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Announcements" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT NOT NULL, + "date" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Announcements_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Events" ( + "id" SERIAL NOT NULL, + "startTime" TIMESTAMP(3) NOT NULL, + "endTime" TIMESTAMP(3) NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT NOT NULL, + + CONSTRAINT "Events_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Admin_username_key" ON "Admin"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "Admin_email_key" ON "Admin"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Member_username_key" ON "Member"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "Member_email_key" ON "Member"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Parent_username_key" ON "Parent"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "Parent_email_key" ON "Parent"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Parent_memberId_key" ON "Parent"("memberId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Instructor_username_key" ON "Instructor"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "Instructor_email_key" ON "Instructor"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "MartialArtsDiscipline_artName_key" ON "MartialArtsDiscipline"("artName"); + +-- CreateIndex +CREATE UNIQUE INDEX "Belt_instructorID_key" ON "Belt"("instructorID"); + +-- CreateIndex +CREATE UNIQUE INDEX "Belt_memberId_key" ON "Belt"("memberId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Certifications_memberId_key" ON "Certifications"("memberId"); + +-- AddForeignKey +ALTER TABLE "Parent" ADD CONSTRAINT "Parent_memberId_fkey" FOREIGN KEY ("memberId") REFERENCES "Member"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Belt" ADD CONSTRAINT "Belt_martialArtsDisciplineId_fkey" FOREIGN KEY ("martialArtsDisciplineId") REFERENCES "MartialArtsDiscipline"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Belt" ADD CONSTRAINT "Belt_instructorID_fkey" FOREIGN KEY ("instructorID") REFERENCES "Instructor"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Belt" ADD CONSTRAINT "Belt_memberId_fkey" FOREIGN KEY ("memberId") REFERENCES "Member"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Certifications" ADD CONSTRAINT "Certifications_memberId_fkey" FOREIGN KEY ("memberId") REFERENCES "Member"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250330172805_init_new02/migration.sql b/prisma/migrations/20250330172805_init_new02/migration.sql new file mode 100644 index 000000000..a44d2dd66 --- /dev/null +++ b/prisma/migrations/20250330172805_init_new02/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - You are about to drop the column `latest002` on the `Admin` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX "MartialArtsDiscipline_artName_key"; + +-- AlterTable +ALTER TABLE "Admin" DROP COLUMN "latest002", +ADD COLUMN "latest003" TEXT NOT NULL DEFAULT '003'; diff --git a/prisma/migrations/20250330175956_init_new02/migration.sql b/prisma/migrations/20250330175956_init_new02/migration.sql new file mode 100644 index 000000000..ad7acbb84 --- /dev/null +++ b/prisma/migrations/20250330175956_init_new02/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - You are about to drop the column `latest003` on the `Admin` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Admin" DROP COLUMN "latest003", +ADD COLUMN "latest002" TEXT NOT NULL DEFAULT '003'; diff --git a/prisma/migrations/20250330180501_init_new02/migration.sql b/prisma/migrations/20250330180501_init_new02/migration.sql new file mode 100644 index 000000000..54530941e --- /dev/null +++ b/prisma/migrations/20250330180501_init_new02/migration.sql @@ -0,0 +1,2 @@ +-- DropIndex +DROP INDEX "Parent_memberId_key"; diff --git a/prisma/migrations/20250330181106_init_new033/migration.sql b/prisma/migrations/20250330181106_init_new033/migration.sql new file mode 100644 index 000000000..b02c3c4df --- /dev/null +++ b/prisma/migrations/20250330181106_init_new033/migration.sql @@ -0,0 +1,5 @@ +-- DropIndex +DROP INDEX "Belt_instructorID_key"; + +-- DropIndex +DROP INDEX "Belt_memberId_key"; diff --git a/prisma/migrations/20250414181622_additions/migration.sql b/prisma/migrations/20250414181622_additions/migration.sql new file mode 100644 index 000000000..29afcf5ee --- /dev/null +++ b/prisma/migrations/20250414181622_additions/migration.sql @@ -0,0 +1,16 @@ +-- AlterTable +ALTER TABLE "Member" ADD COLUMN "firebaseId" TEXT; + +-- CreateTable +CREATE TABLE "MemberMetrics" ( + "id" TEXT NOT NULL, + "weight" DOUBLE PRECISION NOT NULL, + "height" DOUBLE PRECISION NOT NULL, + "dateofentry" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "memberId" TEXT NOT NULL, + + CONSTRAINT "MemberMetrics_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "MemberMetrics" ADD CONSTRAINT "MemberMetrics_memberId_fkey" FOREIGN KEY ("memberId") REFERENCES "Member"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250418161719_additions_2/migration.sql b/prisma/migrations/20250418161719_additions_2/migration.sql new file mode 100644 index 000000000..2bf9ce36b --- /dev/null +++ b/prisma/migrations/20250418161719_additions_2/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Academy" ADD COLUMN "memberId" TEXT; + +-- AddForeignKey +ALTER TABLE "Academy" ADD CONSTRAINT "Academy_memberId_fkey" FOREIGN KEY ("memberId") REFERENCES "Member"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20250420093858_additions_3/migration.sql b/prisma/migrations/20250420093858_additions_3/migration.sql new file mode 100644 index 000000000..5e66e1836 --- /dev/null +++ b/prisma/migrations/20250420093858_additions_3/migration.sql @@ -0,0 +1,16 @@ +-- CreateTable +CREATE TABLE "_InstructorToMartialArtsDiscipline" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_InstructorToMartialArtsDiscipline_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateIndex +CREATE INDEX "_InstructorToMartialArtsDiscipline_B_index" ON "_InstructorToMartialArtsDiscipline"("B"); + +-- AddForeignKey +ALTER TABLE "_InstructorToMartialArtsDiscipline" ADD CONSTRAINT "_InstructorToMartialArtsDiscipline_A_fkey" FOREIGN KEY ("A") REFERENCES "Instructor"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_InstructorToMartialArtsDiscipline" ADD CONSTRAINT "_InstructorToMartialArtsDiscipline_B_fkey" FOREIGN KEY ("B") REFERENCES "MartialArtsDiscipline"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..648c57fd5 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 000000000..fc428c1b9 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,223 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Academy { + id Int @id @default(autoincrement()) + academyName String + academyLogo String? + academyOwnerId String + academyIsActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + Member Member? @relation(fields: [memberId], references: [id]) + memberId String? +} + +model Admin { + id String @id + latest002 String @default("003") + username String @unique + email String @unique +} + +/** + * model Profile { + * id String @id @default(cuid()) + * name String + * surname String + * email String? @unique + * phone String? + * address String? + * img String? + * bloodType BloodType? + * isBloodDonor Boolean? @default(false) + * sex MemberSex? + * createdAt DateTime @default(now()) + * updatedAt DateTime @updatedAt + * belt Belt[] + * //1 to 1 relationship with a member + * memberId String? @unique + * member Member? @relation(fields: [memberId], references: [id]) + * //1 to 1 relationship with a parent + * parentId String? @unique + * parent Parent? @relation(fields: [parentId], references: [id]) + * instructorId String? @unique + * instructor Instructor? @relation(fields: [instructorId], references: [id]) + * certifications Certifications[] + * } + */ + +model Member { + id String @id @default(cuid()) + username String @unique + firebaseId String? + name String + surname String + email String? @unique + phone String? + address String? + img String? + bloodType BloodType? + isBloodDonor Boolean? @default(false) + sex MemberSex? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + belt Belt[] + certification Certifications[] + memberMetrics MemberMetrics[] + parent Parent[] + academy Academy[] +} + +model MemberMetrics { + id String @id @default(cuid()) + weight Float + height Float + dateofentry DateTime @default(now()) + + memberId String + member Member @relation(fields: [memberId], references: [id]) +} + +model Parent { + id String @id @default(cuid()) + username String @unique + + name String + surname String + email String? @unique + phone String? + address String? + img String? + bloodType BloodType? + isBloodDonor Boolean? @default(false) + sex MemberSex? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + memberId String + member Member @relation(fields: [memberId], references: [id]) +} + +model Instructor { + id String @id @default(cuid()) + username String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + name String + surname String + email String? @unique + phone String? + address String? + img String? + bloodType BloodType? + isBloodDonor Boolean? @default(false) + sex MemberSex? + + disciplines MartialArtsDiscipline[] + Belt Belt[] +} + +model Class { + id Int @id @default(autoincrement()) + className String + classDescription String + capacity Int + day Day + startTime DateTime + endTime DateTime +} + +model MartialArtsDiscipline { + id String @id @default(cuid()) + artName String + artDescription String + belts Belt[] + instructor Instructor[] +} + +model Belt { + id String @id @default(cuid()) + beltName String + martialArtsDisciplineId String + martialArtsDiscipline MartialArtsDiscipline @relation(fields: [martialArtsDisciplineId], references: [id]) + + instructorID String + instructor Instructor @relation(fields: [instructorID], references: [id]) + + memberId String + member Member @relation(fields: [memberId], references: [id]) +} + +model Certifications { + id String @id @default(cuid()) + certName String + certDescription String + certCircle Itteration + + memberId String @unique + member Member @relation(fields: [memberId], references: [id]) +} + +model Announcements { + id Int @id @default(autoincrement()) + title String + description String + date DateTime +} + +model Events { + id Int @id @default(autoincrement()) + startTime DateTime + endTime DateTime + title String + description String +} + +enum MemberSex { + MALE + FEMALE +} + +enum Itteration { + MONTHLY + QUARTERLY + SEMESTERLY + ANNUALY + PERPETUALLY +} + +enum Day { + MONDAY + TUESDAY + WEDNESDAY + THURSDAY + FRIDAY + SATURDAY + SUNDAY +} + +enum BloodType { + A_POSITIVE + A_NEGATIVE + B_POSITIVE + B_NEGATIVE + AB_POSITIVE + AB_NEGATIVE + O_POSITIVE + O_NEGATIVE +} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 000000000..ab01cde33 --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,154 @@ +import { PrismaClient } from "@prisma/client"; +import { faker } from "@faker-js/faker"; + +const prisma = new PrismaClient(); + +async function main() { + // Seed Academy + const academy = await prisma.academy.create({ + data: { + academyName: faker.company.name(), + academyOwnerId: faker.string.uuid(), + academyIsActive: true, + }, + }); + + // Seed Admins + for (let i = 0; i < 2; i++) { + await prisma.admin.create({ + data: { + id: faker.string.uuid(), + latest002: faker.lorem.word(), + username: faker.internet.userName(), + email: faker.internet.email(), + }, + }); + } + + // Seed Martial Arts Disciplines + const disciplines = await Promise.all( + ["Kickboxing", "Hwal Moo Do", "Tang Soo Do"].map(async (artName) => { + return prisma.martialArtsDiscipline.create({ + data: { + artName, + artDescription: faker.lorem.sentence(), + }, + }); + }) + ); + + // Seed Members + const memberIds: string[] = []; + for (let i = 0; i < 80; i++) { + const member = await prisma.member.create({ + data: { + id: faker.string.uuid(), + username: faker.internet.userName(), + name: faker.person.firstName(), + surname: faker.person.lastName(), + email: faker.internet.email(), + phone: faker.phone.number(), + address: faker.location.streetAddress(), + bloodType: faker.helpers.arrayElement([ + "A_POSITIVE", + "A_NEGATIVE", + "B_POSITIVE", + "B_NEGATIVE", + "AB_POSITIVE", + "AB_NEGATIVE", + "O_POSITIVE", + "O_NEGATIVE", + ]), + isBloodDonor: faker.datatype.boolean(), + sex: faker.helpers.arrayElement(["MALE", "FEMALE"]), + }, + }); + memberIds.push(member.id); + } + + // Seed Parents + for (let i = 0; i < 30; i++) { + await prisma.parent.create({ + data: { + id: faker.string.uuid(), + username: faker.internet.userName(), + name: faker.person.firstName(), + surname: faker.person.lastName(), + email: faker.internet.email(), + phone: faker.phone.number(), + address: faker.location.streetAddress(), + bloodType: faker.helpers.arrayElement([ + "A_POSITIVE", + "A_NEGATIVE", + "B_POSITIVE", + "B_NEGATIVE", + "AB_POSITIVE", + "AB_NEGATIVE", + "O_POSITIVE", + "O_NEGATIVE", + ]), + isBloodDonor: faker.datatype.boolean(), + sex: faker.helpers.arrayElement(["MALE", "FEMALE"]), + memberId: faker.helpers.arrayElement(memberIds), + }, + }); + } + + // Seed Instructors + const instructorIds: string[] = []; + for (let i = 0; i < 15; i++) { + const instructor = await prisma.instructor.create({ + data: { + id: faker.string.uuid(), + username: faker.internet.userName(), + name: faker.person.firstName(), + surname: faker.person.lastName(), + email: faker.internet.email(), + phone: faker.phone.number(), + address: faker.location.streetAddress(), + bloodType: faker.helpers.arrayElement([ + "A_POSITIVE", + "A_NEGATIVE", + "B_POSITIVE", + "B_NEGATIVE", + "AB_POSITIVE", + "AB_NEGATIVE", + "O_POSITIVE", + "O_NEGATIVE", + ]), + isBloodDonor: faker.datatype.boolean(), + sex: faker.helpers.arrayElement(["MALE", "FEMALE"]), + }, + }); + instructorIds.push(instructor.id); + } + + // Seed Belts for each discipline + const beltNames = ["White", "Yellow", "Orange", "Green", "Blue", "Brown", "Red", "Black"]; + await Promise.all( + disciplines.map(async (discipline) => { + await Promise.all( + beltNames.map(async (beltName, index) => { + await prisma.belt.create({ + data: { + beltName, + martialArtsDisciplineId: discipline.id, + instructorID: instructorIds[index % instructorIds.length], // Assign instructors in rotation + memberId: memberIds[index % memberIds.length], // Assign members in rotation + }, + }); + }) + ); + }) + ); + + console.log("Database seeded successfully!"); +} + +main() + .then(() => prisma.$disconnect()) + .catch((e) => { + console.error(e); + prisma.$disconnect(); + process.exit(1); + }); diff --git a/public/blackandwhite-belt.png b/public/blackandwhite-belt.png new file mode 100644 index 000000000..7ec26067a Binary files /dev/null and b/public/blackandwhite-belt.png differ diff --git a/public/box.png b/public/box.png new file mode 100644 index 000000000..40e88974a Binary files /dev/null and b/public/box.png differ diff --git a/public/conversation.png b/public/conversation.png new file mode 100644 index 000000000..f26936832 Binary files /dev/null and b/public/conversation.png differ diff --git a/public/create.png b/public/create.png new file mode 100644 index 000000000..0fb69e831 Binary files /dev/null and b/public/create.png differ diff --git a/public/home.png b/public/home.png deleted file mode 100644 index e5a6e99c0..000000000 Binary files a/public/home.png and /dev/null differ diff --git a/public/homeBold.png b/public/homeBold.png new file mode 100644 index 000000000..f4e24ba8c Binary files /dev/null and b/public/homeBold.png differ diff --git a/public/logo-black.png b/public/logo-black.png new file mode 100644 index 000000000..66695ab0a Binary files /dev/null and b/public/logo-black.png differ diff --git a/public/logo-black.svg b/public/logo-black.svg new file mode 100644 index 000000000..c4b551715 --- /dev/null +++ b/public/logo-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo-color.png b/public/logo-color.png new file mode 100644 index 000000000..7cd1239be Binary files /dev/null and b/public/logo-color.png differ diff --git a/public/logo-color.svg b/public/logo-color.svg new file mode 100644 index 000000000..9c9434da6 --- /dev/null +++ b/public/logo-color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo-no-background.png b/public/logo-no-background.png new file mode 100644 index 000000000..1809717cd Binary files /dev/null and b/public/logo-no-background.png differ diff --git a/public/logo-no-background.svg b/public/logo-no-background.svg new file mode 100644 index 000000000..b26c6f51f --- /dev/null +++ b/public/logo-no-background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo-white.png b/public/logo-white.png new file mode 100644 index 000000000..04a508b39 Binary files /dev/null and b/public/logo-white.png differ diff --git a/public/logo-white.svg b/public/logo-white.svg new file mode 100644 index 000000000..7c78c6c35 --- /dev/null +++ b/public/logo-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/marketing.png b/public/marketing.png new file mode 100644 index 000000000..1ab16b820 Binary files /dev/null and b/public/marketing.png differ diff --git a/public/martial-arts.png b/public/martial-arts.png new file mode 100644 index 000000000..210584c70 Binary files /dev/null and b/public/martial-arts.png differ diff --git a/public/mechanism.png b/public/mechanism.png new file mode 100644 index 000000000..91763807c Binary files /dev/null and b/public/mechanism.png differ diff --git a/public/noAvatar.png b/public/noAvatar.png new file mode 100644 index 000000000..2347bce68 Binary files /dev/null and b/public/noAvatar.png differ diff --git a/public/parent.png b/public/parent.png deleted file mode 100644 index 56ddf9c9d..000000000 Binary files a/public/parent.png and /dev/null differ diff --git a/public/parentBold.png b/public/parentBold.png new file mode 100644 index 000000000..67ab544e9 Binary files /dev/null and b/public/parentBold.png differ diff --git a/public/parents.png b/public/parents.png new file mode 100644 index 000000000..667a18509 Binary files /dev/null and b/public/parents.png differ diff --git a/public/schedule.png b/public/schedule.png new file mode 100644 index 000000000..b46f496f4 Binary files /dev/null and b/public/schedule.png differ diff --git a/public/switch.png b/public/switch.png new file mode 100644 index 000000000..75b0aca68 Binary files /dev/null and b/public/switch.png differ diff --git a/public/trophy.png b/public/trophy.png new file mode 100644 index 000000000..1a602ecf3 Binary files /dev/null and b/public/trophy.png differ diff --git a/public/update.png b/public/update.png new file mode 100644 index 000000000..bb6685bbe Binary files /dev/null and b/public/update.png differ diff --git a/public/user.png b/public/user.png new file mode 100644 index 000000000..7127aa862 Binary files /dev/null and b/public/user.png differ diff --git a/src/app/(dashboard)/admin/page.tsx b/src/app/(dashboard)/admin/page.tsx new file mode 100644 index 000000000..833505b75 --- /dev/null +++ b/src/app/(dashboard)/admin/page.tsx @@ -0,0 +1,46 @@ +import Announcements from "@/components/Announcements" +import AttendanceChart from "@/components/AttendanceChart" +import CountChart from "@/components/CountChart" +import EventCalendar from "@/components/EventCalendar" +import FinanceChart from "@/components/FinanceChart" +import UserCard from "@/components/UserCard" + +const AdminPage = () => { + return ( +
+ {/* LEFT */} +
+ {/**USER CARDS */} +
+ + + + +
+ {/* MIDDLE SECTION */} +
+ {/* COUNT CHART */} +
+ +
+ {/* ATTENDANCE CHART */} +
+ +
+
+ {/* Bottom Charts */} +
+ +
+
+ {/* RIGHT */} +
+ + +
+
+ + ) +} + +export default AdminPage \ No newline at end of file diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx new file mode 100644 index 000000000..b5d9f8217 --- /dev/null +++ b/src/app/(dashboard)/layout.tsx @@ -0,0 +1,31 @@ +import Image from "next/image"; +import Link from "next/link"; +import Menu from "@/components/Menu"; +import Navbar from "@/components/Navbar"; + +export default function DashboardLayout({ + children, + }: Readonly<{ + children: React.ReactNode; + }>) { + return ( +
+ {/* Left */} +
+ + logo + {/* + DojangNext + */} + + +
+ {/* Right */} +
+ + {children} +
+
+ ); + } + \ No newline at end of file diff --git a/src/app/(dashboard)/list/events/page.tsx b/src/app/(dashboard)/list/events/page.tsx new file mode 100644 index 000000000..6f22d8af3 --- /dev/null +++ b/src/app/(dashboard)/list/events/page.tsx @@ -0,0 +1,129 @@ +import Pagination from "@/components/Pagination"; +import Table from "@/components/Table"; +import TableSearch from "@/components/TableSearch"; +import { role, teachersData } from "@/lib/data"; +import Image from "next/image"; +import Link from "next/link"; + +type Teacher = { + id:number; + teacherId:string; + name:string; + email?:string; + photo:string; + phone:string; + subjects:string[]; + classes:string[]; + address:string; + +} + + + +const columns = [ + { + header:"info", accessor:"info" + }, + { + header:"Teacher ID", + accessor:"teacherId", + className:"hidden md:table-cell" + }, + { + header:"Subjects", + accessor:"subjects", + className:"hidden md:table-cell" + }, + { + header:"Classes", + accessor:"classes", + className:"hidden md:table-cell" + }, + { + header:"Phone", + accessor:"phone", + className:"hidden lg:table-cell" + }, + { + header:"Address", + accessor:"address", + className:"hidden lg:table-cell" + }, + { + header:"Actions", + accessor:"actions", + }, +]; + +const renderRow = (item:Teacher)=>( + + + +
+

{item.name}

+

{item?.email}

+
+ + {item.teacherId} + {item.subjects.join(",")} + {item.classes.join(",")} + {item.phone} + {item?.address} + +
+ + + + { + role==="admin" && + ( + + ) + } + +
+ + +); + +const EventsListPage = () => { + return ( + +
+ {/* TOP SECTION*/} +
+

All Teachers

+
+ +
+ + + +
+
+
+ {/* LIST SECTION*/} + + {/* PAGINATION SECTION*/} + + + ) +} + +export default EventsListPage \ No newline at end of file diff --git a/src/app/(dashboard)/list/instructors/[id]/bck.tsx b/src/app/(dashboard)/list/instructors/[id]/bck.tsx new file mode 100644 index 000000000..9be7cc699 --- /dev/null +++ b/src/app/(dashboard)/list/instructors/[id]/bck.tsx @@ -0,0 +1,117 @@ +import Announcements from "@/components/Announcements" +import BigCalendar from "@/components/BigCalendar" +import Image from "next/image" + +const SingleTeacherPage = () => { + return ( +
+ {/* LEFT */} +
+ {/* TOP */} +
+ {/* Info Card */} +
+
+ +
+
+

George Antzoulis

+

+ Lorem ipsum dolor sit amet consectetur, adipisicing elit. +

+
+
+ + A+ +
+
+ + November 2024 +
+
+ + gantzoulis@hotmail.com +
+
+ + 6970142125 +
+
+
+
+ {/* Small Cards */} +
+ {/* CARD */} +
+ +
+

2

+ Branches +
+
+ {/* CARD */} +
+ +
+

6

+ Lesson +
+
+ {/* CARD */} +
+ +
+

1

+ Classes +
+
+ {/* CARD */} +
+ +
+

90%

+ Attendance +
+
+
+
+ {/* BOTTOM */} +
+

Instructors Schedule

+ +
+
+ {/* RIGHT */} +
+ +
+
+ ) +} + +export default SingleTeacherPage \ No newline at end of file diff --git a/src/app/(dashboard)/list/instructors/[id]/page.tsx b/src/app/(dashboard)/list/instructors/[id]/page.tsx new file mode 100644 index 000000000..f4f83a3dc --- /dev/null +++ b/src/app/(dashboard)/list/instructors/[id]/page.tsx @@ -0,0 +1,171 @@ +import Announcements from "@/components/Announcements" +import BigCalendar from "@/components/BigCalendar" +import FormModal from "@/components/FormModal" +import Performance from "@/components/Performance" +import { teachersData } from "@/lib/data" +import Image from "next/image" +import Link from "next/link" +import { role } from "@/lib/data" + +const SingleTeacherPage = () => { + return ( +
+ {/* LEFT */} +
+ {/* TOP */} +
+ {/* USER INFO CARD */} +
+
+ +
+
+
+

Leonard Snyder

+ {role === "admin" && } +
+

+ Lorem ipsum, dolor sit amet consectetur adipisicing elit. +

+
+
+ + A+ +
+
+ + January 2025 +
+
+ + user@gmail.com +
+
+ + +1 234 567 +
+
+
+
+ {/* SMALL CARDS */} +
+ {/* CARD */} +
+ +
+

90%

+ Attendance +
+
+ {/* CARD */} +
+ +
+

2

+ Branches +
+
+ {/* CARD */} +
+ +
+

6

+ Lessons +
+
+ {/* CARD */} +
+ +
+

6

+ Classes +
+
+
+
+ {/* BOTTOM*/} +
+

Teacher Schedule

+ +
+ +
+ {/* RIGHT */} + {/* +
+
+

Shortcuts

+
+ + Teacher's Classes + + + Teacher's Students + + + Teacher's Lessons + + + Teacher's Exams + + + Teacher's Assignments + +
+
+ + +
+ */} +
+ ); +}; + +export default SingleTeacherPage \ No newline at end of file diff --git a/src/app/(dashboard)/list/instructors/[id]/page_.bck.tsx b/src/app/(dashboard)/list/instructors/[id]/page_.bck.tsx new file mode 100644 index 000000000..7bd4a94ba --- /dev/null +++ b/src/app/(dashboard)/list/instructors/[id]/page_.bck.tsx @@ -0,0 +1,168 @@ +import Announcements from "@/components/Announcements" +import BigCalendar from "@/components/BigCalendar" +import FormModal from "@/components/FormModal" +import Performance from "@/components/Performance" +import { teachersData } from "@/lib/data" +import Image from "next/image" +import Link from "next/link" +import { role } from "@/lib/data" + +const SingleTeacherPage = () => { + return ( +
+ {/* LEFT */} +
+ {/* TOP */} +
+ {/* USER INFO CARD */} +
+
+ +
+
+
+

Leonard Snyder

+ {role === "admin" && } +
+

+ Lorem ipsum, dolor sit amet consectetur adipisicing elit. +

+
+
+ + A+ +
+
+ + January 2025 +
+
+ + user@gmail.com +
+
+ + +1 234 567 +
+
+
+
+ {/* SMALL CARDS */} +
+ {/* CARD */} +
+ +
+

90%

+ Attendance +
+
+ {/* CARD */} +
+ +
+

2

+ Branches +
+
+ {/* CARD */} +
+ +
+

6

+ Lessons +
+
+ {/* CARD */} +
+ +
+

6

+ Classes +
+
+
+
+ {/* BOTTOM */} +
+

Teacher's Schedule

+ +
+
+ {/* RIGHT */} +
+
+

Shortcuts

+
+ + Teacher's Classes + + + Teacher's Students + + + Teacher's Lessons + + + Teacher's Exams + + + Teacher's Assignments + +
+
+ + +
+
+ ); +}; + +export default SingleTeacherPage \ No newline at end of file diff --git a/src/app/(dashboard)/list/instructors/page.tsx b/src/app/(dashboard)/list/instructors/page.tsx new file mode 100644 index 000000000..85ea1799c --- /dev/null +++ b/src/app/(dashboard)/list/instructors/page.tsx @@ -0,0 +1,146 @@ +import FormModal from "@/components/FormModal"; +import Pagination from "@/components/Pagination"; +import Table from "@/components/Table"; +import TableSearch from "@/components/TableSearch"; +import { role, teachersData } from "@/lib/data"; +import prisma from "@/lib/prisma"; +import { Instructor, MartialArtsDiscipline } from "@prisma/client"; +import Image from "next/image"; +import Link from "next/link"; +import { ITEMS_PER_PAGE } from "@/lib/settings"; +import { count } from "console"; + + +type InstsuctorList = Instructor & {disciplines:MartialArtsDiscipline[]} + +const columns = [ + { + header:"info", accessor:"info" + }, + { + header:"Disciplines", + accessor:"disciplines", + className:"hidden lg:table-cell" + }, + { + header:"Bloodtype", + accessor:"bloodType", + className:"hidden lg:table-cell" + }, + { + header:"Phone", + accessor:"phone", + className:"hidden lg:table-cell" + }, + { + header:"Address", + accessor:"address", + className:"hidden lg:table-cell" + }, + { + header:"Actions", + accessor:"actions", + }, +]; + +const renderRow = (item:InstsuctorList)=>( +
+ + + + + + + + +); + +const InstructorListPage = async ({searchParams}: + { + searchParams:{[key:string]:string | undefined}; + } +) => { + + + const {page, ...queryParams} = await searchParams; + + const p = page ? parseInt(page) : 1; + + const [data, countItems] = await prisma.$transaction([ + prisma.instructor.findMany( + { + take:ITEMS_PER_PAGE, + skip: ITEMS_PER_PAGE *(p - 1), + include:{ + disciplines:true, + } + } + ), + prisma.instructor.count(), + ]); + + console.log("resolving " + countItems); + + + return ( +
+ {/* TOP SECTION*/} +
+

Instructors (Δάσκαλοι)

{countItems} total Teachers

+
+ +
+ + + {role === "admin" && ( + // + + )} +
+
+
+ {/* LIST SECTION*/} +
+ +
+

{item.name} {item.surname}

+

{item?.email}

+
+
{item.disciplines.map(disc=>disc.artName).join(",")}{item.bloodType}{item.phone}{item?.address} +
+ + + + { + role==="admin" && + ( + <> + + + + + ) + } +
+
+ {/* PAGINATION SECTION*/} + + + ) +} + +export default InstructorListPage \ No newline at end of file diff --git a/src/app/(dashboard)/list/parents/page.tsx b/src/app/(dashboard)/list/parents/page.tsx new file mode 100644 index 000000000..b69ba851b --- /dev/null +++ b/src/app/(dashboard)/list/parents/page.tsx @@ -0,0 +1,112 @@ +import FormModal from "@/components/FormModal"; +import Pagination from "@/components/Pagination"; +import Table from "@/components/Table"; +import TableSearch from "@/components/TableSearch"; +import { role, parentsData } from "@/lib/data"; +import Image from "next/image"; +import Link from "next/link"; + +type Parent = { + id:number; + name:string; + email?:string; + students:string[]; + phone:string; + address:string; + +} + + +const columns = [ + { + header:"info", accessor:"info" + }, + { + header:"Student Names", + accessor:"students", + className:"hidden md:table-cell" + }, + { + header:"Phone", + accessor:"phone", + className:"hidden lg:table-cell" + }, + { + header:"Address", + accessor:"address", + className:"hidden lg:table-cell" + }, + { + header:"Actions", + accessor:"actions", + }, +]; + +const renderRow = (item:Parent)=>( + + + + + + + +); + +const ParentsListPage = () => { + return ( + +
+ {/* TOP SECTION*/} +
+

All Parents

+
+ +
+ + + { + role==="admin" && + ( + <> + + + ) + } +
+
+
+ {/* LIST SECTION*/} +
+
+

{item.name}

+

{item?.email}

+
+
{item.students.join(",")}{item.phone}{item?.address} +
+ {/* + + */} + { + role==="admin" && + ( + <> + + + + ) + } +
+
+ {/* PAGINATION SECTION*/} + + + ) +} + +export default ParentsListPage \ No newline at end of file diff --git a/src/app/(dashboard)/list/students/[id]/page.tsx b/src/app/(dashboard)/list/students/[id]/page.tsx new file mode 100644 index 000000000..2d545c0ad --- /dev/null +++ b/src/app/(dashboard)/list/students/[id]/page.tsx @@ -0,0 +1,132 @@ + +import Announcements from "@/components/Announcements" +import BigCalendar from "@/components/BigCalendar" +import Performance from "@/components/Performance" +import Image from "next/image" +import Link from "next/link" + +const SingleStudentPage = () => { + return ( +
+ {/* LEFT */} +
+ {/* TOP */} +
+ {/* Info Card */} +
+
+ +
+
+

Evelyn

+

+ Lorem ipsum dolor sit amet consectetur, adipisicing elit. +

+
+
+ + A+ +
+
+ + November 2024 +
+
+ + evelina@hotmail.com +
+
+ + 6970142125 +
+
+
+
+ {/* Small Cards */} +
+ {/* CARD */} +
+ +
+

Black 4th Dan

+ Belt +
+
+ {/* CARD */} +
+ +
+

20

+ Lesson +
+
+ {/* CARD */} +
+ +
+

1

+ Classes +
+
+ {/* CARD */} +
+ +
+

90%

+ Attendance +
+
+
+
+ {/* BOTTOM */} +
+

Student Schedule

+ +
+
+ {/* RIGHT */} +
+
+

Shortcuts

+
+ Lessons + Teachers + Exams + Results + Assignments + Events +
+
+ + +
+
+ ) +} + +export default SingleStudentPage \ No newline at end of file diff --git a/src/app/(dashboard)/list/students/page.tsx b/src/app/(dashboard)/list/students/page.tsx new file mode 100644 index 000000000..478e3b320 --- /dev/null +++ b/src/app/(dashboard)/list/students/page.tsx @@ -0,0 +1,134 @@ +import FormModal from "@/components/FormModal"; +import Pagination from "@/components/Pagination"; +import Table from "@/components/Table"; +import TableSearch from "@/components/TableSearch"; +import { role, studentsData, teachersData } from "@/lib/data"; +import Image from "next/image"; +import Link from "next/link"; + +type Student = { + id:number; + studentId:string; + name:string; + email?:string; + photo:string; + phone:string; + grade:number; + class:string; + address:string; +} + + + +const columns = [ + { + header:"info", accessor:"info" + }, + { + header:"Student ID", + accessor:"studentId", + className:"hidden md:table-cell" + }, + { + header:"Grade", + accessor:"grade", + className:"hidden md:table-cell" + }, + { + header:"Class", + accessor:"class", + className:"hidden md:table-cell" + }, + { + header:"Phone", + accessor:"phone", + className:"hidden lg:table-cell" + }, + { + header:"Address", + accessor:"address", + className:"hidden lg:table-cell" + }, + { + header:"Actions", + accessor:"actions", + }, + +]; + +const renderRow = (item:Student)=>( +
+ + + + + + + + +); + +const StudentListPage = () => { + return ( + +
+ {/* TOP SECTION*/} +
+

All Students

+
+ +
+ + + {/* */} + {role==="admin" && + ( + + )} +
+
+
+ {/* LIST SECTION*/} +
+ +
+

{item.name}

+

{item?.email}

+
+
{item.studentId}{item.grade}{item.class}{item.phone}{item?.address} +
+ + { + role==="admin" && + ( + // + <> + + + + ) + } + +
+
+ {/* PAGINATION SECTION*/} + + + ) +} + +export default StudentListPage \ No newline at end of file diff --git a/src/app/(dashboard)/list/subjects/page.tsx b/src/app/(dashboard)/list/subjects/page.tsx new file mode 100644 index 000000000..9d3feb9a0 --- /dev/null +++ b/src/app/(dashboard)/list/subjects/page.tsx @@ -0,0 +1,91 @@ +import Pagination from "@/components/Pagination"; +import Table from "@/components/Table"; +import TableSearch from "@/components/TableSearch"; +import { role, subjectsData } from "@/lib/data"; +import Image from "next/image"; +import Link from "next/link"; + +type Subject = { + id:number; + name:string; + teachers:string[]; + +} + + + +const columns = [ + { + header:"Subject Name", accessor:"info" + }, + { + header:"Subjects", + accessor:"subjects", + className:"hidden md:table-cell" + }, + { + header:"Actions", + accessor:"actions", + }, +]; + +const renderRow = (item:Subject)=>( + + + + + +); + +const SubjectsListPage = () => { + return ( + +
+ {/* TOP SECTION*/} +
+

All Subjects

+
+ +
+ + + +
+
+
+ {/* LIST SECTION*/} +
+
+

{item.name}

+
+
{item.teachers.join(",")} +
+ + + + { + role==="admin" && + ( + + ) + } + +
+
+ {/* PAGINATION SECTION*/} + + + ) +} + +export default SubjectsListPage \ No newline at end of file diff --git a/src/app/(dashboard)/parent/page.tsx b/src/app/(dashboard)/parent/page.tsx new file mode 100644 index 000000000..9ca8c69d1 --- /dev/null +++ b/src/app/(dashboard)/parent/page.tsx @@ -0,0 +1,23 @@ +import Announcements from '@/components/Announcements' +import BigCalendar from '@/components/BigCalendar' +import React from 'react' + +const ParentPage = () => { + return ( +
+ {/* LEFT */} +
+
+

Schedule (StudentName)

+ +
+
+ {/* RIGHT */} +
+ +
+
+ ) +} + +export default ParentPage \ No newline at end of file diff --git a/src/app/(dashboard)/student/page.tsx b/src/app/(dashboard)/student/page.tsx new file mode 100644 index 000000000..2f78f7b82 --- /dev/null +++ b/src/app/(dashboard)/student/page.tsx @@ -0,0 +1,25 @@ +import Announcements from '@/components/Announcements' +import BigCalendar from '@/components/BigCalendar' +import EventCalendar from '@/components/EventCalendar' +import React from 'react' + +const StudentPage = () => { + return ( +
+ {/* LEFT */} +
+
+

Schedule

+ +
+
+ {/* RIGHT */} +
+ + +
+
+ ) +} + +export default StudentPage \ No newline at end of file diff --git a/src/app/(dashboard)/teacher/page.tsx b/src/app/(dashboard)/teacher/page.tsx new file mode 100644 index 000000000..80aad4c5f --- /dev/null +++ b/src/app/(dashboard)/teacher/page.tsx @@ -0,0 +1,23 @@ +import Announcements from '@/components/Announcements' +import BigCalendar from '@/components/BigCalendar' +import React from 'react' + +const TeacherPage = () => { + return ( +
+ {/* LEFT */} +
+
+

Schedule (TeachersName)

+ +
+
+ {/* RIGHT */} +
+ +
+
+ ) +} + +export default TeacherPage \ No newline at end of file diff --git a/src/app/globals.css b/src/app/globals.css index bd6213e1d..266f6ec59 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,3 +1,102 @@ @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; + +.react-calendar{ + width: 100% !important; + border: none !important; + font-family: "Inter", sans-serif !important; +} + +.react-calendar__navigation__label__labelText{ + font-weight: 600; +} + +.react-calendar__tile--active { + background-color: #302780 !important; + +} + +.rbc-btn-group:first-child { + display: none !important; +} + +.rbc-toolbar-label{ + text-align: right !important; + padding:0px 20px !important ; +} + +.rbc-btn-group:last-child { + font-size: 13px !important; +} + +.rbc-btn-group:last-child button { + border: none !important; + background-color: #f1f0ff !important; + margin-left: 2px !important; +} + +.rbc-toolbar button.rbc-active { + box-shadow: none !important; + background-color: #7e57eb !important; + color:white !important; +} + +.rbc-time-view{ + border-color: #eee !important; +} + +.rbc-time-header { + display: none !important; +} + +.rbc-time-content { + border: none !important; +} + +.rbc-time-gutter.rbc-time-column { + font-size: 12px !important; +} + +.rbc-time-gutter.rbc-time-column .rbc-timeslot-group { + padding: 0px 20px !important; +} + +.rbc-timeslot-group { + background-color: #f7fdff !important; +} + +.rbc-day-slot { + font-size: 12px !important; +} + +.rbc-event { + border: none !important; + color:black !important; + width: 99% !important; + padding: 8px !important; + + +} + +.rbc-event:nth-child(1) { + background-color: #e2f8ff !important; +} + +.rbc-event:nth-child(2) { + background-color: #fefce8 !important; +} +.rbc-event:nth-child(3) { + background-color: red !important; +} +.rbc-event:nth-child(4) { + background-color: red !important; +} +.rbc-event:nth-child(5) { + background-color: red !important; +} + +.rbc-event-label{ + color: gray; + margin-bottom: 5px; +} \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 44c71f8db..d4061c8c5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -5,7 +5,7 @@ import "./globals.css"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { - title: "Lama Dev School Management Dashboard", + title: "DojangNext Management Dashboard", description: "Next.js School Management System", }; @@ -16,7 +16,7 @@ export default function RootLayout({ }>) { return ( - {children} + {children} ); } diff --git a/src/app/sign-in/page.tsx b/src/app/sign-in/page.tsx new file mode 100644 index 000000000..ced4ceac2 --- /dev/null +++ b/src/app/sign-in/page.tsx @@ -0,0 +1,7 @@ +const LoginPage = () => { + return ( +
LoginPage
+ ) +} + +export default LoginPage \ No newline at end of file diff --git a/src/components/Announcements.tsx b/src/components/Announcements.tsx new file mode 100644 index 000000000..c5dd84f54 --- /dev/null +++ b/src/components/Announcements.tsx @@ -0,0 +1,56 @@ +"use client"; + +const announcements = +[ + { + id:1, + title:"Lorem ipsum dolor sit", + date:"08-10-2024", + description:"Ducimus voluptates quasi, blanditiis alias fugiat, autem ea assumenda odio delectus"}, + { + id:2, + title:"Lorem ipsum dolor sit", + date:"09-10-2024", + description:"Ducimus voluptates quasi, blanditiis alias fugiat.Quisquam reiciendis atque est quam quod natus minima numquam animi corporis" + }, + { + id:3, + title:"Lorem ipsum dolor sit", + date:"10-10-2024", + description:"Autem ea assumenda odio delectus.Quisquam reiciendis atque est quam quod natus minima numquam animi corporis" + }, + { + id:4, + title:"Lorem ipsum dolor sit", + date:"11-10-2024", + description:"Odio delectus.Quisquam reiciendis atque est quam quod natus minima numquam animi corporis" + } +]; + +const Announcements = () => { + return ( +
+
+

Announcements

+ View all +
+
+ { + announcements.map(announcement=>( +
+
+

{announcement.title}

+ {announcement.date} +
+

+ {announcement.description} +

+
+ )) + } +
+
+ ) +} + +export default Announcements \ No newline at end of file diff --git a/src/components/AttendanceChart.tsx b/src/components/AttendanceChart.tsx new file mode 100644 index 000000000..81a1a012a --- /dev/null +++ b/src/components/AttendanceChart.tsx @@ -0,0 +1,72 @@ +"use client"; + +import Image from 'next/image'; +import { BarChart, Bar, Rectangle, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'; + +const data = [ + { + name: 'Mon', + present: 60, + absent: 24, + }, + { + name: 'Tue', + present: 30, + absent: 13, + }, + { + name: 'Wed', + present: 20, + absent: 58, + }, + { + name: 'Thu', + present: 27, + absent: 39, + + }, + { + name: 'Fri', + present: 18, + absent: 48, + }, +]; + + +const AttendanceChart = () => { + return ( +
+
+

Attendance

+ +
+ + + + + + + + + + + + + + +
+ + ) +} + +export default AttendanceChart \ No newline at end of file diff --git a/src/components/BigCalendar.tsx b/src/components/BigCalendar.tsx new file mode 100644 index 000000000..10a88bcbd --- /dev/null +++ b/src/components/BigCalendar.tsx @@ -0,0 +1,37 @@ +"use client"; + +import { Calendar, momentLocalizer, View, Views } from 'react-big-calendar' +import moment from 'moment' +import { calendarEvents } from '@/lib/data'; +import "react-big-calendar/lib/css/react-big-calendar.css"; +import { useState } from 'react'; + +const localizer = momentLocalizer(moment); + +const BigCalendar = () => { + const [view, setView] = useState(Views.WORK_WEEK); + + const handleOnChangeView = (selectedView:View)=>{ + setView(selectedView); + } + + + return( + <> + + + ); +} + +export default BigCalendar; \ No newline at end of file diff --git a/src/components/ConvexClientProvider.tsx b/src/components/ConvexClientProvider.tsx new file mode 100644 index 000000000..bc549c73b --- /dev/null +++ b/src/components/ConvexClientProvider.tsx @@ -0,0 +1,10 @@ +"use client"; + +import { ConvexProvider, ConvexReactClient } from "convex/react"; +import { ReactNode } from "react"; + +const convex = new ConvexReactClient(process.env.NEXT_PUBLIC_CONVEX_URL!); + +export function ConvexClientProvider({ children }: { children: ReactNode }) { + return {children}; +} \ No newline at end of file diff --git a/src/components/CountChart.tsx b/src/components/CountChart.tsx new file mode 100644 index 000000000..b81aa97e9 --- /dev/null +++ b/src/components/CountChart.tsx @@ -0,0 +1,64 @@ +"use client"; + +import Image from 'next/image'; +import { RadialBarChart, RadialBar, Legend, ResponsiveContainer } from 'recharts'; + +const data = [ + { + name: 'Total', + count:200, + fill: 'white', + }, + { + name: 'Girls', + count:83, + fill: '#de7ed6', + }, + { + name: 'Boys', + count:117, + fill: '#7e57eb', + }, + +]; + +const CountChart = () => { + return ( +
+ {/** TITLE */} +
+

Students

+ +
+ {/** CHART */} +
+ + + + {/* */} + + + +
+ {/** BOTTOM */} +
+
+
+

117

+

Boys 55%

+
+
+
+

83

+

Girls 45%

+
+
+
+ ) +} + +export default CountChart \ No newline at end of file diff --git a/src/components/EventCalendar.tsx b/src/components/EventCalendar.tsx new file mode 100644 index 000000000..c0869128d --- /dev/null +++ b/src/components/EventCalendar.tsx @@ -0,0 +1,58 @@ +'use client'; + +import Image from "next/image"; +import { useState } from "react"; +import Calendar from "react-calendar"; +import 'react-calendar/dist/Calendar.css'; + +type ValuePiece = Date | null; + +type Value = ValuePiece | [ValuePiece, ValuePiece]; + +const events = [ + { + id:1, + title:"Mulberry Street", + time:"2:49 PM", + description:"Lorem ipsum dolor sit amet consectetur adipisicing elit. Sint, maxime autem quaerat, dicta aliquam laborum aut ex" + }, + { + id:2, + title:"Jay Mohr: Funny for a Girl", + time:"6:28 PM", + description:"Lorem ipsum dolor sit amet consectetur adipisicing elit. Sint, maxime autem quaerat, dicta aliquam laborum aut ex" + }, + { + id:3, + title:"Year Zero: The Silent Death of Cambodia", + time:"9:32 AM", + description:"Lorem ipsum dolor sit amet consectetur adipisicing elit. Sint, maxime autem quaerat, dicta aliquam laborum aut ex" + }]; + +const EventCalendar = () => { + const [value, onChange] = useState(new Date()); + return ( +
+ {/* */} +
+

Events

+ +
+
+ { + events.map(event=>( +
+
+

{event.title}

+ {event.time} +
+

{event.description}

+
+ )) + } +
+
+ ) +} + +export default EventCalendar \ No newline at end of file diff --git a/src/components/FinanceChart.tsx b/src/components/FinanceChart.tsx new file mode 100644 index 000000000..eac41d122 --- /dev/null +++ b/src/components/FinanceChart.tsx @@ -0,0 +1,119 @@ +"use client"; +import Image from 'next/image'; +import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'; + + +const data = [ + { + name: 'Sep', + income: 400, + expenses: 2400, + amt: 2400, + }, + { + name: 'Oct', + income: 645, + expenses: 1000, + amt: 2210, + }, + { + name: 'Nov', + income: 700, + expenses: 800, + amt: 2290, + }, + { + name: 'Dec', + income: 1200, + expenses: 50, + amt: 2000, + }, + { + name: 'Jan', + income: 500, + expenses: 2400, + amt: 2181, + }, + { + name: 'Feb', + income: 450, + expenses: 145, + amt: 2500, + }, + { + name: 'Mar', + income: 1400, + expenses: 600, + amt: 2100, + }, + { + name: 'Mai', + income: 1670, + expenses: 500, + amt: 2100, + }, + { + name: 'Jun', + income: 1200, + expenses: 2400, + amt: 2100, + }, + { + name: 'Jul', + income: 300, + expenses: 1200, + amt: 2100, + }, + { + name: 'Aug', + income: 0, + expenses: 800, + amt: 2100, + }, + ]; + +const FinanceChart = () => { + return ( +
+
+

Finances

+ +
+ + + + + + + + + + + +
+ ) +} + + +export default FinanceChart \ No newline at end of file diff --git a/src/components/FormModal.tsx b/src/components/FormModal.tsx new file mode 100644 index 000000000..1850b130d --- /dev/null +++ b/src/components/FormModal.tsx @@ -0,0 +1,86 @@ +"use client"; + +import dynamic from "next/dynamic"; +import Image from "next/image"; +import { useState } from "react"; +// import TeacherForm from "./forms/TeacherForm"; +// import MemberForm from "./forms/MemberForm"; + + +const InstructorForm = dynamic(()=>import("./forms/InstructorForm"),{ + loading:()=>

Loading...

+}); +const MemberForm = dynamic(()=>import("./forms/MemberForm"),{ + loading:()=>

Loading...

+}); + +const forms :{[key:string]:(type:"create" | "update" , data?:any)=>JSX.Element; + +}={ + instructor: (type,data) => , + student: (type, data) => , +}; + +const FormModal = ({table, type, data, id}:{ + table: + | "instructor" + | "student" + | "parent" + | "class" + | "lesson" + | "event" + | "announcement"; + type:"create" | "update" | "delete" | "view"; + data?:any; + id?: string; + + +}) => { + + const size = type ==="create" ? "w-8 h-8" : "w-7 h-7"; + const bgColor = + type === "create" + ? "bg-zeidYellow" + : type === "update" + ? "bg-zeidSky" + : "bg-zeidPurple"; + const [open, setOpen] = useState(false); + + + const Form = () => { + return ( + type === "delete" && id ? + ( +
+ Are you sure? This {table} data will be lost + + + ) + : type === "create" || type === "update" ? + ( + forms[table](type, data) + ) : "Form not found!" + ); + }; + + + return ( + <> + + {open && ( +
+
+
+
setOpen(false)}> + +
+
+
+ )} + + ) +} + +export default FormModal \ No newline at end of file diff --git a/src/components/InputField.tsx b/src/components/InputField.tsx new file mode 100644 index 000000000..b3346ca52 --- /dev/null +++ b/src/components/InputField.tsx @@ -0,0 +1,38 @@ +import { FieldError } from "react-hook-form"; + +type InputFieldProps = { + label: string; + type?: string; + register: any; + name: string; + defaultValue?: string; + error?: FieldError; + inputProps?: React.InputHTMLAttributes; +} + + +const InputField = ({ + label, + type = "text", + register, + name, + defaultValue, + error, + inputProps +}:InputFieldProps) => { + return ( +
+ + + {error?.message &&

{error?.message.toString()}

} +
+ ) +} + +export default InputField \ No newline at end of file diff --git a/src/components/Menu.tsx b/src/components/Menu.tsx index de074fa04..5c2dcb558 100644 --- a/src/components/Menu.tsx +++ b/src/components/Menu.tsx @@ -1,87 +1,61 @@ +import { role } from "@/lib/data"; +import Image from "next/image"; +import Link from "next/link"; + const menuItems = [ { title: "MENU", items: [ { - icon: "/home.png", + icon: "/homeBold.png", label: "Home", href: "/", visible: ["admin", "teacher", "student", "parent"], }, { - icon: "/teacher.png", + icon: "/blackandwhite-belt.png", label: "Teachers", href: "/list/teachers", visible: ["admin", "teacher"], }, { - icon: "/student.png", - label: "Students", + icon: "/martial-arts.png", + label: "Members", href: "/list/students", visible: ["admin", "teacher"], }, { - icon: "/parent.png", + icon: "/parentBold.png", label: "Parents", href: "/list/parents", visible: ["admin", "teacher"], }, { - icon: "/subject.png", - label: "Subjects", + icon: "/box.png", + label: "Classes", href: "/list/subjects", visible: ["admin"], }, { - icon: "/class.png", - label: "Classes", - href: "/list/classes", - visible: ["admin", "teacher"], - }, - { - icon: "/lesson.png", - label: "Lessons", - href: "/list/lessons", - visible: ["admin", "teacher"], - }, - { - icon: "/exam.png", - label: "Exams", - href: "/list/exams", - visible: ["admin", "teacher", "student", "parent"], - }, - { - icon: "/assignment.png", - label: "Assignments", - href: "/list/assignments", - visible: ["admin", "teacher", "student", "parent"], - }, - { - icon: "/result.png", + icon: "/trophy.png", label: "Results", href: "/list/results", visible: ["admin", "teacher", "student", "parent"], }, { - icon: "/attendance.png", - label: "Attendance", - href: "/list/attendance", - visible: ["admin", "teacher", "student", "parent"], - }, - { - icon: "/calendar.png", + icon: "/schedule.png", label: "Events", href: "/list/events", visible: ["admin", "teacher", "student", "parent"], }, { - icon: "/message.png", + icon: "/conversation.png", label: "Messages", href: "/list/messages", visible: ["admin", "teacher", "student", "parent"], }, { - icon: "/announcement.png", + icon: "/marketing.png", label: "Announcements", href: "/list/announcements", visible: ["admin", "teacher", "student", "parent"], @@ -92,23 +66,51 @@ const menuItems = [ title: "OTHER", items: [ { - icon: "/profile.png", + icon: "/user.png", label: "Profile", href: "/profile", visible: ["admin", "teacher", "student", "parent"], }, { - icon: "/setting.png", + icon: "/mechanism.png", label: "Settings", href: "/settings", visible: ["admin", "teacher", "student", "parent"], }, { - icon: "/logout.png", + icon: "/switch.png", label: "Logout", href: "/logout", visible: ["admin", "teacher", "student", "parent"], }, ], }, -]; \ No newline at end of file +]; + +const Menu = () => { + return ( +
+ {menuItems.map(i=>( +
+ {i.title} + { + i.items.map((item)=>{ + if(item.visible.includes(role)) + return( + + + {item.label} + + ) + }) + } +
+ ))} +
+ ) +} + +export default Menu \ No newline at end of file diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx new file mode 100644 index 000000000..855cafa7a --- /dev/null +++ b/src/components/Navbar.tsx @@ -0,0 +1,31 @@ +import Image from "next/image" + +const Navbar = () => { + return ( +
+ {/* SEARCH BAR */} +
+ + +
+ {/* ICONS AND USER */} +
+
+ +
+
+ +
1
+
+
+ John Doe + Admin +
+ +
+
+ + ) +} + +export default Navbar \ No newline at end of file diff --git a/src/components/Pagination.tsx b/src/components/Pagination.tsx new file mode 100644 index 000000000..c91c5ec0d --- /dev/null +++ b/src/components/Pagination.tsx @@ -0,0 +1,45 @@ +"use client"; + +import { ITEMS_PER_PAGE } from "@/lib/settings"; +import { useRouter } from "next/navigation"; + +const Pagination = ({page, count}:{page:number; count: number}) => { + + const router = useRouter(); + + const changePage = (newPage:number) => { + const params = new URLSearchParams(window.location.search); + params.set("page",newPage.toString()) + router.push(`${window.location.pathname}?${params}`) + } + + return ( +
+ +
+ {Array.from({ length: Math.ceil(count / ITEMS_PER_PAGE)}, + (_, index)=>{ + const pageIndex = index+1; + return + } )} + + +
+ +
+ ) +} + +export default Pagination \ No newline at end of file diff --git a/src/components/Performance.tsx b/src/components/Performance.tsx new file mode 100644 index 000000000..230ac8d7a --- /dev/null +++ b/src/components/Performance.tsx @@ -0,0 +1,40 @@ +"use client"; +import Image from 'next/image'; +import { PieChart, Pie, Sector, Cell, ResponsiveContainer } from 'recharts'; + +const data = [ + { name: 'Group A', value: 92 , fill:"#C3EBFA"}, + { name: 'Group B', value: 8, fill:"#FAE27C" }, +]; + +const Performance = () => { + return ( +
+
+

Performance

+ +
+ + + + + +
+

9.2

+

of 10 max LTS

+
+

1st Semester - 2nd Semester

+
+ ) +} + +export default Performance \ No newline at end of file diff --git a/src/components/Table.tsx b/src/components/Table.tsx new file mode 100644 index 000000000..2c25a0bdb --- /dev/null +++ b/src/components/Table.tsx @@ -0,0 +1,29 @@ +const Table = ( + { + columns, + renderRow, + data + }:{ + columns:{header:string; accessor:string; className?:string;}[]; + renderRow:(item:any)=> React.ReactNode; + data:any[]; + }) => { + return ( +
+ + + {columns.map(col=>( + + ))} + + + + { + data.map((item)=>renderRow(item)) + } + +
{col.header}
+ ) +} + +export default Table \ No newline at end of file diff --git a/src/components/TableSearch.tsx b/src/components/TableSearch.tsx new file mode 100644 index 000000000..c1ff060a8 --- /dev/null +++ b/src/components/TableSearch.tsx @@ -0,0 +1,12 @@ +import Image from "next/image"; + + const TableSearch = () => { + return ( +
+ + +
+ ) + } + + export default TableSearch \ No newline at end of file diff --git a/src/components/UserCard.tsx b/src/components/UserCard.tsx new file mode 100644 index 000000000..e2dca1a30 --- /dev/null +++ b/src/components/UserCard.tsx @@ -0,0 +1,16 @@ +import Image from "next/image" + +const UserCard = ({type}:{type:string}) => { + return ( +
+
+ 2024/25 + +
+

1,234

+

{type}

+
+ ) +} + +export default UserCard \ No newline at end of file diff --git a/src/components/forms/InstructorForm.tsx b/src/components/forms/InstructorForm.tsx new file mode 100644 index 000000000..ec605dba6 --- /dev/null +++ b/src/components/forms/InstructorForm.tsx @@ -0,0 +1,160 @@ +"use client"; + +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; +import InputField from "../InputField"; +import Image from "next/image"; + + +const schema = z.object({ + username: z.string() + .min(3, { message: 'Username must be at least 3 character long!' }) + .max(20, { message: 'Username must be max 20 character long!' }), + email: z.string() + .email({message:"invalid email address"}), + password: z.string() + .min(8, { message: 'Password must be at least 8 character long!' }) + .max(40, { message: 'Password must be max 40 character long!' }), + bloodType: z.string().optional(), + firstName: z.string().min(1, {message:"FirstName field is required"}), + lastName: z.string().min(1, {message:"LastName field is required"}), + phone: z.string().min(1, {message:"Phone field is required"}), + address: z.string().min(1, {message:"Address field is required"}), + birthday: z.date({message:"Birthday field is required"}), + sex: z.enum(["male", "famale"], {message:"You need to choose"}), + img: z.instanceof(File, {message: "Image is Required"}), + }); + + type Inputs = z.infer; + +const InstructorForm = ({ + type, + data + }:{ + type:"create" | "update"; + data?:any + }) => { + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(schema), + }); + + + const onSubmit = handleSubmit(data=>{ + console.log(data); + }) + + + return ( + <> + +

Create a new Teacher

+ + Authentication Infromation + +
+ + + +
+ + Personal Infromation + +
+ + + + + + +
+ + + {errors?.sex?.message &&

{errors?.sex.message.toString()}

} +
+
+ + + {errors?.img?.message &&

{errors?.img.message.toString()}

} +
+
+ + + + ) +} + +export default InstructorForm \ No newline at end of file diff --git a/src/components/forms/MemberForm.tsx b/src/components/forms/MemberForm.tsx new file mode 100644 index 000000000..095c3c998 --- /dev/null +++ b/src/components/forms/MemberForm.tsx @@ -0,0 +1,160 @@ +"use client"; + +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; +import InputField from "../InputField"; +import Image from "next/image"; + + +const schema = z.object({ + username: z.string() + .min(3, { message: 'Username must be at least 3 character long!' }) + .max(20, { message: 'Username must be max 20 character long!' }), + email: z.string() + .email({message:"invalid email address"}), + password: z.string() + .min(8, { message: 'Password must be at least 8 character long!' }) + .max(40, { message: 'Password must be max 40 character long!' }), + bloodType: z.string().optional(), + firstName: z.string().min(1, {message:"FirstName field is required"}), + lastName: z.string().min(1, {message:"LastName field is required"}), + phone: z.string().min(1, {message:"Phone field is required"}), + address: z.string().min(1, {message:"Address field is required"}), + birthday: z.date({message:"Birthday field is required"}), + sex: z.enum(["male", "famale"], {message:"You need to choose"}), + img: z.instanceof(File, {message: "Image is Required"}), + }); + + type Inputs = z.infer; + +const MemberForm = ({ + type, + data + }:{ + type:"create" | "update"; + data?:any + }) => { + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(schema), + }); + + + const onSubmit = handleSubmit(data=>{ + console.log(data); + }) + + + return ( + <> +
+

Create a new Member

+ + Authentication Infromation + +
+ + + +
+ + Personal Infromation + +
+ + + + + + +
+ + + {errors?.sex?.message &&

{errors?.sex.message.toString()}

} +
+
+ + + {errors?.img?.message &&

{errors?.img.message.toString()}

} +
+
+ +
+ + ) +} + +export default MemberForm \ No newline at end of file diff --git a/src/lib/data.ts b/src/lib/data.ts index 5fcd9281e..bb2ea229e 100644 --- a/src/lib/data.ts +++ b/src/lib/data.ts @@ -921,8 +921,8 @@ export const calendarEvents = [ { title: "Math", allDay: false, - start: new Date(2024, 7, 12, 8, 0), - end: new Date(2024, 7, 12, 8, 45), + start: new Date(2024, 9, 9, 8, 0), + end: new Date(2024, 9, 9, 8, 45), }, { title: "English", @@ -1051,13 +1051,31 @@ export const calendarEvents = [ { title: "Chemistry", allDay: false, - start: new Date(2024, 7, 16, 13, 0), - end: new Date(2024, 7, 16, 13, 45), + start: new Date(2024, 8, 16, 18, 0), + end: new Date(2024, 8, 16, 19, 0), }, { title: "History", allDay: false, - start: new Date(2024, 7, 16, 14, 0), - end: new Date(2024, 7, 16, 14, 45), + start: new Date(2024, 8, 16, 19, 0), + end: new Date(2024, 8, 16, 20, 0), + }, + { + title: "HMD-Juniors", + allDay: false, + start: new Date(2024, 8, 23, 19, 0), + end: new Date(2024, 8, 23, 20, 0), + }, + { + title: "HMD-Juniors", + allDay: false, + start: new Date(2024, 9, 2, 19, 0), + end: new Date(2024, 9, 2, 19, 30), + }, + { + title: "HMD-BlackBelts", + allDay: false, + start: new Date(2024, 9, 2, 20, 30), + end: new Date(2024, 9, 2, 21, 0), }, ]; \ No newline at end of file diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts new file mode 100644 index 000000000..f31a86c9c --- /dev/null +++ b/src/lib/prisma.ts @@ -0,0 +1,16 @@ +import { PrismaClient } from "@prisma/client"; + + +const prismaClientSingleton = () => { + return new PrismaClient(); +} + +declare const globalThis: { + prismaGlobal: ReturnType; +}& typeof global; + +const prisma = globalThis.prismaGlobal ?? prismaClientSingleton() + +export default prisma + +if (process.env.NODE_ENV !== 'production') globalThis.prismaGlobal = prisma \ No newline at end of file diff --git a/src/lib/settings.ts b/src/lib/settings.ts new file mode 100644 index 000000000..93fb84ec1 --- /dev/null +++ b/src/lib/settings.ts @@ -0,0 +1 @@ +export const ITEMS_PER_PAGE = 5; \ No newline at end of file diff --git a/tailwind.config.ts b/tailwind.config.ts index e9a0944e7..1e0232165 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -13,6 +13,17 @@ const config: Config = { "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", }, + colors:{ + zeidSky:"#C3EBFA", + zeidSkyLight:"#EDF9FD", + zeidPurple:"#CFCEFF", + zeidPurpleLight:"#F1F0FF", + zeidYellow:"#FAE27C", + zeidYellowLight:"#FEFCE8", + zeidBlue:"#302780", + zeidBlueLight:"#7e57eb", + zeidPink:"#de7ed6", + } }, }, plugins: [], diff --git a/tsconfig.json b/tsconfig.json index 7b2858930..01731839a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -12,15 +16,27 @@ "isolatedModules": true, "jsx": "preserve", "incremental": true, + "checkJs": true, "plugins": [ { "name": "next" } ], "paths": { - "@/*": ["./src/*"] - } + "@/*": [ + "./src/*" + ] + }, + "target": "ES2017" }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + "prisma/seed.js" + ], + "exclude": [ + "node_modules" + ] }