From d9d3df440a815d4bb96d63331b8806da1a947a4f Mon Sep 17 00:00:00 2001 From: Goostaf Date: Fri, 17 Oct 2025 19:26:24 +0200 Subject: [PATCH 01/35] Add organization structure --- .../20251017170007_organiations/migration.sql | 69 +++++++++++++++++++ prisma/schema.prisma | 35 +++++++--- 2 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 prisma/migrations/20251017170007_organiations/migration.sql diff --git a/prisma/migrations/20251017170007_organiations/migration.sql b/prisma/migrations/20251017170007_organiations/migration.sql new file mode 100644 index 0000000..4ff0b96 --- /dev/null +++ b/prisma/migrations/20251017170007_organiations/migration.sql @@ -0,0 +1,69 @@ +/* + Warnings: + + - The values [CARD] on the enum `ExpenseType` will be removed. If these variants are still used in the database, this will fail. + - Added the required column `organizationId` to the `Expense` table without a default value. This is not possible if the table is not empty. + - Added the required column `organizationId` to the `Invoice` table without a default value. This is not possible if the table is not empty. + - Added the required column `organizationId` to the `NameList` table without a default value. This is not possible if the table is not empty. + - Added the required column `organizationId` to the `ZettleSale` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterEnum +BEGIN; +CREATE TYPE "ExpenseType_new" AS ENUM ('EXPENSE', 'INVOICE'); +ALTER TABLE "Expense" ALTER COLUMN "type" TYPE "ExpenseType_new" USING ("type"::text::"ExpenseType_new"); +ALTER TYPE "ExpenseType" RENAME TO "ExpenseType_old"; +ALTER TYPE "ExpenseType_new" RENAME TO "ExpenseType"; +DROP TYPE "ExpenseType_old"; +COMMIT; + +-- CreateTable (moved before AlterTable operations) +CREATE TABLE "Organization" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Organization_pkey" PRIMARY KEY ("id") +); + +-- Create default organization only if there are existing records +DO $$ +BEGIN + IF EXISTS (SELECT 1 FROM "Expense") OR + EXISTS (SELECT 1 FROM "Invoice") OR + EXISTS (SELECT 1 FROM "NameList") OR + EXISTS (SELECT 1 FROM "ZettleSale") THEN + INSERT INTO "Organization" ("name", "createdAt", "updatedAt") + VALUES ('Default Organization', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + END IF; +END $$; + +-- AlterTable for Expense +ALTER TABLE "Expense" ADD COLUMN "organizationId" INTEGER; +UPDATE "Expense" SET "organizationId" = (SELECT id FROM "Organization" WHERE name = 'Default Organization') WHERE "organizationId" IS NULL; +ALTER TABLE "Expense" ALTER COLUMN "organizationId" SET NOT NULL; + +-- AlterTable for Invoice +ALTER TABLE "Invoice" ADD COLUMN "organizationId" INTEGER; +UPDATE "Invoice" SET "organizationId" = (SELECT id FROM "Organization" WHERE name = 'Default Organization') WHERE "organizationId" IS NULL; +ALTER TABLE "Invoice" ALTER COLUMN "organizationId" SET NOT NULL; + +-- AlterTable for NameList +ALTER TABLE "NameList" ADD COLUMN "organizationId" INTEGER; +UPDATE "NameList" SET "organizationId" = (SELECT id FROM "Organization" WHERE name = 'Default Organization') WHERE "organizationId" IS NULL; +ALTER TABLE "NameList" ALTER COLUMN "organizationId" SET NOT NULL; + +-- AlterTable for ZettleSale +ALTER TABLE "ZettleSale" ADD COLUMN "organizationId" INTEGER; +UPDATE "ZettleSale" SET "organizationId" = (SELECT id FROM "Organization" WHERE name = 'Default Organization') WHERE "organizationId" IS NULL; +ALTER TABLE "ZettleSale" ALTER COLUMN "organizationId" SET NOT NULL; + +-- AddForeignKey +ALTER TABLE "Expense" ADD CONSTRAINT "Expense_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +ALTER TABLE "Invoice" ADD CONSTRAINT "Invoice_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +ALTER TABLE "NameList" ADD CONSTRAINT "NameList_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +ALTER TABLE "ZettleSale" ADD CONSTRAINT "ZettleSale_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index cc6e1a1..134fa9c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -14,8 +14,22 @@ enum RequestStatus { REJECTED } +model Organization { + id Int @id @default(autoincrement()) + name String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + expenses Expense[] + invoices Invoice[] + nameLists NameList[] + zettleSales ZettleSale[] +} + model Expense { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) + organization Organization @relation(fields: [organizationId], references: [id]) + organizationId Int gammaSuperGroupId String? gammaGroupId String? gammaUserId String @@ -36,11 +50,12 @@ model Expense { enum ExpenseType { EXPENSE INVOICE - CARD } model Invoice { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) + organization Organization @relation(fields: [organizationId], references: [id]) + organizationId Int gammaSuperGroupId String? gammaGroupId String? gammaUserId String @@ -83,6 +98,8 @@ enum InvoiceItemVat { model NameList { id Int @id @default(autoincrement()) + organization Organization @relation(fields: [organizationId], references: [id]) + organizationId Int gammaSuperGroupId String? gammaGroupId String? gammaUserId String @@ -142,16 +159,18 @@ model NamedMedia { } model ZettleSale { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) + organization Organization @relation(fields: [organizationId], references: [id]) + organizationId Int gammaSuperGroupId String gammaGroupId String gammaUserId String - amount Float @db.DoublePrecision + amount Float @db.DoublePrecision description String name String - saleDate DateTime @db.Date - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + saleDate DateTime @db.Date + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt @@unique([gammaGroupId, saleDate]) } From 35c4bf1cf6a576b67721a0d2e57650cd7146c8dd Mon Sep 17 00:00:00 2001 From: Goostaf Date: Tue, 4 Nov 2025 19:44:10 +0100 Subject: [PATCH 02/35] Change routing for org ID --- src/actions/expenses.ts | 2 ++ src/actions/invoices.ts | 2 ++ src/actions/nameLists.ts | 2 ++ src/actions/zettleSales.ts | 1 + .../bank-accounts/AddPermissionForm.tsx | 0 .../bank-accounts/DeleteAccountButton.tsx | 0 .../bank-accounts/DeleteRequisitionButton.tsx | 0 .../bank-accounts/RefreshAccountButton.tsx | 0 .../bank-accounts/RequisitionsList.tsx | 0 .../bank-accounts/UpdateAccountsButton.tsx | 0 .../add-account/AddAccountForm.tsx | 0 .../bank-accounts/add-account/page.tsx | 0 .../connect/AddRequisitionForm.tsx | 0 .../[orgId]}/bank-accounts/connect/page.tsx | 0 .../bank-accounts/finalize-connect/page.tsx | 0 .../bank-accounts/finalize-reconnect/page.tsx | 0 .../{ => org/[orgId]}/bank-accounts/page.tsx | 0 .../bank-accounts/permissions/page.tsx | 0 .../reconnect/RecreateRequisitionButton.tsx | 0 .../[orgId]}/bank-accounts/reconnect/page.tsx | 0 .../[orgId]}/bank-accounts/settings/page.tsx | 0 .../[orgId]}/bank-accounts/view/page.tsx | 0 .../expenses/create/CreateExpenseForm.tsx | 0 .../[orgId]}/expenses/create/page.tsx | 0 .../{ => org/[orgId]}/expenses/page.tsx | 0 .../expenses/view/ForwardExpenseForm.tsx | 0 .../{ => org/[orgId]}/expenses/view/page.tsx | 0 .../invoices/create/SendInvoiceForm.tsx | 0 .../[orgId]}/invoices/create/page.tsx | 0 .../{ => org/[orgId]}/invoices/page.tsx | 0 .../{ => org/[orgId]}/invoices/view/page.tsx | 0 src/app/[locale]/org/[orgId]/layout.tsx | 18 ++++++++++++++++++ .../name-lists/create/CreateNameListForm.tsx | 0 .../[orgId]}/name-lists/create/page.tsx | 0 .../{ => org/[orgId]}/name-lists/page.tsx | 0 .../[orgId]}/name-lists/view/page.tsx | 0 src/app/[locale]/{ => org/[orgId]}/page.css | 0 src/app/[locale]/{ => org/[orgId]}/page.tsx | 13 ++++++++++--- .../create/CreateZettleSaleForm.tsx | 0 .../[orgId]}/zettle-sales/create/page.tsx | 0 .../{ => org/[orgId]}/zettle-sales/page.tsx | 0 .../[orgId]}/zettle-sales/view/page.tsx | 0 src/services/expenseService.ts | 19 +++++++++++++------ src/services/invoiceService.ts | 4 ++++ src/services/nameListService.ts | 4 ++++ src/services/orgService.ts | 17 +++++++++++++++++ src/services/zettleSaleService.ts | 2 ++ 47 files changed, 75 insertions(+), 9 deletions(-) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/AddPermissionForm.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/DeleteAccountButton.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/DeleteRequisitionButton.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/RefreshAccountButton.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/RequisitionsList.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/UpdateAccountsButton.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/add-account/AddAccountForm.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/add-account/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/connect/AddRequisitionForm.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/connect/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/finalize-connect/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/finalize-reconnect/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/permissions/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/reconnect/RecreateRequisitionButton.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/reconnect/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/settings/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/bank-accounts/view/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/expenses/create/CreateExpenseForm.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/expenses/create/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/expenses/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/expenses/view/ForwardExpenseForm.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/expenses/view/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/invoices/create/SendInvoiceForm.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/invoices/create/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/invoices/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/invoices/view/page.tsx (100%) create mode 100644 src/app/[locale]/org/[orgId]/layout.tsx rename src/app/[locale]/{ => org/[orgId]}/name-lists/create/CreateNameListForm.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/name-lists/create/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/name-lists/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/name-lists/view/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/page.css (100%) rename src/app/[locale]/{ => org/[orgId]}/page.tsx (94%) rename src/app/[locale]/{ => org/[orgId]}/zettle-sales/create/CreateZettleSaleForm.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/zettle-sales/create/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/zettle-sales/page.tsx (100%) rename src/app/[locale]/{ => org/[orgId]}/zettle-sales/view/page.tsx (100%) create mode 100644 src/services/orgService.ts diff --git a/src/actions/expenses.ts b/src/actions/expenses.ts index 1561087..875105a 100644 --- a/src/actions/expenses.ts +++ b/src/actions/expenses.ts @@ -63,6 +63,7 @@ export async function createExpenseForGroup( group.superGroup.id, gammaGroupId, gammaUserId, + 1, // TODO: Use actual organization ID when routing is implemented amount, name, description, @@ -183,6 +184,7 @@ export async function createPersonalExpense( return ExpenseService.createPersonal( gammaUserId, + 1, // TODO: Use actual organization ID when routing is implemented amount, name, description, diff --git a/src/actions/invoices.ts b/src/actions/invoices.ts index f62e36f..85951b6 100644 --- a/src/actions/invoices.ts +++ b/src/actions/invoices.ts @@ -42,6 +42,7 @@ export async function createInvoiceForGroup( group.superGroup.id, gammaGroupId, gammaUserId, + 1, // TODO: Use actual organization ID when routing is implemented name, customerName, description, @@ -133,6 +134,7 @@ export async function createPersonalInvoice( return InvoiceService.createPersonal( gammaUserId, + 1, // TODO: Use actual organization ID when routing is implemented name, customerName, description, diff --git a/src/actions/nameLists.ts b/src/actions/nameLists.ts index c268e58..c28ba67 100644 --- a/src/actions/nameLists.ts +++ b/src/actions/nameLists.ts @@ -29,6 +29,7 @@ export async function createNameListForGroup( group.superGroup.id, gammaGroupId, gammaUserId, + 1, // TODO: Use actual organization ID when routing is implemented name, type, names, @@ -53,6 +54,7 @@ export async function createPersonalNameList( await NameListService.createPersonal( gammaUserId, + 1, // TODO: Use actual organization ID when routing is implemented name, type, names, diff --git a/src/actions/zettleSales.ts b/src/actions/zettleSales.ts index c79fde2..2292d9d 100644 --- a/src/actions/zettleSales.ts +++ b/src/actions/zettleSales.ts @@ -25,6 +25,7 @@ export async function createZettleSale( group.superGroup.id, gammaGroupId, gammaUserId, + 1, // TODO: Use actual organization ID when routing is implemented name, amount, saleDate diff --git a/src/app/[locale]/bank-accounts/AddPermissionForm.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/AddPermissionForm.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/AddPermissionForm.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/AddPermissionForm.tsx diff --git a/src/app/[locale]/bank-accounts/DeleteAccountButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/DeleteAccountButton.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/DeleteAccountButton.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/DeleteAccountButton.tsx diff --git a/src/app/[locale]/bank-accounts/DeleteRequisitionButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/DeleteRequisitionButton.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx diff --git a/src/app/[locale]/bank-accounts/RefreshAccountButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/RefreshAccountButton.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/RefreshAccountButton.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/RefreshAccountButton.tsx diff --git a/src/app/[locale]/bank-accounts/RequisitionsList.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/RequisitionsList.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx diff --git a/src/app/[locale]/bank-accounts/UpdateAccountsButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/UpdateAccountsButton.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx diff --git a/src/app/[locale]/bank-accounts/add-account/AddAccountForm.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/add-account/AddAccountForm.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx diff --git a/src/app/[locale]/bank-accounts/add-account/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/add-account/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx diff --git a/src/app/[locale]/bank-accounts/connect/AddRequisitionForm.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/connect/AddRequisitionForm.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx diff --git a/src/app/[locale]/bank-accounts/connect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/connect/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx diff --git a/src/app/[locale]/bank-accounts/finalize-connect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/finalize-connect/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx diff --git a/src/app/[locale]/bank-accounts/finalize-reconnect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/finalize-reconnect/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx diff --git a/src/app/[locale]/bank-accounts/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/page.tsx diff --git a/src/app/[locale]/bank-accounts/permissions/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/permissions/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/permissions/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/permissions/page.tsx diff --git a/src/app/[locale]/bank-accounts/reconnect/RecreateRequisitionButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/reconnect/RecreateRequisitionButton.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx diff --git a/src/app/[locale]/bank-accounts/reconnect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/reconnect/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx diff --git a/src/app/[locale]/bank-accounts/settings/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/settings/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx diff --git a/src/app/[locale]/bank-accounts/view/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/view/page.tsx similarity index 100% rename from src/app/[locale]/bank-accounts/view/page.tsx rename to src/app/[locale]/org/[orgId]/bank-accounts/view/page.tsx diff --git a/src/app/[locale]/expenses/create/CreateExpenseForm.tsx b/src/app/[locale]/org/[orgId]/expenses/create/CreateExpenseForm.tsx similarity index 100% rename from src/app/[locale]/expenses/create/CreateExpenseForm.tsx rename to src/app/[locale]/org/[orgId]/expenses/create/CreateExpenseForm.tsx diff --git a/src/app/[locale]/expenses/create/page.tsx b/src/app/[locale]/org/[orgId]/expenses/create/page.tsx similarity index 100% rename from src/app/[locale]/expenses/create/page.tsx rename to src/app/[locale]/org/[orgId]/expenses/create/page.tsx diff --git a/src/app/[locale]/expenses/page.tsx b/src/app/[locale]/org/[orgId]/expenses/page.tsx similarity index 100% rename from src/app/[locale]/expenses/page.tsx rename to src/app/[locale]/org/[orgId]/expenses/page.tsx diff --git a/src/app/[locale]/expenses/view/ForwardExpenseForm.tsx b/src/app/[locale]/org/[orgId]/expenses/view/ForwardExpenseForm.tsx similarity index 100% rename from src/app/[locale]/expenses/view/ForwardExpenseForm.tsx rename to src/app/[locale]/org/[orgId]/expenses/view/ForwardExpenseForm.tsx diff --git a/src/app/[locale]/expenses/view/page.tsx b/src/app/[locale]/org/[orgId]/expenses/view/page.tsx similarity index 100% rename from src/app/[locale]/expenses/view/page.tsx rename to src/app/[locale]/org/[orgId]/expenses/view/page.tsx diff --git a/src/app/[locale]/invoices/create/SendInvoiceForm.tsx b/src/app/[locale]/org/[orgId]/invoices/create/SendInvoiceForm.tsx similarity index 100% rename from src/app/[locale]/invoices/create/SendInvoiceForm.tsx rename to src/app/[locale]/org/[orgId]/invoices/create/SendInvoiceForm.tsx diff --git a/src/app/[locale]/invoices/create/page.tsx b/src/app/[locale]/org/[orgId]/invoices/create/page.tsx similarity index 100% rename from src/app/[locale]/invoices/create/page.tsx rename to src/app/[locale]/org/[orgId]/invoices/create/page.tsx diff --git a/src/app/[locale]/invoices/page.tsx b/src/app/[locale]/org/[orgId]/invoices/page.tsx similarity index 100% rename from src/app/[locale]/invoices/page.tsx rename to src/app/[locale]/org/[orgId]/invoices/page.tsx diff --git a/src/app/[locale]/invoices/view/page.tsx b/src/app/[locale]/org/[orgId]/invoices/view/page.tsx similarity index 100% rename from src/app/[locale]/invoices/view/page.tsx rename to src/app/[locale]/org/[orgId]/invoices/view/page.tsx diff --git a/src/app/[locale]/org/[orgId]/layout.tsx b/src/app/[locale]/org/[orgId]/layout.tsx new file mode 100644 index 0000000..67b118b --- /dev/null +++ b/src/app/[locale]/org/[orgId]/layout.tsx @@ -0,0 +1,18 @@ +import { notFound } from 'next/navigation'; + +export default async function RootLayout({ + params, + children +}: Readonly<{ + children: React.ReactNode; + params: Promise<{ orgId: string }>; +}>) { + const { orgId } = await params; + + // Check if orgId is a positive integer + if (orgId === "" || isNaN(Number(orgId)) || Number(orgId) < 0) { + notFound(); + } + + return children; +} diff --git a/src/app/[locale]/name-lists/create/CreateNameListForm.tsx b/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx similarity index 100% rename from src/app/[locale]/name-lists/create/CreateNameListForm.tsx rename to src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx diff --git a/src/app/[locale]/name-lists/create/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/create/page.tsx similarity index 100% rename from src/app/[locale]/name-lists/create/page.tsx rename to src/app/[locale]/org/[orgId]/name-lists/create/page.tsx diff --git a/src/app/[locale]/name-lists/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/page.tsx similarity index 100% rename from src/app/[locale]/name-lists/page.tsx rename to src/app/[locale]/org/[orgId]/name-lists/page.tsx diff --git a/src/app/[locale]/name-lists/view/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx similarity index 100% rename from src/app/[locale]/name-lists/view/page.tsx rename to src/app/[locale]/org/[orgId]/name-lists/view/page.tsx diff --git a/src/app/[locale]/page.css b/src/app/[locale]/org/[orgId]/page.css similarity index 100% rename from src/app/[locale]/page.css rename to src/app/[locale]/org/[orgId]/page.css diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/org/[orgId]/page.tsx similarity index 94% rename from src/app/[locale]/page.tsx rename to src/app/[locale]/org/[orgId]/page.tsx index 1e52bb4..41179fc 100644 --- a/src/app/[locale]/page.tsx +++ b/src/app/[locale]/org/[orgId]/page.tsx @@ -22,13 +22,20 @@ import { } from 'react-icons/md'; import BankAccountService from '@/services/bankAccountService'; import BankAccountsCard from '@/components/BankAccountsCard/BankAccountsCard'; +import { notFound } from 'next/navigation'; +import OrgService from '@/services/orgService'; export default async function Home(props: { - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); + const organization = await OrgService.getById(Number(orgId)); + if (!organization) { + notFound(); + } + const divisionTreasurer = await SessionService.isDivisionTreasurer(); const unpaid = await (divisionTreasurer ? ExpenseService.getAll() @@ -87,7 +94,7 @@ export default async function Home(props: { overflow="hidden" bg="bg.surface" > - + diff --git a/src/app/[locale]/zettle-sales/create/CreateZettleSaleForm.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/create/CreateZettleSaleForm.tsx similarity index 100% rename from src/app/[locale]/zettle-sales/create/CreateZettleSaleForm.tsx rename to src/app/[locale]/org/[orgId]/zettle-sales/create/CreateZettleSaleForm.tsx diff --git a/src/app/[locale]/zettle-sales/create/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/create/page.tsx similarity index 100% rename from src/app/[locale]/zettle-sales/create/page.tsx rename to src/app/[locale]/org/[orgId]/zettle-sales/create/page.tsx diff --git a/src/app/[locale]/zettle-sales/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx similarity index 100% rename from src/app/[locale]/zettle-sales/page.tsx rename to src/app/[locale]/org/[orgId]/zettle-sales/page.tsx diff --git a/src/app/[locale]/zettle-sales/view/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx similarity index 100% rename from src/app/[locale]/zettle-sales/view/page.tsx rename to src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx diff --git a/src/services/expenseService.ts b/src/services/expenseService.ts index cbf2767..1ba2ebb 100644 --- a/src/services/expenseService.ts +++ b/src/services/expenseService.ts @@ -12,28 +12,31 @@ export default class ExpenseService { }); } - static async getUnpaidCount(gammaGroupId?: string) { + static async getUnpaidCount(orgId?: number, gammaGroupId?: string) { return await prisma.expense.count({ where: { gammaGroupId, - paidAt: null + paidAt: null, + organizationId: orgId } }); } - static async getUnpaid(gammaGroupId?: string) { + static async getUnpaid(orgId?: number, gammaGroupId?: string) { return await prisma.expense.findMany({ where: { gammaGroupId, - paidAt: null + paidAt: null, + organizationId: orgId } }); } - static async getForSuperGroup(gammaSuperGroupId: string) { + static async getForSuperGroup(gammaSuperGroupId: string, orgId?: number) { const expenses = await prisma.expense.findMany({ where: { - gammaSuperGroupId + gammaSuperGroupId, + organizationId: orgId }, include: { receipts: { @@ -118,6 +121,7 @@ export default class ExpenseService { gammaSuperGroupId: string, gammaGroupId: string, gammaUserId: string, + orgId: number, amount: number, name: string, description: string, @@ -130,6 +134,7 @@ export default class ExpenseService { gammaUserId, gammaSuperGroupId, gammaGroupId, + organizationId: orgId, name, amount, description, @@ -178,6 +183,7 @@ export default class ExpenseService { static async createPersonal( gammaUserId: string, + orgId: number, amount: number, name: string, description: string, @@ -188,6 +194,7 @@ export default class ExpenseService { const expense = await prisma.expense.create({ data: { gammaUserId, + organizationId: orgId, name, amount, description, diff --git a/src/services/invoiceService.ts b/src/services/invoiceService.ts index 535402d..313fba3 100644 --- a/src/services/invoiceService.ts +++ b/src/services/invoiceService.ts @@ -107,6 +107,7 @@ export default class InvoiceService { gammaSuperGroupId: string, gammaGroupId: string, gammaUserId: string, + orgId: number, name: string, customerName: string, description: string, @@ -131,6 +132,7 @@ export default class InvoiceService { gammaUserId, gammaSuperGroupId, gammaGroupId, + organizationId: orgId, name, customerName, description, @@ -203,6 +205,7 @@ export default class InvoiceService { static async createPersonal( gammaUserId: string, + orgId: number, name: string, customerName: string, description: string, @@ -225,6 +228,7 @@ export default class InvoiceService { const expense = await prisma.invoice.create({ data: { gammaUserId, + organizationId: orgId, name, customerName, description, diff --git a/src/services/nameListService.ts b/src/services/nameListService.ts index f34d592..25447de 100644 --- a/src/services/nameListService.ts +++ b/src/services/nameListService.ts @@ -95,6 +95,7 @@ export default class NameListService { gammaSuperGroupId: string, gammaGroupId: string, gammaUserId: string, + orgId: number, name: string, type: NameListType, names: Prisma.NameListEntryCreateNestedManyWithoutNameListInput['create'], @@ -115,6 +116,7 @@ export default class NameListService { gammaSuperGroupId, gammaGroupId, gammaUserId, + organizationId: orgId, name, type, names: { @@ -132,6 +134,7 @@ export default class NameListService { static async createPersonal( gammaUserId: string, + orgId: number, name: string, type: NameListType, names: Prisma.NameListEntryCreateNestedManyWithoutNameListInput['create'], @@ -150,6 +153,7 @@ export default class NameListService { const expense = await prisma.nameList.create({ data: { gammaUserId, + organizationId: orgId, name, type, names: { diff --git a/src/services/orgService.ts b/src/services/orgService.ts new file mode 100644 index 0000000..1e17c14 --- /dev/null +++ b/src/services/orgService.ts @@ -0,0 +1,17 @@ +import prisma from '@/prisma'; + +export default class OrgService { + static async getAll() { + return await prisma.organization.findMany({ + }); + } + + static async getById(id: number) { + const organization = await prisma.organization.findUnique({ + where: { + id + } + }); + return organization; + } +} \ No newline at end of file diff --git a/src/services/zettleSaleService.ts b/src/services/zettleSaleService.ts index 47a935f..9331b7f 100644 --- a/src/services/zettleSaleService.ts +++ b/src/services/zettleSaleService.ts @@ -61,6 +61,7 @@ export default class ZettleSaleService { gammaSuperGroupId: string, gammaGroupId: string, gammaUserId: string, + orgId: number, name: string, amount: number, saleDate: Date @@ -70,6 +71,7 @@ export default class ZettleSaleService { gammaSuperGroupId, gammaGroupId, gammaUserId, + organizationId: orgId, name, description: '', amount, From ea2a096b10c69a218d7ae0632003927581e95960 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Wed, 5 Nov 2025 09:45:16 +0100 Subject: [PATCH 03/35] Update Prisma --- .gitignore | 2 ++ flake.lock | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index ea289c7..a0225ff 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ package-lock.json .idea/ /db + +.direnv diff --git a/flake.lock b/flake.lock index ee23698..ecff086 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1746576598, - "narHash": "sha256-FshoQvr6Aor5SnORVvh/ZdJ1Sa2U4ZrIMwKBX5k2wu0=", + "lastModified": 1760596604, + "narHash": "sha256-J/i5K6AAz/y5dBePHQOuzC7MbhyTOKsd/GLezSbEFiM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b3582c75c7f21ce0b429898980eddbbf05c68e55", + "rev": "3cbe716e2346710d6e1f7c559363d14e11c32a43", "type": "github" }, "original": { From f6fb893884e1d32792de21708cdcb458feb717f5 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Fri, 7 Nov 2025 09:56:21 +0100 Subject: [PATCH 04/35] Add basic routing for organizations --- src/app/[locale]/layout.tsx | 13 ++++---- .../bank-accounts/RequisitionsList.tsx | 22 +++++--------- .../bank-accounts/add-account/page.tsx | 11 +++---- .../[orgId]/bank-accounts/connect/page.tsx | 11 +++---- .../bank-accounts/finalize-connect/page.tsx | 25 ++++++++++------ .../bank-accounts/finalize-reconnect/page.tsx | 7 +++-- .../org/[orgId]/bank-accounts/page.tsx | 8 ++--- .../bank-accounts/permissions/page.tsx | 7 +++-- .../[orgId]/bank-accounts/reconnect/page.tsx | 11 +++---- .../[orgId]/bank-accounts/settings/page.tsx | 7 +++-- .../[locale]/org/[orgId]/expenses/page.tsx | 9 +++--- .../[locale]/org/[orgId]/invoices/page.tsx | 10 +++---- .../[locale]/org/[orgId]/name-lists/page.tsx | 10 +++---- src/app/[locale]/org/[orgId]/page.tsx | 3 +- .../org/[orgId]/zettle-sales/page.tsx | 10 +++---- src/app/[locale]/page.tsx | 30 +++++++++++++++++++ .../BankAccountsCard/BankAccountsCard.tsx | 8 +++-- .../ExpensesTable/ExpensesTable.tsx | 9 ++++-- src/components/Header/Header.tsx | 6 ++-- .../InvoicesTable/InvoicesTable.tsx | 6 ++-- .../NameListTable/NameListTable.tsx | 6 ++-- src/components/Navigation/Navigation.tsx | 16 +++++----- .../ZettleSalesTable/ZettleSalesTable.tsx | 12 ++++---- src/services/expenseService.ts | 6 ++-- 24 files changed, 158 insertions(+), 105 deletions(-) create mode 100644 src/app/[locale]/page.tsx diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index 0595b29..1fed332 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -32,12 +32,14 @@ export default async function RootLayout({ }>) { const { locale } = await params; const user = await SessionService.getUser(); + // TODO: Get orgId from user preferences or session + const orgId = 1; return ( <> -
+
{user ? ( - {children} + {children} ) : ( )} @@ -47,8 +49,9 @@ export default async function RootLayout({ const LoggedIn = ({ children, - locale -}: Readonly<{ children: React.ReactNode; locale: string }>) => { + locale, + orgId +}: Readonly<{ children: React.ReactNode; locale: string; orgId: number }>) => { return ( - + {children} diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx index a82829b..47da279 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx @@ -21,13 +21,13 @@ import DeleteAccountButton from './DeleteAccountButton'; const RequisitionsList = ({ requisitions, groups: _groups, - locale + orgId }: { requisitions: Awaited< ReturnType >; groups: Awaited>; - locale: string; + orgId: number; }) => { const getStatusLabel = (status: string) => { switch (status) { @@ -76,7 +76,7 @@ const RequisitionsList = ({ Bank Account Connections - + @@ -55,6 +55,7 @@ export default async function Page(props: { locale={locale} treasurerPostId={process.env.TREASURER_POST_ID} allEditable={divisionTreasurer} + orgId={Number(orgId)} /> diff --git a/src/app/[locale]/org/[orgId]/invoices/page.tsx b/src/app/[locale]/org/[orgId]/invoices/page.tsx index c215771..b25ded7 100644 --- a/src/app/[locale]/org/[orgId]/invoices/page.tsx +++ b/src/app/[locale]/org/[orgId]/invoices/page.tsx @@ -15,9 +15,9 @@ import GammaService from '@/services/gammaService'; export default async function Page(props: { searchParams: Promise<{ gid?: string; sgid?: string; show?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const superGroups = await GammaService.getAllSuperGroups(); @@ -32,7 +32,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} {l.categories.invoices} @@ -42,14 +42,14 @@ export default async function Page(props: { {l.categories.invoices} - + - + ); } diff --git a/src/app/[locale]/org/[orgId]/name-lists/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/page.tsx index 1a3a98e..0fc4ae1 100644 --- a/src/app/[locale]/org/[orgId]/name-lists/page.tsx +++ b/src/app/[locale]/org/[orgId]/name-lists/page.tsx @@ -15,9 +15,9 @@ import GammaService from '@/services/gammaService'; export default async function Page(props: { searchParams: Promise<{ gid?: string; sgid?: string; show?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const superGroups = await GammaService.getAllSuperGroups(); @@ -32,7 +32,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} {l.nameLists.title} @@ -42,14 +42,14 @@ export default async function Page(props: { {l.nameLists.title} - + - + ); } diff --git a/src/app/[locale]/org/[orgId]/page.tsx b/src/app/[locale]/org/[orgId]/page.tsx index 41179fc..71f85ba 100644 --- a/src/app/[locale]/org/[orgId]/page.tsx +++ b/src/app/[locale]/org/[orgId]/page.tsx @@ -84,6 +84,7 @@ export default async function Home(props: { accounts={bankAccounts} locale={locale} linkToControls={divisionTreasurer} + orgId={Number(orgId)} /> )} @@ -151,7 +152,7 @@ export default async function Home(props: { overflow="hidden" bg="bg.surface" > - + diff --git a/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx index 24e1a82..e23e9a2 100644 --- a/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx +++ b/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx @@ -15,9 +15,9 @@ import GammaService from '@/services/gammaService'; export default async function Page(props: { searchParams: Promise<{ gid?: string; show?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const superGroups = await GammaService.getAllSuperGroups(); @@ -32,7 +32,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} {l.home.zettleSales} @@ -42,14 +42,14 @@ export default async function Page(props: { {l.home.zettleSales} - + - + ); } diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx new file mode 100644 index 0000000..027ba68 --- /dev/null +++ b/src/app/[locale]/page.tsx @@ -0,0 +1,30 @@ +import { Box, Heading } from '@chakra-ui/react'; +import Link from 'next/link'; +import i18nService from '@/services/i18nService'; +import OrgService from '@/services/orgService'; + +export default async function Page(props: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await props.params; + const l = i18nService.getLocale(locale); + + const organizations = await OrgService.getAll(); + + return ( + <> + + Choose an organization + + + +
    + {organizations.map((org) => ( +
  • + {org.name} +
  • + ))} +
+ + ); +} diff --git a/src/components/BankAccountsCard/BankAccountsCard.tsx b/src/components/BankAccountsCard/BankAccountsCard.tsx index f1332e0..c486679 100644 --- a/src/components/BankAccountsCard/BankAccountsCard.tsx +++ b/src/components/BankAccountsCard/BankAccountsCard.tsx @@ -15,11 +15,13 @@ import { MdAccountBalance, MdOutlineArrowForwardIos } from 'react-icons/md'; export default function BankAccountsCard({ accounts, locale, - linkToControls + linkToControls, + orgId = 1 }: { accounts: Prisma.BankAccountGetPayload<{}>[]; locale: string; linkToControls?: boolean; + orgId?: number; }) { const l = i18nService.getLocale(locale); @@ -61,7 +63,7 @@ export default function BankAccountsCard({ height="max-content" > {linkToControls ? ( - + ( - + {a.name} diff --git a/src/components/ExpensesTable/ExpensesTable.tsx b/src/components/ExpensesTable/ExpensesTable.tsx index faacaca..2cf0761 100644 --- a/src/components/ExpensesTable/ExpensesTable.tsx +++ b/src/components/ExpensesTable/ExpensesTable.tsx @@ -102,7 +102,8 @@ const ExpensesTable = ({ locale, treasurerPostId, allEditable = false, - superGroups + superGroups, + orgId = 1 }: { e: Expense[]; groups: { group: GammaGroup; post: GammaPost }[]; @@ -110,6 +111,7 @@ const ExpensesTable = ({ treasurerPostId?: string; allEditable?: boolean; superGroups?: { superGroup: GammaSuperGroup; members: GammaGroupMember[] }[]; + orgId?: number; }) => { const l = i18nService.getLocale(locale); @@ -158,7 +160,7 @@ const ExpensesTable = ({ cell: (info) => ( {info.getValue()} @@ -245,7 +247,8 @@ const ExpensesTable = ({ locale, groups, treasurerPostId, - allEditable + allEditable, + orgId ] ); diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index bd254c2..1350b80 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -14,7 +14,7 @@ import { HiMenu, HiX } from 'react-icons/hi'; import Navigation from '../Navigation/Navigation'; import SessionService from '@/services/sessionService'; -const Header = async ({ locale }: { locale: string }) => { +const Header = async ({ locale, orgId = 1 }: { locale: string; orgId?: number }) => { const user = await SessionService.getUser(); return ( @@ -39,7 +39,7 @@ const Header = async ({ locale }: { locale: string }) => { - + @@ -54,7 +54,7 @@ const Header = async ({ locale }: { locale: string }) => { )} - CashIT + CashIT beta v0.5.0 diff --git a/src/components/InvoicesTable/InvoicesTable.tsx b/src/components/InvoicesTable/InvoicesTable.tsx index f1a5834..954bf92 100644 --- a/src/components/InvoicesTable/InvoicesTable.tsx +++ b/src/components/InvoicesTable/InvoicesTable.tsx @@ -77,11 +77,13 @@ interface InvoiceRow { const InvoicesTable = ({ e, locale, - superGroups + superGroups, + orgId = 1 }: { e: Invoice[]; locale: string; superGroups?: { superGroup: GammaSuperGroup; members: GammaGroupMember[] }[]; + orgId?: number; }) => { const l = i18nService.getLocale(locale); @@ -129,7 +131,7 @@ const InvoicesTable = ({ cell: (info) => ( {info.getValue()} diff --git a/src/components/NameListTable/NameListTable.tsx b/src/components/NameListTable/NameListTable.tsx index 8cac207..7f0ab84 100644 --- a/src/components/NameListTable/NameListTable.tsx +++ b/src/components/NameListTable/NameListTable.tsx @@ -54,11 +54,13 @@ interface NameListRow { const NameListTable = ({ e, superGroups, - locale + locale, + orgId = 1 }: { e: NameList[]; superGroups?: { superGroup: GammaSuperGroup; members: GammaGroupMember[] }[]; locale: string; + orgId?: number; }) => { const l = i18nService.getLocale(locale); @@ -100,7 +102,7 @@ const NameListTable = ({ cell: (info) => ( {info.getValue()} diff --git a/src/components/Navigation/Navigation.tsx b/src/components/Navigation/Navigation.tsx index adc55d7..0647d48 100644 --- a/src/components/Navigation/Navigation.tsx +++ b/src/components/Navigation/Navigation.tsx @@ -11,13 +11,13 @@ import { } from 'react-icons/pi'; import SessionService from '@/services/sessionService'; -const Navigation = async ({ locale }: { locale: string }) => { +const Navigation = async ({ locale, orgId = 1 }: { locale: string; orgId?: number }) => { const l = i18nService.getLocale(locale); const divisionTreasurer = await SessionService.isDivisionTreasurer(); return ( - + {' '} @@ -30,25 +30,25 @@ const Navigation = async ({ locale }: { locale: string }) => { - + {' '} {l.categories.expenses} - + {' '} {l.categories.invoices} - + {' '} {l.home.zettleSales} - + {' '} @@ -62,14 +62,14 @@ const Navigation = async ({ locale }: { locale: string }) => {
{divisionTreasurer && ( - + {' '} {l.bankAccounts.title} )} - + {' '} diff --git a/src/components/ZettleSalesTable/ZettleSalesTable.tsx b/src/components/ZettleSalesTable/ZettleSalesTable.tsx index 5cbca79..e00205b 100644 --- a/src/components/ZettleSalesTable/ZettleSalesTable.tsx +++ b/src/components/ZettleSalesTable/ZettleSalesTable.tsx @@ -51,11 +51,13 @@ interface SaleRow { const ZettleSalesTable = ({ e, superGroups, - locale + locale, + orgId = 1 }: { e: ZettleSale[]; superGroups?: { superGroup: GammaSuperGroup; members: GammaGroupMember[] }[]; locale: string; + orgId?: number; }) => { const l = i18nService.getLocale(locale); @@ -93,7 +95,7 @@ const ZettleSalesTable = ({ cell: (info) => ( {info.getValue()} @@ -123,7 +125,7 @@ const ZettleSalesTable = ({ id: 'actions', cell: (info) => { const sale = info.row.original; - return ; + return ; } }) ]; @@ -174,7 +176,7 @@ const ZettleSalesTable = ({ ); }; -const SaleActions = ({ id, locale }: { id: number; locale: string }) => { +const SaleActions = ({ id, locale, orgId }: { id: number; locale: string; orgId: number }) => { const l = i18nService.getLocale(locale); const router = useRouter(); @@ -195,7 +197,7 @@ const SaleActions = ({ id, locale }: { id: number; locale: string }) => { router.push('/zettle-sales/view?id=' + id)} + onClick={() => router.push(`/org/${orgId}/zettle-sales/view?id=${id}`)} > {l.general.edit} diff --git a/src/services/expenseService.ts b/src/services/expenseService.ts index 1ba2ebb..d9bcd60 100644 --- a/src/services/expenseService.ts +++ b/src/services/expenseService.ts @@ -12,7 +12,7 @@ export default class ExpenseService { }); } - static async getUnpaidCount(orgId?: number, gammaGroupId?: string) { + static async getUnpaidCount(orgId: number, gammaGroupId?: string) { return await prisma.expense.count({ where: { gammaGroupId, @@ -22,7 +22,7 @@ export default class ExpenseService { }); } - static async getUnpaid(orgId?: number, gammaGroupId?: string) { + static async getUnpaid(orgId: number, gammaGroupId?: string) { return await prisma.expense.findMany({ where: { gammaGroupId, @@ -32,7 +32,7 @@ export default class ExpenseService { }); } - static async getForSuperGroup(gammaSuperGroupId: string, orgId?: number) { + static async getForSuperGroup(gammaSuperGroupId: string, orgId: number) { const expenses = await prisma.expense.findMany({ where: { gammaSuperGroupId, From 1592b50fd5bd0faa748989624ca118ef64646c21 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Fri, 14 Nov 2025 10:08:33 +0100 Subject: [PATCH 05/35] Add basic admin pages for orgs --- src/actions/organizations.ts | 22 +++ .../admin/organizations/OrganizationForm.tsx | 90 +++++++++++ .../organizations/OrganizationsTable.tsx | 149 ++++++++++++++++++ .../admin/organizations/[id]/edit/page.tsx | 57 +++++++ .../admin/organizations/[id]/page.tsx | 76 +++++++++ .../admin/organizations/create/page.tsx | 44 ++++++ src/app/[locale]/admin/organizations/page.tsx | 60 +++++++ src/components/Navigation/Navigation.tsx | 19 ++- src/services/orgService.ts | 30 ++++ 9 files changed, 546 insertions(+), 1 deletion(-) create mode 100644 src/actions/organizations.ts create mode 100644 src/app/[locale]/admin/organizations/OrganizationForm.tsx create mode 100644 src/app/[locale]/admin/organizations/OrganizationsTable.tsx create mode 100644 src/app/[locale]/admin/organizations/[id]/edit/page.tsx create mode 100644 src/app/[locale]/admin/organizations/[id]/page.tsx create mode 100644 src/app/[locale]/admin/organizations/create/page.tsx create mode 100644 src/app/[locale]/admin/organizations/page.tsx diff --git a/src/actions/organizations.ts b/src/actions/organizations.ts new file mode 100644 index 0000000..095ec50 --- /dev/null +++ b/src/actions/organizations.ts @@ -0,0 +1,22 @@ +'use server'; + +import OrgService from '@/services/orgService'; +import { revalidatePath } from 'next/cache'; + +export async function createOrganization(name: string) { + const organization = await OrgService.create(name); + revalidatePath('/admin/organizations'); + return organization; +} + +export async function updateOrganization(id: number, name: string) { + const organization = await OrgService.update(id, name); + revalidatePath('/admin/organizations'); + revalidatePath(`/admin/organizations/${id}`); + return organization; +} + +export async function deleteOrganization(id: number) { + await OrgService.delete(id); + revalidatePath('/admin/organizations'); +} diff --git a/src/app/[locale]/admin/organizations/OrganizationForm.tsx b/src/app/[locale]/admin/organizations/OrganizationForm.tsx new file mode 100644 index 0000000..774b686 --- /dev/null +++ b/src/app/[locale]/admin/organizations/OrganizationForm.tsx @@ -0,0 +1,90 @@ +'use client'; + +import { useState, useCallback } from 'react'; +import { useRouter } from 'next/navigation'; +import { Box, Input, VStack } from '@chakra-ui/react'; +import { Button } from '@/components/ui/button'; +import { Field } from '@/components/ui/field'; +import { createOrganization, updateOrganization } from '@/actions/organizations'; +import { Organization } from '@prisma/client'; + +interface OrganizationFormProps { + mode: 'create' | 'edit'; + organization?: Organization; +} + +const OrganizationForm = ({ mode, organization }: OrganizationFormProps) => { + const router = useRouter(); + const [name, setName] = useState(organization?.name || ''); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const handleSubmit = useCallback( + async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + setError(null); + + try { + if (mode === 'create') { + await createOrganization(name); + router.push('/admin/organizations'); + } else if (organization) { + await updateOrganization(organization.id, name); + router.push(`/admin/organizations/${organization.id}`); + } + router.refresh(); + } catch (err) { + setError(err instanceof Error ? err.message : 'An error occurred'); + setLoading(false); + } + }, + [mode, name, organization, router] + ); + + return ( + +
+ + + setName(e.target.value)} + placeholder="Enter organization name" + required + disabled={loading} + /> + + + {error && ( + + {error} + + )} + + + + + + +
+
+ ); +}; + +export default OrganizationForm; diff --git a/src/app/[locale]/admin/organizations/OrganizationsTable.tsx b/src/app/[locale]/admin/organizations/OrganizationsTable.tsx new file mode 100644 index 0000000..f4ba710 --- /dev/null +++ b/src/app/[locale]/admin/organizations/OrganizationsTable.tsx @@ -0,0 +1,149 @@ +'use client'; + +import { useRouter } from 'next/navigation'; +import { useCallback } from 'react'; +import { deleteOrganization } from '@/actions/organizations'; +import { + Badge, + IconButton, + Text, + Box, + Table +} from '@chakra-ui/react'; +import { + MenuContent, + MenuItem, + MenuRoot, + MenuTrigger +} from '@/components/ui/menu'; +import { HiDotsHorizontal, HiPencil, HiTrash } from 'react-icons/hi'; +import i18nService from '@/services/i18nService'; +import { Organization } from '@prisma/client'; + +const OrganizationsTable = ({ + organizations, + locale +}: { + organizations: Organization[]; + locale: string; +}) => { + const router = useRouter(); + + const handleRowClick = (orgId: number, e: React.MouseEvent) => { + // Don't navigate if clicking on the actions menu + const target = e.target as HTMLElement; + if (target.closest('button') || target.closest('[role="menuitem"]')) { + return; + } + router.push(`/admin/organizations/${orgId}`); + }; + + if (organizations.length === 0) { + return ( + + + No organizations found + + + Create your first organization to get started + + + ); + } + + return ( + + + + + ID + Name + Created + Updated + Actions + + + + {organizations.map((org) => ( + handleRowClick(org.id, e)} + cursor="pointer" + _hover={{ bg: 'bg.muted' }} + > + + {org.id} + + + {org.name} + + + {new Date(org.createdAt).toLocaleDateString(locale)} + + + {new Date(org.updatedAt).toLocaleDateString(locale)} + + + + + + ))} + + + + ); +}; + +const OrgActions = ({ + id, + name, + locale +}: { + id: number; + name: string; + locale: string; +}) => { + const l = i18nService.getLocale(locale); + const router = useRouter(); + + const handleDelete = useCallback(() => { + if ( + confirm( + `Are you sure you want to delete "${name}"? This action cannot be undone.` + ) + ) { + deleteOrganization(id).then(() => { + router.refresh(); + }); + } + }, [id, name, router]); + + return ( + + + + + + + + router.push(`/admin/organizations/${id}/edit`)} + > + {l.general.edit} + + + {l.general.delete} + + + + ); +}; + +export default OrganizationsTable; diff --git a/src/app/[locale]/admin/organizations/[id]/edit/page.tsx b/src/app/[locale]/admin/organizations/[id]/edit/page.tsx new file mode 100644 index 0000000..8717d3a --- /dev/null +++ b/src/app/[locale]/admin/organizations/[id]/edit/page.tsx @@ -0,0 +1,57 @@ +import { Box, Heading, Text, VStack } from '@chakra-ui/react'; +import { notFound } from 'next/navigation'; +import Link from 'next/link'; +import OrgService from '@/services/orgService'; +import { BreadcrumbRoot, BreadcrumbLink, BreadcrumbCurrentLink } from '@/components/ui/breadcrumb'; +import SessionService from '@/services/sessionService'; +import OrganizationForm from '../../OrganizationForm'; + +interface PageProps { + params: Promise<{ + locale: string; + id: string; + }>; +} + +const EditOrganizationPage = async ({ params }: PageProps) => { + const resolvedParams = await params; + const { locale, id } = resolvedParams; + + const divisionTreasurer = await SessionService.isDivisionTreasurer(); + + if (!divisionTreasurer) { + return ( + + Access denied. Division treasurer role required. + + ); + } + + const organization = await OrgService.getById(Number(id)); + + if (!organization) { + notFound(); + } + + return ( + + + + + Organizations + + + {organization.name} + + Edit + + + Edit Organization + + + + + ); +}; + +export default EditOrganizationPage; diff --git a/src/app/[locale]/admin/organizations/[id]/page.tsx b/src/app/[locale]/admin/organizations/[id]/page.tsx new file mode 100644 index 0000000..170b912 --- /dev/null +++ b/src/app/[locale]/admin/organizations/[id]/page.tsx @@ -0,0 +1,76 @@ +import { Box, Heading, Stack, Text, VStack } from '@chakra-ui/react'; +import { Button } from '@/components/ui/button'; +import Link from 'next/link'; +import { notFound } from 'next/navigation'; +import OrgService from '@/services/orgService'; +import { BreadcrumbRoot, BreadcrumbLink, BreadcrumbCurrentLink } from '@/components/ui/breadcrumb'; +import SessionService from '@/services/sessionService'; + +interface PageProps { + params: Promise<{ + locale: string; + id: string; + }>; +} + +const ViewOrganizationPage = async ({ params }: PageProps) => { + const resolvedParams = await params; + const { locale, id } = resolvedParams; + + const divisionTreasurer = await SessionService.isDivisionTreasurer(); + + if (!divisionTreasurer) { + return ( + + Access denied. Division treasurer role required. + + ); + } + + const organization = await OrgService.getById(Number(id)); + + if (!organization) { + notFound(); + } + + return ( + + + + + Organizations + + {organization.name} + + + + {organization.name} + + + + + + ID + {organization.id} + + + Name + {organization.name} + + + Created At + {organization.createdAt.toLocaleDateString()} + + + Updated At + {organization.updatedAt.toLocaleDateString()} + + + + + ); +}; + +export default ViewOrganizationPage; diff --git a/src/app/[locale]/admin/organizations/create/page.tsx b/src/app/[locale]/admin/organizations/create/page.tsx new file mode 100644 index 0000000..4438113 --- /dev/null +++ b/src/app/[locale]/admin/organizations/create/page.tsx @@ -0,0 +1,44 @@ +import { Box, Heading } from '@chakra-ui/react'; +import { + BreadcrumbCurrentLink, + BreadcrumbLink, + BreadcrumbRoot +} from '@/components/ui/breadcrumb'; +import Link from 'next/link'; +import i18nService from '@/services/i18nService'; +import SessionService from '@/services/sessionService'; +import { notFound } from 'next/navigation'; +import OrganizationForm from '../OrganizationForm'; + +export default async function Page(props: { + params: Promise<{ locale: string }>; +}) { + const divisionTreasurer = await SessionService.isDivisionTreasurer(); + if (!divisionTreasurer) { + notFound(); + } + + const { locale } = await props.params; + const l = i18nService.getLocale(locale); + + return ( + <> + + + {l.home.title} + + + Organizations + + Create + + + + + Create Organization + + + + + ); +} diff --git a/src/app/[locale]/admin/organizations/page.tsx b/src/app/[locale]/admin/organizations/page.tsx new file mode 100644 index 0000000..09e740a --- /dev/null +++ b/src/app/[locale]/admin/organizations/page.tsx @@ -0,0 +1,60 @@ +import { Box, Flex, Heading, Text, VStack } from '@chakra-ui/react'; +import { + BreadcrumbCurrentLink, + BreadcrumbLink, + BreadcrumbRoot +} from '@/components/ui/breadcrumb'; +import Link from 'next/link'; +import i18nService from '@/services/i18nService'; +import SessionService from '@/services/sessionService'; +import { notFound } from 'next/navigation'; +import OrgService from '@/services/orgService'; +import { Button } from '@/components/ui/button'; +import { HiPlus } from 'react-icons/hi'; +import OrganizationsTable from './OrganizationsTable'; + +export default async function Page(props: { + params: Promise<{ locale: string }>; +}) { + const divisionTreasurer = await SessionService.isDivisionTreasurer(); + if (!divisionTreasurer) { + notFound(); + } + + const { locale } = await props.params; + const l = i18nService.getLocale(locale); + + const organizations = await OrgService.getAll(); + + return ( + <> + + + {l.home.title} + + Organizations + + + + + + + + Organizations + + + Manage organizations in the system + + + + + + + + + + + ); +} diff --git a/src/components/Navigation/Navigation.tsx b/src/components/Navigation/Navigation.tsx index 0647d48..23d0547 100644 --- a/src/components/Navigation/Navigation.tsx +++ b/src/components/Navigation/Navigation.tsx @@ -7,7 +7,8 @@ import { PiCoins, PiHouse, PiReceipt, - PiUsersThree + PiUsersThree, + PiGear } from 'react-icons/pi'; import SessionService from '@/services/sessionService'; @@ -75,6 +76,22 @@ const Navigation = async ({ locale, orgId = 1 }: { locale: string; orgId?: numbe {' '} {l.categories.receiptCreator}
+ + {divisionTreasurer && ( + <> + + + Admin + + + + + + {' '} + Organizations + + + )} ); }; diff --git a/src/services/orgService.ts b/src/services/orgService.ts index 1e17c14..8912391 100644 --- a/src/services/orgService.ts +++ b/src/services/orgService.ts @@ -3,6 +3,9 @@ import prisma from '@/prisma'; export default class OrgService { static async getAll() { return await prisma.organization.findMany({ + orderBy: { + name: 'asc' + } }); } @@ -14,4 +17,31 @@ export default class OrgService { }); return organization; } + + static async create(name: string) { + return await prisma.organization.create({ + data: { + name + } + }); + } + + static async update(id: number, name: string) { + return await prisma.organization.update({ + where: { + id + }, + data: { + name + } + }); + } + + static async delete(id: number) { + return await prisma.organization.delete({ + where: { + id + } + }); + } } \ No newline at end of file From 2aea88e78614dca26f168155cefd8a360725819c Mon Sep 17 00:00:00 2001 From: Goostaf Date: Fri, 14 Nov 2025 11:04:26 +0100 Subject: [PATCH 06/35] Improve table styles and behavior --- .../[locale]/org/[orgId]/invoices/page.tsx | 7 ++- .../[locale]/org/[orgId]/name-lists/page.tsx | 7 ++- .../org/[orgId]/zettle-sales/page.tsx | 7 ++- .../CashitTable/CashitTable.module.css | 4 ++ src/components/CashitTable/CashitTable.tsx | 44 ++++++++++++++++--- .../ExpensesTable/ExpensesTable.module.css | 3 -- .../ExpensesTable/ExpensesTable.tsx | 27 +++++------- .../InvoicesTable/InvoicesTable.module.css | 3 -- .../InvoicesTable/InvoicesTable.tsx | 23 +++------- .../NameListTable/NameListTable.module.css | 3 -- .../NameListTable/NameListTable.tsx | 24 ++++------ .../ZettleSalesTable.module.css | 3 -- .../ZettleSalesTable/ZettleSalesTable.tsx | 18 +++----- 13 files changed, 91 insertions(+), 82 deletions(-) create mode 100644 src/components/CashitTable/CashitTable.module.css delete mode 100644 src/components/ExpensesTable/ExpensesTable.module.css delete mode 100644 src/components/InvoicesTable/InvoicesTable.module.css delete mode 100644 src/components/NameListTable/NameListTable.module.css delete mode 100644 src/components/ZettleSalesTable/ZettleSalesTable.module.css diff --git a/src/app/[locale]/org/[orgId]/invoices/page.tsx b/src/app/[locale]/org/[orgId]/invoices/page.tsx index b25ded7..bbd6bae 100644 --- a/src/app/[locale]/org/[orgId]/invoices/page.tsx +++ b/src/app/[locale]/org/[orgId]/invoices/page.tsx @@ -49,7 +49,12 @@ export default async function Page(props: { - + ); } diff --git a/src/app/[locale]/org/[orgId]/name-lists/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/page.tsx index 0fc4ae1..4f9e19f 100644 --- a/src/app/[locale]/org/[orgId]/name-lists/page.tsx +++ b/src/app/[locale]/org/[orgId]/name-lists/page.tsx @@ -49,7 +49,12 @@ export default async function Page(props: { - + ); } diff --git a/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx index e23e9a2..401521c 100644 --- a/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx +++ b/src/app/[locale]/org/[orgId]/zettle-sales/page.tsx @@ -49,7 +49,12 @@ export default async function Page(props: { - + ); } diff --git a/src/components/CashitTable/CashitTable.module.css b/src/components/CashitTable/CashitTable.module.css new file mode 100644 index 0000000..2c74d17 --- /dev/null +++ b/src/components/CashitTable/CashitTable.module.css @@ -0,0 +1,4 @@ +.table:has(tbody:empty) .headerCell { + border-bottom-width: 0 !important; + border-bottom: none !important; +} diff --git a/src/components/CashitTable/CashitTable.tsx b/src/components/CashitTable/CashitTable.tsx index b3e805e..1edecf6 100644 --- a/src/components/CashitTable/CashitTable.tsx +++ b/src/components/CashitTable/CashitTable.tsx @@ -1,7 +1,9 @@ -import { Box, LinkBox, Table } from '@chakra-ui/react'; +import { Box, Table } from '@chakra-ui/react'; import { flexRender, Table as TTable } from '@tanstack/react-table'; import TableFilter from '../TableFilter/TableFilter'; import TablePagination from '../TablePagination/TablePagination'; +import { useRouter } from 'next/navigation'; +import styles from './CashitTable.module.css'; const CashitTable = ({ table, @@ -14,8 +16,28 @@ const CashitTable = ({ locale: string; emptyStateComponent: React.ReactNode; }) => { + const router = useRouter(); + const handleRowClick = (url: string | undefined, e: React.MouseEvent) => { + // Don't navigate if clicking on the actions menu + const target = e.target as HTMLElement; + if ( + !url || + target.closest('button') || + target.closest('[role="menuitem"]') + ) { + return; + } + router.push(url); + }; return ( - + {table .getHeaderGroups() @@ -26,11 +48,15 @@ const CashitTable = ({ )} - + {table.getHeaderGroups().map((headerGroup) => headerGroup.headers.map((header) => { return ( - + {table.getRowModel().rows.map((row) => ( - + handleRowClick(row.original.url, e)} + cursor={row.original.url ? 'pointer' : 'default'} + > {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} - + ))} diff --git a/src/components/ExpensesTable/ExpensesTable.module.css b/src/components/ExpensesTable/ExpensesTable.module.css deleted file mode 100644 index e677f69..0000000 --- a/src/components/ExpensesTable/ExpensesTable.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.overlay::before { - border-bottom: 1px var(--global-color-border, currentColor) solid; -} diff --git a/src/components/ExpensesTable/ExpensesTable.tsx b/src/components/ExpensesTable/ExpensesTable.tsx index 2cf0761..af12f8b 100644 --- a/src/components/ExpensesTable/ExpensesTable.tsx +++ b/src/components/ExpensesTable/ExpensesTable.tsx @@ -16,7 +16,6 @@ import { IconButton, Separator, Text, - LinkOverlay, Box } from '@chakra-ui/react'; import { @@ -39,7 +38,6 @@ import { PiChatFill, PiCoins, PiPaperclip } from 'react-icons/pi'; import Link from 'next/link'; import i18nService from '@/services/i18nService'; import { EmptyState } from '../ui/empty-state'; -import styles from './ExpensesTable.module.css'; import { GammaGroup, GammaPost, @@ -86,6 +84,7 @@ interface ExpenseRow { status: ExpenseStatus; statusText: string; receipts: Expense['receipts']; + url: string; } const cellWidths: Record = { @@ -103,7 +102,7 @@ const ExpensesTable = ({ treasurerPostId, allEditable = false, superGroups, - orgId = 1 + orgId }: { e: Expense[]; groups: { group: GammaGroup; post: GammaPost }[]; @@ -111,7 +110,7 @@ const ExpensesTable = ({ treasurerPostId?: string; allEditable?: boolean; superGroups?: { superGroup: GammaSuperGroup; members: GammaGroupMember[] }[]; - orgId?: number; + orgId: number; }) => { const l = i18nService.getLocale(locale); @@ -148,24 +147,23 @@ const ExpensesTable = ({ status: status, statusText: RequestStatusText({ b: status, locale: locale }), receipts: expense.receipts, - groupId: expense.gammaGroupId + groupId: expense.gammaGroupId, + url: `/org/${orgId}/expenses/view?id=${expense.id}` } as ExpenseRow; }); - }, [superGroups, e, l.group.noGroup, l.group.unknownGroup, locale]); + }, [superGroups, e, l.group.noGroup, l.group.unknownGroup, locale, orgId]); const defaultColumns = useMemo( () => [ columnHelper.accessor('description', { header: l.general.description, - cell: (info) => ( - + /* - {info.getValue()} - - ) + >*/ + info.getValue() + /**/ }), columnHelper.accessor('group', { header: l.expense.group, @@ -247,8 +245,7 @@ const ExpensesTable = ({ locale, groups, treasurerPostId, - allEditable, - orgId + allEditable ] ); diff --git a/src/components/InvoicesTable/InvoicesTable.module.css b/src/components/InvoicesTable/InvoicesTable.module.css deleted file mode 100644 index e677f69..0000000 --- a/src/components/InvoicesTable/InvoicesTable.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.overlay::before { - border-bottom: 1px var(--global-color-border, currentColor) solid; -} diff --git a/src/components/InvoicesTable/InvoicesTable.tsx b/src/components/InvoicesTable/InvoicesTable.tsx index 954bf92..7209e76 100644 --- a/src/components/InvoicesTable/InvoicesTable.tsx +++ b/src/components/InvoicesTable/InvoicesTable.tsx @@ -13,7 +13,6 @@ import { Badge, Box, IconButton, - LinkOverlay, Separator, Text } from '@chakra-ui/react'; @@ -36,8 +35,6 @@ import { RequestStatus } from '@prisma/client'; import { PiChatFill, PiFileX, PiReceipt } from 'react-icons/pi'; import InvoiceService from '@/services/invoiceService'; import { EmptyState } from '../ui/empty-state'; -import Link from 'next/link'; -import styles from './InvoicesTable.module.css'; import i18nService from '@/services/i18nService'; import { GammaGroupMember, GammaSuperGroup, GammaUser } from '@/types/gamma'; import { @@ -72,18 +69,19 @@ interface InvoiceRow { status: InvoiceStatus; statusText: string; groupId?: string; + url: string; } const InvoicesTable = ({ e, locale, superGroups, - orgId = 1 + orgId }: { e: Invoice[]; locale: string; superGroups?: { superGroup: GammaSuperGroup; members: GammaGroupMember[] }[]; - orgId?: number; + orgId: number; }) => { const l = i18nService.getLocale(locale); @@ -120,23 +118,16 @@ const InvoicesTable = ({ total: InvoiceService.calculateSumForItems(invoice.items), status: status, statusText: RequestStatusText({ b: status, locale: locale }), - groupId: invoice.gammaGroupId + groupId: invoice.gammaGroupId, + url: `/org/${orgId}/invoices/view?id=${invoice.id}` } as InvoiceRow; }); - }, [e, l.group.noGroup, l.group.unknownGroup, locale, superGroups]); + }, [e, l.group.noGroup, l.group.unknownGroup, locale, orgId, superGroups]); const defaultColumns = [ columnHelper.accessor('description', { header: l.general.description, - cell: (info) => ( - - {info.getValue()} - - ) + cell: (info) => info.getValue() }), columnHelper.accessor('group', { header: l.expense.group, diff --git a/src/components/NameListTable/NameListTable.module.css b/src/components/NameListTable/NameListTable.module.css deleted file mode 100644 index e677f69..0000000 --- a/src/components/NameListTable/NameListTable.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.overlay::before { - border-bottom: 1px var(--global-color-border, currentColor) solid; -} diff --git a/src/components/NameListTable/NameListTable.tsx b/src/components/NameListTable/NameListTable.tsx index 7f0ab84..91b2c22 100644 --- a/src/components/NameListTable/NameListTable.tsx +++ b/src/components/NameListTable/NameListTable.tsx @@ -2,7 +2,7 @@ import { useRouter } from 'next/navigation'; import { useCallback, useMemo, useState } from 'react'; -import { IconButton, LinkOverlay } from '@chakra-ui/react'; +import { IconButton } from '@chakra-ui/react'; import { MenuContent, MenuItem, @@ -11,10 +11,8 @@ import { } from '@/components/ui/menu'; import { HiDotsHorizontal } from 'react-icons/hi'; import { PiUserList } from 'react-icons/pi'; -import Link from 'next/link'; import i18nService from '@/services/i18nService'; import { EmptyState } from '../ui/empty-state'; -import styles from './NameListTable.module.css'; import NameListService from '@/services/nameListService'; import { deleteNameList } from '@/actions/nameLists'; import { NameListType } from '@prisma/client'; @@ -49,18 +47,19 @@ interface NameListRow { tracked: string; peopleCount: number; type: NameListType; + url: string; } const NameListTable = ({ e, superGroups, locale, - orgId = 1 + orgId }: { e: NameList[]; superGroups?: { superGroup: GammaSuperGroup; members: GammaGroupMember[] }[]; locale: string; - orgId?: number; + orgId: number; }) => { const l = i18nService.getLocale(locale); @@ -91,23 +90,16 @@ const NameListTable = ({ person: `${list.user?.firstName} "${list.user?.nick}" ${list.user?.lastName}`, tracked: list.tracked ? 'Yes' : 'No', peopleCount: list.names.length + list.gammaNames.length, - type: ListTypeText({ type: list.type, locale }) + type: ListTypeText({ type: list.type, locale }), + url: `/org/${orgId}/name-lists/view?id=${list.id}` } as NameListRow) ); - }, [superGroups, e, l.group.noGroup, l.group.unknownGroup, locale]); + }, [superGroups, e, l.group.noGroup, l.group.unknownGroup, locale, orgId]); const defaultColumns = [ columnHelper.accessor('description', { header: l.general.description, - cell: (info) => ( - - {info.getValue()} - - ) + cell: (info) => info.getValue() }), columnHelper.accessor('group', { header: l.expense.group, diff --git a/src/components/ZettleSalesTable/ZettleSalesTable.module.css b/src/components/ZettleSalesTable/ZettleSalesTable.module.css deleted file mode 100644 index e677f69..0000000 --- a/src/components/ZettleSalesTable/ZettleSalesTable.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.overlay::before { - border-bottom: 1px var(--global-color-border, currentColor) solid; -} diff --git a/src/components/ZettleSalesTable/ZettleSalesTable.tsx b/src/components/ZettleSalesTable/ZettleSalesTable.tsx index e00205b..9e0a14c 100644 --- a/src/components/ZettleSalesTable/ZettleSalesTable.tsx +++ b/src/components/ZettleSalesTable/ZettleSalesTable.tsx @@ -2,7 +2,7 @@ import { useRouter } from 'next/navigation'; import { useCallback, useMemo, useState } from 'react'; -import { IconButton, LinkOverlay } from '@chakra-ui/react'; +import { IconButton } from '@chakra-ui/react'; import { MenuContent, MenuItem, @@ -12,10 +12,8 @@ import { } from '@/components/ui/menu'; import { HiDotsHorizontal } from 'react-icons/hi'; import { PiCoins } from 'react-icons/pi'; -import Link from 'next/link'; import i18nService from '@/services/i18nService'; import { EmptyState } from '../ui/empty-state'; -import styles from './ZettleSalesTable.module.css'; import ZettleSaleService from '@/services/zettleSaleService'; import { deleteZettleSale } from '@/actions/zettleSales'; import { GammaGroupMember, GammaSuperGroup, GammaUser } from '@/types/gamma'; @@ -46,18 +44,19 @@ interface SaleRow { date: Date; person: string; total: number; + url: string; } const ZettleSalesTable = ({ e, superGroups, locale, - orgId = 1 + orgId }: { e: ZettleSale[]; superGroups?: { superGroup: GammaSuperGroup; members: GammaGroupMember[] }[]; locale: string; - orgId?: number; + orgId: number; }) => { const l = i18nService.getLocale(locale); @@ -92,14 +91,7 @@ const ZettleSalesTable = ({ const defaultColumns = [ columnHelper.accessor('description', { header: l.general.description, - cell: (info) => ( - - {info.getValue()} - + cell: (info) => (info.getValue() ) }), columnHelper.accessor('group', { From e47e2b957d548ed456890203de506797a5f78d99 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Fri, 5 Dec 2025 17:19:40 +0100 Subject: [PATCH 07/35] Fetch expenses and invoices based on org --- src/app/[locale]/org/[orgId]/expenses/page.tsx | 2 +- src/app/[locale]/org/[orgId]/page.tsx | 4 ++-- src/services/expenseService.ts | 5 ++++- src/services/invoiceService.ts | 5 +++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/app/[locale]/org/[orgId]/expenses/page.tsx b/src/app/[locale]/org/[orgId]/expenses/page.tsx index 22de9df..81d40aa 100644 --- a/src/app/[locale]/org/[orgId]/expenses/page.tsx +++ b/src/app/[locale]/org/[orgId]/expenses/page.tsx @@ -24,7 +24,7 @@ export default async function Page(props: { const divisionTreasurer = await SessionService.isDivisionTreasurer(); const expenses = await GammaService.includeUserInfo( await (divisionTreasurer - ? ExpenseService.getAll() + ? ExpenseService.getAll(Number(orgId)) : SessionService.getExpenses()) ); diff --git a/src/app/[locale]/org/[orgId]/page.tsx b/src/app/[locale]/org/[orgId]/page.tsx index 71f85ba..88894db 100644 --- a/src/app/[locale]/org/[orgId]/page.tsx +++ b/src/app/[locale]/org/[orgId]/page.tsx @@ -38,10 +38,10 @@ export default async function Home(props: { const divisionTreasurer = await SessionService.isDivisionTreasurer(); const unpaid = await (divisionTreasurer - ? ExpenseService.getAll() + ? ExpenseService.getUnpaid(organization.id) : SessionService.getExpenses()); const unsent = await (divisionTreasurer - ? InvoiceService.getAll() + ? InvoiceService.getUnsent(organization.id) : SessionService.getInvoices()); const bankAccounts = divisionTreasurer diff --git a/src/services/expenseService.ts b/src/services/expenseService.ts index d9bcd60..81ac7d9 100644 --- a/src/services/expenseService.ts +++ b/src/services/expenseService.ts @@ -2,8 +2,11 @@ import prisma from '@/prisma'; import { ExpenseType, RequestStatus } from '@prisma/client'; export default class ExpenseService { - static async getAll() { + static async getAll(orgId: number) { return await prisma.expense.findMany({ + where: { + organizationId: orgId + }, include: { receipts: { include: { media: true } diff --git a/src/services/invoiceService.ts b/src/services/invoiceService.ts index 313fba3..1135912 100644 --- a/src/services/invoiceService.ts +++ b/src/services/invoiceService.ts @@ -19,11 +19,12 @@ export default class InvoiceService { }); } - static async getUnsent(gammaGroupId?: string) { + static async getUnsent(orgId: number, gammaGroupId?: string) { return await prisma.invoice.findMany({ where: { gammaGroupId, - sentAt: null + sentAt: null, + organizationId: orgId }, include: { items: true } }); From 8594753c542428073a094a97e0ebdc28c0141eb7 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Sun, 21 Dec 2025 14:39:41 +0100 Subject: [PATCH 08/35] Start adding org settings --- .../settings/OrganizationSettingsForm.tsx | 37 +++++++++++ .../[locale]/org/[orgId]/settings/page.tsx | 61 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/app/[locale]/org/[orgId]/settings/OrganizationSettingsForm.tsx create mode 100644 src/app/[locale]/org/[orgId]/settings/page.tsx diff --git a/src/app/[locale]/org/[orgId]/settings/OrganizationSettingsForm.tsx b/src/app/[locale]/org/[orgId]/settings/OrganizationSettingsForm.tsx new file mode 100644 index 0000000..7a10b80 --- /dev/null +++ b/src/app/[locale]/org/[orgId]/settings/OrganizationSettingsForm.tsx @@ -0,0 +1,37 @@ +"use client"; + +import { + Box, + Fieldset, + Input, + Heading, + createListCollection, + IconButton, + Text, + Table +} from '@chakra-ui/react'; +import { Field } from '@/components/ui/field'; +import { Button } from '@/components/ui/button'; +import i18nService from '@/services/i18nService'; +import OrgService from '@/services/orgService'; + +export default function OrganizationSettingsForm({ + locale, + organization +}: {locale: string, organization: NonNullable>>}) { + const l = i18nService.getLocale(locale); + + return
+ + + + + + + +
; +} diff --git a/src/app/[locale]/org/[orgId]/settings/page.tsx b/src/app/[locale]/org/[orgId]/settings/page.tsx new file mode 100644 index 0000000..0b1083a --- /dev/null +++ b/src/app/[locale]/org/[orgId]/settings/page.tsx @@ -0,0 +1,61 @@ +'use server'; + +import { Box, Flex, Heading, Text, VStack } from '@chakra-ui/react'; +import { + BreadcrumbCurrentLink, + BreadcrumbLink, + BreadcrumbRoot +} from '@/components/ui/breadcrumb'; +import Link from 'next/link'; +import i18nService from '@/services/i18nService'; +import SessionService from '@/services/sessionService'; +import { notFound } from 'next/navigation'; +import OrgService from '@/services/orgService'; +import { Button } from '@/components/ui/button'; +import { HiPlus } from 'react-icons/hi'; +import OrganizationSettingsForm from './OrganizationSettingsForm'; + +export default async function Page(props: { + params: Promise<{ locale: string, orgId: string }>; + +}) { + const divisionTreasurer = await SessionService.isDivisionTreasurer(); + if (!divisionTreasurer) { + notFound(); + } + + const { locale, orgId } = await props.params; + const l = i18nService.getLocale(locale); + + const organization = await OrgService.getById(Number(orgId)); + if (!organization) { + notFound(); + } + + return ( + <> + + + {l.home.title} + + {organization.name} + + + + + + + + Organization + + + Manage your organization settings + + + + + + + + ); +} From 991bc6acd9172fb6bfc7ad46db86f68e5b0b343e Mon Sep 17 00:00:00 2001 From: Goostaf Date: Sun, 21 Dec 2025 14:40:03 +0100 Subject: [PATCH 09/35] Update React and Next --- package.json | 16 +- pnpm-lock.yaml | 1975 ++++++++++++++++++++++++++++++++++++++---------- tsconfig.json | 5 +- 3 files changed, 1593 insertions(+), 403 deletions(-) diff --git a/package.json b/package.json index 5fd5f1f..551a4ca 100644 --- a/package.json +++ b/package.json @@ -15,30 +15,30 @@ "@react-pdf/renderer": "^4.2.1", "@tanstack/react-table": "^8.21.3", "dayjs": "^1.11.13", - "next": "15.3.0", + "next": "16.0.7", "next-auth": "^4.24.11", "next-i18n-router": "^5.5.1", "next-themes": "^0.4.4", "node-cache": "^5.1.2", "node-schedule": "^2.1.1", - "react": "19.1.0", - "react-dom": "19.1.0", + "react": "19.2.1", + "react-dom": "19.2.1", "react-icons": "^5.4.0" }, "devDependencies": { "@types/node": "^20", "@types/node-schedule": "^2.1.7", - "@types/react": "19.1.0", - "@types/react-dom": "19.1.0", + "@types/react": "19.2.7", + "@types/react-dom": "19.2.3", "eslint": "^8", - "eslint-config-next": "15.3.0", + "eslint-config-next": "16.0.7", "prisma": "6.6.0", "typescript": "^5" }, "pnpm": { "overrides": { - "@types/react": "19.1.0", - "@types/react-dom": "19.1.0" + "@types/react": "19.2.7", + "@types/react-dom": "19.2.3" } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc8d533..aaa157b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,8 +5,8 @@ settings: excludeLinksFromLockfile: false overrides: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.0 + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3 importers: @@ -14,34 +14,34 @@ importers: dependencies: '@chakra-ui/react': specifier: 3.26.0 - version: 3.26.0(@emotion/react@11.14.0(@types/react@19.1.0)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 3.26.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@emotion/react': specifier: ^11.14.0 - version: 11.14.0(@types/react@19.1.0)(react@19.1.0) + version: 11.14.0(@types/react@19.2.7)(react@19.2.1) '@prisma/client': specifier: 6.6.0 version: 6.6.0(prisma@6.6.0(typescript@5.6.2))(typescript@5.6.2) '@react-pdf/renderer': specifier: ^4.2.1 - version: 4.2.1(react@19.1.0) + version: 4.2.1(react@19.2.1) '@tanstack/react-table': specifier: ^8.21.3 - version: 8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 8.21.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) dayjs: specifier: ^1.11.13 version: 1.11.13 next: - specifier: 15.3.0 - version: 15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: 16.0.7 + version: 16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.24.11(next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-i18n-router: specifier: ^5.5.1 version: 5.5.1 next-themes: specifier: ^0.4.4 - version: 0.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -49,14 +49,14 @@ importers: specifier: ^2.1.1 version: 2.1.1 react: - specifier: 19.1.0 - version: 19.1.0 + specifier: 19.2.1 + version: 19.2.1 react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 19.2.1 + version: 19.2.1(react@19.2.1) react-icons: specifier: ^5.4.0 - version: 5.4.0(react@19.1.0) + version: 5.4.0(react@19.2.1) devDependencies: '@types/node': specifier: ^20 @@ -65,17 +65,17 @@ importers: specifier: ^2.1.7 version: 2.1.7 '@types/react': - specifier: 19.1.0 - version: 19.1.0 + specifier: 19.2.7 + version: 19.2.7 '@types/react-dom': - specifier: 19.1.0 - version: 19.1.0(@types/react@19.1.0) + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.7) eslint: specifier: ^8 version: 8.57.1 eslint-config-next: - specifier: 15.3.0 - version: 15.3.0(eslint@8.57.1)(typescript@5.6.2) + specifier: 16.0.7 + version: 16.0.7(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) prisma: specifier: 6.6.0 version: 6.6.0(typescript@5.6.2) @@ -95,27 +95,82 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.26.3': resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.26.3': resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/runtime@7.25.6': resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} @@ -124,14 +179,26 @@ packages: resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.4': resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + '@chakra-ui/react@3.26.0': resolution: {integrity: sha512-VuhFMLklzrjTWIst1B+uQggxOn9+GxVd+0LHLtsQKA+JtKUDqNfKymeWlb1/pKrmqH184+gwZJRjTtr6/+0cIQ==} peerDependencies: @@ -139,8 +206,8 @@ packages: react: '>=18' react-dom: '>=18' - '@emnapi/runtime@1.4.0': - resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -342,6 +409,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.11.1': resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -379,112 +452,139 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@img/sharp-darwin-arm64@0.34.1': - resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.1': - resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.1.0': - resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.1.0': - resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.1.0': - resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.1.0': - resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.1.0': - resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.1.0': - resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.1.0': - resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': - resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.1.0': - resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.1': - resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.1': - resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.34.1': - resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.1': - resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.1': - resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.1': - resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.1': - resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.34.1': - resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.1': - resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -495,10 +595,16 @@ packages: '@internationalized/number@3.6.4': resolution: {integrity: sha512-P+/h+RDaiX8EGt3shB9AYM1+QgkvHmJ5rKi4/59k4sg9g58k9rqsRW0WxRO7jCoHyvVbFRRFKmVTdFYdehrxHg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -513,56 +619,59 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@next/env@15.3.0': - resolution: {integrity: sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@next/env@16.0.7': + resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} - '@next/eslint-plugin-next@15.3.0': - resolution: {integrity: sha512-511UUcpWw5GWTyKfzW58U2F/bYJyjLE9e3SlnGK/zSXq7RqLlqFO8B9bitJjumLpj317fycC96KZ2RZsjGNfBw==} + '@next/eslint-plugin-next@16.0.7': + resolution: {integrity: sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==} - '@next/swc-darwin-arm64@15.3.0': - resolution: {integrity: sha512-PDQcByT0ZfF2q7QR9d+PNj3wlNN4K6Q8JoHMwFyk252gWo4gKt7BF8Y2+KBgDjTFBETXZ/TkBEUY7NIIY7A/Kw==} + '@next/swc-darwin-arm64@16.0.7': + resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.0': - resolution: {integrity: sha512-m+eO21yg80En8HJ5c49AOQpFDq+nP51nu88ZOMCorvw3g//8g1JSUsEiPSiFpJo1KCTQ+jm9H0hwXK49H/RmXg==} + '@next/swc-darwin-x64@16.0.7': + resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.0': - resolution: {integrity: sha512-H0Kk04ZNzb6Aq/G6e0un4B3HekPnyy6D+eUBYPJv9Abx8KDYgNMWzKt4Qhj57HXV3sTTjsfc1Trc1SxuhQB+Tg==} + '@next/swc-linux-arm64-gnu@16.0.7': + resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.0': - resolution: {integrity: sha512-k8GVkdMrh/+J9uIv/GpnHakzgDQhrprJ/FbGQvwWmstaeFG06nnAoZCJV+wO/bb603iKV1BXt4gHG+s2buJqZA==} + '@next/swc-linux-arm64-musl@16.0.7': + resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.0': - resolution: {integrity: sha512-ZMQ9yzDEts/vkpFLRAqfYO1wSpIJGlQNK9gZ09PgyjBJUmg8F/bb8fw2EXKgEaHbCc4gmqMpDfh+T07qUphp9A==} + '@next/swc-linux-x64-gnu@16.0.7': + resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.0': - resolution: {integrity: sha512-RFwq5VKYTw9TMr4T3e5HRP6T4RiAzfDJ6XsxH8j/ZeYq2aLsBqCkFzwMI0FmnSsLaUbOb46Uov0VvN3UciHX5A==} + '@next/swc-linux-x64-musl@16.0.7': + resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.0': - resolution: {integrity: sha512-a7kUbqa/k09xPjfCl0RSVAvEjAkYBYxUzSVAzk2ptXiNEL+4bDBo9wNC43G/osLA/EOGzG4CuNRFnQyIHfkRgQ==} + '@next/swc-win32-arm64-msvc@16.0.7': + resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.0': - resolution: {integrity: sha512-vHUQS4YVGJPmpjn7r5lEZuMhK5UQBNBRSB+iGDvJjaNk649pTIcRluDWNb9siunyLLiu/LDPHfvxBtNamyuLTw==} + '@next/swc-win32-x64-msvc@16.0.7': + resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -665,12 +774,6 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.10.4': - resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -697,69 +800,71 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/react-dom@19.1.0': - resolution: {integrity: sha512-21E2zejNNRtjG4hKIyJz4aWswGEcNFTgttA0bZIRGjj1HA/tbSUxIJnIcYbn98pwJck0cS1bsQhn6eaKqbcFWw==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': 19.2.7 - '@types/react@19.1.0': - resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} - '@typescript-eslint/eslint-plugin@8.7.0': - resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==} + '@typescript-eslint/eslint-plugin@8.48.1': + resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.48.1 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.7.0': - resolution: {integrity: sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==} + '@typescript-eslint/parser@8.48.1': + resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.48.1': + resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.7.0': - resolution: {integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==} + '@typescript-eslint/scope-manager@8.48.1': + resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.7.0': - resolution: {integrity: sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==} + '@typescript-eslint/tsconfig-utils@8.48.1': + resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.7.0': - resolution: {integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==} + '@typescript-eslint/type-utils@8.48.1': + resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.48.1': + resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.7.0': - resolution: {integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==} + '@typescript-eslint/typescript-estree@8.48.1': + resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.7.0': - resolution: {integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==} + '@typescript-eslint/utils@8.48.1': + resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.7.0': - resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==} + '@typescript-eslint/visitor-keys@8.48.1': + resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -1018,26 +1123,42 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} @@ -1046,6 +1167,10 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -1075,6 +1200,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.9.3: + resolution: {integrity: sha512-8QdH6czo+G7uBsNo0GiUfouPN1lRzKdJTGnKXwe12gkFbnnOUaUKGN55dMkfy+mnxmvjwl9zcI4VncczcVXDhA==} + hasBin: true + bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -1094,14 +1223,27 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1109,6 +1251,9 @@ packages: caniuse-lite@1.0.30001664: resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1130,16 +1275,15 @@ packages: color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -1162,6 +1306,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -1169,14 +1316,26 @@ packages: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -1212,8 +1371,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} dfa@1.2.0: @@ -1227,6 +1386,13 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.266: + resolution: {integrity: sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==} + emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -1244,10 +1410,18 @@ packages: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -1263,17 +1437,33 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + esbuild-register@3.6.0: resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: @@ -1284,14 +1474,18 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.3.0: - resolution: {integrity: sha512-+Z3M1W9MnJjX3W4vI9CHfKlEyhTWOUHvc5dB89FyRnzPsUkJlLWZOi8+1pInuVcSztSM4MwBFB0hIHf4Rbwu4g==} + eslint-config-next@16.0.7: + resolution: {integrity: sha512-WubFGLFHfk2KivkdRGfx6cGSFhaQqhERRfyO8BRx+qiGPGp7WLKcPvYC4mdx1z3VhVRcrfFzczjjTrbJZOpnEQ==} peerDependencies: - eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + eslint: '>=9.0.0' typescript: '>=3.3.1' peerDependenciesMeta: typescript: @@ -1334,8 +1528,29 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1350,9 +1565,9 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} - engines: {node: '>=10'} + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -1370,6 +1585,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1422,6 +1641,15 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1450,6 +1678,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1465,17 +1697,37 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -1499,6 +1751,10 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -1506,6 +1762,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1526,10 +1786,18 @@ packages: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -1538,6 +1806,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -1554,6 +1828,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -1573,6 +1851,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -1581,6 +1863,10 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -1594,10 +1880,18 @@ packages: is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + is-bun-module@1.2.1: resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} @@ -1609,14 +1903,26 @@ packages: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1624,6 +1930,10 @@ packages: is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -1644,6 +1954,10 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1656,6 +1970,10 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -1664,18 +1982,34 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} @@ -1686,6 +2020,10 @@ packages: is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} @@ -1733,6 +2071,11 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -1771,6 +2114,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1779,6 +2125,10 @@ packages: resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + media-engine@1.0.3: resolution: {integrity: sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==} @@ -1838,13 +2188,13 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.3.0: - resolution: {integrity: sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.0.7: + resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 + '@playwright/test': ^1.51.1 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 @@ -1863,6 +2213,9 @@ packages: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-schedule@2.1.1: resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} engines: {node: '>=6'} @@ -1885,6 +2238,10 @@ packages: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + object-is@1.1.6: resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} @@ -1897,6 +2254,10 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} @@ -1913,6 +2274,10 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + oidc-token-hash@5.0.3: resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} @@ -1927,6 +2292,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1977,10 +2346,17 @@ packages: picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -2036,10 +2412,10 @@ packages: queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + react-dom@19.2.1: + resolution: {integrity: sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==} peerDependencies: - react: ^19.1.0 + react: ^19.2.1 react-icons@5.4.0: resolution: {integrity: sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==} @@ -2049,10 +2425,14 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + react@19.2.1: + resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==} engines: {node: '>=0.10.0'} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} @@ -2064,6 +2444,10 @@ packages: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -2102,30 +2486,42 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + scheduler@0.25.0-rc-603e6108-20241029: resolution: {integrity: sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==} - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -2137,8 +2533,12 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - sharp@0.34.1: - resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -2149,10 +2549,26 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -2171,9 +2587,9 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} string.prototype.includes@2.0.0: resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} @@ -2185,12 +2601,17 @@ packages: string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -2248,15 +2669,19 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2276,18 +2701,41 @@ packages: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + typed-array-length@1.0.6: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.48.1: + resolution: {integrity: sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.6.2: resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} @@ -2296,6 +2744,10 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -2305,6 +2757,12 @@ packages: unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + update-browserslist-db@1.2.2: + resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} @@ -2325,10 +2783,18 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + which-builtin-type@1.1.4: resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} engines: {node: '>= 0.4'} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} @@ -2337,6 +2803,10 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2349,6 +2819,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -2363,9 +2836,18 @@ packages: yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} + snapshots: - '@ark-ui/react@5.22.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@ark-ui/react@5.22.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/date': 3.8.2 '@zag-js/accordion': 1.22.1 @@ -2408,7 +2890,7 @@ snapshots: '@zag-js/qr-code': 1.22.1 '@zag-js/radio-group': 1.22.1 '@zag-js/rating-group': 1.22.1 - '@zag-js/react': 1.22.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@zag-js/react': 1.22.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@zag-js/scroll-area': 1.22.1 '@zag-js/select': 1.22.1 '@zag-js/signature-pad': 1.22.1 @@ -2428,8 +2910,8 @@ snapshots: '@zag-js/tree-view': 1.22.1 '@zag-js/types': 1.22.1 '@zag-js/utils': 1.22.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) '@babel/code-frame@7.26.2': dependencies: @@ -2437,6 +2919,34 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.0 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.26.3': dependencies: '@babel/parser': 7.26.3 @@ -2445,6 +2955,24 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.26.4 @@ -2452,14 +2980,45 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + '@babel/parser@7.26.3': dependencies: '@babel/types': 7.26.3 + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 @@ -2470,6 +3029,12 @@ snapshots: '@babel/parser': 7.26.3 '@babel/types': 7.26.3 + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@babel/traverse@7.26.4': dependencies: '@babel/code-frame': 7.26.2 @@ -2482,26 +3047,43 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@chakra-ui/react@3.26.0(@emotion/react@11.14.0(@types/react@19.1.0)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@chakra-ui/react@3.26.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@ark-ui/react': 5.22.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@ark-ui/react': 5.22.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@19.1.0)(react@19.1.0) + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.1) '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.1) '@emotion/utils': 1.4.2 '@pandacss/is-valid-prop': 0.54.0 csstype: 3.1.3 fast-safe-stringify: 2.1.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@emnapi/runtime@1.4.0': + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true @@ -2538,19 +3120,19 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.1.0)(react@19.1.0)': + '@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.1)': dependencies: '@babel/runtime': 7.25.6 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.1) '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 - react: 19.1.0 + react: 19.2.1 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 19.2.7 transitivePeerDependencies: - supports-color @@ -2566,9 +3148,9 @@ snapshots: '@emotion/unitless@0.10.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.1.0)': + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.1)': dependencies: - react: 19.1.0 + react: 19.2.1 '@emotion/utils@1.4.2': {} @@ -2654,6 +3236,11 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.11.1': {} '@eslint/eslintrc@2.1.4': @@ -2699,82 +3286,101 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@img/sharp-darwin-arm64@0.34.1': + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.34.1': + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.1.0': + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.1.0': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.1.0': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.1.0': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linux-ppc64@1.1.0': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.1.0': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.1.0': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.1.0': + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true - '@img/sharp-linux-arm64@0.34.1': + '@img/sharp-linux-arm@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-arm@0.34.1': + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.34.1': + '@img/sharp-linux-riscv64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linux-x64@0.34.1': + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.1': + '@img/sharp-linux-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.1': + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true - '@img/sharp-wasm32@0.34.1': + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.4.0 + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-ia32@0.34.1': + '@img/sharp-win32-ia32@0.34.5': optional: true - '@img/sharp-win32-x64@0.34.1': + '@img/sharp-win32-x64@0.34.5': optional: true '@internationalized/date@3.8.2': @@ -2785,12 +3391,22 @@ snapshots: dependencies: '@swc/helpers': 0.5.15 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -2802,34 +3418,39 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@next/env@15.3.0': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@next/env@16.0.7': {} - '@next/eslint-plugin-next@15.3.0': + '@next/eslint-plugin-next@16.0.7': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.3.0': + '@next/swc-darwin-arm64@16.0.7': optional: true - '@next/swc-darwin-x64@15.3.0': + '@next/swc-darwin-x64@16.0.7': optional: true - '@next/swc-linux-arm64-gnu@15.3.0': + '@next/swc-linux-arm64-gnu@16.0.7': optional: true - '@next/swc-linux-arm64-musl@15.3.0': + '@next/swc-linux-arm64-musl@16.0.7': optional: true - '@next/swc-linux-x64-gnu@15.3.0': + '@next/swc-linux-x64-gnu@16.0.7': optional: true - '@next/swc-linux-x64-musl@15.3.0': + '@next/swc-linux-x64-musl@16.0.7': optional: true - '@next/swc-win32-arm64-msvc@15.3.0': + '@next/swc-win32-arm64-msvc@16.0.7': optional: true - '@next/swc-win32-x64-msvc@15.3.0': + '@next/swc-win32-x64-msvc@16.0.7': optional: true '@nodelib/fs.scandir@2.1.5': @@ -2931,10 +3552,10 @@ snapshots: '@react-pdf/primitives@4.1.0': {} - '@react-pdf/reconciler@1.1.3(react@19.1.0)': + '@react-pdf/reconciler@1.1.3(react@19.2.1)': dependencies: object-assign: 4.1.1 - react: 19.1.0 + react: 19.2.1 scheduler: 0.25.0-rc-603e6108-20241029 '@react-pdf/render@4.1.1': @@ -2950,21 +3571,21 @@ snapshots: parse-svg-path: 0.1.2 svg-arc-to-cubic-bezier: 3.2.0 - '@react-pdf/renderer@4.2.1(react@19.1.0)': + '@react-pdf/renderer@4.2.1(react@19.2.1)': dependencies: '@babel/runtime': 7.25.6 '@react-pdf/font': 3.0.2 '@react-pdf/layout': 4.2.2 '@react-pdf/pdfkit': 4.0.1 '@react-pdf/primitives': 4.1.0 - '@react-pdf/reconciler': 1.1.3(react@19.1.0) + '@react-pdf/reconciler': 1.1.3(react@19.2.1) '@react-pdf/render': 4.1.1 '@react-pdf/types': 2.7.1 events: 3.3.0 object-assign: 4.1.1 prop-types: 15.8.1 queue: 6.0.2 - react: 19.1.0 + react: 19.2.1 '@react-pdf/stylesheet@5.2.2': dependencies: @@ -2988,19 +3609,15 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.10.4': {} - - '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - '@tanstack/react-table@8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-table@8.21.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/table-core': 8.21.3 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) '@tanstack/table-core@8.21.3': {} @@ -3016,94 +3633,105 @@ snapshots: '@types/parse-json@4.0.2': {} - '@types/react-dom@19.1.0(@types/react@19.1.0)': + '@types/react-dom@19.2.3(@types/react@19.2.7)': dependencies: - '@types/react': 19.1.0 + '@types/react': 19.2.7 - '@types/react@19.1.0': + '@types/react@19.2.7': dependencies: - csstype: 3.1.3 + csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/type-utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.7.0 + '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/type-utils': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/utils': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.48.1 eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: + ts-api-utils: 2.1.0(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.7.0 + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.3.7 eslint: 8.57.1 - optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.7.0': + '@typescript-eslint/project-service@8.48.1(typescript@5.6.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.6.2) + '@typescript-eslint/types': 8.48.1 + debug: 4.3.7 + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.48.1': dependencies: - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/visitor-keys': 8.7.0 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 - '@typescript-eslint/type-utils@8.7.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) + typescript: 5.6.2 + + '@typescript-eslint/type-utils@8.48.1(eslint@8.57.1)(typescript@5.6.2)': + dependencies: + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.2) + '@typescript-eslint/utils': 8.48.1(eslint@8.57.1)(typescript@5.6.2) debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: + eslint: 8.57.1 + ts-api-utils: 2.1.0(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - - eslint - supports-color - '@typescript-eslint/types@8.7.0': {} + '@typescript-eslint/types@8.48.1': {} - '@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.48.1(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/visitor-keys': 8.7.0 + '@typescript-eslint/project-service': 8.48.1(typescript@5.6.2) + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.6.2) + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.3.7 - fast-glob: 3.3.2 - is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: + semver: 7.7.1 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.7.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/utils@8.48.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.2) eslint: 8.57.1 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/visitor-keys@8.7.0': + '@typescript-eslint/visitor-keys@8.48.1': dependencies: - '@typescript-eslint/types': 8.7.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.48.1 + eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.2.0': {} @@ -3436,14 +4064,14 @@ snapshots: '@zag-js/types': 1.22.1 '@zag-js/utils': 1.22.1 - '@zag-js/react@1.22.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@zag-js/react@1.22.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@zag-js/core': 1.22.1 '@zag-js/store': 1.22.1 '@zag-js/types': 1.22.1 '@zag-js/utils': 1.22.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) '@zag-js/rect-utils@1.22.1': {} @@ -3652,6 +4280,11 @@ snapshots: call-bind: 1.0.7 is-array-buffer: 3.0.4 + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + array-includes@3.1.8: dependencies: call-bind: 1.0.7 @@ -3661,6 +4294,17 @@ snapshots: get-intrinsic: 1.2.4 is-string: 1.0.7 + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 @@ -3670,14 +4314,15 @@ snapshots: es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - array.prototype.findlastindex@1.2.5: + array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.2: dependencies: @@ -3686,6 +4331,13 @@ snapshots: es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.0.2 + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 @@ -3693,6 +4345,13 @@ snapshots: es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.0.2 + array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.7 @@ -3712,6 +4371,16 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + ast-types-flow@0.0.8: {} available-typed-arrays@1.0.7: @@ -3734,6 +4403,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.9.3: {} + bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -3759,9 +4430,18 @@ snapshots: dependencies: pako: 1.0.11 - busboy@1.6.0: + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.3 + caniuse-lite: 1.0.30001759 + electron-to-chromium: 1.5.266 + node-releases: 2.0.27 + update-browserslist-db: 1.2.2(browserslist@4.28.1) + + call-bind-apply-helpers@1.0.2: dependencies: - streamsearch: 1.1.0 + es-errors: 1.3.0 + function-bind: 1.1.2 call-bind@1.0.7: dependencies: @@ -3771,10 +4451,24 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.0 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} caniuse-lite@1.0.30001664: {} + caniuse-lite@1.0.30001759: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -3795,16 +4489,12 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.2 - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true - concat-map@0.0.1: {} convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} + cookie@0.7.2: {} cosmiconfig@7.1.0: @@ -3829,6 +4519,8 @@ snapshots: csstype@3.1.3: {} + csstype@3.2.3: {} + damerau-levenshtein@1.0.8: {} data-view-buffer@1.0.1: @@ -3837,18 +4529,36 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dayjs@1.11.13: {} debug@3.2.7: @@ -3894,7 +4604,7 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - detect-libc@2.0.3: + detect-libc@2.1.2: optional: true dfa@1.2.0: {} @@ -3907,6 +4617,14 @@ snapshots: dependencies: esutils: 2.0.3 + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.266: {} + emoji-regex@10.4.0: {} emoji-regex@9.2.2: {} @@ -3960,7 +4678,7 @@ snapshots: safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 @@ -3969,10 +4687,69 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-get-iterator@1.1.3: @@ -4008,22 +4785,43 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + esbuild-register@3.6.0(esbuild@0.25.2): dependencies: debug: 4.3.7 @@ -4059,24 +4857,26 @@ snapshots: '@esbuild/win32-ia32': 0.25.2 '@esbuild/win32-x64': 0.25.2 + escalade@3.2.0: {} + escape-string-regexp@4.0.0: {} - eslint-config-next@15.3.0(eslint@8.57.1)(typescript@5.6.2): + eslint-config-next@16.0.7(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2): dependencies: - '@next/eslint-plugin-next': 15.3.0 - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.6.2) + '@next/eslint-plugin-next': 16.0.7 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.37.0(eslint@8.57.1) - eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) + eslint-plugin-react-hooks: 7.0.1(eslint@8.57.1) + globals: 16.4.0 + typescript-eslint: 8.48.1(eslint@8.57.1)(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: + - '@typescript-eslint/parser' - eslint-import-resolver-webpack - eslint-plugin-import-x - supports-color @@ -4089,60 +4889,71 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -4168,9 +4979,16 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.0 - eslint-plugin-react-hooks@5.1.0(eslint@8.57.1): + eslint-plugin-react-hooks@7.0.1(eslint@8.57.1): dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.26.3 eslint: 8.57.1 + hermes-parser: 0.25.1 + zod: 4.1.13 + zod-validation-error: 4.0.2(zod@4.1.13) + transitivePeerDependencies: + - supports-color eslint-plugin-react@7.37.0(eslint@8.57.1): dependencies: @@ -4201,6 +5019,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) @@ -4292,6 +5112,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -4331,6 +5155,10 @@ snapshots: dependencies: is-callable: 1.2.7 + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -4345,8 +5173,19 @@ snapshots: es-abstract: 1.23.3 functions-have-names: 1.2.3 + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + functions-have-names@1.2.3: {} + gensync@1.0.0-beta.2: {} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -4355,12 +5194,36 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -4388,6 +5251,8 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@16.4.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -4397,6 +5262,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -4411,8 +5278,14 @@ snapshots: has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -4421,6 +5294,12 @@ snapshots: dependencies: function-bind: 1.1.2 + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -4435,6 +5314,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -4455,6 +5336,12 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 @@ -4465,6 +5352,12 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} @@ -4477,14 +5370,23 @@ snapshots: dependencies: has-bigints: 1.0.2 + is-bigint@1.1.0: + dependencies: + has-bigints: 1.0.2 + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-bun-module@1.2.1: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} @@ -4492,20 +5394,39 @@ snapshots: dependencies: hasown: 2.0.2 + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 @@ -4522,6 +5443,11 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-path-inside@3.0.3: {} @@ -4531,24 +5457,50 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + is-url@1.2.4: {} is-weakmap@2.0.2: {} @@ -4557,6 +5509,10 @@ snapshots: dependencies: call-bind: 1.0.7 + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 @@ -4600,6 +5556,8 @@ snapshots: dependencies: minimist: 1.2.8 + json5@2.2.3: {} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 @@ -4641,12 +5599,18 @@ snapshots: dependencies: js-tokens: 4.0.0 + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lru-cache@6.0.0: dependencies: yallist: 4.0.0 luxon@3.5.0: {} + math-intrinsics@1.1.0: {} + media-engine@1.0.3: {} merge2@1.4.1: {} @@ -4674,19 +5638,19 @@ snapshots: negotiator@0.6.4: {} - next-auth@4.24.11(next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next-auth@4.24.11(next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@babel/runtime': 7.25.6 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) oauth: 0.9.15 openid-client: 5.7.0 preact: 10.24.1 preact-render-to-string: 5.2.6(preact@10.24.1) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) uuid: 8.3.2 next-i18n-router@5.5.1: @@ -4694,32 +5658,30 @@ snapshots: '@formatjs/intl-localematcher': 0.5.9 negotiator: 0.6.4 - next-themes@0.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next-themes@0.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 15.3.0 - '@swc/counter': 0.1.3 + '@next/env': 16.0.7 '@swc/helpers': 0.5.15 - busboy: 1.6.0 caniuse-lite: 1.0.30001664 postcss: 8.4.31 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(react@19.1.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.0 - '@next/swc-darwin-x64': 15.3.0 - '@next/swc-linux-arm64-gnu': 15.3.0 - '@next/swc-linux-arm64-musl': 15.3.0 - '@next/swc-linux-x64-gnu': 15.3.0 - '@next/swc-linux-x64-musl': 15.3.0 - '@next/swc-win32-arm64-msvc': 15.3.0 - '@next/swc-win32-x64-msvc': 15.3.0 - sharp: 0.34.1 + '@next/swc-darwin-arm64': 16.0.7 + '@next/swc-darwin-x64': 16.0.7 + '@next/swc-linux-arm64-gnu': 16.0.7 + '@next/swc-linux-arm64-musl': 16.0.7 + '@next/swc-linux-x64-gnu': 16.0.7 + '@next/swc-linux-x64-musl': 16.0.7 + '@next/swc-win32-arm64-msvc': 16.0.7 + '@next/swc-win32-x64-msvc': 16.0.7 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -4728,6 +5690,8 @@ snapshots: dependencies: clone: 2.1.2 + node-releases@2.0.27: {} + node-schedule@2.1.1: dependencies: cron-parser: 4.9.0 @@ -4746,6 +5710,8 @@ snapshots: object-inspect@1.13.2: {} + object-inspect@1.13.4: {} + object-is@1.1.6: dependencies: call-bind: 1.0.7 @@ -4760,6 +5726,15 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + object.entries@1.1.8: dependencies: call-bind: 1.0.7 @@ -4785,6 +5760,13 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + oidc-token-hash@5.0.3: {} once@1.4.0: @@ -4807,6 +5789,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -4846,8 +5834,12 @@ snapshots: picocolors@1.1.0: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} + picomatch@4.0.3: {} + possible-typed-array-names@1.0.0: {} postcss-value-parser@4.2.0: {} @@ -4899,18 +5891,29 @@ snapshots: dependencies: inherits: 2.0.4 - react-dom@19.1.0(react@19.1.0): + react-dom@19.2.1(react@19.2.1): dependencies: - react: 19.1.0 - scheduler: 0.26.0 + react: 19.2.1 + scheduler: 0.27.0 - react-icons@5.4.0(react@19.1.0): + react-icons@5.4.0(react@19.2.1): dependencies: - react: 19.1.0 + react: 19.2.1 react-is@16.13.1: {} - react@19.1.0: {} + react@19.2.1: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 reflect.getprototypeof@1.0.6: dependencies: @@ -4931,6 +5934,15 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -4968,23 +5980,42 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + scheduler@0.25.0-rc-603e6108-20241029: {} - scheduler@0.26.0: {} + scheduler@0.27.0: {} semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.1: {} - semver@7.7.1: + semver@7.7.3: optional: true set-function-length@1.2.2: @@ -5003,32 +6034,42 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - sharp@0.34.1: + set-proto@1.0.0: dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.7.1 + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.1 - '@img/sharp-darwin-x64': 0.34.1 - '@img/sharp-libvips-darwin-arm64': 1.1.0 - '@img/sharp-libvips-darwin-x64': 1.1.0 - '@img/sharp-libvips-linux-arm': 1.1.0 - '@img/sharp-libvips-linux-arm64': 1.1.0 - '@img/sharp-libvips-linux-ppc64': 1.1.0 - '@img/sharp-libvips-linux-s390x': 1.1.0 - '@img/sharp-libvips-linux-x64': 1.1.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - '@img/sharp-linux-arm': 0.34.1 - '@img/sharp-linux-arm64': 0.34.1 - '@img/sharp-linux-s390x': 0.34.1 - '@img/sharp-linux-x64': 0.34.1 - '@img/sharp-linuxmusl-arm64': 0.34.1 - '@img/sharp-linuxmusl-x64': 0.34.1 - '@img/sharp-wasm32': 0.34.1 - '@img/sharp-win32-ia32': 0.34.1 - '@img/sharp-win32-x64': 0.34.1 + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 optional: true shebang-command@2.0.0: @@ -5037,6 +6078,26 @@ snapshots: shebang-regex@3.0.0: {} + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -5044,6 +6105,14 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.2 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -5058,7 +6127,10 @@ snapshots: dependencies: internal-slot: 1.0.7 - streamsearch@1.1.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 string.prototype.includes@2.0.0: dependencies: @@ -5085,6 +6157,16 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.3 + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -5092,9 +6174,10 @@ snapshots: es-abstract: 1.23.3 es-object-atoms: 1.0.0 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -5116,10 +6199,12 @@ snapshots: strip-json-comments@3.1.1: {} - styled-jsx@5.1.6(react@19.1.0): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.1): dependencies: client-only: 0.0.1 - react: 19.1.0 + react: 19.2.1 + optionalDependencies: + '@babel/core': 7.28.5 stylis@4.2.0: {} @@ -5137,11 +6222,16 @@ snapshots: tiny-inflate@1.0.3: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - ts-api-utils@1.3.0(typescript@5.6.2): + ts-api-utils@2.1.0(typescript@5.6.2): dependencies: typescript: 5.6.2 @@ -5166,6 +6256,12 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.13 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -5174,6 +6270,14 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 @@ -5183,6 +6287,16 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 @@ -5192,6 +6306,26 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.6 + + typescript-eslint@8.48.1(eslint@8.57.1)(typescript@5.6.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.2) + '@typescript-eslint/utils': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + eslint: 8.57.1 + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + typescript@5.6.2: {} unbox-primitive@1.0.2: @@ -5201,6 +6335,13 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.0.2 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + undici-types@6.19.8: {} unicode-properties@1.4.1: @@ -5213,6 +6354,12 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 + update-browserslist-db@1.2.2(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + uqr@0.1.2: {} uri-js@4.4.1: @@ -5237,6 +6384,14 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + which-builtin-type@1.1.4: dependencies: function.prototype.name: 1.1.6 @@ -5252,6 +6407,22 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.15 + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.0.10 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + which-collection@1.0.2: dependencies: is-map: 2.0.3 @@ -5267,6 +6438,16 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -5275,6 +6456,8 @@ snapshots: wrappy@1.0.2: {} + yallist@3.1.1: {} + yallist@4.0.0: {} yaml@1.10.2: {} @@ -5282,3 +6465,9 @@ snapshots: yocto-queue@0.1.0: {} yoga-layout@3.2.1: {} + + zod-validation-error@4.0.2(zod@4.1.13): + dependencies: + zod: 4.1.13 + + zod@4.1.13: {} diff --git a/tsconfig.json b/tsconfig.json index f48e7ee..877b650 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -32,7 +32,8 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx", - ".next/types/**/*.ts" + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" ], "exclude": [ "node_modules" From d098e0d689fec3993a53c0a3eb5c2ccd1900dcd7 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Mon, 22 Dec 2025 22:41:29 +0100 Subject: [PATCH 10/35] Add organization selector --- src/app/[locale]/layout.tsx | 5 +- src/components/Header/Header.tsx | 62 +++---- src/components/Navigation/Navigation.tsx | 158 ++++++++++-------- .../Navigation/OrganizationSelector.tsx | 82 +++++++++ 4 files changed, 209 insertions(+), 98 deletions(-) create mode 100644 src/components/Navigation/OrganizationSelector.tsx diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index 1fed332..d68da47 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -39,7 +39,9 @@ export default async function RootLayout({ <>
{user ? ( - {children} + + {children} + ) : ( )} @@ -58,7 +60,6 @@ const LoggedIn = ({ bg="bg.panel" borderRightWidth="1px" borderColor="border.emphasized" - p="4" width="20rem" display={{ base: 'none', md: 'block' }} overflowY="auto" diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 1350b80..bba196a 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,20 +1,26 @@ import Navbar from './Navbar/Navbar'; import styles from './Header.module.css'; import Link from 'next/link'; -import { - Box, - Heading, - IconButton, - Span, - Drawer, - Portal, - Flex -} from '@chakra-ui/react'; +import { Box, Heading, IconButton, Span, Flex } from '@chakra-ui/react'; import { HiMenu, HiX } from 'react-icons/hi'; import Navigation from '../Navigation/Navigation'; import SessionService from '@/services/sessionService'; +import { + DrawerBackdrop, + DrawerBody, + DrawerCloseTrigger, + DrawerContent, + DrawerRoot, + DrawerTrigger +} from '../ui/drawer'; -const Header = async ({ locale, orgId = 1 }: { locale: string; orgId?: number }) => { +const Header = async ({ + locale, + orgId +}: { + locale: string; + orgId?: number; +}) => { const user = await SessionService.getUser(); return ( @@ -28,36 +34,32 @@ const Header = async ({ locale, orgId = 1 }: { locale: string; orgId?: number }) > {user && ( - - + + - - - - - - - - + + + + + + - - - - - - - - - + + + + + + + )} CashIT - beta v0.5.0 + beta v0.6.0 diff --git a/src/components/Navigation/Navigation.tsx b/src/components/Navigation/Navigation.tsx index 23d0547..dc62de0 100644 --- a/src/components/Navigation/Navigation.tsx +++ b/src/components/Navigation/Navigation.tsx @@ -11,86 +11,112 @@ import { PiGear } from 'react-icons/pi'; import SessionService from '@/services/sessionService'; +import OrganizationSelector from './OrganizationSelector'; +import OrgService from '@/services/orgService'; -const Navigation = async ({ locale, orgId = 1 }: { locale: string; orgId?: number }) => { +const Navigation = async ({ + locale, + orgId = 1, + inDrawer = false +}: { + locale: string; + orgId?: number; + inDrawer?: boolean; +}) => { const l = i18nService.getLocale(locale); const divisionTreasurer = await SessionService.isDivisionTreasurer(); + const organizations = await OrgService.getAll(); return ( - - - - - {' '} - {l.home.title} - - - - - {l.categories.accounting} - - - - - - - {' '} - {l.categories.expenses} - - - - - {' '} - {l.categories.invoices} - - - - - {' '} - {l.home.zettleSales} - - - - - {' '} - {l.categories.nameLists} - + + + + + + {' '} + {l.home.title} + - - - {l.categories.tools} - - + + + {l.categories.accounting} + + - {divisionTreasurer && ( - + - + {' '} - {l.bankAccounts.title} + {l.categories.expenses} + + + + + {' '} + {l.categories.invoices} + + + + + {' '} + {l.home.zettleSales} + + + + + {' '} + {l.categories.nameLists} - )} - - - - {' '} - {l.categories.receiptCreator} - - {divisionTreasurer && ( - <> - - - Admin - - - + + + {l.categories.tools} + + + + {divisionTreasurer && ( + - + {' '} - Organizations + {l.bankAccounts.title} - + )} + + + + {' '} + {l.categories.receiptCreator} + + + {divisionTreasurer && ( + <> + + + Admin + + + + + + {' '} + Organizations + + + )} + + {orgId !== undefined && ( + )} ); diff --git a/src/components/Navigation/OrganizationSelector.tsx b/src/components/Navigation/OrganizationSelector.tsx new file mode 100644 index 0000000..b6f9e4a --- /dev/null +++ b/src/components/Navigation/OrganizationSelector.tsx @@ -0,0 +1,82 @@ +'use client'; + +import { createListCollection, Select } from '@chakra-ui/react'; +import i18nService from '@/services/i18nService'; +import { + SelectRoot, + SelectContent, + SelectItem, + SelectLabel, + SelectValueText +} from '../ui/select'; +import { useRouter } from 'next/navigation'; + +const OrganizationSelector = ({ + locale, + orgs, + orgId, + inDrawer = false +}: { + locale: string; + orgs: { id: number; name: string }[]; + orgId?: number; + inDrawer?: boolean; +}) => { + const router = useRouter(); + + const l = i18nService.getLocale(locale); + + const frameworks = createListCollection({ + items: orgs.map((org) => ({ label: org.name, value: org.id.toString() })) + }); + + return ( + { + if (value?.[0] !== undefined) router.push(`/org/${value[0]}`); + }} + > + + + + + + + + {frameworks.items.map((item) => ( + + {item.label} + + ))} + + + ); +}; + +export default OrganizationSelector; From 738e6772f402bfd31e7254be577957163e401551 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Mon, 22 Dec 2025 22:57:42 +0100 Subject: [PATCH 11/35] Revert to Next 15 Rolls back regression due to `Link` failing to get passed as a prop in Next 16 --- package.json | 6 +- pnpm-lock.yaml | 2578 ++++++----------- .../admin/organizations/create/page.tsx | 2 +- tsconfig.json | 2 +- 4 files changed, 839 insertions(+), 1749 deletions(-) diff --git a/package.json b/package.json index 551a4ca..38ac6e7 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,13 @@ "lint": "next lint" }, "dependencies": { - "@chakra-ui/react": "3.26.0", + "@chakra-ui/react": "3.30.0", "@emotion/react": "^11.14.0", "@prisma/client": "6.6.0", "@react-pdf/renderer": "^4.2.1", "@tanstack/react-table": "^8.21.3", "dayjs": "^1.11.13", - "next": "16.0.7", + "next": "15.5.9", "next-auth": "^4.24.11", "next-i18n-router": "^5.5.1", "next-themes": "^0.4.4", @@ -31,7 +31,7 @@ "@types/react": "19.2.7", "@types/react-dom": "19.2.3", "eslint": "^8", - "eslint-config-next": "16.0.7", + "eslint-config-next": "15.5.9", "prisma": "6.6.0", "typescript": "^5" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aaa157b..4c59a5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,8 +13,8 @@ importers: .: dependencies: '@chakra-ui/react': - specifier: 3.26.0 - version: 3.26.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 3.30.0 + version: 3.30.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@emotion/react': specifier: ^11.14.0 version: 11.14.0(@types/react@19.2.7)(react@19.2.1) @@ -31,11 +31,11 @@ importers: specifier: ^1.11.13 version: 1.11.13 next: - specifier: 16.0.7 - version: 16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 15.5.9 + version: 15.5.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 4.24.11(next@15.5.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-i18n-router: specifier: ^5.5.1 version: 5.5.1 @@ -74,8 +74,8 @@ importers: specifier: ^8 version: 8.57.1 eslint-config-next: - specifier: 16.0.7 - version: 16.0.7(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + specifier: 15.5.9 + version: 15.5.9(eslint@8.57.1)(typescript@5.6.2) prisma: specifier: 6.6.0 version: 6.6.0(typescript@5.6.2) @@ -85,8 +85,8 @@ importers: packages: - '@ark-ui/react@5.22.0': - resolution: {integrity: sha512-cH3xVhKRn0ZsP2Jg2RZAziI38obIfTMC3Q6ZWtWeYL5k9fq6K8sa1XjdJclBRSD0vYYvR1ynHG9ThicWKKANtQ==} + '@ark-ui/react@5.30.0': + resolution: {integrity: sha512-MIWgj6uWTuG42DGaXUQARObvuQJymm+/1wsdGEDrIHtSv0a2PFQO4svwMvMFwfFbL1jVkJzzBU6JDAH0xKbvyw==} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' @@ -95,82 +95,27 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.5': - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.26.3': resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/runtime@7.25.6': resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} @@ -179,28 +124,16 @@ packages: resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} - engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} - engines: {node: '>=6.9.0'} - - '@chakra-ui/react@3.26.0': - resolution: {integrity: sha512-VuhFMLklzrjTWIst1B+uQggxOn9+GxVd+0LHLtsQKA+JtKUDqNfKymeWlb1/pKrmqH184+gwZJRjTtr6/+0cIQ==} + '@chakra-ui/react@3.30.0': + resolution: {integrity: sha512-eIRRAilqY4f2zN8GWRnjcciBYsvy3GZDOmzGD9xk596LBxCTNCJaivdBiHCcgNlqA3y1wMyM1jepy2b2vQC4QA==} peerDependencies: '@emotion/react': '>=11' react: '>=18' @@ -218,8 +151,8 @@ packages: '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - '@emotion/is-prop-valid@1.3.1': - resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} @@ -589,22 +522,16 @@ packages: cpu: [x64] os: [win32] - '@internationalized/date@3.8.2': - resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} + '@internationalized/date@3.10.0': + resolution: {integrity: sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==} - '@internationalized/number@3.6.4': - resolution: {integrity: sha512-P+/h+RDaiX8EGt3shB9AYM1+QgkvHmJ5rKi4/59k4sg9g58k9rqsRW0WxRO7jCoHyvVbFRRFKmVTdFYdehrxHg==} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@internationalized/number@3.6.5': + resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -619,59 +546,56 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@next/env@15.5.9': + resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} - '@next/env@16.0.7': - resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} + '@next/eslint-plugin-next@15.5.9': + resolution: {integrity: sha512-kUzXx0iFiXw27cQAViE1yKWnz/nF8JzRmwgMRTMh8qMY90crNsdXJRh2e+R0vBpFR3kk1yvAR7wev7+fCCb79Q==} - '@next/eslint-plugin-next@16.0.7': - resolution: {integrity: sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==} - - '@next/swc-darwin-arm64@16.0.7': - resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.0.7': - resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==} + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.0.7': - resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==} + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.7': - resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.7': - resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.7': - resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.0.7': - resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.7': - resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==} + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -692,8 +616,8 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@pandacss/is-valid-prop@0.54.0': - resolution: {integrity: sha512-UhRgg1k9VKRCBAHl+XUK3lvN0k9bYifzYGZOqajDid4L1DyU813A1L0ZwN4iV9WX5TX3PfUugqtgG9LnIeFGBQ==} + '@pandacss/is-valid-prop@1.7.1': + resolution: {integrity: sha512-U95nBIhlj6X26W4U0wEbYcgL0A33zqt7bnfjYQ2+RUGfOK17yKx92OHE/ersiRhMWyuSU0Qhj+5CHlCY2126lQ==} '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -774,6 +698,9 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@rushstack/eslint-patch@1.15.0': + resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -870,224 +797,231 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@zag-js/accordion@1.22.1': - resolution: {integrity: sha512-P3jsauxnAGKBhuqs9gdivjEiSu7N7KnKRlgWlIpyti35askz8swHsqxsfkc2ASs9tcPKnPvuZDHIxXmJmZSLuQ==} + '@zag-js/accordion@1.31.1': + resolution: {integrity: sha512-3sGi4EZpGBz/O1IVkk9dzzWzP5vVVOj4Li6C+jHOnrgaWPouA/mBTP5L9HEL8qtFsECFZwpNo486eqiCmeHoGw==} - '@zag-js/anatomy@1.22.1': - resolution: {integrity: sha512-I5OvOuJBt6hEqbpqVkWCOEoDfGMnKuLx+S0h7Un5SyAwnif3F1dSqDYujU28bCy8FtKs36vsq/izxufXyiXSEg==} + '@zag-js/anatomy@1.31.1': + resolution: {integrity: sha512-BhIhf3Q0tRA0Jugd7AJfUBzeAb/iATBsw7KyYThMGcPWmrWssL7KWr5AB6RufzGKU7+DCb1QEhlqd4NSOJaYxQ==} - '@zag-js/angle-slider@1.22.1': - resolution: {integrity: sha512-Nitjwwo2NVUEK+PabDnOfqizErnFIZZKThtcpQikAhE1J4MX3H128MANu1hJXNkvVYXyZmhTvzjt6XZc2j7YyQ==} + '@zag-js/angle-slider@1.31.1': + resolution: {integrity: sha512-SfWrgnM0zMLX82rsIJOqWk430UnPA17UFGcDqMDRwXy1Wx4yptmx0aFAsSXnRnw4Ee7WaulF2RWBli6O6iYRCA==} - '@zag-js/aria-hidden@1.22.1': - resolution: {integrity: sha512-vPfAE35BfYPS1UbYRcNw8/kMl7uayE7LyRncK/gPMnoQMjmEKW0nXmD5WlCHFLdGX9WFGYTIde8k4U8ay+oqcg==} + '@zag-js/aria-hidden@1.31.1': + resolution: {integrity: sha512-SoNt4S2LkHNWPglQczWN0E5vAV15MT1GoK9MksZzbkMhl+pkDTdLytpXsQ1IgalC1YUng0XNps/Wt6P3uDuzTA==} - '@zag-js/async-list@1.22.1': - resolution: {integrity: sha512-/evBfhDW3Rj3An5fHW8SYINM/pkxeOe/Uk7rRlBreHVn2PdAay4sj1gax4hlUUFEbqyvBgbHpR/atwfdxSuWYQ==} + '@zag-js/async-list@1.31.1': + resolution: {integrity: sha512-BDZEmr4KKh3JASgkXouOwoTWRS1UPE3gdZYZ7Sk7SJ1i8+Pk6zUQ4FnxaoF/cSAdCXyjSSr92Kns2bTk/QuNkQ==} - '@zag-js/auto-resize@1.22.1': - resolution: {integrity: sha512-O+tKmqwLko74DCmwdouxBZqEtIQB6Rt2pyXdlyBXLB7UnYXEIvEUzf8XK39I5AHXp6NlLqx77GtLn1qiBtKrkQ==} + '@zag-js/auto-resize@1.31.1': + resolution: {integrity: sha512-qzWHibjBekSmFweG+EWY8g0lRzKtok7o9XtQ+JFlOu3s6x4D02z2YDzjDdfSLmS7j0NxISnwQkinWiDAZEYHog==} - '@zag-js/avatar@1.22.1': - resolution: {integrity: sha512-SAz9XaFD8jg4LODkS51s6KrNcYF/PvAcRkCE9TDiuiCeFdgB6+JFKBNk0iM9og8Tk4Doe/3qIA/I12qKNW9pAw==} + '@zag-js/avatar@1.31.1': + resolution: {integrity: sha512-Grosi2hRn4wfDYlPd8l+d4GCIFMsoj6ZFqii+1k14AqTDiCUJ/J0jCvOrRHkvkpEqektjuSD7e/GCX+yawqkuQ==} - '@zag-js/carousel@1.22.1': - resolution: {integrity: sha512-bFbCRe5xarBtD3NnozHmCmrGJ+nLRhqLQFq+RG13fl1hlhUJaJ5AsS7e8L1r2ZLdbVVrsB0lUuW/ocfJ/G4MSw==} + '@zag-js/bottom-sheet@1.31.1': + resolution: {integrity: sha512-ZBbIpYyZX2zQeqW36aODVi9/I4J3zS1XmIHUjeXmfmf6TlQUA1ydgYl7ipREfmCzNWX2LEA5ZnPJQw0UBcrB8w==} - '@zag-js/checkbox@1.22.1': - resolution: {integrity: sha512-A/cZb89Aeb2k/KGl3ITS2fuLBXwq6Rnq9aFirfKs/UHrY16fopRbRjfqOxF6wm8lWoFk3gqmRGgybo8qsIfxog==} + '@zag-js/carousel@1.31.1': + resolution: {integrity: sha512-228Ol86G/lg8crcomy5cALkUYdOHCHcvJnSOQzeUj80JNjlELzrjBpaAj4lx8dZocfwou2Sg4NyZJ+mISSc+Dg==} - '@zag-js/clipboard@1.22.1': - resolution: {integrity: sha512-rKTPRKvLtcJ1c/CDvnWDRpqAteFS20UQe+mQpO83ACMCRZAfkXP3UOzBL53mh59+LIVlDxgZbMlwRiNiqqKhmA==} + '@zag-js/checkbox@1.31.1': + resolution: {integrity: sha512-oLS8bqhimckLl6coCNmKPPUmB8wIbVhtkpLwLPLgz4vhhUe7gnpB5dea14Ow2JTBnmug8bMh/bJDtuPa9qQuTw==} - '@zag-js/collapsible@1.22.1': - resolution: {integrity: sha512-vKfDe/fzm3ndDfaueqW/XgGaWCHVD8MuLFtRRyv3jX3ubdNYn5R/j7ftQURdYyqRlPI3Si50FWSAtOqtvs4y9Q==} + '@zag-js/clipboard@1.31.1': + resolution: {integrity: sha512-pv/gOmD9DMg+YmSMjahyd5oSp7/v9K0uQ3att6fPeaNMjB42b3tnY1S1GNVy5Ltf/qHDab6WVwlEN+1zKHXaYw==} - '@zag-js/collection@1.22.1': - resolution: {integrity: sha512-jjeSKALTH3iK2vTI6uAh2NCtS9n+e2r1cGERKCfNkbt86U6VSp9xiXqalUsEI4ovNIPcgg0+/nzixoVwFO1Vgg==} + '@zag-js/collapsible@1.31.1': + resolution: {integrity: sha512-eCC5G6bBZUwF8z2XULQXUNRxqte9I2Sv+WJ2brycPn1a68uYD76RzFBmLQ2er95VbshUdeo8nRuX8MooAFuYzg==} - '@zag-js/color-picker@1.22.1': - resolution: {integrity: sha512-vUx8Ef0CZ/VPARIPh2ur76HH1AL3FVObNgtX64kPNUDUI+Z/L/q6CBfIeGcElVQ/Y6QowrqAXjVyPGArmmohmw==} + '@zag-js/collection@1.31.1': + resolution: {integrity: sha512-ecpfyfCj8Y0/GUPuHYsLxexIrx10VuR3Wd0H+lamcki3lYgQxZrpLRFMwgTqmI/m7t3zhm5QeEvMUJ1H14YMLA==} - '@zag-js/color-utils@1.22.1': - resolution: {integrity: sha512-Bee1KvYOV0yWQbODN+O2zPmdUaH+rymEmIHLfKNipPo5GVmxWqAe8oTQDyquzsUtoPE5MFgW5avg8tgSlCFcBA==} + '@zag-js/color-picker@1.31.1': + resolution: {integrity: sha512-AWNZth49iEDxqh1DBZNSKpfEM/FF+MjL5bgUHVctnHdkpFsZLynJorWQQ4hNXNDFEc/I5w10KSxVCcO6tsPGFw==} - '@zag-js/combobox@1.22.1': - resolution: {integrity: sha512-N4tGTmezfHGaKB0+aDB5yMuVzBv2ShgsAx1uizom6ElcvlYD2rsQTr3xLc4wyOR7fx0z6fFDo1+63/Dt3y0t4A==} + '@zag-js/color-utils@1.31.1': + resolution: {integrity: sha512-HdjTRU8C0tO6hK+PBVlu8iQH1MJaAnJAEdq2FcD97mq0PiPhrSj6iOftnrvPsE4CRieVFjnJWOvaubWFc4VmHA==} - '@zag-js/core@1.22.1': - resolution: {integrity: sha512-4BNrwO9Tadq2Z0d2xSSQs4O/o3OarEHzXM2FQqx46vrwSE57qUghnZex429ZQ51fuk8AL5Lowt26a9JxE9sVPg==} + '@zag-js/combobox@1.31.1': + resolution: {integrity: sha512-IT0getSAGzngdRL20iX/iAh2d7DzVoMDDppOsOFBG2owKAgLpj8uLvUhy+lcrm6N8yxYOya89D6Aef7V5KdwlQ==} - '@zag-js/date-picker@1.22.1': - resolution: {integrity: sha512-ja482LloO7AGfFYXTfGV+qV484QWUM1cnF3hWtROd4Vdx/NONwn0w7TEJH+XbO3HaoUC5XpeacWLFQugGCsRjg==} + '@zag-js/core@1.31.1': + resolution: {integrity: sha512-RaMJeqtjxG6k7iFD3WQnlyFJVT3yfQN+pJygAHH37GsMtiNzQQJOoesjb0LV9T27jwMXeNUzrh3MSDr1/0yVcQ==} + + '@zag-js/date-picker@1.31.1': + resolution: {integrity: sha512-AOWN/IskGidVQt5g+uE9cILqJBTclE6OG1GC9WSWuyP/y4F+PdP/781SgYpYCZg/6pMGbL01PFKKb7xOOCeZAg==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/date-utils@1.22.1': - resolution: {integrity: sha512-OWIWxihfFFyQDEaA35a/Fdfp3+GyGUgTUbutMD3BrbnPjKNLm0RyvAgZiq0zPTY7CzpYRbZ2J98GDU+CTERCjA==} + '@zag-js/date-utils@1.31.1': + resolution: {integrity: sha512-+Aq9g/rqLeiRmnazgdZMc59gAxqxbw3GGy8AngrtNipgRtMhPlzGa3S4Qsq1yau6OKaHZ13uckUS+MhLNbBY+Q==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/dialog@1.22.1': - resolution: {integrity: sha512-b5KwMPYKc9RenZwxrAAHu6aHPz7tqPy4Mxa/YR5zo1pXBV4amA7u2xnqyncRaK65Z7y5QKmpmDuBp+0PnXxNIA==} + '@zag-js/dialog@1.31.1': + resolution: {integrity: sha512-iaWlYQ6TYoVjM/X5+UZVZzKiMboE50GnEzGUpbhbeRNRiLqSu5dODSFzior1G4kde/ns5eN+BTf/Tm6AT4N2og==} + + '@zag-js/dismissable@1.31.1': + resolution: {integrity: sha512-jCdJwQmEkG6PlrN13fUk2l7ZclSu54FZwmT4xOtQpEbaiAiESm5KI5oyFh5jDPY47Goa28UJkEjWXVgKXKWb0g==} - '@zag-js/dismissable@1.22.1': - resolution: {integrity: sha512-0DzbykJu9QoXYw4Zcjte69Mtk6ThNRCXWxxCKBf930V8Bw3Ha7vfY5bgdb4RFT5K+BQP3E8vLT+PzIaDINn2Xw==} + '@zag-js/dom-query@1.31.1': + resolution: {integrity: sha512-2tCZLwSfoXm62gwl0neiAN6u5VnzUhy5wHtKbX+klqGFatnca3Bm++H9+4PHMrwUWRbPg3H5N151lKFEOQhBfQ==} - '@zag-js/dom-query@1.22.1': - resolution: {integrity: sha512-mtvGj2z3rkl40mkjd+QwoOHvxqpiOkY4mtVjzNzgzcbVtUN63Mz7giW8OZB+KLy37hwFX0B8JfiQncU8IOHNpw==} + '@zag-js/editable@1.31.1': + resolution: {integrity: sha512-JMICHw4/x0YqDy/n+I+TeaXlFbTA0j9w3UqOWMwUFQ+dAsq4JLXeqZDXu19MQN6yaTFdOpG1EFw4FEVTsu+d3Q==} - '@zag-js/editable@1.22.1': - resolution: {integrity: sha512-NY7VeKYuNLQzi+yZYmWliif0Qd/2PTKtDeqtnVypv8XSHqTbVeS2N9dqTru1g4RP+eGQWx0za12hjmCVU4DuMQ==} + '@zag-js/file-upload@1.31.1': + resolution: {integrity: sha512-cp7qMiXKrIcTfDamOz9wlnJLeBF8gucTI7Y+iKaP+hiIW+OG254GElfQiqXNDad3HUmD+Dt8Tx6uAzL/mw3sbQ==} - '@zag-js/file-upload@1.22.1': - resolution: {integrity: sha512-4iKpqxVLafLbQejcPoZcygtNURsezIlWRigHvVPd2pLsXPa8erbdcEZ8X4QvGp77xcW2QTkuSxB+BSCrEEAotA==} + '@zag-js/file-utils@1.31.1': + resolution: {integrity: sha512-MDDz52IdPh/mPUYrqUXvh7qDckJHs+mt5gjfx0N89qh2JNXuRU14zPotOKTzIKM4o+HFZkAT6BAfMpr9CX/0ug==} - '@zag-js/file-utils@1.22.1': - resolution: {integrity: sha512-cZAJ5MAZCe7IfHfN+3xSNb9e6mA812U8BPJr/jNPN+qLQh/PkQDwKaGM33o2Me50r18iGTAswEkETnaFZt3wkw==} + '@zag-js/floating-panel@1.31.1': + resolution: {integrity: sha512-Pjgd/wjdglZ90dtq/LC4o5sc6w0m+RehhPmJcIzq9T+E/Xrb6qrhf06QhxB9LwSj4DG/gIv87gmD2qF1VH7cRQ==} - '@zag-js/floating-panel@1.22.1': - resolution: {integrity: sha512-YGjLoYt2xSk4pkTgsR0z/7U7V5OdaicSOZa0HDtskH4MkKPxQxrgf2G4e8dNsw8hnQwfVuoc0RGPGW0BArVr6A==} + '@zag-js/focus-trap@1.31.1': + resolution: {integrity: sha512-omgUhAz1r81pYAujqYIIavdTKJzDRExioSiqhnx/xq10a6Q/xavMFflq8w7edMc9JHkTOnr9E5qh9abCVJjhpQ==} - '@zag-js/focus-trap@1.22.1': - resolution: {integrity: sha512-6W9cG0LEVICt0srVfWSpamKzsnRxXMdl3gV+GQ5HvkCCk1Sw6Io4tc3QvSSvaWcfyhM07feerOsa2ah7qiT/ig==} + '@zag-js/focus-visible@1.31.1': + resolution: {integrity: sha512-GC59A3yd7tj8aKhzvhrM+CEZZraXm5y/SpfIjz1J7kGV6eeXbUtjkbe75g99Ve8iJYfQVQlAj2GyN3oniHc5Zw==} - '@zag-js/focus-visible@1.22.1': - resolution: {integrity: sha512-TuBEux3UTivo9VXPPe79q9JfTwaP/uIshL1KPifg51ofGYesWjMGeE5S5MAuaSzUmH9+3CpnwP7h7f65s3D0kw==} + '@zag-js/highlight-word@1.31.1': + resolution: {integrity: sha512-nQw7t8LgWXW+6Z5E/p6T+OST0DDXp35mrFCzrkJL54aVTZ3GuLyIP2p0/HGQr2hE/KKLbZEs5i6UcXF84tiI4g==} - '@zag-js/highlight-word@1.22.1': - resolution: {integrity: sha512-mcPg4/ED3MNDzj5b3t4EEIKkvdyvVUJ9pqbyRUoj76KI+ZWXXJIw5PNAkG5vUVVUXKKjfzPVninIqWv1Bh9Bvg==} + '@zag-js/hover-card@1.31.1': + resolution: {integrity: sha512-R74kz2wPgGwB3jKQeD91kdtlvVKpffWBJHqw8yCBd95GXGVmhym+BPoCToJzcqiemP8+0EtSuVPU9IHaSuJnSg==} - '@zag-js/hover-card@1.22.1': - resolution: {integrity: sha512-sGcWASPrt0f8oOpBdyDyka0Mkya4TdlBEOvB9qOvnkcIX2bc6YFUtWQN1L1M/K6nv8D0wSZK0p18JBaqGlHmBQ==} + '@zag-js/i18n-utils@1.31.1': + resolution: {integrity: sha512-SARkFuo1+Q0WcNv4jqvxp5hjCOqu/gBa7p6BTh7v5Bo00QhKRM/bCvVt0EB6V+h2oejrZfkwZ0MwbpQiL6L2aQ==} - '@zag-js/i18n-utils@1.22.1': - resolution: {integrity: sha512-45KUYB9tu1br6NmgtaNW9NviozYCYUxJ8aZTI/Y6vKotXK/Pn3bIlaiOaq4Zel7TalGYT8gVnwgPe2E6H5sqTg==} + '@zag-js/image-cropper@1.31.1': + resolution: {integrity: sha512-hFuy4I3jIJ/iyJsnfbLX1l/cJtN42j7lwhw8TeWVX8Y+hHxFPMSKx7AQirt/hALUbyy7QsQgAd5IslpsYq1Nlg==} - '@zag-js/interact-outside@1.22.1': - resolution: {integrity: sha512-+iZ3xHC9+jVo2FCC4B9c9ntcXv19shVOqQGDr2cD30Hwmwtm9kCOdVydMqv3Lp3UhR8a105MXEVUAKg53WbCoA==} + '@zag-js/interact-outside@1.31.1': + resolution: {integrity: sha512-oxBAlBqcatlxGUmhwUCRYTADIBrVoyxM1YrFzR1R8jhvVR/QCaxoLAyKwcA3mWXlZ8+NlXb7n5ELE11BZb/rEg==} - '@zag-js/json-tree-utils@1.22.1': - resolution: {integrity: sha512-z/15CTtXJHGUvecAAlPnUAaAK83Wxh5WlW9qEpgXlXdB5k7gnWVzH4qN9vDwlSShyZgqaFVqn+muxqaCTYv8Zg==} + '@zag-js/json-tree-utils@1.31.1': + resolution: {integrity: sha512-wrNek2UBE69FWpo2f0E2MxiboBS+Uop79LeQU2jNDujA1o3x6b1Lp2r7Fl1sfnUWMdKVVQb44oqfIj2g3CTEmQ==} - '@zag-js/listbox@1.22.1': - resolution: {integrity: sha512-M017Oq0s9PRR5ZwlJkmLhQHucEta/DZ5eHl/t+9yQqHnYRwWKo2ZXLyXquC1wihbHk81E0a1veDw8vBYpfRovA==} + '@zag-js/listbox@1.31.1': + resolution: {integrity: sha512-LcTIr4I9eN4MR1nSRfQfseWgj4ybOXXAY2o5dBpEBL67dnCSX3swNb/4LQO+ebj077BViQb66pBb1KSoeHGkEQ==} - '@zag-js/live-region@1.22.1': - resolution: {integrity: sha512-xjrlCbcgIw+iXxSXnjXAv+WX9r/bMwp4HOIxWOD99360XvatQ2ZGhLH9lfixiXeHLvm6hjWsP92MjYefSLDFSA==} + '@zag-js/live-region@1.31.1': + resolution: {integrity: sha512-RBx8jk1dgvkEUuFs77SBZn0WwvEkeZgVawVu6XUAy4ENfhP0D/qkvwNk+Els8InKmr1gWKajD7sh+g8M40Ex6A==} - '@zag-js/menu@1.22.1': - resolution: {integrity: sha512-a5pgQgcpVTVyY6JM8k1WGqelHVKSPwV2CwOv2oGjHWXIr2fpRCAKqZRtytE5PvUP/CZArk8bCjatmgOWe1RdPQ==} + '@zag-js/marquee@1.31.1': + resolution: {integrity: sha512-Rt7+zy7CDOxXm0PqaTcmuWxcrZOPOpZY4T6IxOZk4ZcOXJQ2v7CkF3EK0pdI9PyI6Zpk/YIwQkENjidT55db0A==} - '@zag-js/number-input@1.22.1': - resolution: {integrity: sha512-E4DROYvSo5TFJMkSmnq+f75wSTL/N7SK6MR8ssNlA2oQp69iVWXhIlFLe4knekX02QJzK1MF97aVU332kAYTeQ==} + '@zag-js/menu@1.31.1': + resolution: {integrity: sha512-eJPRM8tlauRTsAoJXchDBzMzL2RhXYSHmHak2IJCDMApCV51p0MqGYP8Er3DbMSQTPUFuTq779uUIarDqW+zmA==} - '@zag-js/pagination@1.22.1': - resolution: {integrity: sha512-Jeix+sXcfMPm5jer2W4PHSUCgu9a11aC/AOBk6dkxbX8XL23fYXJu5YyOVVq0iQIDWzX4Uij1N/vBha64ARmcA==} + '@zag-js/navigation-menu@1.31.1': + resolution: {integrity: sha512-xS4aynqmB9NYicPbEW8lPPakAfDfSgIDL1pRVSD6f1+VXkHD6LgNn6jUNDNbFt65mGhLpA2IczbvLCxv0g/ISQ==} - '@zag-js/password-input@1.22.1': - resolution: {integrity: sha512-EcCH0V2tbJbexy62nVDUXCMg/XVEcd0PGcBgUfziyaLlDnJz2HWkfe0MzpEiidJwfJfhvvf2DapX9mAyqzZhhw==} + '@zag-js/number-input@1.31.1': + resolution: {integrity: sha512-vn+BXEZ2/g2CMIFFyjjye/SbCeW3I/rlszL8EyBmhMcuA1l51OX2WKry6HeQNiU41uMyFg2rb1pb5KVw1gJsCg==} - '@zag-js/pin-input@1.22.1': - resolution: {integrity: sha512-tyI5mVi+zmsDEVuZZTOA7fVyxxGwmD8A2snF6nRkFK11o5xnnZaXt44Z7XrPeljTMSLKt+rdF0y/9Q05Auc4tg==} + '@zag-js/pagination@1.31.1': + resolution: {integrity: sha512-icW6FNzIKNz7iXU+prlQWpMFJedDrhmCKzzI39SY+dv5g1Gnrlc0b44PxvNl5PWFLSkB5KBT/R1WCqd8Kh4cCA==} - '@zag-js/popover@1.22.1': - resolution: {integrity: sha512-27VVkhaEOtiHJYj2j++AzYlAzpMcW0ED05TV9wIT1q0EYzASWxweSBajbnCiQf9TIYzCImDiNVDaCMl5D+TamQ==} + '@zag-js/password-input@1.31.1': + resolution: {integrity: sha512-AivOeNO14a39xhxVMB2TVmIjmQ89OwVz0+2IjX3JjLS2Pmia+gg9xnVd2kBIcKfnqUN4MBnzmk7t46YWJMQVVQ==} - '@zag-js/popper@1.22.1': - resolution: {integrity: sha512-vBI5WpvE/3ugsimjZaNisOwcECiYfzc+3LIJwaU8od62kInZ1XF6m096BvV7JGwP0FjkMPJrgjcv7weDtY2iDQ==} + '@zag-js/pin-input@1.31.1': + resolution: {integrity: sha512-k3ESoX5ve5sbWBLTCPYAzgLjRU7mVNEUiqAOhRgazOcBGV5wjGh398zWb1jr0FMxPnoAMrXDN/CQwJTmJcMKrg==} - '@zag-js/presence@1.22.1': - resolution: {integrity: sha512-9+pkKnjcHbNxk/80HzLdDjpiKGV/I208wAe0Njmej6q6Z79ED6cb7tXiOgAS7w/ZLWxwQW7B9oMJ3guVflBHwQ==} + '@zag-js/popover@1.31.1': + resolution: {integrity: sha512-uCFJP3DFBkEBAre6lgGLw2xWS2ZIuT/DLeajIXb+8BmC9KCF0wY4c9qojx9F3rGMJQxcGl+WUoXENkOvkTaVhQ==} - '@zag-js/progress@1.22.1': - resolution: {integrity: sha512-2U1IJLb1mhBLEgac8x8qaEv3qgr+pHdw6pn9mCCJVBcyFaSqliWps6X+vi+qKokFLrpjCjdAKuuf48ItNfFFcw==} + '@zag-js/popper@1.31.1': + resolution: {integrity: sha512-wLXcEqzn9MK1rGbsgnDH26o5ZWqR4oeb6ZepKKy0gcuJl/1S5/dr1VBvxJNMZlf9d6etvYklG5LRnIVkXCbrjA==} - '@zag-js/qr-code@1.22.1': - resolution: {integrity: sha512-HIRlNsPNcp5buiTZx7DrX/gCtouGAH4VJc8Q6HBUkaBbiiijVEuYN0aNAjZIdm2pDtrh4KaYjMPuIH8IrV554Q==} + '@zag-js/presence@1.31.1': + resolution: {integrity: sha512-tv+WsBnA0abIlDuEfZMh0lRPF4cMs6kWJosNkGBwzeXnGds+KXjzpL2KDtwDgbJgN3sI0xHPMYjRy2v3ZamcDA==} - '@zag-js/radio-group@1.22.1': - resolution: {integrity: sha512-eqvY1y/Ui4nQOU8XE9tGShOCbI/YdSHFeH/tDJe2Yy+1kqO4bENxFJ3R1P097KusJgeb2SYzhID27whUslOq7g==} + '@zag-js/progress@1.31.1': + resolution: {integrity: sha512-f9lIDHCRcFAG14LVEKOAPTdqPzphwIIraC6fTr9AwmNlYI6/qFDkz3jOlYVSyk5VsJAIFM/777x/CdqjliiOqg==} - '@zag-js/rating-group@1.22.1': - resolution: {integrity: sha512-QxBK+hpfkQ4yFHUr1YOSwEQ3LuTrdS32J9zV8UyHu8HbgwzfR7L8ZAa1PUUmG65tupzua2pbn1NioOkMvDmBOQ==} + '@zag-js/qr-code@1.31.1': + resolution: {integrity: sha512-Rxh+HF12SgUp5rvTelp1qyLK3xkn37h2fT/L4eBQ0f8OUEo8wfowEbs36+1i61d6UuH7PJt4q/07eIf6vNVevA==} - '@zag-js/react@1.22.1': - resolution: {integrity: sha512-TcIKkNo9EFel+d92nb7104voKJNDiMkqq9nn7Ozq/TE8A62JPf5zk8y8zqoxTbGDTTk+tDjW7Sm1IKb4r6rX4w==} + '@zag-js/radio-group@1.31.1': + resolution: {integrity: sha512-OfKIdEtSG0EuHM+cFVqcR+04yzZmcDRgG3j0QhoJsyS1my63ZHbwC2HNAtfPFh4U4sJx9yUexwSzPGZ6pOzIdw==} + + '@zag-js/rating-group@1.31.1': + resolution: {integrity: sha512-BkQUglKm4a+KXYPACYvIvBJSuEyzV0YQqjjiucwJ5UiOlK72C66VBvyGN+DqJRDnkU1K5azt6E1Ja5ANk3fgsg==} + + '@zag-js/react@1.31.1': + resolution: {integrity: sha512-a7uYH+tcw1UYbcovyVBzlh6X8KztK/b1+s8sMs4Srhd24M+hZMetV94Z0bM1Km5aNAnoS4gkH3gtJjH0OphquQ==} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' - '@zag-js/rect-utils@1.22.1': - resolution: {integrity: sha512-jtI03SR9kF0AcBffoFI/TKXn5KyhjNCtsGlqbWw0dKbhWTNy1v432FDC5opmmnH8W5LjjWebIzo4QtO5+632QQ==} + '@zag-js/rect-utils@1.31.1': + resolution: {integrity: sha512-lBFheAnz8+3aGDFjqlkw0Iew/F03lFjiIf26hkkcFSZu0ltNZUMG/X3XLHUnHxdfbdBguc8ons6mr2MkVvisng==} - '@zag-js/remove-scroll@1.22.1': - resolution: {integrity: sha512-2TrS8ljp8SADX5xRB/+KGBCBYbYTeH0k5IEalG2rt8ReNyNAW1JfCrm53KCVoCg9YmxKF3MrxPgPT83MNFsJhQ==} + '@zag-js/remove-scroll@1.31.1': + resolution: {integrity: sha512-gVVJuFKaCjo652RmajYmkjXKgjJWLQ5ZhZLTaLUKWM1mAarvlqnLui8jrHEHLxqpfsjQylfdhJKkWmyF8NAgTA==} - '@zag-js/scroll-area@1.22.1': - resolution: {integrity: sha512-BuWKGR3n1yMktYqfTx+U9iwpXkJJhDXW4yin7u/lLMAE0DXR4byyo8aollCkuzZdZbK7NmUG2zVQHUMZ1QaR6w==} + '@zag-js/scroll-area@1.31.1': + resolution: {integrity: sha512-GBXd1K3U0AHwWlJaqAMKQMZyeoxuBO6XYrVgdvzgiftQbJrZs5fuYOFyDvPLDWHTLYxaHso44/f+9EmAUAiytw==} - '@zag-js/scroll-snap@1.22.1': - resolution: {integrity: sha512-kctqJiteALaavoHEpYBDSPgUErIdwAoY5jcrU4Mq5L8FjtI4tSNr8BWcXzSBK2UVqaKN+vDo+PDcj7XIXTUQJA==} + '@zag-js/scroll-snap@1.31.1': + resolution: {integrity: sha512-YWsfhcQqiffu2X9HuB0fMnEQAu6rEOfGcvQYinvB6pjWPOvIJGxGMi/dYyy21XQDNJ9K1IcWRIo/yuaajoJyQQ==} - '@zag-js/select@1.22.1': - resolution: {integrity: sha512-sWq0RqlJvmj0heJDpfS3OfM1ynSSCW+fYY5v3T/QyH4qneqB8OJjgh8EEBaHlOkbqv/oBsk855U8/o6jegfUxw==} + '@zag-js/select@1.31.1': + resolution: {integrity: sha512-vKWb8BiRY83Y3HkDNnimf6cr1yvzJh1HwZlzXFz0y47zEvlikQaf+r96obR78RgTtMjNTTV15tTXdc1/WFoYkw==} - '@zag-js/signature-pad@1.22.1': - resolution: {integrity: sha512-iD8tBCHSmRI6kdtHO8dNRZrfjGTxfWgweLlNXKu5JV2JkzPBhDCxpthHI9k8LJ0cgUM5/EW4HdEpjO9h47FsaA==} + '@zag-js/signature-pad@1.31.1': + resolution: {integrity: sha512-bz3WtLuIZoLrJDKcdS7fPAdD/Qi9wKiKACl5cu+ftv9zg8w+qqYNLtjH9HxeUFbCtQRKqcdXjO/UZ8iL07hgsQ==} - '@zag-js/slider@1.22.1': - resolution: {integrity: sha512-aricrX99r21RAS9TyPNTJL8gE8mNRSQMy7TIXTa9aoeRjN0Cf6+PSksKfmPdP9l249/nplGqvC25Ck7XUVJn6A==} + '@zag-js/slider@1.31.1': + resolution: {integrity: sha512-FILbLTMd3BnyclZ28+ippfyqzYPGK60qZapxtTERmWDC75Okf8AFnTCQf84Y8jRmBKCS1yhjF+IOtkFAENeB6w==} - '@zag-js/splitter@1.22.1': - resolution: {integrity: sha512-ZMuFlVvqO2WYD7AECEB51iiFpN7A30Q28NfkIVR98xugwUX1OJq1IizKRSbLgC/LmseHPp3OvotxjZX6FqkK4Q==} + '@zag-js/splitter@1.31.1': + resolution: {integrity: sha512-7SGBT2/xKsOzeSQEg+Otn1XV3RHrAz3jTySjBRKoEmdxubhfREqbKotbGVG65aTve11fQnmJ3Oyt3GJOeraxLA==} - '@zag-js/steps@1.22.1': - resolution: {integrity: sha512-eJCHbHG9aGAbzb/IQCqpmk6fmwSmIfocAxNKVTljroD6OHkBtqgaZQVS3q4xyjz61nB/d/0ZlsvpCVjm1EhwBw==} + '@zag-js/steps@1.31.1': + resolution: {integrity: sha512-KsBH38V3tH9/q8CDgx4sUSXLYwFdcp1crZy8hTIcN0RUiZ55PmqYKkN2znzBjTbaCW9yhP8kXsbuo2s8OIU5lQ==} - '@zag-js/store@1.22.1': - resolution: {integrity: sha512-KrMWi/Fa4cqOjx2zDSMIu6vztFYik+V3K6VPWRVONM4FkboLpTqAEayzwgTTNqMK9iYYZIYjhiPhAVLW9iLuBg==} + '@zag-js/store@1.31.1': + resolution: {integrity: sha512-d5ZTRciTuXOGQ3nML15kQLaTiR1wJPxT1Fu1nN659X6Rl8DPtubYaRCZ3RCk9Kyiyg2z5HxeVqDswaDvGbM9Rg==} - '@zag-js/switch@1.22.1': - resolution: {integrity: sha512-ipmBHEqtcrPYr5WS5Juj5dt4GFIqr81NYVNe8RHMW8jIHgHhRCRj3TokGXVlZ7HdseCKTTNNrcvRFBr1sJBbOw==} + '@zag-js/switch@1.31.1': + resolution: {integrity: sha512-Jii3OSqSa9sQux+hvSRvp9dirzUF09+PAjrLjCQs+BT08EZ0XqeGvVzM0Wqf9LFy07HdLZntai3IUaXLF6byBw==} - '@zag-js/tabs@1.22.1': - resolution: {integrity: sha512-B0WHW36uuR+pu/24X0yI4eyvSwo7WmqOc5C3ohZHOf03zkmMJdtMtVQSotKr7qhGMt5updCgs68MR7jAmmc1Lw==} + '@zag-js/tabs@1.31.1': + resolution: {integrity: sha512-QBq4ngpBNMNEI7Wuaq8llwHOqgcVbNHHEDC5zHg60Bf7MY5ltP8wSq6Kldu0zZRVwrLzanYoMELDUyf9H0vtnw==} - '@zag-js/tags-input@1.22.1': - resolution: {integrity: sha512-/56pCeSIW+g+ish3Gjed7iNcPSbQEsBCBsCn6FU/JfjwyhLM0sAtn1vkE/eR92hvDX3klV12XzEMBGe4Egr3GQ==} - - '@zag-js/time-picker@1.22.1': - resolution: {integrity: sha512-7fqCtyDbuaelffLZ8q9infns+HQKqFMjL4k2V5zALAWdYu2NzvlMYHgj2Ue9AI4VI5QaE1nnwV6hxwS4Zpglvg==} - peerDependencies: - '@internationalized/date': '>=3.0.0' + '@zag-js/tags-input@1.31.1': + resolution: {integrity: sha512-V4lJe/aMIs7WVoXYfszU6E3iARLLRQFMiycu76/slb8NWJiLrkSIaMQ4FAe2pqkodgCWXA83tuaeAZRq7ouTFg==} - '@zag-js/timer@1.22.1': - resolution: {integrity: sha512-VmXnXjecuF4tXFdBRuMHxO8mQX3/vxagE4vx0M0gKwbGoGrXnhYGvULiPL3RlJj8OR8pIfYuP2lbCrt8XM625A==} + '@zag-js/timer@1.31.1': + resolution: {integrity: sha512-bXfeSbneWGOBKlD5dYq06T8CSY9Ky+qb1yIfJAFsRF4n34mpUYRdtfwpNQYyddGpkLD7oH4VibajeZXB7HaL0g==} - '@zag-js/toast@1.22.1': - resolution: {integrity: sha512-cxcfbMftA//ggOAlxG3q04WZVL/mMVklvtQ2rSyj3oRmnwocJPYXtJzKIRazWBjji3u3BOA+ZeOI1AcGrfp/TQ==} + '@zag-js/toast@1.31.1': + resolution: {integrity: sha512-MueHEei9ol3H6tWBruLxF7yEUpV3vsJ8brTQVRRtPr/6pqBs5kGzfL4YskhQ2tiwO6egay8YrkbaS3xJfpKt4w==} - '@zag-js/toggle-group@1.22.1': - resolution: {integrity: sha512-StxnGsPwzB60pGHTD7sNOqIMXjEPMl3lYQk0i2F5MIQWlTRkYdp4ivh73xBRYVtqK15gqacuWXw87EDzKcNwcA==} + '@zag-js/toggle-group@1.31.1': + resolution: {integrity: sha512-Mojc7mex01/gvwXfrUIIThzT7HOktZoMge9rrb6+P7rQX7ulyNXYPjQrW2tay+t54GOJ3xODo9dU7PpRzXeHbw==} - '@zag-js/toggle@1.22.1': - resolution: {integrity: sha512-KK9VK8ZkA/ep7KxQFaeVE/zHVm90fkp9q6q4inyQkUdURUg0vovTFI3c5q/c1zm9/g51vbNf5qCXWU4m9sQK8A==} + '@zag-js/toggle@1.31.1': + resolution: {integrity: sha512-HbFBuGfdyYkNvOp3cEB8Civ4E92finT4u3e4LKysB4/LboqKA0cJvFhSnHyThbROONTx06W/3CxwoSFR4o8IhA==} - '@zag-js/tooltip@1.22.1': - resolution: {integrity: sha512-0ub0p22CzYnaXv0prAnWNjqUBkdw4nO4yGk5qntaodajpLNQ4gSdq7Hj4afHzJqwbKAkwb3KzJFqcqIm9Y/dfw==} + '@zag-js/tooltip@1.31.1': + resolution: {integrity: sha512-pWEU5XhEPpnyl2VLrGJlyjj7+p+X0UX3Fld+WGhc/hCaWiuW2ZzD/ewDRhSOZu4/TzAO3axrPqG1YhW4fhogKQ==} - '@zag-js/tour@1.22.1': - resolution: {integrity: sha512-VhHC65NgBaCjlVsw1M4Me0P6PCtmD9oi9gRzN2fEUESdpM/QT5Yw6PAAPP1AEo5okv+V2rRBgSKOu9ZyYHa+IQ==} + '@zag-js/tour@1.31.1': + resolution: {integrity: sha512-ZmcAevXxoENHmHG0xwdIt1oCLe2/DW1CEBFPr7YuGKc+FU3QbBVZMzcBHrJCe0nkKXhUKzHOHM78bOHD/gM76w==} - '@zag-js/tree-view@1.22.1': - resolution: {integrity: sha512-AQmOn1mB+nLJEaq0xdSVnTI8Vt3nB3OweqdB12jkbdIOcWI9eY0RfhiNHC0k0mgAw+dMjyn84op/gOd9VVdtmA==} + '@zag-js/tree-view@1.31.1': + resolution: {integrity: sha512-Q+VSQz7X1XR8gT7ICWXlQOJIvzTWw/9BlF7B073UpEgAKRFlD11FmERka5y/BYqj8uE0vazcbSEA3Vc2dgCMJA==} - '@zag-js/types@1.22.1': - resolution: {integrity: sha512-lvpDSMR96e7H7TdwOiVpMzj6css5Ydix1nBi7BlmjME6v5OPR0KZwVDGD6h5UtTeVjPq8dPaqM8TJWw+QwbQSw==} + '@zag-js/types@1.31.1': + resolution: {integrity: sha512-mKw5DoeBjFykfUHv3ifCRjcogFTqp0aCCsmqQMfnf+J/mg2aXpAx76AXT1PYXAVVhxdP6qGXNd0mOQZDVrIlSQ==} - '@zag-js/utils@1.22.1': - resolution: {integrity: sha512-VXY4gjHaTENHW+wjnKKENZ2jcaW0vnG2a5lYEMuZR4dpNCKH217yFr/bCNrI44y2s1W3LWhWmpEjfZluP6udYg==} + '@zag-js/utils@1.31.1': + resolution: {integrity: sha512-KLm0pmOtf4ydALbaVLboL7W98TDVxwVVLvSuvtRgV53XTjlsVopTRA5/Xmzq2NhWujDZAXv7bRV603NDgDcjSw==} abs-svg-path@0.1.1: resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} @@ -1119,18 +1053,10 @@ packages: aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -1143,18 +1069,10 @@ packages: resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - array.prototype.flat@1.3.3: resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.3: resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} @@ -1163,10 +1081,6 @@ packages: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -1200,10 +1114,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.3: - resolution: {integrity: sha512-8QdH6czo+G7uBsNo0GiUfouPN1lRzKdJTGnKXwe12gkFbnnOUaUKGN55dMkfy+mnxmvjwl9zcI4VncczcVXDhA==} - hasBin: true - bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -1223,19 +1133,10 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} @@ -1248,9 +1149,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001664: - resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} - caniuse-lite@1.0.30001759: resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} @@ -1281,9 +1179,6 @@ packages: convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -1312,26 +1207,14 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - data-view-byte-length@1.0.2: resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.1: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} @@ -1390,9 +1273,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.266: - resolution: {integrity: sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==} - emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -1406,18 +1286,10 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1433,33 +1305,18 @@ packages: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-shim-unscopables@1.1.0: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} @@ -1474,18 +1331,14 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@16.0.7: - resolution: {integrity: sha512-WubFGLFHfk2KivkdRGfx6cGSFhaQqhERRfyO8BRx+qiGPGp7WLKcPvYC4mdx1z3VhVRcrfFzczjjTrbJZOpnEQ==} + eslint-config-next@15.5.9: + resolution: {integrity: sha512-852JYI3NkFNzW8CqsMhI0K2CDRxTObdZ2jQJj5CtpEaOkYHn13107tHpNuD/h0WRpU4FAbCdUaxQsrfBtNK9Kw==} peerDependencies: - eslint: '>=9.0.0' + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' peerDependenciesMeta: typescript: @@ -1507,27 +1360,6 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - eslint-module-utils@2.12.1: resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} @@ -1565,9 +1397,9 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@7.0.1: - resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} - engines: {node: '>=18'} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -1635,9 +1467,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -1675,9 +1504,6 @@ packages: fontkit@2.0.4: resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -1693,10 +1519,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -1704,14 +1526,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1720,10 +1534,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -1751,17 +1561,10 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globals@16.4.0: - resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} - engines: {node: '>=18'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1782,18 +1585,10 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - has-proto@1.2.0: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1806,12 +1601,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -1847,10 +1636,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -1859,10 +1644,6 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1877,17 +1658,10 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -1907,18 +1681,10 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-date-object@1.1.0: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} @@ -1927,9 +1693,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-finalizationregistry@1.1.1: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} @@ -1950,10 +1713,6 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -1966,10 +1725,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -1978,34 +1733,18 @@ packages: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.4: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -2017,9 +1756,6 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakref@1.1.1: resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} @@ -2071,11 +1807,6 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -2114,9 +1845,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2188,9 +1916,9 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.0.7: - resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} - engines: {node: '>=20.9.0'} + next@15.5.9: + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -2213,9 +1941,6 @@ packages: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - node-schedule@2.1.1: resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} engines: {node: '>=6'} @@ -2234,10 +1959,6 @@ packages: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} engines: {node: '>= 6'} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -2250,10 +1971,6 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -2270,10 +1987,6 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -2433,17 +2146,9 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -2482,10 +2187,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -2497,10 +2198,6 @@ packages: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -2515,11 +2212,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -2561,10 +2253,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} @@ -2583,10 +2271,6 @@ packages: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -2605,10 +2289,6 @@ packages: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} @@ -2697,53 +2377,27 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.3: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.4: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.48.1: - resolution: {integrity: sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - typescript@5.6.2: resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -2757,12 +2411,6 @@ packages: unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - update-browserslist-db@1.2.2: - resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} @@ -2780,17 +2428,10 @@ packages: resolution: {integrity: sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ==} engines: {node: '>= 6'} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} - which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} - engines: {node: '>= 0.4'} - which-builtin-type@1.2.1: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} @@ -2799,10 +2440,6 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - which-typed-array@1.1.19: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} @@ -2819,9 +2456,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -2836,80 +2470,74 @@ packages: yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - - zod@4.1.13: - resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} - snapshots: - '@ark-ui/react@5.22.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': - dependencies: - '@internationalized/date': 3.8.2 - '@zag-js/accordion': 1.22.1 - '@zag-js/anatomy': 1.22.1 - '@zag-js/angle-slider': 1.22.1 - '@zag-js/async-list': 1.22.1 - '@zag-js/auto-resize': 1.22.1 - '@zag-js/avatar': 1.22.1 - '@zag-js/carousel': 1.22.1 - '@zag-js/checkbox': 1.22.1 - '@zag-js/clipboard': 1.22.1 - '@zag-js/collapsible': 1.22.1 - '@zag-js/collection': 1.22.1 - '@zag-js/color-picker': 1.22.1 - '@zag-js/color-utils': 1.22.1 - '@zag-js/combobox': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/date-picker': 1.22.1(@internationalized/date@3.8.2) - '@zag-js/date-utils': 1.22.1(@internationalized/date@3.8.2) - '@zag-js/dialog': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/editable': 1.22.1 - '@zag-js/file-upload': 1.22.1 - '@zag-js/file-utils': 1.22.1 - '@zag-js/floating-panel': 1.22.1 - '@zag-js/focus-trap': 1.22.1 - '@zag-js/highlight-word': 1.22.1 - '@zag-js/hover-card': 1.22.1 - '@zag-js/i18n-utils': 1.22.1 - '@zag-js/json-tree-utils': 1.22.1 - '@zag-js/listbox': 1.22.1 - '@zag-js/menu': 1.22.1 - '@zag-js/number-input': 1.22.1 - '@zag-js/pagination': 1.22.1 - '@zag-js/password-input': 1.22.1 - '@zag-js/pin-input': 1.22.1 - '@zag-js/popover': 1.22.1 - '@zag-js/presence': 1.22.1 - '@zag-js/progress': 1.22.1 - '@zag-js/qr-code': 1.22.1 - '@zag-js/radio-group': 1.22.1 - '@zag-js/rating-group': 1.22.1 - '@zag-js/react': 1.22.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@zag-js/scroll-area': 1.22.1 - '@zag-js/select': 1.22.1 - '@zag-js/signature-pad': 1.22.1 - '@zag-js/slider': 1.22.1 - '@zag-js/splitter': 1.22.1 - '@zag-js/steps': 1.22.1 - '@zag-js/switch': 1.22.1 - '@zag-js/tabs': 1.22.1 - '@zag-js/tags-input': 1.22.1 - '@zag-js/time-picker': 1.22.1(@internationalized/date@3.8.2) - '@zag-js/timer': 1.22.1 - '@zag-js/toast': 1.22.1 - '@zag-js/toggle': 1.22.1 - '@zag-js/toggle-group': 1.22.1 - '@zag-js/tooltip': 1.22.1 - '@zag-js/tour': 1.22.1 - '@zag-js/tree-view': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@ark-ui/react@5.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@internationalized/date': 3.10.0 + '@zag-js/accordion': 1.31.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/angle-slider': 1.31.1 + '@zag-js/async-list': 1.31.1 + '@zag-js/auto-resize': 1.31.1 + '@zag-js/avatar': 1.31.1 + '@zag-js/bottom-sheet': 1.31.1 + '@zag-js/carousel': 1.31.1 + '@zag-js/checkbox': 1.31.1 + '@zag-js/clipboard': 1.31.1 + '@zag-js/collapsible': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/color-picker': 1.31.1 + '@zag-js/color-utils': 1.31.1 + '@zag-js/combobox': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/date-picker': 1.31.1(@internationalized/date@3.10.0) + '@zag-js/date-utils': 1.31.1(@internationalized/date@3.10.0) + '@zag-js/dialog': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/editable': 1.31.1 + '@zag-js/file-upload': 1.31.1 + '@zag-js/file-utils': 1.31.1 + '@zag-js/floating-panel': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/highlight-word': 1.31.1 + '@zag-js/hover-card': 1.31.1 + '@zag-js/i18n-utils': 1.31.1 + '@zag-js/image-cropper': 1.31.1 + '@zag-js/json-tree-utils': 1.31.1 + '@zag-js/listbox': 1.31.1 + '@zag-js/marquee': 1.31.1 + '@zag-js/menu': 1.31.1 + '@zag-js/navigation-menu': 1.31.1 + '@zag-js/number-input': 1.31.1 + '@zag-js/pagination': 1.31.1 + '@zag-js/password-input': 1.31.1 + '@zag-js/pin-input': 1.31.1 + '@zag-js/popover': 1.31.1 + '@zag-js/presence': 1.31.1 + '@zag-js/progress': 1.31.1 + '@zag-js/qr-code': 1.31.1 + '@zag-js/radio-group': 1.31.1 + '@zag-js/rating-group': 1.31.1 + '@zag-js/react': 1.31.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@zag-js/scroll-area': 1.31.1 + '@zag-js/select': 1.31.1 + '@zag-js/signature-pad': 1.31.1 + '@zag-js/slider': 1.31.1 + '@zag-js/splitter': 1.31.1 + '@zag-js/steps': 1.31.1 + '@zag-js/switch': 1.31.1 + '@zag-js/tabs': 1.31.1 + '@zag-js/tags-input': 1.31.1 + '@zag-js/timer': 1.31.1 + '@zag-js/toast': 1.31.1 + '@zag-js/toggle': 1.31.1 + '@zag-js/toggle-group': 1.31.1 + '@zag-js/tooltip': 1.31.1 + '@zag-js/tour': 1.31.1 + '@zag-js/tree-view': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) @@ -2919,34 +2547,6 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.0 - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.28.5': {} - - '@babel/core@7.28.5': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.3.7 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/generator@7.26.3': dependencies: '@babel/parser': 7.26.3 @@ -2955,24 +2555,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/generator@7.28.5': - dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-globals@7.28.0': {} - '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.26.4 @@ -2980,45 +2562,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.28.4': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - '@babel/parser@7.26.3': dependencies: '@babel/types': 7.26.3 - '@babel/parser@7.28.5': - dependencies: - '@babel/types': 7.28.5 - '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 @@ -3029,12 +2580,6 @@ snapshots: '@babel/parser': 7.26.3 '@babel/types': 7.26.3 - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@babel/traverse@7.26.4': dependencies: '@babel/code-frame': 7.26.2 @@ -3047,39 +2592,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.28.5': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/types@7.28.5': + '@chakra-ui/react@3.30.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@chakra-ui/react@3.26.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': - dependencies: - '@ark-ui/react': 5.22.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@emotion/is-prop-valid': 1.3.1 + '@ark-ui/react': 5.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.1) '@emotion/utils': 1.4.2 - '@pandacss/is-valid-prop': 0.54.0 - csstype: 3.1.3 - fast-safe-stringify: 2.1.1 + '@pandacss/is-valid-prop': 1.7.1 + csstype: 3.2.3 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) @@ -3114,7 +2641,7 @@ snapshots: '@emotion/hash@0.9.2': {} - '@emotion/is-prop-valid@1.3.1': + '@emotion/is-prop-valid@1.4.0': dependencies: '@emotion/memoize': 0.9.0 @@ -3383,30 +2910,20 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@internationalized/date@3.8.2': + '@internationalized/date@3.10.0': dependencies: '@swc/helpers': 0.5.15 - '@internationalized/number@3.6.4': + '@internationalized/number@3.6.5': dependencies: '@swc/helpers': 0.5.15 - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -3418,39 +2935,34 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@next/env@16.0.7': {} + '@next/env@15.5.9': {} - '@next/eslint-plugin-next@16.0.7': + '@next/eslint-plugin-next@15.5.9': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@16.0.7': + '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-x64@16.0.7': + '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@16.0.7': + '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-musl@16.0.7': + '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-x64-gnu@16.0.7': + '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-musl@16.0.7': + '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@16.0.7': + '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@16.0.7': + '@next/swc-win32-x64-msvc@15.5.7': optional: true '@nodelib/fs.scandir@2.1.5': @@ -3467,7 +2979,7 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@pandacss/is-valid-prop@0.54.0': {} + '@pandacss/is-valid-prop@1.7.1': {} '@panva/hkdf@1.2.1': {} @@ -3609,6 +3121,8 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@rushstack/eslint-patch@1.15.0': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -3710,7 +3224,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.3.7 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.3 tinyglobby: 0.2.15 ts-api-utils: 2.1.0(typescript@5.6.2) typescript: 5.6.2 @@ -3735,518 +3249,545 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@zag-js/accordion@1.22.1': + '@zag-js/accordion@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/anatomy@1.31.1': {} - '@zag-js/anatomy@1.22.1': {} + '@zag-js/angle-slider@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/rect-utils': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/angle-slider@1.22.1': + '@zag-js/aria-hidden@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/rect-utils': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/dom-query': 1.31.1 - '@zag-js/aria-hidden@1.22.1': {} + '@zag-js/async-list@1.31.1': + dependencies: + '@zag-js/core': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/async-list@1.22.1': + '@zag-js/auto-resize@1.31.1': dependencies: - '@zag-js/core': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/dom-query': 1.31.1 - '@zag-js/auto-resize@1.22.1': + '@zag-js/avatar@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/avatar@1.22.1': + '@zag-js/bottom-sheet@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/aria-hidden': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/remove-scroll': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/carousel@1.22.1': + '@zag-js/carousel@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/scroll-snap': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/scroll-snap': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/checkbox@1.22.1': + '@zag-js/checkbox@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/focus-visible': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/clipboard@1.22.1': + '@zag-js/clipboard@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/collapsible@1.22.1': + '@zag-js/collapsible@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/collection@1.22.1': + '@zag-js/collection@1.31.1': dependencies: - '@zag-js/utils': 1.22.1 + '@zag-js/utils': 1.31.1 - '@zag-js/color-picker@1.22.1': + '@zag-js/color-picker@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/color-utils': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/color-utils': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/color-utils@1.22.1': + '@zag-js/color-utils@1.31.1': dependencies: - '@zag-js/utils': 1.22.1 + '@zag-js/utils': 1.31.1 - '@zag-js/combobox@1.22.1': + '@zag-js/combobox@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/aria-hidden': 1.22.1 - '@zag-js/collection': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/aria-hidden': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/core@1.22.1': + '@zag-js/core@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/date-picker@1.22.1(@internationalized/date@3.8.2)': + '@zag-js/date-picker@1.31.1(@internationalized/date@3.10.0)': dependencies: - '@internationalized/date': 3.8.2 - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/date-utils': 1.22.1(@internationalized/date@3.8.2) - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/live-region': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@internationalized/date': 3.10.0 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/date-utils': 1.31.1(@internationalized/date@3.10.0) + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/live-region': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/date-utils@1.22.1(@internationalized/date@3.8.2)': + '@zag-js/date-utils@1.31.1(@internationalized/date@3.10.0)': dependencies: - '@internationalized/date': 3.8.2 + '@internationalized/date': 3.10.0 - '@zag-js/dialog@1.22.1': + '@zag-js/dialog@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/aria-hidden': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/focus-trap': 1.22.1 - '@zag-js/remove-scroll': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/aria-hidden': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/remove-scroll': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/dismissable@1.22.1': + '@zag-js/dismissable@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 - '@zag-js/interact-outside': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/interact-outside': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/dom-query@1.22.1': + '@zag-js/dom-query@1.31.1': dependencies: - '@zag-js/types': 1.22.1 + '@zag-js/types': 1.31.1 - '@zag-js/editable@1.22.1': + '@zag-js/editable@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/interact-outside': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/interact-outside': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/file-upload@1.22.1': + '@zag-js/file-upload@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/file-utils': 1.22.1 - '@zag-js/i18n-utils': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/file-utils': 1.31.1 + '@zag-js/i18n-utils': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/file-utils@1.22.1': + '@zag-js/file-utils@1.31.1': dependencies: - '@zag-js/i18n-utils': 1.22.1 + '@zag-js/i18n-utils': 1.31.1 - '@zag-js/floating-panel@1.22.1': + '@zag-js/floating-panel@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/rect-utils': 1.22.1 - '@zag-js/store': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/rect-utils': 1.31.1 + '@zag-js/store': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/focus-trap@1.22.1': + '@zag-js/focus-trap@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 + '@zag-js/dom-query': 1.31.1 - '@zag-js/focus-visible@1.22.1': + '@zag-js/focus-visible@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 + '@zag-js/dom-query': 1.31.1 + + '@zag-js/highlight-word@1.31.1': {} - '@zag-js/highlight-word@1.22.1': {} + '@zag-js/hover-card@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/hover-card@1.22.1': + '@zag-js/i18n-utils@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/dom-query': 1.31.1 - '@zag-js/i18n-utils@1.22.1': + '@zag-js/image-cropper@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/interact-outside@1.22.1': + '@zag-js/interact-outside@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/json-tree-utils@1.22.1': {} + '@zag-js/json-tree-utils@1.31.1': {} - '@zag-js/listbox@1.22.1': + '@zag-js/listbox@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/collection': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/focus-visible': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/live-region@1.22.1': {} + '@zag-js/live-region@1.31.1': {} - '@zag-js/menu@1.22.1': + '@zag-js/marquee@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/rect-utils': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/number-input@1.22.1': + '@zag-js/menu@1.31.1': dependencies: - '@internationalized/number': 3.6.4 - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/rect-utils': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/pagination@1.22.1': + '@zag-js/navigation-menu@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/password-input@1.22.1': + '@zag-js/number-input@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@internationalized/number': 3.6.5 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/pin-input@1.22.1': + '@zag-js/pagination@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/popover@1.22.1': + '@zag-js/password-input@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/aria-hidden': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/focus-trap': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/remove-scroll': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/popper@1.22.1': + '@zag-js/pin-input@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/popover@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/aria-hidden': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/remove-scroll': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/popper@1.31.1': dependencies: '@floating-ui/dom': 1.7.4 - '@zag-js/dom-query': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/presence@1.22.1': + '@zag-js/presence@1.31.1': dependencies: - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 - '@zag-js/progress@1.22.1': + '@zag-js/progress@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/qr-code@1.22.1': + '@zag-js/qr-code@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 proxy-memoize: 3.0.1 uqr: 0.1.2 - '@zag-js/radio-group@1.22.1': + '@zag-js/radio-group@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/focus-visible': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/rating-group@1.22.1': + '@zag-js/rating-group@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/react@1.22.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@zag-js/react@1.31.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@zag-js/core': 1.22.1 - '@zag-js/store': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/core': 1.31.1 + '@zag-js/store': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - '@zag-js/rect-utils@1.22.1': {} + '@zag-js/rect-utils@1.31.1': {} - '@zag-js/remove-scroll@1.22.1': + '@zag-js/remove-scroll@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 + '@zag-js/dom-query': 1.31.1 - '@zag-js/scroll-area@1.22.1': + '@zag-js/scroll-area@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/scroll-snap@1.22.1': + '@zag-js/scroll-snap@1.31.1': dependencies: - '@zag-js/dom-query': 1.22.1 + '@zag-js/dom-query': 1.31.1 - '@zag-js/select@1.22.1': + '@zag-js/select@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/collection': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/signature-pad@1.22.1': + '@zag-js/signature-pad@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 perfect-freehand: 1.2.2 - '@zag-js/slider@1.22.1': + '@zag-js/slider@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/splitter@1.22.1': + '@zag-js/splitter@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/steps@1.22.1': + '@zag-js/steps@1.31.1': dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 - '@zag-js/store@1.22.1': + '@zag-js/store@1.31.1': dependencies: proxy-compare: 3.0.1 - '@zag-js/switch@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/focus-visible': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/tabs@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/tags-input@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/auto-resize': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/interact-outside': 1.22.1 - '@zag-js/live-region': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/time-picker@1.22.1(@internationalized/date@3.8.2)': - dependencies: - '@internationalized/date': 3.8.2 - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/timer@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/toast@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/toggle-group@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/toggle@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/tooltip@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/focus-visible': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/tour@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dismissable': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/focus-trap': 1.22.1 - '@zag-js/interact-outside': 1.22.1 - '@zag-js/popper': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/tree-view@1.22.1': - dependencies: - '@zag-js/anatomy': 1.22.1 - '@zag-js/collection': 1.22.1 - '@zag-js/core': 1.22.1 - '@zag-js/dom-query': 1.22.1 - '@zag-js/types': 1.22.1 - '@zag-js/utils': 1.22.1 - - '@zag-js/types@1.22.1': + '@zag-js/switch@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tabs@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tags-input@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/auto-resize': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/interact-outside': 1.31.1 + '@zag-js/live-region': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/timer@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/toast@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/toggle-group@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/toggle@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tooltip@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tour@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/interact-outside': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tree-view@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/types@1.31.1': dependencies: - csstype: 3.1.3 + csstype: 3.2.3 - '@zag-js/utils@1.22.1': {} + '@zag-js/utils@1.31.1': {} abs-svg-path@0.1.1: {} @@ -4275,25 +3816,11 @@ snapshots: dependencies: deep-equal: 2.2.3 - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - array-includes@3.1.9: dependencies: call-bind: 1.0.8 @@ -4307,12 +3834,12 @@ snapshots: array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.6: dependencies: @@ -4324,52 +3851,27 @@ snapshots: es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: @@ -4403,8 +3905,6 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.3: {} - bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -4430,31 +3930,15 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.9.3 - caniuse-lite: 1.0.30001759 - electron-to-chromium: 1.5.266 - node-releases: 2.0.27 - update-browserslist-db: 1.2.2(browserslist@4.28.1) - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.0 + es-define-property: 1.0.1 get-intrinsic: 1.3.0 set-function-length: 1.2.2 @@ -4465,8 +3949,6 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001664: {} - caniuse-lite@1.0.30001759: {} chalk@4.1.2: @@ -4493,8 +3975,6 @@ snapshots: convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} - cookie@0.7.2: {} cosmiconfig@7.1.0: @@ -4523,36 +4003,18 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-byte-length@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-byte-offset@1.0.1: dependencies: call-bound: 1.0.4 @@ -4571,32 +4033,32 @@ snapshots: deep-equal@2.2.3: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + is-array-buffer: 3.0.5 + is-date-object: 1.1.0 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 isarray: 2.0.5 object-is: 1.1.6 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.4 + side-channel: 1.1.0 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 deep-is@0.1.4: {} define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-properties@1.2.1: dependencies: @@ -4623,8 +4085,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.266: {} - emoji-regex@10.4.0: {} emoji-regex@9.2.2: {} @@ -4638,55 +4098,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -4744,57 +4155,43 @@ snapshots: unbox-primitive: 1.1.0 which-typed-array: 1.1.19 - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - es-define-property@1.0.1: {} es-errors@1.3.0: {} es-get-iterator@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 is-arguments: 1.1.1 is-map: 2.0.3 is-set: 2.0.3 - is-string: 1.0.7 + is-string: 1.1.1 isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 + stop-iteration-iterator: 1.1.0 es-iterator-helpers@1.0.19: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.4 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 + safe-array-concat: 1.1.3 es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 @@ -4802,25 +4199,15 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 esbuild-register@3.6.0(esbuild@0.25.2): dependencies: @@ -4857,26 +4244,24 @@ snapshots: '@esbuild/win32-ia32': 0.25.2 '@esbuild/win32-x64': 0.25.2 - escalade@3.2.0: {} - escape-string-regexp@4.0.0: {} - eslint-config-next@16.0.7(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2): + eslint-config-next@15.5.9(eslint@8.57.1)(typescript@5.6.2): dependencies: - '@next/eslint-plugin-next': 16.0.7 + '@next/eslint-plugin-next': 15.5.9 + '@rushstack/eslint-patch': 1.15.0 + '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.37.0(eslint@8.57.1) - eslint-plugin-react-hooks: 7.0.1(eslint@8.57.1) - globals: 16.4.0 - typescript-eslint: 8.48.1(eslint@8.57.1)(typescript@5.6.2) + eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - - '@typescript-eslint/parser' - eslint-import-resolver-webpack - eslint-plugin-import-x - supports-color @@ -4884,53 +4269,42 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.15.1 + is-core-module: 2.16.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4941,7 +4315,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4962,8 +4336,8 @@ snapshots: eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1): dependencies: aria-query: 5.1.3 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.0 axobject-query: 4.1.0 @@ -4976,25 +4350,18 @@ snapshots: language-tags: 1.0.9 minimatch: 3.1.2 object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 + safe-regex-test: 1.1.0 string.prototype.includes: 2.0.0 - eslint-plugin-react-hooks@7.0.1(eslint@8.57.1): + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.26.3 eslint: 8.57.1 - hermes-parser: 0.25.1 - zod: 4.1.13 - zod-validation-error: 4.0.2(zod@4.1.13) - transitivePeerDependencies: - - supports-color eslint-plugin-react@7.37.0(eslint@8.57.1): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.0.19 @@ -5005,7 +4372,7 @@ snapshots: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 @@ -5106,8 +4473,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-safe-stringify@2.1.1: {} - fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -5151,10 +4516,6 @@ snapshots: unicode-properties: 1.4.1 unicode-trie: 2.0.0 - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -5166,13 +4527,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -5184,16 +4538,6 @@ snapshots: functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5212,12 +4556,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -5251,16 +4589,10 @@ snapshots: dependencies: type-fest: 0.20.2 - globals@16.4.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd: 1.2.0 gopd@1.2.0: {} @@ -5274,32 +4606,22 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} + es-define-property: 1.0.1 has-proto@1.2.0: dependencies: dunder-proto: 1.0.1 - has-symbols@1.0.3: {} - has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: function-bind: 1.1.2 - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -5330,12 +4652,6 @@ snapshots: inherits@2.0.4: {} - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -5344,14 +4660,9 @@ snapshots: is-arguments@1.1.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -5366,19 +4677,10 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-bigint@1.1.0: dependencies: has-bigints: 1.0.2 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -5386,7 +4688,7 @@ snapshots: is-bun-module@1.2.1: dependencies: - semver: 7.7.1 + semver: 7.7.3 is-callable@1.2.7: {} @@ -5398,20 +4700,12 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - is-data-view@1.0.2: dependencies: call-bound: 1.0.4 get-intrinsic: 1.3.0 is-typed-array: 1.1.15 - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-date-object@1.1.0: dependencies: call-bound: 1.0.4 @@ -5419,10 +4713,6 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 @@ -5439,10 +4729,6 @@ snapshots: is-negative-zero@2.0.3: {} - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -5452,11 +4738,6 @@ snapshots: is-path-inside@3.0.3: {} - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -5466,37 +4747,21 @@ snapshots: is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-string@1.1.1: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - is-symbol@1.1.1: dependencies: call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 @@ -5505,18 +4770,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-weakref@1.1.1: dependencies: call-bound: 1.0.4 is-weakset@2.0.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 isarray@2.0.5: {} @@ -5525,9 +4786,9 @@ snapshots: iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + reflect.getprototypeof: 1.0.10 set-function-name: 2.0.2 jay-peg@1.1.1: @@ -5556,14 +4817,12 @@ snapshots: dependencies: minimist: 1.2.8 - json5@2.2.3: {} - jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 keyv@4.5.4: dependencies: @@ -5599,10 +4858,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -5638,13 +4893,13 @@ snapshots: negotiator@0.6.4: {} - next-auth@4.24.11(next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next-auth@4.24.11(next@15.5.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@babel/runtime': 7.25.6 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 15.5.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) oauth: 0.9.15 openid-client: 5.7.0 preact: 10.24.1 @@ -5663,24 +4918,24 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@15.5.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 16.0.7 + '@next/env': 15.5.9 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001664 + caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) + styled-jsx: 5.1.6(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.7 - '@next/swc-darwin-x64': 16.0.7 - '@next/swc-linux-arm64-gnu': 16.0.7 - '@next/swc-linux-arm64-musl': 16.0.7 - '@next/swc-linux-x64-gnu': 16.0.7 - '@next/swc-linux-x64-musl': 16.0.7 - '@next/swc-win32-arm64-msvc': 16.0.7 - '@next/swc-win32-x64-msvc': 16.0.7 + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -5690,8 +4945,6 @@ snapshots: dependencies: clone: 2.1.2 - node-releases@2.0.27: {} - node-schedule@2.1.1: dependencies: cron-parser: 4.9.0 @@ -5708,24 +4961,15 @@ snapshots: object-hash@2.2.0: {} - object-inspect@1.13.2: {} - object-inspect@1.13.4: {} object-is@1.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 object-keys@1.1.1: {} - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - object.assign@4.1.7: dependencies: call-bind: 1.0.8 @@ -5737,35 +4981,29 @@ snapshots: object.entries@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 oidc-token-hash@5.0.3: {} @@ -5847,7 +5085,7 @@ snapshots: postcss@8.4.31: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 preact-render-to-string@5.2.6(preact@10.24.1): @@ -5915,25 +5153,8 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.4 - regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -5957,7 +5178,7 @@ snapshots: resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5973,13 +5194,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -5995,12 +5209,6 @@ snapshots: es-errors: 1.3.0 isarray: 2.0.5 - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 @@ -6013,18 +5221,15 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} - - semver@7.7.3: - optional: true + semver@7.7.3: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -6098,13 +5303,6 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 - side-channel@1.1.0: dependencies: es-errors: 1.3.0 @@ -6123,10 +5321,6 @@ snapshots: source-map@0.5.7: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -6135,27 +5329,27 @@ snapshots: string.prototype.includes@2.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 string.prototype.matchall@4.0.11: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -6167,25 +5361,18 @@ snapshots: es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@1.3.0: dependencies: @@ -6199,12 +5386,10 @@ snapshots: strip-json-comments@3.1.1: {} - styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.1): + styled-jsx@5.1.6(react@19.2.1): dependencies: client-only: 0.0.1 react: 19.2.1 - optionalDependencies: - '@babel/core': 7.28.5 stylis@4.2.0: {} @@ -6250,91 +5435,41 @@ snapshots: type-fest@0.20.2: {} - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.6 - - typescript-eslint@8.48.1(eslint@8.57.1)(typescript@5.6.2): - dependencies: - '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.2) - '@typescript-eslint/utils': 8.48.1(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color + reflect.getprototypeof: 1.0.10 typescript@5.6.2: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -6354,12 +5489,6 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 - update-browserslist-db@1.2.2(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 - uqr@0.1.2: {} uri-js@4.4.1: @@ -6376,14 +5505,6 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -6392,21 +5513,6 @@ snapshots: is-string: 1.1.1 is-symbol: 1.1.1 - which-builtin-type@1.1.4: - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 @@ -6430,14 +5536,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 @@ -6456,8 +5554,6 @@ snapshots: wrappy@1.0.2: {} - yallist@3.1.1: {} - yallist@4.0.0: {} yaml@1.10.2: {} @@ -6465,9 +5561,3 @@ snapshots: yocto-queue@0.1.0: {} yoga-layout@3.2.1: {} - - zod-validation-error@4.0.2(zod@4.1.13): - dependencies: - zod: 4.1.13 - - zod@4.1.13: {} diff --git a/src/app/[locale]/admin/organizations/create/page.tsx b/src/app/[locale]/admin/organizations/create/page.tsx index 4438113..743f924 100644 --- a/src/app/[locale]/admin/organizations/create/page.tsx +++ b/src/app/[locale]/admin/organizations/create/page.tsx @@ -38,7 +38,7 @@ export default async function Page(props: { Create Organization - + ); } diff --git a/tsconfig.json b/tsconfig.json index 877b650..53c6f65 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "react-jsx", + "jsx": "preserve", "incremental": true, "plugins": [ { From 6c6c86486b7730eea6b854bd82ec5b2d46cc94e6 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Tue, 23 Dec 2025 01:30:14 +0100 Subject: [PATCH 12/35] Add note about bank accounts being shared for now --- .../bank-accounts/add-account/page.tsx | 7 +++--- .../[orgId]/bank-accounts/connect/page.tsx | 16 ++++++++----- .../bank-accounts/finalize-connect/page.tsx | 5 +--- .../bank-accounts/finalize-reconnect/page.tsx | 1 - .../org/[orgId]/bank-accounts/page.tsx | 23 +++++++++++-------- .../bank-accounts/permissions/page.tsx | 5 ++-- .../[orgId]/bank-accounts/reconnect/page.tsx | 7 +++--- .../[orgId]/bank-accounts/settings/page.tsx | 5 ++-- 8 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx index 347f54d..2f4f243 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx @@ -42,10 +42,9 @@ export default async function Page(props: { {l.home.title} - {/* TODO: Use routing to determine org id dynamically */} - - {l.bankAccounts.title} - + + {l.bankAccounts.title} + Add Bank Account diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx index 9b34773..b2ab33a 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx @@ -26,7 +26,9 @@ export default async function Page(props: { const requisitions = (await GoCardlessService.getRequisitions()).results; const institutions = await GoCardlessService.getInstitutions(); const unusedRequisitions = requisitions.filter( - (r) => !localRequisitions.find((lr) => lr.goCardlessId === r.id) && r.status !== 'EX' + (r) => + !localRequisitions.find((lr) => lr.goCardlessId === r.id) && + r.status !== 'EX' ); return ( @@ -35,10 +37,9 @@ export default async function Page(props: { {l.home.title} - {/* TODO: Use routing to determine org id dynamically */} - - {l.bankAccounts.title} - + + {l.bankAccounts.title} + Add Connection @@ -46,7 +47,10 @@ export default async function Page(props: { Add Connection - + ); } diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx index 1004eba..ef880b3 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx @@ -27,9 +27,7 @@ export default async function Page(props: { if (error) { redirect( - `/org/${orgId}/bank-accounts/connect?error=${encodeURIComponent( - error - )}` + `/org/${orgId}/bank-accounts/connect?error=${encodeURIComponent(error)}` ); } @@ -61,7 +59,6 @@ export default async function Page(props: { {l.home.title} - {/* TODO: Use routing to determine org id dynamically */} {l.bankAccounts.title} diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx index fcd4774..ff1ee48 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx @@ -60,7 +60,6 @@ export default async function Page(props: { {l.home.title} - {/* TODO: Use routing to determine org id dynamically */} {l.bankAccounts.title} diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx index 306bdb0..b549383 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx @@ -1,4 +1,4 @@ -import { Box, Flex, Heading, Text, VStack } from '@chakra-ui/react'; +import { Box, Flex, Heading, Icon, Text, VStack } from '@chakra-ui/react'; import { BreadcrumbCurrentLink, BreadcrumbLink, @@ -50,6 +50,9 @@ export default async function Page(props: { + + Note! Bank accounts are currently shared between every organization. + @@ -60,17 +63,17 @@ export default async function Page(props: { Total Available Balance - - - {new Intl.NumberFormat('sv-SE').format(totalAvailable)} - - - Booked: {new Intl.NumberFormat('sv-SE').format(totalBooked)} - - + + + {new Intl.NumberFormat('sv-SE').format(totalAvailable)} + + + Booked: {new Intl.NumberFormat('sv-SE').format(totalBooked)} + + - {l.home.title} - {/* TODO: Use routing to determine org id dynamically */} {l.bankAccounts.title} @@ -47,8 +46,8 @@ export default async function Page(props: { Manage Bank Account Permissions - diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx index 83bc041..a8e6f36 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx @@ -39,10 +39,9 @@ export default async function Page(props: { {l.home.title} - {/* TODO: Use routing to determine org id dynamically */} - - {l.bankAccounts.title} - + + {l.bankAccounts.title} + Reconnect Accounts diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx index d1562a5..e8cbb8b 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx @@ -35,7 +35,6 @@ export default async function Page(props: { {l.home.title} - {/* TODO: Use routing to determine org id dynamically */} {l.bankAccounts.title} @@ -47,8 +46,8 @@ export default async function Page(props: { Bank Account Settings - From 3982a81779c0709a2f04f0cdb0c3d749b03c6227 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Tue, 23 Dec 2025 01:52:45 +0100 Subject: [PATCH 13/35] Don't default orgId in CRUD --- src/actions/expenses.ts | 6 ++++-- src/actions/invoices.ts | 6 ++++-- src/actions/nameLists.ts | 6 ++++-- src/actions/zettleSales.ts | 3 ++- .../expenses/create/CreateExpenseForm.tsx | 8 ++++++-- .../org/[orgId]/expenses/create/page.tsx | 13 ++++++++++--- .../invoices/create/SendInvoiceForm.tsx | 8 ++++++-- .../org/[orgId]/invoices/create/page.tsx | 18 +++++++++++++++--- .../org/[orgId]/invoices/view/page.tsx | 11 +++++++++-- .../name-lists/create/CreateNameListForm.tsx | 8 ++++++-- .../org/[orgId]/name-lists/create/page.tsx | 12 ++++++++++-- .../org/[orgId]/name-lists/view/page.tsx | 11 +++++++++-- .../create/CreateZettleSaleForm.tsx | 10 ++++++---- .../org/[orgId]/zettle-sales/create/page.tsx | 13 ++++++++++--- .../org/[orgId]/zettle-sales/view/page.tsx | 12 +++++++++--- 15 files changed, 110 insertions(+), 35 deletions(-) diff --git a/src/actions/expenses.ts b/src/actions/expenses.ts index 875105a..a18b83a 100644 --- a/src/actions/expenses.ts +++ b/src/actions/expenses.ts @@ -20,6 +20,7 @@ export async function getExpensesForGroup(gammaSuperGroupId: string) { export async function createExpenseForGroup( gammaGroupId: string, + orgId: number, amount: number, name: string, description: string, @@ -63,7 +64,7 @@ export async function createExpenseForGroup( group.superGroup.id, gammaGroupId, gammaUserId, - 1, // TODO: Use actual organization ID when routing is implemented + orgId, amount, name, description, @@ -150,6 +151,7 @@ export async function editExpenseForGroup( } export async function createPersonalExpense( + orgId: number, amount: number, name: string, description: string, @@ -184,7 +186,7 @@ export async function createPersonalExpense( return ExpenseService.createPersonal( gammaUserId, - 1, // TODO: Use actual organization ID when routing is implemented + orgId, amount, name, description, diff --git a/src/actions/invoices.ts b/src/actions/invoices.ts index 85951b6..c8ffdb3 100644 --- a/src/actions/invoices.ts +++ b/src/actions/invoices.ts @@ -15,6 +15,7 @@ export async function getInvoicesForGroup(gammaSuperGroupId: string) { export async function createInvoiceForGroup( gammaGroupId: string, + orgId: number, name: string, customerName: string, description: string, @@ -42,7 +43,7 @@ export async function createInvoiceForGroup( group.superGroup.id, gammaGroupId, gammaUserId, - 1, // TODO: Use actual organization ID when routing is implemented + orgId, name, customerName, description, @@ -116,6 +117,7 @@ export async function editInvoiceForGroup( } export async function createPersonalInvoice( + orgId: number, name: string, customerName: string, description: string, @@ -134,7 +136,7 @@ export async function createPersonalInvoice( return InvoiceService.createPersonal( gammaUserId, - 1, // TODO: Use actual organization ID when routing is implemented + orgId, name, customerName, description, diff --git a/src/actions/nameLists.ts b/src/actions/nameLists.ts index c28ba67..331bf91 100644 --- a/src/actions/nameLists.ts +++ b/src/actions/nameLists.ts @@ -6,6 +6,7 @@ import { NameListType, Prisma } from '@prisma/client'; export async function createNameListForGroup( gammaGroupId: string, + orgId: number, name: string, type: NameListType, names: Prisma.NameListEntryCreateNestedManyWithoutNameListInput['create'], @@ -29,7 +30,7 @@ export async function createNameListForGroup( group.superGroup.id, gammaGroupId, gammaUserId, - 1, // TODO: Use actual organization ID when routing is implemented + orgId, name, type, names, @@ -40,6 +41,7 @@ export async function createNameListForGroup( } export async function createPersonalNameList( + orgId: number, name: string, type: NameListType, names: Prisma.NameListEntryCreateNestedManyWithoutNameListInput['create'], @@ -54,7 +56,7 @@ export async function createPersonalNameList( await NameListService.createPersonal( gammaUserId, - 1, // TODO: Use actual organization ID when routing is implemented + orgId, name, type, names, diff --git a/src/actions/zettleSales.ts b/src/actions/zettleSales.ts index 2292d9d..99f5b3e 100644 --- a/src/actions/zettleSales.ts +++ b/src/actions/zettleSales.ts @@ -5,6 +5,7 @@ import ZettleSaleService from '@/services/zettleSaleService'; export async function createZettleSale( gammaGroupId: string, + orgId: number, name: string, amount: number, saleDate: Date @@ -25,7 +26,7 @@ export async function createZettleSale( group.superGroup.id, gammaGroupId, gammaUserId, - 1, // TODO: Use actual organization ID when routing is implemented + orgId, name, amount, saleDate diff --git a/src/app/[locale]/org/[orgId]/expenses/create/CreateExpenseForm.tsx b/src/app/[locale]/org/[orgId]/expenses/create/CreateExpenseForm.tsx index 7196dc5..043dd1c 100644 --- a/src/app/[locale]/org/[orgId]/expenses/create/CreateExpenseForm.tsx +++ b/src/app/[locale]/org/[orgId]/expenses/create/CreateExpenseForm.tsx @@ -46,6 +46,7 @@ export default function CreateExpenseForm({ readOnly, groups, locale, + orgId, gid, e }: { @@ -53,6 +54,7 @@ export default function CreateExpenseForm({ groups: GammaGroup[]; locale: string; gid?: string; + orgId: number; e?: Prisma.ExpenseGetPayload<{ include: { receipts: true } }>; }) { const l = i18nService.getLocale(locale); @@ -114,6 +116,7 @@ export default function CreateExpenseForm({ ) : createExpenseForGroup( groupId, + orgId, +amount, name, description, @@ -121,7 +124,7 @@ export default function CreateExpenseForm({ formData, type ) - ).then(() => router.push(`/expenses`)) + ).then(() => router.push(`/org/${orgId}/expenses`)) : (editing ? editPersonalExpense( e.id, @@ -135,6 +138,7 @@ export default function CreateExpenseForm({ type ) : createPersonalExpense( + orgId, +amount, name, description, @@ -142,7 +146,7 @@ export default function CreateExpenseForm({ formData, type ) - ).then(() => router.push('/expenses')); + ).then(() => router.push(`/org/${orgId}/expenses`)); }, [ files, diff --git a/src/app/[locale]/org/[orgId]/expenses/create/page.tsx b/src/app/[locale]/org/[orgId]/expenses/create/page.tsx index 6002213..9f8f140 100644 --- a/src/app/[locale]/org/[orgId]/expenses/create/page.tsx +++ b/src/app/[locale]/org/[orgId]/expenses/create/page.tsx @@ -8,15 +8,22 @@ import SessionService from '@/services/sessionService'; import CreateExpenseForm from './CreateExpenseForm'; import Link from 'next/link'; import i18nService from '@/services/i18nService'; +import OrgService from '@/services/orgService'; +import { notFound } from 'next/navigation'; export default async function Page(props: { searchParams: Promise<{ gid?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + const groups = (await SessionService.getGroups()).map((g) => g.group); return ( @@ -31,7 +38,7 @@ export default async function Page(props: { {l.economy.create} - + ); } diff --git a/src/app/[locale]/org/[orgId]/invoices/create/SendInvoiceForm.tsx b/src/app/[locale]/org/[orgId]/invoices/create/SendInvoiceForm.tsx index 08520d3..17b1f70 100644 --- a/src/app/[locale]/org/[orgId]/invoices/create/SendInvoiceForm.tsx +++ b/src/app/[locale]/org/[orgId]/invoices/create/SendInvoiceForm.tsx @@ -74,12 +74,14 @@ export default function SendInvoiceForm({ readOnly, groups, locale, + orgId, user, i }: { readOnly?: boolean; groups: GammaGroup[]; locale: string; + orgId: number; user?: GammaUser; i?: Prisma.InvoiceGetPayload<{ include: { items: true } }>; }) { @@ -148,6 +150,7 @@ export default function SendInvoiceForm({ ) : createInvoiceForGroup( groupId, + orgId, name, customerName, comments, @@ -159,7 +162,7 @@ export default function SendInvoiceForm({ customerOrderReference, contractNumber ) - ).then(() => router.push('/invoices')) + ).then(() => router.push(`/org/${orgId}/invoices`)) : (editing ? editPersonalInvoice( i.id, @@ -175,6 +178,7 @@ export default function SendInvoiceForm({ contractNumber ) : createPersonalInvoice( + orgId, name, customerName, comments, @@ -186,7 +190,7 @@ export default function SendInvoiceForm({ customerOrderReference, contractNumber ) - ).then(() => router.push('/invoices')); + ).then(() => router.push(`/org/${orgId}/invoices`)); }, [ comments, diff --git a/src/app/[locale]/org/[orgId]/invoices/create/page.tsx b/src/app/[locale]/org/[orgId]/invoices/create/page.tsx index 586ecf2..c85a742 100644 --- a/src/app/[locale]/org/[orgId]/invoices/create/page.tsx +++ b/src/app/[locale]/org/[orgId]/invoices/create/page.tsx @@ -8,19 +8,26 @@ import { import { Box } from '@chakra-ui/react'; import SendInvoiceForm from './SendInvoiceForm'; import i18nService from '@/services/i18nService'; +import OrgService from '@/services/orgService'; +import { notFound } from 'next/navigation'; export default async function Page(props: { searchParams: Promise<{ gid?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { const { gid } = await props.searchParams; - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const user = (await SessionService.getGammaUser())?.user; const groups = await SessionService.getActiveGroups(); + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + return ( <> @@ -33,7 +40,12 @@ export default async function Page(props: { {l.economy.create} - + ); } diff --git a/src/app/[locale]/org/[orgId]/invoices/view/page.tsx b/src/app/[locale]/org/[orgId]/invoices/view/page.tsx index 7bdf9ea..7ac8e10 100644 --- a/src/app/[locale]/org/[orgId]/invoices/view/page.tsx +++ b/src/app/[locale]/org/[orgId]/invoices/view/page.tsx @@ -10,12 +10,13 @@ import { Box } from '@chakra-ui/react'; import InvoiceService from '@/services/invoiceService'; import SendInvoiceForm from '../create/SendInvoiceForm'; import i18nService from '@/services/i18nService'; +import OrgService from '@/services/orgService'; export default async function Page(props: { searchParams: Promise<{ id?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const { id } = await props.searchParams; @@ -46,6 +47,11 @@ export default async function Page(props: { const groups = (await SessionService.getGroups()).map((g) => g.group); + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + return ( <> @@ -63,6 +69,7 @@ export default async function Page(props: { groups={groups} i={invoice} locale={locale} + orgId={org.id} user={user} /> diff --git a/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx b/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx index 70b2bab..8868be5 100644 --- a/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx +++ b/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx @@ -68,11 +68,13 @@ export default function CreateNameListForm({ superGroups, nl, groups, + orgId, locale }: { superGroups: { members: GammaGroupMember[]; superGroup: GammaSuperGroup }[]; nl?: Awaited>; groups: GammaGroup[]; + orgId: number; locale: string; }) { const l = i18nService.getLocale(locale); @@ -164,21 +166,23 @@ export default function CreateNameListForm({ : groupId !== '' && groupId !== undefined ? createNameListForGroup( groupId, + orgId, name, type, customNames, gammaNames, trackIndividual, new Date(date) - ).then(() => router.push('/name-lists')) + ).then(() => router.push(`/org/${orgId}/name-lists`)) : createPersonalNameList( + orgId, name, type, customNames, gammaNames, trackIndividual, new Date(date) - ).then(() => router.push('/name-lists')); + ).then(() => router.push(`/org/${orgId}/name-lists`)); }, [ edited, diff --git a/src/app/[locale]/org/[orgId]/name-lists/create/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/create/page.tsx index d3e6f8c..f90a7d7 100644 --- a/src/app/[locale]/org/[orgId]/name-lists/create/page.tsx +++ b/src/app/[locale]/org/[orgId]/name-lists/create/page.tsx @@ -9,18 +9,25 @@ import CreateNameListForm from './CreateNameListForm'; import Link from 'next/link'; import GammaService from '@/services/gammaService'; import i18nService from '@/services/i18nService'; +import OrgService from '@/services/orgService'; +import { notFound } from 'next/navigation'; export default async function Page(props: { searchParams: Promise<{ gid?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const superGroups = await GammaService.getAllSuperGroups(); const groups = (await SessionService.getGroups()).map((g) => g.group); + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + return ( <> @@ -37,6 +44,7 @@ export default async function Page(props: { groups={groups} superGroups={superGroups} locale={locale} + orgId={org.id} /> ); diff --git a/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx index ffcc60f..4779a85 100644 --- a/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx +++ b/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx @@ -11,12 +11,13 @@ import NameListService from '@/services/nameListService'; import SessionService from '@/services/sessionService'; import GammaService from '@/services/gammaService'; import CreateNameListForm from '../create/CreateNameListForm'; +import OrgService from '@/services/orgService'; export default async function Page(props: { searchParams: Promise<{ id?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const { id } = await props.searchParams; @@ -50,6 +51,11 @@ export default async function Page(props: { const superGroups = await GammaService.getAllSuperGroups(); const groups = (await SessionService.getGroups()).map((g) => g.group); + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + return ( <> @@ -66,6 +72,7 @@ export default async function Page(props: { superGroups={superGroups} groups={groups} locale={locale} + orgId={org.id} nl={nameList} /> diff --git a/src/app/[locale]/org/[orgId]/zettle-sales/create/CreateZettleSaleForm.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/create/CreateZettleSaleForm.tsx index 2572aba..ac59a48 100644 --- a/src/app/[locale]/org/[orgId]/zettle-sales/create/CreateZettleSaleForm.tsx +++ b/src/app/[locale]/org/[orgId]/zettle-sales/create/CreateZettleSaleForm.tsx @@ -27,10 +27,12 @@ import { export default function CreateZettleSaleForm({ groups, locale, + orgId, s }: { groups: GammaGroup[]; locale: string; + orgId: number; s?: Awaited>; }) { const l = i18nService.getLocale(locale); @@ -57,13 +59,13 @@ export default function CreateZettleSaleForm({ if (s) { await editZettleSale(s.id, name, +amount, new Date(date)); - router.push('/zettle-sales'); + router.push(`/org/${orgId}/zettle-sales`); } else if (groupId !== undefined) { - await createZettleSale(groupId, name, +amount, new Date(date)); - router.push('/zettle-sales'); + await createZettleSale(groupId, orgId, name, +amount, new Date(date)); + router.push(`/org/${orgId}/zettle-sales`); } }, - [amount, date, groupId, name, router, s] + [amount, date, groupId, name, orgId, router, s] ); return ( diff --git a/src/app/[locale]/org/[orgId]/zettle-sales/create/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/create/page.tsx index 0159c44..92e9c0b 100644 --- a/src/app/[locale]/org/[orgId]/zettle-sales/create/page.tsx +++ b/src/app/[locale]/org/[orgId]/zettle-sales/create/page.tsx @@ -8,16 +8,23 @@ import SessionService from '@/services/sessionService'; import Link from 'next/link'; import i18nService from '@/services/i18nService'; import CreateZettleSaleForm from './CreateZettleSaleForm'; +import OrgService from '@/services/orgService'; +import { notFound } from 'next/navigation'; export default async function Page(props: { searchParams: Promise<{ gid?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const groups = (await SessionService.getGroups()).map((g) => g.group); + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + return ( <> @@ -30,7 +37,7 @@ export default async function Page(props: { {l.zettleSales.create} - + ); } diff --git a/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx index 4b40170..fe97fe5 100644 --- a/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx +++ b/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx @@ -10,12 +10,13 @@ import i18nService from '@/services/i18nService'; import CreateZettleSaleForm from '../create/CreateZettleSaleForm'; import ZettleSaleService from '@/services/zettleSaleService'; import SessionService from '@/services/sessionService'; +import OrgService from '@/services/orgService'; export default async function Page(props: { searchParams: Promise<{ id?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const { id } = await props.searchParams; @@ -30,6 +31,11 @@ export default async function Page(props: { const groups = (await SessionService.getGroups()).map((g) => g.group); + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + return ( <> @@ -42,7 +48,7 @@ export default async function Page(props: { {l.general.edit} - + ); } From 4604a5c8ba67c5635085f5970fc3c6b7ac9abe3f Mon Sep 17 00:00:00 2001 From: Goostaf Date: Tue, 23 Dec 2025 16:57:59 +0100 Subject: [PATCH 14/35] Handle orgId parameter in navigation --- .../bank-accounts/AddPermissionForm.tsx | 0 .../bank-accounts/DeleteAccountButton.tsx | 0 .../bank-accounts/DeleteRequisitionButton.tsx | 0 .../bank-accounts/RefreshAccountButton.tsx | 0 .../bank-accounts/RequisitionsList.tsx | 0 .../bank-accounts/UpdateAccountsButton.tsx | 0 .../add-account/AddAccountForm.tsx | 0 .../bank-accounts/add-account/page.tsx | 0 .../connect/AddRequisitionForm.tsx | 0 .../[orgId]/bank-accounts/connect/page.tsx | 0 .../bank-accounts/finalize-connect/page.tsx | 0 .../bank-accounts/finalize-reconnect/page.tsx | 0 .../org/[orgId]/bank-accounts/page.tsx | 0 .../bank-accounts/permissions/page.tsx | 0 .../reconnect/RecreateRequisitionButton.tsx | 0 .../[orgId]/bank-accounts/reconnect/page.tsx | 0 .../[orgId]/bank-accounts/settings/page.tsx | 0 .../org/[orgId]/bank-accounts/view/page.tsx | 0 .../expenses/create/CreateExpenseForm.tsx | 0 .../org/[orgId]/expenses/create/page.tsx | 0 .../{ => (org)}/org/[orgId]/expenses/page.tsx | 0 .../expenses/view/ForwardExpenseForm.tsx | 0 .../org/[orgId]/expenses/view/page.tsx | 0 .../invoices/create/SendInvoiceForm.tsx | 0 .../org/[orgId]/invoices/create/page.tsx | 0 .../{ => (org)}/org/[orgId]/invoices/page.tsx | 0 .../org/[orgId]/invoices/view/page.tsx | 0 src/app/[locale]/(org)/org/[orgId]/layout.tsx | 91 +++++++++++++++++++ .../name-lists/create/CreateNameListForm.tsx | 0 .../org/[orgId]/name-lists/create/page.tsx | 0 .../org/[orgId]/name-lists/page.tsx | 0 .../org/[orgId]/name-lists/view/page.tsx | 0 .../[locale]/{ => (org)}/org/[orgId]/page.css | 0 .../[locale]/{ => (org)}/org/[orgId]/page.tsx | 10 +- .../settings/OrganizationSettingsForm.tsx | 0 .../{ => (org)}/org/[orgId]/settings/page.tsx | 0 .../create/CreateZettleSaleForm.tsx | 0 .../org/[orgId]/zettle-sales/create/page.tsx | 0 .../org/[orgId]/zettle-sales/page.tsx | 0 .../org/[orgId]/zettle-sales/view/page.tsx | 0 src/app/[locale]/{ => (orgless)}/layout.tsx | 15 +-- .../[locale]/{ => (orgless)}/not-found.tsx | 0 .../organizations/OrganizationForm.tsx | 0 .../organizations/OrganizationsTable.tsx | 0 .../organizations/[id]/edit/page.tsx | 0 .../organizations/[id]/page.tsx | 0 .../organizations/create/page.tsx | 0 .../organizations/page.tsx | 0 src/app/[locale]/{ => (orgless)}/page.tsx | 0 .../receipt-creator/ReceiptCreateForm.tsx | 0 .../{ => (orgless)}/receipt-creator/page.tsx | 0 .../user-settings/UserSettingsForm.tsx | 0 .../{ => (orgless)}/user-settings/page.tsx | 0 src/app/[locale]/org/[orgId]/layout.tsx | 18 ---- src/components/Header/Header.tsx | 3 +- src/components/Navigation/Navigation.tsx | 72 ++++++++------- .../Navigation/OrganizationSelector.tsx | 12 +-- src/components/ReceiptPdf/ReceiptPdf.tsx | 2 +- 58 files changed, 151 insertions(+), 72 deletions(-) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/AddPermissionForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/DeleteAccountButton.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/RefreshAccountButton.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/RequisitionsList.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/add-account/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/connect/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/finalize-connect/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/permissions/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/reconnect/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/settings/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/bank-accounts/view/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/expenses/create/CreateExpenseForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/expenses/create/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/expenses/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/expenses/view/ForwardExpenseForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/expenses/view/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/invoices/create/SendInvoiceForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/invoices/create/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/invoices/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/invoices/view/page.tsx (100%) create mode 100644 src/app/[locale]/(org)/org/[orgId]/layout.tsx rename src/app/[locale]/{ => (org)}/org/[orgId]/name-lists/create/CreateNameListForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/name-lists/create/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/name-lists/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/name-lists/view/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/page.css (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/page.tsx (96%) rename src/app/[locale]/{ => (org)}/org/[orgId]/settings/OrganizationSettingsForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/settings/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/zettle-sales/create/CreateZettleSaleForm.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/zettle-sales/create/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/zettle-sales/page.tsx (100%) rename src/app/[locale]/{ => (org)}/org/[orgId]/zettle-sales/view/page.tsx (100%) rename src/app/[locale]/{ => (orgless)}/layout.tsx (83%) rename src/app/[locale]/{ => (orgless)}/not-found.tsx (100%) rename src/app/[locale]/{admin => (orgless)}/organizations/OrganizationForm.tsx (100%) rename src/app/[locale]/{admin => (orgless)}/organizations/OrganizationsTable.tsx (100%) rename src/app/[locale]/{admin => (orgless)}/organizations/[id]/edit/page.tsx (100%) rename src/app/[locale]/{admin => (orgless)}/organizations/[id]/page.tsx (100%) rename src/app/[locale]/{admin => (orgless)}/organizations/create/page.tsx (100%) rename src/app/[locale]/{admin => (orgless)}/organizations/page.tsx (100%) rename src/app/[locale]/{ => (orgless)}/page.tsx (100%) rename src/app/[locale]/{ => (orgless)}/receipt-creator/ReceiptCreateForm.tsx (100%) rename src/app/[locale]/{ => (orgless)}/receipt-creator/page.tsx (100%) rename src/app/[locale]/{ => (orgless)}/user-settings/UserSettingsForm.tsx (100%) rename src/app/[locale]/{ => (orgless)}/user-settings/page.tsx (100%) delete mode 100644 src/app/[locale]/org/[orgId]/layout.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/AddPermissionForm.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/AddPermissionForm.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/AddPermissionForm.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/AddPermissionForm.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/DeleteAccountButton.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/DeleteAccountButton.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/DeleteAccountButton.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/DeleteAccountButton.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/RefreshAccountButton.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/RefreshAccountButton.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/RefreshAccountButton.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/RefreshAccountButton.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/RequisitionsList.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/RequisitionsList.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/permissions/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/permissions/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/view/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/bank-accounts/view/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/bank-accounts/view/page.tsx diff --git a/src/app/[locale]/org/[orgId]/expenses/create/CreateExpenseForm.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/expenses/create/CreateExpenseForm.tsx rename to src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx diff --git a/src/app/[locale]/org/[orgId]/expenses/create/page.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/create/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/expenses/create/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/expenses/create/page.tsx diff --git a/src/app/[locale]/org/[orgId]/expenses/page.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/expenses/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/expenses/page.tsx diff --git a/src/app/[locale]/org/[orgId]/expenses/view/ForwardExpenseForm.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/view/ForwardExpenseForm.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/expenses/view/ForwardExpenseForm.tsx rename to src/app/[locale]/(org)/org/[orgId]/expenses/view/ForwardExpenseForm.tsx diff --git a/src/app/[locale]/org/[orgId]/expenses/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/expenses/view/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx diff --git a/src/app/[locale]/org/[orgId]/invoices/create/SendInvoiceForm.tsx b/src/app/[locale]/(org)/org/[orgId]/invoices/create/SendInvoiceForm.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/invoices/create/SendInvoiceForm.tsx rename to src/app/[locale]/(org)/org/[orgId]/invoices/create/SendInvoiceForm.tsx diff --git a/src/app/[locale]/org/[orgId]/invoices/create/page.tsx b/src/app/[locale]/(org)/org/[orgId]/invoices/create/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/invoices/create/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/invoices/create/page.tsx diff --git a/src/app/[locale]/org/[orgId]/invoices/page.tsx b/src/app/[locale]/(org)/org/[orgId]/invoices/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/invoices/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/invoices/page.tsx diff --git a/src/app/[locale]/org/[orgId]/invoices/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/invoices/view/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/invoices/view/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/invoices/view/page.tsx diff --git a/src/app/[locale]/(org)/org/[orgId]/layout.tsx b/src/app/[locale]/(org)/org/[orgId]/layout.tsx new file mode 100644 index 0000000..2a1bb9c --- /dev/null +++ b/src/app/[locale]/(org)/org/[orgId]/layout.tsx @@ -0,0 +1,91 @@ +import { notFound } from 'next/navigation'; + +//import localFont from 'next/font/local'; +//import './globals.css'; +import Header from '@/components/Header/Header'; +import { Box, Container, Flex, Heading, Text } from '@chakra-ui/react'; +import { Metadata } from 'next'; +import SessionService from '@/services/sessionService'; +import i18nService from '@/services/i18nService'; +import Navigation from '@/components/Navigation/Navigation'; + +/*const geistSans = localFont({ + src: '../fonts/GeistVF.woff', + variable: '--font-geist-sans', + weight: '100 900' +}); +const geistMono = localFont({ + src: '../fonts/GeistMonoVF.woff', + variable: '--font-geist-mono', + weight: '100 900' +});*/ + +export const metadata: Metadata = { + title: 'CashIT', + description: 'Economics management system for the IT student division' +}; + +export default async function RootLayout({ + params, + children +}: Readonly<{ + children: React.ReactNode; + params: Promise<{ locale: string; orgId?: string }>; +}>) { + const { locale, orgId } = await params; + + // Check if orgId is a positive integer + if (orgId === "" || isNaN(Number(orgId)) || Number(orgId) < 0) { + notFound(); + } + + const user = await SessionService.getUser(); + const orgIdNumber = orgId !== undefined ? parseInt(orgId, 10) : undefined; + + return ( + <> +
+ {user ? ( + + {children} + + ) : ( + + )} + + ); +} + +const LoggedIn = ({ + children, + locale, + orgId +}: Readonly<{ children: React.ReactNode; locale: string; orgId?: number }>) => { + return ( + + + + + + {children} + + + ); +}; + +const NotLoggedIn = ({ locale }: { locale: string }) => { + const l = i18nService.getLocale(locale); + return ( + + {l.account.notLoggedIn} + {l.account.notLoggedInDesc} + + ); +}; diff --git a/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx b/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx rename to src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx diff --git a/src/app/[locale]/org/[orgId]/name-lists/create/page.tsx b/src/app/[locale]/(org)/org/[orgId]/name-lists/create/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/name-lists/create/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/name-lists/create/page.tsx diff --git a/src/app/[locale]/org/[orgId]/name-lists/page.tsx b/src/app/[locale]/(org)/org/[orgId]/name-lists/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/name-lists/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/name-lists/page.tsx diff --git a/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/name-lists/view/page.tsx similarity index 100% rename from src/app/[locale]/org/[orgId]/name-lists/view/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/name-lists/view/page.tsx diff --git a/src/app/[locale]/org/[orgId]/page.css b/src/app/[locale]/(org)/org/[orgId]/page.css similarity index 100% rename from src/app/[locale]/org/[orgId]/page.css rename to src/app/[locale]/(org)/org/[orgId]/page.css diff --git a/src/app/[locale]/org/[orgId]/page.tsx b/src/app/[locale]/(org)/org/[orgId]/page.tsx similarity index 96% rename from src/app/[locale]/org/[orgId]/page.tsx rename to src/app/[locale]/(org)/org/[orgId]/page.tsx index 88894db..dc53e2c 100644 --- a/src/app/[locale]/org/[orgId]/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/page.tsx @@ -51,14 +51,18 @@ export default async function Home(props: { return ( - + Welcome to CashIT! + + {organization.name} + - This service is in beta and is subject to change. Please report any - bugs or issues to Goose or on{' '} + This service is in beta and is subject to change. Please report any bugs or + issues to Goose or on{' '} ) { const { locale } = await params; const user = await SessionService.getUser(); - // TODO: Get orgId from user preferences or session - const orgId = 1; return ( <> -
+
{user ? ( - - {children} - + {children} ) : ( )} @@ -51,9 +47,8 @@ export default async function RootLayout({ const LoggedIn = ({ children, - locale, - orgId -}: Readonly<{ children: React.ReactNode; locale: string; orgId: number }>) => { + locale +}: Readonly<{ children: React.ReactNode; locale: string; }>) => { return ( - + {children} diff --git a/src/app/[locale]/not-found.tsx b/src/app/[locale]/(orgless)/not-found.tsx similarity index 100% rename from src/app/[locale]/not-found.tsx rename to src/app/[locale]/(orgless)/not-found.tsx diff --git a/src/app/[locale]/admin/organizations/OrganizationForm.tsx b/src/app/[locale]/(orgless)/organizations/OrganizationForm.tsx similarity index 100% rename from src/app/[locale]/admin/organizations/OrganizationForm.tsx rename to src/app/[locale]/(orgless)/organizations/OrganizationForm.tsx diff --git a/src/app/[locale]/admin/organizations/OrganizationsTable.tsx b/src/app/[locale]/(orgless)/organizations/OrganizationsTable.tsx similarity index 100% rename from src/app/[locale]/admin/organizations/OrganizationsTable.tsx rename to src/app/[locale]/(orgless)/organizations/OrganizationsTable.tsx diff --git a/src/app/[locale]/admin/organizations/[id]/edit/page.tsx b/src/app/[locale]/(orgless)/organizations/[id]/edit/page.tsx similarity index 100% rename from src/app/[locale]/admin/organizations/[id]/edit/page.tsx rename to src/app/[locale]/(orgless)/organizations/[id]/edit/page.tsx diff --git a/src/app/[locale]/admin/organizations/[id]/page.tsx b/src/app/[locale]/(orgless)/organizations/[id]/page.tsx similarity index 100% rename from src/app/[locale]/admin/organizations/[id]/page.tsx rename to src/app/[locale]/(orgless)/organizations/[id]/page.tsx diff --git a/src/app/[locale]/admin/organizations/create/page.tsx b/src/app/[locale]/(orgless)/organizations/create/page.tsx similarity index 100% rename from src/app/[locale]/admin/organizations/create/page.tsx rename to src/app/[locale]/(orgless)/organizations/create/page.tsx diff --git a/src/app/[locale]/admin/organizations/page.tsx b/src/app/[locale]/(orgless)/organizations/page.tsx similarity index 100% rename from src/app/[locale]/admin/organizations/page.tsx rename to src/app/[locale]/(orgless)/organizations/page.tsx diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/(orgless)/page.tsx similarity index 100% rename from src/app/[locale]/page.tsx rename to src/app/[locale]/(orgless)/page.tsx diff --git a/src/app/[locale]/receipt-creator/ReceiptCreateForm.tsx b/src/app/[locale]/(orgless)/receipt-creator/ReceiptCreateForm.tsx similarity index 100% rename from src/app/[locale]/receipt-creator/ReceiptCreateForm.tsx rename to src/app/[locale]/(orgless)/receipt-creator/ReceiptCreateForm.tsx diff --git a/src/app/[locale]/receipt-creator/page.tsx b/src/app/[locale]/(orgless)/receipt-creator/page.tsx similarity index 100% rename from src/app/[locale]/receipt-creator/page.tsx rename to src/app/[locale]/(orgless)/receipt-creator/page.tsx diff --git a/src/app/[locale]/user-settings/UserSettingsForm.tsx b/src/app/[locale]/(orgless)/user-settings/UserSettingsForm.tsx similarity index 100% rename from src/app/[locale]/user-settings/UserSettingsForm.tsx rename to src/app/[locale]/(orgless)/user-settings/UserSettingsForm.tsx diff --git a/src/app/[locale]/user-settings/page.tsx b/src/app/[locale]/(orgless)/user-settings/page.tsx similarity index 100% rename from src/app/[locale]/user-settings/page.tsx rename to src/app/[locale]/(orgless)/user-settings/page.tsx diff --git a/src/app/[locale]/org/[orgId]/layout.tsx b/src/app/[locale]/org/[orgId]/layout.tsx deleted file mode 100644 index 67b118b..0000000 --- a/src/app/[locale]/org/[orgId]/layout.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { notFound } from 'next/navigation'; - -export default async function RootLayout({ - params, - children -}: Readonly<{ - children: React.ReactNode; - params: Promise<{ orgId: string }>; -}>) { - const { orgId } = await params; - - // Check if orgId is a positive integer - if (orgId === "" || isNaN(Number(orgId)) || Number(orgId) < 0) { - notFound(); - } - - return children; -} diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index bba196a..4f1af5d 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -22,6 +22,7 @@ const Header = async ({ orgId?: number; }) => { const user = await SessionService.getUser(); + const orgPrefix = orgId !== undefined ? `/org/${orgId}` : '/'; return ( - CashIT + CashIT beta v0.6.0 diff --git a/src/components/Navigation/Navigation.tsx b/src/components/Navigation/Navigation.tsx index dc62de0..f8d40c0 100644 --- a/src/components/Navigation/Navigation.tsx +++ b/src/components/Navigation/Navigation.tsx @@ -16,7 +16,7 @@ import OrgService from '@/services/orgService'; const Navigation = async ({ locale, - orgId = 1, + orgId, inDrawer = false }: { locale: string; @@ -27,6 +27,8 @@ const Navigation = async ({ const divisionTreasurer = await SessionService.isDivisionTreasurer(); const organizations = await OrgService.getAll(); + const orgPrefix = orgId !== undefined ? `/org/${orgId}` : '/'; + return ( - + {' '} {l.home.title} - - - {l.categories.accounting} - - + {orgId !== undefined && ( + <> + + + {l.categories.accounting} + + - - - - {' '} - {l.categories.expenses} - - - - - {' '} - {l.categories.invoices} - - - - - {' '} - {l.home.zettleSales} - - - - - {' '} - {l.categories.nameLists} - + + + + {' '} + {l.categories.expenses} + + + + + {' '} + {l.categories.invoices} + + + + + {' '} + {l.home.zettleSales} + + + + + {' '} + {l.categories.nameLists} + + + )} @@ -79,8 +85,8 @@ const Navigation = async ({ - {divisionTreasurer && ( - + {divisionTreasurer && orgId !== undefined && ( + {' '} diff --git a/src/components/Navigation/OrganizationSelector.tsx b/src/components/Navigation/OrganizationSelector.tsx index b6f9e4a..8828548 100644 --- a/src/components/Navigation/OrganizationSelector.tsx +++ b/src/components/Navigation/OrganizationSelector.tsx @@ -25,14 +25,14 @@ const OrganizationSelector = ({ const router = useRouter(); const l = i18nService.getLocale(locale); - - const frameworks = createListCollection({ + + const orgsCollection = createListCollection({ items: orgs.map((org) => ({ label: org.name, value: org.id.toString() })) }); return ( { if (value?.[0] !== undefined) router.push(`/org/${value[0]}`); }} @@ -69,8 +69,8 @@ const OrganizationSelector = ({ - {frameworks.items.map((item) => ( - + {orgsCollection.items.map((item) => ( + {item.label} ))} diff --git a/src/components/ReceiptPdf/ReceiptPdf.tsx b/src/components/ReceiptPdf/ReceiptPdf.tsx index c5c5bbb..f4ccd43 100644 --- a/src/components/ReceiptPdf/ReceiptPdf.tsx +++ b/src/components/ReceiptPdf/ReceiptPdf.tsx @@ -1,7 +1,7 @@ import { FormInvoiceItem, formToInvoiceItem -} from '@/app/[locale]/receipt-creator/ReceiptCreateForm'; +} from '@/app/[locale]/(orgless)/receipt-creator/ReceiptCreateForm'; import i18nService from '@/services/i18nService'; import InvoiceService from '@/services/invoiceService'; import { InvoiceItemVat } from '@prisma/client'; From a122b033a9208cdea2f8267ed131dc1c23b7f5b7 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Tue, 23 Dec 2025 21:47:18 +0100 Subject: [PATCH 15/35] Place admin route correctly, add manual notifs --- src/actions/notifications.ts | 13 ++++++ .../SendEmailNotificationsButton.tsx | 18 ++++++++ .../admin/email-notifications/page.tsx | 46 +++++++++++++++++++ .../organizations/OrganizationForm.tsx | 0 .../organizations/OrganizationsTable.tsx | 0 .../organizations/[id]/edit/page.tsx | 0 .../{ => admin}/organizations/[id]/page.tsx | 0 .../{ => admin}/organizations/create/page.tsx | 0 .../{ => admin}/organizations/page.tsx | 0 src/components/Navigation/Navigation.tsx | 9 +++- 10 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/actions/notifications.ts create mode 100644 src/app/[locale]/(orgless)/admin/email-notifications/SendEmailNotificationsButton.tsx create mode 100644 src/app/[locale]/(orgless)/admin/email-notifications/page.tsx rename src/app/[locale]/(orgless)/{ => admin}/organizations/OrganizationForm.tsx (100%) rename src/app/[locale]/(orgless)/{ => admin}/organizations/OrganizationsTable.tsx (100%) rename src/app/[locale]/(orgless)/{ => admin}/organizations/[id]/edit/page.tsx (100%) rename src/app/[locale]/(orgless)/{ => admin}/organizations/[id]/page.tsx (100%) rename src/app/[locale]/(orgless)/{ => admin}/organizations/create/page.tsx (100%) rename src/app/[locale]/(orgless)/{ => admin}/organizations/page.tsx (100%) diff --git a/src/actions/notifications.ts b/src/actions/notifications.ts new file mode 100644 index 0000000..c80086a --- /dev/null +++ b/src/actions/notifications.ts @@ -0,0 +1,13 @@ +'use server'; + +import MailNotificationService from '@/services/mailNotificationService'; +import SessionService from '@/services/sessionService'; + +export async function sendEmailNotificationsManually() { + const isDivisionTreasurer = await SessionService.isDivisionTreasurer(); + if (!isDivisionTreasurer) { + throw new Error('User is not a division treasurer'); + } + + await MailNotificationService.notifyNewDocuments(); +} diff --git a/src/app/[locale]/(orgless)/admin/email-notifications/SendEmailNotificationsButton.tsx b/src/app/[locale]/(orgless)/admin/email-notifications/SendEmailNotificationsButton.tsx new file mode 100644 index 0000000..c1033f1 --- /dev/null +++ b/src/app/[locale]/(orgless)/admin/email-notifications/SendEmailNotificationsButton.tsx @@ -0,0 +1,18 @@ +'use client'; + +import { HiRefresh } from 'react-icons/hi'; +import { Button } from '@chakra-ui/react'; +import { sendEmailNotificationsManually } from '@/actions/notifications'; + +const SendEmailNotificationsButton = () => { + return ( + + ); +}; + +export default SendEmailNotificationsButton; diff --git a/src/app/[locale]/(orgless)/admin/email-notifications/page.tsx b/src/app/[locale]/(orgless)/admin/email-notifications/page.tsx new file mode 100644 index 0000000..4faa30c --- /dev/null +++ b/src/app/[locale]/(orgless)/admin/email-notifications/page.tsx @@ -0,0 +1,46 @@ +import { Box, Flex, Heading, Text, VStack } from '@chakra-ui/react'; +import { + BreadcrumbCurrentLink, + BreadcrumbLink, + BreadcrumbRoot +} from '@/components/ui/breadcrumb'; +import Link from 'next/link'; +import i18nService from '@/services/i18nService'; +import SessionService from '@/services/sessionService'; +import { notFound } from 'next/navigation'; +import OrgService from '@/services/orgService'; +import { Button } from '@/components/ui/button'; +import { HiPlus } from 'react-icons/hi'; +import SendEmailNotificationsButton from './SendEmailNotificationsButton'; + +export default async function Page(props: { + params: Promise<{ locale: string }>; +}) { + const divisionTreasurer = await SessionService.isDivisionTreasurer(); + if (!divisionTreasurer) { + notFound(); + } + + const { locale } = await props.params; + const l = i18nService.getLocale(locale); + + const organizations = await OrgService.getAll(); + + return ( + <> + + + {l.home.title} + + Email Notifications + + + + + Email Notifications + + + + + ); +} diff --git a/src/app/[locale]/(orgless)/organizations/OrganizationForm.tsx b/src/app/[locale]/(orgless)/admin/organizations/OrganizationForm.tsx similarity index 100% rename from src/app/[locale]/(orgless)/organizations/OrganizationForm.tsx rename to src/app/[locale]/(orgless)/admin/organizations/OrganizationForm.tsx diff --git a/src/app/[locale]/(orgless)/organizations/OrganizationsTable.tsx b/src/app/[locale]/(orgless)/admin/organizations/OrganizationsTable.tsx similarity index 100% rename from src/app/[locale]/(orgless)/organizations/OrganizationsTable.tsx rename to src/app/[locale]/(orgless)/admin/organizations/OrganizationsTable.tsx diff --git a/src/app/[locale]/(orgless)/organizations/[id]/edit/page.tsx b/src/app/[locale]/(orgless)/admin/organizations/[id]/edit/page.tsx similarity index 100% rename from src/app/[locale]/(orgless)/organizations/[id]/edit/page.tsx rename to src/app/[locale]/(orgless)/admin/organizations/[id]/edit/page.tsx diff --git a/src/app/[locale]/(orgless)/organizations/[id]/page.tsx b/src/app/[locale]/(orgless)/admin/organizations/[id]/page.tsx similarity index 100% rename from src/app/[locale]/(orgless)/organizations/[id]/page.tsx rename to src/app/[locale]/(orgless)/admin/organizations/[id]/page.tsx diff --git a/src/app/[locale]/(orgless)/organizations/create/page.tsx b/src/app/[locale]/(orgless)/admin/organizations/create/page.tsx similarity index 100% rename from src/app/[locale]/(orgless)/organizations/create/page.tsx rename to src/app/[locale]/(orgless)/admin/organizations/create/page.tsx diff --git a/src/app/[locale]/(orgless)/organizations/page.tsx b/src/app/[locale]/(orgless)/admin/organizations/page.tsx similarity index 100% rename from src/app/[locale]/(orgless)/organizations/page.tsx rename to src/app/[locale]/(orgless)/admin/organizations/page.tsx diff --git a/src/components/Navigation/Navigation.tsx b/src/components/Navigation/Navigation.tsx index f8d40c0..5659c78 100644 --- a/src/components/Navigation/Navigation.tsx +++ b/src/components/Navigation/Navigation.tsx @@ -8,7 +8,8 @@ import { PiHouse, PiReceipt, PiUsersThree, - PiGear + PiGear, + PiEnvelope } from 'react-icons/pi'; import SessionService from '@/services/sessionService'; import OrganizationSelector from './OrganizationSelector'; @@ -113,6 +114,12 @@ const Navigation = async ({ {' '} Organizations + + + + {' '} + Notifications + )} From 9d48304ce48d421ab4124273c0fc73c75fb54bbd Mon Sep 17 00:00:00 2001 From: Goostaf Date: Tue, 23 Dec 2025 22:05:13 +0100 Subject: [PATCH 16/35] Send emails to specific groups --- src/services/mailNotificationService.ts | 112 ++++++++++++++++-------- 1 file changed, 75 insertions(+), 37 deletions(-) diff --git a/src/services/mailNotificationService.ts b/src/services/mailNotificationService.ts index ef3252e..582bd0c 100644 --- a/src/services/mailNotificationService.ts +++ b/src/services/mailNotificationService.ts @@ -1,14 +1,26 @@ import prisma from '@/prisma'; import { RequestStatus } from '@prisma/client'; import GotifyService from './gotifyService'; +import GammaService from './gammaService'; export default class MailNotificationService { static async notifyNewDocuments() { + const groups = (await GammaService.getAllSuperGroups()).filter((sg) => + ['FUNCTIONARIES', 'ALUMNI'].includes(sg.superGroup.type) + ); + const groupEmailMap = new Map(); + for (const group of groups) { + groupEmailMap.set( + group.superGroup.id, + `kassor.${group.superGroup.name}@chalmers.it` + ); + } + + console.log('Group email map:', groupEmailMap); + const expenses = await prisma.expense.findMany({ where: { - createdAt: { - gte: new Date(new Date().getTime() - 1000 * 60 * 60 * 24) - }, + createdAt: { gte: new Date(Date.now() - 24 * 60 * 60 * 1000) }, paidAt: null, status: RequestStatus.PENDING } @@ -16,50 +28,76 @@ export default class MailNotificationService { const invoices = await prisma.invoice.findMany({ where: { - createdAt: { - gte: new Date(new Date().getTime() - 1000 * 60 * 60 * 24) - }, + createdAt: { gte: new Date(Date.now() - 24 * 60 * 60 * 1000) }, sentAt: null, status: RequestStatus.PENDING } }); - if (expenses.length === 0 && invoices.length === 0) { - return; - } + if (expenses.length === 0 && invoices.length === 0) return; + + const documentsByEmail = new Map< + string, + { expenses: typeof expenses; invoices: typeof invoices } + >(); - let message = 'You have new documents to review:\n\n'; + const getEmail = (groupId: string | null) => + groupId && groupEmailMap.has(groupId) + ? groupEmailMap.get(groupId)! + : 'kassor.styrit@chalmers.it'; - if (expenses.length > 0) { - message += - expenses.length + - (expenses.length === 1 ? ' expense:\n' : ' expenses:\n'); - message += expenses - .map( - (e) => - ` - ${e.name}: ${process.env.BASE_URL}/expenses/view?id=${e.id}` - ) - .join('\n'); - message += '\n'; + for (const expense of expenses) { + const email = getEmail(expense.gammaSuperGroupId); + console.log( + `Expense with group ${expense.gammaSuperGroupId} assigned to email ${email}` + ); + if (!documentsByEmail.has(email)) + documentsByEmail.set(email, { expenses: [], invoices: [] }); + documentsByEmail.get(email)!.expenses.push(expense); } - if (invoices.length > 0) { - message += - expenses.length + - (expenses.length === 1 ? ' invoice:\n' : ' invoices:\n'); - message += invoices - .map( - (i) => - ` - ${i.name}: ${process.env.BASE_URL}/invoices/view?id=${i.id}` - ) - .join('\n'); + for (const invoice of invoices) { + const email = getEmail(invoice.gammaSuperGroupId); + if (!documentsByEmail.has(email)) + documentsByEmail.set(email, { expenses: [], invoices: [] }); + documentsByEmail.get(email)!.invoices.push(invoice); } - await GotifyService.sendMessage( - 'kassor@chalmers.it', - 'noreply.cashit@chalmers.it', - 'New documents to review', - message - ); + for (const [ + email, + { expenses: groupExpenses, invoices: groupInvoices } + ] of documentsByEmail) { + let message = 'You have new documents to review:\n\n'; + if (groupExpenses.length > 0) { + message += `${groupExpenses.length} expense${ + groupExpenses.length === 1 ? '' : 's' + }:\n`; + message += + groupExpenses + .map( + (e) => + ` - ${e.name}: ${process.env.BASE_URL}/org/${e.organizationId}/expenses/view?id=${e.id}` + ) + .join('\n') + '\n'; + } + if (groupInvoices.length > 0) { + message += `${groupInvoices.length} invoice${ + groupInvoices.length === 1 ? '' : 's' + }:\n`; + message += groupInvoices + .map( + (i) => + ` - ${i.name}: ${process.env.BASE_URL}/org/${i.organizationId}/invoices/view?id=${i.id}` + ) + .join('\n'); + } + + await GotifyService.sendMessage( + email, + 'noreply.cashit@chalmers.it', + 'New documents to review', + message + ); + } } } From 6bdad3c19e16a0962f7963961e53ee6d59c1f95c Mon Sep 17 00:00:00 2001 From: Goostaf Date: Wed, 24 Dec 2025 01:11:44 +0100 Subject: [PATCH 17/35] Display correct dates on expenses --- src/components/ExpensesTable/ExpensesTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ExpensesTable/ExpensesTable.tsx b/src/components/ExpensesTable/ExpensesTable.tsx index af12f8b..acbe51e 100644 --- a/src/components/ExpensesTable/ExpensesTable.tsx +++ b/src/components/ExpensesTable/ExpensesTable.tsx @@ -137,7 +137,7 @@ const ExpensesTable = ({ id: expense.id, description: expense.name, group: getGroupDisplayName(expense.gammaSuperGroupId), - date: expense.createdAt, + date: expense.occurredAt, type: ExpenseTypeText({ type: expense.type, locale From 5dcf78cca918841945cbfc0b8f04fef535e31470 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Wed, 24 Dec 2025 01:12:20 +0100 Subject: [PATCH 18/35] Resolve redirect and editing issues in expenses --- .../[locale]/(org)/org/[orgId]/expenses/view/page.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx index fb3c777..1182dc2 100644 --- a/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx @@ -11,13 +11,14 @@ import CreateExpenseForm from '../create/CreateExpenseForm'; import ExpenseService from '@/services/expenseService'; import i18nService from '@/services/i18nService'; import ForwardExpenseForm from './ForwardExpenseForm'; +import OrgService from '@/services/orgService'; export default async function Page(props: { searchParams: Promise<{ id?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { const searchParams = await props.searchParams; - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const { id } = searchParams; @@ -48,6 +49,11 @@ export default async function Page(props: { const user = (await SessionService.getGammaUser())?.user; const canEdit = divisionTreasurer || group || user?.id === expense.gammaUserId; + + const org = await OrgService.getById(Number(orgId)); + if (!org) { + notFound(); + } return ( <> @@ -68,6 +74,7 @@ export default async function Page(props: { e={expense} locale={locale} readOnly={!canEdit} + orgId={org.id} groups={groups} /> From c780f384a11981ac6fc165bf4f60ee136695b471 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Wed, 24 Dec 2025 01:43:34 +0100 Subject: [PATCH 19/35] Allow no group to be selected --- .../[orgId]/expenses/create/CreateExpenseForm.tsx | 12 +++++++----- .../(org)/org/[orgId]/expenses/view/page.tsx | 3 +-- .../org/[orgId]/invoices/create/SendInvoiceForm.tsx | 8 +++++--- .../[orgId]/name-lists/create/CreateNameListForm.tsx | 4 ++-- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx index 043dd1c..874df75 100644 --- a/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx @@ -47,13 +47,11 @@ export default function CreateExpenseForm({ groups, locale, orgId, - gid, e }: { readOnly?: boolean; groups: GammaGroup[]; locale: string; - gid?: string; orgId: number; e?: Prisma.ExpenseGetPayload<{ include: { receipts: true } }>; }) { @@ -69,7 +67,7 @@ export default function CreateExpenseForm({ }); const groupOptions = createListCollection({ - items: [{ label: l.group.noGroup, value: '' }].concat( + items: [{ label: l.group.noGroup, value: 'cashit-nogroup' }].concat( groups.map((group) => ({ label: group.prettyName, value: group.id @@ -80,7 +78,11 @@ export default function CreateExpenseForm({ const [removeFiles, setRemoveFiles] = useState([]); const [files, setFiles] = useState([]); const [amount, setAmount] = useState((e?.amount ?? '') + ''); - const [groupId, setGroupId] = useState(gid); + const [groupId, setGroupId] = useState( + e !== undefined && e !== null + ? e.gammaGroupId ?? 'cashit-nogroup' + : undefined + ); const [name, setName] = useState(e?.name ?? ''); const [date, setDate] = useState( e?.occurredAt ? i18nService.formatDate(e.occurredAt, false) : '' @@ -99,7 +101,7 @@ export default function CreateExpenseForm({ files.forEach((file) => { formData.append('file', file); }); - groupId + groupId !== undefined && groupId !== 'cashit-nogroup' ? (editing ? editExpenseForGroup( e.id, diff --git a/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx index 1182dc2..532926e 100644 --- a/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx @@ -49,7 +49,7 @@ export default async function Page(props: { const user = (await SessionService.getGammaUser())?.user; const canEdit = divisionTreasurer || group || user?.id === expense.gammaUserId; - + const org = await OrgService.getById(Number(orgId)); if (!org) { notFound(); @@ -70,7 +70,6 @@ export default async function Page(props: { ({ label: group.prettyName, value: group.id @@ -99,7 +99,9 @@ export default function SendInvoiceForm({ ) }); - const [groupId, setGroupId] = useState(undefined); + const [groupId, setGroupId] = useState( i !== undefined && i !== null + ? i.gammaGroupId ?? 'cashit-nogroup' + : undefined); const [name, setName] = useState(i?.name ?? ''); const [comments, setComments] = useState(i?.description ?? ''); @@ -132,7 +134,7 @@ export default function SendInvoiceForm({ const createExpense = useCallback( async (event: React.FormEvent) => { event.preventDefault(); - groupId + groupId !== undefined && groupId !== 'cashit-nogroup' ? (editing ? editInvoiceForGroup( i.id, diff --git a/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx b/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx index 8868be5..8e89adc 100644 --- a/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx @@ -80,7 +80,7 @@ export default function CreateNameListForm({ const l = i18nService.getLocale(locale); const groupOptions = createListCollection({ - items: [{ label: l.group.noGroup, value: '' }].concat( + items: [{ label: l.group.noGroup, value: 'cashit-nogroup' }].concat( groups.map((group) => ({ label: group.prettyName, value: group.id @@ -163,7 +163,7 @@ export default function CreateNameListForm({ trackIndividual, new Date(date) ).then(() => router.push('/name-lists')) - : groupId !== '' && groupId !== undefined + : groupId !== undefined && groupId !== 'cashit-nogroup' ? createNameListForGroup( groupId, orgId, From ae29c9f3f6400bb9dd35161e5362588000c595db Mon Sep 17 00:00:00 2001 From: Goostaf Date: Wed, 24 Dec 2025 01:50:43 +0100 Subject: [PATCH 20/35] Add org IDs to (hopefully) all breadcrumbs --- .../org/[orgId]/bank-accounts/add-account/page.tsx | 2 +- .../(org)/org/[orgId]/bank-accounts/connect/page.tsx | 2 +- .../[orgId]/bank-accounts/finalize-connect/page.tsx | 2 +- .../[orgId]/bank-accounts/finalize-reconnect/page.tsx | 2 +- .../[locale]/(org)/org/[orgId]/bank-accounts/page.tsx | 2 +- .../org/[orgId]/bank-accounts/permissions/page.tsx | 2 +- .../org/[orgId]/bank-accounts/reconnect/page.tsx | 2 +- .../(org)/org/[orgId]/bank-accounts/settings/page.tsx | 2 +- .../(org)/org/[orgId]/bank-accounts/view/page.tsx | 6 +++--- .../(org)/org/[orgId]/expenses/create/page.tsx | 4 ++-- .../[locale]/(org)/org/[orgId]/expenses/view/page.tsx | 4 ++-- .../(org)/org/[orgId]/invoices/create/page.tsx | 4 ++-- .../[locale]/(org)/org/[orgId]/invoices/view/page.tsx | 4 ++-- .../(org)/org/[orgId]/name-lists/create/page.tsx | 4 ++-- .../(org)/org/[orgId]/name-lists/view/page.tsx | 4 ++-- src/app/[locale]/(org)/org/[orgId]/settings/page.tsx | 10 ++-------- .../(org)/org/[orgId]/zettle-sales/create/page.tsx | 4 ++-- .../(org)/org/[orgId]/zettle-sales/view/page.tsx | 11 ++++++++--- 18 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx index 2f4f243..87bacf0 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx @@ -39,7 +39,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx index b2ab33a..1bcf74d 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx @@ -34,7 +34,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx index ef880b3..1ad577d 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx @@ -56,7 +56,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx index ff1ee48..d5f4f31 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx @@ -57,7 +57,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx index b549383..ba62871 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx @@ -43,7 +43,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} {l.bankAccounts.title} diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx index 7291b62..a9909d2 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx @@ -32,7 +32,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx index a8e6f36..4730001 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx @@ -36,7 +36,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx index e8cbb8b..a5d85ee 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx @@ -32,7 +32,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/view/page.tsx index 14786a7..820ce9f 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/view/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/view/page.tsx @@ -14,10 +14,10 @@ import { PiCoins } from 'react-icons/pi'; export default async function Page(props: { searchParams: Promise<{ id?: string }>; - params: Promise<{ locale: string }>; + params: Promise<{ locale: string; orgId: string }>; }) { const searchParams = await props.searchParams; - const { locale } = await props.params; + const { locale, orgId } = await props.params; const l = i18nService.getLocale(locale); const { id } = searchParams; @@ -47,7 +47,7 @@ export default async function Page(props: { return ( <> - + {l.home.title} {l.bankAccounts.details} diff --git a/src/app/[locale]/(org)/org/[orgId]/expenses/create/page.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/create/page.tsx index 9f8f140..b8ebdec 100644 --- a/src/app/[locale]/(org)/org/[orgId]/expenses/create/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/expenses/create/page.tsx @@ -29,10 +29,10 @@ export default async function Page(props: { return ( <> - + {l.home.title} - + {l.categories.expenses} {l.economy.create} diff --git a/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx index 532926e..1356dee 100644 --- a/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/expenses/view/page.tsx @@ -58,10 +58,10 @@ export default async function Page(props: { return ( <> - + {l.home.title} - + {l.categories.expenses} {l.general.edit} diff --git a/src/app/[locale]/(org)/org/[orgId]/invoices/create/page.tsx b/src/app/[locale]/(org)/org/[orgId]/invoices/create/page.tsx index c85a742..c2067c4 100644 --- a/src/app/[locale]/(org)/org/[orgId]/invoices/create/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/invoices/create/page.tsx @@ -31,10 +31,10 @@ export default async function Page(props: { return ( <> - + {l.home.title} - + {l.categories.invoices} {l.economy.create} diff --git a/src/app/[locale]/(org)/org/[orgId]/invoices/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/invoices/view/page.tsx index 7ac8e10..deb3f44 100644 --- a/src/app/[locale]/(org)/org/[orgId]/invoices/view/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/invoices/view/page.tsx @@ -55,10 +55,10 @@ export default async function Page(props: { return ( <> - + {l.home.title} - + {l.categories.invoices} {l.general.edit} diff --git a/src/app/[locale]/(org)/org/[orgId]/name-lists/create/page.tsx b/src/app/[locale]/(org)/org/[orgId]/name-lists/create/page.tsx index f90a7d7..01532a1 100644 --- a/src/app/[locale]/(org)/org/[orgId]/name-lists/create/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/name-lists/create/page.tsx @@ -31,10 +31,10 @@ export default async function Page(props: { return ( <> - + {l.home.title} - + {l.nameLists.list} {l.economy.create} diff --git a/src/app/[locale]/(org)/org/[orgId]/name-lists/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/name-lists/view/page.tsx index 4779a85..460f64b 100644 --- a/src/app/[locale]/(org)/org/[orgId]/name-lists/view/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/name-lists/view/page.tsx @@ -59,10 +59,10 @@ export default async function Page(props: { return ( <> - + {l.home.title} - + {l.nameLists.list} {nameList.name} diff --git a/src/app/[locale]/(org)/org/[orgId]/settings/page.tsx b/src/app/[locale]/(org)/org/[orgId]/settings/page.tsx index 0b1083a..2a8f138 100644 --- a/src/app/[locale]/(org)/org/[orgId]/settings/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/settings/page.tsx @@ -6,18 +6,14 @@ import { BreadcrumbLink, BreadcrumbRoot } from '@/components/ui/breadcrumb'; -import Link from 'next/link'; import i18nService from '@/services/i18nService'; import SessionService from '@/services/sessionService'; import { notFound } from 'next/navigation'; import OrgService from '@/services/orgService'; -import { Button } from '@/components/ui/button'; -import { HiPlus } from 'react-icons/hi'; import OrganizationSettingsForm from './OrganizationSettingsForm'; export default async function Page(props: { - params: Promise<{ locale: string, orgId: string }>; - + params: Promise<{ locale: string; orgId: string }>; }) { const divisionTreasurer = await SessionService.isDivisionTreasurer(); if (!divisionTreasurer) { @@ -35,9 +31,7 @@ export default async function Page(props: { return ( <> - - {l.home.title} - + {l.home.title} {organization.name} diff --git a/src/app/[locale]/(org)/org/[orgId]/zettle-sales/create/page.tsx b/src/app/[locale]/(org)/org/[orgId]/zettle-sales/create/page.tsx index 92e9c0b..e203467 100644 --- a/src/app/[locale]/(org)/org/[orgId]/zettle-sales/create/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/zettle-sales/create/page.tsx @@ -28,10 +28,10 @@ export default async function Page(props: { return ( <> - + {l.home.title} - + {l.home.zettleSales} {l.zettleSales.create} diff --git a/src/app/[locale]/(org)/org/[orgId]/zettle-sales/view/page.tsx b/src/app/[locale]/(org)/org/[orgId]/zettle-sales/view/page.tsx index fe97fe5..90662ef 100644 --- a/src/app/[locale]/(org)/org/[orgId]/zettle-sales/view/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/zettle-sales/view/page.tsx @@ -39,16 +39,21 @@ export default async function Page(props: { return ( <> - + {l.home.title} - + {l.home.zettleSales} {l.general.edit} - + ); } From 69cc5eaeb26cd29fed05b0669502aa3cf0a3b1a0 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Thu, 25 Dec 2025 01:11:03 +0100 Subject: [PATCH 21/35] Improve receipt creator performance --- .../receipt-creator/ReceiptCreateForm.tsx | 232 +++++++++++------- 1 file changed, 139 insertions(+), 93 deletions(-) diff --git a/src/app/[locale]/(orgless)/receipt-creator/ReceiptCreateForm.tsx b/src/app/[locale]/(orgless)/receipt-creator/ReceiptCreateForm.tsx index 0b712f1..615f75e 100644 --- a/src/app/[locale]/(orgless)/receipt-creator/ReceiptCreateForm.tsx +++ b/src/app/[locale]/(orgless)/receipt-creator/ReceiptCreateForm.tsx @@ -1,7 +1,7 @@ 'use client'; import { pdf } from '@react-pdf/renderer'; -import { useCallback, useState } from 'react'; +import { useCallback, useState, memo } from 'react'; import { Box, Fieldset, @@ -54,6 +54,109 @@ export const formToInvoiceItem = (item: FormInvoiceItem) => vat: item.vat } satisfies Prisma.InvoiceItemCreateInput); +const ReceiptItemRow = memo( + ({ + item, + index, + onUpdate, + onDelete + }: { + item: FormInvoiceItem; + index: number; + onUpdate: ( + index: number, + field: keyof FormInvoiceItem, + value: string + ) => void; + onDelete: (index: number) => void; + }) => { + const handleNameChange = useCallback( + (e: React.ChangeEvent) => { + onUpdate(index, 'name', e.target.value); + }, + [index, onUpdate] + ); + + const handleCountChange = useCallback( + (e: React.ChangeEvent) => { + onUpdate(index, 'count', e.target.value); + }, + [index, onUpdate] + ); + + const handleAmountChange = useCallback( + (e: React.ChangeEvent) => { + onUpdate(index, 'amount', e.target.value); + }, + [index, onUpdate] + ); + + const handleVatChange = useCallback( + ({ value }: { value: string[] }) => { + onUpdate(index, 'vat', value?.[0] || InvoiceItemVat.VAT_25); + }, + [index, onUpdate] + ); + + const handleDelete = useCallback(() => { + onDelete(index); + }, [index, onDelete]); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {vatTypes.items.map((item) => ( + + {item.label} + + ))} + + + + + + + + + + + + ); + } +); + +ReceiptItemRow.displayName = 'ReceiptItemRow'; + export default function ReceiptCreateForm({ locale }: { locale: string }) { const l = i18nService.getLocale(locale); @@ -82,6 +185,33 @@ export default function ReceiptCreateForm({ locale }: { locale: string }) { [date, items, locale, name, purchaser, treasurer] ); + const handleUpdateItem = useCallback( + (index: number, field: keyof FormInvoiceItem, value: string) => { + setItems((prevItems) => { + const newItems = [...prevItems]; + newItems[index] = { ...newItems[index], [field]: value }; + return newItems; + }); + }, + [] + ); + + const handleDeleteItem = useCallback((index: number) => { + setItems((prevItems) => prevItems.filter((_, i) => i !== index)); + }, []); + + const handleAddItem = useCallback(() => { + setItems((prevItems) => [ + ...prevItems, + { + name: '', + amount: '', + count: '', + vat: InvoiceItemVat.VAT_25 + } + ]); + }, []); + return (
{l.receipt.title} @@ -141,87 +271,13 @@ export default function ReceiptCreateForm({ locale }: { locale: string }) { {items.map((item, index) => ( - - - - { - const newItems = [...items]; - newItems[index].name = e.target.value; - setItems(newItems); - }} - /> - - - - - - { - const newItems = [...items]; - newItems[index].count = e.target.value; - setItems(newItems); - }} - /> - - - - - - - { - const newItems = [...items]; - newItems[index].amount = e.target.value; - setItems(newItems); - }} - /> - - - - - - - { - const newItems = [...items]; - newItems[index].vat = value?.[0] as InvoiceItemVat; - setItems(newItems); - }} - > - - - - - {vatTypes.items.map((item) => ( - - {item.label} - - ))} - - - - - - - { - const newItems = [...items]; - newItems.splice(index, 1); - setItems(newItems); - }} - > - - - - + ))} @@ -229,17 +285,7 @@ export default function ReceiptCreateForm({ locale }: { locale: string }) { variant="subtle" float="right" mt="1" - onClick={() => - setItems([ - ...items, - { - name: '', - amount: '', - count: '', - vat: InvoiceItemVat.VAT_25 - } - ]) - } + onClick={handleAddItem} > {l.economy.addProduct} From 7f0470bc2e659714b5870a4d69e1dcf99a4322bb Mon Sep 17 00:00:00 2001 From: Goostaf Date: Thu, 25 Dec 2025 01:26:01 +0100 Subject: [PATCH 22/35] Add file drop zone --- .../expenses/create/CreateExpenseForm.tsx | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx b/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx index 874df75..3cef873 100644 --- a/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/expenses/create/CreateExpenseForm.tsx @@ -17,7 +17,9 @@ import { Box, createListCollection, IconButton, - Icon + Icon, + FileUploadDropzone, + FileUploadDropzoneContent } from '@chakra-ui/react'; import { SelectContent, @@ -31,8 +33,7 @@ import { Field } from '@/components/ui/field'; import { Button } from '@/components/ui/button'; import { FileUploadList, - FileUploadRoot, - FileUploadTrigger + FileUploadRoot } from '@/components/ui/file-upload'; import { HiUpload } from 'react-icons/hi'; import { ExpenseType, Prisma } from '@prisma/client'; @@ -162,7 +163,8 @@ export default function CreateExpenseForm({ description, removeFiles, router, - groupId + groupId, + orgId ] ); @@ -258,11 +260,14 @@ export default function CreateExpenseForm({ } required={remainingCloudFiles.length === 0} > - - - + + + + + + {l.expense.receiptsUpload} + + {e?.receipts?.map((file) => { const fileDeleted = removeFiles.some((f) => f === file.id); From b65c93dbba83262205f785157089736a6b39a7bd Mon Sep 17 00:00:00 2001 From: Goostaf Date: Thu, 25 Dec 2025 01:35:50 +0100 Subject: [PATCH 23/35] Include nicks in names --- .../name-lists/create/CreateNameListForm.tsx | 17 ++++++++++++----- src/components/NameListPdf/NameListPdf.tsx | 17 ++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx b/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx index 8e89adc..6991287 100644 --- a/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/name-lists/create/CreateNameListForm.tsx @@ -51,7 +51,8 @@ const sgToMembers = ( return nl && sg ? sg.members.map((m) => ({ id: m.user.id, - nick: m.user.firstName + ' ' + m.user.lastName, + nameNick: `${m.user.firstName} "${m.user.nick}" ${m.user.lastName}`, + fullName: `${m.user.firstName} ${m.user.lastName}`, amount: nl.gammaNames .find((n) => n.gammaUserId === m.user.id) @@ -59,7 +60,8 @@ const sgToMembers = ( })) : sg?.members.map((m) => ({ id: m.user.id, - nick: m.user.firstName + ' ' + m.user.lastName, + nameNick: `${m.user.firstName} "${m.user.nick}" ${m.user.lastName}`, + fullName: `${m.user.firstName} ${m.user.lastName}`, amount: '' })) ?? []; }; @@ -195,7 +197,8 @@ export default function CreateNameListForm({ names, router, trackIndividual, - type + type, + orgId ] ); @@ -203,7 +206,11 @@ export default function CreateNameListForm({ if (!nl) return; const gammaNames = groupNames - .map((n) => ({ nick: n.nick, amount: +n.amount })) + .map((n) => ({ + nameNick: n.nameNick, + fullName: n.fullName, + amount: +n.amount + })) .filter((n) => n.amount > 0); const blob = await pdf( @@ -350,7 +357,7 @@ export default function CreateNameListForm({ {groupNames.map((member, index) => ( - + {trackIndividual ? ( >; locale: string; - gammaNames: { nick: string; amount: number }[]; + gammaNames: { fullName: string; amount: number }[]; }) => { if (nl === null) return null; @@ -96,8 +103,8 @@ const NameListPdf = ({ ))} {gammaNames.map((name) => ( - - {name.nick} + + {name.fullName} {nl.tracked && {name.amount.toFixed(2)}} ))} From 68dcfd368384fa0fd2e904e1b594d1161c09b04d Mon Sep 17 00:00:00 2001 From: Goostaf Date: Thu, 25 Dec 2025 01:49:55 +0100 Subject: [PATCH 24/35] Add sandbox finance on development --- .../connect/AddRequisitionForm.tsx | 61 +++++++++++++------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx index 103885c..b8ce041 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx @@ -1,6 +1,9 @@ 'use client'; -import { registerRequisition, createNewRequisition } from '@/actions/goCardless'; +import { + registerRequisition, + createNewRequisition +} from '@/actions/goCardless'; import { Button } from '@/components/ui/button'; import { Field } from '@/components/ui/field'; import { @@ -12,7 +15,13 @@ import { SelectValueText } from '@/components/ui/select'; import { Requisition } from '@/services/goCardlessService'; -import { Box, createListCollection, VStack, Heading, Text } from '@chakra-ui/react'; +import { + Box, + createListCollection, + VStack, + Heading, + Text +} from '@chakra-ui/react'; import { useRouter } from 'next/navigation'; import { useCallback, useState } from 'react'; @@ -34,8 +43,12 @@ export default function AddRequisitionForm({ institutions: Institution[]; }) { const router = useRouter(); - const [existingRequisitionId, setExistingRequisitionId] = useState(); - const [newInstitutionId, setNewInstitutionId] = useState(); + const [existingRequisitionId, setExistingRequisitionId] = useState< + string | undefined + >(); + const [newInstitutionId, setNewInstitutionId] = useState< + string | undefined + >(); const [isSubmitting, setIsSubmitting] = useState(false); const submitExisting = useCallback( @@ -81,10 +94,15 @@ export default function AddRequisitionForm({ }); const institutionList = createListCollection({ - items: institutions.map((i) => ({ - label: i.name, - value: i.id - })) + items: (process.env.NODE_ENV === 'development' + ? [{ label: 'Sandbox finance', value: 'SANDBOXFINANCE_SFIN0000' }] + : [] + ).concat( + institutions.map((i) => ({ + label: i.name, + value: i.id + })) + ) }); return ( @@ -92,9 +110,12 @@ export default function AddRequisitionForm({ {/* Existing Unused Requisitions */} {requisitions.length > 0 && ( - Use Existing Connection + + Use Existing Connection + - These are connections you've created before but haven't registered locally yet. + These are connections you've created before but haven't + registered locally yet. @@ -102,7 +123,9 @@ export default function AddRequisitionForm({ setExistingRequisitionId(value?.[0])} + onValueChange={({ value }) => + setExistingRequisitionId(value?.[0]) + } > @@ -117,9 +140,9 @@ export default function AddRequisitionForm({ - - ) : ( diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx index c5c2adb..af40a9a 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx @@ -41,10 +41,12 @@ interface AccountOption { export default function AddAccountForm({ requisition, - accounts + accounts, + orgId }: { requisition: Requisition; accounts: Prisma.BankAccountGetPayload<{}>[]; + orgId: string; }) { const router = useRouter(); const [accId, setAccId] = useState(); @@ -113,10 +115,10 @@ export default function AddAccountForm({ if (accId && requisition.id) { await registerBankAccount(accId, requisition.id); - router.push('/bank-accounts'); + router.push(`/org/${orgId}/bank-accounts`); } }, - [accId, requisition, router] + [accId, requisition, router, orgId] ); const requisitionAccounts = createListCollection({ diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx index 87bacf0..a552819 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/add-account/page.tsx @@ -52,7 +52,11 @@ export default async function Page(props: { Add Bank Account - + ); } diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx index b8ce041..be58299 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx @@ -37,10 +37,12 @@ interface Institution { export default function AddRequisitionForm({ requisitions, - institutions + institutions, + orgId }: { requisitions: Requisition[]; institutions: Institution[]; + orgId: string; }) { const router = useRouter(); const [existingRequisitionId, setExistingRequisitionId] = useState< @@ -58,14 +60,14 @@ export default function AddRequisitionForm({ setIsSubmitting(true); try { await registerRequisition(existingRequisitionId); - router.push('/bank-accounts'); + router.push(`/org/${orgId}/bank-accounts`); } catch (error) { console.error('Error registering requisition:', error); setIsSubmitting(false); } } }, - [existingRequisitionId, router, isSubmitting] + [existingRequisitionId, router, isSubmitting, orgId] ); const submitNew = useCallback( @@ -74,7 +76,10 @@ export default function AddRequisitionForm({ if (newInstitutionId && !isSubmitting) { setIsSubmitting(true); try { - const newRequisition = await createNewRequisition(newInstitutionId); + const newRequisition = await createNewRequisition( + newInstitutionId, + orgId + ); // Redirect to the GoCardless link window.location.href = newRequisition.link; } catch (error) { @@ -83,7 +88,7 @@ export default function AddRequisitionForm({ } } }, - [newInstitutionId, isSubmitting] + [newInstitutionId, isSubmitting, orgId] ); const existingReqs = createListCollection({ @@ -95,7 +100,7 @@ export default function AddRequisitionForm({ const institutionList = createListCollection({ items: (process.env.NODE_ENV === 'development' - ? [{ label: 'Sandbox finance', value: 'SANDBOXFINANCE_SFIN0000' }] + ? [{ label: 'Sandbox Finance', value: 'SANDBOXFINANCE_SFIN0000' }] : [] ).concat( institutions.map((i) => ({ diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx index 1bcf74d..e9676b6 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/connect/page.tsx @@ -50,6 +50,7 @@ export default async function Page(props: { ); diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx index 1ad577d..ec1bd2a 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-connect/page.tsx @@ -77,6 +77,7 @@ export default async function Page(props: { mode="connect" requisition={requisition} existingAccounts={existingAccounts} + orgId={orgId} /> ); diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx index d5f4f31..b21ee10 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx @@ -76,6 +76,7 @@ export default async function Page(props: { accounts={requisition.accounts} requisitionId={requisition.id} existingAccounts={existingAccounts} + orgId={orgId} /> ); diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx index ba62871..a905a53 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/page.tsx @@ -1,4 +1,4 @@ -import { Box, Flex, Heading, Icon, Text, VStack } from '@chakra-ui/react'; +import { Box, Flex, Heading, Text, VStack } from '@chakra-ui/react'; import { BreadcrumbCurrentLink, BreadcrumbLink, diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx index a9909d2..9fbf24a 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/permissions/page.tsx @@ -50,6 +50,7 @@ export default async function Page(props: { accounts={accounts} groups={groups} selectedAccountId={selectedAccountId} + orgId={orgId} /> ); diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx index ff04b16..a6a6104 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx @@ -1,21 +1,23 @@ 'use client'; -import { recreateRequisition } from "@/actions/goCardless"; -import { Button } from "@chakra-ui/react"; -import { useRouter } from "next/navigation"; +import { recreateRequisition } from '@/actions/goCardless'; +import { Button } from '@chakra-ui/react'; +import { useRouter } from 'next/navigation'; -const RecreateRequisitionButton = ({id}: { id: string }) => { +const RecreateRequisitionButton = ({ + id, + orgId +}: { + id: string; + orgId: string; +}) => { const router = useRouter(); const handleClick = async () => { - const req = await recreateRequisition(id); + const req = await recreateRequisition(id, orgId); router.push(req.link); }; - return ( - - ); + return ; }; export default RecreateRequisitionButton; diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx index 4730001..8583b87 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/reconnect/page.tsx @@ -50,7 +50,7 @@ export default async function Page(props: { Reconnect Accounts

Create a new requisition and transfer accounts?

- + ); } diff --git a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx index a5d85ee..5150533 100644 --- a/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx +++ b/src/app/[locale]/(org)/org/[orgId]/bank-accounts/settings/page.tsx @@ -50,6 +50,7 @@ export default async function Page(props: { accounts={accounts} groups={groups} selectedAccountId={selectedAccountId} + orgId={orgId} /> ); diff --git a/src/components/BankAccountManager/BankAccountManager.tsx b/src/components/BankAccountManager/BankAccountManager.tsx index 05ae208..fac94e6 100644 --- a/src/components/BankAccountManager/BankAccountManager.tsx +++ b/src/components/BankAccountManager/BankAccountManager.tsx @@ -80,10 +80,12 @@ interface ReconnectModeProps { requisition?: never; } -type BankAccountManagerProps = ConnectModeProps | ReconnectModeProps; +type BankAccountManagerProps = (ConnectModeProps | ReconnectModeProps) & { + orgId: string; +}; export default function BankAccountManager(props: BankAccountManagerProps) { - const { mode, existingAccounts } = props; + const { mode, existingAccounts, orgId } = props; const router = useRouter(); // Extract accounts and requisitionId based on mode @@ -116,7 +118,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { useEffect(() => { if (accounts.length === 0) { setTimeout(() => { - router.push('/bank-accounts'); + router.push(`/org/${orgId}/bank-accounts`); }, 2000); return; } @@ -151,7 +153,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { })); }); }); - }, [accounts, requisitionId, mode, router, existingAccounts]); + }, [accounts, requisitionId, mode, router, existingAccounts, orgId]); const updateAccountState = ( accountId: string, @@ -214,7 +216,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { // Auto-redirect - immediate if no actions, delayed if actions were processed setTimeout( () => { - router.push('/bank-accounts'); + router.push(`/org/${orgId}/bank-accounts`); }, hadActionsToProcess ? 1500 : 0 ); @@ -458,7 +460,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { From df0d62b91c1d5a7df74e809d5b0b0f5a47e98d1f Mon Sep 17 00:00:00 2001 From: Goostaf Date: Thu, 25 Dec 2025 19:10:42 +0100 Subject: [PATCH 29/35] Add organization primary emails and owner groups --- .env.example | 1 + .../20251017170007_organiations/migration.sql | 18 ++++++- prisma/schema.prisma | 10 ++-- src/actions/organizations.ts | 26 ++++++++-- .../admin/organizations/OrganizationForm.tsx | 49 ++++++++++++++++--- .../admin/organizations/[id]/page.tsx | 8 ++- src/services/mailNotificationService.ts | 22 ++++++--- src/services/orgService.ts | 23 +++++++-- 8 files changed, 126 insertions(+), 31 deletions(-) diff --git a/.env.example b/.env.example index 85ecae3..5efe178 100644 --- a/.env.example +++ b/.env.example @@ -9,6 +9,7 @@ NEXTAUTH_SECRET=secret NEXTAUTH_URL=http://localhost:3000/api/auth MEDIA_PATH="./media" BOARD_GROUP="styrit" +DIVISION_TREASURER_EMAIL="kassor.styrit@chalmers.it" TREASURER_POST_ID="cd6c2fc4-9fac-42e3-873c-6cfd71c3dd8d" GOTIFY_ROOT_URL=http://localhost:8080 GOTIFY_TOKEN="123abc" diff --git a/prisma/migrations/20251017170007_organiations/migration.sql b/prisma/migrations/20251017170007_organiations/migration.sql index 4ff0b96..1da6693 100644 --- a/prisma/migrations/20251017170007_organiations/migration.sql +++ b/prisma/migrations/20251017170007_organiations/migration.sql @@ -21,6 +21,8 @@ COMMIT; CREATE TABLE "Organization" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, + "ownerGammaSuperGroupId" TEXT NOT NULL, + "primaryEmail" TEXT NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL, @@ -34,8 +36,20 @@ BEGIN EXISTS (SELECT 1 FROM "Invoice") OR EXISTS (SELECT 1 FROM "NameList") OR EXISTS (SELECT 1 FROM "ZettleSale") THEN - INSERT INTO "Organization" ("name", "createdAt", "updatedAt") - VALUES ('Default Organization', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + INSERT INTO "Organization" ( + "name", + "ownerGammaSuperGroupId", + "primaryEmail", + "createdAt", + "updatedAt" + ) + VALUES ( + 'Default Organization', + '45432d44-0de4-4ed0-88ce-8cdf31b72f73', + 'default@example.com', + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP + ); END IF; END $$; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 134fa9c..fbf8d51 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -15,10 +15,12 @@ enum RequestStatus { } model Organization { - id Int @id @default(autoincrement()) - name String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + name String + primaryEmail String + ownerGammaSuperGroupId String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt expenses Expense[] invoices Invoice[] diff --git a/src/actions/organizations.ts b/src/actions/organizations.ts index 095ec50..1ddf9c9 100644 --- a/src/actions/organizations.ts +++ b/src/actions/organizations.ts @@ -3,14 +3,32 @@ import OrgService from '@/services/orgService'; import { revalidatePath } from 'next/cache'; -export async function createOrganization(name: string) { - const organization = await OrgService.create(name); +export async function createOrganization( + name: string, + primaryEmail: string, + ownerGammaSuperGroupId: string +) { + const organization = await OrgService.create( + name, + primaryEmail, + ownerGammaSuperGroupId + ); revalidatePath('/admin/organizations'); return organization; } -export async function updateOrganization(id: number, name: string) { - const organization = await OrgService.update(id, name); +export async function updateOrganization( + id: number, + name: string, + primaryEmail: string, + ownerGammaSuperGroupId: string +) { + const organization = await OrgService.update( + id, + name, + primaryEmail, + ownerGammaSuperGroupId + ); revalidatePath('/admin/organizations'); revalidatePath(`/admin/organizations/${id}`); return organization; diff --git a/src/app/[locale]/(orgless)/admin/organizations/OrganizationForm.tsx b/src/app/[locale]/(orgless)/admin/organizations/OrganizationForm.tsx index 774b686..d7040bb 100644 --- a/src/app/[locale]/(orgless)/admin/organizations/OrganizationForm.tsx +++ b/src/app/[locale]/(orgless)/admin/organizations/OrganizationForm.tsx @@ -5,7 +5,10 @@ import { useRouter } from 'next/navigation'; import { Box, Input, VStack } from '@chakra-ui/react'; import { Button } from '@/components/ui/button'; import { Field } from '@/components/ui/field'; -import { createOrganization, updateOrganization } from '@/actions/organizations'; +import { + createOrganization, + updateOrganization +} from '@/actions/organizations'; import { Organization } from '@prisma/client'; interface OrganizationFormProps { @@ -15,7 +18,13 @@ interface OrganizationFormProps { const OrganizationForm = ({ mode, organization }: OrganizationFormProps) => { const router = useRouter(); - const [name, setName] = useState(organization?.name || ''); + const [name, setName] = useState(organization?.name ?? ''); + const [primaryEmail, setPrimaryEmail] = useState( + organization?.primaryEmail ?? '' + ); + const [ownerGammaSuperGroupId, setOwnerGammaSuperGroupId] = useState( + organization?.ownerGammaSuperGroupId ?? '' + ); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -27,10 +36,15 @@ const OrganizationForm = ({ mode, organization }: OrganizationFormProps) => { try { if (mode === 'create') { - await createOrganization(name); + await createOrganization(name, primaryEmail, ownerGammaSuperGroupId); router.push('/admin/organizations'); } else if (organization) { - await updateOrganization(organization.id, name); + await updateOrganization( + organization.id, + name, + primaryEmail, + ownerGammaSuperGroupId + ); router.push(`/admin/organizations/${organization.id}`); } router.refresh(); @@ -39,7 +53,7 @@ const OrganizationForm = ({ mode, organization }: OrganizationFormProps) => { setLoading(false); } }, - [mode, name, organization, router] + [mode, name, organization, router, primaryEmail, ownerGammaSuperGroupId] ); return ( @@ -56,6 +70,27 @@ const OrganizationForm = ({ mode, organization }: OrganizationFormProps) => { />
+ + setPrimaryEmail(e.target.value)} + placeholder="Enter primary email" + required + disabled={loading} + /> + + + + setOwnerGammaSuperGroupId(e.target.value)} + placeholder="Enter owner gamma super group ID" + required + disabled={loading} + /> + + {error && ( {error} @@ -69,7 +104,9 @@ const OrganizationForm = ({ mode, organization }: OrganizationFormProps) => { loading={loading} disabled={loading || !name.trim()} > - {mode === 'create' ? 'Create Organization' : 'Update Organization'} + {mode === 'create' + ? 'Create Organization' + : 'Update Organization'} + + )} - + + + {l.expense.expense} + + + + + {selectedGroup ? selectedGroup.prettyName : l.group.personal} + + + + + {expense.name} + + + + {expense.occurredAt.toLocaleDateString(locale)} + + + + {expense.amount} kr + + + + + {expense.type === ExpenseType.EXPENSE + ? l.expense.expense + : l.expense.invoice} + + + + + {expense.description || l.general.none} + + + + {expense.receipts.length > 0 ? ( + expense.receipts.map((file) => ( + + )) + ) : ( + {l.general.none} + )} + + + ); } + +const UploadedFile = ({ name, sha256 }: { name: string; sha256: string }) => { + return ( + + + + + + + + {name} + + + + ); +}; diff --git a/src/app/[locale]/org/[orgId]/invoices/edit/page.tsx b/src/app/[locale]/org/[orgId]/invoices/edit/page.tsx new file mode 100644 index 0000000..3e8e526 --- /dev/null +++ b/src/app/[locale]/org/[orgId]/invoices/edit/page.tsx @@ -0,0 +1,80 @@ +import { notFound } from 'next/navigation'; +import SessionService from '@/services/sessionService'; +import Link from 'next/link'; +import { + BreadcrumbCurrentLink, + BreadcrumbLink, + BreadcrumbRoot +} from '@/components/ui/breadcrumb'; +import { Box } from '@chakra-ui/react'; +import InvoiceService from '@/services/invoiceService'; +import SendInvoiceForm from '../create/SendInvoiceForm'; +import i18nService from '@/services/i18nService'; +import OrgService from '@/services/orgService'; + +export default async function Page(props: { + searchParams: Promise<{ id?: string }>; + params: Promise<{ locale: string; orgId: string }>; +}) { + const { locale, orgId } = await props.params; + const l = i18nService.getLocale(locale); + + const { id } = await props.searchParams; + if (id === undefined) notFound(); + + const invoice = await InvoiceService.getById(+id); + if (invoice === null) notFound(); + const personal = invoice.gammaGroupId === null; + + const divisionTreasurer = await SessionService.isDivisionTreasurer(); + + const group = + !personal && !divisionTreasurer + ? (await SessionService.getGroups()).find( + (g) => g.group.id === invoice.gammaGroupId + )?.group + : undefined; + + if (!personal && !divisionTreasurer && group === undefined) { + notFound(); + } + + const user = (await SessionService.getGammaUser())?.user; + const canEdit = + divisionTreasurer || + group !== undefined || + user?.id === invoice.gammaUserId; + + if (!canEdit) { + notFound(); + } + + const groups = (await SessionService.getGroups()).map((g) => g.group); + + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + + return ( + <> + + + {l.home.title} + + + {l.categories.invoices} + + {l.general.edit} + + + + + ); +} \ No newline at end of file diff --git a/src/app/[locale]/org/[orgId]/invoices/view/page.tsx b/src/app/[locale]/org/[orgId]/invoices/view/page.tsx index deb3f44..9d2b10d 100644 --- a/src/app/[locale]/org/[orgId]/invoices/view/page.tsx +++ b/src/app/[locale]/org/[orgId]/invoices/view/page.tsx @@ -6,11 +6,20 @@ import { BreadcrumbLink, BreadcrumbRoot } from '@/components/ui/breadcrumb'; -import { Box } from '@chakra-ui/react'; -import InvoiceService from '@/services/invoiceService'; -import SendInvoiceForm from '../create/SendInvoiceForm'; +import { + Box, + Fieldset, + Heading, + Separator, + Table, + Text +} from '@chakra-ui/react'; import i18nService from '@/services/i18nService'; +import InvoiceService from '@/services/invoiceService'; import OrgService from '@/services/orgService'; +import { Button } from '@/components/ui/button'; +import { Field } from '@/components/ui/field'; +import { InvoiceItemVat } from '@prisma/client'; export default async function Page(props: { searchParams: Promise<{ id?: string }>; @@ -52,6 +61,10 @@ export default async function Page(props: { notFound(); } + const selectedGroup = invoice.gammaGroupId + ? groups.find((g) => g.id === invoice.gammaGroupId) + : null; + return ( <> @@ -61,17 +74,146 @@ export default async function Page(props: { {l.categories.invoices} - {l.general.edit} + {l.general.view} - + {canEdit && ( + + + + )} + + + {l.expense.invoice} + + + + + {selectedGroup ? selectedGroup.prettyName : l.group.personal} + + + + + {invoice.name} + + + + {invoice.description || l.general.none} + + + + + + + + {l.invoice.details} + + + + {invoice.customerName} + + + + + {invoice.deliveryDate + ? invoice.deliveryDate.toLocaleDateString(locale) + : l.general.none} + + + + + + {invoice.sentAt + ? invoice.sentAt.toLocaleDateString(locale) + : l.invoice.notSent} + + + + + {user?.firstName + ' ' + user?.lastName} + + + + {invoice.customerReference || l.general.none} + + + + {invoice.customerReferenceCode || l.general.none} + + + + {invoice.customerSubscriptionNumber || l.general.none} + + + + {invoice.customerOrderReference || l.general.none} + + + + {invoice.customerContractNumber || l.general.none} + + + + + + + + + + + + {l.invoice.item} + {l.invoice.quantity} + {l.economy.unitPrice} + {l.economy.vat} + {l.invoice.subtotal} + + + + {invoice.items.map((item, index) => ( + + + {item.name} + + + + {item.count} + + + + {item.amount} kr + + + + + {item.vat === InvoiceItemVat.VAT_0 && '0%'} + {item.vat === InvoiceItemVat.VAT_6 && '6%'} + {item.vat === InvoiceItemVat.VAT_12 && '12%'} + {item.vat === InvoiceItemVat.VAT_25 && '25%'} + + + + + + {InvoiceService.calculateSumForItems([item]).toFixed(2)}{' '} + kr + + + + ))} + + + + + {l.economy.amountTotal}:{' '} + {InvoiceService.calculateSumForItems(invoice.items).toFixed(2)} kr + + + ); } diff --git a/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx b/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx index c2ba4b8..0fff340 100644 --- a/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx +++ b/src/app/[locale]/org/[orgId]/name-lists/create/CreateNameListForm.tsx @@ -1,6 +1,5 @@ 'use client'; -import { pdf } from '@react-pdf/renderer'; import { useCallback, useMemo, useState } from 'react'; import { Box, @@ -36,8 +35,6 @@ import { } from '@/actions/nameLists'; import { useRouter } from 'next/navigation'; import NameListService from '@/services/nameListService'; -import FileService from '@/services/fileService'; -import NameListPdf from '@/components/NameListPdf/NameListPdf'; export interface GroupNameItem { name: string; @@ -154,8 +151,6 @@ export default function CreateNameListForm({ .filter((n) => n.cost > 0) : []; - console.log('Group ID:', groupId); - edited ? editNameList( nl.id, @@ -204,26 +199,6 @@ export default function CreateNameListForm({ ] ); - const exportPdf = useCallback(async () => { - if (!nl) return; - - const gammaNames = groupNames - .map((n) => ({ - nameNick: n.nameNick, - fullName: n.fullName, - amount: +n.amount - })) - .filter((n) => n.amount > 0); - - const blob = await pdf( - - ).toBlob(); - FileService.saveToFile( - `name-list-${nl.id}-${new Date().getTime()}.pdf`, - blob - ); - }, [groupNames, locale, nl]); - const listTypes = createListCollection({ items: [ { label: l.nameLists.types.event, value: NameListType.EVENT }, @@ -242,12 +217,6 @@ export default function CreateNameListForm({ return ( {nl ? l.nameLists.edit : l.nameLists.create} - - {nl && ( - - )} @@ -392,11 +361,6 @@ export default function CreateNameListForm({ - {nl && ( - - )} diff --git a/src/app/[locale]/org/[orgId]/name-lists/edit/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/edit/page.tsx new file mode 100644 index 0000000..1f51ec2 --- /dev/null +++ b/src/app/[locale]/org/[orgId]/name-lists/edit/page.tsx @@ -0,0 +1,90 @@ +import { notFound } from 'next/navigation'; +import { Box } from '@chakra-ui/react'; +import { + BreadcrumbCurrentLink, + BreadcrumbLink, + BreadcrumbRoot +} from '@/components/ui/breadcrumb'; +import Link from 'next/link'; +import i18nService from '@/services/i18nService'; +import NameListService from '@/services/nameListService'; +import SessionService from '@/services/sessionService'; +import GammaService from '@/services/gammaService'; +import CreateNameListForm from '../create/CreateNameListForm'; +import OrgService from '@/services/orgService'; + +export default async function Page(props: { + searchParams: Promise<{ id?: string }>; + params: Promise<{ locale: string; orgId: string }>; +}) { + const { locale, orgId } = await props.params; + const l = i18nService.getLocale(locale); + + const { id } = await props.searchParams; + if (id === undefined) { + notFound(); + } + + const nameList = await NameListService.getById(+id); + if (nameList === null) notFound(); + const personal = nameList === null || nameList.gammaGroupId === null; + const divisionTreasurer = await SessionService.isDivisionTreasurer(); + + const group = !personal + ? (await SessionService.getGroups()).find( + (g) => g.group.id === nameList.gammaGroupId + )?.group + : undefined; + + if (!personal && !divisionTreasurer && group === undefined) { + notFound(); + } + + const sg = + personal || group === undefined + ? undefined + : await GammaService.getSuperGroup(group.superGroup.id); + if (!personal && !divisionTreasurer && sg === undefined) { + notFound(); + } + + const superGroups = await GammaService.getAllSuperGroups(); + const groups = (await SessionService.getGroups()).map((g) => g.group); + + const user = (await SessionService.getGammaUser())?.user; + const canEdit = + divisionTreasurer || + group !== undefined || + user?.id === nameList.gammaUserId; + + if (!canEdit) { + notFound(); + } + + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + + return ( + <> + + + {l.home.title} + + + {l.nameLists.list} + + {l.general.edit} + + + + + ); +} diff --git a/src/app/[locale]/org/[orgId]/name-lists/view/DownloadNameListButton.tsx b/src/app/[locale]/org/[orgId]/name-lists/view/DownloadNameListButton.tsx new file mode 100644 index 0000000..474c74f --- /dev/null +++ b/src/app/[locale]/org/[orgId]/name-lists/view/DownloadNameListButton.tsx @@ -0,0 +1,53 @@ +'use client'; + +import NameListPdf from '@/components/NameListPdf/NameListPdf'; +import FileService from '@/services/fileService'; +import i18nService from '@/services/i18nService'; +import NameListService from '@/services/nameListService'; +import { GammaGroup, GammaGroupMember, GammaSuperGroup } from '@/types/gamma'; +import { Button } from '@chakra-ui/react'; +import { pdf } from '@react-pdf/renderer'; +import { useCallback, useMemo } from 'react'; + +export default function DownloadNameListButton({ + superGroups, + nl, + groups, + locale +}: { + superGroups: { members: GammaGroupMember[]; superGroup: GammaSuperGroup }[]; + nl: NonNullable>>; + groups: GammaGroup[]; + locale: string; +}) { + const l = i18nService.getLocale(locale); + + const groupNames = useMemo(() => { + const groupToSgId = groups.find((g) => g.id === nl.gammaGroupId)?.superGroup + .id; + const sg = superGroups.find((sg) => sg.superGroup.id === groupToSgId); + + return ( + sg?.members.map((m) => ({ + nameNick: `${m.user.firstName} "${m.user.nick}" ${m.user.lastName}`, + fullName: `${m.user.firstName} ${m.user.lastName}`, + amount: + nl.gammaNames.find((n) => n.gammaUserId === m.user.id)?.cost ?? 0 + })) ?? [] + ); + }, [superGroups, groups, nl]); + + const exportPdf = useCallback(async () => { + const gammaNames = groupNames.filter((n) => n.amount > 0); + const blob = await pdf( + + ).toBlob(); + FileService.saveToFile(`name-list-${nl.id}-${Date.now()}.pdf`, blob); + }, [groupNames, locale, nl]); + + return ( + + ); +} diff --git a/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx b/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx index 460f64b..6fc8f06 100644 --- a/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx +++ b/src/app/[locale]/org/[orgId]/name-lists/view/page.tsx @@ -1,17 +1,21 @@ import { notFound } from 'next/navigation'; -import { Box } from '@chakra-ui/react'; +import { Box, Fieldset, Heading, Text } from '@chakra-ui/react'; import { BreadcrumbCurrentLink, BreadcrumbLink, BreadcrumbRoot } from '@/components/ui/breadcrumb'; import Link from 'next/link'; -import i18nService from '@/services/i18nService'; import NameListService from '@/services/nameListService'; import SessionService from '@/services/sessionService'; import GammaService from '@/services/gammaService'; -import CreateNameListForm from '../create/CreateNameListForm'; +import { Button } from '@/components/ui/button'; import OrgService from '@/services/orgService'; +import i18nService from '@/services/i18nService'; +import { Field } from '@/components/ui/field'; +import { NameListType } from '@prisma/client'; +import { GammaGroupMember } from '@/types/gamma'; +import DownloadNameListButton from './DownloadNameListButton'; export default async function Page(props: { searchParams: Promise<{ id?: string }>; @@ -48,14 +52,58 @@ export default async function Page(props: { notFound(); } - const superGroups = await GammaService.getAllSuperGroups(); const groups = (await SessionService.getGroups()).map((g) => g.group); + const superGroups = await GammaService.getAllSuperGroups(); const org = await OrgService.getById(+orgId); if (!org) { notFound(); } + const user = (await SessionService.getGammaUser())?.user; + const canEdit = + divisionTreasurer || + group !== undefined || + user?.id === nameList.gammaUserId; + + const selectedGroup = nameList.gammaGroupId + ? groups.find((g) => g.id === nameList.gammaGroupId) + : null; + + const typeLabels = { + [NameListType.EVENT]: l.nameLists.types.event, + [NameListType.WORK_FOOD]: l.nameLists.types.workFood, + [NameListType.TEAMBUILDING]: l.nameLists.types.teambuilding, + [NameListType.PROFILE_CLOTHING]: l.nameLists.types.profileClothing + }; + + const superGroupsReverse = superGroups.reduce((acc, group) => { + acc[group.superGroup.id] = group; + return acc; + }, {} as Record); + + const isMembers = nameList.gammaNames.length > 0; + let displayNames: { name: string; amount: string }[] = []; + + if (isMembers) { + const group = groups.find(g => g.id === nameList.gammaGroupId); + const superGroupId = group?.superGroup.id; + const sg = superGroupsReverse[superGroupId ?? '']; + const members = sg ? sg.members : []; + displayNames = nameList.gammaNames.map(gn => { + const member = members.find(m => m.user.id === gn.gammaUserId); + return { + name: member ? `${member.user.firstName} "${member.user.nick}" ${member.user.lastName}` : 'Unknown', + amount: gn.cost.toString() + }; + }); + } else { + displayNames = nameList.names.map(n => ({ + name: n.name, + amount: n.cost.toString() + })); + } + return ( <> @@ -65,16 +113,66 @@ export default async function Page(props: { {l.nameLists.list} - {nameList.name} + {l.general.view} - + {canEdit && ( + + + + + )} + + + {l.nameLists.nameList} + + + + + {selectedGroup ? selectedGroup.prettyName : l.group.personal} + + + + + {nameList.name} + + + + {typeLabels[nameList.type]} + + + + {nameList.occurredAt.toLocaleDateString(locale)} + + + + {nameList.tracked ? l.general.yes : l.general.no} + + + + + + {l.nameLists.names} + + {displayNames.map((item, index) => ( + + {nameList.tracked ? item.amount : ''} + + ))} + {displayNames.length === 0 && ( + No names found + )} + + ); } diff --git a/src/app/[locale]/org/[orgId]/receipt-creator/ReceiptCreateForm.tsx b/src/app/[locale]/org/[orgId]/receipt-creator/ReceiptCreateForm.tsx index 137976c..416b73b 100644 --- a/src/app/[locale]/org/[orgId]/receipt-creator/ReceiptCreateForm.tsx +++ b/src/app/[locale]/org/[orgId]/receipt-creator/ReceiptCreateForm.tsx @@ -271,7 +271,7 @@ export default function ReceiptCreateForm({ {l.economy.product} {l.economy.count} - {l.economy.priceEach} + {l.economy.unitPrice} {l.economy.vat} diff --git a/src/app/[locale]/org/[orgId]/zettle-sales/edit/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/edit/page.tsx new file mode 100644 index 0000000..c53c825 --- /dev/null +++ b/src/app/[locale]/org/[orgId]/zettle-sales/edit/page.tsx @@ -0,0 +1,66 @@ +import { notFound } from 'next/navigation'; +import { Box } from '@chakra-ui/react'; +import { + BreadcrumbCurrentLink, + BreadcrumbLink, + BreadcrumbRoot +} from '@/components/ui/breadcrumb'; +import Link from 'next/link'; +import i18nService from '@/services/i18nService'; +import CreateZettleSaleForm from '../create/CreateZettleSaleForm'; +import ZettleSaleService from '@/services/zettleSaleService'; +import SessionService from '@/services/sessionService'; +import OrgService from '@/services/orgService'; + +export default async function Page(props: { + searchParams: Promise<{ id?: string }>; + params: Promise<{ locale: string; orgId: string }>; +}) { + const { locale, orgId } = await props.params; + const l = i18nService.getLocale(locale); + + const { id } = await props.searchParams; + if (id === undefined) { + notFound(); + } + + const sale = await ZettleSaleService.getById(+id); + if (sale === null) { + notFound(); + } + + const groups = (await SessionService.getGroups()).map((g) => g.group); + + const user = (await SessionService.getGammaUser())?.user; + const canEdit = user?.id === sale.gammaUserId; + + if (!canEdit) { + notFound(); + } + + const org = await OrgService.getById(+orgId); + if (!org) { + notFound(); + } + + return ( + <> + + + {l.home.title} + + + {l.home.zettleSales} + + {l.general.edit} + + + + + ); +} \ No newline at end of file diff --git a/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx b/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx index 90662ef..c22539f 100644 --- a/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx +++ b/src/app/[locale]/org/[orgId]/zettle-sales/view/page.tsx @@ -1,5 +1,5 @@ import { notFound } from 'next/navigation'; -import { Box } from '@chakra-ui/react'; +import { Box, Fieldset, Heading, Text } from '@chakra-ui/react'; import { BreadcrumbCurrentLink, BreadcrumbLink, @@ -7,10 +7,11 @@ import { } from '@/components/ui/breadcrumb'; import Link from 'next/link'; import i18nService from '@/services/i18nService'; -import CreateZettleSaleForm from '../create/CreateZettleSaleForm'; import ZettleSaleService from '@/services/zettleSaleService'; import SessionService from '@/services/sessionService'; import OrgService from '@/services/orgService'; +import { Button } from '@/components/ui/button'; +import { Field } from '@/components/ui/field'; export default async function Page(props: { searchParams: Promise<{ id?: string }>; @@ -31,11 +32,16 @@ export default async function Page(props: { const groups = (await SessionService.getGroups()).map((g) => g.group); + const user = (await SessionService.getGammaUser())?.user; + const canEdit = user?.id === sale.gammaUserId; + const org = await OrgService.getById(+orgId); if (!org) { notFound(); } + const selectedGroup = groups.find((g) => g.id === sale.gammaGroupId); + return ( <> @@ -45,15 +51,44 @@ export default async function Page(props: { {l.home.zettleSales} - {l.general.edit} + {l.general.view} - + {canEdit && ( + + + + )} + + + {l.zettleSales.zettleSale} + + + + {selectedGroup?.prettyName || l.general.unknown} + + + + {sale.name} + + + + {sale.saleDate.toLocaleDateString(locale)} + + + + {sale.amount} kr + + + + {sale.description || l.general.none} + + + ); } diff --git a/src/dictionaries/en.json b/src/dictionaries/en.json index 0ee8fe1..16c4123 100644 --- a/src/dictionaries/en.json +++ b/src/dictionaries/en.json @@ -27,7 +27,8 @@ "group": "Group", "noGroup": "No group", "selectGroup": "Select a group", - "unknownGroup": "Unknown group" + "unknownGroup": "Unknown group", + "personal": "Personal" }, "categories": { "nameLists": "Name Lists", @@ -41,6 +42,7 @@ }, "general": { "edit": "Edit", + "view": "View", "delete": "Delete", "description": "Description", "comment": "Comment", @@ -50,7 +52,11 @@ "save": "Save", "create": "Create", "export": "Export", - "import": "Import" + "import": "Import", + "none": "None", + "yes": "Yes", + "no": "No", + "unknown": "Unknown" }, "economy": { "name": "Name", @@ -71,7 +77,7 @@ "requestRevision": "Request Revision", "products": "Products", "product": "Product", - "priceEach": "Price Each", + "unitPrice": "Unit Price (ex. VAT)", "vat": "VAT", "count": "Count", "addProduct": "Add product" @@ -95,6 +101,10 @@ "customerOrderReference": "Customer Order Reference", "contractNumber": "Contract Number", "determinedWhenSent": "Determined when it is sent", + "notSent": "Not sent", + "item": "Item", + "quantity": "Quantity", + "subtotal": "Subtotal", "status": { "pending": "Awaiting Approval", "approved": "Awating Sending", @@ -116,6 +126,8 @@ "type": "Type", "invoiceType": "Invoice", "expenseType": "Reimbursement", + "expense": "Expense", + "invoice": "Invoice", "receipts": "Receipts", "receiptsUpload": "Upload Receipts", "name": "Name", @@ -134,7 +146,8 @@ "zettleSales": { "listNotFound": "No sales found", "listNotFoundDesc": "Adjust your filters or register a new sale", - "create": "Register sale" + "create": "Register sale", + "zettleSale": "Sale" }, "nameLists": { "title": "Name lists", @@ -142,6 +155,7 @@ "edit": "Edit name list", "listNotFound": "No name lists found", "listNotFoundDesc": "Adjust your filters or create a new name list", + "nameList": "Name List", "tracked": "Tracked", "people": "People", "format": "Name list format", @@ -153,9 +167,10 @@ "list": "Name lists", "listPersonal": "My name lists", "noNicks": "Remember to not use nicks in the name lists. Use the full name of the person instead.", + "type": "Type", "types": { "event": "Event", - "workFood": "Work Food", + "workFood": "Meeting Costs", "teambuilding": "Teambuilding", "profileClothing": "Profile Clothing" } diff --git a/src/dictionaries/sv.json b/src/dictionaries/sv.json index 111f110..775ced9 100644 --- a/src/dictionaries/sv.json +++ b/src/dictionaries/sv.json @@ -27,7 +27,8 @@ "group": "Grupp", "noGroup": "Ingen grupp", "selectGroup": "Välj en grupp", - "unknownGroup": "Okänd grupp" + "unknownGroup": "Okänd grupp", + "personal": "Personlig" }, "categories": { "nameLists": "Namnlistor", @@ -41,6 +42,7 @@ }, "general": { "edit": "Redigera", + "view": "Visa", "delete": "Radera", "description": "Beskrivning", "comment": "Kommentar", @@ -50,7 +52,11 @@ "save": "Spara", "create": "Skapa", "export": "Exportera", - "import": "Importera" + "import": "Importera", + "none": "Ingen", + "yes": "Ja", + "no": "Nej", + "unknown": "Okänd" }, "economy": { "name": "Namn", @@ -71,7 +77,7 @@ "requestRevision": "Begär ändring", "products": "Artiklar", "product": "Artikel", - "priceEach": "Á pris", + "unitPrice": "Á pris (ex. moms)", "vat": "Moms", "count": "Antal", "addProduct": "Lägg till artikel" @@ -81,6 +87,7 @@ "listNotFoundDesc": "Justera dina filter eller skapa en ny kundfaktura", "new": "Skicka faktura", "nameHint": "Kort beskrivning av fakturan", + "comments": "Kommentarer", "commentsHint": "Information för dig eller sektionskassören", "details": "Fakturadetaljer", "customerName": "Kundens namn", @@ -94,6 +101,10 @@ "customerOrderReference": "Er orderreferens", "contractNumber": "Kontraktsnummer", "determinedWhenSent": "Bestäms vid utskick", + "notSent": "Ej skickad", + "item": "Artikel", + "quantity": "Antal", + "subtotal": "Subtotal", "status": { "pending": "Inväntar godkännande", "approved": "Inväntar skickande", @@ -115,6 +126,8 @@ "type": "Typ", "invoiceType": "Faktura", "expenseType": "Utlägg", + "expense": "Kostnad", + "invoice": "Faktura", "description": "Kommentar", "receipts": "Bildunderlag", "receiptsUpload": "Ladda upp", @@ -134,7 +147,8 @@ "zettleSales": { "listNotFound": "Inga försäljningar hittades", "listNotFoundDesc": "Justera dina filter eller registrera en ny försäljning", - "create": "Registrera försäljning" + "create": "Registrera försäljning", + "zettleSale": "Försäljning" }, "nameLists": { "title": "Namnlistor", @@ -142,6 +156,7 @@ "edit": "Redigera namnlista", "listNotFound": "Inga namnlistor hittades", "listNotFoundDesc": "Justera dina filter eller skapa en ny namnlista", + "nameList": "Namnlista", "tracked": "Spårad", "people": "Personer", "format": "Listformat", @@ -153,9 +168,10 @@ "list": "Namnlistor", "listPersonal": "Mina namnlistor", "noNicks": "Kom ihåg att inte använda nicks i namnlistor. Använd istället personens fullständiga namn.", + "type": "Typ", "types": { "event": "Arrangemang", - "workFood": "Arbetsmat", + "workFood": "Möteskostnader", "teambuilding": "Teambuilding", "profileClothing": "Profilering" } From 279a3ede67f589a5846bd1e2adaf832edba9cb20 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Thu, 25 Dec 2025 23:51:15 +0100 Subject: [PATCH 34/35] Add dev dependency for typescript-eslint/parser --- package.json | 3 +- pnpm-lock.yaml | 140 +++++++++++++++++++++++++------------------------ 2 files changed, 73 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index 38ac6e7..080b788 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cashit", - "version": "0.5.0", + "version": "0.6.0", "private": true, "scripts": { "dev": "next dev --turbopack", @@ -32,6 +32,7 @@ "@types/react-dom": "19.2.3", "eslint": "^8", "eslint-config-next": "15.5.9", + "@typescript-eslint/parser": "8.50.1", "prisma": "6.6.0", "typescript": "^5" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c59a5e..46d3c1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,6 +70,9 @@ importers: '@types/react-dom': specifier: 19.2.3 version: 19.2.3(@types/react@19.2.7) + '@typescript-eslint/parser': + specifier: 8.50.1 + version: 8.50.1(eslint@8.57.1)(typescript@5.6.2) eslint: specifier: ^8 version: 8.57.1 @@ -735,63 +738,63 @@ packages: '@types/react@19.2.7': resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} - '@typescript-eslint/eslint-plugin@8.48.1': - resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} + '@typescript-eslint/eslint-plugin@8.50.1': + resolution: {integrity: sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.48.1 + '@typescript-eslint/parser': ^8.50.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.48.1': - resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} + '@typescript-eslint/parser@8.50.1': + resolution: {integrity: sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.48.1': - resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} + '@typescript-eslint/project-service@8.50.1': + resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.48.1': - resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} + '@typescript-eslint/scope-manager@8.50.1': + resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.48.1': - resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} + '@typescript-eslint/tsconfig-utils@8.50.1': + resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.48.1': - resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} + '@typescript-eslint/type-utils@8.50.1': + resolution: {integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.48.1': - resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} + '@typescript-eslint/types@8.50.1': + resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.48.1': - resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} + '@typescript-eslint/typescript-estree@8.50.1': + resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.48.1': - resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} + '@typescript-eslint/utils@8.50.1': + resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.48.1': - resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} + '@typescript-eslint/visitor-keys@8.50.1': + resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -3155,16 +3158,15 @@ snapshots: dependencies: csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.50.1(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/utils': 8.48.1(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/parser': 8.50.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/type-utils': 8.50.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/utils': 8.50.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.50.1 eslint: 8.57.1 - graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.6.2) @@ -3172,41 +3174,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.50.1 debug: 4.3.7 eslint: 8.57.1 typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.1(typescript@5.6.2)': + '@typescript-eslint/project-service@8.50.1(typescript@5.6.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.6.2) - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.6.2) + '@typescript-eslint/types': 8.50.1 debug: 4.3.7 typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.48.1': + '@typescript-eslint/scope-manager@8.50.1': dependencies: - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/visitor-keys': 8.50.1 - '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.6.2)': + '@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.6.2)': dependencies: typescript: 5.6.2 - '@typescript-eslint/type-utils@8.48.1(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/type-utils@8.50.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.2) - '@typescript-eslint/utils': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.6.2) + '@typescript-eslint/utils': 8.50.1(eslint@8.57.1)(typescript@5.6.2) debug: 4.3.7 eslint: 8.57.1 ts-api-utils: 2.1.0(typescript@5.6.2) @@ -3214,14 +3216,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.48.1': {} + '@typescript-eslint/types@8.50.1': {} - '@typescript-eslint/typescript-estree@8.48.1(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.50.1(typescript@5.6.2)': dependencies: - '@typescript-eslint/project-service': 8.48.1(typescript@5.6.2) - '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.6.2) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/project-service': 8.50.1(typescript@5.6.2) + '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.6.2) + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/visitor-keys': 8.50.1 debug: 4.3.7 minimatch: 9.0.5 semver: 7.7.3 @@ -3231,20 +3233,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.1(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/utils@8.50.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.6.2) eslint: 8.57.1 typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.48.1': + '@typescript-eslint/visitor-keys@8.50.1': dependencies: - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/types': 8.50.1 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.2.0': {} @@ -4250,12 +4252,12 @@ snapshots: dependencies: '@next/eslint-plugin-next': 15.5.9 '@rushstack/eslint-patch': 1.15.0 - '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 8.50.1(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.50.1(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.37.0(eslint@8.57.1) eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) @@ -4274,37 +4276,37 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.50.1(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4315,7 +4317,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.50.1(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4327,7 +4329,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.50.1(eslint@8.57.1)(typescript@5.6.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack From 760d30f27a2a55c1d51fca37d4e2d7dc55623d25 Mon Sep 17 00:00:00 2001 From: Goostaf Date: Fri, 26 Dec 2025 00:52:43 +0100 Subject: [PATCH 35/35] i18n --- src/app/[locale]/(orgless)/page.tsx | 2 +- .../bank-accounts/AddPermissionForm.tsx | 19 ++-- .../bank-accounts/DeleteAccountButton.tsx | 25 +++-- .../bank-accounts/DeleteRequisitionButton.tsx | 30 ++--- .../bank-accounts/RequisitionsList.tsx | 68 +++++------ .../bank-accounts/UpdateAccountsButton.tsx | 2 +- .../add-account/AddAccountForm.tsx | 29 +++-- .../bank-accounts/add-account/page.tsx | 7 +- .../connect/AddRequisitionForm.tsx | 29 +++-- .../[orgId]/bank-accounts/connect/page.tsx | 7 +- .../bank-accounts/finalize-connect/page.tsx | 9 +- .../bank-accounts/finalize-reconnect/page.tsx | 1 + .../org/[orgId]/bank-accounts/page.tsx | 10 +- .../bank-accounts/permissions/page.tsx | 5 +- .../reconnect/RecreateRequisitionButton.tsx | 10 +- .../[orgId]/bank-accounts/reconnect/page.tsx | 25 ++++- .../[orgId]/bank-accounts/settings/page.tsx | 5 +- .../BankAccountManager/BankAccountManager.tsx | 93 +++++++++------ src/dictionaries/en.json | 106 +++++++++++++++++- src/dictionaries/sv.json | 106 +++++++++++++++++- 20 files changed, 430 insertions(+), 158 deletions(-) diff --git a/src/app/[locale]/(orgless)/page.tsx b/src/app/[locale]/(orgless)/page.tsx index 027ba68..5e74e33 100644 --- a/src/app/[locale]/(orgless)/page.tsx +++ b/src/app/[locale]/(orgless)/page.tsx @@ -14,7 +14,7 @@ export default async function Page(props: { return ( <> - Choose an organization + {l.navigation.chooseOrganization} diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/AddPermissionForm.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/AddPermissionForm.tsx index 82749ca..c79603b 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/AddPermissionForm.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/AddPermissionForm.tsx @@ -1,6 +1,7 @@ 'use client'; import { Button } from '@/components/ui/button'; +import i18nService from '@/services/i18nService'; import { Field } from '@/components/ui/field'; import { GammaSuperGroup } from '@/types/gamma'; import { @@ -21,7 +22,8 @@ export default function AddPermissionForm({ accounts, groups, selectedAccountId, - orgId + orgId, + locale }: { accounts: Prisma.BankAccountGetPayload<{}>[]; groups: { @@ -32,7 +34,10 @@ export default function AddPermissionForm({ }[]; selectedAccountId?: string; orgId: string; + locale: string; }) { + const l = i18nService.getLocale(locale); + const d = l.dialogs; const router = useRouter(); const [selectedGroups, setSelectedGroups] = useState([]); @@ -90,9 +95,9 @@ export default function AddPermissionForm({ return ( - Set Account Access + {d.setAccountAccess} - + - + {accs.items.map((item) => ( @@ -113,7 +118,7 @@ export default function AddPermissionForm({ - + - + {groupList.items.map((acc) => ( @@ -137,7 +142,7 @@ export default function AddPermissionForm({ ); diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/DeleteAccountButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/DeleteAccountButton.tsx index 79b4b5c..c54cc1e 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/DeleteAccountButton.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/DeleteAccountButton.tsx @@ -1,6 +1,7 @@ 'use client'; import { Button } from '@/components/ui/button'; +import i18nService from '@/services/i18nService'; import { deleteBankAccount } from '@/actions/bankAccounts'; import { useCallback, useState } from 'react'; import { useRouter } from 'next/navigation'; @@ -19,10 +20,14 @@ import { import { IconButton } from '@chakra-ui/react'; export default function DeleteAccountButton({ - goCardlessId + goCardlessId, + locale }: { goCardlessId: string; + locale: string; }) { + const l = i18nService.getLocale(locale); + const d = l.dialogs; const router = useRouter(); const [deleting, setDeleting] = useState(false); const [open, setOpen] = useState(false); @@ -50,28 +55,24 @@ export default function DeleteAccountButton({ - Delete Account + {d.deleteAccountTitle} -

- Are you sure you want to delete this account? This will permanently - remove: -

+

{d.deleteAccountConfirm}

    -
  • Account transaction history
  • -
  • Account permissions
  • +
  • {d.deleteAccountTransactions}
  • +
  • {d.deleteAccountPermissions}

- Note that you will be able to add this account again in the future, - at the loss of the above. + {d.deleteAccountNote}

- + diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx index 41f391e..d47c862 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/DeleteRequisitionButton.tsx @@ -16,14 +16,20 @@ import { DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; +import i18nService from '@/services/i18nService'; export default function DeleteRequisitionButton({ requisitionId, - accountCount + accountCount, + locale }: { requisitionId: string; accountCount: number; + locale: string; }) { + const l = i18nService.getLocale(locale); + const d = l.dialogs; + const router = useRouter(); const [deleting, setDeleting] = useState(false); const [open, setOpen] = useState(false); @@ -46,38 +52,36 @@ export default function DeleteRequisitionButton({ - Delete Bank Connection + {d.deleteConnectionTitle} -

- Are you sure you want to delete this bank connection? This will permanently remove: -

+

{d.deleteConnectionConfirm}

    -
  • The connection itself
  • -
  • {accountCount} bank account{accountCount !== 1 ? 's' : ''}
  • -
  • All transaction history
  • -
  • All permission settings
  • +
  • {d.deleteConnectionConnection}
  • +
  • {accountCount} {d.deleteConnectionBankAccounts.replace('{count}', accountCount !== 1 ? 's' : '')}
  • +
  • {d.deleteConnectionTransactions}
  • +
  • {d.deleteConnectionPermissions}

- This action cannot be undone. + {d.deleteConnectionWarning}

- + diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx index 0602388..534cc85 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/RequisitionsList.tsx @@ -21,35 +21,23 @@ import DeleteAccountButton from './DeleteAccountButton'; const RequisitionsList = ({ requisitions, groups: _groups, - orgId + orgId, + locale }: { requisitions: Awaited< ReturnType >; groups: Awaited>; orgId: number; + locale: string; }) => { + const l = i18nService.getLocale(locale); const getStatusLabel = (status: string) => { - switch (status) { - case 'CR': - return 'Created'; - case 'GC': - return 'Giving Consent'; - case 'UA': - return 'Undergoing Authentication'; - case 'RJ': - return 'Rejected'; - case 'SA': - return 'Selecting Accounts'; - case 'GA': - return 'Granting Access'; - case 'LN': - return 'Linked'; - case 'EX': - return 'Expired'; - default: - return 'Unknown'; - } + return ( + l.bankConnections.status[ + status as keyof typeof l.bankConnections.status + ] || l.bankConnections.status.unknown + ); }; const getStatusColor = (status: string) => { @@ -74,12 +62,12 @@ const RequisitionsList = ({ - Bank Account Connections + {l.bankConnections.title} @@ -93,10 +81,10 @@ const RequisitionsList = ({ textAlign="center" > - No bank connections found + {l.bankConnections.noConnectionsFound} - Connect your first bank account to get started. + {l.bankConnections.connectFirstAccount}
) : ( @@ -123,7 +111,9 @@ const RequisitionsList = ({ {/* Requisition header */} - Connection #{requisition.id} + + {l.bankConnections.connectionNo} #{requisition.id} + )} @@ -149,12 +139,13 @@ const RequisitionsList = ({ > @@ -164,13 +155,14 @@ const RequisitionsList = ({ - Available in connection + {l.bankConnections.availableInConnection} {i18nService.formatNumber(totalAvailable)} - Booked: {i18nService.formatNumber(totalBooked)} + {l.bankConnections.booked}:{' '} + {i18nService.formatNumber(totalBooked)} @@ -197,7 +189,7 @@ const RequisitionsList = ({ - Refreshed{' '} + {l.bankConnections.refreshed}{' '} {i18nService.formatRelative( account.updatedAt, 'en' @@ -207,14 +199,13 @@ const RequisitionsList = ({ {account.gammaSuperGroupAccesses.length > 0 ? ( <> {account.gammaSuperGroupAccesses.length}{' '} - group - {account.gammaSuperGroupAccesses.length !== + {account.gammaSuperGroupAccesses.length === 1 - ? 's' - : ''} + ? l.bankConnections.groupSingular + : l.bankConnections.groupPlural} ) : ( - 'No permissions' + l.bankAccounts.noPermissions )} @@ -234,7 +225,7 @@ const RequisitionsList = ({ - Booked:{' '} + {l.bankConnections.booked}:{' '} {new Intl.NumberFormat('sv-SE').format( account.balanceBooked )} @@ -251,6 +242,7 @@ const RequisitionsList = ({ @@ -261,7 +253,7 @@ const RequisitionsList = ({ ) : ( - No bank accounts found in this connection + {l.bankConnections.noBankAccountsFound} )} diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx index 89f4249..73df606 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/UpdateAccountsButton.tsx @@ -26,7 +26,7 @@ export default function UpdateAccountsButton({ locale }: { locale: string }) { onClick={updateBankAccounts} disabled={refreshing} > - {refreshing ? 'Refreshing' : l.bankAccounts.refresh} + {refreshing ? l.dialogs.deleting : l.bankAccounts.refresh} ); } diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx index af40a9a..82ed146 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/add-account/AddAccountForm.tsx @@ -13,6 +13,7 @@ import { SelectValueText } from '@/components/ui/select'; import { Requisition } from '@/services/goCardlessService'; +import i18nService from '@/services/i18nService'; import { Box, createListCollection, Text } from '@chakra-ui/react'; import { Prisma } from '@prisma/client'; import { useRouter } from 'next/navigation'; @@ -42,13 +43,16 @@ interface AccountOption { export default function AddAccountForm({ requisition, accounts, - orgId + orgId, + locale }: { requisition: Requisition; accounts: Prisma.BankAccountGetPayload<{}>[]; orgId: string; + locale: string; }) { const router = useRouter(); + const l = i18nService.getLocale(locale); const [accId, setAccId] = useState(); const [accountOptions, setAccountOptions] = useState([]); const [isLoading, setIsLoading] = useState(true); @@ -138,11 +142,9 @@ export default function AddAccountForm({ textAlign="center" > - Loading Available Accounts... - - - Fetching account details from your bank connection. + {l.addAccount.loading} + {l.addAccount.loadingDescription}
); } @@ -157,14 +159,13 @@ export default function AddAccountForm({ textAlign="center" > - No New Accounts Available + {l.addAccount.noAccountsAvailable} - All accounts from this bank connection have already been registered in - the system. + {l.addAccount.noAccountsMessage} - You can view your existing accounts on the main bank accounts page. + {l.addAccount.viewExistingAccounts}
); @@ -173,13 +174,11 @@ export default function AddAccountForm({ return ( - Select an account from your bank connection to add to the system. You - can then set permissions and start managing transactions for this - account. + {l.addAccount.selectDescription}
- + - + {requisitionAccounts.items.map((item) => ( @@ -203,7 +202,7 @@ export default function AddAccountForm({ diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx index a552819..877c4ee 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/add-account/page.tsx @@ -45,17 +45,20 @@ export default async function Page(props: { {l.bankAccounts.title} - Add Bank Account + + {l.accountManagement.addBankAccount} +
- Add Bank Account + {l.accountManagement.addBankAccount} ); diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx index be58299..ef0cafc 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/connect/AddRequisitionForm.tsx @@ -15,6 +15,7 @@ import { SelectValueText } from '@/components/ui/select'; import { Requisition } from '@/services/goCardlessService'; +import i18nService from '@/services/i18nService'; import { Box, createListCollection, @@ -38,13 +39,16 @@ interface Institution { export default function AddRequisitionForm({ requisitions, institutions, - orgId + orgId, + locale }: { requisitions: Requisition[]; institutions: Institution[]; orgId: string; + locale: string; }) { const router = useRouter(); + const l = i18nService.getLocale(locale); const [existingRequisitionId, setExistingRequisitionId] = useState< string | undefined >(); @@ -116,15 +120,14 @@ export default function AddRequisitionForm({ {requisitions.length > 0 && ( - Use Existing Connection + {l.bankConnections.useExisting} - These are connections you've created before but haven't - registered locally yet. + {l.bankConnections.existingDescription}
- + - + {existingReqs.items.map((item) => ( @@ -151,7 +156,7 @@ export default function AddRequisitionForm({ disabled={!existingRequisitionId || isSubmitting} loading={isSubmitting} > - Register Connection + {l.general.create}
@@ -161,14 +166,14 @@ export default function AddRequisitionForm({ {/* Create New Connection */} - Create New Connection + {l.bankConnections.newConnection} - Connect to a new bank by selecting your financial institution. + {l.bankConnections.newConnection}
- + - + {institutionList.items.map((item) => ( @@ -193,7 +198,7 @@ export default function AddRequisitionForm({ disabled={!newInstitutionId || isSubmitting} loading={isSubmitting} > - Connect to Bank + {l.bankConnections.addConnection}
diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx index e9676b6..0cc62a5 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/connect/page.tsx @@ -40,17 +40,20 @@ export default async function Page(props: { {l.bankAccounts.title} - Add Connection + + {l.bankConnections.addConnection} +
- Add Connection + {l.bankConnections.addConnection} ); diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx index ec1bd2a..bf63e73 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-connect/page.tsx @@ -63,14 +63,16 @@ export default async function Page(props: { {l.bankAccounts.title}
- Add Connection + {l.bankConnections.addConnection} - Finalize Connection + + {l.bankConnections.addConnection} +
- Finalize Bank Connection + {l.bankConnections.addConnection} ); diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx index b21ee10..5c9d731 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/finalize-reconnect/page.tsx @@ -77,6 +77,7 @@ export default async function Page(props: { requisitionId={requisition.id} existingAccounts={existingAccounts} orgId={orgId} + locale={locale} /> ); diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx index a905a53..8700366 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/page.tsx @@ -50,9 +50,7 @@ export default async function Page(props: {
- - Note! Bank accounts are currently shared between every organization. - + {l.bankAccounts.sharedNote} @@ -62,13 +60,14 @@ export default async function Page(props: { - Total Available Balance + {l.bankAccounts.totalAvailableBalance} {new Intl.NumberFormat('sv-SE').format(totalAvailable)} - Booked: {new Intl.NumberFormat('sv-SE').format(totalBooked)} + {l.bankAccounts.bookedBalance}:{' '} + {new Intl.NumberFormat('sv-SE').format(totalBooked)} @@ -77,6 +76,7 @@ export default async function Page(props: { requisitions={localRequisitions} groups={groups} orgId={Number(orgId)} + locale={locale} /> diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/permissions/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/permissions/page.tsx index 9fbf24a..4f0b833 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/permissions/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/permissions/page.tsx @@ -38,12 +38,12 @@ export default async function Page(props: { {l.bankAccounts.title} - Manage Permissions + {l.bankAccounts.managePermissions}
- Manage Bank Account Permissions + {l.bankAccounts.managePermissions} ); diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx index a6a6104..cdc5685 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/RecreateRequisitionButton.tsx @@ -1,23 +1,29 @@ 'use client'; + import { recreateRequisition } from '@/actions/goCardless'; import { Button } from '@chakra-ui/react'; import { useRouter } from 'next/navigation'; +import i18nService from '@/services/i18nService'; + const RecreateRequisitionButton = ({ id, - orgId + orgId, + locale }: { id: string; orgId: string; + locale: string; }) => { + const l = i18nService.getLocale(locale); const router = useRouter(); const handleClick = async () => { const req = await recreateRequisition(id, orgId); router.push(req.link); }; - return ; + return ; }; export default RecreateRequisitionButton; diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx index 8583b87..3417510 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/reconnect/page.tsx @@ -1,4 +1,4 @@ -import { Box, Heading } from '@chakra-ui/react'; +import { Box, Heading, Text } from '@chakra-ui/react'; import { BreadcrumbCurrentLink, BreadcrumbLink, @@ -42,15 +42,30 @@ export default async function Page(props: { {l.bankAccounts.title} - Reconnect Accounts + + {l.accountManagement.reconnectBankAccounts} +
- Reconnect Accounts + {l.accountManagement.reconnectBankAccounts} -

Create a new requisition and transfer accounts?

- + + {l.accountManagement.connectDescription + .replace('{count}', requisition.accounts.length.toString()) + .replace( + '{plural}', + requisition.accounts.length !== 1 + ? l.accountManagement.accounts + : l.accountManagement.account + )} + + ); } diff --git a/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx b/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx index 5150533..30fb753 100644 --- a/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx +++ b/src/app/[locale]/org/[orgId]/bank-accounts/settings/page.tsx @@ -38,12 +38,12 @@ export default async function Page(props: { {l.bankAccounts.title} - Account Settings + {l.bankAccounts.settings}
- Bank Account Settings + {l.bankAccounts.settings} ); diff --git a/src/components/BankAccountManager/BankAccountManager.tsx b/src/components/BankAccountManager/BankAccountManager.tsx index fac94e6..ab766ac 100644 --- a/src/components/BankAccountManager/BankAccountManager.tsx +++ b/src/components/BankAccountManager/BankAccountManager.tsx @@ -23,6 +23,7 @@ import { SelectValueText } from '@/components/ui/select'; import { createListCollection } from '@chakra-ui/react'; +import i18nService from '@/services/i18nService'; import { getCachedAccountDetails, registerNewBankAccount, @@ -82,11 +83,13 @@ interface ReconnectModeProps { type BankAccountManagerProps = (ConnectModeProps | ReconnectModeProps) & { orgId: string; + locale: string; }; export default function BankAccountManager(props: BankAccountManagerProps) { - const { mode, existingAccounts, orgId } = props; + const { mode, existingAccounts, orgId, locale } = props; const router = useRouter(); + const l = i18nService.getLocale(locale); // Extract accounts and requisitionId based on mode const accounts = @@ -148,12 +151,12 @@ export default function BankAccountManager(props: BankAccountManagerProps) { [accountId]: { ...prev[accountId], loading: false, - error: 'Failed to load account details' + error: l.accountManagement.error } })); }); }); - }, [accounts, requisitionId, mode, router, existingAccounts, orgId]); + }, [accounts, requisitionId, mode, router, existingAccounts, orgId, l]); const updateAccountState = ( accountId: string, @@ -200,7 +203,10 @@ export default function BankAccountManager(props: BankAccountManagerProps) { } catch (error) { updateAccountState(accountId, { loading: false, - error: error instanceof Error ? error.message : 'Operation failed' + error: + error instanceof Error + ? error.message + : l.accountManagement.operationFailed }); } } @@ -252,25 +258,34 @@ export default function BankAccountManager(props: BankAccountManagerProps) { const getTitle = () => { switch (mode) { case 'connect': - return 'New Bank Connection'; + return l.accountManagement.newBankConnection; case 'reconnect': - return 'Reconnect Bank Accounts'; + return l.accountManagement.reconnectBankAccounts; default: - return 'Manage Bank Accounts'; + return l.accountManagement.manageBankAccounts; } }; const getDescription = () => { const accountCount = accounts.length; - const accountText = accountCount !== 1 ? 's' : ''; + const plural = + accountCount !== 1 + ? l.accountManagement.accounts + : l.accountManagement.account; switch (mode) { case 'connect': - return `Found ${accountCount} account${accountText} in your new connection. Choose what to do with each account below, then process all changes at once.`; + return l.accountManagement.connectDescription + .replace('{count}', accountCount.toString()) + .replace('{plural}', plural); case 'reconnect': - return `Found ${accountCount} account${accountText} to reconnect. Choose what to do with each account below, then process all changes at once.`; + return l.accountManagement.reconnectDescription + .replace('{count}', accountCount.toString()) + .replace('{plural}', plural); default: - return `Found ${accountCount} account${accountText}. Choose what to do with each account below.`; + return l.accountManagement.defaultDescription + .replace('{count}', accountCount.toString()) + .replace('{plural}', plural); } }; @@ -278,13 +293,13 @@ export default function BankAccountManager(props: BankAccountManagerProps) { return ( - ✅ {mode === 'connect' ? 'Connection' : 'Reconnection'} Completed - Successfully! + ✅{' '} + {mode === 'connect' + ? l.accountManagement.newBankConnection + : l.accountManagement.reconnectBankAccounts}{' '} + {l.accountManagement.completedSuccessfully} - - All selected accounts have been processed. Redirecting to bank - accounts... - + {l.accountManagement.allAccountsProcessed} ); } @@ -301,13 +316,13 @@ export default function BankAccountManager(props: BankAccountManagerProps) { {accounts.length === 0 && ( - No Accounts Found + {l.bankConnections.noConnectionsFound} - No bank accounts were found in this connection. + {l.bankConnections.noBankAccountsFound} - Redirecting to bank accounts page... + {l.accountManagement.redirectingToAccounts} )} @@ -333,7 +348,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { {state.loading - ? 'Loading account details...' + ? l.accountManagement.loadingDetails + '...' : state.details?.account.name || state.details?.account.product || accountId} @@ -344,8 +359,14 @@ export default function BankAccountManager(props: BankAccountManagerProps) { )} - {state.success && Processed} - {state.error && Error} + {state.success && ( + + {l.accountManagement.processed} + + )} + {state.error && ( + {l.accountManagement.error} + )} {state.error && ( @@ -363,7 +384,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { )} {!state.loading && !state.success && ( - + @@ -374,7 +395,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { > - Do nothing (skip this account) + {l.accountManagement.doNothing} - Register as new account + {l.accountManagement.registerAsNew} {existingAccountWithSameIban && ( - IBAN already exists + {l.accountManagement.ibanExists} )} {existingAccounts.length > 0 && ( - Merge with existing account + + {l.accountManagement.mergeWithExisting} + )} @@ -400,7 +423,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { )} {state.action === 'register' && !state.success && ( - + )} @@ -421,7 +444,7 @@ export default function BankAccountManager(props: BankAccountManagerProps) { {state.action === 'merge' && existingAccounts.length > 0 && !state.success && ( - + - + {existingAccountOptions.items.map((item) => ( @@ -462,14 +487,14 @@ export default function BankAccountManager(props: BankAccountManagerProps) { variant="outline" onClick={() => router.push(`/org/${orgId}/bank-accounts`)} > - Cancel + {l.general.delete} )} diff --git a/src/dictionaries/en.json b/src/dictionaries/en.json index 16c4123..5e6dbf6 100644 --- a/src/dictionaries/en.json +++ b/src/dictionaries/en.json @@ -212,7 +212,15 @@ "transactionPending": "Pending", "transactionDate": "Transaction date", "bookDate": "Booking date", - "reference": "Reference" + "reference": "Reference", + "sharedNote": "Note! Bank accounts are currently shared between every organization.", + "totalAvailableBalance": "Total Available Balance", + "noPermissions": "No permissions", + "settings": "Account Settings", + "managePermissions": "Manage Bank Account Permissions", + "addBankAccount": "Add Bank Account", + "allPermissionSettings": "All permission settings", + "accountPermissions": "Account permissions" }, "userSettings": { "title": "User Settings", @@ -225,5 +233,101 @@ "purchaserHint": "Name of the person who made the purchase", "treasurer": "Treasurer", "treasurerHint": "Name of the person who will approve or certify the purchase" + }, + "addAccount": { + "loading": "Loading Available Accounts...", + "loadingDescription": "Fetching account details from your bank connection.", + "noAccountsAvailable": "No New Accounts Available", + "noAccountsMessage": "All accounts from this bank connection have already been registered in the system.", + "viewExistingAccounts": "You can view your existing accounts on the main bank accounts page.", + "selectDescription": "Select an account from your bank connection to add to the system. You can then set permissions and start managing transactions for this account.", + "selectLabel": "Select Account", + "selectPlaceholder": "Choose an account to add", + "addButton": "Add Account" + }, + "bankConnections": { + "title": "Bank Account Connections", + "addConnection": "Add bank connection", + "connectionNo": "Connection", + "noConnectionsFound": "No bank connections found", + "connectFirstAccount": "Connect your first bank account to get started.", + "noBankAccountsFound": "No bank accounts found in this connection", + "reconnect": "Reconnect", + "addAccount": "Add Account", + "availableInConnection": "Available in connection", + "booked": "Booked", + "refreshed": "Refreshed", + "groupSingular": "group", + "groupPlural": "groups", + "useExisting": "Use Existing Connection", + "existingDescription": "These are connections you've created before but haven't registered locally yet.", + "newConnection": "Connect to a new bank by selecting your financial institution.", + "selectConnection": "Select a connection", + "selectPlaceholder": "Select a connection", + "status": { + "CR": "Created", + "GC": "Giving Consent", + "UA": "Undergoing Authentication", + "RJ": "Rejected", + "SA": "Selecting Accounts", + "GA": "Granting Access", + "LN": "Linked", + "EX": "Expired", + "unknown": "Unknown" + } + }, + "accountManagement": { + "accountDetails": "Account Details", + "doNothing": "Do nothing (skip this account)", + "registerAsNew": "Register as new account", + "ibanExists": "IBAN already exists", + "mergeWithExisting": "Merge with existing account", + "accountName": "Account Name", + "whatToDo": "What would you like to do with this account?", + "processed": "Processed", + "error": "Error", + "operationFailed": "Operation failed", + "chooseAccount": "Choose an account to add", + "noNewAccounts": "No New Accounts Available", + "viewExisting": "You can view your existing accounts on the main bank accounts page.", + "addBankAccount": "Add Bank Account", + "settings": "Bank Account Settings", + "managePermissions": "Manage Bank Account Permissions", + "newBankConnection": "New Bank Connection", + "reconnectBankAccounts": "Reconnect Bank Accounts", + "manageBankAccounts": "Manage Bank Accounts", + "connectDescription": "Found {count} {plural} in your new connection. Choose what to do with each account below, then process all changes at once.", + "reconnectDescription": "Found {count} {plural} to reconnect. Choose what to do with each account below, then process all changes at once.", + "defaultDescription": "Found {count} {plural}. Choose what to do with each account below.", + "accounts": "accounts", + "account": "account", + "completedSuccessfully": "completed successfully!", + "allAccountsProcessed": "All selected accounts have been processed. Redirecting to bank accounts...", + "redirectingToAccounts": "Redirecting to bank accounts page...", + "loadingDetails": "Loading details" + }, + "dialogs": { + "deleteConnectionTitle": "Delete Bank Connection", + "deleteConnectionConfirm": "Are you sure you want to delete this bank connection? This will permanently remove:", + "deleteConnectionConnection": "The connection itself", + "deleteConnectionBankAccounts": "bank account{count}", + "deleteConnectionTransactions": "All transaction history", + "deleteConnectionPermissions": "All permission settings", + "deleteConnectionWarning": "This action cannot be undone.", + "deleteAccountTitle": "Delete Account", + "deleteAccountConfirm": "Are you sure you want to delete this account? This will permanently remove:", + "deleteAccountTransactions": "Account transaction history", + "deleteAccountPermissions": "Account permissions", + "deleteAccountNote": "Note that you will be able to add this account again in the future, at the loss of the above.", + "deleting": "Deleting...", + "cancel": "Cancel", + "setAccountAccess": "Set Account Access", + "selectAccount": "Select an account", + "superGroups": "Super Group(s)", + "selectGroups": "Select group(s)", + "submit": "Submit" + }, + "navigation": { + "chooseOrganization": "Choose an organization" } } diff --git a/src/dictionaries/sv.json b/src/dictionaries/sv.json index 775ced9..f99d724 100644 --- a/src/dictionaries/sv.json +++ b/src/dictionaries/sv.json @@ -213,7 +213,15 @@ "transactionPending": "Reserverad", "transactionDate": "Transaktionsdatum", "bookDate": "Bokföringsdatum", - "reference": "Reference" + "reference": "Reference", + "sharedNote": "Observera! Bankkonton delas för närvarande mellan alla organisationer.", + "totalAvailableBalance": "Totalt tillgängligt saldo", + "noPermissions": "Inga behörigheter", + "settings": "Kontoinställningar", + "managePermissions": "Hantera bankkontobehörigheter", + "addBankAccount": "Lägg till bankkonto", + "allPermissionSettings": "Alla behörighetsinställningar", + "accountPermissions": "Kontobehörigheter" }, "userSettings": { "title": "Användarinställningar", @@ -226,5 +234,101 @@ "purchaserHint": "Namn på den som gjort inköpet", "treasurer": "Kassör", "treasurerHint": "Namn på den som ska godkänna eller attestera inköpet" + }, + "addAccount": { + "loading": "Laddar tillgängliga konton...", + "loadingDescription": "Hämtar kontodetaljer från din bankkoppling.", + "noAccountsAvailable": "Inga nya konton tillgängliga", + "noAccountsMessage": "Alla konton från denna bankkoppling har redan registrerats i systemet.", + "viewExistingAccounts": "Du kan visa dina befintliga konton på huvudsidan för bankkonton.", + "selectDescription": "Välj ett konto från din bankkoppling för att lägga till i systemet. Du kan sedan ställa in behörigheter och börja hantera transaktioner för detta konto.", + "selectLabel": "Välj konto", + "selectPlaceholder": "Välj ett konto att lägga till", + "addButton": "Lägg till konto" + }, + "bankConnections": { + "title": "Bankkopplingar", + "addConnection": "Lägg till bankkoppling", + "connectionNo": "Anslutning", + "noConnectionsFound": "Inga bankkopplingar hittades", + "connectFirstAccount": "Anslut ditt första bankkonto för att komma igång.", + "noBankAccountsFound": "Inga bankkonton hittades i denna anslutning", + "reconnect": "Återanslut", + "addAccount": "Lägg till konto", + "availableInConnection": "Tillgängligt i anslutning", + "booked": "Bokfört", + "refreshed": "Uppdaterad", + "groupSingular": "grupp", + "groupPlural": "grupper", + "useExisting": "Använd befintlig anslutning", + "existingDescription": "Det här är anslutningar du har skapat tidigare men inte registrerat lokalt än.", + "newConnection": "Anslut till en ny bank genom att välja finansinstitut", + "selectConnection": "Välj en anslutning", + "selectPlaceholder": "Välj en anslutning", + "status": { + "CR": "Skapad", + "GC": "Ger samtycke", + "UA": "Genomför autentisering", + "RJ": "Avvisad", + "SA": "Väljer konton", + "GA": "Ger åtkomst", + "LN": "Länkad", + "EX": "Utgångna", + "unknown": "Okänd" + } + }, + "accountManagement": { + "accountDetails": "Kontoinformation", + "doNothing": "Gör inget (hoppa över detta konto)", + "registerAsNew": "Registrera som nytt konto", + "ibanExists": "IBAN finns redan", + "mergeWithExisting": "Sammanfoga med befintligt konto", + "accountName": "Kontonamn", + "whatToDo": "Vad vill du göra med detta konto?", + "processed": "Behandlad", + "error": "Fel", + "operationFailed": "Operationen misslyckades", + "chooseAccount": "Välj ett konto att lägga till", + "noNewAccounts": "Inga nya konton tillgängliga", + "viewExisting": "Du kan visa dina befintliga konton på sidan för bankkonton.", + "addBankAccount": "Lägg till bankkonto", + "settings": "Inställningar för bankkonto", + "managePermissions": "Hantera behörigheter för bankkonto", + "newBankConnection": "Ny bankkoppling", + "reconnectBankAccounts": "Återanslut bankkonton", + "manageBankAccounts": "Hantera bankkonton", + "connectDescription": "Hittade {count} {plural} i din nya anslutning. Välj vad du vill göra med varje konto nedan.", + "reconnectDescription": "Hittade {count} {plural} att återansluta. Välj vad du vill göra med varje konto nedan.", + "defaultDescription": "Hittade {count} {plural}. Välj vad du vill göra med varje konto nedan.", + "accounts": "konton", + "account": "konto", + "completedSuccessfully": "lyckades!", + "allAccountsProcessed": "Alla valda konton har bearbetats. Omdirigerar till bankkonton...", + "redirectingToAccounts": "Omdirigerar till sidan för bankkonton...", + "loadingDetails": "Laddar detaljer" + }, + "dialogs": { + "deleteConnectionTitle": "Ta bort bankkoppling", + "deleteConnectionConfirm": "Är du säker på att du vill ta bort denna bankkoppling? Detta tar permanent bort:", + "deleteConnectionConnection": "Uppkopplingen själv", + "deleteConnectionBankAccounts": "bankkonto{count}", + "deleteConnectionTransactions": "All transaktionshistorik", + "deleteConnectionPermissions": "Alla behörighetsinställningar", + "deleteConnectionWarning": "Detta kan inte ångras.", + "deleteAccountTitle": "Ta bort konto", + "deleteAccountConfirm": "Är du säker på att du vill ta bort detta konto? Detta tar permanent bort:", + "deleteAccountTransactions": "Transaktionshistorik", + "deleteAccountPermissions": "Behörigheter", + "deleteAccountNote": "Observera att du kommer att kunna lägga till detta konto igen i framtiden, dock utan ovanstående.", + "deleting": "Tar bort...", + "cancel": "Avbryt", + "setAccountAccess": "Ange kontoåtkomst", + "selectAccount": "Välj ett konto", + "superGroups": "Supergrupp(er)", + "selectGroups": "Välj grupp(er)", + "submit": "Skicka" + }, + "navigation": { + "chooseOrganization": "Välj en organisation" } }