From d4767e0d0656ab09f218403ce66ed0c46555b4cd Mon Sep 17 00:00:00 2001 From: Nathnael Date: Wed, 12 Aug 2026 07:11:27 +0000 Subject: [PATCH 1/4] fix: an issue --- .../modules/companies/companies.service.ts | 78 ++++++++++--------- .../onboarding-requirements-response.dto.ts | 11 +-- .../file-upload-settings.service.ts | 5 -- .../poa-delegation.constants.ts | 9 ++- .../src/seed/file-upload-settings.seeder.ts | 45 ++++++++--- .../onboarding/OnboardingWizardDialog.tsx | 26 +++---- .../src/pages/accounts/CompanyProfileForm.tsx | 36 ++------- .../new-booking-form/step-documents.tsx | 21 +++-- .../resubmit/useBookingDocumentSetting.ts | 23 +++--- .../new-contract-form/ContractDocsEditor.tsx | 21 +++-- .../new-contract-form/step-documents.tsx | 20 +++-- .../src/pages/settings/NationalitySelect.tsx | 21 +++-- .../src/pages/settings/TabDocuments.tsx | 13 ++-- .../portal/src/services/companies.service.ts | 8 +- .../src/utils/documentSettingCode.test.ts | 28 +++++++ .../portal/src/utils/documentSettingCode.ts | 18 +++++ 16 files changed, 206 insertions(+), 177 deletions(-) create mode 100644 apps/edr-freight-web/portal/src/utils/documentSettingCode.test.ts create mode 100644 apps/edr-freight-web/portal/src/utils/documentSettingCode.ts diff --git a/apps/edr-freight-api/src/modules/companies/companies.service.ts b/apps/edr-freight-api/src/modules/companies/companies.service.ts index cf2f2e84d..98b30f006 100644 --- a/apps/edr-freight-api/src/modules/companies/companies.service.ts +++ b/apps/edr-freight-api/src/modules/companies/companies.service.ts @@ -256,11 +256,15 @@ export class CompaniesService { }, ]; - /** The nationality-based document setting code for a company. */ - private documentSettingCodeFor( - nationality: CompanyNationality | null | undefined, - ): string { - return nationality === CompanyNationality.Foreign + /** + * The document setting code for a company: one of three mutually exclusive + * sets. A co-operative union or farm resolves to its own set regardless of + * nationality — it holds no business licence, so it owes a different list of + * papers rather than the nationality list plus extras. + */ + private documentSettingCodeFor(company: Company): string { + if (isCooperative(company)) return COOPERATIVE_ONBOARDING_CODE; + return company.nationality === CompanyNationality.Foreign ? "company_onboarding_documents_foreign" : "company_onboarding_documents_ethiopian"; } @@ -387,13 +391,16 @@ export class CompaniesService { const current = needsCompany ? await this.companiesRepo.findById(companyId) : null; - this.assertRolesAllowedForCooperative( - cooperative ?? isCooperative(current), - roles, - ); + const isCoop = cooperative ?? isCooperative(current); + this.assertRolesAllowedForCooperative(isCoop, roles); + this.assertNationalityAllowedForCooperative(isCoop, nationality); await this.syncCompanyProfiles(companyId, companyType, roles); const updates: Partial = {}; if (nationality) updates.nationality = nationality; + // Ticking the box on a draft that was saved as foreign has to correct the + // stored nationality too, or the company keeps resolving to the foreign + // document set. + if (isCoop) updates.nationality = CompanyNationality.Ethiopian; if (cooperative !== undefined) { updates.attributes = { ...(current?.attributes ?? {}), @@ -407,6 +414,7 @@ export class CompaniesService { } this.assertRolesAllowedForCooperative(cooperative === true, roles); + this.assertNationalityAllowedForCooperative(cooperative === true, nationality); const allowedTypes = this.getProfileTypeForCompanyType(companyType); const chosenTypes = roles.filter((t) => allowedTypes.includes(t)); @@ -458,6 +466,24 @@ export class CompaniesService { } } + /** + * A co-operative union or farm is registered in Ethiopia by the co-operative + * promotion agency, so it is always an Ethiopian company — "foreign" is not a + * combination that exists, and allowing it would resolve the company to a + * document set built around an investment licence it cannot hold. + */ + private assertNationalityAllowedForCooperative( + cooperative: boolean, + nationality: CompanyNationality | undefined, + ): void { + if (!cooperative) return; + if (nationality === CompanyNationality.Foreign) { + throw new BadRequestException( + "A co-operative union or farm is registered in Ethiopia — it cannot onboard as a foreign company.", + ); + } + } + /** * Reconcile the company's operational profiles with the roles the user has * selected: create the missing ones, drop the ones they deselected. @@ -1252,7 +1278,7 @@ export class CompaniesService { uploaded: FileRecord[], ): Promise { const setting = await this.fileUploadSettingsService - .getByCode(this.documentSettingCodeFor(company.nationality)) + .getByCode(this.documentSettingCodeFor(company)) .catch(() => null); const fields = setting?.fields ?? []; const singleFileCodes = new Set( @@ -2036,35 +2062,20 @@ export class CompaniesService { .filter((f) => !f.get(company)) .map((f) => ({ key: f.key, label: f.label })); - // 2. Nationality-based company documents + which are already uploaded. A - // co-operative adds its own set on top: it provides everything its - // nationality demands, plus the papers standing in for the business licence - // it does not hold. + // 2. Company documents + which are already uploaded. One set applies: the + // company's nationality set, or the co-operative set in its place — a union + // or farm holds no business licence, so it owes its own list rather than the + // nationality list plus extras. const cooperative = isCooperative(company); - const documentSettingCode = this.documentSettingCodeFor( - company.nationality, - ); - const [setting, coopSetting, uploadedFiles] = await Promise.all([ + const documentSettingCode = this.documentSettingCodeFor(company); + const [setting, uploadedFiles] = await Promise.all([ this.fileUploadSettingsService .getByCode(documentSettingCode) .catch(() => null), - cooperative - ? this.fileUploadSettingsService - .getByCode(COOPERATIVE_ONBOARDING_CODE) - .catch(() => null) - : Promise.resolve(null), this.filesService.findByResource(company.id, "companies"), ]); const uploadedCodes = new Set(uploadedFiles.map((f) => f.code)); - // The co-op set is admin-managed and could name a fileKey the nationality - // set already carries; the nationality field wins so the same slot is never - // rendered (or required) twice. - const baseFields = setting?.fields ?? []; - const baseKeys = new Set(baseFields.map((f) => f.fileKey)); - const documents = [ - ...baseFields, - ...(coopSetting?.fields ?? []).filter((f) => !baseKeys.has(f.fileKey)), - ] + const documents = (setting?.fields ?? []) .slice() .sort((a, b) => a.displayOrder - b.displayOrder) .map((f) => ({ @@ -2203,9 +2214,6 @@ export class CompaniesService { return new OnboardingRequirementsResponseDto({ documentSettingCode, - cooperativeDocumentSettingCode: cooperative - ? COOPERATIVE_ONBOARDING_CODE - : null, nationality: company.nationality ?? CompanyNationality.Ethiopian, cooperative, companyInfo: { diff --git a/apps/edr-freight-api/src/modules/companies/dto/onboarding-requirements-response.dto.ts b/apps/edr-freight-api/src/modules/companies/dto/onboarding-requirements-response.dto.ts index 8d47dbb4e..20bd0ab06 100644 --- a/apps/edr-freight-api/src/modules/companies/dto/onboarding-requirements-response.dto.ts +++ b/apps/edr-freight-api/src/modules/companies/dto/onboarding-requirements-response.dto.ts @@ -66,15 +66,11 @@ export interface OnboardingPoaState { } export class OnboardingRequirementsResponseDto { - /** Resolved document setting code (by nationality) the docs were drawn from. */ - documentSettingCode: string; /** - * The co-operative document set, merged on top of the nationality one — null - * for every other company. `documents` below already carries the merged - * result; this is only so the portal can fetch the same extra fields when it - * renders the pickers from the file-settings endpoint. + * Resolved document setting code the docs were drawn from: the company's + * nationality set, or the co-operative set in its place. */ - cooperativeDocumentSettingCode: string | null; + documentSettingCode: string; nationality: string; /** * The company trades as a co-operative: no business licence, so no eTrade @@ -118,7 +114,6 @@ export class OnboardingRequirementsResponseDto { constructor(init: Omit) { this.documentSettingCode = init.documentSettingCode; - this.cooperativeDocumentSettingCode = init.cooperativeDocumentSettingCode; this.nationality = init.nationality; this.cooperative = init.cooperative; this.companyInfo = init.companyInfo; diff --git a/apps/edr-freight-api/src/modules/file-upload-settings/file-upload-settings.service.ts b/apps/edr-freight-api/src/modules/file-upload-settings/file-upload-settings.service.ts index 21ddc4c91..9651d4f37 100644 --- a/apps/edr-freight-api/src/modules/file-upload-settings/file-upload-settings.service.ts +++ b/apps/edr-freight-api/src/modules/file-upload-settings/file-upload-settings.service.ts @@ -17,7 +17,6 @@ import { } from "./interfaces/file-upload-settings.repository.interface"; import { COMPANY_ONBOARDING_CODE_PREFIX, - COOPERATIVE_ONBOARDING_CODE, POA_DELEGATION_FILE_KEY, poaDelegationField, } from "./poa-delegation.constants"; @@ -57,10 +56,6 @@ export class FileUploadSettingsService { */ private withPoaDelegationField(setting: FileUploadSetting): FileUploadSetting { if (!setting.code.startsWith(COMPANY_ONBOARDING_CODE_PREFIX)) return setting; - // The co-operative set is merged ON TOP of a nationality set that already - // carries the paper; injecting it here too would hand the portal the same - // slot twice. - if (setting.code === COOPERATIVE_ONBOARDING_CODE) return setting; const fields = setting.fields ?? []; if (fields.some((f) => f.fileKey === POA_DELEGATION_FILE_KEY)) return setting; diff --git a/apps/edr-freight-api/src/modules/file-upload-settings/poa-delegation.constants.ts b/apps/edr-freight-api/src/modules/file-upload-settings/poa-delegation.constants.ts index e8d593ded..e23a87818 100644 --- a/apps/edr-freight-api/src/modules/file-upload-settings/poa-delegation.constants.ts +++ b/apps/edr-freight-api/src/modules/file-upload-settings/poa-delegation.constants.ts @@ -27,10 +27,11 @@ export const POA_DELEGATION_LABEL = "DARS Delegation Paper"; export const COMPANY_ONBOARDING_CODE_PREFIX = "company_onboarding_documents_"; /** - * The co-operative onboarding set. Unlike the nationality sets it is ADDITIVE — - * merged on top of the company's `_ethiopian`/`_foreign` set rather than - * replacing it — which is why the delegation paper is not injected into it: the - * set it is merged onto already carries one. + * The co-operative onboarding set — the third alternative to `_ethiopian` and + * `_foreign`, not an addition to them: a union or farm resolves to this set + * INSTEAD of its nationality's, because it holds no business licence and so + * owes a different list of papers. The delegation paper is injected into it + * like any other company onboarding set. */ export const COOPERATIVE_ONBOARDING_CODE = `${COMPANY_ONBOARDING_CODE_PREFIX}cooperative`; diff --git a/apps/edr-freight-api/src/seed/file-upload-settings.seeder.ts b/apps/edr-freight-api/src/seed/file-upload-settings.seeder.ts index abc4e613c..4f314453a 100644 --- a/apps/edr-freight-api/src/seed/file-upload-settings.seeder.ts +++ b/apps/edr-freight-api/src/seed/file-upload-settings.seeder.ts @@ -155,16 +155,27 @@ const FOREIGN_ONBOARDING_FIELDS: OnboardingField[] = [ // ]; /** - * Extra documents a co-operative union or farm provides, merged on top of its - * nationality set. It has a TIN but no business licence, so the papers that - * evidence the co-operative itself stand in for the trade licence every other - * company uploads. + * Documents required from a co-operative union or farm — the third alternative + * to the two nationality sets, not an addition to them. A co-op is always + * registered in Ethiopia and has a TIN but no business licence, so its + * registration certificate stands in for the commercial registration every + * other Ethiopian company uploads. * - * Only the registration certificate is seeded, and the set is admin-managed - * like every other onboarding set — what these members must actually produce - * is a backoffice decision, edited in the file-settings editor. + * Admin-managed like every other onboarding set: what these members must + * actually produce is a backoffice decision, edited in the file-settings editor. */ const COOPERATIVE_ONBOARDING_FIELDS: OnboardingField[] = [ + { + fileKey: "tin_certificate", + fileLabel: "TIN Certificate", + helpText: "Verified against the TIN registry during registration.", + isRequired: true, + isMultiple: false, + maxFiles: 1, + allowedExtensions: DOC_EXTENSIONS, + maxSizeMb: 50, + displayOrder: 1, + }, { fileKey: "cooperative_registration_certificate", fileLabel: "Co-operative Union / Farm Registration Certificate", @@ -175,8 +186,20 @@ const COOPERATIVE_ONBOARDING_FIELDS: OnboardingField[] = [ maxFiles: 1, allowedExtensions: DOC_EXTENSIONS, maxSizeMb: 50, - displayOrder: 1, + displayOrder: 2, }, + { + fileKey: "national_id", + fileLabel: "National ID", + helpText: "Verified against the National ID API during registration.", + isRequired: true, + isMultiple: false, + maxFiles: 1, + allowedExtensions: DOC_EXTENSIONS, + maxSizeMb: 50, + displayOrder: 3, + }, + poaDelegationDefault(4), ]; interface OnboardingDocumentSetting { @@ -201,11 +224,11 @@ const COMPANY_ONBOARDING_DOCUMENTS: OnboardingDocumentSetting[] = [ entity: "customer", fields: FOREIGN_ONBOARDING_FIELDS, }, - // Additive, not a nationality of its own: a union or farm still uploads - // everything its nationality set demands, and these on top. + // The third set: a union or farm resolves here INSTEAD of a nationality set + // (it is always Ethiopian, and holds no business licence). { code: "company_onboarding_documents_cooperative", - label: "Co-operative union / farm onboarding documents (additional)", + label: "Co-operative union / farm onboarding documents", entity: "customer", fields: COOPERATIVE_ONBOARDING_FIELDS, }, diff --git a/apps/edr-freight-web/portal/src/components/onboarding/OnboardingWizardDialog.tsx b/apps/edr-freight-web/portal/src/components/onboarding/OnboardingWizardDialog.tsx index 6d75e502f..998f733da 100644 --- a/apps/edr-freight-web/portal/src/components/onboarding/OnboardingWizardDialog.tsx +++ b/apps/edr-freight-web/portal/src/components/onboarding/OnboardingWizardDialog.tsx @@ -39,6 +39,7 @@ import type { } from "@/services/companies.service"; import { companiesService } from "@/services/companies.service"; import type { UpdateProfilePayload } from "@/types/profile"; +import { documentSettingCode } from "@/utils/documentSettingCode"; import { extractApiError } from "@/utils/result"; /** Form steps rendered by CompanyProfileForm. */ @@ -116,13 +117,6 @@ function companyTypeForRoles(_roles: string[]): string { return "customer"; } -/** Document upload setting code per company nationality. */ -function documentSettingCode(nationality: CompanyNationality): string { - return nationality === "foreign" - ? "company_onboarding_documents_foreign" - : "company_onboarding_documents_ethiopian"; -} - /** * First-run onboarding wizard with a "draft-first" flow: picking the role(s) * immediately creates a draft company + profile on the backend, so every @@ -168,11 +162,15 @@ export default function OnboardingWizardDialog({ const [cooperative, setCooperative] = useState( company?.company?.attributes?.cooperative === true, ); - // Ticking the box drops a role the company can no longer hold, rather than - // letting Continue fail on a selection the API refuses. + // Ticking the box drops the selections the company can no longer hold, rather + // than letting Continue fail on ones the API refuses: a co-op cannot forward + // freight, and is registered in Ethiopia so it is never foreign. const handleCooperativeChange = useCallback((checked: boolean) => { setCooperative(checked); - if (checked) setRoles((prev) => prev.filter((r) => r !== "freight_forwarder")); + if (checked) { + setRoles((prev) => prev.filter((r) => r !== "freight_forwarder")); + setNationality((prev) => (prev === "foreign" ? "ethiopian" : prev)); + } }, []); const [documentFiles, setDocumentFiles] = useState< Record @@ -419,7 +417,7 @@ export default function OnboardingWizardDialog({ // after the draft — and thus the requirements — exist). const resolvedDocumentSettingCode = requirementsQuery.data?.documentSettingCode ?? - documentSettingCode(effectiveNationality); + documentSettingCode(effectiveNationality, cooperative); // Server-confirmed document state, used both to badge already-uploaded fields // and to keep a refreshed resume from over-shooting the documents step. @@ -480,8 +478,6 @@ export default function OnboardingWizardDialog({ // startOnboarding has persisted it, and the form's whole company step // branches on it. cooperative: requirementsQuery.data?.cooperative ?? cooperative, - extraDocumentSettingCode: - requirementsQuery.data?.cooperativeDocumentSettingCode ?? null, // A freight forwarder cannot answer the power-of-attorney question — the // API forces "yes" — so the step offers no way to change it. declarationLocked: requirementsQuery.data?.poa?.locked ?? false, @@ -551,6 +547,10 @@ export default function OnboardingWizardDialog({ value={nationality} onChange={setNationality} embedded + // A co-op is registered in Ethiopia by the co-operative + // promotion agency — foreign is not on offer rather than + // refused later. + excludeForeign={cooperative} /> {/* A co-operative union or farm registers on a TIN alone. It changes what the next step asks for (typed registration, no diff --git a/apps/edr-freight-web/portal/src/pages/accounts/CompanyProfileForm.tsx b/apps/edr-freight-web/portal/src/pages/accounts/CompanyProfileForm.tsx index 59fcc2223..aa445974f 100644 --- a/apps/edr-freight-web/portal/src/pages/accounts/CompanyProfileForm.tsx +++ b/apps/edr-freight-web/portal/src/pages/accounts/CompanyProfileForm.tsx @@ -66,7 +66,6 @@ export default function CompanyProfileForm({ onIdentityChange, cooperative = false, declarationLocked = false, - extraDocumentSettingCode, }: { documentSettingCode: string; documentFiles?: Record; @@ -115,8 +114,8 @@ export default function CompanyProfileForm({ /** * The company trades as a co-operative: a TIN but no business licence, so the * eTrade lookup is replaced by typed registration details, the per-role - * licence upload is not owed, and its own document set applies on top of the - * nationality one. + * licence upload is not owed, and its own document set applies instead of the + * nationality one (resolved by the caller into `documentSettingCode`). */ cooperative?: boolean; /** @@ -124,8 +123,6 @@ export default function CompanyProfileForm({ * answer is forced to "yes" and cannot be changed here. */ declarationLocked?: boolean; - /** Additional document set merged in (the co-operative one), if any. */ - extraDocumentSettingCode?: string | null; }) { // A Fayda claim carries the phone as the national registry holds it, which is // often a local number the form's E.164 validation (and the API's @@ -206,36 +203,15 @@ export default function CompanyProfileForm({ const documentFiles = controlledFiles ?? internalFiles; const setDocumentFiles = onDocumentFilesChange ?? setInternalFiles; - const { data: nationalitySetting, isLoading: loadingDocuments } = useQuery( + // One set applies: the company's nationality set, or the co-operative one in + // its place — the caller resolves which (the API resolves the same way when + // it decides what is outstanding). + const { data: uploadSetting, isLoading: loadingDocuments } = useQuery( api.fileUploadSettings.getByCode.queryOptions({ input: { code: documentSettingCode }, refetchOnMount: false, }), ); - // A co-operative's own documents come as a second, additive set — it uploads - // everything its nationality demands, plus the papers standing in for the - // business licence it does not hold. The API merges the same two sets when it - // decides what is outstanding. - const { data: extraSetting } = useQuery( - api.fileUploadSettings.getByCode.queryOptions({ - input: { code: extraDocumentSettingCode ?? "" }, - enabled: Boolean(extraDocumentSettingCode), - refetchOnMount: false, - }), - ); - const uploadSetting = useMemo(() => { - if (!nationalitySetting) return nationalitySetting; - if (!extraSetting?.fields?.length) return nationalitySetting; - // Nationality wins a fileKey collision, so a slot is never rendered twice. - const seen = new Set(nationalitySetting.fields.map((f) => f.fileKey)); - return { - ...nationalitySetting, - fields: [ - ...nationalitySetting.fields, - ...extraSetting.fields.filter((f) => !seen.has(f.fileKey)), - ], - }; - }, [nationalitySetting, extraSetting]); // Which fields the current step renders an input for and therefore requires. // Filled in further down (it depends on values this form owns), and read at diff --git a/apps/edr-freight-web/portal/src/pages/bookings/new-booking-form/step-documents.tsx b/apps/edr-freight-web/portal/src/pages/bookings/new-booking-form/step-documents.tsx index de105bf21..d75092655 100644 --- a/apps/edr-freight-web/portal/src/pages/bookings/new-booking-form/step-documents.tsx +++ b/apps/edr-freight-web/portal/src/pages/bookings/new-booking-form/step-documents.tsx @@ -6,6 +6,7 @@ import { type UseFormReturn } from "react-hook-form"; import useAuth from "@/hooks/useAuth"; import { api } from "@/services/api"; +import { documentSettingCode } from "@/utils/documentSettingCode"; import { operationToProfileType, type BookingDocuments, @@ -20,13 +21,6 @@ type BookingForm = UseFormReturn< BookingFormValues >; -/** Onboarding document setting code for the company's nationality. */ -function documentSettingCode(nationality: string | null | undefined): string { - return nationality === "foreign" - ? "company_onboarding_documents_foreign" - : "company_onboarding_documents_ethiopian"; -} - function formatSize(bytes?: number): string { if (!bytes) return ""; if (bytes < 1024) return `${bytes} B`; @@ -48,14 +42,17 @@ function formatSize(bytes?: number): string { export function StepDocuments({ form }: { form: BookingForm }) { const auth = useAuth(); - const nationality = auth.company?.company?.nationality as - | string - | null - | undefined; + const company = auth.company?.company; + const nationality = company?.nationality as string | null | undefined; const docSettingQuery = useQuery( api.fileUploadSettings.getByCode.queryOptions({ - input: { code: documentSettingCode(nationality) }, + input: { + code: documentSettingCode( + nationality, + company?.attributes?.cooperative === true, + ), + }, }), ); diff --git a/apps/edr-freight-web/portal/src/pages/bookings/resubmit/useBookingDocumentSetting.ts b/apps/edr-freight-web/portal/src/pages/bookings/resubmit/useBookingDocumentSetting.ts index 65774f97f..31d42f6cd 100644 --- a/apps/edr-freight-web/portal/src/pages/bookings/resubmit/useBookingDocumentSetting.ts +++ b/apps/edr-freight-web/portal/src/pages/bookings/resubmit/useBookingDocumentSetting.ts @@ -2,15 +2,9 @@ import { useQuery } from "@tanstack/react-query"; import useAuth from "@/hooks/useAuth"; import { api } from "@/services/api"; +import { documentSettingCode } from "@/utils/documentSettingCode"; -/** Onboarding document setting code for the company's nationality. */ -export function documentSettingCode( - nationality: string | null | undefined, -): string { - return nationality === "foreign" - ? "company_onboarding_documents_foreign" - : "company_onboarding_documents_ethiopian"; -} +export { documentSettingCode }; /** * Fetches the FileUploadSetting that describes the documents a booking requires @@ -22,14 +16,17 @@ export function documentSettingCode( */ export function useBookingDocumentSetting() { const auth = useAuth(); - const nationality = auth.company?.company?.nationality as - | string - | null - | undefined; + const company = auth.company?.company; + const nationality = company?.nationality as string | null | undefined; return useQuery( api.fileUploadSettings.getByCode.queryOptions({ - input: { code: documentSettingCode(nationality) }, + input: { + code: documentSettingCode( + nationality, + company?.attributes?.cooperative === true, + ), + }, }), ); } diff --git a/apps/edr-freight-web/portal/src/pages/contracts/new-contract-form/ContractDocsEditor.tsx b/apps/edr-freight-web/portal/src/pages/contracts/new-contract-form/ContractDocsEditor.tsx index 4d966e010..9d045c4e7 100644 --- a/apps/edr-freight-web/portal/src/pages/contracts/new-contract-form/ContractDocsEditor.tsx +++ b/apps/edr-freight-web/portal/src/pages/contracts/new-contract-form/ContractDocsEditor.tsx @@ -7,6 +7,7 @@ import type { Freight } from "@edr/types"; import { useQuery } from "@tanstack/react-query"; import useAuth from "@/hooks/useAuth"; import { api } from "@/services/api"; +import { documentSettingCode } from "@/utils/documentSettingCode"; import type { CompanyDocument } from "@/services/companies.service"; import { downloadStoredFile } from "@/services/files.service"; import { labelForDocCode } from "@/pages/bookings/resubmit/resubmitDocs"; @@ -15,13 +16,6 @@ import { BORDER, GREEN, INK } from "../contract-ui"; type DocumentsValue = Record; type ContractFile = NonNullable[number]; -/** Onboarding document setting code for the company's nationality. */ -function documentSettingCode(nationality: string | null | undefined): string { - return nationality === "foreign" - ? "company_onboarding_documents_foreign" - : "company_onboarding_documents_ethiopian"; -} - function hasFile(value: File | File[] | null | undefined): boolean { if (!value) return false; return Array.isArray(value) ? value.length > 0 : true; @@ -95,13 +89,16 @@ export function ContractDocsEditor({ }) { const auth = useAuth(); - const nationality = auth.company?.company?.nationality as - | string - | null - | undefined; + const company = auth.company?.company; + const nationality = company?.nationality as string | null | undefined; const settingQuery = useQuery( api.fileUploadSettings.getByCode.queryOptions({ - input: { code: documentSettingCode(nationality) }, + input: { + code: documentSettingCode( + nationality, + company?.attributes?.cooperative === true, + ), + }, }), ); diff --git a/apps/edr-freight-web/portal/src/pages/contracts/new-contract-form/step-documents.tsx b/apps/edr-freight-web/portal/src/pages/contracts/new-contract-form/step-documents.tsx index de4b2bd66..b0b870f72 100644 --- a/apps/edr-freight-web/portal/src/pages/contracts/new-contract-form/step-documents.tsx +++ b/apps/edr-freight-web/portal/src/pages/contracts/new-contract-form/step-documents.tsx @@ -7,6 +7,7 @@ import { type UseFormReturn } from "react-hook-form"; import useAuth from "@/hooks/useAuth"; import { api } from "@/services/api"; +import { documentSettingCode } from "@/utils/documentSettingCode"; import { type ContractDocuments, type ContractFormInputValues, @@ -21,12 +22,6 @@ type ContractForm = UseFormReturn< ContractFormValues >; -function documentSettingCode(nationality: string | null | undefined): string { - return nationality === "foreign" - ? "company_onboarding_documents_foreign" - : "company_onboarding_documents_ethiopian"; -} - function formatSize(bytes?: number): string { if (!bytes) return ""; if (bytes < 1024) return `${bytes} B`; @@ -61,14 +56,17 @@ export function StepDocuments({ const auth = useAuth(); const [errors, setErrors] = useState>({}); - const nationality = auth.company?.company?.nationality as - | string - | null - | undefined; + const company = auth.company?.company; + const nationality = company?.nationality as string | null | undefined; const docSettingQuery = useQuery( api.fileUploadSettings.getByCode.queryOptions({ - input: { code: documentSettingCode(nationality) }, + input: { + code: documentSettingCode( + nationality, + company?.attributes?.cooperative === true, + ), + }, }), ); diff --git a/apps/edr-freight-web/portal/src/pages/settings/NationalitySelect.tsx b/apps/edr-freight-web/portal/src/pages/settings/NationalitySelect.tsx index 2115ec083..99569e748 100644 --- a/apps/edr-freight-web/portal/src/pages/settings/NationalitySelect.tsx +++ b/apps/edr-freight-web/portal/src/pages/settings/NationalitySelect.tsx @@ -9,6 +9,8 @@ interface NationalitySelectProps { onChange: (next: CompanyNationality) => void; /** Render only the option grid — the wizard supplies its own header/card. */ embedded?: boolean; + /** Hide the foreign option (a co-operative union or farm is always Ethiopian). */ + excludeForeign?: boolean; } /** @@ -21,9 +23,10 @@ export default function NationalitySelect({ value, onChange, embedded = false, + excludeForeign = false, }: NationalitySelectProps) { const grid = ( - + onChange("ethiopian")} /> - } - selected={value === "foreign"} - onClick={() => onChange("foreign")} - /> + {!excludeForeign && ( + } + selected={value === "foreign"} + onClick={() => onChange("foreign")} + /> + )} ); diff --git a/apps/edr-freight-web/portal/src/pages/settings/TabDocuments.tsx b/apps/edr-freight-web/portal/src/pages/settings/TabDocuments.tsx index 72d6738c8..584fb70d6 100644 --- a/apps/edr-freight-web/portal/src/pages/settings/TabDocuments.tsx +++ b/apps/edr-freight-web/portal/src/pages/settings/TabDocuments.tsx @@ -6,6 +6,7 @@ import { type LicenseFileStatus, } from "@/services/companies.service"; import { getMinFiles } from "@/types/fileUploadSettings"; +import { documentSettingCode } from "@/utils/documentSettingCode"; import type { ProfileResponse } from "@/types/profile"; import { SmartFileInput, @@ -57,14 +58,8 @@ interface TabDocumentsProps { onContinue?: () => void; } -function documentSettingCode(nationality: string | null | undefined): string { - return nationality === "foreign" - ? "company_onboarding_documents_foreign" - : "company_onboarding_documents_ethiopian"; -} - /** - * The DARS delegation paper ships in the same nationality document set, but it is + * The DARS delegation paper ships in the same document set, but it is * edited on the Power of Attorney tab (where it is staged for review alongside * the PoA details), so it is excluded from this tab's uploader. */ @@ -83,7 +78,9 @@ export default function TabDocuments({ const docSettingQuery = useQuery( api.fileUploadSettings.getByCode.queryOptions({ - input: { code: documentSettingCode(profile.nationality) }, + input: { + code: documentSettingCode(profile.nationality, profile.cooperative), + }, }), ); diff --git a/apps/edr-freight-web/portal/src/services/companies.service.ts b/apps/edr-freight-web/portal/src/services/companies.service.ts index e9cf478c3..4c1b93713 100644 --- a/apps/edr-freight-web/portal/src/services/companies.service.ts +++ b/apps/edr-freight-web/portal/src/services/companies.service.ts @@ -183,14 +183,8 @@ export interface OnboardingPoaState { * outstanding, so the client never hardcodes required fields or document sets. */ export interface OnboardingRequirements { + /** The set the docs came from: the nationality one, or the co-operative one. */ documentSettingCode: string; - /** - * Extra document set merged on top of the nationality one for a co-operative, - * null otherwise. `documents` already carries the merged list; this is only - * so the pickers, which render from the file-settings endpoint, can fetch the - * same extra fields. - */ - cooperativeDocumentSettingCode: string | null; nationality: string; /** No business licence: registration typed by hand, no eTrade lookup. */ cooperative: boolean; diff --git a/apps/edr-freight-web/portal/src/utils/documentSettingCode.test.ts b/apps/edr-freight-web/portal/src/utils/documentSettingCode.test.ts new file mode 100644 index 000000000..6063f1b87 --- /dev/null +++ b/apps/edr-freight-web/portal/src/utils/documentSettingCode.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from "vitest"; + +import { documentSettingCode } from "./documentSettingCode"; + +describe("documentSettingCode", () => { + it("resolves the nationality set", () => { + expect(documentSettingCode("ethiopian")).toBe( + "company_onboarding_documents_ethiopian", + ); + expect(documentSettingCode("foreign")).toBe( + "company_onboarding_documents_foreign", + ); + expect(documentSettingCode(null)).toBe( + "company_onboarding_documents_ethiopian", + ); + }); + + it("replaces the nationality set for a co-operative", () => { + expect(documentSettingCode("ethiopian", true)).toBe( + "company_onboarding_documents_cooperative", + ); + // A co-op is never foreign, but a stale flag must not fall back to the + // foreign set — the co-op answer wins. + expect(documentSettingCode("foreign", true)).toBe( + "company_onboarding_documents_cooperative", + ); + }); +}); diff --git a/apps/edr-freight-web/portal/src/utils/documentSettingCode.ts b/apps/edr-freight-web/portal/src/utils/documentSettingCode.ts new file mode 100644 index 000000000..e27407c27 --- /dev/null +++ b/apps/edr-freight-web/portal/src/utils/documentSettingCode.ts @@ -0,0 +1,18 @@ +/** + * The company document set a company resolves to — one of three, never a + * combination: a co-operative union or farm uploads its own papers INSTEAD of + * its nationality's (it holds no business licence), and is always Ethiopian. + * + * Mirrors `CompaniesService.documentSettingCodeFor` on the API; prefer the + * server-resolved `documentSettingCode` from onboarding requirements where one + * is available, and use this where only the company is at hand. + */ +export function documentSettingCode( + nationality: string | null | undefined, + cooperative?: boolean | null, +): string { + if (cooperative) return "company_onboarding_documents_cooperative"; + return nationality === "foreign" + ? "company_onboarding_documents_foreign" + : "company_onboarding_documents_ethiopian"; +} From 4bf1aa80530c7c4e8ce0ecb1ff9547c8355b6136 Mon Sep 17 00:00:00 2001 From: ghost2023 Date: Wed, 12 Aug 2026 10:28:56 +0300 Subject: [PATCH 2/4] chore: deps --- pnpm-lock.yaml | 2017 +++++++++++++++++------------------------------- 1 file changed, 687 insertions(+), 1330 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7f59d43c5..7efcb2c11 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,13 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + date-fns: ^3.6.0 + pdfjs-dist: ^3.11.174 + react: 19.2.6 + react-dom: 19.2.6 + typeorm: 0.3.30 + importers: .: @@ -154,7 +161,7 @@ importers: specifier: ^4.8.3 version: 4.8.3 typeorm: - specifier: ^0.3.30 + specifier: 0.3.30 version: 0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)) devDependencies: '@edr/eslint-config': @@ -556,7 +563,7 @@ importers: version: 10.5.0(postcss@8.5.15) jsdom: specifier: ^25.0.1 - version: 25.0.1 + version: 25.0.1(canvas@2.11.2) postcss: specifier: ^8.4.47 version: 8.5.15 @@ -571,7 +578,7 @@ importers: version: 5.4.21(@types/node@24.13.1)(lightningcss@1.32.0)(terser@5.48.0) vitest: specifier: ^2.1.2 - version: 2.1.9(@types/node@24.13.1)(jsdom@25.0.1)(lightningcss@1.32.0)(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(terser@5.48.0) + version: 2.1.9(@types/node@24.13.1)(jsdom@25.0.1(canvas@2.11.2))(lightningcss@1.32.0)(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(terser@5.48.0) apps/edr-freight-web/portal: dependencies: @@ -695,7 +702,7 @@ importers: version: 10.5.0(postcss@8.5.15) jsdom: specifier: ^25.0.1 - version: 25.0.1 + version: 25.0.1(canvas@2.11.2) postcss: specifier: ^8.4.47 version: 8.5.15 @@ -710,7 +717,7 @@ importers: version: 5.4.21(@types/node@24.13.1)(lightningcss@1.32.0)(terser@5.48.0) vitest: specifier: ^2.1.2 - version: 2.1.9(@types/node@24.13.1)(jsdom@25.0.1)(lightningcss@1.32.0)(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(terser@5.48.0) + version: 2.1.9(@types/node@24.13.1)(jsdom@25.0.1(canvas@2.11.2))(lightningcss@1.32.0)(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(terser@5.48.0) apps/edr-gps-tracker: dependencies: @@ -742,7 +749,7 @@ importers: specifier: ^7.8.1 version: 7.8.2 typeorm: - specifier: ^0.3.30 + specifier: 0.3.30 version: 0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)) devDependencies: '@edr/eslint-config': @@ -893,7 +900,7 @@ importers: specifier: ^4.2.0 version: 4.2.0 typeorm: - specifier: ^0.3.30 + specifier: 0.3.30 version: 0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)) uuid: specifier: ^10.0.0 @@ -970,7 +977,7 @@ importers: version: link:../../../packages/ui-common '@tanstack/react-query': specifier: ^5.59.0 - version: 5.101.0(react@18.3.1) + version: 5.101.0(react@19.2.6) axios: specifier: ^1.7.7 version: 1.17.0 @@ -978,32 +985,32 @@ importers: specifier: ^2.1.1 version: 2.1.1 date-fns: - specifier: ^3.0.0 + specifier: ^3.6.0 version: 3.6.0 lucide-react: specifier: ^0.446.0 - version: 0.446.0(react@18.3.1) + version: 0.446.0(react@19.2.6) next: specifier: ^14.2.0 - version: 14.2.35(@playwright/test@1.61.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.35(@playwright/test@1.61.1)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: 19.2.6 + version: 19.2.6 react-day-picker: specifier: ^9.14.0 - version: 9.14.0(react@18.3.1) + version: 9.14.0(react@19.2.6) react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: 19.2.6 + version: 19.2.6(react@19.2.6) recharts: specifier: ^2.12.0 - version: 2.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.15.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6) socket.io-client: specifier: ^4.8.3 version: 4.8.3 zustand: specifier: ^5.0.0 - version: 5.0.14(@types/react@18.3.31)(immer@11.1.8)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) + version: 5.0.14(@types/react@18.3.31)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) devDependencies: '@types/node': specifier: ^20.0.0 @@ -1043,10 +1050,10 @@ importers: version: link:../../../packages/ui-common '@hookform/resolvers': specifier: ^3.3.4 - version: 3.10.0(react-hook-form@7.77.0(react@18.3.1)) + version: 3.10.0(react-hook-form@7.77.0(react@19.2.6)) '@tanstack/react-query': specifier: ^5.59.0 - version: 5.101.0(react@18.3.1) + version: 5.101.0(react@19.2.6) '@types/qrcode': specifier: ^1.5.6 version: 1.5.6 @@ -1057,7 +1064,7 @@ importers: specifier: ^2.1.1 version: 2.1.1 date-fns: - specifier: ^3.0.0 + specifier: ^3.6.0 version: 3.6.0 jspdf: specifier: ^4.2.1 @@ -1067,25 +1074,25 @@ importers: version: 5.0.8(jspdf@4.2.1) lucide-react: specifier: ^0.446.0 - version: 0.446.0(react@18.3.1) + version: 0.446.0(react@19.2.6) next: specifier: ^14.2.0 - version: 14.2.35(@playwright/test@1.61.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.35(@playwright/test@1.61.1)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) qrcode: specifier: ^1.5.4 version: 1.5.4 qrcode.react: specifier: ^3.1.0 - version: 3.2.0(react@18.3.1) + version: 3.2.0(react@19.2.6) react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: 19.2.6 + version: 19.2.6 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: 19.2.6 + version: 19.2.6(react@19.2.6) react-hook-form: specifier: ^7.51.0 - version: 7.77.0(react@18.3.1) + version: 7.77.0(react@19.2.6) socket.io-client: specifier: ^4.8.3 version: 4.8.3 @@ -1094,7 +1101,7 @@ importers: version: 3.25.76 zustand: specifier: ^5.0.0 - version: 5.0.14(@types/react@18.3.31)(immer@11.1.8)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) + version: 5.0.14(@types/react@18.3.31)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) devDependencies: '@types/node': specifier: ^20.0.0 @@ -1276,7 +1283,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.1.2 - version: 2.1.9(@types/node@22.20.1)(jsdom@25.0.1)(lightningcss@1.32.0)(msw@2.14.6(@types/node@22.20.1)(typescript@5.9.3))(terser@5.48.0) + version: 2.1.9(@types/node@22.20.1)(jsdom@25.0.1(canvas@2.11.2))(lightningcss@1.32.0)(msw@2.14.6(@types/node@22.20.1)(typescript@5.9.3))(terser@5.48.0) packages/api-common: dependencies: @@ -1306,7 +1313,7 @@ importers: specifier: ^7.8.1 version: 7.8.2 typeorm: - specifier: ^0.3.20 + specifier: 0.3.30 version: 0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)) typescript: specifier: ^5.5.4 @@ -1374,7 +1381,7 @@ importers: specifier: ^29.2.5 version: 29.4.11(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)))(typescript@5.9.3) typeorm: - specifier: ^0.3.20 + specifier: 0.3.30 version: 0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)) typescript: specifier: ^5.5.4 @@ -1436,10 +1443,10 @@ importers: version: link:../types '@mantine/core': specifier: ^9.3.0 - version: 9.3.0(@mantine/hooks@9.3.0(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 9.3.0(@mantine/hooks@9.3.0(react@19.2.6))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-table': specifier: ^8.21.3 - version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.21.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1448,10 +1455,10 @@ importers: version: 2.1.1 lucide-react: specifier: ^1.14.0 - version: 1.17.0(react@18.3.1) + version: 1.17.0(react@19.2.6) radix-ui: specifier: ^1.4.3 - version: 1.5.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.5.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) shadcn: specifier: ^4.7.0 version: 4.10.0(@types/node@24.13.1)(babel-plugin-macros@3.1.0)(typescript@5.9.3) @@ -1481,11 +1488,11 @@ importers: specifier: ^8.4.47 version: 8.5.15 react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: 19.2.6 + version: 19.2.6 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: 19.2.6 + version: 19.2.6(react@19.2.6) tailwindcss: specifier: ^4.3.0 version: 4.3.0 @@ -1999,7 +2006,7 @@ packages: resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} peerDependencies: '@types/react': '*' - react: '>=16.8.0' + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -2015,7 +2022,7 @@ packages: peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' - react: '>=16.8.0' + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -2032,7 +2039,7 @@ packages: '@emotion/use-insertion-effect-with-fallbacks@1.2.0': resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} peerDependencies: - react: '>=16.8.0' + react: 19.2.6 '@emotion/utils@1.4.2': resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} @@ -2218,20 +2225,20 @@ packages: '@floating-ui/react-dom@2.1.8': resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@floating-ui/react@0.26.28': resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@floating-ui/react@0.27.19': resolution: {integrity: sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==} peerDependencies: - react: '>=17.0.0' - react-dom: '>=17.0.0' + react: 19.2.6 + react-dom: 19.2.6 '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} @@ -2256,8 +2263,8 @@ packages: '@hello-pangea/dnd@18.0.1': resolution: {integrity: sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ==} peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 '@hono/node-server@1.19.14': resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} @@ -2268,8 +2275,8 @@ packages: '@hookform/devtools@4.4.0': resolution: {integrity: sha512-Mtlic+uigoYBPXlfvPBfiYYUZuyMrD3pTjDpVIhL6eCZTvQkHsKBSKeZCvXWUZr8fqrkzDg27N+ZuazLKq6Vmg==} peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - react-dom: ^16.8.0 || ^17 || ^18 || ^19 + react: 19.2.6 + react-dom: 19.2.6 '@hookform/resolvers@3.10.0': resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==} @@ -2677,8 +2684,8 @@ packages: '@lexical/devtools-core@0.48.0': resolution: {integrity: sha512-4kvKWW6ebgQnJNLXPLmw7dqgSChvzYIBNYtfuR6c48Sw+V/QXQTWqfIUbCIe5X4uG8EEXd5O/udXaJx7GBuP+w==} peerDependencies: - react: '>=18.x' - react-dom: '>=18.x' + react: 19.2.6 + react-dom: 19.2.6 typescript: '>=5.2' peerDependenciesMeta: typescript: @@ -2783,8 +2790,8 @@ packages: '@lexical/react@0.48.0': resolution: {integrity: sha512-uVh9/QSrbtjLjVbxfJ+sfiMyhUq/rv7H6uBEVDDIw1rkZJSDY1fvf/CX+dyKgwcDFjKQZ8/9i5f9UCVPeQ01hA==} peerDependencies: - react: '>=18.x' - react-dom: '>=18.x' + react: 19.2.6 + react-dom: 19.2.6 typescript: '>=5.2' yjs: '>=13.5.22' peerDependenciesMeta: @@ -2896,7 +2903,7 @@ packages: '@lottiefiles/react-lottie-player@3.6.0': resolution: {integrity: sha512-WK5TriLJT93VF3w4IjSVyveiedraZCnDhKzCPhpbeLgQeMi6zufxa3dXNc4HmAFRXq+LULPAy+Idv1rAfkReMA==} peerDependencies: - react: 16 - 19 + react: 19.2.6 '@lukeed/csprng@1.1.0': resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} @@ -2907,30 +2914,30 @@ packages: peerDependencies: '@mantine/core': 7.17.8 '@mantine/hooks': 7.17.8 - react: ^18.x || ^19.x - react-dom: ^18.x || ^19.x + react: 19.2.6 + react-dom: 19.2.6 recharts: ^2.13.3 '@mantine/core@7.17.8': resolution: {integrity: sha512-42sfdLZSCpsCYmLCjSuntuPcDg3PLbakSmmYfz5Auea8gZYLr+8SS5k647doVu0BRAecqYOytkX2QC5/u/8VHw==} peerDependencies: '@mantine/hooks': 7.17.8 - react: ^18.x || ^19.x - react-dom: ^18.x || ^19.x + react: 19.2.6 + react-dom: 19.2.6 '@mantine/core@9.3.0': resolution: {integrity: sha512-mHVCm61YVW9ipy9eHiKMqsRUm3TkOErbdw7zHs0HRw5g403nf7tSTqNGvaYE+aX1Py874qMkrUzeQfj4bjiiBA==} peerDependencies: '@mantine/hooks': 9.3.0 - react: ^19.2.0 - react-dom: ^19.2.0 + react: 19.2.6 + react-dom: 19.2.6 '@mantine/core@9.3.2': resolution: {integrity: sha512-Upy/Z9Sj2eW2dGrFgUy/2kISVsxMTBYTDfP2TFdsIA3PdPSBkdqfSOPX/ug3d3F3a4bnwQSqcO6+aPEpBIh8dg==} peerDependencies: '@mantine/hooks': 9.3.2 - react: ^19.2.0 - react-dom: ^19.2.0 + react: 19.2.6 + react-dom: 19.2.6 '@mantine/dates@7.17.8': resolution: {integrity: sha512-KYog/YL83PnsMef7EZagpOFq9I2gfnK0eYSzC8YvV9Mb6t/x9InqRssGWVb0GIr+TNILpEkhKoGaSKZNy10Q1g==} @@ -2938,8 +2945,8 @@ packages: '@mantine/core': 7.17.8 '@mantine/hooks': 7.17.8 dayjs: '>=1.0.0' - react: ^18.x || ^19.x - react-dom: ^18.x || ^19.x + react: 19.2.6 + react-dom: 19.2.6 '@mantine/dates@9.3.2': resolution: {integrity: sha512-MzHrXGoOb3rCnHBlsI/BPAjC8K5tZ4f8pzg66tsTsupVCQBaBpHSVatQwNRJ6K2JC9pyCyTa9BL803C8AiWycA==} @@ -2947,36 +2954,40 @@ packages: '@mantine/core': 9.3.2 '@mantine/hooks': 9.3.2 dayjs: '>=1.0.0' - react: ^19.2.0 - react-dom: ^19.2.0 + react: 19.2.6 + react-dom: 19.2.6 '@mantine/hooks@7.17.8': resolution: {integrity: sha512-96qygbkTjRhdkzd5HDU8fMziemN/h758/EwrFu7TlWrEP10Vw076u+Ap/sG6OT4RGPZYYoHrTlT+mkCZblWHuw==} peerDependencies: - react: ^18.x || ^19.x + react: 19.2.6 '@mantine/hooks@9.3.0': resolution: {integrity: sha512-QoSr9WI4WsKWrM3qFYYizHUn3+n+CVcFMYe4sdlnmFPStvs6BacPODKJSbFlYl73Z20t82JIy0eKqt4noHQI2g==} peerDependencies: - react: ^19.2.0 + react: 19.2.6 '@mantine/hooks@9.3.2': resolution: {integrity: sha512-jOjpUe0x1A/k3XUiu2/aaSCasXRI5ZKZOucm3ypwsvm9F2u8C1xzwBvagrzlbNZwJRF5vNYIJtCaT7NunPyc0A==} peerDependencies: - react: ^19.2.0 + react: 19.2.6 '@mantine/notifications@7.17.8': resolution: {integrity: sha512-/YK16IZ198W6ru/IVecCtHcVveL08u2c8TbQTu/2p26LSIM9AbJhUkrU6H+AO0dgVVvmdmNdvPxcJnfq3S9TMg==} peerDependencies: '@mantine/core': 7.17.8 '@mantine/hooks': 7.17.8 - react: ^18.x || ^19.x - react-dom: ^18.x || ^19.x + react: 19.2.6 + react-dom: 19.2.6 '@mantine/store@7.17.8': resolution: {integrity: sha512-/FrB6PAVH4NEjQ1dsc9qOB+VvVlSuyjf4oOOlM9gscPuapDP/79Ryq7JkhHYfS55VWQ/YUlY24hDI2VV+VptXg==} peerDependencies: - react: ^18.x || ^19.x + react: 19.2.6 + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true '@marijn/find-cluster-break@1.0.3': resolution: {integrity: sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==} @@ -2985,15 +2996,15 @@ packages: resolution: {integrity: sha512-S/IPY8AjWTV2v1TGbEy5lsbQ5w+J2M2j2QDeswxP4FpNh2B49OPkpSqHbbX5GbV0YBlhfXJxtzwBJv/sQACufw==} engines: {node: '>=16'} peerDependencies: - react: '>= 18 || >= 19' - react-dom: '>= 18 || >= 19' + react: 19.2.6 + react-dom: 19.2.6 '@mdxeditor/gurx@1.2.4': resolution: {integrity: sha512-9ZykIFYhKaXaaSPCs1cuI+FvYDegJjbKwmA4ASE/zY+hJY6EYqvoye4esiO85CjhOw9aoD/izD/CU78/egVqmg==} engines: {node: '>=16'} peerDependencies: - react: '>= 18 || >= 19' - react-dom: '>= 18 || >= 19' + react: 19.2.6 + react-dom: 19.2.6 '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} @@ -3021,8 +3032,8 @@ packages: deprecated: This package has been replaced by @base-ui/react peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3036,7 +3047,7 @@ packages: peerDependencies: '@mui/material': ^5.0.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3048,8 +3059,8 @@ packages: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@emotion/react': optional: true @@ -3063,7 +3074,7 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3074,7 +3085,7 @@ packages: peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@emotion/react': optional: true @@ -3088,7 +3099,7 @@ packages: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@emotion/react': optional: true @@ -3110,7 +3121,7 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3120,7 +3131,7 @@ packages: engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3133,15 +3144,15 @@ packages: '@emotion/styled': ^11.8.1 '@mui/material': ^5.8.6 '@mui/system': ^5.8.0 - date-fns: ^2.25.0 || ^3.2.0 + date-fns: ^3.6.0 date-fns-jalali: ^2.13.0-0 dayjs: ^1.10.7 luxon: ^3.0.2 moment: ^2.29.4 moment-hijri: ^2.1.2 moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@emotion/react': optional: true @@ -3468,7 +3479,7 @@ packages: '@nestjs/core': ^10.0.0 || ^11.0.0 reflect-metadata: ^0.1.13 || ^0.2.0 rxjs: ^7.2.0 - typeorm: ^0.3.0 || ^1.0.0-dev + typeorm: 0.3.30 '@nestjs/websockets@11.1.27': resolution: {integrity: sha512-X3OgJt9KgYTvt9D7sNz9SOj3A1daAHy7DZrYhM1pky8Fh+erlKQH5IQ/tKm+GaJKA5M0srBUr1CMqjak/qNxOw==} @@ -3712,7 +3723,7 @@ packages: peerDependencies: '@types/react': '>=16.8.0' posthog-js: '>=1.257.2' - react: '>=16.8.0' + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3772,8 +3783,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3785,8 +3796,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3798,8 +3809,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3811,8 +3822,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3824,8 +3835,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3837,8 +3848,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3850,8 +3861,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3863,8 +3874,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3876,8 +3887,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3888,7 +3899,7 @@ packages: resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3898,8 +3909,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3910,7 +3921,7 @@ packages: resolution: {integrity: sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3920,8 +3931,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3932,7 +3943,7 @@ packages: resolution: {integrity: sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3942,8 +3953,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3955,8 +3966,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3967,7 +3978,7 @@ packages: resolution: {integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3977,8 +3988,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -3990,8 +4001,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4003,8 +4014,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4014,13 +4025,13 @@ packages: '@radix-ui/react-icons@1.3.2': resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} peerDependencies: - react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + react: 19.2.6 '@radix-ui/react-id@1.1.2': resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4030,8 +4041,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4043,8 +4054,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4056,8 +4067,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4069,8 +4080,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4082,8 +4093,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4095,8 +4106,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4108,8 +4119,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4121,8 +4132,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4134,8 +4145,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4147,8 +4158,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4160,8 +4171,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4173,8 +4184,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4186,8 +4197,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4199,8 +4210,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4212,8 +4223,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4225,8 +4236,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4238,8 +4249,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4251,8 +4262,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4263,7 +4274,7 @@ packages: resolution: {integrity: sha512-rCMO3QsIVKv5JTY5CVbo2MvO77SpEqqYc8AvRE7OWqRDOIqAKjsp+DrmnY9uc8NPdxB5E2z47HTYGeE2+NTptg==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4273,8 +4284,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4286,8 +4297,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4299,8 +4310,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4312,8 +4323,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4325,8 +4336,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4338,8 +4349,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4351,8 +4362,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4363,7 +4374,7 @@ packages: resolution: {integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4372,7 +4383,7 @@ packages: resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4381,7 +4392,7 @@ packages: resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4390,7 +4401,7 @@ packages: resolution: {integrity: sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4399,7 +4410,7 @@ packages: resolution: {integrity: sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4408,7 +4419,7 @@ packages: resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4417,7 +4428,7 @@ packages: resolution: {integrity: sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4426,7 +4437,7 @@ packages: resolution: {integrity: sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4435,7 +4446,7 @@ packages: resolution: {integrity: sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4445,8 +4456,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -4459,111 +4470,111 @@ packages: '@react-pdf-viewer/attachment@3.12.0': resolution: {integrity: sha512-mhwrYJSIpCvHdERpLUotqhMgSjhtF+BTY1Yb9Fnzpcq3gLZP+Twp5Rynq21tCrVdDizPaVY7SKu400GkgdMfZw==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/bookmark@3.12.0': resolution: {integrity: sha512-i7nEit8vIFMAES8RFGwprZ9cXOOZb9ZStPW6E6yuObJEXcvBj/ctsbBJGZxqUZOGklM0JoB7sjHyxAriHfe92A==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/core@3.12.0': resolution: {integrity: sha512-8MsdlQJ4jaw3GT+zpCHS33nwnvzpY0ED6DEahZg9WngG++A5RMhk8LSlxdHelwaFFHFiXBjmOaj2Kpxh50VQRg==} peerDependencies: - pdfjs-dist: ^2.16.105 || ^3.0.279 - react: '>=16.8.0' - react-dom: '>=16.8.0' + pdfjs-dist: ^3.11.174 + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/default-layout@3.12.0': resolution: {integrity: sha512-K2fS4+TJynHxxCBFuIDiFuAw3nqOh4bkBgtVZ/2pGvnFn9lLg46YGLMnTXCQqtyZzzXYh696jmlFViun3is4pA==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/full-screen@3.12.0': resolution: {integrity: sha512-hQouJ26QUaRBCXNMU1aI1zpJn4l4PJRvlHhuE2dZYtLl37ycjl7vBCQYZW1FwnuxMWztZsY47R43DKaZORg0pg==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/get-file@3.12.0': resolution: {integrity: sha512-Uhq45n2RWlZ7Ec/BtBJ0WQESRciaYIltveDXHNdWvXgFdOS8XsvB+mnTh/wzm7Cfl9hpPyzfeezifdU9AkQgQg==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/open@3.12.0': resolution: {integrity: sha512-vhiDEYsiQLxvZkIKT9VPYHZ1BOnv46x9eCEmRWxO1DJ8fa/GRDTA9ivXmq/ap0dGEJs6t+epleCkCEfllLR/Yw==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/page-navigation@3.12.0': resolution: {integrity: sha512-tVEJ48Dd5kajV1nKkrPWijglJRNBiKBTyYDKVexhiRdTHUP1f6QQXiSyDgCUb0IGSZeJzOJb1h7ApKHe8OTtuw==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/print@3.12.0': resolution: {integrity: sha512-xJn76CgbU/M2iNaN7wLHTg+sdOekkRMfCakFLwPrE+SR7qD6NUF4vQQKJBSVCCK5bUijzb6cWfKGfo8VA72o4Q==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/properties@3.12.0': resolution: {integrity: sha512-dYTCHtVwFNkpDo7QxL2qk/8zAKndLwdD1FFxBftl6jIlQbtvNdxkFfkv1HcQING9Ic+7DBryOiD7W0ze4IERYg==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/rotate@3.12.0': resolution: {integrity: sha512-yaxaMYPChvNOjR8+AxRmj0kvojyJKPq4XHEcIB2lJJgBY1Zra3mliDUP3Nlb4yV8BS9+yBqWn9U9mtnopQD+tw==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/scroll-mode@3.12.0': resolution: {integrity: sha512-okII7Xqhl6cMvl1izdEvlXNJ+vJVq/qdg53hJIDYVgBCWskLk/cpjUg/ZonBxseG9lIDP3w2VO1McT8Gn11OAg==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/search@3.12.0': resolution: {integrity: sha512-jAkLpis49fsDDY/HrbUZIOIhzF5vynONQNA4INQKI38r/MjveblrkNv7qbr9j5lQ/WFic5+gD1e+Mtpf1/7DiA==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/selection-mode@3.12.0': resolution: {integrity: sha512-yysWEu2aCtBvzSgbhgI9kT5cq2hf0FU6Z+3B7MMXz14Kxyc3y18wUqxtgbvpFEfWF0bNUUq16JtWRljtxvZ83w==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/theme@3.12.0': resolution: {integrity: sha512-cdBi+wR1VOZ6URCcO9plmAZQu4ZGFcd7HJdBe7VIFiGyrvl9I/Of74ONLycnDImSuONt8D3uNjPBLieeaShVeg==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/thumbnail@3.12.0': resolution: {integrity: sha512-Vc8j3bO6wumWZV4o6pAbktPWKDSC9tQAzOCJ3cof541u4i44C11ccYC4W9aNcsMMUSO3bNwAGWtP8OFthV5akQ==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/toolbar@3.12.0': resolution: {integrity: sha512-qACTU3qXHgtNK8J+T13EWio+0liilj86SJ87BdapqXynhl720OKPlSKOQqskUGqg3oTUJAhrse9XG6SFdHJx+g==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf-viewer/zoom@3.12.0': resolution: {integrity: sha512-V0GUTyPM77+LzhoKX+T3XI10/HfGdqRTbgeP7ID60FCzcwu6kXWqJn5tzabjDKLTlFv8mJmn0aa/ppkIU97nfA==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.2.6 + react-dom: 19.2.6 '@react-pdf/fns@3.1.3': resolution: {integrity: sha512-0I7pApDr1/RLAKbizuLy/IHTEa93LSPy/bEwYniboC3Xqnp6Od8xFJKbKEzGw2wh/5zKFFwl00g4t9RwgIMc3w==} @@ -4586,7 +4597,7 @@ packages: '@react-pdf/reconciler@2.0.0': resolution: {integrity: sha512-7zaPRujpbHSmCpIrZ+b9HSTJHthcVZzX0Wx7RzvQGsGBUbHP4p6s5itXrAIOuQuPvDepoHGNOvf6xUuMVvdoyw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 '@react-pdf/render@4.5.1': resolution: {integrity: sha512-IW/N4HWJWtioBXCf7n02IR24VJJ8gbdS3jGypf+vW/rSErEx3/URRzh9UK6Ma8Fpog9+T/W6GE2NHJ5AAKHhVA==} @@ -4594,7 +4605,7 @@ packages: '@react-pdf/renderer@4.5.1': resolution: {integrity: sha512-5r1VQrE6FRLXX5wWUxwZzM24E2BJMo6g8AQWuS8WyPs9ugu5yMnb2g8/RpPYka/Z6J+RUEWc32wty2NoUJF42Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 '@react-pdf/stylesheet@6.2.1': resolution: {integrity: sha512-2+UEk+7e+z8baaWi2l5kPLWmwtJeOI+T5wW9GGeN3iDH7vd3kbTqOpN1yt9mmfNVZFxQsnDHpznFb5v5UF983A==} @@ -4611,7 +4622,7 @@ packages: '@reduxjs/toolkit@2.12.0': resolution: {integrity: sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==} peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react: 19.2.6 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 peerDependenciesMeta: react: @@ -4829,7 +4840,7 @@ packages: '@tabler/icons-react@3.44.0': resolution: {integrity: sha512-8+rvzBbVm/1Z3sG3x7GUNAaxIKxwgz8xaMhRs23nrCnMTKRFAhEC+82zAIFeAA0seXdrAGX5HFCkaLpGK2rVHg==} peerDependencies: - react: '>= 16' + react: 19.2.6 '@tabler/icons@3.44.0': resolution: {integrity: sha512-Wn0AOZG9sg0L+bjfMqq4eNhC6pQjIrk94LvvWYNYkY8KH8wC3YILRzQlrnVJc4FUeMxH/AK97QsYCX35H3LndA==} @@ -4946,32 +4957,32 @@ packages: resolution: {integrity: sha512-cpZA0+WqKXwrwMfiWZEGGF6QrIWVQFbhBtxqDF5sQsAfrFf47HIE6fiPbQU3wyAUEN2+7UNqLCQe7oG6m3f93w==} peerDependencies: '@tanstack/react-query': ^5.101.0 - react: ^18 || ^19 + react: 19.2.6 '@tanstack/react-query@5.101.0': resolution: {integrity: sha512-rLlJXSpkqfizLWgkR5+eLeIk0MvTx/meEIR7LRjxic+qxiQP8zVjq7BqQkiCMNLQBlLfuOLqqr6KO5GtrDlmSg==} peerDependencies: - react: ^18 || ^19 + react: 19.2.6 '@tanstack/react-table@8.20.5': resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} engines: {node: '>=12'} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: 19.2.6 + react-dom: 19.2.6 '@tanstack/react-table@8.21.3': resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} engines: {node: '>=12'} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: 19.2.6 + react-dom: 19.2.6 '@tanstack/react-virtual@3.11.2': resolution: {integrity: sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 '@tanstack/table-core@8.20.5': resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} @@ -4987,8 +4998,8 @@ packages: '@tinymce/tinymce-react@6.3.0': resolution: {integrity: sha512-E++xnn0XzDzpKr40jno2Kj7umfAE6XfINZULEBBeNjTMvbACWzA6CjiR6V8eTDc9yVmdVhIPqVzV4PqD5TZ/4g==} peerDependencies: - react: ^19.0.0 || ^18.0.0 || ^17.0.1 || ^16.7.0 - react-dom: ^19.0.0 || ^18.0.0 || ^17.0.1 || ^16.7.0 + react: 19.2.6 + react-dom: 19.2.6 tinymce: ^8.0.0 || ^7.0.0 || ^6.0.0 || ^5.5.1 peerDependenciesMeta: tinymce: @@ -5018,7 +5029,7 @@ packages: '@nestjs/typeorm': ^11.0.0 reflect-metadata: ^0.2.0 rxjs: ^7.8.0 - typeorm: ^0.3.0 + typeorm: 0.3.30 '@tria-plc/iamapi-common@file:local-packages/tria-plc-iamapi-common-1.0.0.tgz': resolution: {integrity: sha512-rfHSXOm/0VUMTj7HrvYysrEAqxItqfPs4Rd35qWJyaAk+snF1wTKFRVz6cRGPoQNj8fhplkVAefnvuKBuHT+xQ==, tarball: file:local-packages/tria-plc-iamapi-common-1.0.0.tgz} @@ -5040,15 +5051,15 @@ packages: class-validator: ^0.14.1 reflect-metadata: ^0.2.0 rxjs: ^7.8.0 - typeorm: ^0.3.0 + typeorm: 0.3.30 '@tria-plc/iamui@file:local-packages/tria-plc-iamui-0.1.1.tgz': resolution: {integrity: sha512-FTihoH0lIqKV/0s+FTJZokQw8xX3XztXIqT8eEYEZgDM2xyzVSCHY8pHCUxw0MQtiR8R97zxZJ/o192eWt+E/g==, tarball: file:local-packages/tria-plc-iamui-0.1.1.tgz} version: 0.1.1 engines: {node: '>=18'} peerDependencies: - react: ^18.3.1 || ^19.0.0 - react-dom: ^18.3.1 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} @@ -5581,8 +5592,8 @@ packages: '@vis.gl/react-google-maps@1.8.3': resolution: {integrity: sha512-DW7nEuvOJ299DmdBnvGiUARrgS/+sTEO1iJgG9J8YaErZqLoq7S4TJ22f3EjJvR4dti4L4gft43JEK77nnKXDw==} peerDependencies: - react: '>=16.8.0 || ^19.0 || ^19.0.0-rc' - react-dom: '>=16.8.0 || ^19.0 || ^19.0.0-rc' + react: 19.2.6 + react-dom: 19.2.6 '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} @@ -5677,6 +5688,9 @@ packages: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -5957,6 +5971,9 @@ packages: append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} + arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} @@ -5972,6 +5989,11 @@ packages: resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} engines: {node: '>= 10'} + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -6446,6 +6468,10 @@ packages: caniuse-lite@1.0.30001797: resolution: {integrity: sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==} + canvas@2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + canvg@3.0.11: resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} engines: {node: '>=10.0.0'} @@ -6513,6 +6539,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -6631,8 +6661,8 @@ packages: cmdk@1.1.1: resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - react-dom: ^18 || ^19 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} @@ -6674,6 +6704,10 @@ packages: resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} engines: {node: '>=18'} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -6749,6 +6783,9 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -7019,9 +7056,6 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - date-fns@4.4.0: - resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} - date.js@0.3.3: resolution: {integrity: sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==} @@ -7078,6 +7112,10 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -7155,6 +7193,9 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -7272,7 +7313,7 @@ packages: downshift@7.6.2: resolution: {integrity: sha512-iOv+E1Hyt3JDdL9yYcOgW7nZ7GQ2Uz6YbggwXvKUSleetYhU2nXD482Rz6CzvM4lvI1At34BYruKAL4swRGxaA==} peerDependencies: - react: '>=16.12.0' + react: 19.2.6 dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} @@ -7966,8 +8007,8 @@ packages: resolution: {integrity: sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==} peerDependencies: '@emotion/is-prop-valid': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@emotion/is-prop-valid': optional: true @@ -8003,6 +8044,10 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs-monkey@1.1.0: resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} @@ -8037,6 +8082,11 @@ packages: fuzzysort@3.1.0: resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -8238,6 +8288,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + has-value@0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} @@ -8472,8 +8525,8 @@ packages: input-format@0.3.14: resolution: {integrity: sha512-gHMrgrbCgmT4uK5Um5eVDUohuV9lcs95ZUUN9Px2Y0VIfjTzT2wF8Q3Z4fwLFm7c5Z2OXCm53FHoovj6SlOKdg==} peerDependencies: - react: '>=18.1.0' - react-dom: '>=18.1.0' + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: react: optional: true @@ -9347,7 +9400,7 @@ packages: little-state-machine@4.8.1: resolution: {integrity: sha512-liPHqaWMQ7rzZryQUDnbZ1Gclnnai3dIyaJ0nAgwZRXMzqbYrydrlCI0NDojRUbE5VYh5vu6hygEUZiH77nQkQ==} peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 + react: 19.2.6 load-esm@1.0.3: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} @@ -9538,17 +9591,17 @@ packages: lucide-react@0.446.0: resolution: {integrity: sha512-BU7gy8MfBMqvEdDPH79VhOXSEgyG8TSPOKWaExWGCQVqnGH7wGgDngPbofu+KdtVjPQBWbEmnfMTq90CTiiDRg==} peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + react: 19.2.6 lucide-react@0.513.0: resolution: {integrity: sha512-CJZKq2g8Y8yN4Aq002GahSXbG2JpFv9kXwyiOAMvUBv7pxeOFHUWKB0mO7MiY4ZVFCV4aNjv2BJFq/z3DgKPQg==} peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 lucide-react@1.17.0: resolution: {integrity: sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w==} peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} @@ -9563,6 +9616,10 @@ packages: make-cancellable-promise@2.0.0: resolution: {integrity: sha512-3SEQqTpV9oqVsIWqAcmDuaNeo7yBO3tqPtqGRcKkEo0lrzD3wqbKG9mkxO65KoOgXqj+zH2phJ2LiAsdzlogSw==} + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -9586,8 +9643,8 @@ packages: '@tabler/icons-react': '>=2.23.0' clsx: '>=2' dayjs: '>=1.11' - react: '>=18.0' - react-dom: '>=18.0' + react: 19.2.6 + react-dom: 19.2.6 map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} @@ -9848,6 +9905,10 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -9870,10 +9931,22 @@ packages: resolution: {integrity: sha512-xPrLjWkTT5E7H7VnzOjF//xBp9I40jYB4aWhb2xTFopXXfw+Wo82DDWngdUju7Doy3Wk7R8C4LAgwhLHHnf0wA==} engines: {node: ^16 || ^18 || >=20} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} @@ -9885,6 +9958,11 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -9922,9 +10000,9 @@ packages: '@mui/icons-material': ^5.11.16 '@mui/material': ^5.13.3 '@mui/x-date-pickers': ^6.7.0 - date-fns: ^2.30.0 - react: ^18.2.0 - react-dom: ^18.2.0 + date-fns: ^3.6.0 + react: 19.2.6 + react-dom: 19.2.6 multer@2.1.1: resolution: {integrity: sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==} @@ -9944,6 +10022,9 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nan@2.28.0: + resolution: {integrity: sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==} + nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -9985,8 +10066,8 @@ packages: next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: - react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 next@14.2.35: resolution: {integrity: sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==} @@ -9995,8 +10076,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 + react: 19.2.6 + react-dom: 19.2.6 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': @@ -10034,6 +10115,15 @@ packages: node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -10056,6 +10146,11 @@ packages: resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} engines: {node: '>=18'} + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -10075,6 +10170,10 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -10342,6 +10441,10 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path2d-polyfill@2.0.1: + resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} + engines: {node: '>=8'} + path@0.12.7: resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} @@ -10361,6 +10464,10 @@ packages: pdf-lib@1.17.1: resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==} + pdfjs-dist@3.11.174: + resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} + engines: {node: '>=18'} + pdfjs-dist@5.4.296: resolution: {integrity: sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==} engines: {node: '>=20.16.0 || >=22.3.0'} @@ -10660,7 +10767,7 @@ packages: qrcode.react@3.2.0: resolution: {integrity: sha512-YietHHltOHA4+l5na1srdaMx4sVSOjV9tamHs+mwiLWAMr6QVACRUw1Neax5CptFILcNoITctJY0Ipyn5enQ8g==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: 19.2.6 qrcode@1.5.4: resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} @@ -10700,8 +10807,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -10735,60 +10842,55 @@ packages: react-cookie@8.1.2: resolution: {integrity: sha512-S45Z1y1dHyYfLEI4bFKQICuP+SwJqTPWbdc2ZpE6aQSdjSVJAjUDfwTPq8B7BWieIsgyyEWMb/QOrudtwJMjXA==} peerDependencies: - react: '>= 16.3.0' + react: 19.2.6 react-css-nocode-editor@1.0.13: resolution: {integrity: sha512-RV1ZbG8aXORiQ5mDKZbKCHStCJPamp/n5Rb34q22Ug2xzMDW4DjjqO23+Qo/Y+LAoyyrFV/+lI1qq4+/O5nf2A==} peerDependencies: - react: '>=16.8.0 <= 18.1' - react-dom: '>=16.8.0 <= 18.1' + react: 19.2.6 + react-dom: 19.2.6 react-day-picker@8.10.2: resolution: {integrity: sha512-LK68OTbHB3oJNhl9cA0qVizzp3o26w61YSjAFkYi67N86iro32wx86kSNeFU/hq+gI8m1yzWhnomMLfZ041RzQ==} peerDependencies: - date-fns: ^2.28.0 || ^3.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + date-fns: ^3.6.0 + react: 19.2.6 react-day-picker@9.14.0: resolution: {integrity: sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA==} engines: {node: '>=18'} peerDependencies: - react: '>=16.8.0' - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react: 19.2.6 react-dom@19.2.6: resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} peerDependencies: - react: ^19.2.6 + react: 19.2.6 react-dropzone@14.4.1: resolution: {integrity: sha512-QDuV76v3uKbHiH34SpwifZ+gOLi1+RdsCO1kl5vxMT4wW8R82+sthjvBw4th3NHF/XX6FBsqDYZVNN+pnhaw0g==} engines: {node: '>= 10.13'} peerDependencies: - react: '>= 16.8 || 18.0.0' + react: 19.2.6 react-hook-form@7.77.0: resolution: {integrity: sha512-Sslh9YDYc0GDlWT/lxasnIduNo4v3yyvqRGvmGKUre5AFjDs/HV9/OafHGD8d+sB2yoL4UIL9L8X9i0WlZZebg==} engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 + react: 19.2.6 react-hot-toast@2.6.0: resolution: {integrity: sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==} engines: {node: '>=10'} peerDependencies: - react: '>=16' - react-dom: '>=16' + react: 19.2.6 + react-dom: 19.2.6 react-i18next@15.7.4: resolution: {integrity: sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==} peerDependencies: i18next: '>= 23.4.0' - react: '>= 16.8.0' + react: 19.2.6 react-dom: '*' react-native: '*' typescript: ^5 @@ -10804,7 +10906,7 @@ packages: resolution: {integrity: sha512-0ooKbGLU8JXhe1zwpQUWIeXSgLPOfwJmgheWRIUpcoA0CpyabpGhayjdG+/eA5esC1AQ8h2jWpXjJfzQzeDOCw==} peerDependencies: i18next: '>= 26.2.0' - react: '>= 16.8.0' + react: 19.2.6 react-dom: '*' react-native: '*' typescript: ^5 || ^6 @@ -10819,18 +10921,18 @@ packages: react-icons@5.6.0: resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==} peerDependencies: - react: '*' + react: 19.2.6 react-image-crop@11.0.10: resolution: {integrity: sha512-+5FfDXUgYLLqBh1Y/uQhIycpHCbXkI50a+nbfkB1C0xXXUTwkisHDo2QCB1SQJyHCqIuia4FeyReqXuMDKWQTQ==} peerDependencies: - react: '>=16.13.1' + react: 19.2.6 react-intersection-observer@9.16.0: resolution: {integrity: sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==} peerDependencies: - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: react-dom: optional: true @@ -10851,27 +10953,27 @@ packages: resolution: {integrity: sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==} peerDependencies: '@types/react': '>=18' - react: '>=18' + react: 19.2.6 react-number-format@5.4.5: resolution: {integrity: sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==} peerDependencies: - react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 react-pdf-html@2.1.5: resolution: {integrity: sha512-KhmiTUcnUNbLVdZbxMcV/+Rp+PyBt+eVJHu425eNwjSsDUtytvcwS/SBdBbbpM0c4+MnnOQBOs3AiColUesM8A==} engines: {node: '>=16.0.0'} peerDependencies: '@react-pdf/renderer': '>=3.4.4' - react: '>=16' + react: 19.2.6 react-pdf@10.4.1: resolution: {integrity: sha512-kS/35staVCBqS29verTQJQZXw7RfsRCPO3fdJoW1KXylcv7A9dw6DZ3vJXC2w+bIBgLw5FN4pOFvKSQtkQhPfA==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -10879,21 +10981,21 @@ packages: react-phone-number-input@3.4.17: resolution: {integrity: sha512-1wcjhBAWHgEBAGLi5/XbeZI7Q3aEHNb2z/dHY6R2Gz70TQvu0ZoOT28NTdwtZf4lyRKXWufnTzVhLPBUD8LfmQ==} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: 19.2.6 + react-dom: 19.2.6 react-quill-new@3.8.3: resolution: {integrity: sha512-c96PYqFTo0pI4R3e79B3rH9LUIce1kIQbmTBu/imJQZk8305ogyLyBqKKjG2UoInDlquXqePSzmBo2aVia3ttw==} peerDependencies: quill-delta: ^5.1.0 - react: ^16 || ^17 || ^18 || ^19 - react-dom: ^16 || ^17 || ^18 || ^19 + react: 19.2.6 + react-dom: 19.2.6 react-redux@9.3.0: resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} peerDependencies: '@types/react': ^18.2.25 || ^19 - react: ^18.0 || ^19 + react: 19.2.6 redux: ^5.0.0 peerDependenciesMeta: '@types/react': @@ -10910,7 +11012,7 @@ packages: engines: {node: '>=10'} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -10920,7 +11022,7 @@ packages: engines: {node: '>=10'} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -10928,35 +11030,35 @@ packages: react-resizable-panels@3.0.6: resolution: {integrity: sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==} peerDependencies: - react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 react-router-dom@6.30.4: resolution: {integrity: sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==} engines: {node: '>=14.0.0'} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: 19.2.6 + react-dom: 19.2.6 react-router-dom@7.17.0: resolution: {integrity: sha512-fyU2yjGups/hE6Xz0I5ZYbVL8Gx29eCjgpHaRaTaVU+OOAdfRX05KsvyRm0GO8YQwOkhpU3MurW1jyMUJn+zSw==} engines: {node: '>=20.0.0'} peerDependencies: - react: '>=18' - react-dom: '>=18' + react: 19.2.6 + react-dom: 19.2.6 react-router@6.30.4: resolution: {integrity: sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==} engines: {node: '>=14.0.0'} peerDependencies: - react: '>=16.8' + react: 19.2.6 react-router@7.17.0: resolution: {integrity: sha512-FDELK7rTMlCHO5+reyXsPlmfr7N1F91lPHsWYfMEGQm/KQ+F4JFM8jGoeQDmDvdTs93Fw9aSilH+uKRb4/jXvQ==} engines: {node: '>=20.0.0'} peerDependencies: - react: '>=18' - react-dom: '>=18' + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: react-dom: optional: true @@ -10967,8 +11069,8 @@ packages: '@types/prop-types': ^15.7.3 '@types/react': 0.14 - 19 prop-types: ^15.5.8 - react: 0.14 - 19 - react-dom: 0.14 - 19 + react: 19.2.6 + react-dom: 19.2.6 peerDependenciesMeta: '@types/prop-types': optional: true @@ -10978,20 +11080,20 @@ packages: react-simple-animate@3.5.3: resolution: {integrity: sha512-Ob+SmB5J1tXDEZyOe2Hf950K4M8VaWBBmQ3cS2BUnTORqHjhK0iKG8fB+bo47ZL15t8d3g/Y0roiqH05UBjG7A==} peerDependencies: - react-dom: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: 19.2.6 react-smooth@4.0.4: resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 react-style-singleton@2.2.3: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -11000,17 +11102,13 @@ packages: resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} engines: {node: '>=10'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react: 19.2.6 + react-dom: 19.2.6 react@19.2.6: resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} @@ -11060,15 +11158,15 @@ packages: engines: {node: '>=14'} deprecated: 1.x and 2.x branches are no longer active. Bump to Recharts v3 to receive latest features and bugfixes. See https://github.com/recharts/recharts/wiki/3.0-migration-guide peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 recharts@3.8.1: resolution: {integrity: sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==} engines: {node: '>=18'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 + react-dom: 19.2.6 react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 redux-thunk@3.1.0: @@ -11318,9 +11416,6 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.25.0-rc-603e6108-20241029: resolution: {integrity: sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==} @@ -11448,6 +11543,12 @@ packages: signature_pad@2.3.2: resolution: {integrity: sha512-peYXLxOsIY6MES2TrRLDiNg2T++8gGbpP2yaC+6Ohtxr+a2dzoaqWosWDY9sWqTAAk6E/TyQO+LJw9zQwyu5kA==} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -11513,8 +11614,8 @@ packages: sonner@2.0.7: resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: - react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -11761,8 +11862,8 @@ packages: resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} engines: {node: '>=10'} peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' + react: 19.2.6 + react-dom: 19.2.6 react-is: '>= 16.8.0' styled-jsx@5.1.1: @@ -11771,7 +11872,7 @@ packages: peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + react: 19.2.6 peerDependenciesMeta: '@babel/core': optional: true @@ -11892,6 +11993,11 @@ packages: tar-stream@3.2.0: resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -12089,6 +12195,9 @@ packages: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@5.1.1: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} @@ -12271,7 +12380,7 @@ packages: hasBin: true peerDependencies: '@faker-js/faker': '>=8.4.1' - typeorm: ~0.3.0 + typeorm: 0.3.30 typeorm@0.3.30: resolution: {integrity: sha512-8T35PzjefOdqc2ZR9mwLQj0pUGp6lQhMbK2EvVMwJVJWlaoHm0v/Q6dThNOZkFchD+0yMg8gwjKM28ePiLSXSQ==} @@ -12451,7 +12560,7 @@ packages: engines: {node: '>=10'} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -12460,7 +12569,7 @@ packages: resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -12469,13 +12578,13 @@ packages: resolution: {integrity: sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==} engines: {node: '>=10', npm: '>=6'} peerDependencies: - react: '>=16.13' + react: 19.2.6 use-isomorphic-layout-effect@1.2.1: resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -12484,7 +12593,7 @@ packages: resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -12494,7 +12603,7 @@ packages: engines: {node: '>=10'} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react: 19.2.6 peerDependenciesMeta: '@types/react': optional: true @@ -12502,7 +12611,7 @@ packages: use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: 19.2.6 use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} @@ -12565,8 +12674,8 @@ packages: vaul@1.1.2: resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react: 19.2.6 + react-dom: 19.2.6 verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} @@ -12694,6 +12803,9 @@ packages: webdriver-bidi-protocol@0.4.1: resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -12729,6 +12841,9 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -12763,6 +12878,9 @@ packages: engines: {node: '>=8'} hasBin: true + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wmf@1.0.2: resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} engines: {node: '>=0.8'} @@ -12874,6 +12992,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@1.10.3: resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} engines: {node: '>= 6'} @@ -12970,7 +13091,7 @@ packages: peerDependencies: '@types/react': '>=18.0.0' immer: '>=9.0.6' - react: '>=18.0.0' + react: 19.2.6 use-sync-external-store: '>=1.2.0' peerDependenciesMeta: '@types/react': @@ -13998,12 +14119,6 @@ snapshots: '@floating-ui/core': 1.7.5 '@floating-ui/utils': 0.2.11 - '@floating-ui/react-dom@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.7.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@floating-ui/react-dom@2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@floating-ui/dom': 1.7.6 @@ -14018,14 +14133,6 @@ snapshots: react-dom: 19.2.6(react@19.2.6) tabbable: 6.4.0 - '@floating-ui/react@0.27.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.2.11 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.4.0 - '@floating-ui/react@0.27.19(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -14089,9 +14196,9 @@ snapshots: - '@types/react' - supports-color - '@hookform/resolvers@3.10.0(react-hook-form@7.77.0(react@18.3.1))': + '@hookform/resolvers@3.10.0(react-hook-form@7.77.0(react@19.2.6))': dependencies: - react-hook-form: 7.77.0(react@18.3.1) + react-hook-form: 7.77.0(react@19.2.6) '@hookform/resolvers@5.4.0(react-hook-form@7.77.0(react@19.2.6))': dependencies: @@ -14879,19 +14986,6 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react': 0.27.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 9.3.0(react@18.3.1) - clsx: 2.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-number-format: 5.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) - type-fest: 5.7.0 - transitivePeerDependencies: - - '@types/react' - '@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.6))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@floating-ui/react': 0.27.19(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -14949,10 +15043,6 @@ snapshots: dependencies: react: 19.2.6 - '@mantine/hooks@9.3.0(react@18.3.1)': - dependencies: - react: 18.3.1 - '@mantine/hooks@9.3.0(react@19.2.6)': dependencies: react: 19.2.6 @@ -14974,6 +15064,22 @@ snapshots: dependencies: react: 19.2.6 + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.1.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.8.2 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + '@marijn/find-cluster-break@1.0.3': {} '@mdxeditor/editor@4.2.0(@codemirror/language@6.12.4)(@lezer/highlight@1.2.3)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(yjs@13.6.32)': @@ -15733,15 +15839,6 @@ snapshots: '@radix-ui/primitive@1.1.4': {} - '@radix-ui/react-accessible-icon@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-visually-hidden': 1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-accessible-icon@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-visually-hidden': 1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -15751,23 +15848,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-accordion@1.2.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collapsible': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-accordion@1.2.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -15785,20 +15865,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-alert-dialog@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-alert-dialog@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -15813,15 +15879,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-arrow@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-arrow@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -15831,15 +15888,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-aspect-ratio@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-aspect-ratio@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -15849,19 +15897,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-avatar@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-avatar@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@19.2.6) @@ -15875,22 +15910,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-checkbox@1.3.4(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-checkbox@1.3.4(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -15907,22 +15926,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-collapsible@1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-collapsible@1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -15939,18 +15942,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-collection@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-collection@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.6) @@ -15963,31 +15954,12 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-compose-refs@1.1.3(@types/react@18.3.31)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-compose-refs@1.1.3(@types/react@18.3.31)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-context-menu@2.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-menu': 2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-context-menu@2.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16001,40 +15973,12 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-context@1.1.4(@types/react@18.3.31)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-context@1.1.4(@types/react@18.3.31)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-dialog@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-portal': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-dialog@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16057,31 +16001,12 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-direction@1.1.2(@types/react@18.3.31)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-direction@1.1.2(@types/react@18.3.31)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-dismissable-layer@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-dismissable-layer@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16095,21 +16020,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-dropdown-menu@2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-menu': 2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-dropdown-menu@2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16125,29 +16035,12 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-focus-guards@1.1.4(@types/react@18.3.31)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-focus-guards@1.1.4(@types/react@18.3.31)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-focus-scope@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-focus-scope@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.6) @@ -16159,20 +16052,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-form@0.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-label': 2.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-form@0.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16187,23 +16066,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-hover-card@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-hover-card@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16225,13 +16087,6 @@ snapshots: dependencies: react: 19.2.6 - '@radix-ui/react-id@1.1.2(@types/react@18.3.31)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-id@1.1.2(@types/react@18.3.31)(react@19.2.6)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.6) @@ -16239,15 +16094,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-label@2.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-label@2.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -16257,32 +16103,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-menu@2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-popper': 1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-menu@2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16309,24 +16129,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-menubar@1.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-menu': 2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-menubar@1.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16345,28 +16147,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-navigation-menu@1.2.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-navigation-menu@1.2.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16389,26 +16169,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-one-time-password-field@0.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.2 - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-one-time-password-field@0.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/number': 1.1.2 @@ -16429,22 +16189,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-password-toggle-field@0.1.4(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-password-toggle-field@0.1.4(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16461,29 +16205,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-popover@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-popper': 1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-popover@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16507,24 +16228,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-popper@1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/rect': 1.1.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-popper@1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -16543,16 +16246,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-portal@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-portal@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -16563,15 +16256,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-presence@1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-presence@1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.6) @@ -16581,15 +16265,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-primitive@2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-primitive@2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@19.2.6) @@ -16599,16 +16274,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-progress@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-progress@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@19.2.6) @@ -16619,24 +16284,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-radio-group@1.4.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-radio-group@1.4.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16655,23 +16302,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-roving-focus@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-roving-focus@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16689,23 +16319,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-scroll-area@1.2.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.2 - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-scroll-area@1.2.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/number': 1.1.2 @@ -16723,36 +16336,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-select@2.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.2 - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-popper': 1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-select@2.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/number': 1.1.2 @@ -16783,15 +16366,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-separator@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-separator@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -16801,25 +16375,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-slider@1.4.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.2 - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-slider@1.4.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/number': 1.1.2 @@ -16839,13 +16394,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-slot@1.2.5(@types/react@18.3.31)(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-slot@1.2.5(@types/react@18.3.31)(react@19.2.6)': dependencies: '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.6) @@ -16853,21 +16401,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-switch@1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-switch@1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16883,22 +16416,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-tabs@1.1.14(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-tabs@1.1.14(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16915,26 +16432,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-toast@1.2.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-toast@1.2.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16955,21 +16452,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-toggle-group@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-toggle-group@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -16985,17 +16467,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-toggle@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-toggle@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -17007,21 +16478,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-toolbar@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-separator': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle-group': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-toolbar@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -17037,26 +16493,6 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-tooltip@1.2.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-popper': 1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-tooltip@1.2.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.4 @@ -17077,26 +16513,12 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-use-callback-ref@1.1.2(@types/react@18.3.31)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-callback-ref@1.1.2(@types/react@18.3.31)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-controllable-state@1.2.3(@types/react@18.3.31)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-controllable-state@1.2.3(@types/react@18.3.31)(react@19.2.6)': dependencies: '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@19.2.6) @@ -17105,13 +16527,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-effect-event@0.0.3(@types/react@18.3.31)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-effect-event@0.0.3(@types/react@18.3.31)(react@19.2.6)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.6) @@ -17119,13 +16534,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-escape-keydown@1.1.2(@types/react@18.3.31)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-escape-keydown@1.1.2(@types/react@18.3.31)(react@19.2.6)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.6) @@ -17133,49 +16541,24 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-is-hydrated@0.1.1(@types/react@18.3.31)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-is-hydrated@0.1.1(@types/react@18.3.31)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-layout-effect@1.1.2(@types/react@18.3.31)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-layout-effect@1.1.2(@types/react@18.3.31)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-previous@1.1.2(@types/react@18.3.31)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-previous@1.1.2(@types/react@18.3.31)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-rect@1.1.2(@types/react@18.3.31)(react@18.3.1)': - dependencies: - '@radix-ui/rect': 1.1.2 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-rect@1.1.2(@types/react@18.3.31)(react@19.2.6)': dependencies: '@radix-ui/rect': 1.1.2 @@ -17183,13 +16566,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-size@1.1.2(@types/react@18.3.31)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.31 - '@radix-ui/react-use-size@1.1.2(@types/react@18.3.31)(react@19.2.6)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.6) @@ -17197,15 +16573,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-visually-hidden@1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-visually-hidden@1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -17730,11 +17097,6 @@ snapshots: '@tanstack/react-query': 5.101.0(react@19.2.6) react: 19.2.6 - '@tanstack/react-query@5.101.0(react@18.3.1)': - dependencies: - '@tanstack/query-core': 5.101.0 - react: 18.3.1 - '@tanstack/react-query@5.101.0(react@19.2.6)': dependencies: '@tanstack/query-core': 5.101.0 @@ -17746,12 +17108,6 @@ snapshots: react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/table-core': 8.21.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@tanstack/react-table@8.21.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/table-core': 8.21.3 @@ -18063,6 +17419,7 @@ snapshots: - '@types/react-dom' - bufferutil - debug + - encoding - pdfjs-dist - prop-types - react-is @@ -18187,6 +17544,7 @@ snapshots: - '@types/react-dom' - bufferutil - debug + - encoding - pdfjs-dist - prop-types - react-is @@ -18895,6 +18253,9 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 + abbrev@1.1.1: + optional: true + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -19173,6 +18534,9 @@ snapshots: append-field@1.0.0: {} + aproba@2.1.0: + optional: true + arch@2.2.0: {} archiver-utils@2.1.0: @@ -19211,6 +18575,12 @@ snapshots: tar-stream: 2.2.0 zip-stream: 4.1.1 + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + arg@4.1.3: {} arg@5.0.2: {} @@ -19765,6 +19135,16 @@ snapshots: caniuse-lite@1.0.30001797: {} + canvas@2.11.2: + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + nan: 2.28.0 + simple-get: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + canvg@3.0.11: dependencies: '@babel/runtime': 7.29.7 @@ -19845,6 +19225,9 @@ snapshots: dependencies: readdirp: 4.1.2 + chownr@2.0.0: + optional: true + chrome-trace-event@1.0.4: {} chromium-bidi@14.0.0(devtools-protocol@0.0.1608973): @@ -20008,6 +19391,9 @@ snapshots: dependencies: color-name: 2.1.0 + color-support@1.1.3: + optional: true + colorette@2.0.20: {} colors@1.4.0: @@ -20071,6 +19457,9 @@ snapshots: consola@3.4.2: {} + console-control-strings@1.1.0: + optional: true + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -20368,8 +19757,6 @@ snapshots: date-fns@3.6.0: {} - date-fns@4.4.0: {} - date.js@0.3.3: dependencies: debug: 3.1.0 @@ -20416,6 +19803,11 @@ snapshots: decode-uri-component@0.2.2: {} + decompress-response@4.2.1: + dependencies: + mimic-response: 2.1.0 + optional: true + dedent@1.7.2(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -20482,6 +19874,9 @@ snapshots: delayed-stream@1.0.0: {} + delegates@1.0.0: + optional: true + depd@2.0.0: {} dequal@2.0.3: {} @@ -21628,6 +21023,11 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + optional: true + fs-monkey@1.1.0: {} fs.realpath@1.0.0: {} @@ -21660,6 +21060,19 @@ snapshots: fuzzysort@3.1.0: {} + gauge@3.0.2: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + generator-function@2.0.1: {} gensync@1.0.0-beta.2: {} @@ -21902,6 +21315,9 @@ snapshots: dependencies: has-symbols: 1.1.0 + has-unicode@2.0.1: + optional: true + has-value@0.3.1: dependencies: get-value: 2.0.6 @@ -22892,7 +22308,7 @@ snapshots: jsbn@0.1.1: {} - jsdom@25.0.1: + jsdom@25.0.1(canvas@2.11.2): dependencies: cssstyle: 4.6.0 data-urls: 5.0.0 @@ -22915,6 +22331,8 @@ snapshots: whatwg-url: 14.2.0 ws: 8.21.0 xml-name-validator: 5.0.0 + optionalDependencies: + canvas: 2.11.2 transitivePeerDependencies: - bufferutil - supports-color @@ -23351,18 +22769,14 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@0.446.0(react@18.3.1): + lucide-react@0.446.0(react@19.2.6): dependencies: - react: 18.3.1 + react: 19.2.6 lucide-react@0.513.0(react@19.2.6): dependencies: react: 19.2.6 - lucide-react@1.17.0(react@18.3.1): - dependencies: - react: 18.3.1 - lucide-react@1.17.0(react@19.2.6): dependencies: react: 19.2.6 @@ -23379,6 +22793,11 @@ snapshots: make-cancellable-promise@2.0.0: {} + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + optional: true + make-dir@4.0.0: dependencies: semver: 7.8.2 @@ -23902,6 +23321,9 @@ snapshots: mimic-function@5.0.1: {} + mimic-response@2.1.0: + optional: true + minimatch@10.2.5: dependencies: brace-expansion: 5.0.6 @@ -23937,8 +23359,22 @@ snapshots: xml: 1.0.1 xml2js: 0.5.0 + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + optional: true + + minipass@5.0.0: + optional: true + minipass@7.1.3: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + optional: true + mitt@3.0.1: {} mixin-deep@1.3.2: @@ -23950,6 +23386,9 @@ snapshots: dependencies: minimist: 1.2.8 + mkdirp@1.0.4: + optional: true + moment@2.30.1: {} motion-dom@12.40.0: @@ -24045,6 +23484,9 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nan@2.28.0: + optional: true + nanoid@3.3.12: {} nanomatch@1.2.13: @@ -24088,7 +23530,7 @@ snapshots: react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - next@14.2.35(@playwright/test@1.61.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.35(@playwright/test@1.61.1)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: '@next/env': 14.2.35 '@swc/helpers': 0.5.5 @@ -24096,9 +23538,9 @@ snapshots: caniuse-lite: 1.0.30001797 graceful-fs: 4.2.11 postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(babel-plugin-macros@3.1.0)(react@18.3.1) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + styled-jsx: 5.1.1(babel-plugin-macros@3.1.0)(react@19.2.6) optionalDependencies: '@next/swc-darwin-arm64': 14.2.33 '@next/swc-darwin-x64': 14.2.33 @@ -24140,6 +23582,11 @@ snapshots: node-fetch-native@1.6.7: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + optional: true + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 @@ -24159,6 +23606,11 @@ snapshots: node-releases@2.0.47: {} + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + optional: true + normalize-path@3.0.0: {} normalize-svg-path@1.1.0: @@ -24178,6 +23630,14 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + optional: true + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -24473,6 +23933,9 @@ snapshots: path-type@4.0.0: {} + path2d-polyfill@2.0.1: + optional: true + path@0.12.7: dependencies: process: 0.11.10 @@ -24493,6 +23956,14 @@ snapshots: pako: 1.0.11 tslib: 1.14.1 + pdfjs-dist@3.11.174: + optionalDependencies: + canvas: 2.11.2 + path2d-polyfill: 2.0.1 + transitivePeerDependencies: + - encoding + - supports-color + pdfjs-dist@5.4.296: optionalDependencies: '@napi-rs/canvas': 0.1.100 @@ -24775,9 +24246,9 @@ snapshots: pure-rand@6.1.0: {} - qrcode.react@3.2.0(react@18.3.1): + qrcode.react@3.2.0(react@19.2.6): dependencies: - react: 18.3.1 + react: 19.2.6 qrcode@1.5.4: dependencies: @@ -24819,69 +24290,6 @@ snapshots: parchment: 3.0.0 quill-delta: 5.1.0 - radix-ui@1.5.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-accessible-icon': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-accordion': 1.2.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-alert-dialog': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-aspect-ratio': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-avatar': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-checkbox': 1.3.4(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-collapsible': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-collection': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-context-menu': 2.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dropdown-menu': 2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-form': 0.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-hover-card': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-label': 2.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-menu': 2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-menubar': 1.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-navigation-menu': 1.2.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-one-time-password-field': 0.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-password-toggle-field': 0.1.4(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popover': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-progress': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-radio-group': 1.4.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-scroll-area': 1.2.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-select': 2.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-separator': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slider': 1.4.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-switch': 1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tabs': 1.1.14(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toast': 1.2.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle-group': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toolbar': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tooltip': 1.2.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.5(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - radix-ui@1.5.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: '@radix-ui/primitive': 1.1.4 @@ -25010,28 +24418,14 @@ snapshots: date-fns: 3.6.0 react: 19.2.6 - react-day-picker@9.14.0(react@18.3.1): - dependencies: - '@date-fns/tz': 1.5.0 - '@tabby_ai/hijri-converter': 1.0.5 - date-fns: 4.4.0 - date-fns-jalali: 4.1.0-0 - react: 18.3.1 - react-day-picker@9.14.0(react@19.2.6): dependencies: '@date-fns/tz': 1.5.0 '@tabby_ai/hijri-converter': 1.0.5 - date-fns: 4.4.0 + date-fns: 3.6.0 date-fns-jalali: 4.1.0-0 react: 19.2.6 - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-dom@19.2.6(react@19.2.6): dependencies: react: 19.2.6 @@ -25044,10 +24438,6 @@ snapshots: prop-types: 15.8.1 react: 19.2.6 - react-hook-form@7.77.0(react@18.3.1): - dependencies: - react: 18.3.1 - react-hook-form@7.77.0(react@19.2.6): dependencies: react: 19.2.6 @@ -25120,11 +24510,6 @@ snapshots: transitivePeerDependencies: - supports-color - react-number-format@5.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-number-format@5.4.5(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: react: 19.2.6 @@ -25144,13 +24529,16 @@ snapshots: make-cancellable-promise: 2.0.0 make-event-props: 2.0.0 merge-refs: 2.0.0(@types/react@18.3.31) - pdfjs-dist: 5.4.296 + pdfjs-dist: 3.11.174 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) tiny-invariant: 1.3.3 warning: 4.0.3 optionalDependencies: '@types/react': 18.3.31 + transitivePeerDependencies: + - encoding + - supports-color react-phone-number-input@3.4.17(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: @@ -25181,14 +24569,6 @@ snapshots: react-refresh@0.17.0: {} - react-remove-scroll-bar@2.3.8(@types/react@18.3.31)(react@18.3.1): - dependencies: - react: 18.3.1 - react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.31 - react-remove-scroll-bar@2.3.8(@types/react@18.3.31)(react@19.2.6): dependencies: react: 19.2.6 @@ -25197,17 +24577,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - react-remove-scroll@2.7.2(@types/react@18.3.31)(react@18.3.1): - dependencies: - react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@18.3.31)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.3.31)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.31)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.31 - react-remove-scroll@2.7.2(@types/react@18.3.31)(react@19.2.6): dependencies: react: 19.2.6 @@ -25267,21 +24636,13 @@ snapshots: dependencies: react-dom: 19.2.6(react@19.2.6) - react-smooth@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-smooth@4.0.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: fast-equals: 5.4.0 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - react-style-singleton@2.2.3(@types/react@18.3.31)(react@18.3.1): - dependencies: - get-nonce: 1.0.1 - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.31 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-transition-group: 4.4.5(react-dom@19.2.6(react@19.2.6))(react@19.2.6) react-style-singleton@2.2.3(@types/react@18.3.31)(react@19.2.6): dependencies: @@ -25300,15 +24661,6 @@ snapshots: transitivePeerDependencies: - '@types/react' - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.29.7 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group@4.4.5(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: '@babel/runtime': 7.29.7 @@ -25318,10 +24670,6 @@ snapshots: react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - react@19.2.6: {} read-cache@1.0.0: @@ -25384,15 +24732,15 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + recharts@2.15.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 lodash: 4.18.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) react-is: 18.3.1 - react-smooth: 4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-smooth: 4.0.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 @@ -25690,10 +25038,6 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.25.0-rc-603e6108-20241029: {} scheduler@0.27.0: {} @@ -25905,6 +25249,16 @@ snapshots: signature_pad@2.3.2: {} + simple-concat@1.0.1: + optional: true + + simple-get@3.1.1: + dependencies: + decompress-response: 4.2.1 + once: 1.4.0 + simple-concat: 1.0.1 + optional: true + sisteransi@1.0.5: {} slash@3.0.0: {} @@ -26308,10 +25662,10 @@ snapshots: transitivePeerDependencies: - '@babel/core' - styled-jsx@5.1.1(babel-plugin-macros@3.1.0)(react@18.3.1): + styled-jsx@5.1.1(babel-plugin-macros@3.1.0)(react@19.2.6): dependencies: client-only: 0.0.1 - react: 18.3.1 + react: 19.2.6 optionalDependencies: babel-plugin-macros: 3.1.0 @@ -26466,6 +25820,16 @@ snapshots: - bare-buffer - react-native-b4a + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + optional: true + teex@1.0.1: dependencies: streamx: 2.27.0 @@ -26623,6 +25987,9 @@ snapshots: dependencies: tldts: 7.4.2 + tr46@0.0.3: + optional: true + tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -27050,13 +26417,6 @@ snapshots: punycode: 1.4.1 qs: 6.15.2 - use-callback-ref@1.3.3(@types/react@18.3.31)(react@18.3.1): - dependencies: - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.31 - use-callback-ref@1.3.3(@types/react@18.3.31)(react@19.2.6): dependencies: react: 19.2.6 @@ -27089,14 +26449,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - use-sidecar@1.1.3(@types/react@18.3.31)(react@18.3.1): - dependencies: - detect-node-es: 1.1.0 - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.31 - use-sidecar@1.1.3(@types/react@18.3.31)(react@19.2.6): dependencies: detect-node-es: 1.1.0 @@ -27105,11 +26457,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - use-sync-external-store@1.6.0(react@18.3.1): - dependencies: - react: 18.3.1 - optional: true - use-sync-external-store@1.6.0(react@19.2.6): dependencies: react: 19.2.6 @@ -27286,7 +26633,7 @@ snapshots: lightningcss: 1.32.0 terser: 5.48.0 - vitest@2.1.9(@types/node@22.20.1)(jsdom@25.0.1)(lightningcss@1.32.0)(msw@2.14.6(@types/node@22.20.1)(typescript@5.9.3))(terser@5.48.0): + vitest@2.1.9(@types/node@22.20.1)(jsdom@25.0.1(canvas@2.11.2))(lightningcss@1.32.0)(msw@2.14.6(@types/node@22.20.1)(typescript@5.9.3))(terser@5.48.0): dependencies: '@vitest/expect': 2.1.9 '@vitest/mocker': 2.1.9(msw@2.14.6(@types/node@22.20.1)(typescript@5.9.3))(vite@5.4.21(@types/node@22.20.1)(lightningcss@1.32.0)(terser@5.48.0)) @@ -27310,7 +26657,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.20.1 - jsdom: 25.0.1 + jsdom: 25.0.1(canvas@2.11.2) transitivePeerDependencies: - less - lightningcss @@ -27322,7 +26669,7 @@ snapshots: - supports-color - terser - vitest@2.1.9(@types/node@24.13.1)(jsdom@25.0.1)(lightningcss@1.32.0)(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(terser@5.48.0): + vitest@2.1.9(@types/node@24.13.1)(jsdom@25.0.1(canvas@2.11.2))(lightningcss@1.32.0)(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(terser@5.48.0): dependencies: '@vitest/expect': 2.1.9 '@vitest/mocker': 2.1.9(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@5.4.21(@types/node@24.13.1)(lightningcss@1.32.0)(terser@5.48.0)) @@ -27346,7 +26693,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.13.1 - jsdom: 25.0.1 + jsdom: 25.0.1(canvas@2.11.2) transitivePeerDependencies: - less - lightningcss @@ -27410,6 +26757,9 @@ snapshots: webdriver-bidi-protocol@0.4.1: {} + webidl-conversions@3.0.1: + optional: true + webidl-conversions@7.0.0: {} webpack-node-externals@3.0.0: {} @@ -27468,6 +26818,12 @@ snapshots: tr46: 5.1.1 webidl-conversions: 7.0.0 + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + optional: true + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -27524,6 +26880,11 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + optional: true + wmf@1.0.2: {} word-wrap@1.2.5: {} @@ -27610,6 +26971,9 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: + optional: true + yaml@1.10.3: {} yaml@2.9.0: {} @@ -27701,13 +27065,6 @@ snapshots: zod@4.4.3: {} - zustand@5.0.14(@types/react@18.3.31)(immer@11.1.8)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): - optionalDependencies: - '@types/react': 18.3.31 - immer: 11.1.8 - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) - zustand@5.0.14(@types/react@18.3.31)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): optionalDependencies: '@types/react': 18.3.31 From 03e498d6e87139c26c670ee0e0033826ac0c37d1 Mon Sep 17 00:00:00 2001 From: Nathnael Date: Wed, 12 Aug 2026 07:53:05 +0000 Subject: [PATCH 3/4] fixes --- apps/edr-freight-api/src/app.module.ts | 6 +- .../src/common/request-log-context.spec.ts | 102 +++++++++++++ apps/edr-freight-api/src/logger.middleware.ts | 21 --- .../etrade-business-selection.spec.ts | 15 ++ .../companies/services/etrade.service.ts | 3 +- .../complaints/services/etradeTinService.ts | 3 +- .../src/filters/http-exception.filter.ts | 14 ++ packages/api-common/src/index.ts | 4 + .../api-common/src/logging/request-context.ts | 109 ++++++++++++++ .../src/logging/request-log.middleware.ts | 137 ++++++++++++++++++ packages/types/src/freight/etrade.ts | 3 +- 11 files changed, 391 insertions(+), 26 deletions(-) create mode 100644 apps/edr-freight-api/src/common/request-log-context.spec.ts delete mode 100644 apps/edr-freight-api/src/logger.middleware.ts create mode 100644 packages/api-common/src/logging/request-context.ts create mode 100644 packages/api-common/src/logging/request-log.middleware.ts diff --git a/apps/edr-freight-api/src/app.module.ts b/apps/edr-freight-api/src/app.module.ts index 029f2040b..bb7a3b9fd 100644 --- a/apps/edr-freight-api/src/app.module.ts +++ b/apps/edr-freight-api/src/app.module.ts @@ -114,7 +114,7 @@ import { InterchangeDocumentsModule } from "./modules/interchange-documents/inte import { ImportOperationsModule } from "./modules/import-operations/import-operations.module"; import { AiModule } from "./modules/ai/ai.module"; import { AuditModule } from "./modules/audit/audit.module"; -import { LoggerMiddleware } from "./logger.middleware"; +import { RequestLogMiddleware } from "@edr/api-common"; import { LoginAudienceMiddleware } from "./modules/auth/login-audience.middleware"; import { PositionTypePermissionsCache } from "./common/position-type-permissions.cache"; @@ -392,7 +392,9 @@ export class AppModule implements OnApplicationBootstrap { } configure(consumer: MiddlewareConsumer) { - consumer.apply(LoggerMiddleware).forRoutes("*"); + // FIRST: opens the request log context every later middleware/guard/service + // writes into via logCtx(). Anything applied above it logs into the void. + consumer.apply(RequestLogMiddleware).forRoutes("*"); consumer .apply(LoginAudienceMiddleware) .forRoutes( diff --git a/apps/edr-freight-api/src/common/request-log-context.spec.ts b/apps/edr-freight-api/src/common/request-log-context.spec.ts new file mode 100644 index 000000000..0aefe3695 --- /dev/null +++ b/apps/edr-freight-api/src/common/request-log-context.spec.ts @@ -0,0 +1,102 @@ +import { Logger } from "@nestjs/common"; +import { + RequestLogMiddleware, + getLogContext, + logCtx, + runWithLogContext, +} from "@edr/api-common"; + +describe("logCtx", () => { + it("is a no-op outside a request", () => { + expect(() => logCtx({ bookingId: "b1" })).not.toThrow(); + expect(getLogContext()).toBeUndefined(); + }); + + it("collects data points across the request and isolates concurrent ones", async () => { + const collect = async (id: string) => + runWithLogContext({ requestId: id }, async () => { + logCtx({ bookingId: id }); + await Promise.resolve(); + logCtx({ from: "DRAFT", to: "SUBMITTED" }, { path: "booking.status" }); + logCtx({ wagonId: "w1" }, { path: "wagons", mode: "push" }); + logCtx({ wagonId: "w2" }, { path: "wagons", mode: "push" }); + logCtx(1, { path: "smsSent", mode: "count" }); + logCtx(1, { path: "smsSent", mode: "count" }); + logCtx("PAID", { path: "payment.state", mode: "set" }); + logCtx({ ignored: true }, (ctx) => { + ctx.custom = "yes"; + }); + return getLogContext(); + }); + + const [a, b] = await Promise.all([collect("r1"), collect("r2")]); + + expect(a).toEqual({ + requestId: "r1", + bookingId: "r1", + booking: { status: { from: "DRAFT", to: "SUBMITTED" } }, + wagons: [{ wagonId: "w1" }, { wagonId: "w2" }], + smsSent: 2, + payment: { state: "PAID" }, + custom: "yes", + }); + expect(b?.requestId).toBe("r2"); + expect(b?.bookingId).toBe("r2"); + }); +}); + +describe("RequestLogMiddleware", () => { + it("emits one canonical JSON line carrying the collected context", () => { + const lines: string[] = []; + jest + .spyOn(Logger.prototype, "warn") + .mockImplementation((m) => lines.push(String(m))); + jest.spyOn(Logger.prototype, "log").mockImplementation(() => undefined); + + const listeners: Record void> = {}; + const req = { + method: "POST", + url: "/api/bookings/1/submit", + originalUrl: "/api/bookings/1/submit?dry=1", + baseUrl: "/api/bookings", + route: { path: "/:id/submit" }, + headers: { "user-agent": "jest", "x-request-id": "req-42" }, + ip: "10.0.0.1", + query: { dry: "1" }, + user: { id: "u-7" }, + }; + const res = { + statusCode: 409, + writableEnded: true, + setHeader: jest.fn(), + on: (event: string, fn: () => void) => { + listeners[event] = fn; + }, + }; + + new RequestLogMiddleware().use(req, res, () => { + logCtx({ bookingId: "b-1" }); + logCtx("REJECTED", { path: "booking.outcome", mode: "set" }); + }); + listeners.finish(); + listeners.close(); // aborts/close after finish must not double-log + + expect(lines).toHaveLength(1); + expect(JSON.parse(lines[0])).toMatchObject({ + type: "http_request", + requestId: "req-42", + method: "POST", + route: "/api/bookings/:id/submit", + url: "/api/bookings/1/submit?dry=1", + status: 409, + userId: "u-7", + ip: "10.0.0.1", + userAgent: "jest", + query: { dry: "1" }, + bookingId: "b-1", + booking: { outcome: "REJECTED" }, + }); + expect(res.setHeader).toHaveBeenCalledWith("x-request-id", "req-42"); + jest.restoreAllMocks(); + }); +}); diff --git a/apps/edr-freight-api/src/logger.middleware.ts b/apps/edr-freight-api/src/logger.middleware.ts deleted file mode 100644 index dd7532ec8..000000000 --- a/apps/edr-freight-api/src/logger.middleware.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Injectable, NestMiddleware, Logger } from "@nestjs/common"; -import { Request, Response, NextFunction } from "express"; - -@Injectable() -export class LoggerMiddleware implements NestMiddleware { - private readonly logger = new Logger("HTTP"); - - use(req: Request, res: Response, next: NextFunction) { - const start = Date.now(); - - res.on("finish", () => { - const duration = Date.now() - start; - - this.logger.log( - `${req.method} ${req.originalUrl} ${res.statusCode} ${duration}ms`, - ); - }); - - next(); - } -} diff --git a/apps/edr-freight-api/src/modules/companies/services/etrade-business-selection.spec.ts b/apps/edr-freight-api/src/modules/companies/services/etrade-business-selection.spec.ts index 0719d7fe8..86117d306 100644 --- a/apps/edr-freight-api/src/modules/companies/services/etrade-business-selection.spec.ts +++ b/apps/edr-freight-api/src/modules/companies/services/etrade-business-selection.spec.ts @@ -63,6 +63,21 @@ describe('ETradeService business selection', () => { expect(fetched).toEqual(['MT/AA/14/670/11551235/2017']); }); + it('survives the null entries eTrade puts in SubGroups', () => { + const { service } = build(); + const info = companyInfo(); + (info.Businesses[0] as any).SubGroups = [ + null, + { Code: 66331, Description: 'Export trade in minerals' }, + { Code: 1, Description: null }, + ]; + const data = service.extractRegistrationData( + { LicenceNumber: 'x' } as ETradeBusinessInfo, + info, + ); + expect(data.businesses?.[0].activity).toBe('Export trade in minerals'); + }); + it('lists every licence for the picker, code prefixes stripped', () => { const { service } = build(); const data = service.extractRegistrationData( diff --git a/apps/edr-freight-api/src/modules/companies/services/etrade.service.ts b/apps/edr-freight-api/src/modules/companies/services/etrade.service.ts index 45cc8e840..fac57238a 100644 --- a/apps/edr-freight-api/src/modules/companies/services/etrade.service.ts +++ b/apps/edr-freight-api/src/modules/companies/services/etrade.service.ts @@ -142,7 +142,8 @@ export class ETradeService { tradeName: b.TradesName?.trim() || "", activity: (b.SubGroups ?? []) // Some descriptions repeat the code inline ("(65611)Import trade …"). - .map((g) => g.Description?.replace(/^\(\d+\)\s*/, "").trim()) + // eTrade also puts null entries in this array, so every hop is optional. + .map((g) => g?.Description?.replace(/^\(\d+\)\s*/, "").trim()) .filter(Boolean) .join(", "), renewedTo: b.RenewedTo || "", diff --git a/apps/edr-freight-web/backoffice/src/complaints/services/etradeTinService.ts b/apps/edr-freight-web/backoffice/src/complaints/services/etradeTinService.ts index 3bdc653c4..8feb7cfb8 100644 --- a/apps/edr-freight-web/backoffice/src/complaints/services/etradeTinService.ts +++ b/apps/edr-freight-web/backoffice/src/complaints/services/etradeTinService.ts @@ -101,7 +101,8 @@ export function mapEtradeBusinessLicenses( const tradeName = String(business.TradesName ?? "").trim(); const tradeNameAmh = String(business.TradeNameAmh ?? "").trim(); const activities = (business.SubGroups ?? []) - .map((group) => String(group.Description ?? "").trim()) + // eTrade returns null entries in this array, not just a null array. + .map((group) => String(group?.Description ?? "").trim()) .filter(Boolean); const displayTradeName = diff --git a/packages/api-common/src/filters/http-exception.filter.ts b/packages/api-common/src/filters/http-exception.filter.ts index 3dc301a0b..3015d239f 100644 --- a/packages/api-common/src/filters/http-exception.filter.ts +++ b/packages/api-common/src/filters/http-exception.filter.ts @@ -7,6 +7,8 @@ import { Logger, } from "@nestjs/common"; +import { logCtx } from "../logging/request-context"; + interface ErrorResponseBody { success: false; statusCode: number; @@ -120,6 +122,18 @@ export class HttpExceptionFilter implements ExceptionFilter { path: request.url, }; + // Land the failure on the request's canonical log line too — the middleware + // only sees a status code, not what threw. No-op outside a request. + logCtx( + { + name: exception instanceof Error ? exception.name : "Error", + message, + status, + stack: status >= 500 ? (exception as Error)?.stack : undefined, + }, + { path: "error", mode: "set" }, + ); + if (status >= 500) { this.logger.error( `${request.method} ${request.url} -> ${status}`, diff --git a/packages/api-common/src/index.ts b/packages/api-common/src/index.ts index 8561f3721..d71f026da 100644 --- a/packages/api-common/src/index.ts +++ b/packages/api-common/src/index.ts @@ -6,6 +6,10 @@ export * from "./decorators/public.decorator"; // Filters export * from "./filters/http-exception.filter"; +// Logging +export * from "./logging/request-context"; +export * from "./logging/request-log.middleware"; + // Interceptors export * from "./interceptors/response-transform.interceptor"; diff --git a/packages/api-common/src/logging/request-context.ts b/packages/api-common/src/logging/request-context.ts new file mode 100644 index 000000000..0b41222ee --- /dev/null +++ b/packages/api-common/src/logging/request-context.ts @@ -0,0 +1,109 @@ +import { AsyncLocalStorage } from "node:async_hooks"; + +/** + * Per-request bag of data points that end up on the canonical request log line + * (see request-log.middleware.ts). Anything written here is flattened into one + * JSON object at the end of the request, so keep it to values that are safe to + * ship to a log aggregator: ids, states, counts, outcomes — never secrets, + * tokens, or raw uploads. + */ +export type RequestLogContext = Record; + +const storage = new AsyncLocalStorage(); + +export const getLogContext = (): RequestLogContext | undefined => + storage.getStore(); + +export const runWithLogContext = ( + seed: RequestLogContext, + fn: () => T, +): T => storage.run(seed, fn); + +export interface LogCtxOptions { + /** + * Dot path to write under, e.g. "booking.transition". Namespacing is just a + * path with one segment ("payment"). Root object when omitted. + */ + path?: string; + /** + * How the value lands: + * - `merge` (default) — shallow-merge objects into the target + * - `set` — overwrite the target + * - `push` — append to an array at the target + * - `count` — add the value (default 1) to a numeric counter at the target + */ + mode?: "merge" | "set" | "push" | "count"; +} + +/** Escape hatch when the four modes don't fit: mutate the context yourself. */ +export type LogCtxMutator = (ctx: RequestLogContext, value: unknown) => void; + +// ponytail: fixed cap so a loop calling logCtx in `push` mode can't grow an +// unbounded array in memory / a megabyte log line. Per-path caps if one ever +// legitimately needs more. +const MAX_PUSHED = 100; + +const isPlainObject = (v: unknown): v is Record => + typeof v === "object" && v !== null && !Array.isArray(v); + +/** + * Append a data point to the current request's canonical log line. + * + * No-op outside an HTTP request (bootstrap, cron, queue consumers) — callers + * never need to guard. + * + * logCtx({ bookingId, status }); // root merge + * logCtx(intentId, { path: "payment.intentId", mode: "set" }); + * logCtx({ from, to }, { path: "booking.transition" }); // namespaced + * logCtx({ wagonId }, { path: "wagons", mode: "push" }); // array + * logCtx(1, { path: "smsSent", mode: "count" }); // counter + * logCtx(err, (ctx, e) => { ctx.lastError = String(e); }); // custom + */ +export function logCtx( + value: unknown, + opts: LogCtxOptions | LogCtxMutator = {}, +): void { + const ctx = storage.getStore(); + if (!ctx) return; + + if (typeof opts === "function") { + opts(ctx, value); + return; + } + + const { path, mode = "merge" } = opts; + + if (!path) { + if (isPlainObject(value)) Object.assign(ctx, value); + return; + } + + const keys = path.split("."); + const leaf = keys.pop() as string; + let node: Record = ctx; + for (const key of keys) { + if (!isPlainObject(node[key])) node[key] = {}; + node = node[key] as Record; + } + + switch (mode) { + case "set": + node[leaf] = value; + break; + case "push": { + const arr = Array.isArray(node[leaf]) ? (node[leaf] as unknown[]) : []; + if (arr.length < MAX_PUSHED) arr.push(value); + node[leaf] = arr; + break; + } + case "count": + node[leaf] = + ((node[leaf] as number) ?? 0) + (typeof value === "number" ? value : 1); + break; + default: + node[leaf] = + isPlainObject(node[leaf]) && isPlainObject(value) + ? Object.assign(node[leaf] as Record, value) + : value; + } +} diff --git a/packages/api-common/src/logging/request-log.middleware.ts b/packages/api-common/src/logging/request-log.middleware.ts new file mode 100644 index 000000000..a8067bf02 --- /dev/null +++ b/packages/api-common/src/logging/request-log.middleware.ts @@ -0,0 +1,137 @@ +import { randomUUID } from "node:crypto"; +import { Injectable, Logger, NestMiddleware } from "@nestjs/common"; + +import { + RequestLogContext, + logCtx, + runWithLogContext, +} from "./request-context"; + +/** + * Structural request/response shapes — express types are not a dependency of + * this package (they arrive under @nestjs/platform-express in the apps). + */ +interface LoggedRequest { + method: string; + url: string; + originalUrl?: string; + baseUrl?: string; + route?: { path?: string }; + headers: Record; + ip?: string; + query?: Record; + user?: Record | null; +} + +interface LoggedResponse { + statusCode: number; + writableEnded?: boolean; + setHeader(name: string, value: string): void; + on(event: string, listener: () => void): void; +} + +const header = (req: LoggedRequest, name: string): string | undefined => { + const value = req.headers[name]; + return Array.isArray(value) ? value[0] : value; +}; + +const userId = (req: LoggedRequest): string | undefined => { + const user = req.user; + if (!user) return undefined; + const id = user.id ?? user.sub ?? user.userId; + return typeof id === "string" || typeof id === "number" + ? String(id) + : undefined; +}; + +/** + * Opens an AsyncLocalStorage context for the request (so anything downstream + * can `logCtx(...)` into it) and emits ONE canonical JSON line per request when + * the response ends — request metadata plus every data point collected during + * the flow, on the same Nest logger transport as the rest of the app. + * + * Base fields win over collected context on key collisions, so a stray + * `logCtx({ status })` can never corrupt the fields dashboards filter on. + * + * Apply FIRST in `configure()`: middleware registered before this one runs + * outside the context and its `logCtx` calls are silently dropped. + */ +@Injectable() +export class RequestLogMiddleware implements NestMiddleware { + private readonly logger = new Logger("HTTP"); + private readonly canonical = new Logger("request"); + + use(req: LoggedRequest, res: LoggedResponse, next: () => void): void { + const start = Date.now(); + const requestId = header(req, "x-request-id") ?? randomUUID(); + res.setHeader("x-request-id", requestId); + + // Held by reference, NOT read back through the ALS at emit time: response + // "finish"/"close" listeners are plain EventEmitter callbacks, which Node + // does not bind to the async context they were registered in — getStore() + // there returns whatever context happened to call res.end(). + const ctx: RequestLogContext = {}; + + runWithLogContext(ctx, () => { + logCtx({ requestId }); + + let emitted = false; + // "finish" covers normal responses; "close" catches client aborts, where + // "finish" never fires and the request would vanish from the logs. + const emit = () => { + if (emitted) return; + emitted = true; + + const url = req.originalUrl ?? req.url; + const status = res.statusCode; + const durationMs = Date.now() - start; + + this.logger.log(`${req.method} ${url} ${status} ${durationMs}ms`); + + const line = { + ...ctx, + type: "http_request", + requestId, + method: req.method, + route: req.route?.path + ? `${req.baseUrl ?? ""}${req.route.path}` + : undefined, + url, + status, + durationMs, + userId: userId(req), + ip: req.ip, + userAgent: header(req, "user-agent"), + query: + req.query && Object.keys(req.query).length ? req.query : undefined, + aborted: res.writableEnded === false ? true : undefined, + }; + // A circular value pushed into the context must not throw inside a + // response listener — that would take the process down, not the log. + let json: string; + try { + json = JSON.stringify(line); + } catch { + json = JSON.stringify({ + type: "http_request", + requestId, + method: req.method, + url, + status, + durationMs, + contextSerializationFailed: true, + }); + } + + if (status >= 500) this.canonical.error(json); + else if (status >= 400) this.canonical.warn(json); + else this.canonical.log(json); + }; + + res.on("finish", emit); + res.on("close", emit); + + next(); + }); + } +} diff --git a/packages/types/src/freight/etrade.ts b/packages/types/src/freight/etrade.ts index 6f33567e4..c23492413 100644 --- a/packages/types/src/freight/etrade.ts +++ b/packages/types/src/freight/etrade.ts @@ -55,7 +55,8 @@ export interface ETradeCompanyInfo { RenewedFrom: string; RenewedTo: string; BusinessLicensingGroupMain: string | null; - SubGroups: Array<{ Code: number; Description: string }> | null; + /** eTrade returns null entries in this array as well as a null array. */ + SubGroups: Array<{ Code: number; Description: string | null } | null> | null; }>; } From bdcdb4f047c5e12846aa25c6aa2063834d585eec Mon Sep 17 00:00:00 2001 From: Roba Boru Date: Wed, 12 Aug 2026 11:24:12 +0300 Subject: [PATCH 4/4] Added financial report --- .../src/modules/reports/reports.controller.ts | 31 +- .../src/modules/reports/reports.dto.ts | 29 + .../src/modules/reports/reports.service.ts | 184 +++++++ .../edr-passenger-web/backoffice/package.json | 2 + .../src/app/reports/finance/layout.tsx | 3 + .../src/app/reports/finance/page.tsx | 521 ++++++++++++++++++ .../src/components/layout/Sidebar.tsx | 1 + .../backoffice/src/components/ui/Skeleton.tsx | 10 + .../backoffice/src/lib/api/finance.ts | 65 +++ .../src/lib/export/finance-workbook.ts | 245 ++++++++ .../backoffice/src/styles/globals.css | 18 + pnpm-lock.yaml | 293 +++------- 12 files changed, 1170 insertions(+), 232 deletions(-) create mode 100644 apps/edr-passenger-web/backoffice/src/app/reports/finance/layout.tsx create mode 100644 apps/edr-passenger-web/backoffice/src/app/reports/finance/page.tsx create mode 100644 apps/edr-passenger-web/backoffice/src/components/ui/Skeleton.tsx create mode 100644 apps/edr-passenger-web/backoffice/src/lib/api/finance.ts create mode 100644 apps/edr-passenger-web/backoffice/src/lib/export/finance-workbook.ts diff --git a/apps/edr-passenger-api/src/modules/reports/reports.controller.ts b/apps/edr-passenger-api/src/modules/reports/reports.controller.ts index 1eea923fd..725ddbbfc 100644 --- a/apps/edr-passenger-api/src/modules/reports/reports.controller.ts +++ b/apps/edr-passenger-api/src/modules/reports/reports.controller.ts @@ -8,7 +8,7 @@ import { ApiProduces, } from "@nestjs/swagger"; import { ReportsService } from "./reports.service"; -import { BlockedSeatsRevenueLossQueryDto, GenerateReportDto } from "./reports.dto"; +import { BlockedSeatsRevenueLossQueryDto, FinanceSummaryQueryDto, GenerateReportDto } from "./reports.dto"; import { PassengerStaff } from "../../common/passenger-guards"; import { PASSENGER_PERMS } from "../../seed/passenger-permissions.registry"; @@ -83,6 +83,35 @@ export class ReportsController { return this.service.getPaymentDiscrepancyBySchedule(scheduleId, { search, seatClass, sort }); } + // ── Finance Summary ────────────────────────────────────────────────────── + + @Get("finance") + @ApiOperation({ + summary: "Finance summary — revenue by period, origin/destination segment, and payment method", + description: + "Revenue collected in the window (PaymentIntent.paidAt), grouped by day/week/month, origin → " + + "destination station pair, and payment method. Filter by originStationId and/or destinationStationId " + + "independently to query any station-pair segment (A→B, A→D, B→C), not just a whole predefined route. " + + "Returns per-bucket rows plus roll-ups by period, segment, and method for charting.", + }) + getFinanceSummary(@Query() query: FinanceSummaryQueryDto) { + return this.service.getFinanceSummary(query); + } + + @Get("finance/export") + @ApiOperation({ summary: "Finance summary as CSV — one row per period + route + payment method" }) + @ApiProduces("text/csv") + @ApiOkResponse({ description: "CSV export", schema: { type: "string" } }) + async exportFinanceSummary(@Query() query: FinanceSummaryQueryDto, @Res() res: Response): Promise { + const csv = await this.service.exportFinanceSummaryCsv(query); + res.setHeader("Content-Type", "text/csv; charset=utf-8"); + res.setHeader( + "Content-Disposition", + `attachment; filename="finance-summary-${new Date().toISOString().split("T")[0]}.csv"`, + ); + res.send(csv); + } + // ── Blocked Seat Revenue Loss ────────────────────────────────────────────── @Get("blocked-seats-revenue-loss") diff --git a/apps/edr-passenger-api/src/modules/reports/reports.dto.ts b/apps/edr-passenger-api/src/modules/reports/reports.dto.ts index 8b8049807..6c6b304d4 100644 --- a/apps/edr-passenger-api/src/modules/reports/reports.dto.ts +++ b/apps/edr-passenger-api/src/modules/reports/reports.dto.ts @@ -1,6 +1,7 @@ import { IsString, IsDateString, IsOptional, IsEnum, IsInt, Min, Max } from 'class-validator'; import { Type } from 'class-transformer'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { PaymentMethodType } from '@prisma/client'; import { SeatBlockReasonCategory } from '../seats/seats.dto'; export enum ReportType { @@ -103,3 +104,31 @@ export class BlockedSeatsRevenueLossQueryDto { }) @IsOptional() @IsEnum(BlockedSeatsLossSortBy) sortBy?: BlockedSeatsLossSortBy; } + +// ── Finance Summary ────────────────────────────────────────────────────────── + +export enum FinanceGranularity { + DAILY = 'daily', + WEEKLY = 'weekly', + MONTHLY = 'monthly', +} + +export class FinanceSummaryQueryDto { + @ApiProperty({ example: '2026-07-01', description: 'Start of the window, inclusive, matched on PaymentIntent.paidAt.' }) + @IsDateString() dateFrom: string; + + @ApiProperty({ example: '2026-07-31', description: 'End of the window, inclusive, matched on PaymentIntent.paidAt.' }) + @IsDateString() dateTo: string; + + @ApiPropertyOptional({ enum: FinanceGranularity, default: FinanceGranularity.DAILY }) + @IsOptional() @IsEnum(FinanceGranularity) granularity?: FinanceGranularity; + + @ApiPropertyOptional({ description: 'Restrict to bookings departing from this station.' }) + @IsOptional() @IsString() originStationId?: string; + + @ApiPropertyOptional({ description: 'Restrict to bookings arriving at this station.' }) + @IsOptional() @IsString() destinationStationId?: string; + + @ApiPropertyOptional({ enum: PaymentMethodType, description: 'Restrict to payments made with this method.' }) + @IsOptional() @IsEnum(PaymentMethodType) method?: PaymentMethodType; +} diff --git a/apps/edr-passenger-api/src/modules/reports/reports.service.ts b/apps/edr-passenger-api/src/modules/reports/reports.service.ts index e899fdb4b..571df697e 100644 --- a/apps/edr-passenger-api/src/modules/reports/reports.service.ts +++ b/apps/edr-passenger-api/src/modules/reports/reports.service.ts @@ -10,6 +10,8 @@ import { FareEngineService } from "../fare-engine/fare-engine.service"; import { BlockedSeatsLossSortBy, BlockedSeatsRevenueLossQueryDto, + FinanceGranularity, + FinanceSummaryQueryDto, GenerateReportDto, ReportType, } from "./reports.dto"; @@ -84,6 +86,33 @@ function toCsvCell(value: string | number): string { return `"${String(value).replace(/"/g, '""')}"`; } +/** + * Buckets a paid-at timestamp into the requested reporting period, keyed so buckets sort + * chronologically as plain strings. Weekly buckets are labelled by their Monday (UTC). + */ +function periodKeyFor(date: Date, granularity: FinanceGranularity): string { + if (granularity === FinanceGranularity.MONTHLY) { + return date.toISOString().slice(0, 7); + } + if (granularity === FinanceGranularity.WEEKLY) { + const d = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())); + const isoDay = d.getUTCDay() || 7; // Monday=1 .. Sunday=7 + d.setUTCDate(d.getUTCDate() - (isoDay - 1)); + return d.toISOString().split("T")[0]; + } + return date.toISOString().split("T")[0]; +} + +export interface FinanceBucket { + period: string; + originStationId: string; + destinationStationId: string; + segmentLabel: string; + method: string; + bookingCount: number; + revenueEtbMinor: number; +} + @Injectable() export class ReportsService { private readonly logger = new Logger(ReportsService.name); @@ -1051,6 +1080,161 @@ export class ReportsService { return { totalActualEtbMinor, totalPaidEtbMinor, byMethod, rows }; } + // ── Finance Summary ──────────────────────────────────────────────────────── + + /** + * Revenue collected in the window, grouped by reporting period (day/week/month), origin → + * destination station pair, and payment method — the shape finance reconciles against + * provider settlement statements. + * + * Grouped by the booking's own origin/destination, not the parent Route — a route like + * "Sebeta - Dire Dawa" has intermediate stops, and a passenger may have booked any + * sub-segment of it (e.g. Lebu → Adama). Filtering by station lets finance ask about any + * A→B pair, not just whole routes. + * + * Bucketed on `PaymentIntent.paidAt` (cash actually received), not `Booking.createdAt`, + * so a booking made in one period but paid in another lands in the period it was paid. + */ + async getFinanceSummary(query: FinanceSummaryQueryDto) { + const dateFrom = new Date(query.dateFrom + "T00:00:00.000Z"); + const dateTo = new Date(query.dateTo + "T23:59:59.999Z"); + const granularity = query.granularity ?? FinanceGranularity.DAILY; + + const rateRows = await this.prisma.currencyExchangeRate.findMany({ + where: { toCurrency: "ETB" as any }, + orderBy: { effectiveDate: "desc" }, + }); + const rateToEtb = new Map(); + for (const r of rateRows) { + if (!rateToEtb.has(r.fromCurrency)) rateToEtb.set(r.fromCurrency, Number(r.rate)); + } + const toEtbMinor = (minor: number, currency: string): number => { + if (currency === "ETB") return minor; + const rate = rateToEtb.get(currency); + return rate ? Math.round(minor * rate) : minor; + }; + + const bookings = await this.prisma.booking.findMany({ + where: { + paymentIntent: { + paidAt: { gte: dateFrom, lte: dateTo }, + ...(query.method ? { method: query.method } : {}), + }, + ...(query.originStationId ? { originStationId: query.originStationId } : {}), + ...(query.destinationStationId ? { destinationStationId: query.destinationStationId } : {}), + }, + select: { + totalMinor: true, + currency: true, + originStationId: true, + destinationStationId: true, + schedule: { select: { originStationId: true, destinationStationId: true } }, + paymentIntent: { select: { paidAt: true, method: true } }, + }, + }); + + // Booking.originStationId/destinationStationId are set on every create path (guest and + // authenticated booking both pass them from the DTO); the schedule's own endpoints are + // only a fallback for the rare legacy row that predates those columns. + const stationIds = new Set(); + for (const b of bookings) { + const origin = b.originStationId ?? b.schedule.originStationId; + const destination = b.destinationStationId ?? b.schedule.destinationStationId; + if (origin) stationIds.add(origin); + if (destination) stationIds.add(destination); + } + const stations = stationIds.size > 0 + ? await this.prisma.station.findMany({ where: { id: { in: [...stationIds] } }, select: { id: true, name: true } }) + : []; + const stationName = new Map(stations.map((s) => [s.id, s.name])); + + const buckets = new Map(); + const bucketFor = ( + period: string, + originStationId: string, + destinationStationId: string, + segmentLabel: string, + method: string, + ): FinanceBucket => { + const key = `${period}|${originStationId}|${destinationStationId}|${method}`; + let bucket = buckets.get(key); + if (!bucket) { + bucket = { period, originStationId, destinationStationId, segmentLabel, method, bookingCount: 0, revenueEtbMinor: 0 }; + buckets.set(key, bucket); + } + return bucket; + }; + + for (const b of bookings) { + const pi = b.paymentIntent!; + const period = periodKeyFor(pi.paidAt!, granularity); + const originStationId = b.originStationId ?? b.schedule.originStationId ?? "UNKNOWN"; + const destinationStationId = b.destinationStationId ?? b.schedule.destinationStationId ?? "UNKNOWN"; + const segmentLabel = `${stationName.get(originStationId) ?? "Unknown"} → ${stationName.get(destinationStationId) ?? "Unknown"}`; + const bucket = bucketFor(period, originStationId, destinationStationId, segmentLabel, pi.method); + bucket.bookingCount += 1; + bucket.revenueEtbMinor += toEtbMinor(b.totalMinor, b.currency); + } + + const rows = [...buckets.values()].sort((a, b) => + a.period === b.period + ? a.segmentLabel.localeCompare(b.segmentLabel) || a.method.localeCompare(b.method) + : a.period.localeCompare(b.period), + ); + + const totals = rows.reduce( + (acc, r) => { + acc.bookingCount += r.bookingCount; + acc.revenueEtbMinor += r.revenueEtbMinor; + return acc; + }, + { bookingCount: 0, revenueEtbMinor: 0 }, + ); + + const rollUp = (keyOf: (r: FinanceBucket) => string, labelOf: (r: FinanceBucket) => string) => { + const map = new Map(); + for (const r of rows) { + const key = keyOf(r); + let entry = map.get(key); + if (!entry) { + entry = { key, label: labelOf(r), revenueEtbMinor: 0, bookingCount: 0 }; + map.set(key, entry); + } + entry.revenueEtbMinor += r.revenueEtbMinor; + entry.bookingCount += r.bookingCount; + } + return [...map.values()].sort((a, b) => b.revenueEtbMinor - a.revenueEtbMinor); + }; + + return { + granularity, + dateFrom: query.dateFrom, + dateTo: query.dateTo, + currency: "ETB", + totals, + byPeriod: rollUp((r) => r.period, (r) => r.period), + bySegment: rollUp((r) => `${r.originStationId}|${r.destinationStationId}`, (r) => r.segmentLabel), + byMethod: rollUp((r) => r.method, (r) => r.method), + rows, + }; + } + + /** CSV of the finance summary, one row per period + origin/destination segment + payment method. */ + async exportFinanceSummaryCsv(query: FinanceSummaryQueryDto): Promise { + const report = await this.getFinanceSummary(query); + + const headers = ["Period", "Origin → Destination", "Payment Method", "Bookings", "Revenue (ETB)"]; + const rows = report.rows.map((r) => [ + r.period, + r.segmentLabel, + r.method, + r.bookingCount, + (r.revenueEtbMinor / 100).toFixed(2), + ]); + + return [headers, ...rows].map((row) => row.map(toCsvCell).join(",")).join("\n"); + } + async getPaymentDiscrepancyBySchedule(scheduleId: string, params: { search?: string; seatClass?: string; diff --git a/apps/edr-passenger-web/backoffice/package.json b/apps/edr-passenger-web/backoffice/package.json index 9d4327a42..737baeda1 100644 --- a/apps/edr-passenger-web/backoffice/package.json +++ b/apps/edr-passenger-web/backoffice/package.json @@ -16,6 +16,8 @@ "axios": "^1.7.7", "clsx": "^2.1.1", "date-fns": "^3.0.0", + "exceljs": "^4.4.0", + "html-to-image": "^1.11.11", "lucide-react": "^0.446.0", "next": "^14.2.0", "react": "^18.3.1", diff --git a/apps/edr-passenger-web/backoffice/src/app/reports/finance/layout.tsx b/apps/edr-passenger-web/backoffice/src/app/reports/finance/layout.tsx new file mode 100644 index 000000000..790272de1 --- /dev/null +++ b/apps/edr-passenger-web/backoffice/src/app/reports/finance/layout.tsx @@ -0,0 +1,3 @@ +export default function Layout({ children }: { children: React.ReactNode }) { + return <>{children}; +} diff --git a/apps/edr-passenger-web/backoffice/src/app/reports/finance/page.tsx b/apps/edr-passenger-web/backoffice/src/app/reports/finance/page.tsx new file mode 100644 index 000000000..8e3e2a23b --- /dev/null +++ b/apps/edr-passenger-web/backoffice/src/app/reports/finance/page.tsx @@ -0,0 +1,521 @@ +'use client'; + +import { useMemo, useRef, useState } from 'react'; +import { useQuery } from '@tanstack/react-query'; +import { Banknote, BookOpen, FileSpreadsheet, Receipt } from 'lucide-react'; +import { + Bar, BarChart, CartesianGrid, Line, LineChart, + ResponsiveContainer, Tooltip as RechartsTooltip, XAxis, YAxis, +} from 'recharts'; +import { toPng } from 'html-to-image'; +import { apiClient } from '@/lib/api-client'; +import { financeApi, type FinanceGranularity, type FinanceSummaryFilters } from '@/lib/api/finance'; +import { buildFinanceWorkbook, type ChartImage } from '@/lib/export/finance-workbook'; +import ActionButton from '@/components/ui/ActionButton'; +import Pagination from '@/components/ui/Pagination'; +import Skeleton from '@/components/ui/Skeleton'; +import { usePagination } from '@/lib/use-pagination'; +import { formatCurrency } from '@/lib/utils'; +import { categoricalColor, getChartPalette } from '@/lib/chart-palette'; +import { useTheme } from '@/lib/theme-store'; + +interface StationOption { + id: string; + name: string; + code: string; +} + +// Fixed order so a method keeps its colour/slot when the method filter narrows the set. +const PAYMENT_METHOD_ORDER = ['TELEBIRR', 'CBE_BIRR', 'EBIRR', 'WAAFI', 'CARD', 'WALLET', 'DMONEY', 'CAC_BANK', 'CBE_BILL'] as const; +const PAYMENT_METHOD_LABELS: Record = { + TELEBIRR: 'Telebirr', + CBE_BIRR: 'CBE Birr', + EBIRR: 'eBirr', + WAAFI: 'Waafi', + CARD: 'Card', + WALLET: 'Wallet', + DMONEY: 'DMoney', + CAC_BANK: 'CAC Bank', + CBE_BILL: 'CBE Bill', +}; +function methodLabel(method: string): string { + return PAYMENT_METHOD_LABELS[method] ?? method; +} + +function periodLabel(period: string, granularity: FinanceGranularity): string { + if (granularity === 'monthly') { + return new Date(`${period}-01T00:00:00`).toLocaleDateString('en-US', { month: 'short', year: 'numeric' }); + } + return new Date(`${period}T00:00:00`).toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); +} + +const TABLE_PAGE_SIZE = 25; + +/** Mirrors the loaded layout's shape (KPI tiles, two charts, method breakdown, detail table) so nothing jumps when data arrives. */ +function FinanceReportSkeleton() { + return ( +
+
+ {Array.from({ length: 3 }).map((_, i) => ( +
+
+ + +
+ +
+ ))} +
+ +
+ {Array.from({ length: 2 }).map((_, i) => ( +
+ + +
+ ))} +
+ +
+ + + +
+ {Array.from({ length: 4 }).map((_, i) => ( + + ))} +
+
+ +
+
+ +
+
+ {Array.from({ length: 8 }).map((_, i) => ( + + ))} +
+
+
+ ); +} + +export default function FinanceReportPage() { + const isDark = useTheme((s) => s.isDark); + const palette = getChartPalette(isDark); + + const [dateRangePreset, setDateRangePreset] = useState('90'); + const [customFrom, setCustomFrom] = useState(''); + const [customTo, setCustomTo] = useState(''); + const [granularity, setGranularity] = useState('daily'); + const [originStationId, setOriginStationId] = useState(''); + const [destinationStationId, setDestinationStationId] = useState(''); + const [method, setMethod] = useState(''); + const [exporting, setExporting] = useState(false); + + const trendCardRef = useRef(null); + const segmentCardRef = useRef(null); + const methodCardRef = useRef(null); + + const { dateFrom, dateTo } = useMemo(() => { + const end = new Date(); + end.setHours(23, 59, 59, 999); + + if (dateRangePreset === 'custom') { + if (customFrom && customTo) { + return customFrom <= customTo + ? { dateFrom: customFrom, dateTo: customTo } + : { dateFrom: customTo, dateTo: customFrom }; + } + const fallbackStart = new Date(end); + fallbackStart.setDate(end.getDate() - 90); + return { + dateFrom: fallbackStart.toISOString().split('T')[0], + dateTo: end.toISOString().split('T')[0], + }; + } + + const start = new Date(end); + start.setDate(end.getDate() - Number(dateRangePreset)); + return { + dateFrom: start.toISOString().split('T')[0], + dateTo: end.toISOString().split('T')[0], + }; + }, [dateRangePreset, customFrom, customTo]); + + const filters: FinanceSummaryFilters = useMemo( + () => ({ + dateFrom, + dateTo, + granularity, + originStationId: originStationId || undefined, + destinationStationId: destinationStationId || undefined, + method: method || undefined, + }), + [dateFrom, dateTo, granularity, originStationId, destinationStationId, method], + ); + + const { data: stations = [] } = useQuery({ + queryKey: ['stations'], + queryFn: () => apiClient.get('/stations'), + }); + + const { data, isLoading, isFetching, isError } = useQuery({ + queryKey: ['reports-finance', filters], + placeholderData: (previous) => previous, + queryFn: () => financeApi.getSummary(filters), + }); + + const rows = data?.rows ?? []; + const pg = usePagination(rows, TABLE_PAGE_SIZE); + + const resetFilters = () => { + setDateRangePreset('90'); + setCustomFrom(''); + setCustomTo(''); + setGranularity('daily'); + setOriginStationId(''); + setDestinationStationId(''); + setMethod(''); + }; + + /** Captures a chart card as a PNG data URL, sized to the card's actual on-screen pixels. */ + const captureCard = async (node: HTMLDivElement | null): Promise => { + if (!node) return undefined; + const rect = node.getBoundingClientRect(); + const dataUrl = await toPng(node, { pixelRatio: 2, cacheBust: true, backgroundColor: palette.surface }); + return { dataUrl, width: Math.round(rect.width), height: Math.round(rect.height) }; + }; + + const doExport = async () => { + if (!data) return; + setExporting(true); + try { + const [trend, segment, method_] = await Promise.all([ + captureCard(trendCardRef.current), + captureCard(segmentCardRef.current), + captureCard(methodCardRef.current), + ]); + + const stationLabel = (id: string) => stations.find((s) => s.id === id)?.name ?? 'Any'; + + const blob = await buildFinanceWorkbook({ + report: data, + filters: { + dateFrom, + dateTo, + granularity, + originLabel: originStationId ? stationLabel(originStationId) : 'Any', + destinationLabel: destinationStationId ? stationLabel(destinationStationId) : 'Any', + methodLabel: method ? methodLabel(method) : 'All', + }, + methodLabel, + periodLabel, + images: { trend, segment, method: method_ }, + }); + + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `finance-summary-${dateFrom}-to-${dateTo}.xlsx`; + a.click(); + URL.revokeObjectURL(url); + } finally { + setExporting(false); + } + }; + + const trendData = useMemo( + () => + (data?.byPeriod ?? []) + .slice() + .sort((a, b) => a.key.localeCompare(b.key)) + .map((p) => ({ + label: periodLabel(p.key, data!.granularity), + revenue: p.revenueEtbMinor / 100, + })), + [data], + ); + + const segmentData = useMemo( + () => + (data?.bySegment ?? []) + .slice() + .sort((a, b) => b.revenueEtbMinor - a.revenueEtbMinor) + .map((r) => ({ label: r.label, revenue: r.revenueEtbMinor })), + [data], + ); + + const methodBreakdown = useMemo(() => { + const rowsByMethod = data?.byMethod ?? []; + const total = rowsByMethod.reduce((sum, r) => sum + r.revenueEtbMinor, 0); + return rowsByMethod + .slice() + .sort((a, b) => PAYMENT_METHOD_ORDER.indexOf(a.key as any) - PAYMENT_METHOD_ORDER.indexOf(b.key as any)) + .map((r) => ({ + ...r, + color: categoricalColor(palette, PAYMENT_METHOD_ORDER.indexOf(r.key as any)), + sharePercent: total > 0 ? (r.revenueEtbMinor / total) * 100 : 0, + })); + }, [data, palette]); + + const totals = data?.totals; + const hasData = (totals?.bookingCount ?? 0) > 0; + const avgPerBookingMinor = hasData ? Math.round(totals!.revenueEtbMinor / totals!.bookingCount) : 0; + + return ( +
+
+
+

Finance Summary

+

+ Revenue collected by period, origin/destination, and payment method — for daily, weekly, or monthly finance reporting. +

+
+ + Export + +
+ + {/* Filters */} +
+
+
+ + +
+ {dateRangePreset === 'custom' && ( + <> +
+ + setCustomFrom(e.target.value)} /> +
+
+ + setCustomTo(e.target.value)} /> +
+ + )} +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + {isFetching && Refreshing…} +
+ {isError &&

Failed to load the finance summary. Check the filters and try again.

} +
+ + {isLoading && !data ? ( + + ) : !hasData ? ( +
+ +

No paid bookings in this window.

+

Widen the date range, or clear the origin/destination/method filters.

+
+ ) : ( +
+ {/* KPI tiles */} +
+
+
+

Revenue

+
+ +
+
+

+ {formatCurrency(totals!.revenueEtbMinor, 'ETB')} +

+
+
+
+

Bookings

+
+ +
+
+

{totals!.bookingCount.toLocaleString()}

+
+
+
+

Avg. per Booking

+
+ +
+
+

{formatCurrency(avgPerBookingMinor, 'ETB')}

+
+
+ + {/* Trend + route charts */} +
+
+

+ Revenue Trend (ETB, {granularity}) +

+ {trendData.length > 0 ? ( + + + + + + `ETB ${Math.round(value).toLocaleString()}`} /> + + + + ) : ( +
No data for selected range
+ )} +
+ +
+

Revenue by Segment

+ {segmentData.length > 0 ? ( + + + + + + `ETB ${Math.round(value).toLocaleString()}`} /> + + + + ) : ( +
No data for selected range
+ )} +
+
+ + {/* Payment method breakdown — part-to-whole stacked bar + legend table */} +
+

Revenue by Payment Method

+

Share of revenue, in ETB

+
`${methodLabel(m.key)} ${m.sharePercent.toFixed(0)}%`) + .join(', ')}`} + > + {methodBreakdown.map((m, i) => ( +
+ ))} +
+ + + + + + + + + + + {methodBreakdown.map((m) => ( + + + + + + + ))} + +
MethodBookingsShareRevenue
+ + + {m.bookingCount.toLocaleString()}{m.sharePercent.toFixed(1)}%{formatCurrency(m.revenueEtbMinor, 'ETB')}
+
+ + {/* Detail table */} +
+
+

+ Period × Segment × Method detail +

+
+
+ + + + {['Period', 'Segment', 'Method', 'Bookings', 'Revenue'].map((h) => ( + + ))} + + + + {pg.paged.map((r, i) => ( + + + + + + + + ))} + {pg.paged.length === 0 && ( + + + + )} + +
+ {h} +
{periodLabel(r.period, granularity)}{r.segmentLabel}{methodLabel(r.method)}{r.bookingCount.toLocaleString()}{formatCurrency(r.revenueEtbMinor, 'ETB')}
No rows on this page
+
+ +
+
+ )} +
+ ); +} diff --git a/apps/edr-passenger-web/backoffice/src/components/layout/Sidebar.tsx b/apps/edr-passenger-web/backoffice/src/components/layout/Sidebar.tsx index 616488917..58a773b2f 100644 --- a/apps/edr-passenger-web/backoffice/src/components/layout/Sidebar.tsx +++ b/apps/edr-passenger-web/backoffice/src/components/layout/Sidebar.tsx @@ -123,6 +123,7 @@ const navigationSections: { title: string; items: NavItem[] }[] = [ title: 'Analytics & Reports', items: [ { name: 'Overall', href: '/reports/overall', icon: BarChart3, permission: PERMS.reports.view }, + { name: 'Finance', href: '/reports/finance', icon: DollarSign, permission: PERMS.reports.view }, { name: 'Seats', href: '/reports/seats', icon: Armchair, permission: PERMS.reports.view }, { name: 'Blocked Seats', href: '/reports/blocked-seats', icon: Ban, permission: PERMS.reports.view }, { name: 'Passengers', href: '/reports/passengers', icon: Users, permission: PERMS.reports.view }, diff --git a/apps/edr-passenger-web/backoffice/src/components/ui/Skeleton.tsx b/apps/edr-passenger-web/backoffice/src/components/ui/Skeleton.tsx new file mode 100644 index 000000000..e6f24fb02 --- /dev/null +++ b/apps/edr-passenger-web/backoffice/src/components/ui/Skeleton.tsx @@ -0,0 +1,10 @@ +import { cn } from '@/lib/utils'; + +interface SkeletonProps { + className?: string; +} + +/** A shimmering placeholder block. Give it the size/shape of the content it stands in for. */ +export default function Skeleton({ className }: SkeletonProps) { + return