From 187563b32ba83da6361ef64255af7b99a3284be2 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Mon, 3 Mar 2025 11:29:32 -0500 Subject: [PATCH 1/5] update layout of evidence --- .../evidence/Components/EvidenceList.tsx | 8 +- .../[id]/Components/EvidenceDetails.tsx | 151 +- .../[id]/Components/ReviewSection.tsx | 91 +- .../(dashboard)/evidence/[id]/edit/page.tsx | 66 + .../(dashboard)/evidence/[id]/layout.tsx | 39 + .../evidence/{ => list}/layout.tsx | 3 +- .../overview/components/AssigneeBarChart.tsx | 77 +- .../components/DepartmentBarChart.tsx | 79 +- .../overview/components/EvidenceOverview.tsx | 65 +- .../overview/components/FrameworkBarChart.tsx | 82 +- .../components/HorizontalBarChart.tsx | 46 +- .../(dashboard)/evidence/overview/layout.tsx | 26 + apps/app/src/locales/en.ts | 35 +- apps/app/src/middleware.ts | 4 +- bun.lockb | Bin 736704 -> 741136 bytes yarn.lock | 1936 +++++++++-------- 16 files changed, 1507 insertions(+), 1201 deletions(-) create mode 100644 apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx create mode 100644 apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/layout.tsx rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{ => list}/layout.tsx (85%) create mode 100644 apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceList.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceList.tsx index 47e1182eea..bf7707ab42 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceList.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceList.tsx @@ -1,15 +1,15 @@ "use client"; -import { DataTable } from "./data-table/EvidenceListTable"; import { useI18n } from "@/locales/client"; -import { SkeletonTable } from "./SkeletonTable"; +import { useEvidenceTable } from "../hooks/useEvidenceTableContext"; +import { DataTable } from "./data-table/EvidenceListTable"; import { - FilterDropdown, ActiveFilterBadges, + FilterDropdown, PaginationControls, SearchInput, } from "./EvidenceFilters"; -import { useEvidenceTable } from "../hooks/useEvidenceTableContext"; +import { SkeletonTable } from "./SkeletonTable"; import { EvidenceSummaryCards } from "./EvidenceSummaryCards"; export function EvidenceList() { diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx index 7d03350b8c..11604853bd 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx @@ -1,65 +1,25 @@ "use client"; +import { Alert, AlertDescription, AlertTitle } from "@bubba/ui/alert"; import { Button } from "@bubba/ui/button"; -import { Card, CardContent, CardHeader } from "@bubba/ui/card"; import { Skeleton } from "@bubba/ui/skeleton"; -import { ArrowLeft, CheckCircle2, XCircle } from "lucide-react"; +import { CheckCircle2, FileIcon, XCircle } from "lucide-react"; import { useAction } from "next-safe-action/hooks"; -import { useRouter } from "next/navigation"; -import { useEffect } from "react"; import { toast } from "sonner"; import { publishEvidence } from "../Actions/publishEvidence"; import { useOrganizationEvidence } from "../hooks/useOrganizationEvidence"; import type { EvidenceDetailsProps } from "../types"; -import { FileSection } from "./FileSection"; import { ReviewSection } from "./ReviewSection"; -import { UrlSection } from "./UrlSection"; export function EvidenceDetails({ id }: EvidenceDetailsProps) { - const router = useRouter(); const { data, isLoading, error, mutate } = useOrganizationEvidence({ id }); - const { execute: publishAction, isExecuting } = useAction(publishEvidence, { - onSuccess: () => { - toast.success("Evidence published successfully"); - handleMutate(); - }, - onError: () => { - toast.error("Failed to publish evidence, please try again."); - }, - }); - - useEffect(() => { - if (error) { - router.push("/evidence"); - } - }, [error, router]); - - const handleMutate = async () => { - await mutate(); - }; - if (isLoading) { return ( -
-
-
- - -
- -
- - - - - - - - - +
+ + +
); } @@ -68,50 +28,44 @@ export function EvidenceDetails({ id }: EvidenceDetailsProps) { const evidence = data.data; + const handleMutate = async () => { + await mutate(); + }; + return ( -
-
-
- -

{evidence.name}

-
-
-
- {evidence.published ? ( - <> - - Published - - ) : ( - <> - - Draft - - )} +
+ {/* Alert with evidence info and status */} + + + +
+ {evidence.evidence.name} Evidence +
+ {evidence.published ? ( +
+ + Published +
+ ) : ( +
+ + Draft +
+ )} +
- {!evidence.published && ( - - )} -
-
+ + + {evidence.description || "No description provided."} - {evidence.isNotRelevant && ( -
- This evidence has been marked as not relevant and will not be included - in compliance reports. -
- )} + {evidence.isNotRelevant && ( +
+ This evidence has been marked as not relevant and will not be + included in compliance reports. +
+ )} +
+ - - - -
{evidence.evidence.name}
-
- - {evidence.description && ( -

{evidence.description}

- )} - - - - -
-
); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx index ea4d524d70..3c5d50d852 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx @@ -1,24 +1,19 @@ "use client"; -import type { OrganizationEvidence, Frequency } from "@bubba/db"; -import { - Card, - CardHeader, - CardTitle, - CardContent, - CardDescription, -} from "@bubba/ui/card"; -import { CalendarClock, Pencil, RefreshCw, Building, User } from "lucide-react"; import { calculateNextReview } from "@/lib/utils/calculate-next-review"; -import { format } from "date-fns"; -import { FrequencySection } from "./FrequencySection"; -import { DepartmentSection } from "./DepartmentSection"; -import { AssigneeSection } from "./AssigneeSection"; +import type { Frequency, OrganizationEvidence } from "@bubba/db"; import { Button } from "@bubba/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@bubba/ui/card"; +import { format } from "date-fns"; +import { Building, CalendarClock, RefreshCw, User } from "lucide-react"; import { useAction } from "next-safe-action/hooks"; -import { toggleRelevance } from "../Actions/toggleRelevance"; import { toast } from "sonner"; +import { publishEvidence } from "../Actions/publishEvidence"; +import { toggleRelevance } from "../Actions/toggleRelevance"; import { useOrganizationEvidence } from "../hooks/useOrganizationEvidence"; +import { AssigneeSection } from "./AssigneeSection"; +import { DepartmentSection } from "./DepartmentSection"; +import { FrequencySection } from "./FrequencySection"; interface ReviewSectionProps { evidence: OrganizationEvidence; @@ -55,11 +50,27 @@ export function ReviewSection({ }, }); + const { execute: publishAction, isExecuting } = useAction(publishEvidence, { + onSuccess: () => { + toast.success("Evidence published successfully"); + mutate(); + }, + onError: () => { + toast.error("Failed to publish evidence, please try again."); + }, + }); + return ( - - - Evidence Details + + +
+

Evidence Overview

+

+ Manage review frequency, department assignment, and track upcoming + review dates +

+
+ )}
); diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx new file mode 100644 index 0000000000..d4a7563f3c --- /dev/null +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx @@ -0,0 +1,66 @@ +"use client"; + +import { useI18n } from "@/locales/client"; +import { Card, CardContent, CardHeader, CardTitle } from "@bubba/ui/card"; +import { Skeleton } from "@bubba/ui/skeleton"; +import { useParams, useRouter } from "next/navigation"; +import { FileSection } from "../Components/FileSection"; +import { UrlSection } from "../Components/UrlSection"; +import { useOrganizationEvidence } from "../hooks/useOrganizationEvidence"; + +export default function EditEvidencePage() { + const t = useI18n(); + const { id } = useParams<{ id: string }>(); + const { data, isLoading, error, mutate } = useOrganizationEvidence({ id }); + + if (isLoading) { + return ; + } + + if (error) { + return
Error
; + } + + const handleMutate = async () => { + await mutate(); + }; + + if (isLoading) { + return ( +
+ + + +
+ ); + } + + if (!data?.data) return null; + + const evidence = data.data; + + return ( + + + +
+ {t("evidence.details.content")} +
+
+
+ + + + + +
+ ); +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/layout.tsx new file mode 100644 index 0000000000..1e0bf26c89 --- /dev/null +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/layout.tsx @@ -0,0 +1,39 @@ +import { getI18n } from "@/locales/server"; +import { SecondaryMenu } from "@bubba/ui/secondary-menu"; +import { headers } from "next/headers"; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const t = await getI18n(); + const headersList = await headers(); + const pathname = headersList.get("x-pathname") || ""; + const isEvidenceDetails = /\/evidence\/[a-z0-9]+/.test(pathname); + const pathParts = pathname.split("/"); + const evidenceIndex = pathParts.findIndex((part) => part === "evidence"); + const id = + evidenceIndex >= 0 && pathParts.length > evidenceIndex + 1 + ? pathParts[evidenceIndex + 1] + : ""; + + return ( +
+ + +
{children}
+
+ ); +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/layout.tsx similarity index 85% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/layout.tsx index 6a6f897fa5..063655d889 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/layout.tsx @@ -6,7 +6,6 @@ export default async function Layout({ }: { children: React.ReactNode; }) { - // TODO: Implement i18n, build was failing. const t = await getI18n(); return ( @@ -15,7 +14,7 @@ export default async function Layout({ items={[ { path: "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/evidence/overview", - label: t("evidence.dashboard"), + label: t("evidence.dashboard.layout"), }, { path: "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/evidence/list", label: t("evidence.list") }, ]} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AssigneeBarChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AssigneeBarChart.tsx index e40c598348..ba710270cc 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AssigneeBarChart.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AssigneeBarChart.tsx @@ -4,18 +4,19 @@ import React, { useEffect, useRef, useState } from "react"; import { HorizontalBarChart, type ChartDataItem } from "./HorizontalBarChart"; import type { EvidenceWithStatus } from "../actions/getEvidenceDashboard"; import { ChevronDown, ChevronUp } from "lucide-react"; +import { useI18n } from "@/locales/client"; interface AssigneeBarChartProps { byAssignee?: Record; unassigned?: EvidenceWithStatus[]; } -// Status colors matching the EvidenceSummaryCards +// Status colors using CSS variables to match policies-by-assignee.tsx const STATUS_COLORS = { - empty: "#6b7280", // Gray for empty - draft: "#f59e0b", // Amber for draft - needsReview: "#ef4444", // Red for needs review - upToDate: "#10b981", // Green for up to date + upToDate: "bg-primary", + draft: "bg-[var(--chart-open)]", + needsReview: "bg-[hsl(var(--destructive))]", + empty: "bg-[var(--chart-pending)]", }; // Status priority order for display (determines the order in the bar) @@ -26,6 +27,7 @@ export function AssigneeBarChart({ byAssignee, unassigned = [], }: AssigneeBarChartProps) { + const t = useI18n(); const containerRef = useRef(null); const [canScrollDown, setCanScrollDown] = useState(false); const [canScrollUp, setCanScrollUp] = useState(false); @@ -74,7 +76,7 @@ export function AssigneeBarChart({ if (firstAssignee && firstAssignee.length > 0) { console.log( "First assignee's first item status:", - firstAssignee[0].status, + firstAssignee[0].status ); } } @@ -110,7 +112,7 @@ export function AssigneeBarChart({ items, statusCounts, }; - }, + } ); // Add unassigned items if any @@ -156,14 +158,9 @@ export function AssigneeBarChart({ if (assignee.statusCounts[status] > 0) { chartData.push({ key: status, - label: - status === "upToDate" - ? "Up to Date" - : status === "needsReview" - ? "Needs Review" - : status.charAt(0).toUpperCase() + status.slice(1), + label: getStatusLabel(status, t), value: assignee.statusCounts[status], - color: STATUS_COLORS[status], + color: getStatusColor(status), }); } } @@ -173,7 +170,7 @@ export function AssigneeBarChart({

{assignee.name}

- {assignee.totalItems} items + {assignee.totalItems} {t("evidence.items")}
@@ -184,6 +181,24 @@ export function AssigneeBarChart({ valueFormatter={(value) => `${value}`} height={12} /> + + {/* Legend - similar to policies-by-assignee.tsx */} +
+ {STATUS_PRIORITY.map((status) => { + if (assignee.statusCounts[status] > 0) { + return ( +
+
+ + {getStatusLabel(status, t)} ( + {assignee.statusCounts[status]}) + +
+ ); + } + return null; + })} +
); })} @@ -206,3 +221,35 @@ export function AssigneeBarChart({
); } + +// Helper function to get status label +function getStatusLabel(status: StatusType, t: any): string { + switch (status) { + case "upToDate": + return t("evidence.status.up_to_date"); + case "needsReview": + return t("evidence.status.needs_review"); + case "draft": + return t("evidence.status.draft"); + case "empty": + return t("evidence.status.empty"); + default: + return status; + } +} + +// Helper function to get status color +function getStatusColor(status: StatusType): string { + switch (status) { + case "upToDate": + return "#10b981"; // Green + case "draft": + return "#f59e0b"; // Amber + case "needsReview": + return "#ef4444"; // Red + case "empty": + return "#6b7280"; // Gray + default: + return "#6b7280"; // Default gray + } +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/DepartmentBarChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/DepartmentBarChart.tsx index 2ef003e84a..0cf07a9742 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/DepartmentBarChart.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/DepartmentBarChart.tsx @@ -5,17 +5,18 @@ import { HorizontalBarChart, type ChartDataItem } from "./HorizontalBarChart"; import type { Departments } from "@prisma/client"; import type { EvidenceWithStatus } from "../actions/getEvidenceDashboard"; import { ChevronDown, ChevronUp } from "lucide-react"; +import { useI18n } from "@/locales/client"; interface DepartmentBarChartProps { byDepartment?: Record; } -// Status colors matching the EvidenceSummaryCards +// Status colors using CSS variables to match policies-by-assignee.tsx const STATUS_COLORS = { - empty: "#6b7280", // Gray for empty - draft: "#f59e0b", // Amber for draft - needsReview: "#ef4444", // Red for needs review - upToDate: "#10b981", // Green for up to date + upToDate: "bg-primary", + draft: "bg-[var(--chart-open)]", + needsReview: "bg-[hsl(var(--destructive))]", + empty: "bg-[var(--chart-pending)]", }; // Status priority order for display (determines the order in the bar) @@ -34,6 +35,7 @@ const DEPARTMENT_NAMES: Record = { }; export function DepartmentBarChart({ byDepartment }: DepartmentBarChartProps) { + const t = useI18n(); const containerRef = useRef(null); const [canScrollDown, setCanScrollDown] = useState(false); const [canScrollUp, setCanScrollUp] = useState(false); @@ -81,7 +83,7 @@ export function DepartmentBarChart({ byDepartment }: DepartmentBarChartProps) { if (firstDepartment && firstDepartment.length > 0) { console.log( "First department's first item status:", - firstDepartment[0].status, + firstDepartment[0].status ); } } @@ -115,7 +117,9 @@ export function DepartmentBarChart({ byDepartment }: DepartmentBarChartProps) { return { id: department, - name: DEPARTMENT_NAMES[department] || "Unknown", + name: + DEPARTMENT_NAMES[department] || + t(`evidence.departments.${department}`), totalItems: items.length, items, statusCounts, @@ -138,14 +142,9 @@ export function DepartmentBarChart({ byDepartment }: DepartmentBarChartProps) { if (department.statusCounts[status] > 0) { chartData.push({ key: status, - label: - status === "upToDate" - ? "Up to Date" - : status === "needsReview" - ? "Needs Review" - : status.charAt(0).toUpperCase() + status.slice(1), + label: getStatusLabel(status, t), value: department.statusCounts[status], - color: STATUS_COLORS[status], + color: getStatusColor(status), }); } } @@ -155,7 +154,7 @@ export function DepartmentBarChart({ byDepartment }: DepartmentBarChartProps) {

{department.name}

- {department.totalItems} items + {department.totalItems} {t("evidence.items")}
@@ -166,6 +165,24 @@ export function DepartmentBarChart({ byDepartment }: DepartmentBarChartProps) { valueFormatter={(value) => `${value}`} height={12} /> + + {/* Legend - similar to policies-by-assignee.tsx */} +
+ {STATUS_PRIORITY.map((status) => { + if (department.statusCounts[status] > 0) { + return ( +
+
+ + {getStatusLabel(status, t)} ( + {department.statusCounts[status]}) + +
+ ); + } + return null; + })} +
); })} @@ -188,3 +205,35 @@ export function DepartmentBarChart({ byDepartment }: DepartmentBarChartProps) {
); } + +// Helper function to get status label +function getStatusLabel(status: StatusType, t: any): string { + switch (status) { + case "upToDate": + return t("evidence.status.up_to_date"); + case "needsReview": + return t("evidence.status.needs_review"); + case "draft": + return t("evidence.status.draft"); + case "empty": + return t("evidence.status.empty"); + default: + return status; + } +} + +// Helper function to get status color +function getStatusColor(status: StatusType): string { + switch (status) { + case "upToDate": + return "#10b981"; // Green + case "draft": + return "#f59e0b"; // Amber + case "needsReview": + return "#ef4444"; // Red + case "empty": + return "#6b7280"; // Gray + default: + return "#6b7280"; // Default gray + } +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/EvidenceOverview.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/EvidenceOverview.tsx index be2973ca92..39805e7bd7 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/EvidenceOverview.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/EvidenceOverview.tsx @@ -5,9 +5,12 @@ import { useEvidenceDashboard } from "../hooks/useEvidenceDashboard"; import { DepartmentBarChart } from "./DepartmentBarChart"; import { AssigneeBarChart } from "./AssigneeBarChart"; import { FrameworkBarChart } from "./FrameworkBarChart"; +import { Card, CardContent, CardHeader, CardTitle } from "@bubba/ui/card"; +import { useI18n } from "@/locales/client"; export const EvidenceOverview = () => { const { data, isLoading, error } = useEvidenceDashboard(); + const t = useI18n(); if (isLoading) { return
Loading...
; @@ -23,39 +26,41 @@ export const EvidenceOverview = () => { return (
-

Evidence Dashboard

+

+ {t("evidence.dashboard.title")} +

{/* Charts */}
-
-
-

By Department

-
- -
-
-
- -
-
-

By Assignee

-
- -
-
-
- -
-
-

By Framework

-
- -
-
-
+ + + {t("evidence.dashboard.by_department")} + + + + + + + + + {t("evidence.dashboard.by_assignee")} + + + + + + + + + {t("evidence.dashboard.by_framework")} + + + + +
); diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/FrameworkBarChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/FrameworkBarChart.tsx index 3ab4892ac9..2b8d20b2cc 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/FrameworkBarChart.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/FrameworkBarChart.tsx @@ -4,17 +4,18 @@ import React, { useEffect, useRef, useState } from "react"; import { HorizontalBarChart, type ChartDataItem } from "./HorizontalBarChart"; import type { EvidenceWithStatus } from "../actions/getEvidenceDashboard"; import { ChevronDown, ChevronUp } from "lucide-react"; +import { useI18n } from "@/locales/client"; interface FrameworkBarChartProps { byFramework?: Record; } -// Status colors matching the EvidenceSummaryCards +// Status colors using CSS variables to match policies-by-assignee.tsx const STATUS_COLORS = { - empty: "#6b7280", // Gray for empty - draft: "#f59e0b", // Amber for draft - needsReview: "#ef4444", // Red for needs review - upToDate: "#10b981", // Green for up to date + upToDate: "bg-primary", + draft: "bg-[var(--chart-open)]", + needsReview: "bg-[hsl(var(--destructive))]", + empty: "bg-[var(--chart-pending)]", }; // Status priority order for display (determines the order in the bar) @@ -22,6 +23,7 @@ const STATUS_PRIORITY = ["upToDate", "draft", "needsReview", "empty"] as const; type StatusType = (typeof STATUS_PRIORITY)[number]; export function FrameworkBarChart({ byFramework }: FrameworkBarChartProps) { + const t = useI18n(); const containerRef = useRef(null); const [canScrollDown, setCanScrollDown] = useState(false); const [canScrollUp, setCanScrollUp] = useState(false); @@ -69,7 +71,7 @@ export function FrameworkBarChart({ byFramework }: FrameworkBarChartProps) { if (firstFramework && firstFramework.length > 0) { console.log( "First framework's first item status:", - firstFramework[0].status, + firstFramework[0].status ); } } @@ -100,12 +102,12 @@ export function FrameworkBarChart({ byFramework }: FrameworkBarChartProps) { return { id: frameworkId, - name: `${frameworkId}`, + name: frameworkId, totalItems: items.length, items, statusCounts, }; - }, + } ); // Sort by count in descending order @@ -124,14 +126,9 @@ export function FrameworkBarChart({ byFramework }: FrameworkBarChartProps) { if (framework.statusCounts[status] > 0) { chartData.push({ key: status, - label: - status === "upToDate" - ? "Up to Date" - : status === "needsReview" - ? "Needs Review" - : status.charAt(0).toUpperCase() + status.slice(1), + label: getStatusLabel(status, t), value: framework.statusCounts[status], - color: STATUS_COLORS[status], + color: getStatusColor(status), }); } } @@ -141,7 +138,7 @@ export function FrameworkBarChart({ byFramework }: FrameworkBarChartProps) {

{framework.name}

- {framework.totalItems} items + {framework.totalItems} {t("evidence.items")}
@@ -152,20 +149,37 @@ export function FrameworkBarChart({ byFramework }: FrameworkBarChartProps) { valueFormatter={(value) => `${value}`} height={12} /> + + {/* Legend - similar to policies-by-assignee.tsx */} +
+ {STATUS_PRIORITY.map((status) => { + if (framework.statusCounts[status] > 0) { + return ( +
+
+ + {getStatusLabel(status, t)} ( + {framework.statusCounts[status]}) + +
+ ); + } + return null; + })} +
); })}
- {/* Scroll up indicator */} + {/* Scroll indicators */} {canScrollUp && (
)} - {/* Scroll down indicator */} {canScrollDown && (
@@ -174,3 +188,35 @@ export function FrameworkBarChart({ byFramework }: FrameworkBarChartProps) {
); } + +// Helper function to get status label +function getStatusLabel(status: StatusType, t: any): string { + switch (status) { + case "upToDate": + return t("evidence.status.up_to_date"); + case "needsReview": + return t("evidence.status.needs_review"); + case "draft": + return t("evidence.status.draft"); + case "empty": + return t("evidence.status.empty"); + default: + return status; + } +} + +// Helper function to get status color +function getStatusColor(status: StatusType): string { + switch (status) { + case "upToDate": + return "#10b981"; // Green + case "draft": + return "#f59e0b"; // Amber + case "needsReview": + return "#ef4444"; // Red + case "empty": + return "#6b7280"; // Gray + default: + return "#6b7280"; // Default gray + } +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/HorizontalBarChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/HorizontalBarChart.tsx index f08133b5cf..38ddd14b1f 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/HorizontalBarChart.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/HorizontalBarChart.tsx @@ -17,6 +17,7 @@ interface HorizontalBarChartProps { showZeroValues?: boolean; colors?: string[]; valueFormatter?: (value: number) => string; + showLegend?: boolean; } // Default array of colors using Tailwind's HSL color palette @@ -35,6 +36,7 @@ export function HorizontalBarChart({ showZeroValues = true, colors = defaultColors, valueFormatter = (value) => `${value}`, + showLegend = false, }: HorizontalBarChartProps) { // Debug: Log the incoming data useEffect(() => { @@ -77,7 +79,9 @@ export function HorizontalBarChart({ } const barHeight = height; - let cumulativePercentage = 0; + const gap = 0.3; // Add gap between segments like in policies-by-assignee + const totalWidth = totalValue + gap * (filteredData.length - 1); + let cumulativeWidth = 0; const cornerRadius = 0; // No rounded corners in the policies-by-assignee chart return ( @@ -104,27 +108,29 @@ export function HorizontalBarChart({ translate-y-[var(--marginTop)] overflow-visible" > - {filteredData.map((d) => { - const percentage = (d.value / totalValue) * 100; - const xPosition = cumulativePercentage; - cumulativePercentage += percentage; + {filteredData.map((d, index) => { + const barWidth = (d.value / totalWidth) * 100; + const xPosition = cumulativeWidth; + cumulativeWidth += barWidth + gap; return (
@@ -135,19 +141,21 @@ export function HorizontalBarChart({
{/* Legend */} -
- {filteredData.map((item) => ( -
-
- - {item.label} ({valueFormatter(item.value)}) - -
- ))} -
+ {showLegend && ( +
+ {filteredData.map((item) => ( +
+
+ + {item.label} ({valueFormatter(item.value)}) + +
+ ))} +
+ )}
); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/layout.tsx new file mode 100644 index 0000000000..063655d889 --- /dev/null +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/layout.tsx @@ -0,0 +1,26 @@ +import { getI18n } from "@/locales/server"; +import { SecondaryMenu } from "@bubba/ui/secondary-menu"; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const t = await getI18n(); + + return ( +
+ + +
{children}
+
+ ); +} diff --git a/apps/app/src/locales/en.ts b/apps/app/src/locales/en.ts index 6fc4dd296b..b511c47dbd 100644 --- a/apps/app/src/locales/en.ts +++ b/apps/app/src/locales/en.ts @@ -788,10 +788,37 @@ export default { }, }, evidence: { - title: "Evidence Tasks", - description: - "Manage and track evidence tasks for your compliance requirements.", - dashboard: "Dashboard", + title: "Evidence", list: "All Evidence", + overview: "Evidence Overview", + edit: "Edit Evidence", + dashboard: { + layout: "Dashboard", + layout_back_button: "Back", + title: "Evidence Dashboard", + by_department: "By Department", + by_assignee: "By Assignee", + by_framework: "By Framework", + }, + items: "items", + status: { + up_to_date: "Up to Date", + needs_review: "Needs Review", + draft: "Draft", + empty: "Empty", + }, + departments: { + none: "Uncategorized", + admin: "Administration", + gov: "Governance", + hr: "Human Resources", + it: "Information Technology", + itsm: "IT Service Management", + qms: "Quality Management", + }, + details: { + review_section: "Review Information", + content: "Evidence Content", + }, }, } as const; diff --git a/apps/app/src/middleware.ts b/apps/app/src/middleware.ts index 93cac4d067..9a969d3dce 100644 --- a/apps/app/src/middleware.ts +++ b/apps/app/src/middleware.ts @@ -10,7 +10,6 @@ const I18nMiddleware = createI18nMiddleware({ export async function middleware(request: NextRequest) { const session = await authMiddleware(); - const response = await I18nMiddleware(request); const nextUrl = request.nextUrl; const pathnameLocale = nextUrl.pathname.split("/", 2)?.[1]; @@ -37,6 +36,9 @@ export async function middleware(request: NextRequest) { return NextResponse.redirect(url); } + const response = await I18nMiddleware(request); + response.headers.set("x-pathname", request.nextUrl.pathname); + return response; } diff --git a/bun.lockb b/bun.lockb index a3c5b2deaa4731d9aa7dd147c2b00df9c822ecb7..86297218f8f5423844f2425670448cca272ef574 100755 GIT binary patch delta 115764 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ⅅIj_E^SaZ>6iO=et7KJ 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

IwKFT_d&d z+J$W2Az|+8N;BWFsOQREZF#15=2CsKJJicU6^7y7Sp73Y8d0tA)?JyAZrqXB!Lbo; zl=BWzZVC|0h@AX3wu*bvc!rEXTv-STGopbHT1PrJJ>0`kcC8yV%!4j>%ZR2|O1Onh z>4|!oo3c1~44+N~!uPU_*x=M)?bGZ@Z4HQQnbLkh;=Nf9Z(#tF%0jZYps;~=bDic@ zf9+Kl$9p6SCjDl$C@l{?Q@$1zeUJKG@r_37R_her=u)eM^1g+Jt}SFHvA+&k#J=# zI`SSvS}}L>`+%1n4scIM{2;zko3$v45RHE=%qjPi=qadF2`-<-Tw(Gc9Q~1wZ`Jv0 z^&X4X+2eZ!1r8tFUuAY-;^<+aD|;E!{U`9yIR4y@k5k9pcOQg%))y0pUh&H4?^dKU z?%8OtH>b*}#m~io6LHUau|&^yWvef1mfCxCpd?7rl=RK#(i=>^R0R9-On@=xr`Y)q z9&iMJaSX9-YWj^*TkKyN(~Wo9dk+kB9yAhf2o+)ST)p+xr7j+>) z^4|Tz8~ax1R?V`UgnQPBPq&H|BZlhkeF(<`Hk#gVf9B+%8``ns%(<%US|!vMv~xW1 z?a~uXwNBKwg;s~ZhqTc4NqE^*+oMoIN(*hTV(PjHZog}fYYMqJkLo{xT>P}wRN7B_ zuTU-NUfow~nNX^y*1uq(I?{ti{j_$ptdI6LT2jHRB4rHFT9A2wb|m#LV`j&SYZJBw zXiKW8R#A}s`)i9PJnF06r>1qDD0sBL_K>SojiwYtMR`bs6>#q z5Vh%|)l$@OZ9B;JVz?G>l9rJfLD~xHx_d@y%N791YK(R&NC_*)YCRd`<~VI%j;u<) zW3-xtVdJ%NY7O?3CBY9*)Rv+~6Scj8*%_>@NoOZ&%kjTGsKPj{h8%;nm6ZqcgSGhH z3Iob`4{AS2dIXs{e_A_9yRJiR#(dQ1px(or0(u3F9T@1Oul>z!ub`pIlOY2GM~};= z^SiIeC>$_s>_{hC7NYf|wNs(5ZIiXt`Cs)zwM8j#veq{L)}H@WX0q0i|MhAzBtx-^ z6njxyIAKPpc6m*jw?SKiDu-z+(HF-e=H#(STP6S2j23KyA{450Ta=OSP z8SQW?Vn)lNwFav6>??i|&P6I43gAvdVVkv9`Hu=y-L2YU((RwN+q4O`+su}`;5`9a zyM&cD%`6L}H)Au++Jr{;)-xBJ})|Xp^wCUXeb6 e*|;|RaatRWt=bS+J0Jcq)JMi{Z&;+1`u_pLhL)@V delta 114255 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

JZs(d2L z?@=5mEGz`f_!$`-$$lU^I0~d9$AE0;BoJ@LH5<;=%+CvCemo( zcW6H%!HdWO`+(flP6FBSDV0wo|5b4!M{r)rFDN;Y9sH&^kpsJ;@P?8Tb^6~eC2&Vt z;I5Jr+2DO375GERiL~4!C4a2sM4mv!!?6Dq3jfDbGj^Z@*|8PKj=cCZO(92+6PzQ? zr{w>4ung+eRPEMM^@*Z?cLB<2kX|0FDiEnyh~obfWcjA5{2Ng8|BnLnfi|iF zkrAvLkQVBpis+vv?~ejBZ8(q(N2m%!S|AR{h7y2?LE3ng zPvo@E2D1KqC3i=*XDT_7mR$s7d!O*%ZRLnR2U3w0KsK}*$csq%TE*Rw4XjskBHP&l zq&ywSQ2e9fdw{&$k%~EfQW@^ZjGvX9$iw{w#s7DZ?Os&v5HV1Pb_EG)d=1C~*MT(A zZ6HT}PvHZV|0j@_JM!(Y7v58|ehwhpGx*+GA>}!hJh#HUA|Lb51PkO-m|tN5Ag7`z zkQb5VycPN=ET*uy!V(HgDlDb2w8An9%M!VnltV(_>|0&`E>NPgUQ3s>)AT-+ro!jp6O5 zs`700_ES}!FdOlv@n6V?8gKeUmE|bs3H0r!s&7A4efz1Z=KhH)mj^jll=~;Dl#}yd z{`OPV|MU$l1Iyb_Ro{N9`u0=Rx1XxM=@V5(Qp$NidHboV`bh5Wr>bv1Rek%Z>f29M z)yI0i>SH}3-(J-P@-^DqPgUQ3s`~a*Rer+y_ES~u?Wd~lpQs`_iceR0gZ}nY)wiFj zzWr47?Wd}5KUIDEsp{KLRsZn`tN2tCAK&q{k*+?GSdVzel$6dc1XdMdR!694Dvru3E*n?3PM-zu4Wv zt3u-$mGm>Vh+@NTJV{=>zFqs)kN)b1w>=i^RX+T$^tE$lx$AllbMG}hk2&eO-p+Et zJW4^*bqE^VfZ#VX?FIx@Za{F2g5S+LHz7Dp!MvLgTrq#A;DehGw73PqHFNeY2>fnA z@Q8vNX2@*_Zc^~YZ3u3ee^RjEHU!=7Kyb%gb_asicObCd)!XU!G_&Ar&+g_^N={zW z+imW2SD%r;NxP%lm!vMq;a%?2J>jLM9i85(!Je3tjp{vqf76r8U0#K4T4knesGWCj zr5RE;XA0Q{C7t;B+ScoB$A#y5HN!k; zPI|5H4etNVlt*7Kd+f8i#6Imv*61e))t4$eKgdxT0LTeV_*Cf(eHNKqYs9s4PCTs>Dv09&r&bv zYOwg-(m{XdUpIN&>9SEfbI0wx4aOF)=Vx!>v*B7@-^}MKQ=CW^sx7^P4v~sRS>x#DsNjQ7I^knUD!#T}<-gewPX!F<` zym5EEEmtc?pF6s5z{}#l^?6dS+OO>k2V0K(7W6p1+8xi>brC-tU%g|X?asXRKZg$; z=-udpPK6F9^bCr=8NKCc|5bnjQO

6e%-phx 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 Z94Bd)NnC;gxB%xtGf_pQ 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 Q&5M9lKIK!}5~bDu2bemjQ~&?~ diff --git a/yarn.lock b/yarn.lock index 80bcb9c995..9a22322718 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6 +1,6 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 -# bun ./bun.lockb --hash: 0000000000000000-0000000000000000-0000000000000000-0000000000000000 +# bun ./bun.lockb --hash: 50623A634CC2F293-14aceb406a225af0-07BFE7641E0AC22A-fda6ee1dd8e24450 "@ai-sdk/openai@^0.0.66": @@ -45,20 +45,20 @@ resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.20.tgz" integrity sha512-ngg/RGpnA00eNOWEtXHenpX1MsM2QshQh4QJFjUfwcqHpM5kTfG7je7Rc3HcEDP+OkRVv2GF+X4fC1Vfcnl8Ow== dependencies: - "@ai-sdk/provider" "0.0.24" - eventsource-parser "1.1.2" nanoid "3.3.6" + "@ai-sdk/provider" "0.0.24" secure-json-parse "2.7.0" + eventsource-parser "1.1.2" "@ai-sdk/provider-utils@1.0.22": version "1.0.22" resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.22.tgz" integrity sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ== dependencies: - "@ai-sdk/provider" "0.0.26" - eventsource-parser "^1.1.2" nanoid "^3.3.7" + "@ai-sdk/provider" "0.0.26" secure-json-parse "^2.7.0" + eventsource-parser "^1.1.2" "@ai-sdk/provider-utils@2.1.8": version "2.1.8" @@ -75,10 +75,10 @@ resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-0.0.70.tgz" integrity sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ== dependencies: - "@ai-sdk/provider-utils" "1.0.22" - "@ai-sdk/ui-utils" "0.0.50" swr "^2.2.5" throttleit "2.1.0" + "@ai-sdk/ui-utils" "0.0.50" + "@ai-sdk/provider-utils" "1.0.22" "@ai-sdk/react@1.1.16": version "1.1.16" @@ -95,28 +95,28 @@ resolved "https://registry.npmjs.org/@ai-sdk/solid/-/solid-0.0.54.tgz" integrity sha512-96KWTVK+opdFeRubqrgaJXoNiDP89gNxFRWUp0PJOotZW816AbhUf4EnDjBjXTLjXL1n0h8tGSE9sZsRkj9wQQ== dependencies: - "@ai-sdk/provider-utils" "1.0.22" "@ai-sdk/ui-utils" "0.0.50" + "@ai-sdk/provider-utils" "1.0.22" "@ai-sdk/svelte@0.0.57": version "0.0.57" resolved "https://registry.npmjs.org/@ai-sdk/svelte/-/svelte-0.0.57.tgz" integrity sha512-SyF9ItIR9ALP9yDNAD+2/5Vl1IT6kchgyDH8xkmhysfJI6WrvJbtO1wdQ0nylvPLcsPoYu+cAlz1krU4lFHcYw== dependencies: - "@ai-sdk/provider-utils" "1.0.22" - "@ai-sdk/ui-utils" "0.0.50" sswr "^2.1.0" + "@ai-sdk/ui-utils" "0.0.50" + "@ai-sdk/provider-utils" "1.0.22" "@ai-sdk/ui-utils@0.0.50": version "0.0.50" resolved "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-0.0.50.tgz" integrity sha512-Z5QYJVW+5XpSaJ4jYCCAVG7zIAuKOOdikhgpksneNmKvx61ACFaf98pmOd+xnjahl0pIlc/QIe6O4yVaJ1sEaw== dependencies: - "@ai-sdk/provider" "0.0.26" - "@ai-sdk/provider-utils" "1.0.22" json-schema "^0.4.0" + "@ai-sdk/provider" "0.0.26" secure-json-parse "^2.7.0" zod-to-json-schema "^3.23.3" + "@ai-sdk/provider-utils" "1.0.22" "@ai-sdk/ui-utils@1.1.14": version "1.1.14" @@ -132,9 +132,9 @@ resolved "https://registry.npmjs.org/@ai-sdk/vue/-/vue-0.0.59.tgz" integrity sha512-+ofYlnqdc8c4F6tM0IKF0+7NagZRAiqBJpGDJ+6EYhDW8FHLUP/JFBgu32SjxSxC6IKFZxEnl68ZoP/Z38EMlw== dependencies: - "@ai-sdk/provider-utils" "1.0.22" - "@ai-sdk/ui-utils" "0.0.50" swrv "^1.0.4" + "@ai-sdk/ui-utils" "0.0.50" + "@ai-sdk/provider-utils" "1.0.22" "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -154,23 +154,23 @@ resolved "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz" integrity sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw== dependencies: + lru-cache "^10.4.3" "@csstools/css-calc" "^2.1.1" + "@csstools/css-tokenizer" "^3.0.3" "@csstools/css-color-parser" "^3.0.7" "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - lru-cache "^10.4.3" "@auth/core@0.37.2": version "0.37.2" resolved "https://registry.npmjs.org/@auth/core/-/core-0.37.2.tgz" integrity sha512-kUvzyvkcd6h1vpeMAojK2y7+PAV5H+0Cc9+ZlKYDFhDY31AlvsB+GW5vNO4qE3Y07KeQgvNO9U0QUx/fN62kBw== dependencies: - "@panva/hkdf" "^1.2.1" - "@types/cookie" "0.6.0" - cookie "0.7.1" jose "^5.9.3" - oauth4webapi "^3.0.0" + cookie "0.7.1" preact "10.11.3" + "@panva/hkdf" "^1.2.1" + oauth4webapi "^3.0.0" + "@types/cookie" "0.6.0" preact-render-to-string "5.2.3" "@auth/core@0.37.4": @@ -776,9 +776,9 @@ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/helper-validator-identifier" "^7.25.9" js-tokens "^4.0.0" picocolors "^1.0.0" + "@babel/helper-validator-identifier" "^7.25.9" "@babel/compat-data@^7.26.5": version "7.26.8" @@ -790,60 +790,60 @@ resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz" integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" + debug "^4.1.0" + json5 "^2.2.3" + semver "^6.3.1" + gensync "^1.0.0-beta.2" + "@babel/types" "^7.24.5" "@babel/parser" "^7.24.5" + "@babel/helpers" "^7.24.5" "@babel/template" "^7.24.0" "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/generator" "^7.24.5" + "@babel/code-frame" "^7.24.2" convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" + "@ampproject/remapping" "^2.2.0" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helper-compilation-targets" "^7.23.6" "@babel/generator@^7.24.5", "@babel/generator@^7.26.9": version "7.26.9" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz" integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== dependencies: - "@babel/parser" "^7.26.9" + jsesc "^3.0.2" "@babel/types" "^7.26.9" + "@babel/parser" "^7.26.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" "@babel/helper-compilation-targets@^7.23.6": version "7.26.5" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz" integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: + semver "^6.3.1" + lru-cache "^5.1.1" + browserslist "^4.24.0" "@babel/compat-data" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" "@babel/helper-module-imports@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== dependencies: - "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/helper-module-transforms@^7.24.5": version "7.26.0" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== dependencies: + "@babel/traverse" "^7.25.9" "@babel/helper-module-imports" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" "@babel/helper-string-parser@^7.25.9": version "7.25.9" @@ -865,8 +865,8 @@ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz" integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== dependencies: - "@babel/template" "^7.26.9" "@babel/types" "^7.26.9" + "@babel/template" "^7.26.9" "@babel/parser@7.24.5", "@babel/parser@^7.24.5": version "7.24.5" @@ -892,22 +892,22 @@ resolved "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz" integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.26.9" "@babel/types" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/code-frame" "^7.26.2" "@babel/traverse@^7.24.5", "@babel/traverse@^7.25.9": version "7.26.9" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz" integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.9" - "@babel/parser" "^7.26.9" - "@babel/template" "^7.26.9" - "@babel/types" "^7.26.9" debug "^4.3.1" globals "^11.1.0" + "@babel/types" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/generator" "^7.26.9" + "@babel/code-frame" "^7.26.2" "@babel/types@^7.24.5", "@babel/types@^7.25.9", "@babel/types@^7.26.9": version "7.26.9" @@ -934,14 +934,14 @@ resolved "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz" integrity sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog== optionalDependencies: - "@biomejs/cli-darwin-arm64" "1.9.4" + "@biomejs/cli-linux-x64" "1.9.4" + "@biomejs/cli-win32-x64" "1.9.4" "@biomejs/cli-darwin-x64" "1.9.4" "@biomejs/cli-linux-arm64" "1.9.4" - "@biomejs/cli-linux-arm64-musl" "1.9.4" - "@biomejs/cli-linux-x64" "1.9.4" - "@biomejs/cli-linux-x64-musl" "1.9.4" "@biomejs/cli-win32-arm64" "1.9.4" - "@biomejs/cli-win32-x64" "1.9.4" + "@biomejs/cli-darwin-arm64" "1.9.4" + "@biomejs/cli-linux-x64-musl" "1.9.4" + "@biomejs/cli-linux-arm64-musl" "1.9.4" "@biomejs/cli-darwin-arm64@1.9.4": version "1.9.4" @@ -996,19 +996,18 @@ formdata-node "^4.3.2" node-fetch "^2.6.7" -"@bubba/analytics@packages/analytics", "@bubba/analytics@workspace:*": +"@bubba/analytics@packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.215.3" posthog-node "^4.4.1" -"@bubba/db@packages/db", "@bubba/db@workspace:*": +"@bubba/db@packages/db": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: - "@bubba/tsconfig" "workspace:*" - devDependencies: + "@bubba/tsconfig" "packages/tsconfig" typescript "^5.7.3" dependencies: "@auth/prisma-adapter" "^2.7.4" @@ -1026,9 +1025,8 @@ "@types/react-dom" "^19.0.0" typescript "^5.7.2" dependencies: - "@bubba/ui" "workspace:*" - "@bubba/utils" "workspace:*" - dependencies: + "@bubba/ui" "packages/ui" + "@bubba/utils" "packages/utils" "@react-email/components" "0.0.31" "@react-email/render" "0.0.10" "@react-email/tailwind" "1.0.4" @@ -1059,7 +1057,7 @@ "@upstash/redis" "^1.34.2" server-only "^0.0.1" -"@bubba/notifications@packages/notifications", "@bubba/notifications@workspace:*": +"@bubba/notifications@packages/notifications": version "workspace:packages/notifications" resolved "workspace:packages/notifications" devDependencies: @@ -1068,11 +1066,11 @@ "@novu/node" "^2.0.1" nanoid "^5.0.7" -"@bubba/tsconfig@packages/tsconfig", "@bubba/tsconfig@workspace:*": +"@bubba/tsconfig@packages/tsconfig": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@bubba/ui@packages/ui", "@bubba/ui@workspace:*": +"@bubba/ui@packages/ui": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -1136,7 +1134,7 @@ use-callback-ref "^1.3.3" vaul "^1.0.0" -"@bubba/utils@packages/utils", "@bubba/utils@workspace:*": +"@bubba/utils@packages/utils": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: @@ -1162,9 +1160,9 @@ resolved "https://registry.npmjs.org/@clack/prompts/-/prompts-0.10.0.tgz" integrity sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ== dependencies: - "@clack/core" "0.4.1" picocolors "^1.0.0" sisteransi "^1.0.5" + "@clack/core" "0.4.1" "@csstools/color-helpers@^5.0.1": version "5.0.1" @@ -1209,8 +1207,8 @@ resolved "https://registry.npmjs.org/@effect/platform/-/platform-0.72.0.tgz" integrity sha512-uHsW2hlo6AiIW3zpLAVAoNvJngS/JwCZBAM4RSRllm8JTgjjCraef78FJBDNnSXz+2a10Xzzx4qxVsP3s8EV5Q== dependencies: - find-my-way-ts "^0.1.5" multipasta "^0.2.5" + find-my-way-ts "^0.1.5" "@egjs/agent@^2.2.1": version "2.4.4" @@ -1447,10 +1445,10 @@ resolved "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.3.tgz" integrity sha512-pJT1OkhplSmvvr6i3CWTPvC/FGC06MbN5TNBfRO6Ox62AEz90eMq+dVvtX9Bl3jxCEkS0tATzDarRZuOLw7oFg== dependencies: - "@formatjs/fast-memoize" "2.2.6" - "@formatjs/intl-localematcher" "0.6.0" decimal.js "10" tslib "2" + "@formatjs/fast-memoize" "2.2.6" + "@formatjs/intl-localematcher" "0.6.0" "@formatjs/fast-memoize@2.2.6", "@formatjs/fast-memoize@^2.2.0": version "2.2.6" @@ -1464,17 +1462,17 @@ resolved "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.1.tgz" integrity sha512-o0AhSNaOfKoic0Sn1GkFCK4MxdRsw7mPJ5/rBpIqdvcC7MIuyUSW8WChUEvrK78HhNpYOgqCQbINxCTumJLzZA== dependencies: + tslib "2" "@formatjs/ecma402-abstract" "2.3.3" "@formatjs/icu-skeleton-parser" "1.8.13" - tslib "2" "@formatjs/icu-skeleton-parser@1.8.13": version "1.8.13" resolved "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.13.tgz" integrity sha512-N/LIdTvVc1TpJmMt2jVg0Fr1F7Q1qJPdZSCs19unMskCmVQ/sa0H9L8PWt13vq+gLdLg1+pPsvBLydL1Apahjg== dependencies: - "@formatjs/ecma402-abstract" "2.3.3" tslib "2" + "@formatjs/ecma402-abstract" "2.3.3" "@formatjs/intl-localematcher@^0.5.4": version "0.5.10" @@ -1813,70 +1811,70 @@ hey-listen "^1.0.8" tslib "^2.3.1" -"@mui/core-downloads-tracker@^6.4.4": - version "6.4.4" - resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.4.tgz" - integrity sha512-r+J0EditrekkTtO2CnCBCOGpNaDYwJqz8lH4rj6o/anDcskZFJodBlG8aCJkS8DL/CF/9EHS+Gz53EbmYEnQbw== +"@mui/core-downloads-tracker@^6.4.5": + version "6.4.5" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.5.tgz" + integrity sha512-zoXvHU1YuoodgMlPS+epP084Pqv9V+Vg+5IGv9n/7IIFVQ2nkTngYHYxElCq8pdTTbDcgji+nNh0lxri2abWgA== "@mui/icons-material@^6.1.6": - version "6.4.4" - resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.4.tgz" - integrity sha512-uF1chGaoFmYdRUomK6f8kgJfWosk9A3HXWiVD0vQm+2mE7f25eTQ1E8RRO11LXpnUBqu8Rbv/uGlpnjT/u1Ksg== + version "6.4.5" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.5.tgz" + integrity sha512-4A//t8Nrc+4u4pbVhGarIFU98zpuB5AV9hTNzgXx1ySZJ1tWtx+i/1SbQ8PtGJxWeXlljhwimZJNPQ3x0CiIFw== dependencies: "@babel/runtime" "^7.26.0" -"@mui/material@^6.4.4": - version "6.4.4" - resolved "https://registry.npmjs.org/@mui/material/-/material-6.4.4.tgz" - integrity sha512-ISVPrIsPQsxnwvS40C4u03AuNSPigFeS2+n1qpuEZ94hDsdMi19dQM2JcC9CHEhXecSIQjP1RTyY0mPiSpSrFQ== +"@mui/material@^6.4.5": + version "6.4.5" + resolved "https://registry.npmjs.org/@mui/material/-/material-6.4.5.tgz" + integrity sha512-5eyEgSXocIeV1JkXs8mYyJXU0aFyXZIWI5kq2g/mCnIgJe594lkOBNAKnCIaGVfQTu2T6TTEHF8/hHIqpiIRGA== dependencies: - "@babel/runtime" "^7.26.0" - "@mui/core-downloads-tracker" "^6.4.4" - "@mui/system" "^6.4.3" - "@mui/types" "^7.2.21" - "@mui/utils" "^6.4.3" - "@popperjs/core" "^2.11.8" - "@types/react-transition-group" "^4.4.12" clsx "^2.1.1" csstype "^3.1.3" - prop-types "^15.8.1" react-is "^19.0.0" + "@mui/types" "^7.2.21" + "@mui/utils" "^6.4.3" + prop-types "^15.8.1" + "@mui/system" "^6.4.3" + "@babel/runtime" "^7.26.0" + "@popperjs/core" "^2.11.8" react-transition-group "^4.4.5" + "@mui/core-downloads-tracker" "^6.4.5" + "@types/react-transition-group" "^4.4.12" "@mui/private-theming@^6.4.3": version "6.4.3" resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.3.tgz" integrity sha512-7x9HaNwDCeoERc4BoEWLieuzKzXu5ZrhRnEM6AUcRXUScQLvF1NFkTlP59+IJfTbEMgcGg1wWHApyoqcksrBpQ== dependencies: - "@babel/runtime" "^7.26.0" "@mui/utils" "^6.4.3" prop-types "^15.8.1" + "@babel/runtime" "^7.26.0" "@mui/styled-engine@^6.4.3": version "6.4.3" resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.3.tgz" integrity sha512-OC402VfK+ra2+f12Gef8maY7Y9n7B6CZcoQ9u7mIkh/7PKwW/xH81xwX+yW+Ak1zBT3HYcVjh2X82k5cKMFGoQ== dependencies: + csstype "^3.1.3" + prop-types "^15.8.1" "@babel/runtime" "^7.26.0" "@emotion/cache" "^11.13.5" - "@emotion/serialize" "^1.3.3" "@emotion/sheet" "^1.4.0" - csstype "^3.1.3" - prop-types "^15.8.1" + "@emotion/serialize" "^1.3.3" "@mui/system@^6.4.3": version "6.4.3" resolved "https://registry.npmjs.org/@mui/system/-/system-6.4.3.tgz" integrity sha512-Q0iDwnH3+xoxQ0pqVbt8hFdzhq1g2XzzR4Y5pVcICTNtoCLJmpJS3vI4y/OIM1FHFmpfmiEC2IRIq7YcZ8nsmg== dependencies: - "@babel/runtime" "^7.26.0" - "@mui/private-theming" "^6.4.3" - "@mui/styled-engine" "^6.4.3" - "@mui/types" "^7.2.21" - "@mui/utils" "^6.4.3" clsx "^2.1.1" csstype "^3.1.3" + "@mui/types" "^7.2.21" + "@mui/utils" "^6.4.3" prop-types "^15.8.1" + "@babel/runtime" "^7.26.0" + "@mui/styled-engine" "^6.4.3" + "@mui/private-theming" "^6.4.3" "@mui/types@^7.2.21": version "7.2.21" @@ -1888,27 +1886,36 @@ resolved "https://registry.npmjs.org/@mui/utils/-/utils-6.4.3.tgz" integrity sha512-jxHRHh3BqVXE9ABxDm+Tc3wlBooYz/4XPa0+4AI+iF38rV1/+btJmSUgG4shDtSWVs/I97aDn5jBCt6SF2Uq2A== dependencies: - "@babel/runtime" "^7.26.0" - "@mui/types" "^7.2.21" - "@types/prop-types" "^15.7.14" clsx "^2.1.1" - prop-types "^15.8.1" react-is "^19.0.0" + "@mui/types" "^7.2.21" + prop-types "^15.8.1" + "@babel/runtime" "^7.26.0" + "@types/prop-types" "^15.7.14" "@nangohq/frontend@^0.53.1": - version "0.53.2" - resolved "https://registry.npmjs.org/@nangohq/frontend/-/frontend-0.53.2.tgz" - integrity sha512-ZSNY9jHVuF/Qfsu8TJBK3tujsxO+Qi7dHWNFt316Mq3g4od9MwuHefTEs0EtfpUTCB18hNE05QOQWCuD8zO8Aw== + version "0.53.1" + resolved "https://registry.npmjs.org/@nangohq/frontend/-/frontend-0.53.1.tgz" + integrity sha512-NjQwktw1aKYsQ9QPGJkyABgVZhWBrYlJgi12ohyLnw1X/0jLH2XxVrGEmBG/F8ID1/1g3YHo1SxdV0Dcaw0ZPQ== dependencies: - "@nangohq/types" "0.53.2" + "@nangohq/types" "0.53.1" "@nangohq/node@^0.53.2": version "0.53.2" resolved "https://registry.npmjs.org/@nangohq/node/-/node-0.53.2.tgz" integrity sha512-QfBrtbv1dekI3RH+HX+43MGIRs36MNuWMdWS1RRFKjiCmIwKaOje6qjRj0UDjQYtokKcbt2id2sAAq8fmusjCQ== dependencies: + axios "^1.7.9" "@nangohq/types" "0.53.2" + +"@nangohq/types@0.53.1": + version "0.53.1" + resolved "https://registry.npmjs.org/@nangohq/types/-/types-0.53.1.tgz" + integrity sha512-9ZfkhoYgwEkAonYHku0sE20pYn+XlAVvD74HDqXg4b9g0Lxsdsv7eptr0VVPMaaUAt790JjfbwphrlEIvWyCag== + dependencies: axios "^1.7.9" + json-schema "0.4.0" + type-fest "4.32.0" "@nangohq/types@0.53.2": version "0.53.2" @@ -1916,8 +1923,8 @@ integrity sha512-G7oC4QsJrmLjAWQmvB7gY8hE0UMr8PofAY/pPsk/0sHIM1YWeealBI7RiPeN4UluArT7w+OoUvMQd+jtrTh9Lw== dependencies: axios "^1.7.9" - json-schema "0.4.0" type-fest "4.32.0" + json-schema "0.4.0" "@neondatabase/serverless@^0.10.4", "@neondatabase/serverless@^0.6.0 || ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0": version "0.10.4" @@ -1931,6 +1938,11 @@ resolved "https://registry.npmjs.org/@next/env/-/env-15.0.4.tgz" integrity sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw== +"@next/env@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/env/-/env-15.1.7.tgz" + integrity sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ== + "@next/env@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/env/-/env-15.2.0.tgz" @@ -1941,6 +1953,11 @@ resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.4.tgz" integrity sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w== +"@next/swc-darwin-arm64@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.7.tgz" + integrity sha512-hPFwzPJDpA8FGj7IKV3Yf1web3oz2YsR8du4amKw8d+jAOHfYHYFpMkoF6vgSY4W6vB29RtZEklK9ayinGiCmQ== + "@next/swc-darwin-arm64@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.0.tgz" @@ -1951,6 +1968,11 @@ resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.4.tgz" integrity sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA== +"@next/swc-darwin-x64@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.7.tgz" + integrity sha512-2qoas+fO3OQKkU0PBUfwTiw/EYpN+kdAx62cePRyY1LqKtP09Vp5UcUntfZYajop5fDFTjSxCHfZVRxzi+9FYQ== + "@next/swc-darwin-x64@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.0.tgz" @@ -1961,6 +1983,11 @@ resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.4.tgz" integrity sha512-12oSaBFjGpB227VHzoXF3gJoK2SlVGmFJMaBJSu5rbpaoT5OjP5OuCLuR9/jnyBF1BAWMs/boa6mLMoJPRriMA== +"@next/swc-linux-arm64-gnu@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.7.tgz" + integrity sha512-sKLLwDX709mPdzxMnRIXLIT9zaX2w0GUlkLYQnKGoXeWUhcvpCrK+yevcwCJPdTdxZEUA0mOXGLdPsGkudGdnA== + "@next/swc-linux-arm64-gnu@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.0.tgz" @@ -1971,6 +1998,11 @@ resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.4.tgz" integrity sha512-QARO88fR/a+wg+OFC3dGytJVVviiYFEyjc/Zzkjn/HevUuJ7qGUUAUYy5PGVWY1YgTzeRYz78akQrVQ8r+sMjw== +"@next/swc-linux-arm64-musl@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.7.tgz" + integrity sha512-zblK1OQbQWdC8fxdX4fpsHDw+VSpBPGEUX4PhSE9hkaWPrWoeIJn+baX53vbsbDRaDKd7bBNcXRovY1hEhFd7w== + "@next/swc-linux-arm64-musl@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.0.tgz" @@ -1981,6 +2013,11 @@ resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.4.tgz" integrity sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw== +"@next/swc-linux-x64-gnu@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.7.tgz" + integrity sha512-GOzXutxuLvLHFDAPsMP2zDBMl1vfUHHpdNpFGhxu90jEzH6nNIgmtw/s1MDwpTOiM+MT5V8+I1hmVFeAUhkbgQ== + "@next/swc-linux-x64-gnu@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.0.tgz" @@ -1991,6 +2028,11 @@ resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.4.tgz" integrity sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw== +"@next/swc-linux-x64-musl@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.7.tgz" + integrity sha512-WrZ7jBhR7ATW1z5iEQ0ZJfE2twCNSXbpCSaAunF3BKcVeHFADSI/AW1y5Xt3DzTqPF1FzQlwQTewqetAABhZRQ== + "@next/swc-linux-x64-musl@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.0.tgz" @@ -2001,6 +2043,11 @@ resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.4.tgz" integrity sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ== +"@next/swc-win32-arm64-msvc@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.7.tgz" + integrity sha512-LDnj1f3OVbou1BqvvXVqouJZKcwq++mV2F+oFHptToZtScIEnhNRJAhJzqAtTE2dB31qDYL45xJwrc+bLeKM2Q== + "@next/swc-win32-arm64-msvc@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.0.tgz" @@ -2011,6 +2058,11 @@ resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.4.tgz" integrity sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw== +"@next/swc-win32-x64-msvc@15.1.7": + version "15.1.7" + resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.7.tgz" + integrity sha512-dC01f1quuf97viOfW05/K8XYv2iuBgAxJZl7mbCKEjMgdQl5JjAKJ0D2qMKZCgPWDeFbFT0Q0nYWwytEW0DWTQ== + "@next/swc-win32-x64-msvc@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.0.tgz" @@ -2051,8 +2103,8 @@ resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" + "@nodelib/fs.scandir" "2.1.5" "@novu/client@2.6.5": version "2.6.5" @@ -2066,10 +2118,10 @@ resolved "https://registry.npmjs.org/@novu/headless/-/headless-2.6.5.tgz" integrity sha512-/jVFGAjobMV7d7pjAuBABggFZHUmLH6g6GslNilr79+uitPK3ZW4QWX4iQ1UPrGAbj7w6Xf4Ve3fAq7vftB1qw== dependencies: - "@novu/client" "2.6.5" - "@novu/shared" "2.6.5" "@tanstack/query-core" "^4.15.1" socket.io-client "4.7.2" + "@novu/client" "2.6.5" + "@novu/shared" "2.6.5" "@novu/js@2.6.5": version "2.6.5" @@ -2091,25 +2143,25 @@ resolved "https://registry.npmjs.org/@novu/node/-/node-2.6.5.tgz" integrity sha512-5GQI6EkjsLNbzUOXIRGbeFNsY1+bzI8sVhoeBCJfnJ9r/elFNRSMYsgVp5dCXtzLBrp7cjMfYNdLFhp1uUNaig== dependencies: - "@novu/shared" "2.6.5" axios "^1.6.8" axios-retry "^3.8.0" handlebars "^4.7.7" lodash.get "^4.4.2" lodash.merge "^4.6.2" uuid "^9.0.1" + "@novu/shared" "2.6.5" "@novu/ntfr-client@^0.0.4": version "0.0.4" resolved "https://registry.npmjs.org/@novu/ntfr-client/-/ntfr-client-0.0.4.tgz" integrity sha512-/9q+qGFHHFwMsuqoLwTADMjSx2JPagpJpm7jOZRzQZgSEDg9kwNAhADneRzVYhMyjdEXIQyjTmX/oP8ABAavFw== dependencies: + ws "^8.11.0" + zod "3.22.3" https "^1.0.0" node-fetch "^3.3.2" partysocket "^0.0.17" proxy-agent "^6.3.0" - ws "^8.11.0" - zod "3.22.3" "@novu/react@^2.6.5": version "2.6.5" @@ -2128,7 +2180,7 @@ resolved "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz" integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== -"@opentelemetry/api@1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0", "@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8": +"@opentelemetry/api@1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0", "@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -2140,13 +2192,6 @@ dependencies: "@opentelemetry/api" "^1.0.0" -"@opentelemetry/api-logs@0.57.2": - version "0.57.2" - resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz" - integrity sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A== - dependencies: - "@opentelemetry/api" "^1.3.0" - "@opentelemetry/context-async-hooks@1.25.1": version "1.25.1" resolved "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz" @@ -2164,11 +2209,11 @@ resolved "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.52.1.tgz" integrity sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA== dependencies: - "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/sdk-logs" "0.52.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/exporter-trace-otlp-grpc@0.52.1": version "0.52.1" @@ -2177,10 +2222,10 @@ dependencies: "@grpc/grpc-js" "^1.7.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-grpc-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-grpc-exporter-base" "0.52.1" "@opentelemetry/exporter-trace-otlp-http@0.52.1": version "0.52.1" @@ -2188,10 +2233,10 @@ integrity sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg== dependencies: "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/exporter-trace-otlp-proto@0.52.1": version "0.52.1" @@ -2199,10 +2244,10 @@ integrity sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ== dependencies: "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/exporter-zipkin@1.25.1": version "1.25.1" @@ -2214,29 +2259,17 @@ "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/semantic-conventions" "1.25.1" -"@opentelemetry/instrumentation@0.52.1": +"@opentelemetry/instrumentation@0.52.1", "@opentelemetry/instrumentation@^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz" integrity sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw== dependencies: - "@opentelemetry/api-logs" "0.52.1" - "@types/shimmer" "^1.0.2" - import-in-the-middle "^1.8.1" - require-in-the-middle "^7.1.1" semver "^7.5.2" shimmer "^1.2.1" - -"@opentelemetry/instrumentation@^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0": - version "0.57.2" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz" - integrity sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg== - dependencies: - "@opentelemetry/api-logs" "0.57.2" - "@types/shimmer" "^1.2.0" + "@types/shimmer" "^1.0.2" import-in-the-middle "^1.8.1" require-in-the-middle "^7.1.1" - semver "^7.5.2" - shimmer "^1.2.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/otlp-exporter-base@0.52.1": version "0.52.1" @@ -2253,21 +2286,21 @@ dependencies: "@grpc/grpc-js" "^1.7.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/otlp-transformer@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz" integrity sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg== dependencies: - "@opentelemetry/api-logs" "0.52.1" + protobufjs "^7.3.0" "@opentelemetry/core" "1.25.1" - "@opentelemetry/resources" "1.25.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/sdk-logs" "0.52.1" + "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-metrics" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" - protobufjs "^7.3.0" "@opentelemetry/propagator-b3@1.25.1": version "1.25.1" @@ -2296,8 +2329,8 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz" integrity sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA== dependencies: - "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/core" "1.25.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-metrics@1.25.1": @@ -2305,28 +2338,28 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz" integrity sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q== dependencies: + lodash.merge "^4.6.2" "@opentelemetry/core" "1.25.1" "@opentelemetry/resources" "1.25.1" - lodash.merge "^4.6.2" "@opentelemetry/sdk-node@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz" integrity sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA== dependencies: - "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/exporter-trace-otlp-grpc" "0.52.1" - "@opentelemetry/exporter-trace-otlp-http" "0.52.1" - "@opentelemetry/exporter-trace-otlp-proto" "0.52.1" - "@opentelemetry/exporter-zipkin" "1.25.1" - "@opentelemetry/instrumentation" "0.52.1" - "@opentelemetry/resources" "1.25.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/sdk-logs" "0.52.1" + "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-metrics" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/sdk-trace-node" "1.25.1" + "@opentelemetry/exporter-zipkin" "1.25.1" + "@opentelemetry/instrumentation" "0.52.1" "@opentelemetry/semantic-conventions" "1.25.1" + "@opentelemetry/exporter-trace-otlp-grpc" "0.52.1" + "@opentelemetry/exporter-trace-otlp-http" "0.52.1" + "@opentelemetry/exporter-trace-otlp-proto" "0.52.1" "@opentelemetry/sdk-trace-base@1.25.1": version "1.25.1" @@ -2342,13 +2375,13 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz" integrity sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ== dependencies: - "@opentelemetry/context-async-hooks" "1.25.1" + semver "^7.5.2" "@opentelemetry/core" "1.25.1" "@opentelemetry/propagator-b3" "1.25.1" - "@opentelemetry/propagator-jaeger" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" - semver "^7.5.2" - + "@opentelemetry/propagator-jaeger" "1.25.1" + "@opentelemetry/context-async-hooks" "1.25.1" + "@opentelemetry/semantic-conventions@1.25.1": version "1.25.1" resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz" @@ -2489,9 +2522,9 @@ resolved "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz" integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== dependencies: - "@pnpm/config.env-replace" "^1.1.0" - "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" + "@pnpm/network.ca-file" "^1.0.1" + "@pnpm/config.env-replace" "^1.1.0" "@popperjs/core@^2.11.8", "@popperjs/core@^2.9.0": version "2.11.8" @@ -2499,70 +2532,70 @@ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@prisma/adapter-neon@^6.3.1": - version "6.3.1" - resolved "https://registry.npmjs.org/@prisma/adapter-neon/-/adapter-neon-6.3.1.tgz" - integrity sha512-yDCeqQ0EYT/DBL6G2uh01IlVrCr9Jli6SXa1yvdl/Kq4O/Hjj1i+Oxg4FskHVStLvlo6bqNxEFtLEuFCLCXG1A== + version "6.4.0" + resolved "https://registry.npmjs.org/@prisma/adapter-neon/-/adapter-neon-6.4.0.tgz" + integrity sha512-iRaNmzESQLltEb51hv9jChNFnUDx4VbDvpcyI25kLYwh/RJJR18KjtYCrq4WX22ruFxatlXKXKGZ/XS+bOY2kQ== dependencies: - "@prisma/driver-adapter-utils" "6.3.1" postgres-array "3.0.2" + "@prisma/driver-adapter-utils" "6.4.0" "@prisma/client@>=2.26.0 || >=3 || >=4 || >=5", "@prisma/client@>=4.16.1", "@prisma/client@^6.3.1": - version "6.3.1" - resolved "https://registry.npmjs.org/@prisma/client/-/client-6.3.1.tgz" - integrity sha512-ARAJaPs+eBkemdky/XU3cvGRl+mIPHCN2lCXsl5Vlb0E2gV+R6IN7aCI8CisRGszEZondwIsW9Iz8EJkTdykyA== + version "6.4.0" + resolved "https://registry.npmjs.org/@prisma/client/-/client-6.4.0.tgz" + integrity sha512-48tLb+VL7iuuqJXjD4Xbqa622fuh8UtqmjTf39AKrQjlTUdNaMc9sC/c49eXQkcnrAdh9FoS1qVupmZSYiZ9TQ== -"@prisma/debug@6.3.1": - version "6.3.1" - resolved "https://registry.npmjs.org/@prisma/debug/-/debug-6.3.1.tgz" - integrity sha512-RrEBkd+HLZx+ydfmYT0jUj7wjLiS95wfTOSQ+8FQbvb6vHh5AeKfEPt/XUQ5+Buljj8hltEfOslEW57/wQIVeA== +"@prisma/debug@6.4.0": + version "6.4.0" + resolved "https://registry.npmjs.org/@prisma/debug/-/debug-6.4.0.tgz" + integrity sha512-zXsLpNXLypdThJjItqk0u/3uitcD9+9rNynZPPu4Xp7664yp8VbxCGTVBS696vA0e3kw0Xv/4muR+cNHkxspcw== -"@prisma/driver-adapter-utils@6.3.1": - version "6.3.1" - resolved "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-6.3.1.tgz" - integrity sha512-Z30oSnSFYlzU/Z96lfApqd42EzSXwxj7iPD34iGdZ+fecGlOO9WaBY2tlzCdt7sdhxIxNGEL8tD1o4EHX8tLNA== +"@prisma/driver-adapter-utils@6.4.0": + version "6.4.0" + resolved "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-6.4.0.tgz" + integrity sha512-lfDUpSAyhmn3JBAoxpT/FAPl5bB+8qF39hA13KvwH0mBBxTzsI7mWZ/Jv4OFnCjeXSjPtxqUJLkPAdVuSK9g1g== dependencies: - "@prisma/debug" "6.3.1" + "@prisma/debug" "6.4.0" -"@prisma/engines@6.3.1": - version "6.3.1" - resolved "https://registry.npmjs.org/@prisma/engines/-/engines-6.3.1.tgz" - integrity sha512-sXdqEVLyGAJ5/iUoG/Ea5AdHMN71m6PzMBWRQnLmhhOejzqAaEr8rUd623ql6OJpED4s/U4vIn4dg1qkF7vGag== +"@prisma/engines@6.4.0": + version "6.4.0" + resolved "https://registry.npmjs.org/@prisma/engines/-/engines-6.4.0.tgz" + integrity sha512-SeUigmWj0uhnSjYKWkG//Gzj4XHy6bi1TXgTZ+pPujxGELJgOvecgaA/bHmWokyHPnbYWRaoSwQDxPjihYzSZg== dependencies: - "@prisma/debug" "6.3.1" - "@prisma/engines-version" "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0" - "@prisma/fetch-engine" "6.3.1" - "@prisma/get-platform" "6.3.1" + "@prisma/engines-version" "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d" + "@prisma/debug" "6.4.0" + "@prisma/fetch-engine" "6.4.0" + "@prisma/get-platform" "6.4.0" -"@prisma/engines-version@6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0": - version "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0" - resolved "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0.tgz" - integrity sha512-R/ZcMuaWZT2UBmgX3Ko6PAV3f8//ZzsjRIG1eKqp3f2rqEqVtCv+mtzuH2rBPUC9ujJ5kCb9wwpxeyCkLcHVyA== +"@prisma/engines-version@6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d": + version "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d" + resolved "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d.tgz" + integrity sha512-Xq54qw55vaCGrGgIJqyDwOq0TtjZPJEWsbQAHugk99hpDf2jcEeQhUcF+yzEsSqegBaDNLA4IC8Nn34sXmkiTQ== "@prisma/extension-accelerate@^1.2.2": version "1.2.2" resolved "https://registry.npmjs.org/@prisma/extension-accelerate/-/extension-accelerate-1.2.2.tgz" integrity sha512-LOlfkG6If+o8PFRzLzp26ackP/d+j2HrkTJaxuV/Wd+sdAHz/AkmzEDGbo2UpHFpxEM9hWMBe3ScSwUKYUDOXg== -"@prisma/fetch-engine@6.3.1": - version "6.3.1" - resolved "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.3.1.tgz" - integrity sha512-HOf/0umOgt+/S2xtZze+FHKoxpVg4YpVxROr6g2YG09VsI3Ipyb+rGvD6QGbCqkq5NTWAAZoOGNL+oy7t+IhaQ== +"@prisma/fetch-engine@6.4.0": + version "6.4.0" + resolved "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.4.0.tgz" + integrity sha512-CN/Qb/+n+15gfhN0ipeUcGu/oGw7HIwVw4DCKD11190dneVGpa+n0wxwXTFJlV0vkAeSBSkQ3y1ugKAa5s/VPg== dependencies: - "@prisma/debug" "6.3.1" - "@prisma/engines-version" "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0" - "@prisma/get-platform" "6.3.1" + "@prisma/engines-version" "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d" + "@prisma/debug" "6.4.0" + "@prisma/get-platform" "6.4.0" -"@prisma/get-platform@6.3.1": - version "6.3.1" - resolved "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.3.1.tgz" - integrity sha512-AYLq6Hk9xG73JdLWJ3Ip9Wg/vlP7xPvftGBalsPzKDOHr/ImhwJ09eS8xC2vNT12DlzGxhfk8BkL0ve2OriNhQ== +"@prisma/get-platform@6.4.0": + version "6.4.0" + resolved "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.4.0.tgz" + integrity sha512-khANH9QbCRhFWiGj3qmR0clxLTU76Cimxf4JAhjhtpsc1jdG1A9geGe0kU4WAQ1YpiKFJ10s9j2wbbE/jSP99Q== dependencies: - "@prisma/debug" "6.3.1" + "@prisma/debug" "6.4.0" "@prisma/instrumentation@^6.3.1": - version "6.3.1" - resolved "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.3.1.tgz" - integrity sha512-XETCiBQYm8p/3ouNs0sv00MqjeYYM6sge0CSgx+Oevex99cfOBPt+J6JbOPyYqYcyOd3m2j2xRlXkPUKmpuxiA== + version "6.4.0" + resolved "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.4.0.tgz" + integrity sha512-7QcoOE0DpxHaC/3Q+UTKvDCVL3Wc9C0MYHjGvMl9/LKLNI/D33CTMXJji/otWxOeRYFl6ENDB4768Og0grT9tw== dependencies: "@opentelemetry/instrumentation" "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" @@ -2628,9 +2661,9 @@ extract-zip "^2.0.1" progress "^2.0.3" proxy-agent "^6.5.0" - semver "^7.7.0" tar-fs "^3.0.8" yargs "^17.7.2" + semver "^7.7.0" "@radix-ui/number@1.1.0": version "1.1.0" @@ -2654,14 +2687,14 @@ resolved "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.3.tgz" integrity sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A== dependencies: + "@radix-ui/react-id" "1.1.0" "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-collapsible" "1.1.3" - "@radix-ui/react-collection" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-id" "1.1.0" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-collection" "1.1.2" + "@radix-ui/react-collapsible" "1.1.3" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-alert-dialog@^1.1.2": @@ -2670,11 +2703,11 @@ integrity sha512-p4XnPqgej8sZAAReCAKgz1REYZEBLR8hU9Pg27wFnCWIMc8g1ccCs0FjBcy05V15VTu8pAePw/VDYeOm/uZ6yQ== dependencies: "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-slot" "1.1.2" "@radix-ui/react-dialog" "1.1.6" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-slot" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-arrow@1.1.2": version "1.1.2" @@ -2699,37 +2732,37 @@ integrity sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw== dependencies: "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-use-size" "1.1.0" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-previous" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-collapsible@1.1.3", "@radix-ui/react-collapsible@^1.1.1": version "1.1.3" resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.3.tgz" integrity sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw== dependencies: + "@radix-ui/react-id" "1.1.0" "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-id" "1.1.0" "@radix-ui/react-presence" "1.1.2" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-collection@1.1.2": version "1.1.2" resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.2.tgz" integrity sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw== dependencies: - "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-slot" "1.1.2" "@radix-ui/react-context" "1.1.1" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-slot" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-compose-refs@1.0.0": version "1.0.0" @@ -2761,8 +2794,8 @@ integrity sha512-aUP99QZ3VU84NPsHeaFt4cQUNgJqFsLLOt/RbbWXszZ6MP0DpDyjkFZORr4RpAEx3sUBk+Kc8h13yGtC5Qw8dg== dependencies: "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-context" "1.1.1" "@radix-ui/react-menu" "2.1.6" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-primitive" "2.0.2" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-controllable-state" "1.1.0" @@ -2772,41 +2805,41 @@ resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz" integrity sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q== dependencies: + aria-hidden "^1.1.1" "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.0" - "@radix-ui/react-focus-guards" "1.0.0" - "@radix-ui/react-focus-scope" "1.0.0" "@radix-ui/react-id" "1.0.0" + "@radix-ui/primitive" "1.0.0" + react-remove-scroll "2.5.4" + "@radix-ui/react-slot" "1.0.0" "@radix-ui/react-portal" "1.0.0" + "@radix-ui/react-context" "1.0.0" "@radix-ui/react-presence" "1.0.0" "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-slot" "1.0.0" + "@radix-ui/react-focus-scope" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-focus-guards" "1.0.0" + "@radix-ui/react-dismissable-layer" "1.0.0" "@radix-ui/react-use-controllable-state" "1.0.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.4" "@radix-ui/react-dialog@1.1.6", "@radix-ui/react-dialog@^1.1.1", "@radix-ui/react-dialog@^1.1.2": version "1.1.6" resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.6.tgz" integrity sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw== dependencies: - "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.5" - "@radix-ui/react-focus-guards" "1.1.1" - "@radix-ui/react-focus-scope" "1.1.2" + aria-hidden "^1.2.4" "@radix-ui/react-id" "1.1.0" + "@radix-ui/primitive" "1.1.1" + react-remove-scroll "^2.6.3" + "@radix-ui/react-slot" "1.1.2" "@radix-ui/react-portal" "1.1.4" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-presence" "1.1.2" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-slot" "1.1.2" + "@radix-ui/react-focus-scope" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.5" "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" "@radix-ui/react-direction@1.1.0": version "1.1.0" @@ -2820,8 +2853,8 @@ dependencies: "@babel/runtime" "^7.13.10" "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" "@radix-ui/react-use-callback-ref" "1.0.0" "@radix-ui/react-use-escape-keydown" "1.0.0" @@ -2831,8 +2864,8 @@ integrity sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg== dependencies: "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-escape-keydown" "1.1.0" @@ -2841,12 +2874,12 @@ resolved "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.6.tgz" integrity sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA== dependencies: - "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" "@radix-ui/react-id" "1.1.0" + "@radix-ui/primitive" "1.1.1" "@radix-ui/react-menu" "2.1.6" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-focus-guards@1.0.0": @@ -2867,8 +2900,8 @@ integrity sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ== dependencies: "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" "@radix-ui/react-use-callback-ref" "1.0.0" "@radix-ui/react-focus-scope@1.1.2": @@ -2876,8 +2909,8 @@ resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz" integrity sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA== dependencies: - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-hover-card@^1.1.2": @@ -2886,13 +2919,13 @@ integrity sha512-E4ozl35jq0VRlrdc4dhHrNSV0JqBb4Jy73WAhBEK7JoYnQ83ED5r0Rb/XdVKw89ReAJN38N492BAPBZQ57VmqQ== dependencies: "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.5" "@radix-ui/react-popper" "1.2.2" "@radix-ui/react-portal" "1.1.4" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-presence" "1.1.2" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.5" "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-icons@^1.3.0": @@ -2927,81 +2960,81 @@ resolved "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.6.tgz" integrity sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg== dependencies: - "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-collection" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.5" - "@radix-ui/react-focus-guards" "1.1.1" - "@radix-ui/react-focus-scope" "1.1.2" + aria-hidden "^1.2.4" "@radix-ui/react-id" "1.1.0" + "@radix-ui/primitive" "1.1.1" + react-remove-scroll "^2.6.3" + "@radix-ui/react-slot" "1.1.2" "@radix-ui/react-popper" "1.2.2" "@radix-ui/react-portal" "1.1.4" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-collection" "1.1.2" + "@radix-ui/react-focus-scope" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" "@radix-ui/react-roving-focus" "1.1.2" - "@radix-ui/react-slot" "1.1.2" "@radix-ui/react-use-callback-ref" "1.1.0" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" + "@radix-ui/react-dismissable-layer" "1.1.5" "@radix-ui/react-navigation-menu@^1.2.1": version "1.2.5" resolved "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.5.tgz" integrity sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA== dependencies: + "@radix-ui/react-id" "1.1.0" "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-collection" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.5" - "@radix-ui/react-id" "1.1.0" "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-collection" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-previous" "1.1.0" "@radix-ui/react-visually-hidden" "1.1.2" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.5" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-popover@^1.1.2": version "1.1.6" resolved "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.6.tgz" integrity sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg== dependencies: - "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.5" - "@radix-ui/react-focus-guards" "1.1.1" - "@radix-ui/react-focus-scope" "1.1.2" + aria-hidden "^1.2.4" "@radix-ui/react-id" "1.1.0" + "@radix-ui/primitive" "1.1.1" + react-remove-scroll "^2.6.3" + "@radix-ui/react-slot" "1.1.2" "@radix-ui/react-popper" "1.2.2" "@radix-ui/react-portal" "1.1.4" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-presence" "1.1.2" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-slot" "1.1.2" + "@radix-ui/react-focus-scope" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.5" "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" "@radix-ui/react-popper@1.2.2": version "1.2.2" resolved "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz" integrity sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA== dependencies: - "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/rect" "1.1.0" "@radix-ui/react-arrow" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.1" + "@floating-ui/react-dom" "^2.0.0" "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-use-rect" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" - "@radix-ui/react-use-rect" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" - "@radix-ui/rect" "1.1.0" "@radix-ui/react-portal@1.0.0": version "1.0.0" @@ -3065,28 +3098,28 @@ integrity sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA== dependencies: "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-roving-focus" "1.1.2" - "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-use-previous" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-roving-focus@1.1.2": version "1.1.2" resolved "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz" integrity sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw== dependencies: + "@radix-ui/react-id" "1.1.0" "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-collection" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-id" "1.1.0" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-collection" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-controllable-state" "1.1.0" @@ -3097,11 +3130,11 @@ dependencies: "@radix-ui/number" "1.1.0" "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" @@ -3110,27 +3143,27 @@ resolved "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.6.tgz" integrity sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg== dependencies: + aria-hidden "^1.2.4" "@radix-ui/number" "1.1.0" - "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-collection" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.5" - "@radix-ui/react-focus-guards" "1.1.1" - "@radix-ui/react-focus-scope" "1.1.2" "@radix-ui/react-id" "1.1.0" + "@radix-ui/primitive" "1.1.1" + react-remove-scroll "^2.6.3" + "@radix-ui/react-slot" "1.1.2" "@radix-ui/react-popper" "1.2.2" "@radix-ui/react-portal" "1.1.4" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-slot" "1.1.2" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-collection" "1.1.2" + "@radix-ui/react-focus-scope" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" "@radix-ui/react-use-previous" "1.1.0" "@radix-ui/react-visually-hidden" "1.1.2" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.5" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-separator@^1.1.0": version "1.1.2" @@ -3146,15 +3179,15 @@ dependencies: "@radix-ui/number" "1.1.0" "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-collection" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-use-size" "1.1.0" "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-collection" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-previous" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-slot@1.0.0": version "1.0.0" @@ -3177,23 +3210,23 @@ integrity sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ== dependencies: "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-use-size" "1.1.0" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-previous" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-tabs@^1.1.1": version "1.1.3" resolved "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz" integrity sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng== dependencies: + "@radix-ui/react-id" "1.1.0" "@radix-ui/primitive" "1.1.1" "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-id" "1.1.0" "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-direction" "1.1.0" "@radix-ui/react-primitive" "2.0.2" "@radix-ui/react-roving-focus" "1.1.2" "@radix-ui/react-use-controllable-state" "1.1.0" @@ -3204,35 +3237,35 @@ integrity sha512-gN4dpuIVKEgpLn1z5FhzT9mYRUitbfZq9XqN/7kkBMUgFTzTG8x/KszWJugJXHcwxckY8xcKDZPz7kG3o6DsUA== dependencies: "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-collection" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.5" "@radix-ui/react-portal" "1.1.4" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-presence" "1.1.2" "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-collection" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-visually-hidden" "1.1.2" "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.5" "@radix-ui/react-use-layout-effect" "1.1.0" - "@radix-ui/react-visually-hidden" "1.1.2" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-tooltip@^1.1.3": version "1.1.8" resolved "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz" integrity sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA== dependencies: - "@radix-ui/primitive" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.1" - "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.5" "@radix-ui/react-id" "1.1.0" + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-slot" "1.1.2" "@radix-ui/react-popper" "1.2.2" "@radix-ui/react-portal" "1.1.4" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-presence" "1.1.2" "@radix-ui/react-primitive" "2.0.2" - "@radix-ui/react-slot" "1.1.2" - "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-visually-hidden" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.5" + "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-use-callback-ref@1.0.0": version "1.0.0" @@ -3351,26 +3384,26 @@ resolved "https://registry.npmjs.org/@react-email/components/-/components-0.0.31.tgz" integrity sha512-rQsTY9ajobncix9raexhBjC7O6cXUMc87eNez2gnB1FwtkUO8DqWZcktbtwOJi7GKmuAPTx0o/IOFtiBNXziKA== dependencies: + "@react-email/hr" "0.0.11" + "@react-email/img" "0.0.11" + "@react-email/row" "0.0.12" "@react-email/body" "0.0.11" - "@react-email/button" "0.0.19" - "@react-email/code-block" "0.0.11" - "@react-email/code-inline" "0.0.5" - "@react-email/column" "0.0.13" - "@react-email/container" "0.0.15" "@react-email/font" "0.0.9" "@react-email/head" "0.0.12" - "@react-email/heading" "0.0.15" - "@react-email/hr" "0.0.11" "@react-email/html" "0.0.11" - "@react-email/img" "0.0.11" "@react-email/link" "0.0.12" - "@react-email/markdown" "0.0.14" - "@react-email/preview" "0.0.12" + "@react-email/text" "0.0.11" + "@react-email/button" "0.0.19" + "@react-email/column" "0.0.13" "@react-email/render" "1.0.3" - "@react-email/row" "0.0.12" + "@react-email/heading" "0.0.15" + "@react-email/preview" "0.0.12" "@react-email/section" "0.0.16" + "@react-email/markdown" "0.0.14" "@react-email/tailwind" "1.0.4" - "@react-email/text" "0.0.11" + "@react-email/container" "0.0.15" + "@react-email/code-block" "0.0.11" + "@react-email/code-inline" "0.0.5" "@react-email/container@0.0.15": version "0.0.15" @@ -3429,18 +3462,18 @@ resolved "https://registry.npmjs.org/@react-email/render/-/render-0.0.10.tgz" integrity sha512-FdLhg/E5PH5qZU/jf9NbvRi5v5134kbX7o8zIhOJIk/TALxB18ggprnH5tQX96dGQFqlLob8OLReaRwrpEF7YA== dependencies: - html-to-text "9.0.5" - pretty "2.0.0" react "18.2.0" + pretty "2.0.0" react-dom "18.2.0" + html-to-text "9.0.5" "@react-email/render@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@react-email/render/-/render-1.0.1.tgz" integrity sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA== dependencies: - html-to-text "9.0.5" js-beautify "^1.14.11" + html-to-text "9.0.5" react-promise-suspense "0.3.4" "@react-email/render@1.0.3": @@ -3448,8 +3481,8 @@ resolved "https://registry.npmjs.org/@react-email/render/-/render-1.0.3.tgz" integrity sha512-VQ8g4SuIq/jWdfBTdTjb7B8Np0jj+OoD7VebfdHhLTZzVQKesR2aigpYqE/ZXmwj4juVxDm8T2b6WIIu48rPCg== dependencies: - html-to-text "9.0.5" prettier "3.3.3" + html-to-text "9.0.5" react-promise-suspense "0.3.4" "@react-email/row@0.0.12": @@ -3478,9 +3511,9 @@ integrity sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg== "@rollup/rollup-darwin-arm64@^4.18.1": - version "4.34.7" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.7.tgz" - integrity sha512-jq87CjmgL9YIKvs8ybtIC98s/M3HdbqXhllcy9EdLV0yMg1DpxES2gr65nNy7ObNo/vZ/MrOTxt0bE5LinL6mA== + version "4.34.8" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz" + integrity sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q== "@scena/dragscroll@^1.4.0": version "1.4.0" @@ -3509,10 +3542,10 @@ resolved "https://registry.npmjs.org/@segment/analytics-core/-/analytics-core-1.4.1.tgz" integrity sha512-kV0Pf33HnthuBOVdYNani21kYyj118Fn+9757bxqoksiXoZlYvBsFq6giNdCsKcTIE1eAMqNDq3xE1VQ0cfsHA== dependencies: - "@lukeed/uuid" "^2.0.0" - "@segment/analytics-generic-utils" "1.1.1" dset "^3.1.2" tslib "^2.4.1" + "@lukeed/uuid" "^2.0.0" + "@segment/analytics-generic-utils" "1.1.1" "@segment/analytics-generic-utils@1.1.1": version "1.1.1" @@ -3526,12 +3559,12 @@ resolved "https://registry.npmjs.org/@segment/analytics-node/-/analytics-node-1.3.0.tgz" integrity sha512-lRLz1WZaDokMoUe299yP5JkInc3OgJuqNNlxb6j0q22umCiq6b5iDo2gRmFn93reirIvJxWIicQsGrHd93q8GQ== dependencies: + tslib "^2.4.1" + buffer "^6.0.3" + node-fetch "^2.6.7" "@lukeed/uuid" "^2.0.0" "@segment/analytics-core" "1.4.1" "@segment/analytics-generic-utils" "1.1.1" - buffer "^6.0.3" - node-fetch "^2.6.7" - tslib "^2.4.1" "@selderee/plugin-htmlparser2@^0.11.0": version "0.11.0" @@ -3541,12 +3574,12 @@ domhandler "^5.0.3" selderee "^0.11.0" -"@simplewebauthn/browser@^13.0.0", "@simplewebauthn/browser@^9.0.1": +"@simplewebauthn/browser@^13.0.0": version "13.1.0" resolved "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.1.0.tgz" integrity sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg== -"@simplewebauthn/server@^13.0.0", "@simplewebauthn/server@^9.0.2": +"@simplewebauthn/server@^13.0.0": version "13.1.1" resolved "https://registry.npmjs.org/@simplewebauthn/server/-/server-13.1.1.tgz" integrity sha512-1hsLpRHfSuMB9ee2aAdh0Htza/X3f4djhYISrggqGe3xopNjOcePiSDkDDoPzDYaaMCrbqGP1H2TYU7bgL9PmA== @@ -3564,20 +3597,20 @@ resolved "https://registry.npmjs.org/@slack/bolt/-/bolt-3.22.0.tgz" integrity sha512-iKDqGPEJDnrVwxSVlFW6OKTkijd7s4qLBeSufoBsTM0reTyfdp/5izIQVkxNfzjHi3o6qjdYbRXkYad5HBsBog== dependencies: - "@slack/logger" "^4.0.0" + axios "^1.7.4" + tsscmp "^1.0.6" + express "^4.21.0" + raw-body "^2.3.3" "@slack/oauth" "^2.6.3" - "@slack/socket-mode" "^1.3.6" "@slack/types" "^2.13.0" + "@slack/logger" "^4.0.0" + "@types/tsscmp" "^1.0.0" "@slack/web-api" "^6.13.0" "@types/express" "^4.16.1" - "@types/promise.allsettled" "^1.0.3" - "@types/tsscmp" "^1.0.0" - axios "^1.7.4" - express "^4.21.0" path-to-regexp "^8.1.0" + "@slack/socket-mode" "^1.3.6" promise.allsettled "^1.0.2" - raw-body "^2.3.3" - tsscmp "^1.0.6" + "@types/promise.allsettled" "^1.0.3" "@slack/logger@^3.0.0": version "3.0.0" @@ -3598,25 +3631,25 @@ resolved "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.3.tgz" integrity sha512-1amXs6xRkJpoH6zSgjVPgGEJXCibKNff9WNDijcejIuVy1HFAl1adh7lehaGNiHhTWfQkfKxBiF+BGn56kvoFw== dependencies: - "@slack/logger" "^3.0.0" - "@slack/web-api" "^6.12.1" - "@types/jsonwebtoken" "^8.3.7" "@types/node" ">=12" jsonwebtoken "^9.0.0" + "@slack/logger" "^3.0.0" + "@slack/web-api" "^6.12.1" lodash.isstring "^4.0.1" + "@types/jsonwebtoken" "^8.3.7" "@slack/socket-mode@^1.3.6": version "1.3.6" resolved "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.6.tgz" integrity sha512-G+im7OP7jVqHhiNSdHgv2VVrnN5U7KY845/5EZimZkrD4ZmtV0P3BiWkgeJhPtdLuM7C7i6+M6h6Bh+S4OOalA== dependencies: - "@slack/logger" "^3.0.0" - "@slack/web-api" "^6.12.1" - "@types/node" ">=12.0.0" + ws "^7.5.3" + finity "^0.5.4" "@types/ws" "^7.4.7" + "@types/node" ">=12.0.0" + "@slack/logger" "^3.0.0" eventemitter3 "^5" - finity "^0.5.4" - ws "^7.5.3" + "@slack/web-api" "^6.12.1" "@slack/types@^2.11.0", "@slack/types@^2.13.0", "@slack/types@^2.9.0": version "2.14.0" @@ -3628,35 +3661,35 @@ resolved "https://registry.npmjs.org/@slack/web-api/-/web-api-6.13.0.tgz" integrity sha512-dv65crIgdh9ZYHrevLU6XFHTQwTyDmNqEqzuIrV+Vqe/vgiG6w37oex5ePDU1RGm2IJ90H8iOvHFvzdEO/vB+g== dependencies: - "@slack/logger" "^3.0.0" - "@slack/types" "^2.11.0" - "@types/is-stream" "^1.1.0" - "@types/node" ">=12.0.0" axios "^1.7.4" - eventemitter3 "^3.1.0" - form-data "^2.5.0" - is-electron "2.2.2" - is-stream "^1.1.0" p-queue "^6.6.1" p-retry "^4.0.0" + form-data "^2.5.0" + is-stream "^1.1.0" + "@types/node" ">=12.0.0" + is-electron "2.2.2" + "@slack/types" "^2.11.0" + "@slack/logger" "^3.0.0" + eventemitter3 "^3.1.0" + "@types/is-stream" "^1.1.0" "@slack/web-api@^7.8.0": version "7.8.0" resolved "https://registry.npmjs.org/@slack/web-api/-/web-api-7.8.0.tgz" integrity sha512-d4SdG+6UmGdzWw38a4sN3lF/nTEzsDxhzU13wm10ejOpPehtmRoqBKnPztQUfFiWbNvSb4czkWYJD4kt+5+Fuw== dependencies: - "@slack/logger" "^4.0.0" - "@slack/types" "^2.9.0" - "@types/node" ">=18.0.0" - "@types/retry" "0.12.0" axios "^1.7.8" - eventemitter3 "^5.0.1" - form-data "^4.0.0" - is-electron "2.2.2" - is-stream "^2" + retry "^0.13.1" p-queue "^6" p-retry "^4" - retry "^0.13.1" + form-data "^4.0.0" + is-stream "^2" + "@types/node" ">=18.0.0" + is-electron "2.2.2" + "@slack/types" "^2.9.0" + "@types/retry" "0.12.0" + "@slack/logger" "^4.0.0" + eventemitter3 "^5.0.1" "@smithy/abort-controller@^4.0.1": version "4.0.1" @@ -3678,8 +3711,8 @@ resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz" integrity sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig== dependencies: - "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" + "@smithy/util-base64" "^4.0.0" "@smithy/config-resolver@^4.0.1": version "4.0.1" @@ -4004,9 +4037,9 @@ resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz" integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== dependencies: - "@smithy/util-buffer-from" "^4.0.0" - "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" "@smithy/util-body-length-browser@^4.0.0": version "4.0.0" @@ -4027,16 +4060,16 @@ resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz" integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== dependencies: - "@smithy/is-array-buffer" "^2.2.0" tslib "^2.6.2" + "@smithy/is-array-buffer" "^2.2.0" "@smithy/util-buffer-from@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz" integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== dependencies: - "@smithy/is-array-buffer" "^4.0.0" tslib "^2.6.2" + "@smithy/is-array-buffer" "^4.0.0" "@smithy/util-config-provider@^4.0.0": version "4.0.0" @@ -4128,16 +4161,16 @@ resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz" integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== dependencies: - "@smithy/util-buffer-from" "^2.2.0" tslib "^2.6.2" + "@smithy/util-buffer-from" "^2.2.0" "@smithy/util-utf8@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz" integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== dependencies: - "@smithy/util-buffer-from" "^4.0.0" tslib "^2.6.2" + "@smithy/util-buffer-from" "^4.0.0" "@smithy/util-waiter@^4.0.2": version "4.0.2" @@ -4218,9 +4251,9 @@ resolved "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz" integrity sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA== dependencies: + lodash.merge "^4.6.2" lodash.castarray "^4.4.0" lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" postcss-selector-parser "6.0.10" "@tanstack/query-core@^4.15.1": @@ -4228,17 +4261,17 @@ resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.36.1.tgz" integrity sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA== -"@tanstack/query-core@5.66.0": - version "5.66.0" - resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.66.0.tgz" - integrity sha512-J+JeBtthiKxrpzUu7rfIPDzhscXF2p5zE/hVdrqkACBP8Yu0M96mwJ5m/8cPPYQE9aRNvXztXHlNwIh4FEeMZw== +"@tanstack/query-core@5.66.4": + version "5.66.4" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.66.4.tgz" + integrity sha512-skM/gzNX4shPkqmdTCSoHtJAPMTtmIJNS0hE+xwTTUVYwezArCT34NMermABmBVUg5Ls5aiUXEDXfqwR1oVkcA== "@tanstack/react-query@^5.66.0": - version "5.66.0" - resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.66.0.tgz" - integrity sha512-z3sYixFQJe8hndFnXgWu7C79ctL+pI0KAelYyW+khaNJ1m22lWrhJU2QrsTcRKMuVPtoZvfBYrTStIdKo+x0Xw== + version "5.66.7" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.66.7.tgz" + integrity sha512-qd3q/tUpF2K1xItfPZddk1k/8pSXnovg41XyCqJgPoyYEirMBtB0sVEVVQ/CsAOngzgWtBPXimVf4q4kM9uO6A== dependencies: - "@tanstack/query-core" "5.66.0" + "@tanstack/query-core" "5.66.4" "@tanstack/react-table@^8.21.2": version "8.21.2" @@ -4448,62 +4481,62 @@ resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.5.tgz" integrity sha512-z9JFtqc5ZOsdQLd9vRnXfTCQ8v5ADAfRt9Nm7SqP6FUHII8E1hs38ACzf5xursmth/VonJYb5+73Pqxk1hGIPw== dependencies: - prosemirror-changeset "^2.2.1" + prosemirror-menu "^1.2.4" + prosemirror-view "^1.37.0" + prosemirror-model "^1.23.0" + prosemirror-state "^1.4.3" prosemirror-collab "^1.3.1" + prosemirror-keymap "^1.2.2" + prosemirror-tables "^1.6.3" + prosemirror-history "^1.4.1" prosemirror-commands "^1.6.2" - prosemirror-dropcursor "^1.8.1" + prosemirror-markdown "^1.13.1" + prosemirror-changeset "^2.2.1" prosemirror-gapcursor "^1.3.2" - prosemirror-history "^1.4.1" + prosemirror-transform "^1.10.2" + prosemirror-dropcursor "^1.8.1" prosemirror-inputrules "^1.4.0" - prosemirror-keymap "^1.2.2" - prosemirror-markdown "^1.13.1" - prosemirror-menu "^1.2.4" - prosemirror-model "^1.23.0" - prosemirror-schema-basic "^1.2.3" prosemirror-schema-list "^1.4.1" - prosemirror-state "^1.4.3" - prosemirror-tables "^1.6.3" + prosemirror-schema-basic "^1.2.3" prosemirror-trailing-node "^3.0.0" - prosemirror-transform "^1.10.2" - prosemirror-view "^1.37.0" "@tiptap/react@^2.11.2", "@tiptap/react@^2.11.5", "@tiptap/react@^2.9.1": version "2.11.5" resolved "https://registry.npmjs.org/@tiptap/react/-/react-2.11.5.tgz" integrity sha512-Dp8eHL1G+R/C4+QzAczyb3t1ovexEIZx9ln7SGEM+cT1KHKAw9XGPRgsp92+NQaYI+EdEb/YqoBOSzQcd18/OQ== dependencies: - "@tiptap/extension-bubble-menu" "^2.11.5" - "@tiptap/extension-floating-menu" "^2.11.5" - "@types/use-sync-external-store" "^0.0.6" fast-deep-equal "^3" use-sync-external-store "^1" + "@tiptap/extension-bubble-menu" "^2.11.5" + "@types/use-sync-external-store" "^0.0.6" + "@tiptap/extension-floating-menu" "^2.11.5" "@tiptap/starter-kit@^2.11.2", "@tiptap/starter-kit@^2.11.5", "@tiptap/starter-kit@^2.9.1": version "2.11.5" resolved "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.11.5.tgz" integrity sha512-SLI7Aj2ruU1t//6Mk8f+fqW+18uTqpdfLUJYgwu0CkqBckrkRZYZh6GVLk/02k3H2ki7QkFxiFbZrdbZdng0JA== dependencies: + "@tiptap/pm" "^2.11.5" "@tiptap/core" "^2.11.5" - "@tiptap/extension-blockquote" "^2.11.5" "@tiptap/extension-bold" "^2.11.5" - "@tiptap/extension-bullet-list" "^2.11.5" "@tiptap/extension-code" "^2.11.5" - "@tiptap/extension-code-block" "^2.11.5" - "@tiptap/extension-document" "^2.11.5" - "@tiptap/extension-dropcursor" "^2.11.5" - "@tiptap/extension-gapcursor" "^2.11.5" - "@tiptap/extension-hard-break" "^2.11.5" + "@tiptap/extension-text" "^2.11.5" + "@tiptap/extension-italic" "^2.11.5" + "@tiptap/extension-strike" "^2.11.5" "@tiptap/extension-heading" "^2.11.5" "@tiptap/extension-history" "^2.11.5" - "@tiptap/extension-horizontal-rule" "^2.11.5" - "@tiptap/extension-italic" "^2.11.5" + "@tiptap/extension-document" "^2.11.5" + "@tiptap/extension-gapcursor" "^2.11.5" "@tiptap/extension-list-item" "^2.11.5" - "@tiptap/extension-ordered-list" "^2.11.5" "@tiptap/extension-paragraph" "^2.11.5" - "@tiptap/extension-strike" "^2.11.5" - "@tiptap/extension-text" "^2.11.5" + "@tiptap/extension-blockquote" "^2.11.5" + "@tiptap/extension-code-block" "^2.11.5" + "@tiptap/extension-dropcursor" "^2.11.5" + "@tiptap/extension-hard-break" "^2.11.5" "@tiptap/extension-text-style" "^2.11.5" - "@tiptap/pm" "^2.11.5" + "@tiptap/extension-bullet-list" "^2.11.5" + "@tiptap/extension-ordered-list" "^2.11.5" + "@tiptap/extension-horizontal-rule" "^2.11.5" "@tiptap/suggestion@^2.11.2": version "2.11.5" @@ -4530,32 +4563,32 @@ resolved "https://registry.npmjs.org/@trigger.dev/core/-/core-3.3.13.tgz" integrity sha512-3VU4YMS+RVCkfVXeUKSWlkVszgFK44tIknR9sHLYgetI714L3tgH47XBXJ3+/ZV5Y9Vvv6O6pRIuV7EEhzbexg== dependencies: - "@electric-sql/client" "1.0.0-beta.1" - "@google-cloud/precise-date" "^4.0.0" + zod "3.23.8" + jose "^5.4.0" + execa "^8.0.1" + dequal "^2.0.3" + nanoid "^3.3.4" + superjson "^2.2.1" + zod-error "1.5.0" + eventsource "^3.0.5" "@jsonhero/path" "^1.0.21" + socket.io-client "4.7.5" + humanize-duration "^3.27.3" "@opentelemetry/api" "1.9.0" + eventsource-parser "^3.0.0" + "@electric-sql/client" "1.0.0-beta.1" + zod-validation-error "^1.5.0" "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/exporter-logs-otlp-http" "0.52.1" - "@opentelemetry/exporter-trace-otlp-http" "0.52.1" - "@opentelemetry/instrumentation" "0.52.1" - "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-logs" "0.52.1" "@opentelemetry/sdk-node" "0.52.1" + "@opentelemetry/resources" "1.25.1" + "@google-cloud/precise-date" "^4.0.0" "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/sdk-trace-node" "1.25.1" + "@opentelemetry/instrumentation" "0.52.1" "@opentelemetry/semantic-conventions" "1.25.1" - dequal "^2.0.3" - eventsource "^3.0.5" - eventsource-parser "^3.0.0" - execa "^8.0.1" - humanize-duration "^3.27.3" - jose "^5.4.0" - nanoid "^3.3.4" - socket.io-client "4.7.5" - superjson "^2.2.1" - zod "3.23.8" - zod-error "1.5.0" - zod-validation-error "^1.5.0" + "@opentelemetry/exporter-logs-otlp-http" "0.52.1" + "@opentelemetry/exporter-trace-otlp-http" "0.52.1" "@trigger.dev/core@3.3.16", "@trigger.dev/core@^3.3.16": version "3.3.16" @@ -4602,19 +4635,19 @@ resolved "https://registry.npmjs.org/@trigger.dev/sdk/-/sdk-3.3.13.tgz" integrity sha512-iXtHMnzvzmPfBk7+whpWOElBJt6viCoA3r8xgrrrurj8oxjIVe4UvdDiB7wbUJJ44WROWEb0wVKyQut1L/FwQQ== dependencies: - "@opentelemetry/api" "1.9.0" - "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/semantic-conventions" "1.25.1" - "@trigger.dev/core" "3.3.13" - chalk "^5.2.0" - cronstrue "^2.21.0" - debug "^4.3.4" + ws "^8.11.0" evt "^2.4.13" slug "^6.0.0" - terminal-link "^3.0.0" ulid "^2.3.0" uuid "^9.0.0" - ws "^8.11.0" + chalk "^5.2.0" + debug "^4.3.4" + cronstrue "^2.21.0" + terminal-link "^3.0.0" + "@trigger.dev/core" "3.3.13" + "@opentelemetry/api" "1.9.0" + "@opentelemetry/api-logs" "0.52.1" + "@opentelemetry/semantic-conventions" "1.25.1" "@trigger.dev/sdk@3.3.16", "@trigger.dev/sdk@^3.3.15": version "3.3.16" @@ -4651,8 +4684,8 @@ resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: - "@types/connect" "*" "@types/node" "*" + "@types/connect" "*" "@types/connect@*": version "3.4.38" @@ -4685,36 +4718,36 @@ resolved "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz" integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== dependencies: - "@types/d3-array" "*" + "@types/d3-dsv" "*" + "@types/d3-geo" "*" "@types/d3-axis" "*" - "@types/d3-brush" "*" - "@types/d3-chord" "*" - "@types/d3-color" "*" - "@types/d3-contour" "*" - "@types/d3-delaunay" "*" - "@types/d3-dispatch" "*" "@types/d3-drag" "*" - "@types/d3-dsv" "*" "@types/d3-ease" "*" + "@types/d3-path" "*" + "@types/d3-time" "*" + "@types/d3-zoom" "*" + "@types/d3-array" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" "@types/d3-fetch" "*" "@types/d3-force" "*" + "@types/d3-scale" "*" + "@types/d3-shape" "*" + "@types/d3-timer" "*" "@types/d3-format" "*" - "@types/d3-geo" "*" - "@types/d3-hierarchy" "*" - "@types/d3-interpolate" "*" - "@types/d3-path" "*" + "@types/d3-random" "*" + "@types/d3-contour" "*" "@types/d3-polygon" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" "@types/d3-quadtree" "*" - "@types/d3-random" "*" - "@types/d3-scale" "*" - "@types/d3-scale-chromatic" "*" + "@types/d3-hierarchy" "*" "@types/d3-selection" "*" - "@types/d3-shape" "*" - "@types/d3-time" "*" - "@types/d3-time-format" "*" - "@types/d3-timer" "*" "@types/d3-transition" "*" - "@types/d3-zoom" "*" + "@types/d3-interpolate" "*" + "@types/d3-time-format" "*" + "@types/d3-scale-chromatic" "*" "@types/d3-array@*", "@types/d3-array@^3.0.3": version "3.2.1" @@ -4750,8 +4783,8 @@ resolved "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz" integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== dependencies: - "@types/d3-array" "*" "@types/geojson" "*" + "@types/d3-array" "*" "@types/d3-delaunay@*": version "6.0.4" @@ -4887,8 +4920,8 @@ resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz" integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== dependencies: - "@types/d3-interpolate" "*" "@types/d3-selection" "*" + "@types/d3-interpolate" "*" "@types/debug@^4.0.0": version "4.1.12" @@ -4919,20 +4952,20 @@ resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" + "@types/body-parser" "*" "@types/serve-static" "*" + "@types/express-serve-static-core" "^4.17.33" "@types/express-serve-static-core@^4.17.33": version "4.19.6" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz" integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: - "@types/node" "*" "@types/qs" "*" - "@types/range-parser" "*" + "@types/node" "*" "@types/send" "*" + "@types/range-parser" "*" "@types/geojson@*": version "7946.0.16" @@ -4980,8 +5013,8 @@ resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz" integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== dependencies: - "@types/linkify-it" "^5" "@types/mdurl" "^2" + "@types/linkify-it" "^5" "@types/mdast@^4.0.0": version "4.0.4" @@ -5024,17 +5057,17 @@ resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz" integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== dependencies: - "@types/node" "*" form-data "^4.0.0" + "@types/node" "*" "@types/pg@8.11.6": version "8.11.6" resolved "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz" integrity sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ== dependencies: + pg-types "^4.0.1" "@types/node" "*" pg-protocol "*" - pg-types "^4.0.1" "@types/promise.allsettled@^1.0.3": version "1.0.6" @@ -5056,21 +5089,14 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react@^16.8.0 || ^17.0.0 || ^18.0.0": - version "19.0.8" - resolved "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz" - integrity sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw== - dependencies: - csstype "^3.0.2" - -"@types/react@*", "@types/react@19.0.10", "@types/react@>=16.8", "@types/react@>=17.0.0", "@types/react@>=18", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^19.0.0", "@types/react@^19.0.8": +"@types/react@*", "@types/react@19.0.10", "@types/react@>=18", "@types/react@^19.0.0", "@types/react@^19.0.8": version "19.0.10" resolved "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz" integrity sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g== dependencies: csstype "^3.0.2" -"@types/react-dom@*", "@types/react-dom@19.0.4", "@types/react-dom@^19.0.0", "@types/react-dom@^19.0.3": +"@types/react-dom@19.0.4", "@types/react-dom@^19.0.0", "@types/react-dom@^19.0.3": version "19.0.4" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz" integrity sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg== @@ -5098,11 +5124,11 @@ resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz" integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: - "@types/http-errors" "*" "@types/node" "*" "@types/send" "*" + "@types/http-errors" "*" -"@types/shimmer@^1.0.2", "@types/shimmer@^1.2.0": +"@types/shimmer@^1.0.2": version "1.2.0" resolved "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz" integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg== @@ -5169,17 +5195,17 @@ integrity sha512-EB0o0a4y++UJFMLqS8LDVhSQgXUllG6t5fwl5cbmOM0Uay8YY5Nc/JjFwzJ8wccdIKz4oYwQW7EOSfUyaMPbfw== "@uploadthing/react@^7.2.0": - version "7.2.1" - resolved "https://registry.npmjs.org/@uploadthing/react/-/react-7.2.1.tgz" - integrity sha512-X8iUJDOFyT9DonfZkxx3ngWvr4iz47tmXT7pC0209YT+Odfmq/sd/a0w7UcFrCiYIV1CL0xD97ynRDTN3LX48Q== + version "7.3.0" + resolved "https://registry.npmjs.org/@uploadthing/react/-/react-7.3.0.tgz" + integrity sha512-rSH9BpPy2/G7nZ3SEbZQANUFHkBCS5CwWiVzmOW9fzFNoqF+buqBvi5FDweffqMSwmr+/VS8Wpyj87/GYbV0Fw== dependencies: - "@uploadthing/shared" "7.1.6" + "@uploadthing/shared" "7.1.7" file-selector "0.6.0" -"@uploadthing/shared@7.1.6": - version "7.1.6" - resolved "https://registry.npmjs.org/@uploadthing/shared/-/shared-7.1.6.tgz" - integrity sha512-7EyTxaGiTIdyqCwNQFryo0LR4eZgyClq31igrjGrXHkxSlXnurphybjzB6AVD73UBPVGCfbtOK0lloduhsMNlg== +"@uploadthing/shared@7.1.7": + version "7.1.7" + resolved "https://registry.npmjs.org/@uploadthing/shared/-/shared-7.1.7.tgz" + integrity sha512-VDvGmyHhdwaivC+eee77yZnOVvz59mOmLVbcuYFo4SkoNvPuc3AyPORqJJMBveQivTvELdrQcjlx6IPv98JkSA== dependencies: "@uploadthing/mime-types" "0.3.4" effect "3.12.0" @@ -5212,18 +5238,18 @@ integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== dependencies: "@babel/parser" "^7.25.3" - "@vue/shared" "3.5.13" entities "^4.5.0" estree-walker "^2.0.2" source-map-js "^1.2.0" + "@vue/shared" "3.5.13" "@vue/compiler-dom@3.5.13": version "3.5.13" resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz" integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== dependencies: - "@vue/compiler-core" "3.5.13" "@vue/shared" "3.5.13" + "@vue/compiler-core" "3.5.13" "@vue/compiler-sfc@3.5.13": version "3.5.13" @@ -5231,22 +5257,22 @@ integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== dependencies: "@babel/parser" "^7.25.3" - "@vue/compiler-core" "3.5.13" - "@vue/compiler-dom" "3.5.13" - "@vue/compiler-ssr" "3.5.13" - "@vue/shared" "3.5.13" estree-walker "^2.0.2" magic-string "^0.30.11" postcss "^8.4.48" source-map-js "^1.2.0" + "@vue/compiler-core" "3.5.13" + "@vue/shared" "3.5.13" + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-ssr" "3.5.13" "@vue/compiler-ssr@3.5.13": version "3.5.13" resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz" integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA== dependencies: - "@vue/compiler-dom" "3.5.13" "@vue/shared" "3.5.13" + "@vue/compiler-dom" "3.5.13" "@vue/reactivity@3.5.13": version "3.5.13" @@ -5260,26 +5286,26 @@ resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz" integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw== dependencies: - "@vue/reactivity" "3.5.13" "@vue/shared" "3.5.13" + "@vue/reactivity" "3.5.13" "@vue/runtime-dom@3.5.13": version "3.5.13" resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz" integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog== dependencies: - "@vue/reactivity" "3.5.13" - "@vue/runtime-core" "3.5.13" - "@vue/shared" "3.5.13" csstype "^3.1.3" + "@vue/shared" "3.5.13" + "@vue/runtime-core" "3.5.13" + "@vue/reactivity" "3.5.13" "@vue/server-renderer@3.5.13": version "3.5.13" resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz" integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA== dependencies: - "@vue/compiler-ssr" "3.5.13" "@vue/shared" "3.5.13" + "@vue/compiler-ssr" "3.5.13" "@vue/shared@3.5.13": version "3.5.13" @@ -5348,19 +5374,19 @@ ai@^3.4.33: resolved "https://registry.npmjs.org/ai/-/ai-3.4.33.tgz" integrity sha512-plBlrVZKwPoRTmM8+D1sJac9Bq8eaa2jiZlHLZIWekKWI1yMWYZvCCEezY9ASPwRhULYDJB2VhKOBUUeg3S5JQ== dependencies: - "@ai-sdk/provider" "0.0.26" - "@ai-sdk/provider-utils" "1.0.22" + "@ai-sdk/vue" "0.0.59" + json-schema "^0.4.0" "@ai-sdk/react" "0.0.70" "@ai-sdk/solid" "0.0.54" + jsondiffpatch "0.6.0" "@ai-sdk/svelte" "0.0.57" + "@ai-sdk/provider" "0.0.26" "@ai-sdk/ui-utils" "0.0.50" - "@ai-sdk/vue" "0.0.59" + secure-json-parse "^2.7.0" "@opentelemetry/api" "1.9.0" eventsource-parser "1.1.2" - json-schema "^0.4.0" - jsondiffpatch "0.6.0" - secure-json-parse "^2.7.0" zod-to-json-schema "^3.23.3" + "@ai-sdk/provider-utils" "1.0.22" ai@^4.1.41: version "4.1.41" @@ -5379,10 +5405,10 @@ ajv@^6.12.3: resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: + uri-js "^4.2.2" fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + fast-json-stable-stringify "^2.0.0" ansi-escapes@^4.2.1: version "4.3.2" @@ -5435,8 +5461,8 @@ anymatch@~3.1.2: resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - normalize-path "^3.0.0" picomatch "^2.0.4" + normalize-path "^3.0.0" aproba@^1.0.3: version "1.2.0" @@ -5615,9 +5641,9 @@ axios@^1.6.8, axios@^1.7.4, axios@^1.7.8, axios@^1.7.9: resolved "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz" integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== dependencies: - follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" + follow-redirects "^1.15.6" axios-retry@^3.8.0: version "3.9.1" @@ -5647,7 +5673,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bare-events@*, bare-events@^2.0.0, bare-events@^2.2.0: +bare-events@^2.0.0, bare-events@^2.2.0: version "2.5.4" resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz" integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== @@ -5707,28 +5733,28 @@ better-auth@^1.1.18: resolved "https://registry.npmjs.org/better-auth/-/better-auth-1.1.18.tgz" integrity sha512-cU/u7/qlSiR/OO1O53gh/bHvxyB53DE+5ZOw9DtpDI8IyIQUBqDnQ06MOwNtj8JwjXHcMFNSNd5u/W8DED0bJw== dependencies: - "@better-auth/utils" "0.2.3" - "@better-fetch/fetch" "1.1.12" - "@noble/ciphers" "^0.6.0" - "@noble/hashes" "^1.6.1" - "@simplewebauthn/browser" "^13.0.0" - "@simplewebauthn/server" "^13.0.0" - better-call "0.3.3" + zod "^3.24.1" defu "^6.1.4" jose "^5.9.6" kysely "^0.27.4" nanostores "^0.11.3" - zod "^3.24.1" + better-call "0.3.3" + "@noble/hashes" "^1.6.1" + "@noble/ciphers" "^0.6.0" + "@better-auth/utils" "0.2.3" + "@better-fetch/fetch" "1.1.12" + "@simplewebauthn/server" "^13.0.0" + "@simplewebauthn/browser" "^13.0.0" better-call@0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/better-call/-/better-call-0.3.3.tgz" integrity sha512-N4lDVm0NGmFfDJ0XMQ4O83Zm/3dPlvIQdxvwvgSLSkjFX5PM4GUYSVAuxNzXN27QZMHDkrJTWUqxBrm4tPC3eA== dependencies: - "@better-fetch/fetch" "^1.1.4" + zod "^3.24.1" rou3 "^0.5.1" uncrypto "^0.1.3" - zod "^3.24.1" + "@better-fetch/fetch" "^1.1.4" binary-extensions@^2.0.0: version "2.3.0" @@ -5756,18 +5782,18 @@ body-parser@1.20.3: resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: + qs "6.13.0" + depd "2.0.0" bytes "3.1.2" - content-type "~1.0.5" debug "2.6.9" - depd "2.0.0" + unpipe "1.0.0" destroy "1.2.0" - http-errors "2.0.0" + type-is "~1.6.18" + raw-body "2.5.2" iconv-lite "0.4.24" + http-errors "2.0.0" on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" + content-type "~1.0.5" bowser@^2.11.0: version "2.11.0" @@ -5842,17 +5868,17 @@ bun@^1.2.2: resolved "https://registry.npmjs.org/bun/-/bun-1.2.2.tgz" integrity sha512-RUc8uVVTw8WoASUzXaEQJR1s7mnwoHm3P871qBUIqSaoOpuwcU+bSVX151/xoqDwnyv38SjOX7yQ3oO0IeT73g== optionalDependencies: - "@oven/bun-darwin-aarch64" "1.2.2" + "@oven/bun-linux-x64" "1.2.2" "@oven/bun-darwin-x64" "1.2.2" - "@oven/bun-darwin-x64-baseline" "1.2.2" + "@oven/bun-windows-x64" "1.2.2" "@oven/bun-linux-aarch64" "1.2.2" + "@oven/bun-darwin-aarch64" "1.2.2" + "@oven/bun-linux-x64-musl" "1.2.2" "@oven/bun-linux-aarch64-musl" "1.2.2" - "@oven/bun-linux-x64" "1.2.2" "@oven/bun-linux-x64-baseline" "1.2.2" - "@oven/bun-linux-x64-musl" "1.2.2" - "@oven/bun-linux-x64-musl-baseline" "1.2.2" - "@oven/bun-windows-x64" "1.2.2" + "@oven/bun-darwin-x64-baseline" "1.2.2" "@oven/bun-windows-x64-baseline" "1.2.2" + "@oven/bun-linux-x64-musl-baseline" "1.2.2" bundle-name@^4.1.0: version "4.1.0" @@ -5905,9 +5931,9 @@ camelcase-css@^2.0.1: integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: - version "1.0.30001699" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz" - integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== + version "1.0.30001700" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz" + integrity sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ== caseless@~0.12.0: version "0.12.0" @@ -5961,16 +5987,16 @@ chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - optionalDependencies: - fsevents "~2.3.2" dependencies: - anymatch "~3.1.2" braces "~3.0.2" + is-glob "~4.0.1" + anymatch "~3.1.2" + readdirp "~3.6.0" glob-parent "~5.1.2" is-binary-path "~2.1.0" - is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" chokidar@^4.0.1: version "4.0.3" @@ -6026,9 +6052,9 @@ cliui@^8.0.1: resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" wrap-ansi "^7.0.0" + strip-ansi "^6.0.1" + string-width "^4.2.0" clone@^1.0.2: version "1.0.4" @@ -6067,8 +6093,8 @@ color@^4.2.3: resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: - color-convert "^2.0.1" color-string "^1.9.0" + color-convert "^2.0.1" color-convert@^2.0.1: version "2.0.1" @@ -6136,8 +6162,7 @@ commander@11.1.0: version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: - "@bubba/db" "workspace:*" - devDependencies: + "@bubba/db" "packages/db" "@trigger.dev/build" "3.3.16" "@types/node" "^22.13.2" "@types/react" "19.0.10" @@ -6151,9 +6176,7 @@ commander@11.1.0: "@aws-sdk/client-s3" "^3.758.0" "@aws-sdk/s3-request-presigner" "^3.758.0" "@browserbasehq/sdk" "^2.3.0" - dependencies: - "@bubba/notifications" "workspace:*" - dependencies: + "@bubba/notifications" "packages/notifications" "@date-fns/tz" "^1.2.0" "@hookform/resolvers" "^3.10.0" "@nangohq/frontend" "^0.53.1" @@ -6244,8 +6267,8 @@ config-chain@^1.1.11, config-chain@^1.1.13: resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: - ini "^1.3.4" proto-list "~1.2.1" + ini "^1.3.4" configstore@^5.0.0: version "5.0.1" @@ -6253,11 +6276,11 @@ configstore@^5.0.0: integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== dependencies: dot-prop "^5.2.0" - graceful-fs "^4.1.2" make-dir "^3.0.0" + graceful-fs "^4.1.2" + xdg-basedir "^4.0.0" unique-string "^2.0.0" write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" @@ -6323,8 +6346,8 @@ cors@~2.8.5: resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: - object-assign "^4" vary "^1" + object-assign "^4" crelt@^1.0.0: version "1.0.6" @@ -6341,9 +6364,9 @@ cross-spawn@7.0.5, cross-spawn@^7.0.0, cross-spawn@^7.0.3: resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz" integrity sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug== dependencies: + which "^2.0.1" path-key "^3.1.0" shebang-command "^2.0.0" - which "^2.0.1" crypto@^1.0.1: version "1.0.1" @@ -6992,10 +7015,10 @@ editorconfig@^1.0.4: resolved "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz" integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q== dependencies: - "@one-ini/wasm" "0.1.1" + semver "^7.5.3" commander "^10.0.0" minimatch "9.0.1" - semver "^7.5.3" + "@one-ini/wasm" "0.1.1" ee-first@1.1.1: version "1.1.1" @@ -7010,9 +7033,9 @@ effect@3.12.0, effect@^3.12.0: fast-check "^3.23.1" electron-to-chromium@^1.5.73: - version "1.5.101" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.101.tgz" - integrity sha512-L0ISiQrP/56Acgu4/i/kfPwWSgrzYZUnQrC0+QPFuhqlLP1Ir7qzPPDVS9BcKIyWTRU8+o6CC8dKw38tSWhYIA== + version "1.5.102" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz" + integrity sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q== embla-carousel@8.5.2: version "8.5.2" @@ -7052,7 +7075,7 @@ encodeurl@~2.0.0: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.0, encoding@^0.1.13: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -7086,11 +7109,11 @@ engine.io-client@~6.5.2: resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz" integrity sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ== dependencies: - "@socket.io/component-emitter" "~3.1.0" + ws "~8.17.1" debug "~4.3.1" engine.io-parser "~5.2.1" - ws "~8.17.1" xmlhttprequest-ssl "~2.0.0" + "@socket.io/component-emitter" "~3.1.0" engine.io-parser@~5.2.1: version "5.2.3" @@ -7215,34 +7238,41 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" -esbuild@0.19.11: +esbuild@0.19.11, "esbuild@>=0.12 <1": version "0.19.11" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz" integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== optionalDependencies: "@esbuild/aix-ppc64" "0.19.11" + "@esbuild/linux-arm" "0.19.11" + "@esbuild/linux-x64" "0.19.11" + "@esbuild/sunos-x64" "0.19.11" + "@esbuild/win32-x64" "0.19.11" + "@esbuild/darwin-x64" "0.19.11" + "@esbuild/linux-ia32" "0.19.11" + "@esbuild/netbsd-x64" "0.19.11" + "@esbuild/win32-ia32" "0.19.11" "@esbuild/android-arm" "0.19.11" - "@esbuild/android-arm64" "0.19.11" "@esbuild/android-x64" "0.19.11" - "@esbuild/darwin-arm64" "0.19.11" - "@esbuild/darwin-x64" "0.19.11" - "@esbuild/freebsd-arm64" "0.19.11" "@esbuild/freebsd-x64" "0.19.11" - "@esbuild/linux-arm" "0.19.11" "@esbuild/linux-arm64" "0.19.11" - "@esbuild/linux-ia32" "0.19.11" - "@esbuild/linux-loong64" "0.19.11" - "@esbuild/linux-mips64el" "0.19.11" "@esbuild/linux-ppc64" "0.19.11" - "@esbuild/linux-riscv64" "0.19.11" "@esbuild/linux-s390x" "0.19.11" - "@esbuild/linux-x64" "0.19.11" - "@esbuild/netbsd-x64" "0.19.11" "@esbuild/openbsd-x64" "0.19.11" - "@esbuild/sunos-x64" "0.19.11" "@esbuild/win32-arm64" "0.19.11" - "@esbuild/win32-ia32" "0.19.11" - "@esbuild/win32-x64" "0.19.11" + "@esbuild/darwin-arm64" "0.19.11" + "@esbuild/android-arm64" "0.19.11" + "@esbuild/freebsd-arm64" "0.19.11" + "@esbuild/linux-loong64" "0.19.11" + "@esbuild/linux-riscv64" "0.19.11" + "@esbuild/linux-mips64el" "0.19.11" + +esbuild-register@3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== + dependencies: + debug "^4.3.4" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -7273,12 +7303,12 @@ escodegen@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - optionalDependencies: - source-map "~0.6.1" dependencies: - esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" + esprima "^4.0.1" + optionalDependencies: + source-map "~0.6.1" esm-env@^1.2.1: version "1.2.2" @@ -7291,9 +7321,9 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrap@^1.4.3: - version "1.4.4" - resolved "https://registry.npmjs.org/esrap/-/esrap-1.4.4.tgz" - integrity sha512-tDN6xP/r/b3WmdpWm7LybrD252hY52IokcycPnO+WHfhFF0+n5AWtcLLK7VNV6m0uYgVRhGVs8OkZwRyfC7HzQ== + version "1.4.5" + resolved "https://registry.npmjs.org/esrap/-/esrap-1.4.5.tgz" + integrity sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -7378,52 +7408,52 @@ execa@^8.0.1: resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" + onetime "^6.0.0" is-stream "^3.0.0" + get-stream "^8.0.1" + cross-spawn "^7.0.3" + signal-exit "^4.1.0" merge-stream "^2.0.0" npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" + human-signals "^5.0.0" strip-final-newline "^3.0.0" -express@*, express@^4.21.0: +express@^4.21.0: version "4.21.2" resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" + qs "6.13.0" depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.3.1" + send "0.19.0" + vary "~1.1.2" + debug "2.6.9" fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" + cookie "0.7.1" + accepts "~1.3.8" methods "~1.1.2" - on-finished "2.4.1" + type-is "~1.6.18" parseurl "~1.3.3" - path-to-regexp "0.1.12" + statuses "2.0.1" + encodeurl "~2.0.0" proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" + body-parser "1.20.3" + escape-html "~1.0.3" + http-errors "2.0.0" + on-finished "2.4.1" safe-buffer "5.2.1" - send "0.19.0" + utils-merge "1.0.1" + content-type "~1.0.4" + finalhandler "1.3.1" + range-parser "~1.2.1" serve-static "1.16.2" + array-flatten "1.1.1" + path-to-regexp "0.1.12" setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" + cookie-signature "1.0.6" + merge-descriptors "1.0.3" + content-disposition "0.5.4" extend@^3.0.0, extend@~3.0.2: version "3.0.2" @@ -7450,12 +7480,12 @@ extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - optionalDependencies: - "@types/yauzl" "^2.9.1" dependencies: debug "^4.1.1" get-stream "^5.1.0" yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" @@ -7494,11 +7524,11 @@ fast-glob@3.3.1: resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" merge2 "^1.3.0" micromatch "^4.0.4" + glob-parent "^5.1.2" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" fast-glob@^3.3.2, fast-glob@^3.3.3: version "3.3.3" @@ -7524,9 +7554,9 @@ fast-xml-parser@4.4.1: strnum "^1.0.5" fast-xml-parser@^4.5.1: - version "4.5.1" - resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz" - integrity sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w== + version "4.5.2" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.2.tgz" + integrity sha512-xmnYV9o0StIz/0ArdzmWTxn9oDy0lH8Z80/8X/TD2EUQKXY4DHxoT9mYBqgGIG17DgddCJtH1M6DriMbalNsAA== dependencies: strnum "^1.0.5" @@ -7544,7 +7574,7 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -fdir@^6.4.2: +fdir@^6.4.3: version "6.4.3" resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz" integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== @@ -7596,12 +7626,12 @@ finalhandler@1.3.1: integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" + unpipe "~1.0.0" + parseurl "~1.3.3" + statuses "2.0.1" encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" find-my-way-ts@^0.1.5: version "0.1.5" @@ -7665,8 +7695,8 @@ form-data@~2.3.2: integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" mime-types "^2.1.12" + combined-stream "^1.0.6" form-data@^2.5.0: version "2.5.3" @@ -7674,10 +7704,10 @@ form-data@^2.5.0: integrity sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" mime-types "^2.1.35" safe-buffer "^5.2.1" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" form-data@^4.0.0, form-data@^4.0.1: version "4.0.2" @@ -7724,18 +7754,18 @@ framer-motion@^11.18.2: resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz" integrity sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w== dependencies: + tslib "^2.4.0" motion-dom "^11.18.1" motion-utils "^11.18.1" - tslib "^2.4.0" framer-motion@^12.4.7: version "12.4.7" resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.4.7.tgz" integrity sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw== dependencies: + tslib "^2.4.0" motion-dom "^12.4.5" motion-utils "^12.0.0" - tslib "^2.4.0" framework-utils@^1.1.0: version "1.1.0" @@ -7762,10 +7792,10 @@ fstream@^1.0.0, fstream@^1.0.12: resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" mkdirp ">=0.5 0" rimraf "2" + inherits "~2.0.0" + graceful-fs "^4.1.2" function-bind@^1.1.2: version "1.1.2" @@ -7795,13 +7825,13 @@ gauge@~2.7.3: integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== dependencies: aproba "^1.0.3" - console-control-strings "^1.0.0" + strip-ansi "^3.0.1" + wide-align "^1.1.0" has-unicode "^2.0.0" - object-assign "^4.1.0" signal-exit "^3.0.0" string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" + object-assign "^4.1.0" + console-control-strings "^1.0.0" geist@^1.3.1: version "1.3.1" @@ -7920,11 +7950,11 @@ glob@^7.0.3, glob@^7.1.3: resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: - fs.realpath "^1.0.0" + once "^1.3.0" inflight "^1.0.4" inherits "2" minimatch "^3.1.1" - once "^1.3.0" + fs.realpath "^1.0.0" path-is-absolute "^1.0.0" glob@10.3.4: @@ -7932,23 +7962,23 @@ glob@10.3.4: resolved "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz" integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== dependencies: - foreground-child "^3.1.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" jackspeak "^2.0.3" minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" + foreground-child "^3.1.0" glob@^10.3.10, glob@^10.4.2: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: - foreground-child "^3.1.0" + minipass "^7.1.2" jackspeak "^3.1.2" minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" path-scurry "^1.11.1" + foreground-child "^3.1.0" + package-json-from-dist "^1.0.0" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -8014,13 +8044,13 @@ handlebars@^4.7.7: version "4.7.8" resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - optionalDependencies: - uglify-js "^3.1.4" dependencies: minimist "^1.2.5" neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" har-schema@^2.0.0: version "2.0.0" @@ -8149,10 +8179,10 @@ htmlparser2@^8.0.2: resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" domutils "^3.0.1" entities "^4.4.0" + domhandler "^5.0.3" + domelementtype "^2.3.0" http-errors@2.0.0: version "2.0.0" @@ -8178,9 +8208,9 @@ http-signature@~1.2.0: resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" sshpk "^1.7.0" + jsprim "^1.2.2" + assert-plus "^1.0.0" https@^1.0.0: version "1.0.0" @@ -8231,11 +8261,6 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -immer@>=9.0.6: - version "10.1.1" - resolved "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz" - integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== - import-in-the-middle@^1.8.1: version "1.13.0" resolved "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.0.tgz" @@ -8284,21 +8309,21 @@ inquirer@^8.2.0: resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz" integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" ora "^5.4.1" - run-async "^2.4.0" rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" + chalk "^4.1.1" + lodash "^4.17.21" + figures "^3.0.0" through "^2.3.6" + cli-width "^3.0.0" + run-async "^2.4.0" wrap-ansi "^6.0.1" + cli-cursor "^3.1.0" + strip-ansi "^6.0.0" + mute-stream "0.0.8" + ansi-escapes "^4.2.1" + string-width "^4.1.0" + external-editor "^3.0.3" internal-slot@^1.1.0: version "1.1.0" @@ -8324,10 +8349,10 @@ intl-messageformat@^10.5.14: resolved "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.15.tgz" integrity sha512-LRyExsEsefQSBjU2p47oAheoKz+EOJxSLDdjOaEjdriajfHsMXOmV/EhMvYSg9bAgCUHasuAC+mcUBe/95PfIg== dependencies: + tslib "2" + "@formatjs/icu-messageformat-parser" "2.11.1" "@formatjs/ecma402-abstract" "2.3.3" "@formatjs/fast-memoize" "2.2.6" - "@formatjs/icu-messageformat-parser" "2.11.1" - tslib "2" ip-address@^9.0.5: version "9.0.5" @@ -8724,19 +8749,19 @@ jackspeak@^2.0.3: version "2.3.6" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" dependencies: "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" dependencies: "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" jiti@^1.21.6: version "1.21.7" @@ -8749,9 +8774,9 @@ jju@^1.4.0: integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== jose@^5.4.0, jose@^5.9.3, jose@^5.9.6: - version "5.9.6" - resolved "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz" - integrity sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ== + version "5.10.0" + resolved "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz" + integrity sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg== jotai@^2.11.0: version "2.12.1" @@ -8874,10 +8899,10 @@ jsonfile@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - optionalDependencies: - graceful-fs "^4.1.6" dependencies: universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" jsonrepair@^3.11.2: version "3.12.0" @@ -8889,26 +8914,26 @@ jsonwebtoken@^9.0.0: resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz" integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: + ms "^2.1.1" jws "^3.2.2" + semver "^7.5.4" + lodash.once "^4.0.0" lodash.includes "^4.3.0" + lodash.isnumber "^3.0.3" + lodash.isstring "^4.0.1" lodash.isboolean "^3.0.3" lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" jsprim@^1.2.2: version "1.4.2" resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: - assert-plus "1.0.0" + verror "1.10.0" extsprintf "1.3.0" + assert-plus "1.0.0" json-schema "0.4.0" - verror "1.10.0" jwa@^1.4.1: version "1.4.1" @@ -8956,9 +8981,9 @@ keycon@^1.2.0: resolved "https://registry.npmjs.org/keycon/-/keycon-1.4.0.tgz" integrity sha512-p1NAIxiRMH3jYfTeXRs2uWbVJ1WpEjpi8ktzUyBJsX7/wn2qu2VRXktneBLNtKNxJmlUYxRi9gOJt1DuthXR7A== dependencies: - "@cfcs/core" "^0.0.6" "@daybrush/utils" "^1.7.1" "@scena/event-emitter" "^1.0.2" + "@cfcs/core" "^0.0.6" keycode "^2.2.0" kind-of@^3.0.2: @@ -9142,9 +9167,9 @@ log-symbols@4.1.0, log-symbols@^4.1.0: is-unicode-supported "^0.1.0" long@^5.0.0: - version "5.3.0" - resolved "https://registry.npmjs.org/long/-/long-5.3.0.tgz" - integrity sha512-5vvY5yF1zF/kXk+L94FRiTDa1Znom46UjPCH6/XbSvS8zBKMFBHTJk8KDMqJ+2J6QezQFi7k1k8v21ClJYHPaw== + version "5.3.1" + resolved "https://registry.npmjs.org/long/-/long-5.3.1.tgz" + integrity sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng== longest-streak@^3.0.0: version "3.1.0" @@ -9532,13 +9557,13 @@ micromark-extension-gfm-footnote@^2.0.0: integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== dependencies: devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" + micromark-util-types "^2.0.0" + micromark-util-symbol "^2.0.0" micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" + micromark-core-commonmark "^2.0.0" micromark-util-sanitize-uri "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" micromark-extension-gfm-strikethrough@^2.0.0: version "2.1.0" @@ -9672,10 +9697,10 @@ micromark-util-decode-string@^2.0.0: resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== dependencies: - decode-named-character-reference "^1.0.0" micromark-util-character "^2.0.0" micromark-util-decode-numeric-character-reference "^2.0.0" micromark-util-symbol "^2.0.0" + decode-named-character-reference "^1.0.0" micromark-util-encode@^2.0.0: version "2.0.1" @@ -9833,8 +9858,8 @@ motion@^11.18.2: resolved "https://registry.npmjs.org/motion/-/motion-11.18.2.tgz" integrity sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg== dependencies: - framer-motion "^11.18.2" tslib "^2.4.0" + framer-motion "^11.18.2" motion-dom@^11.18.1: version "11.18.1" @@ -9933,47 +9958,70 @@ next@15.0.4: version "15.0.4" resolved "https://registry.npmjs.org/next/-/next-15.0.4.tgz" integrity sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA== + dependencies: + busboy "1.6.0" + postcss "8.4.31" + "@next/env" "15.0.4" + styled-jsx "5.1.6" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.13" + caniuse-lite "^1.0.30001579" optionalDependencies: - "@next/swc-darwin-arm64" "15.0.4" + sharp "^0.33.5" "@next/swc-darwin-x64" "15.0.4" - "@next/swc-linux-arm64-gnu" "15.0.4" - "@next/swc-linux-arm64-musl" "15.0.4" + "@next/swc-darwin-arm64" "15.0.4" "@next/swc-linux-x64-gnu" "15.0.4" "@next/swc-linux-x64-musl" "15.0.4" - "@next/swc-win32-arm64-msvc" "15.0.4" "@next/swc-win32-x64-msvc" "15.0.4" - sharp "^0.33.5" + "@next/swc-linux-arm64-gnu" "15.0.4" + "@next/swc-linux-arm64-musl" "15.0.4" + "@next/swc-win32-arm64-msvc" "15.0.4" + +"next@>= 14.0.0", next@>=12, next@>=13.2.0, "next@^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "next@^13.0.0 || ^14.0.0 || ^15.0.0", "next@^14.0.0-0 || ^15.0.0-0": + version "15.1.7" + resolved "https://registry.npmjs.org/next/-/next-15.1.7.tgz" + integrity sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg== dependencies: - "@next/env" "15.0.4" - "@swc/counter" "0.1.3" - "@swc/helpers" "0.5.13" busboy "1.6.0" - caniuse-lite "^1.0.30001579" postcss "8.4.31" + "@next/env" "15.1.7" styled-jsx "5.1.6" - -next@*, "next@>= 14.0.0", next@>=12, next@>=13.2.0, next@>=14.2.0, "next@^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "next@^13.0.0 || ^14.0.0 || ^15.0.0", "next@^14.0.0-0 || ^15.0.0-0", next@^15.2.0: + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.15" + caniuse-lite "^1.0.30001579" + optionalDependencies: + sharp "^0.33.5" + "@next/swc-darwin-x64" "15.1.7" + "@next/swc-darwin-arm64" "15.1.7" + "@next/swc-linux-x64-gnu" "15.1.7" + "@next/swc-linux-x64-musl" "15.1.7" + "@next/swc-win32-x64-msvc" "15.1.7" + "@next/swc-linux-arm64-gnu" "15.1.7" + "@next/swc-linux-arm64-musl" "15.1.7" + "@next/swc-win32-arm64-msvc" "15.1.7" + +next@^15.2.0: version "15.2.0" resolved "https://registry.npmjs.org/next/-/next-15.2.0.tgz" integrity sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ== - optionalDependencies: - "@next/swc-darwin-arm64" "15.2.0" - "@next/swc-darwin-x64" "15.2.0" - "@next/swc-linux-arm64-gnu" "15.2.0" - "@next/swc-linux-arm64-musl" "15.2.0" - "@next/swc-linux-x64-gnu" "15.2.0" - "@next/swc-linux-x64-musl" "15.2.0" - "@next/swc-win32-arm64-msvc" "15.2.0" - "@next/swc-win32-x64-msvc" "15.2.0" - sharp "^0.33.5" dependencies: + busboy "1.6.0" + postcss "8.4.31" "@next/env" "15.2.0" + styled-jsx "5.1.6" "@swc/counter" "0.1.3" "@swc/helpers" "0.5.15" - busboy "1.6.0" caniuse-lite "^1.0.30001579" - postcss "8.4.31" - styled-jsx "5.1.6" + optionalDependencies: + sharp "^0.33.5" + "@next/swc-darwin-x64" "15.2.0" + "@next/swc-darwin-arm64" "15.2.0" + "@next/swc-linux-x64-gnu" "15.2.0" + "@next/swc-linux-x64-musl" "15.2.0" + "@next/swc-win32-x64-msvc" "15.2.0" + "@next/swc-linux-arm64-gnu" "15.2.0" + "@next/swc-linux-arm64-musl" "15.2.0" + "@next/swc-win32-arm64-msvc" "15.2.0" "next-auth@^5.0.0-beta.25": version "5.0.0-beta.25" @@ -9992,18 +10040,18 @@ next-international@^1.3.1: server-only "^0.0.1" next-intl@^3.26.3: - version "3.26.3" - resolved "https://registry.npmjs.org/next-intl/-/next-intl-3.26.3.tgz" - integrity sha512-6Y97ODrDsEE1J8cXKMHwg1laLdtkN66QMIqG8BzH4zennJRUNTtM8UMtBDyhfmF6uiZ+xsbWLXmHUgmUymUsfQ== + version "3.26.4" + resolved "https://registry.npmjs.org/next-intl/-/next-intl-3.26.4.tgz" + integrity sha512-/kFFR7WYJGisOR0xKoC930e6oTOOWf8rbHviQgte5zIn6OgJ6mKFvXI94RWAW3ksCZJCvE4zblIuYwHCSbbw7g== dependencies: - "@formatjs/intl-localematcher" "^0.5.4" + use-intl "^3.26.4" negotiator "^1.0.0" - use-intl "^3.26.3" + "@formatjs/intl-localematcher" "^0.5.4" next-safe-action@^7.10.3: - version "7.10.3" - resolved "https://registry.npmjs.org/next-safe-action/-/next-safe-action-7.10.3.tgz" - integrity sha512-Kn4zTnOiRkfWfQ0DH94I79Eycq6i+qS6WzhuGzxlWhVe6/yrEXHt+yU4GdqJ1O7vLyDAOWv4rXaRu+FkfVUAqQ== + version "7.10.4" + resolved "https://registry.npmjs.org/next-safe-action/-/next-safe-action-7.10.4.tgz" + integrity sha512-rZE89DTNgiTJ8oPQBOZm+jd0Uf/pLkN+GE3PndER6vWqHGYGN7HMLvhpggkbE8W4TGp+qM7CPyrXye1wCjZLVg== next-themes@^0.4.4: version "0.4.4" @@ -10046,18 +10094,18 @@ node-gyp@^3.0.3: resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz" integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: - fstream "^1.0.0" + tar "^2.0.0" glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" osenv "0" - request "^2.87.0" + which "1" + mkdirp "^0.5.0" + npmlog "0 || 1 || 2 || 3 || 4" rimraf "2" semver "~5.3.0" - tar "^2.0.0" - which "1" + fstream "^1.0.0" + request "^2.87.0" + graceful-fs "^4.1.2" node-gyp-build@^4.8.1: version "4.8.4" @@ -10120,10 +10168,10 @@ novel@^1.0.2: "@types/node" "^22.10.6" cmdk "^1.0.4" jotai "^2.11.0" - katex "^0.16.20" react-markdown "^9.0.3" react-moveable "^0.56.0" react-tweet "^3.2.1" + katex "^0.16.20" tippy.js "^6.3.7" tiptap-extension-global-drag-handle "^0.1.16" tunnel-rat "^0.1.2" @@ -10134,28 +10182,28 @@ novu@^2.6.5: integrity sha512-2aafZqW4z24Zp5y3xlhMBfNHW+4THFAsr6p47gSEPcmE5xeiaRDi/WSrNUPcY1jFlV0Bs+E0osHoJClzfkqYUQ== dependencies: "@novu/ntfr-client" "^0.0.4" - "@novu/shared" "2.6.5" "@segment/analytics-node" "^1.1.4" - "@types/cross-spawn" "6.0.0" - async-sema "3.0.1" axios "^1.6.8" chalk "4.1.2" commander "^9.0.0" configstore "^5.0.0" - cross-spawn "7.0.5" dotenv "^16.4.5" - fast-glob "3.3.1" get-port "^5.1.1" gradient-string "^2.0.0" inquirer "^8.2.0" jwt-decode "^3.1.2" open "^8.4.0" ora "^5.4.1" - picocolors "^1.0.0" - prompts "2.4.2" uuid "^9.0.0" - validate-npm-package-name "3.0.0" ws "^8.11.0" + picocolors "^1.0.0" + validate-npm-package-name "3.0.0" + prompts "2.4.2" + "@types/cross-spawn" "6.0.0" + cross-spawn "7.0.5" + fast-glob "3.3.1" + async-sema "3.0.1" + "@novu/shared" "2.6.5" npm-run-path@^5.1.0: version "5.3.0" @@ -10169,10 +10217,10 @@ npm-run-path@^5.1.0: resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" gauge "~2.7.3" set-blocking "~2.0.0" + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" number-is-nan@^1.0.0: version "1.0.1" @@ -10180,9 +10228,9 @@ number-is-nan@^1.0.0: integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nuqs@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/nuqs/-/nuqs-2.3.2.tgz" - integrity sha512-WeG78r8e3a30JY3P8npldvNiAZwGIk499lnpeRs3UYA3PpSvs2/PLunKGgjuF/JMw4BOowD3K2xgGEOZ3PeODA== + version "2.4.0" + resolved "https://registry.npmjs.org/nuqs/-/nuqs-2.4.0.tgz" + integrity sha512-+yOdX0q/wdYlseSYtWC8StDDt2QFcYX/zV5/E67J1cOJo3PR0mggxMx4acZGC0Hu66xFHENKQkqI2zSpH742xQ== dependencies: mitt "^3.0.1" @@ -10197,9 +10245,9 @@ oauth-sign@~0.9.0: integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== oauth4webapi@^3.0.0, oauth4webapi@^3.1.1: - version "3.1.5" - resolved "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.1.5.tgz" - integrity sha512-/V8tb1vgltQWIV8abvFfK1VVLhNcg5nYp8XTjwGc69eP66+rnHl0ttBLL5VrEJ/oNCrM37+JoVuHpiLNhnTdzw== + version "3.2.0" + resolved "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.2.0.tgz" + integrity sha512-2sYwQXuuzGKOHpnM7QL9BssDrly5gKCgJKTyrhmFIHzJRj0fFsr6GVJEdesmrX6NpMg2u63V4hJwRsZE6PUSSA== object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -10292,13 +10340,13 @@ ora@5.4.1, ora@^5.4.1: dependencies: bl "^4.1.0" chalk "^4.1.0" + wcwidth "^1.0.1" cli-cursor "^3.1.0" + strip-ansi "^6.0.0" + log-symbols "^4.1.0" cli-spinners "^2.5.0" is-interactive "^1.0.0" is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" orderedmap@^2.0.0: version "2.1.1" @@ -10320,8 +10368,8 @@ osenv@0: resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: - os-homedir "^1.0.0" os-tmpdir "^1.0.0" + os-homedir "^1.0.0" overlap-area@^1.1.0: version "1.1.0" @@ -10363,16 +10411,16 @@ p-queue@^6, p-queue@^6.6.1: resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: - eventemitter3 "^4.0.4" p-timeout "^3.2.0" + eventemitter3 "^4.0.4" p-retry@^4: version "4.6.2" resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - "@types/retry" "0.12.0" retry "^0.13.1" + "@types/retry" "0.12.0" p-timeout@^3.2.0: version "3.2.0" @@ -10387,9 +10435,9 @@ p-try@^2.0.0: integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pac-proxy-agent@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz" - integrity sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw== + version "7.2.0" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" agent-base "^7.1.2" @@ -10496,8 +10544,8 @@ path-scurry@^1.10.1, path-scurry@^1.11.1: resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + lru-cache "^10.2.0" path-to-regexp@0.1.12: version "0.1.12" @@ -10567,7 +10615,7 @@ picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1, "picomatch@^3 || ^4": +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -10626,9 +10674,8 @@ plist@^3.1.0: version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: - "@bubba/db" "workspace:*" - "@bubba/ui" "workspace:*" - devDependencies: + "@bubba/db" "packages/db" + "@bubba/ui" "packages/ui" "@types/node" "^22.13.2" "@types/react" "^19.0.8" "@types/react-dom" "^19.0.3" @@ -10656,7 +10703,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@>=8.0.9, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.47, postcss@^8.4.48, postcss@^8.5.2: +postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.47, postcss@^8.4.48, postcss@^8.5.2: version "8.5.2" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz" integrity sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA== @@ -10686,8 +10733,8 @@ postcss-load-config@^4.0.2: resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: - lilconfig "^3.0.0" yaml "^2.3.4" + lilconfig "^3.0.0" postcss-nested@^6.2.0: version "6.2.0" @@ -10745,9 +10792,9 @@ postgres-range@^1.1.1: integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== posthog-js@^1.215.3, posthog-js@^1.217.2: - version "1.218.2" - resolved "https://registry.npmjs.org/posthog-js/-/posthog-js-1.218.2.tgz" - integrity sha512-C3IRqrdeYdFPiUmj2wI+k+Skr56Co9vhXufv3LirNQC6kAc5FVq//VQVK1i4Xf8PlZYsaqREl0QI5M/CihU3wA== + version "1.219.3" + resolved "https://registry.npmjs.org/posthog-js/-/posthog-js-1.219.3.tgz" + integrity sha512-oKN4no9RRAptZ86R/MvMjsxQnFAe97rwU2emmTzf/q9ng+7V4nU+APM0ItzrESFtRYx1X8kKtxDUlkujNhfMvw== dependencies: core-js "^3.38.1" fflate "^0.4.8" @@ -10761,21 +10808,16 @@ posthog-node@^4.4.1, posthog-node@^4.5.2: dependencies: axios "^1.7.4" -preact@10.11.3, preact@>=10: +preact@10.11.3: version "10.11.3" resolved "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz" integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== -preact@10.24.3: +preact@10.24.3, preact@>=10, preact@^10.19.3: version "10.24.3" resolved "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz" integrity sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA== -preact@>=10, preact@^10.19.3: - version "10.25.4" - resolved "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz" - integrity sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA== - preact-render-to-string@5.2.3: version "5.2.3" resolved "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz" @@ -10816,14 +10858,16 @@ pretty-format@^3.8.0: resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz" integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== -prisma@*, prisma@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/prisma/-/prisma-6.3.1.tgz" - integrity sha512-JKCZWvBC3enxk51tY4TWzS4b5iRt4sSU1uHn2I183giZTvonXaQonzVtjLzpOHE7qu9MxY510kAtFGJwryKe3Q== +prisma@^6.3.1: + version "6.4.0" + resolved "https://registry.npmjs.org/prisma/-/prisma-6.4.0.tgz" + integrity sha512-UxEaEo1ajnEvwT9UQRyRfq0zZ9pvOmlZ6kShY8Hgu4jxgkHo1mg85IEP8yBgFRiRBA2o2OIt1nxzcllt86D4Mw== + dependencies: + esbuild ">=0.12 <1" + esbuild-register "3.6.0" + "@prisma/engines" "6.4.0" optionalDependencies: fsevents "2.3.3" - dependencies: - "@prisma/engines" "6.3.1" prismjs@1.29.0: version "1.29.0" @@ -10904,8 +10948,8 @@ prosemirror-commands@^1.0.0, prosemirror-commands@^1.6.2: integrity sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA== dependencies: prosemirror-model "^1.0.0" - prosemirror-state "^1.0.0" prosemirror-transform "^1.10.2" + prosemirror-state "^1.0.0" prosemirror-dropcursor@^1.8.1: version "1.8.1" @@ -10913,8 +10957,8 @@ prosemirror-dropcursor@^1.8.1: integrity sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw== dependencies: prosemirror-state "^1.0.0" - prosemirror-transform "^1.1.0" prosemirror-view "^1.1.0" + prosemirror-transform "^1.1.0" prosemirror-gapcursor@^1.3.2: version "1.3.2" @@ -10949,17 +10993,17 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.2: resolved "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz" integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== dependencies: - prosemirror-state "^1.0.0" w3c-keyname "^2.2.0" + prosemirror-state "^1.0.0" prosemirror-markdown@^1.13.1: version "1.13.1" resolved "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz" integrity sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw== dependencies: - "@types/markdown-it" "^14.0.0" markdown-it "^14.0.0" prosemirror-model "^1.20.0" + "@types/markdown-it" "^14.0.0" prosemirror-menu@^1.2.4: version "1.2.4" @@ -10967,9 +11011,9 @@ prosemirror-menu@^1.2.4: integrity sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA== dependencies: crelt "^1.0.0" + prosemirror-state "^1.0.0" prosemirror-commands "^1.0.0" prosemirror-history "^1.0.0" - prosemirror-state "^1.0.0" prosemirror-model@^1.0.0, prosemirror-model@^1.19.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.22.1, prosemirror-model@^1.23.0, prosemirror-model@^1.24.1: version "1.24.1" @@ -10991,8 +11035,8 @@ prosemirror-schema-list@^1.4.1: integrity sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg== dependencies: prosemirror-model "^1.0.0" - prosemirror-state "^1.0.0" prosemirror-transform "^1.7.3" + prosemirror-state "^1.0.0" prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.4.2, prosemirror-state@^1.4.3: version "1.4.3" @@ -11100,8 +11144,8 @@ pump@^3.0.0: resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz" integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: - end-of-stream "^1.1.0" once "^1.3.1" + end-of-stream "^1.1.0" punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" @@ -11119,8 +11163,8 @@ puppeteer-core@^24.2.0: integrity sha512-bCypUh3WXzETafv1TCFAjIUnI8BiQ/d+XvEfEXDLcIMm9CAvROqnBmbt79yBjwasoDZsgfXnUmIJU7Y27AalVQ== dependencies: "@puppeteer/browsers" "2.7.1" - chromium-bidi "1.3.0" debug "^4.4.0" + chromium-bidi "1.3.0" devtools-protocol "0.0.1402036" typed-query-selector "^2.12.0" ws "^8.18.0" @@ -11182,9 +11226,9 @@ raw-body@2.5.2, raw-body@^2.3.3: integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" unpipe "1.0.0" + iconv-lite "0.4.24" + http-errors "2.0.0" rc@1.2.8: version "1.2.8" @@ -11203,7 +11247,7 @@ react@18.2.0, react@18.x, "react@^16.8 || ^17.0 || ^18.0", react@^18.0.0, react@ dependencies: loose-envify "^1.1.0" -react@*, react@19.0.0, "react@>= 16.8 || 18.0.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.0.0", "react@>= 18.2.0", react@>=16, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=16.8.1, "react@>=16.8.6 || ^17.0.0 || ^18.0.0", react@>=17, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "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 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0-0", react@^19.0.0: +react@*, react@19.0.0, "react@>= 16.8 || 18.0.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.0.0", "react@>= 18.2.0", react@>=16, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=16.8.1, "react@>=16.8.6 || ^17.0.0 || ^18.0.0", react@>=17, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "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 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0-0", react@^19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/react/-/react-19.0.0.tgz" integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== @@ -11226,10 +11270,10 @@ react-dom@18.2.0, "react-dom@^16.8 || ^17.0 || ^18.0", react-dom@^18.0.0: resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: - loose-envify "^1.1.0" scheduler "^0.23.0" + loose-envify "^1.1.0" -react-dom@19.0.0, "react-dom@>= 18.0.0", "react-dom@>= 18.2.0", react-dom@>=16, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.1, "react-dom@>=16.8.6 || ^17.0.0 || ^18.0.0", react-dom@>=17, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^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-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@^19.0.0: +react-dom@19.0.0, "react-dom@>= 18.0.0", "react-dom@>= 18.2.0", react-dom@>=16, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.1, "react-dom@>=16.8.6 || ^17.0.0 || ^18.0.0", react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^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-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@^19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz" integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== @@ -11241,29 +11285,29 @@ react-dropzone@^14.3.5: resolved "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz" integrity sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ== dependencies: + prop-types "^15.8.1" attr-accept "^2.2.4" file-selector "^2.1.0" - prop-types "^15.8.1" react-email@1.x, react-email@3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/react-email/-/react-email-3.0.4.tgz" integrity sha512-nXdo9P3V+qYSW6m5yN3XpFGhHb/bflX86m0EDQEqDIgayprj6InmBJoBnMSIyC5EP4tPtoAljlclJns4lJG/MQ== dependencies: - "@babel/core" "7.24.5" - "@babel/parser" "7.24.5" + ora "5.4.1" + glob "10.3.4" + next "15.0.4" chalk "4.1.2" + esbuild "0.19.11" chokidar "^4.0.1" - commander "11.1.0" debounce "2.0.0" - esbuild "0.19.11" - glob "10.3.4" - log-symbols "4.1.0" + commander "11.1.0" + socket.io "4.8.0" mime-types "2.1.35" - next "15.0.4" + "@babel/core" "7.24.5" + log-symbols "4.1.0" + "@babel/parser" "7.24.5" normalize-path "3.0.0" - ora "5.4.1" - socket.io "4.8.0" react-hook-form@^7.0.0, react-hook-form@^7.54.2: version "7.54.2" @@ -11357,11 +11401,11 @@ react-remove-scroll@2.5.4: resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz" integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA== dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" tslib "^2.1.0" - use-callback-ref "^1.3.0" use-sidecar "^1.1.2" + use-callback-ref "^1.3.0" + react-style-singleton "^2.2.1" + react-remove-scroll-bar "^2.3.3" react-remove-scroll@^2.6.3: version "2.6.3" @@ -11408,8 +11452,8 @@ react-style-singleton@^2.2.1, react-style-singleton@^2.2.2, react-style-singleto resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz" integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== dependencies: - get-nonce "^1.0.0" tslib "^2.0.0" + get-nonce "^1.0.0" react-textarea-autosize@^8.5.7: version "8.5.7" @@ -11461,13 +11505,13 @@ readable-stream@^2.0.6: resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~2.0.0" + inherits "~2.0.3" safe-buffer "~5.1.1" + core-util-is "~1.0.0" string_decoder "~1.1.1" util-deprecate "~1.0.1" + process-nextick-args "~2.0.0" readable-stream@^3.4.0: version "3.6.2" @@ -11507,10 +11551,10 @@ recharts@^2.12.7: integrity sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q== dependencies: clsx "^2.0.0" - eventemitter3 "^4.0.1" lodash "^4.17.21" react-is "^18.3.1" react-smooth "^4.0.4" + eventemitter3 "^4.0.1" recharts-scale "^0.4.4" tiny-invariant "^1.3.1" victory-vendor "^36.6.8" @@ -11614,26 +11658,26 @@ request@^2.87.0: resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: - aws-sign2 "~0.7.0" + qs "~6.5.2" aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" + uuid "^3.3.2" extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" + caseless "~0.12.0" isstream "~0.1.2" - json-stringify-safe "~5.0.1" + aws-sign2 "~0.7.0" + form-data "~2.3.2" mime-types "~2.1.19" oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" safe-buffer "^5.1.2" tough-cookie "~2.5.0" tunnel-agent "^0.6.0" - uuid "^3.3.2" + forever-agent "~0.6.1" + har-validator "~5.1.3" + is-typedarray "~1.0.0" + http-signature "~1.2.0" + combined-stream "~1.0.6" + performance-now "^2.1.0" + json-stringify-safe "~5.0.1" require-directory@^2.1.1: version "2.1.1" @@ -11881,19 +11925,19 @@ send@0.19.0: resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: - debug "2.6.9" + ms "2.1.3" depd "2.0.0" + etag "~1.8.1" + mime "1.6.0" + debug "2.6.9" + fresh "0.5.2" destroy "1.2.0" + statuses "2.0.1" encodeurl "~1.0.2" escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" on-finished "2.4.1" range-parser "~1.2.1" - statuses "2.0.1" seroval@^1.0, seroval@^1.1.0: version "1.2.1" @@ -11965,30 +12009,30 @@ sharp@^0.33.5: version "0.33.5" resolved "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz" integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== + dependencies: + color "^4.2.3" + semver "^7.6.3" + detect-libc "^2.0.3" optionalDependencies: - "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" "@img/sharp-darwin-x64" "0.33.5" - "@img/sharp-libvips-darwin-arm64" "1.0.4" - "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" "@img/sharp-libvips-linux-arm64" "1.0.4" "@img/sharp-libvips-linux-s390x" "1.0.4" - "@img/sharp-libvips-linux-x64" "1.0.4" - "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-darwin-arm64" "1.0.4" "@img/sharp-libvips-linuxmusl-x64" "1.0.4" - "@img/sharp-linux-arm" "0.33.5" - "@img/sharp-linux-arm64" "0.33.5" - "@img/sharp-linux-s390x" "0.33.5" - "@img/sharp-linux-x64" "0.33.5" - "@img/sharp-linuxmusl-arm64" "0.33.5" - "@img/sharp-linuxmusl-x64" "0.33.5" - "@img/sharp-wasm32" "0.33.5" - "@img/sharp-win32-ia32" "0.33.5" - "@img/sharp-win32-x64" "0.33.5" - dependencies: - color "^4.2.3" - detect-libc "^2.0.3" - semver "^7.6.3" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" shebang-command@^2.0.0: version "2.0.0" @@ -12062,9 +12106,9 @@ simple-git@^3.27.0: resolved "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz" integrity sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA== dependencies: + debug "^4.3.5" "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" - debug "^4.3.5" simple-swizzle@^0.2.2: version "0.2.2" @@ -12093,13 +12137,13 @@ socket.io@4.8.0: resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz" integrity sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA== dependencies: - accepts "~1.3.4" - base64id "~2.0.0" cors "~2.8.5" debug "~4.3.2" + accepts "~1.3.4" + base64id "~2.0.0" engine.io "~6.6.0" - socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" + socket.io-adapter "~2.5.2" socket.io-adapter@~2.5.2: version "2.5.5" @@ -12114,28 +12158,28 @@ socket.io-client@4.7.2: resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz" integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w== dependencies: - "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" engine.io-client "~6.5.2" socket.io-parser "~4.2.4" + "@socket.io/component-emitter" "~3.1.0" socket.io-client@4.7.5: version "4.7.5" resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz" integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== dependencies: - "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" engine.io-client "~6.5.2" socket.io-parser "~4.2.4" + "@socket.io/component-emitter" "~3.1.0" socket.io-parser@~4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: - "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" + "@socket.io/component-emitter" "~3.1.0" socks@^2.8.3: version "2.8.4" @@ -12159,7 +12203,7 @@ solid-floating-ui@^0.3.1: resolved "https://registry.npmjs.org/solid-floating-ui/-/solid-floating-ui-0.3.1.tgz" integrity sha512-o/QmGsWPS2Z3KidAxP0nDvN7alI7Kqy0kU+wd85Fz+au5SYcnYm7I6Fk3M60Za35azsPX0U+5fEtqfOuk6Ao0Q== -solid-js@^1.6.12, solid-js@^1.7.7, solid-js@^1.8, solid-js@^1.8.11: +solid-js@^1.6.12, solid-js@^1.8, solid-js@^1.8.11: version "1.9.4" resolved "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz" integrity sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g== @@ -12221,14 +12265,14 @@ sshpk@^1.7.0: integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" + jsbn "~0.1.0" + getpass "^0.1.1" dashdash "^1.12.0" ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" tweetnacl "~0.14.0" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + safer-buffer "^2.0.2" sswr@^2.1.0: version "2.1.0" @@ -12259,38 +12303,38 @@ streamx@^2.15.0, streamx@^2.21.0: version "2.22.0" resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz" integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== - optionalDependencies: - bare-events "^2.2.0" dependencies: fast-fifo "^1.3.2" text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" string-width@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: + strip-ansi "^3.0.0" code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, "string-width@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: + strip-ansi "^6.0.1" emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" strip-ansi "^7.0.1" + emoji-regex "^9.2.2" + eastasianwidth "^0.2.0" string.prototype.trim@^1.2.10: version "1.2.10" @@ -12392,8 +12436,8 @@ stripe@^17.6.0: resolved "https://registry.npmjs.org/stripe/-/stripe-17.6.0.tgz" integrity sha512-+HB6+SManp0gSRB0dlPmXO+io18krlAe0uimXhhIkL/RG/VIRigkfoM3QDJPkqbuSW0XsA6uzsivNCJU1ELEDA== dependencies: - "@types/node" ">=8.1.0" qs "^6.11.0" + "@types/node" ">=8.1.0" strnum@^1.0.5: version "1.0.5" @@ -12459,10 +12503,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -"svelte@^3.0.0 || ^4.0.0 || ^5.0.0", "svelte@^4.0.0 || ^5.0.0-next.0": - version "5.20.1" - resolved "https://registry.npmjs.org/svelte/-/svelte-5.20.1.tgz" - integrity sha512-aCARru2WTdzJl55Ws8SK27+kvQwd8tijl4kY7NoDUXUHtTHhxMa8Lf6QNZKmU7cuPu3jjFloDO1j5HgYJNIIWg== +"svelte@^4.0.0 || ^5.0.0-next.0": + version "5.20.2" + resolved "https://registry.npmjs.org/svelte/-/svelte-5.20.2.tgz" + integrity sha512-aYXJreNUiyTob0QOzRZeBXZMGeFZDch6SrSRV8QTncZb6zj0O3BEdUzPpojuHQ1pTvk+KX7I6rZCXPUf8pTPxA== dependencies: "@ampproject/remapping" "^2.3.0" "@jridgewell/sourcemap-codec" "^1.5.0" @@ -12520,33 +12564,33 @@ tailwind-merge@^2.4.0, tailwind-merge@^2.6.0: resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz" integrity sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA== -"tailwindcss@>=3.0.0 || insiders", "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1", "tailwindcss@^3.0.0 || ^4.0.0-beta.0", tailwindcss@^3.4.13, tailwindcss@^3.4.17: +"tailwindcss@>=3.0.0 || insiders", "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1", tailwindcss@^3.4.13, tailwindcss@^3.4.17: version "3.4.17" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz" integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== dependencies: - "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" - chokidar "^3.6.0" - didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.3.2" - glob-parent "^6.0.2" - is-glob "^4.0.3" jiti "^1.21.6" + is-glob "^4.0.3" + postcss "^8.4.47" + resolve "^1.22.8" + sucrase "^3.35.0" + chokidar "^3.6.0" + fast-glob "^3.3.2" lilconfig "^3.1.3" + didyoumean "^1.2.2" micromatch "^4.0.8" - normalize-path "^3.0.0" - object-hash "^3.0.0" picocolors "^1.1.1" - postcss "^8.4.47" - postcss-import "^15.1.0" postcss-js "^4.0.1" - postcss-load-config "^4.0.2" + glob-parent "^6.0.2" + object-hash "^3.0.0" + normalize-path "^3.0.0" + postcss-import "^15.1.0" postcss-nested "^6.2.0" + "@alloc/quick-lru" "^5.2.0" + postcss-load-config "^4.0.2" postcss-selector-parser "^6.1.2" - resolve "^1.22.8" - sucrase "^3.35.0" tailwindcss-animate@^1.0.7: version "1.0.7" @@ -12558,20 +12602,20 @@ tar@^2.0.0: resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz" integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== dependencies: - block-stream "*" fstream "^1.0.12" inherits "2" + block-stream "*" tar-fs@^3.0.8: version "3.0.8" resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz" integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== - optionalDependencies: - bare-fs "^4.0.1" - bare-path "^3.0.0" dependencies: pump "^3.0.0" tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" tar-stream@^3.1.5: version "3.1.7" @@ -12642,11 +12686,11 @@ tinyexec@^0.3.1: integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== tinyglobby@^0.2.2: - version "0.2.10" - resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz" - integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + version "0.2.11" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.11.tgz" + integrity sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g== dependencies: - fdir "^6.4.2" + fdir "^6.4.3" picomatch "^4.0.2" tinygradient@^1.1.5: @@ -12654,8 +12698,8 @@ tinygradient@^1.1.5: resolved "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz" integrity sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw== dependencies: - "@types/tinycolor2" "^1.4.0" tinycolor2 "^1.0.0" + "@types/tinycolor2" "^1.4.0" tippy.js@^6.3.7: version "6.3.7" @@ -12848,8 +12892,8 @@ type-is@~1.6.18: resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: - media-typer "0.3.0" mime-types "~2.1.24" + media-typer "0.3.0" typed-array-buffer@^1.0.3: version "1.0.3" @@ -12908,7 +12952,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@*, typescript@5.7.3, typescript@>=5.0.0, typescript@>=5.1.0, typescript@>=5.7.2, typescript@^5.0.0, typescript@^5.5.4, typescript@^5.6.3, typescript@^5.7.2, typescript@^5.7.3: +typescript@5.7.3, typescript@>=5.7.2, typescript@^5.5.4, typescript@^5.6.3, typescript@^5.7.2, typescript@^5.7.3: version "5.7.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz" integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== @@ -13035,14 +13079,14 @@ update-browserslist-db@^1.1.1: picocolors "^1.1.1" uploadthing@^7.2.0, uploadthing@^7.5.0: - version "7.5.1" - resolved "https://registry.npmjs.org/uploadthing/-/uploadthing-7.5.1.tgz" - integrity sha512-p5VxxT4i7LYLiKE+FgtMnIztvDfgZ1IptY62PF2YpgvxFccIbX/OXx8OcW/psjKCmPC7PXEt3e9d+bduYJOmDw== + version "7.5.2" + resolved "https://registry.npmjs.org/uploadthing/-/uploadthing-7.5.2.tgz" + integrity sha512-hrvsVXgu6cYYJW97UuFLd3U2+TrPGyMBtPYSkqSTVq45Orkq9qFk095qkXYIW4EA/DyvCo78VV25HfSXT3EH7w== dependencies: "@effect/platform" "0.72.0" "@standard-schema/spec" "1.0.0-beta.4" "@uploadthing/mime-types" "0.3.4" - "@uploadthing/shared" "7.1.6" + "@uploadthing/shared" "7.1.7" effect "3.12.0" uri-js@^4.2.2: @@ -13069,13 +13113,13 @@ use-debounce@^10.0.4: resolved "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.4.tgz" integrity sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw== -use-intl@^3.26.3: - version "3.26.3" - resolved "https://registry.npmjs.org/use-intl/-/use-intl-3.26.3.tgz" - integrity sha512-yY0a2YseO17cKwHA9M6fcpiEJ2Uo81DEU0NOUxNTp6lJVNOuI6nULANPVVht6IFdrYFtlsMmMoc97+Eq9/Tnng== +use-intl@^3.26.4: + version "3.26.4" + resolved "https://registry.npmjs.org/use-intl/-/use-intl-3.26.4.tgz" + integrity sha512-5DhN+YfsocNO7LiLpns7/pxRcMHA4DgBZQo5Z6uw3LvX9XIZyPAdRBdFPE2eBKTAwhY77k5eBhxqDtx8wzUaBg== dependencies: - "@formatjs/fast-memoize" "^2.2.0" intl-messageformat "^10.5.14" + "@formatjs/fast-memoize" "^2.2.0" use-isomorphic-layout-effect@^1.1.1: version "1.2.0" @@ -13102,7 +13146,7 @@ use-sidecar@^1.1.2, use-sidecar@^1.1.3: detect-node-es "^1.1.0" tslib "^2.0.0" -use-sync-external-store@>=1.2.0, use-sync-external-store@^1, use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0: +use-sync-external-store@^1, use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz" integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== @@ -13161,9 +13205,9 @@ verror@1.10.0: resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: + extsprintf "^1.2.0" assert-plus "^1.0.0" core-util-is "1.0.2" - extsprintf "^1.2.0" vfile@^6.0.0: version "6.0.3" @@ -13186,31 +13230,31 @@ victory-vendor@^36.6.8: resolved "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz" integrity sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ== dependencies: - "@types/d3-array" "^3.0.3" - "@types/d3-ease" "^3.0.0" - "@types/d3-interpolate" "^3.0.1" - "@types/d3-scale" "^4.0.2" - "@types/d3-shape" "^3.1.0" - "@types/d3-time" "^3.0.0" - "@types/d3-timer" "^3.0.0" - d3-array "^3.1.6" d3-ease "^3.0.1" - d3-interpolate "^3.0.1" + d3-time "^3.0.0" + d3-array "^3.1.6" d3-scale "^4.0.2" d3-shape "^3.1.0" - d3-time "^3.0.0" d3-timer "^3.0.1" + "@types/d3-ease" "^3.0.0" + "@types/d3-time" "^3.0.0" + d3-interpolate "^3.0.1" + "@types/d3-array" "^3.0.3" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-timer" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" -vue@3.5.13, "vue@>=3.2.26 < 4", vue@^3.3.4: +vue@3.5.13, "vue@>=3.2.26 < 4": version "3.5.13" resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz" integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== dependencies: + "@vue/shared" "3.5.13" + "@vue/runtime-dom" "3.5.13" "@vue/compiler-dom" "3.5.13" "@vue/compiler-sfc" "3.5.13" - "@vue/runtime-dom" "3.5.13" "@vue/server-renderer" "3.5.13" - "@vue/shared" "3.5.13" w3c-keyname@^2.2.0: version "2.2.8" @@ -13235,7 +13279,7 @@ wcwidth@^1.0.1: version "workspace:apps/web" resolved "workspace:apps/web" devDependencies: - "@bubba/analytics" "workspace:*" + "@bubba/analytics" "packages/analytics" "@trigger.dev/build" "^3.3.15" "@types/node" "^22.13.2" "@types/react" "^19.0.8" @@ -13451,8 +13495,8 @@ write-file-atomic@^3.0.0: integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" - is-typedarray "^1.0.0" signal-exit "^3.0.2" + is-typedarray "^1.0.0" typedarray-to-buffer "^3.1.5" ws@^7.5.3: @@ -13542,13 +13586,13 @@ yargs@^17.7.2: resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: + y18n "^5.0.5" cliui "^8.0.1" escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" string-width "^4.2.3" - y18n "^5.0.5" yargs-parser "^21.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" yargs-parser@^21.1.1: version "21.1.1" @@ -13565,8 +13609,8 @@ yauzl@^2.10.0: resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: - buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" + buffer-crc32 "~0.2.3" zimmerframe@^1.1.2: version "1.1.2" From b6f884a5228b1affc2bf3c3ace642b006876dc6f Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Mon, 3 Mar 2025 14:20:32 -0500 Subject: [PATCH 2/5] refactor(evidence): Standardize file structure and naming conventions - Rename Components directory to lowercase components - Update import paths to reflect new directory structure - Reorganize actions and hooks imports - Migrate edit evidence page to use client component with server-side data fetching - Apply consistent formatting and trailing comma rules --- apps/app/.vscode/settings.json | 9 +++ apps/app/package.json | 4 +- .../[id]/Components/AssigneeSection.tsx | 4 +- .../[id]/Components/DepartmentSection.tsx | 8 +-- .../[id]/Components/EvidenceDetails.tsx | 4 -- .../evidence/[id]/Components/FileCard.tsx | 21 +++--- .../[id]/Components/FrequencySection.tsx | 6 +- .../[id]/Components/ReviewSection.tsx | 4 +- .../evidence/[id]/Components/UrlSection.tsx | 7 +- .../[id]/edit/components/EditEvidenceForm.tsx | 62 +++++++++++++++++ .../(dashboard)/evidence/[id]/edit/page.tsx | 67 +------------------ .../evidence/[id]/hooks/useFileDelete.ts | 4 +- .../evidence/[id]/hooks/useFilePreview.ts | 4 +- .../evidence/[id]/hooks/useFileUpload.ts | 6 +- .../[id]/hooks/useOrganizationAdmins.ts | 2 +- .../[id]/hooks/useOrganizationEvidence.ts | 6 +- .../evidence/[id]/hooks/useUrlManagement.ts | 6 +- .../(app)/(dashboard)/evidence/[id]/page.tsx | 2 +- apps/app/src/middleware.ts | 2 +- 19 files changed, 116 insertions(+), 112 deletions(-) create mode 100644 apps/app/.vscode/settings.json create mode 100644 apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/components/EditEvidenceForm.tsx diff --git a/apps/app/.vscode/settings.json b/apps/app/.vscode/settings.json new file mode 100644 index 0000000000..d1c021de4e --- /dev/null +++ b/apps/app/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "editor.defaultFormatter": "biomejs.biome", + "editor.codeActionsOnSave": { + "quickfix.biome": "explicit" + }, + "recommendations": [ + "biomejs.biome" + ] + } \ No newline at end of file diff --git a/apps/app/package.json b/apps/app/package.json index 1a74d9c295..57e439a843 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -6,7 +6,7 @@ "dev": "NODE_OPTIONS='--inspect' next dev --turbopack --turbo -p 3001", "build": "next build", "start": "next start", - "lint": "next lint", + "lint": "biome lint ./src", "clean-react": "rm -rf node_modules/react; rm -rf node_modules/react-dom" }, "dependencies": { @@ -96,4 +96,4 @@ "@types/react": "19.0.10", "@types/react-dom": "19.0.4" } -} \ No newline at end of file +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/AssigneeSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/AssigneeSection.tsx index 567eb0f821..b83f66ddba 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/AssigneeSection.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/AssigneeSection.tsx @@ -11,7 +11,7 @@ import { import { Avatar, AvatarFallback, AvatarImage } from "@bubba/ui/avatar"; import { useAction } from "next-safe-action/hooks"; import { toast } from "sonner"; -import { assignEvidence } from "../Actions/assignEvidence"; +import { assignEvidence } from "../actions/assignEvidence"; import { useOrganizationAdmins } from "../hooks/useOrganizationAdmins"; import type { Admin } from "../hooks/useOrganizationAdmins"; @@ -27,7 +27,7 @@ export function AssigneeSection({ onSuccess, }: AssigneeSectionProps) { const [assigneeId, setAssigneeId] = useState( - currentAssigneeId || null, + currentAssigneeId || null ); const { data: admins, isLoading, error } = useOrganizationAdmins(); const [selectedAdmin, setSelectedAdmin] = useState(null); diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/DepartmentSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/DepartmentSection.tsx index 9dc09a29e5..86d3df9ae4 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/DepartmentSection.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/DepartmentSection.tsx @@ -11,7 +11,7 @@ import { import { useAction } from "next-safe-action/hooks"; import { toast } from "sonner"; import { Departments } from "@bubba/db"; -import { updateEvidenceDepartment } from "../Actions/updateEvidenceDepartment"; +import { updateEvidenceDepartment } from "../actions/updateEvidenceDepartment"; interface DepartmentSectionProps { evidenceId: string; @@ -25,7 +25,7 @@ export function DepartmentSection({ onSuccess, }: DepartmentSectionProps) { const [department, setDepartment] = useState( - currentDepartment || null, + currentDepartment || null ); const { execute: updateDepartment, isExecuting } = useAction( @@ -39,7 +39,7 @@ export function DepartmentSection({ console.error("Error updating department:", error); toast.error("Failed to update department"); }, - }, + } ); useEffect(() => { @@ -53,7 +53,7 @@ export function DepartmentSection({ }; const departmentOptions = Object.values(Departments).filter( - (dept) => dept !== "none", + (dept) => dept !== "none" ); return ( diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx index 11604853bd..224321b079 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx @@ -1,12 +1,8 @@ "use client"; import { Alert, AlertDescription, AlertTitle } from "@bubba/ui/alert"; -import { Button } from "@bubba/ui/button"; import { Skeleton } from "@bubba/ui/skeleton"; import { CheckCircle2, FileIcon, XCircle } from "lucide-react"; -import { useAction } from "next-safe-action/hooks"; -import { toast } from "sonner"; -import { publishEvidence } from "../Actions/publishEvidence"; import { useOrganizationEvidence } from "../hooks/useOrganizationEvidence"; import type { EvidenceDetailsProps } from "../types"; import { ReviewSection } from "./ReviewSection"; diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileCard.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileCard.tsx index 22a2114868..2d00f1e094 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileCard.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileCard.tsx @@ -1,14 +1,5 @@ "use client"; -import { useEffect, useState } from "react"; -import { Button } from "@bubba/ui/button"; -import { Card, CardContent, CardFooter } from "@bubba/ui/card"; -import { - Dialog, - DialogContent, - DialogTrigger, - DialogTitle, -} from "@bubba/ui/dialog"; import { AlertDialog, AlertDialogAction, @@ -20,16 +11,24 @@ import { AlertDialogTitle, AlertDialogTrigger, } from "@bubba/ui/alert-dialog"; +import { Button } from "@bubba/ui/button"; +import { Card, CardContent, CardFooter } from "@bubba/ui/card"; +import { + Dialog, + DialogContent, + DialogTitle, + DialogTrigger, +} from "@bubba/ui/dialog"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@bubba/ui/tooltip"; -import { ExternalLink, Loader2, Trash, Maximize2 } from "lucide-react"; +import { ExternalLink, Loader2, Maximize2, Trash } from "lucide-react"; import Image from "next/image"; +import { useEffect, useState } from "react"; import { FileIcon } from "./FileIcon"; -import { VisuallyHidden } from "@radix-ui/react-visually-hidden"; interface FilePreviewState { url: string | null; diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FrequencySection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FrequencySection.tsx index aee8b6087d..4a895ffe7a 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FrequencySection.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FrequencySection.tsx @@ -10,7 +10,7 @@ import { } from "@bubba/ui/select"; import { useAction } from "next-safe-action/hooks"; import { toast } from "sonner"; -import { updateEvidenceFrequency } from "../Actions/updateEvidenceFrequency"; +import { updateEvidenceFrequency } from "../actions/updateEvidenceFrequency"; import type { Frequency } from "@bubba/db"; interface FrequencySectionProps { @@ -25,7 +25,7 @@ export function FrequencySection({ onSuccess, }: FrequencySectionProps) { const [frequency, setFrequency] = useState( - currentFrequency || null, + currentFrequency || null ); const { execute: updateFrequency, isExecuting } = useAction( @@ -38,7 +38,7 @@ export function FrequencySection({ onError: () => { toast.error("Failed to update review frequency"); }, - }, + } ); useEffect(() => { diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx index 3c5d50d852..83ef3a4a79 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx @@ -8,8 +8,8 @@ import { format } from "date-fns"; import { Building, CalendarClock, RefreshCw, User } from "lucide-react"; import { useAction } from "next-safe-action/hooks"; import { toast } from "sonner"; -import { publishEvidence } from "../Actions/publishEvidence"; -import { toggleRelevance } from "../Actions/toggleRelevance"; +import { publishEvidence } from "../actions/publishEvidence"; +import { toggleRelevance } from "../actions/toggleRelevance"; import { useOrganizationEvidence } from "../hooks/useOrganizationEvidence"; import { AssigneeSection } from "./AssigneeSection"; import { DepartmentSection } from "./DepartmentSection"; diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/UrlSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/UrlSection.tsx index 2ccf6ecad5..047c58a815 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/UrlSection.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/UrlSection.tsx @@ -1,17 +1,16 @@ "use client"; +import { Badge } from "@bubba/ui/badge"; import { Button } from "@bubba/ui/button"; import { Input } from "@bubba/ui/input"; -import { Card, CardContent } from "@bubba/ui/card"; -import { Plus, Trash, Save, Link, ExternalLink, Copy } from "lucide-react"; -import { useUrlManagement } from "../hooks/useUrlManagement"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@bubba/ui/tooltip"; -import { Badge } from "@bubba/ui/badge"; +import { Copy, ExternalLink, Link, Plus, Save, Trash } from "lucide-react"; +import { useUrlManagement } from "../hooks/useUrlManagement"; interface UrlSectionProps { evidenceId: string; diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/components/EditEvidenceForm.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/components/EditEvidenceForm.tsx new file mode 100644 index 0000000000..224acffc7d --- /dev/null +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/components/EditEvidenceForm.tsx @@ -0,0 +1,62 @@ +"use client"; + +import { Card, CardContent, CardHeader, CardTitle } from "@bubba/ui/card"; +import { Skeleton } from "@bubba/ui/skeleton"; +import { useI18n } from "@/locales/client"; +import { useParams } from "next/navigation"; +import { useOrganizationEvidence } from "../../hooks/useOrganizationEvidence"; +import { FileSection } from "../../components/FileSection"; +import { UrlSection } from "../../components/UrlSection"; + +export function EditEvidenceForm() { + const { id } = useParams<{ id: string }>(); + const { data, isLoading, error, mutate } = useOrganizationEvidence({ id }); + const t = useI18n(); + + if (isLoading) { + return ( +

+ + + +
+ ); + } + + if (error) { + return
Error
; + } + + const handleMutate = async () => { + await mutate(); + }; + + if (!data?.data) return null; + + const evidence = data.data; + + return ( + + + +
+ {t("evidence.details.content")} +
+
+
+ + + + + +
+ ); +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx index d4a7563f3c..bc9adfb586 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx @@ -1,66 +1,5 @@ -"use client"; +import { EditEvidenceForm } from "./components/EditEvidenceForm"; -import { useI18n } from "@/locales/client"; -import { Card, CardContent, CardHeader, CardTitle } from "@bubba/ui/card"; -import { Skeleton } from "@bubba/ui/skeleton"; -import { useParams, useRouter } from "next/navigation"; -import { FileSection } from "../Components/FileSection"; -import { UrlSection } from "../Components/UrlSection"; -import { useOrganizationEvidence } from "../hooks/useOrganizationEvidence"; - -export default function EditEvidencePage() { - const t = useI18n(); - const { id } = useParams<{ id: string }>(); - const { data, isLoading, error, mutate } = useOrganizationEvidence({ id }); - - if (isLoading) { - return ; - } - - if (error) { - return
Error
; - } - - const handleMutate = async () => { - await mutate(); - }; - - if (isLoading) { - return ( -
- - - -
- ); - } - - if (!data?.data) return null; - - const evidence = data.data; - - return ( - - - -
- {t("evidence.details.content")} -
-
-
- - - - - -
- ); +export default async function EditEvidencePage() { + return ; } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileDelete.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileDelete.ts index 0765c11eab..70b645cfd3 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileDelete.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileDelete.ts @@ -2,7 +2,7 @@ import { useCallback } from "react"; import { useToast } from "@bubba/ui/use-toast"; -import { deleteEvidenceFile } from "../Actions/deleteEvidenceFile"; +import { deleteEvidenceFile } from "../actions/deleteEvidenceFile"; interface UseFileDeleteProps { evidenceId: string; @@ -43,7 +43,7 @@ export function useFileDelete({ evidenceId, onSuccess }: UseFileDeleteProps) { }); } }, - [evidenceId, onSuccess, toast], + [evidenceId, onSuccess, toast] ); return { diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFilePreview.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFilePreview.ts index a82523711d..6ba6a9102e 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFilePreview.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFilePreview.ts @@ -2,7 +2,7 @@ import { useCallback, useState } from "react"; import { useToast } from "@bubba/ui/use-toast"; -import { getEvidenceFileUrl } from "../Actions/getEvidenceFileUrl"; +import { getEvidenceFileUrl } from "../actions/getEvidenceFileUrl"; interface UseFilePreviewProps { evidenceId: string; @@ -60,7 +60,7 @@ export function useFilePreview({ setIsLoading(false); } }, - [evidenceId, toast], + [evidenceId, toast] ); return { diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileUpload.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileUpload.ts index c57995e42e..4bc7722e10 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileUpload.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileUpload.ts @@ -2,7 +2,7 @@ import { useCallback, useState } from "react"; import { useToast } from "@bubba/ui/use-toast"; -import { getUploadUrl } from "../Actions/uploadEvidenceFile"; +import { getUploadUrl } from "../actions/uploadEvidenceFile"; import axios, { type AxiosProgressEvent } from "axios"; interface UploadUrlResponse { @@ -71,7 +71,7 @@ export function useFileUpload({ onUploadProgress: (progressEvent: AxiosProgressEvent): void => { if (progressEvent.total) { const percentCompleted = Math.round( - (progressEvent.loaded * 100) / progressEvent.total, + (progressEvent.loaded * 100) / progressEvent.total ); console.debug(`Upload progress: ${percentCompleted}%`); } @@ -104,7 +104,7 @@ export function useFileUpload({ setIsUploading(false); } }, - [evidenceId, onSuccess, toast], + [evidenceId, onSuccess, toast] ); return { diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationAdmins.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationAdmins.ts index fc366cd679..66d94fbc7a 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationAdmins.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationAdmins.ts @@ -1,7 +1,7 @@ "use client"; import useSWR from "swr"; -import { getOrganizationAdmins } from "../../Actions/getOrganizationAdmins"; +import { getOrganizationAdmins } from "../../actions/getOrganizationAdmins"; export interface Admin { id: string; diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationEvidence.ts index 17a1c175d5..4754cb514b 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationEvidence.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationEvidence.ts @@ -1,7 +1,7 @@ "use client"; import useSWR from "swr"; -import { getOrganizationEvidenceById } from "../../Actions/getOrganizationEvidence"; +import { getOrganizationEvidenceById } from "../../actions/getOrganizationEvidence"; interface UseOrganizationEvidenceProps { id: string; @@ -14,7 +14,7 @@ async function fetchOrganizationEvidence({ id }: UseOrganizationEvidenceProps) { throw new Error( typeof result?.error === "string" ? result.error - : "Failed to fetch organization evidence", + : "Failed to fetch organization evidence" ); } @@ -28,6 +28,6 @@ export function useOrganizationEvidence({ id }: UseOrganizationEvidenceProps) { { revalidateOnFocus: false, revalidateOnReconnect: false, - }, + } ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useUrlManagement.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useUrlManagement.ts index e53a635654..e051e2191e 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useUrlManagement.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useUrlManagement.ts @@ -2,7 +2,7 @@ import { useState, useCallback } from "react"; import { useToast } from "@bubba/ui/use-toast"; -import { updateEvidenceUrls } from "../Actions/updateEvidenceUrls"; +import { updateEvidenceUrls } from "../actions/updateEvidenceUrls"; import type { ActionResponse } from "@/actions/types"; interface DraftUrl { @@ -62,7 +62,7 @@ export function useUrlManagement({ const handleUpdateDraft = useCallback((id: string, url: string) => { setDraftUrls((prev) => - prev.map((draft) => (draft.id === id ? { ...draft, url } : draft)), + prev.map((draft) => (draft.id === id ? { ...draft, url } : draft)) ); }, []); @@ -151,7 +151,7 @@ export function useUrlManagement({ }); } }, - [currentUrls, evidenceId, onSuccess, toast], + [currentUrls, evidenceId, onSuccess, toast] ); return { diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/page.tsx index 8402abb4f4..1e1b3aac38 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/page.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/page.tsx @@ -1,4 +1,4 @@ -import { EvidenceDetails } from "./Components/EvidenceDetails"; +import { EvidenceDetails } from "./components/EvidenceDetails"; interface EvidencePageProps { params: Promise<{ diff --git a/apps/app/src/middleware.ts b/apps/app/src/middleware.ts index 9a969d3dce..930f353579 100644 --- a/apps/app/src/middleware.ts +++ b/apps/app/src/middleware.ts @@ -36,7 +36,7 @@ export async function middleware(request: NextRequest) { return NextResponse.redirect(url); } - const response = await I18nMiddleware(request); + const response = I18nMiddleware(request); response.headers.set("x-pathname", request.nextUrl.pathname); return response; From 32bf1931350d8180afa7a9cc34499fd3483c5f54 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Mon, 3 Mar 2025 14:32:10 -0500 Subject: [PATCH 3/5] Rename folders from uppercase to lowercase for better consistency --- .../evidence/[id]/{Actions => actions}/assignEvidence.ts | 0 .../evidence/[id]/{Actions => actions}/deleteEvidenceFile.ts | 0 .../evidence/[id]/{Actions => actions}/getEvidenceFileUrl.ts | 0 .../evidence/[id]/{Actions => actions}/publishEvidence.ts | 0 .../evidence/[id]/{Actions => actions}/toggleRelevance.ts | 0 .../[id]/{Actions => actions}/updateEvidenceDepartment.ts | 0 .../evidence/[id]/{Actions => actions}/updateEvidenceFrequency.ts | 0 .../evidence/[id]/{Actions => actions}/updateEvidenceUrls.ts | 0 .../evidence/[id]/{Actions => actions}/uploadEvidenceFile.ts | 0 .../evidence/[id]/{Components => components}/AssigneeSection.tsx | 0 .../[id]/{Components => components}/DepartmentSection.tsx | 0 .../evidence/[id]/{Components => components}/EvidenceDetails.tsx | 0 .../evidence/[id]/{Components => components}/FileCard.tsx | 0 .../evidence/[id]/{Components => components}/FileIcon.tsx | 0 .../evidence/[id]/{Components => components}/FileSection.tsx | 0 .../evidence/[id]/{Components => components}/FileUpload.tsx | 0 .../evidence/[id]/{Components => components}/FrequencySection.tsx | 0 .../evidence/[id]/{Components => components}/ReviewDateCard.tsx | 0 .../evidence/[id]/{Components => components}/ReviewSection.tsx | 0 .../evidence/[id]/{Components => components}/UrlSection.tsx | 0 .../{Actions => actions}/getAllOrganizationControlRequirements.ts | 0 .../(dashboard)/evidence/{Actions => actions}/getEvidence.ts | 0 .../evidence/{Actions => actions}/getEvidenceTasksStats.ts | 0 .../evidence/{Actions => actions}/getOrganizationAdmins.ts | 0 .../evidence/{Actions => actions}/getOrganizationEmployees.ts | 0 .../evidence/{Actions => actions}/getOrganizationEvidence.ts | 0 .../evidence/{Actions => actions}/getOrganizationEvidenceTasks.ts | 0 .../EvidenceFilters/ActiveFilterBadges.tsx | 0 .../{Components => components}/EvidenceFilters/FilterDropdown.tsx | 0 .../EvidenceFilters/PaginationControls.tsx | 0 .../{Components => components}/EvidenceFilters/SearchInput.tsx | 0 .../evidence/{Components => components}/EvidenceFilters/index.ts | 0 .../evidence/{Components => components}/EvidenceList.tsx | 0 .../evidence/{Components => components}/EvidenceSummaryCards.tsx | 0 .../evidence/{Components => components}/SkeletonTable.tsx | 0 .../{Components => components}/data-table/EvidenceListTable.tsx | 0 .../evidence/{Components => components}/data-table/columns.tsx | 0 .../{Components => components}/data-table/data-table-header.tsx | 0 .../evidence/{Components => components}/data-table/index.ts | 0 .../evidence/{Components => components}/data-table/types.ts | 0 .../(dashboard)/evidence/{Components => components}/index.ts | 0 41 files changed, 0 insertions(+), 0 deletions(-) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/assignEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/deleteEvidenceFile.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/getEvidenceFileUrl.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/publishEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/toggleRelevance.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/updateEvidenceDepartment.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/updateEvidenceFrequency.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/updateEvidenceUrls.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Actions => actions}/uploadEvidenceFile.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/AssigneeSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/DepartmentSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/EvidenceDetails.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/FileCard.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/FileIcon.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/FileSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/FileUpload.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/FrequencySection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/ReviewDateCard.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/ReviewSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/{Components => components}/UrlSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Actions => actions}/getAllOrganizationControlRequirements.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Actions => actions}/getEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Actions => actions}/getEvidenceTasksStats.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Actions => actions}/getOrganizationAdmins.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Actions => actions}/getOrganizationEmployees.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Actions => actions}/getOrganizationEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Actions => actions}/getOrganizationEvidenceTasks.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/EvidenceFilters/ActiveFilterBadges.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/EvidenceFilters/FilterDropdown.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/EvidenceFilters/PaginationControls.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/EvidenceFilters/SearchInput.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/EvidenceFilters/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/EvidenceList.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/EvidenceSummaryCards.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/SkeletonTable.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/data-table/EvidenceListTable.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/data-table/columns.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/data-table/data-table-header.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/data-table/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/data-table/types.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/evidence/{Components => components}/index.ts (100%) diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/assignEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/assignEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/assignEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/assignEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/deleteEvidenceFile.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/deleteEvidenceFile.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/deleteEvidenceFile.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/deleteEvidenceFile.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/getEvidenceFileUrl.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/getEvidenceFileUrl.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/getEvidenceFileUrl.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/getEvidenceFileUrl.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/publishEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/publishEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/publishEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/publishEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/toggleRelevance.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/toggleRelevance.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/toggleRelevance.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/toggleRelevance.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/updateEvidenceDepartment.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceDepartment.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/updateEvidenceDepartment.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceDepartment.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/updateEvidenceFrequency.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceFrequency.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/updateEvidenceFrequency.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceFrequency.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/updateEvidenceUrls.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceUrls.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/updateEvidenceUrls.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceUrls.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/uploadEvidenceFile.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/uploadEvidenceFile.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Actions/uploadEvidenceFile.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/uploadEvidenceFile.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/AssigneeSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/AssigneeSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/AssigneeSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/AssigneeSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/DepartmentSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/DepartmentSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/DepartmentSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/DepartmentSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/EvidenceDetails.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/EvidenceDetails.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/EvidenceDetails.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileCard.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileCard.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileCard.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileCard.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileIcon.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileIcon.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileIcon.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileIcon.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileUpload.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileUpload.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FileUpload.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileUpload.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FrequencySection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FrequencySection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/FrequencySection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FrequencySection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewDateCard.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/ReviewDateCard.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewDateCard.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/ReviewDateCard.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/ReviewSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/ReviewSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/ReviewSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/UrlSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/UrlSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/Components/UrlSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/UrlSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getAllOrganizationControlRequirements.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getAllOrganizationControlRequirements.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getAllOrganizationControlRequirements.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getAllOrganizationControlRequirements.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getEvidenceTasksStats.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getEvidenceTasksStats.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getEvidenceTasksStats.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getEvidenceTasksStats.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getOrganizationAdmins.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationAdmins.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getOrganizationAdmins.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationAdmins.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getOrganizationEmployees.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEmployees.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getOrganizationEmployees.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEmployees.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getOrganizationEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getOrganizationEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getOrganizationEvidenceTasks.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEvidenceTasks.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Actions/getOrganizationEvidenceTasks.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEvidenceTasks.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/ActiveFilterBadges.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/ActiveFilterBadges.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/ActiveFilterBadges.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/ActiveFilterBadges.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/FilterDropdown.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/FilterDropdown.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/FilterDropdown.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/FilterDropdown.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/PaginationControls.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/PaginationControls.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/PaginationControls.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/PaginationControls.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/SearchInput.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/SearchInput.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/SearchInput.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/SearchInput.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceFilters/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceFilters/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceList.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceList.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceList.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceList.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceSummaryCards.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceSummaryCards.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/EvidenceSummaryCards.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/EvidenceSummaryCards.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/SkeletonTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/SkeletonTable.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/SkeletonTable.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/SkeletonTable.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/EvidenceListTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/EvidenceListTable.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/EvidenceListTable.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/EvidenceListTable.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/columns.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/columns.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/columns.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/columns.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/data-table-header.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/data-table-header.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/data-table-header.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/data-table-header.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/types.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/types.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/data-table/types.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/data-table/types.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/Components/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/evidence/components/index.ts From 4f9c70389d20a2a63e8eff65ffabb7c47a868a8a Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Mon, 3 Mar 2025 14:39:12 -0500 Subject: [PATCH 4/5] fix imports --- .../hooks/useEvidenceTableContext.tsx | 380 +++++++++--------- .../evidence/hooks/useEvidenceTasks.ts | 10 +- .../evidence/hooks/useEvidenceTasksStats.ts | 7 +- .../(app)/(dashboard)/evidence/list/page.tsx | 12 +- 4 files changed, 204 insertions(+), 205 deletions(-) diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTableContext.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTableContext.tsx index fad65db559..1243b9e8a4 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTableContext.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTableContext.tsx @@ -3,212 +3,212 @@ import { createContext, useContext, useMemo, type ReactNode } from "react"; import { useQueryState } from "nuqs"; import { useOrganizationEvidenceTasks } from "./useEvidenceTasks"; -import type { EvidenceTaskRow } from "../Components/data-table/types"; +import type { EvidenceTaskRow } from "../components/data-table/types"; import { ALL_DEPARTMENTS, ALL_FREQUENCIES } from "../constants"; import type { Frequency, Departments } from "@bubba/db"; interface Assignee { - id: string; - name: string | null; - image: string | null; + id: string; + name: string | null; + image: string | null; } interface EvidenceTableContextType { - // State - search: string | null; - status: string | null; - frequency: string | null; - department: string | null; - assigneeId: string | null; - relevance: string | null; - page: string; - pageSize: string; - - // Setters - setSearch: (value: string | null) => void; - setStatus: (value: string | null) => void; - setFrequency: (value: string | null) => void; - setDepartment: (value: string | null) => void; - setAssigneeId: (value: string | null) => void; - setRelevance: (value: string | null) => void; - setPage: (value: string) => void; - setPageSize: (value: string) => void; - mutate: () => void; - - // Data - evidenceTasks: EvidenceTaskRow[] | undefined; - pagination: - | { - totalCount: number; - totalPages: number; - hasNextPage: boolean; - hasPreviousPage: boolean; - } - | undefined; - isLoading: boolean; - error: Error | undefined; - - // Derived data - frequencies: Frequency[]; - departments: Departments[]; - assignees: Assignee[]; - hasActiveFilters: boolean; - - // Actions - clearFilters: () => void; + // State + search: string | null; + status: string | null; + frequency: string | null; + department: string | null; + assigneeId: string | null; + relevance: string | null; + page: string; + pageSize: string; + + // Setters + setSearch: (value: string | null) => void; + setStatus: (value: string | null) => void; + setFrequency: (value: string | null) => void; + setDepartment: (value: string | null) => void; + setAssigneeId: (value: string | null) => void; + setRelevance: (value: string | null) => void; + setPage: (value: string) => void; + setPageSize: (value: string) => void; + mutate: () => void; + + // Data + evidenceTasks: EvidenceTaskRow[] | undefined; + pagination: + | { + totalCount: number; + totalPages: number; + hasNextPage: boolean; + hasPreviousPage: boolean; + } + | undefined; + isLoading: boolean; + error: Error | undefined; + + // Derived data + frequencies: Frequency[]; + departments: Departments[]; + assignees: Assignee[]; + hasActiveFilters: boolean; + + // Actions + clearFilters: () => void; } const EvidenceTableContext = createContext< - EvidenceTableContextType | undefined + EvidenceTableContextType | undefined >(undefined); export function EvidenceTableProvider({ children }: { children: ReactNode }) { - // Query state - const [search, setSearch] = useQueryState("search"); - const [status, setStatus] = useQueryState("status"); - const [frequency, setFrequency] = useQueryState("frequency"); - const [department, setDepartment] = useQueryState("department"); - const [assigneeId, setAssigneeId] = useQueryState("assigneeId"); - const [relevance, setRelevance] = useQueryState("relevance"); - const [page, setPage] = useQueryState("page", { defaultValue: "1" }); - const [pageSize, setPageSize] = useQueryState("pageSize", { - defaultValue: "10", - }); - - const currentPage = Number.parseInt(page, 10); - const currentPageSize = Number.parseInt(pageSize, 10); - - // Fetch data - const { - data: rawEvidenceTasks, - pagination, - isLoading, - error, - mutate, - } = useOrganizationEvidenceTasks({ - search, - status: status as "published" | "draft" | null, - frequency: frequency as any, - department: department as any, - assigneeId, - relevance: relevance as "relevant" | "not-relevant" | null, - page: currentPage, - pageSize: currentPageSize, - }); - - // Format data for the table - const evidenceTasks = useMemo(() => { - return rawEvidenceTasks?.map((task) => ({ - ...task, - evidence: { - name: task.name, - }, - })) as EvidenceTaskRow[] | undefined; - }, [rawEvidenceTasks]); - - // Predefined frequencies and departments - const frequencies = useMemo(() => ALL_FREQUENCIES, []); - const departments = useMemo(() => ALL_DEPARTMENTS, []); - - // Get unique assignees for the dropdown - const assignees = useMemo(() => { - if (!evidenceTasks) return []; - - const uniqueAssignees = new Map< - string, - { id: string; name: string | null; image: string | null } - >(); - - for (const task of evidenceTasks) { - if (task.assignee) { - uniqueAssignees.set(task.assignee.id, { - id: task.assignee.id, - name: task.assignee.name, - image: task.assignee.image, - }); - } - } - - return Array.from(uniqueAssignees.values()).sort((a, b) => { - return (a.name || "").localeCompare(b.name || ""); - }); - }, [evidenceTasks]); - - // Check if any filters are active - const hasActiveFilters = useMemo(() => { - return ( - status !== null || - frequency !== null || - department !== null || - assigneeId !== null || - relevance !== null - ); - }, [status, frequency, department, assigneeId, relevance]); - - // Clear all filters - const clearFilters = () => { - setStatus(null); - setFrequency(null); - setDepartment(null); - setAssigneeId(null); - setRelevance(null); - setPage("1"); // Reset to first page when clearing filters - }; - - // Create context value - const contextValue = { - // State - search, - status, - frequency, - department, - assigneeId, - relevance, - page, - pageSize, - - // Setters - setSearch, - setStatus, - setFrequency, - setDepartment, - setAssigneeId, - setRelevance, - setPage, - setPageSize, - mutate, - - // Data - evidenceTasks, - pagination, - isLoading, - error, - - // Derived data - frequencies, - departments, - assignees, - hasActiveFilters, - - // Actions - clearFilters, - }; - - return ( - - {children} - - ); + // Query state + const [search, setSearch] = useQueryState("search"); + const [status, setStatus] = useQueryState("status"); + const [frequency, setFrequency] = useQueryState("frequency"); + const [department, setDepartment] = useQueryState("department"); + const [assigneeId, setAssigneeId] = useQueryState("assigneeId"); + const [relevance, setRelevance] = useQueryState("relevance"); + const [page, setPage] = useQueryState("page", { defaultValue: "1" }); + const [pageSize, setPageSize] = useQueryState("pageSize", { + defaultValue: "10", + }); + + const currentPage = Number.parseInt(page, 10); + const currentPageSize = Number.parseInt(pageSize, 10); + + // Fetch data + const { + data: rawEvidenceTasks, + pagination, + isLoading, + error, + mutate, + } = useOrganizationEvidenceTasks({ + search, + status: status as "published" | "draft" | null, + frequency: frequency as any, + department: department as any, + assigneeId, + relevance: relevance as "relevant" | "not-relevant" | null, + page: currentPage, + pageSize: currentPageSize, + }); + + // Format data for the table + const evidenceTasks = useMemo(() => { + return rawEvidenceTasks?.map((task) => ({ + ...task, + evidence: { + name: task.name, + }, + })) as EvidenceTaskRow[] | undefined; + }, [rawEvidenceTasks]); + + // Predefined frequencies and departments + const frequencies = useMemo(() => ALL_FREQUENCIES, []); + const departments = useMemo(() => ALL_DEPARTMENTS, []); + + // Get unique assignees for the dropdown + const assignees = useMemo(() => { + if (!evidenceTasks) return []; + + const uniqueAssignees = new Map< + string, + { id: string; name: string | null; image: string | null } + >(); + + for (const task of evidenceTasks) { + if (task.assignee) { + uniqueAssignees.set(task.assignee.id, { + id: task.assignee.id, + name: task.assignee.name, + image: task.assignee.image, + }); + } + } + + return Array.from(uniqueAssignees.values()).sort((a, b) => { + return (a.name || "").localeCompare(b.name || ""); + }); + }, [evidenceTasks]); + + // Check if any filters are active + const hasActiveFilters = useMemo(() => { + return ( + status !== null || + frequency !== null || + department !== null || + assigneeId !== null || + relevance !== null + ); + }, [status, frequency, department, assigneeId, relevance]); + + // Clear all filters + const clearFilters = () => { + setStatus(null); + setFrequency(null); + setDepartment(null); + setAssigneeId(null); + setRelevance(null); + setPage("1"); // Reset to first page when clearing filters + }; + + // Create context value + const contextValue = { + // State + search, + status, + frequency, + department, + assigneeId, + relevance, + page, + pageSize, + + // Setters + setSearch, + setStatus, + setFrequency, + setDepartment, + setAssigneeId, + setRelevance, + setPage, + setPageSize, + mutate, + + // Data + evidenceTasks, + pagination, + isLoading, + error, + + // Derived data + frequencies, + departments, + assignees, + hasActiveFilters, + + // Actions + clearFilters, + }; + + return ( + + {children} + + ); } export function useEvidenceTable() { - const context = useContext(EvidenceTableContext); + const context = useContext(EvidenceTableContext); - if (context === undefined) { - throw new Error( - "useEvidenceTable must be used within an EvidenceTableProvider", - ); - } + if (context === undefined) { + throw new Error( + "useEvidenceTable must be used within an EvidenceTableProvider", + ); + } - return context; + return context; } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasks.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasks.ts index e6d30ef9f0..835e225b64 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasks.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasks.ts @@ -1,8 +1,8 @@ "use client"; import useSWR from "swr"; -import { getOrganizationEvidenceTasks } from "../Actions/getOrganizationEvidenceTasks"; -import type { PaginationMetadata } from "../Actions/getOrganizationEvidenceTasks"; +import { getOrganizationEvidenceTasks } from "../actions/getOrganizationEvidenceTasks"; +import type { PaginationMetadata } from "../actions/getOrganizationEvidenceTasks"; import type { Frequency, OrganizationEvidence, Departments } from "@bubba/db"; // Define the props interface with clear types @@ -42,7 +42,7 @@ async function fetchEvidenceTasks(props: UseOrganizationEvidenceTasksProps) { if (result.validationErrors) { throw new Error( - result.validationErrors._errors?.join(", ") ?? "Unknown error", + result.validationErrors._errors?.join(", ") ?? "Unknown error" ); } @@ -58,7 +58,7 @@ async function fetchEvidenceTasks(props: UseOrganizationEvidenceTasksProps) { } export function useOrganizationEvidenceTasks( - props: UseOrganizationEvidenceTasksProps = {}, + props: UseOrganizationEvidenceTasksProps = {} ): UseOrganizationEvidenceTasksResult { const { search, @@ -93,7 +93,7 @@ export function useOrganizationEvidenceTasks( relevance, page, pageSize, - }), + }) ); console.log("useOrganizationEvidenceTasks data:", data); diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasksStats.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasksStats.ts index 847c7f4e1e..abae25586b 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasksStats.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasksStats.ts @@ -1,8 +1,7 @@ "use client"; import useSWR from "swr"; -import { getEvidenceTasksStats } from "../Actions/getEvidenceTasksStats"; -import type { EvidenceTasksStats } from "../Actions/getEvidenceTasksStats"; +import { getEvidenceTasksStats } from "../actions/getEvidenceTasksStats"; // Define a simpler fetcher function async function fetchEvidenceTasksStats() { @@ -19,7 +18,7 @@ async function fetchEvidenceTasksStats() { if (result.validationErrors) { throw new Error( - result.validationErrors._errors?.join(", ") ?? "Unknown error", + result.validationErrors._errors?.join(", ") ?? "Unknown error" ); } @@ -37,7 +36,7 @@ export function useEvidenceTasksStats() { { revalidateOnFocus: false, revalidateOnReconnect: false, - }, + } ); return { diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/page.tsx index bc459bbf25..3c25a83bd7 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/page.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/page.tsx @@ -1,10 +1,10 @@ -import { EvidenceList } from "../Components/EvidenceList"; +import { EvidenceList } from "../components/EvidenceList"; import { EvidenceTableProvider } from "../hooks/useEvidenceTableContext"; export default function EvidencePage() { - return ( - - - - ); + return ( + + + + ); } From ec64611ba6749df68ba05ae1f15efc51e64f7efd Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Mon, 3 Mar 2025 20:01:23 +0000 Subject: [PATCH 5/5] feat(locales): Standardize evidence translations across languages - Update evidence-related translations in es, fr, no, and pt locales - Refactor evidence section with consistent keys and structure - Add new translations for evidence dashboard, status, and departments - Improve language consistency and formatting --- apps/app/languine.lock | 1706 +----------------------------------- apps/app/src/locales/es.ts | 537 ++++++------ apps/app/src/locales/fr.ts | 504 ++++++----- apps/app/src/locales/no.ts | 490 +++++------ apps/app/src/locales/pt.ts | 346 ++++---- 5 files changed, 936 insertions(+), 2647 deletions(-) diff --git a/apps/app/languine.lock b/apps/app/languine.lock index e89520d163..d687ca41bb 100644 --- a/apps/app/languine.lock +++ b/apps/app/languine.lock @@ -510,1687 +510,27 @@ files: editor.ai_selector.replace: 05fdc089c4c320832588a69475ff5e79 editor.ai_selector.insert: 3005820694a4944d91c4c4e8b8a016d3 editor.ai_selector.discard: d94b42030b9785fd754d5c1754961269 - evidence.title: 63b1eb1a39194d82271ec937fba19714 - evidence.description: c8fcd9bc15a38dcd7f6d0cbdeb65f33c - evidence.dashboard: 2938c7f7e560ed972f8a4f68e80ff834 + evidence.title: c7b2a4d55fbea4d044644cf5b2b45d29 evidence.list: ed2c6e00de11f3eb621cd348bb8f5806 - src/locales/es.ts: - language.title: c88b33a3250b4e28f34e1ececba69206 - language.description: b74d060770289b75ba34d38ea1e05251 - language.placeholder: c90ff5580c52057484a4002000bccd8a - languages.en: 216df59d4dca0cc05c7678221afc6c97 - languages.no: 8d6a8cdf9b2e593aab0592557e3386ab - languages.es: de92bbe05815c4eb756acb5897baa99c - languages.fr: 75357f6288b1eb7180e56d572a16a0cd - languages.pt: d84f5f223e29a650c524f38dfc137165 - common.actions.save: d3270bdb8d2c1caaca4178dbe19be03a - common.actions.edit: ef485eb67ac89238a4fede745a0ae94c - common.actions.delete: 5b5c9f9dc839dcc858b3c4371b014930 - common.actions.cancel: 847607d75e504090b5aff16a6e6c8351 - common.actions.clear: 476e7d19b5be911bd99a3de6c31771d1 - common.actions.create: 4f74549a5b17e88d7dd15b2fd7789a59 - common.actions.send: 30cc00aea30ec70b7c1292b6458181c0 - common.actions.return: e52ece59a8a5b16a2c9fe070ac32c3fe - common.actions.success: 560650554df187b9bf972d95229b8b15 - common.actions.error: 902b0d55fddef6f8d651fe1035b7d4bd - common.actions.next: 1ffed09a945050b91aa1f46c7dd45087 - common.actions.complete: 8d7c2bd0727190e37da6f27a86205b2b - common.assignee.label: c6bed77956f79c7a9657a15f010a773f - common.assignee.placeholder: e262b3b4d20573cbdcb5b3adef9660de - common.date.pick: bd29a1cd952610bfeeb0b02ca164aebd - common.date.due_date: 1cbb3bd12a8661902fe6eb8983e9bb6b - common.status.open: 12ec8f316bcb560d33dd087ecfa68fc0 - common.status.pending: 17fd638337290609a7ae308115a63611 - common.status.closed: 4e2af90d29d253ccbcff2ce2b459c9ae - common.status.archived: 1d0d86348d657b60e5f8cc3cc3bc37f3 - common.status.compliant: 447b6bc7e7847f0abe61d2869edf9015 - common.status.non_compliant: 6875f1e57c0dabd95fd3a872414e3e4a - common.status.not_started: a9b06b1d4b6cd8b230a54306a318fd42 - common.status.in_progress: 5af8d2e40ce41d4dcbe8306a9a1c9c6e - common.status.published: 1f10a7861d15aaf098ad564a7d8a9506 - common.status.needs_review: 906a777038d2ebda5738cd53a71e74ae - common.status.draft: a1c7b53d72d9db871a2f3ea94d06f113 - common.status.not_assessed: 873ff59465c27a78413d843b190a5919 - common.status.assessed: 3a752f70d3615e5edc52168cb4819e49 - common.status.active: ca49d6ff0b13ddea1e094ce3420b279d - common.status.inactive: 5b6532a325ae02229cfaeab843a2a682 - common.filters.clear: af85d57c83ad1d84bce2c9b15c24f23f - common.filters.search: 7ae8b43332fae10e1930f45401046425 - common.filters.status: 3397e69cce37e37c8605f57b367d6b33 - common.filters.department: 8295f968e1676d62158d33a57b26963b - common.filters.owner.label: c6bed77956f79c7a9657a15f010a773f - common.filters.owner.placeholder: 7c3c087d24211c351e870e9b836aa166 - common.table.title: 09b79d379db0c82b4615d749b22475f0 - common.table.status: 3397e69cce37e37c8605f57b367d6b33 - common.table.assigned_to: c6bed77956f79c7a9657a15f010a773f - common.table.due_date: 1cbb3bd12a8661902fe6eb8983e9bb6b - common.table.last_updated: fd2c12148186034e9751abd48f2819d1 - common.table.no_results: 3fcc064a645e61dd3d642ff1e52b3754 - common.empty_states.no_results.title: 08cc2aa4ba9453e2c51af3d4d621e3f5 - common.empty_states.no_results.title_tasks: 51160346497dd7744ce81258b3c405c7 - common.empty_states.no_results.title_risks: 62e0e8d16ec115a0731c00d6ad229541 - common.empty_states.no_results.description: 96e17a898f418a572561fef5284fd7c8 - common.empty_states.no_results.description_filters: 96e17a898f418a572561fef5284fd7c8 - common.empty_states.no_results.description_no_tasks: c55852211c6ff8a81e27eef485055c59 - common.empty_states.no_results.description_no_risks: d2a2fdeed9b560c7e88edc3796bc1609 - common.empty_states.no_items.title: 75993eb72edfb39dd53a38a56e92f678 - common.empty_states.no_items.description: e0591e3b836afdf0de7a705061610bc9 - common.pagination.of: 5f02f0889301fd7be1ac972c11bf3e7d - common.pagination.items_per_page: 4e2c07359b02a88b897029fc23506a5b - common.pagination.rows_per_page: 0cdfc20f48b9b095456ddcf01c9145aa - common.pagination.page_x_of_y: c18a6102c5d20acaa6d56e0cd4117fc3 - common.pagination.go_to_first_page: e67449d2dad15f8463d934da8ba59c19 - common.pagination.go_to_previous_page: 47393a1a90500772329cce74b628d948 - common.pagination.go_to_next_page: 83fc9e8dae730acca1538378cc9b09dd - common.pagination.go_to_last_page: 1bbcb7318f62d1a2289d6d71879901de - common.comments.title: 30045922163d87daf194d9bcb2aa8ac4 - common.comments.description: b4084b5d4e3c36531dfa9e770b202ffe - common.comments.add: d7c0f6427402512c742347babca1f0c2 - common.comments.new: 1cedf59ff856d0c6293af4e8bee06b8b - common.comments.save: d136cf0668d2d020699fe6aa3bdebb25 - common.comments.success: b175901ef041b80825390b2f1a8180ae - common.comments.error: 4f4397e6e8c1f7bbec46ef41e91d3195 - common.comments.placeholder: 9351a1212cd1b53e72b6a31769fffe44 - common.comments.empty.title: 98a81265d2761078a38b37e7d2cda68f - common.comments.empty.description: c5d9c882ed4c78ea628afd9db3146b30 - common.attachments.title: 3c675ef97f2e8c747c72f7e29e75ca03 - common.attachments.description: edc822d92ea10ec0c78724263095e13a - common.attachments.upload: 66faa15820a6155e9c4cb66df196a86d - common.attachments.upload_description: 0b405ecac1cebf12c53fb1a94ac63f5f - common.attachments.drop: c7792783b2de81d23da293c491c72be6 - common.attachments.drop_description: ee8213173b9a1fd5b98545b83491bfd9 - common.attachments.drop_files_description: fb3233c4709b6030f89321be024f0c80 - common.attachments.empty.title: 2e5ced3a75e0ff843189c6f835c5625b - common.attachments.empty.description: edc822d92ea10ec0c78724263095e13a - common.attachments.toasts.error: 361a117ad725951e608753f81ef12e5b - common.attachments.toasts.error_uploading_files: 2616b5cda9937ffd56c82c2cd8cbfea0 - common.attachments.toasts.error_uploading_files_multiple: 45c6c9461240d67ddafd31b03097ce6e - common.attachments.toasts.error_no_files_selected: fd5d1d03cb1f3ead611bcf5b0f91fd4e - common.attachments.toasts.error_file_rejected: 35b81afa54e5590dcf5d69e5e086edfd - common.attachments.toasts.error_failed_to_upload_files: 76374981ca7701a93226d3647db20f5e - common.attachments.toasts.error_failed_to_upload_files_multiple: 76374981ca7701a93226d3647db20f5e - common.attachments.toasts.error_failed_to_upload_files_single: 1114768d410514b0fcdb14f27948fdd7 - common.attachments.toasts.success_uploading_files: d3ff7960a885465625c95198731ab5ee - common.attachments.toasts.success_uploading_files_multiple: d3ff7960a885465625c95198731ab5ee - common.attachments.toasts.success_uploading_files_single: 89cf650484c02f327f925bc1c573f33a - common.attachments.toasts.success_uploading_files_target: ae773c93e2011f8c9b7856cc8eea060d - common.attachments.toasts.uploading_files: 150272cacb23559b293696a7d6fc3ec3 - common.attachments.toasts.remove_file: b586f93a2f8ee26c7fbe0276475aa277 - header.discord.button: bb1d159e917b3b1f930b1a94546e284e - header.feedback.button: 30045922163d87daf194d9bcb2aa8ac4 - header.feedback.title: 655af1f75ab10f676b65f8eb1ab9f500 - header.feedback.description: 72eeffe43e7bb9c2d60a9696767c9c35 - header.feedback.placeholder: 8c97d3fd1885ff7d2ace81ff70cb051a - header.feedback.success: 655af1f75ab10f676b65f8eb1ab9f500 - header.feedback.error: 71cf23dcb04bfc5d324f0e482e046ca3 - header.feedback.send: 3ad5963e1a2d72cb72bdb3ab3110ff1a - not_found.title: d51c5646e3ecaecea876a931be98d0a6 - not_found.description: 76296f2db5b7725bf728b49b5ab61f6b - not_found.return: 5cee76a8c096296dfb17f29e248dc6b1 - theme.options.light: abfd24adfebef98d653b605aa62baf2f - theme.options.dark: e453a886a3295deb0ede87645ede5646 - theme.options.system: b431d1485aa37ae09fa4bfa7883356ca - sidebar.overview: 8332fbec31ac4a3cd9d819230e7a6087 - sidebar.policies: 4baeafc5b98154e818683d92ca8db26e - sidebar.risk: 3620a2f5d04be0ef2ecd685297baf1d3 - sidebar.vendors: 915a50509a5b968903bdb788f448639e - sidebar.integrations: adcecead84f6cfdbff4dcbf48f3042f8 - sidebar.settings: 4d3c4eb9f350e268f00f8097de526194 - sidebar.evidence: 2588e6aa8938f60682e23b2f6fb0d4ee - sidebar.people: d4e50a9ea2253c9f06bc6bd451fb3a2c - auth.title: 5fc2b1a1eed0a1823159ab106f2aed7e - auth.description: 6a082bb3b49331c16f102861ff2ab31d - auth.options: ef4e58e8acedb82c35fed30955ca137c - auth.google: 81e754bba3423b76f625af09bb1fcf2c - auth.email.description: 1ffb6589352c18ddd6fc586036f2e7b2 - auth.email.placeholder: ef2fc7b5a10529a04fa8f06b3f5b9581 - auth.email.button: b717acee66cb275bea78b19c5c6133b7 - auth.email.magic_link_sent: b53dd0e981aa51e21b23ede8579a03be - auth.email.magic_link_description: b6e4cc34ca6d3fa8ad455ed567717032 - auth.email.magic_link_try_again: 0186c3c01b4329be8b889c2b85c564a0 - auth.email.success: 4b79b5012aab181d9a3e4f0eb7a34ba5 - auth.email.error: b438025bbb832d1ae0e569d74fe8aa2d - auth.terms: c0cbd618f8f3bfaa7c895c1a6bd05945 - onboarding.title: 0661b25bd7c77c70e4d7b0a930aee5b8 - onboarding.setup: 1a0150117e807caf279cde8bdf66f406 - onboarding.description: 8bc7d119900568c15836bfa5dfc80a8e - onboarding.fields.name.label: f57583eb2f3841ce79b704a8e945a8ac - onboarding.fields.name.placeholder: 7f68a09fe2691b6ed382f6dff70d906d - onboarding.fields.website.label: 4a4cb60dc8cd226c68ffffe713aa9fe3 - onboarding.fields.website.placeholder: 82d35d943316a67baaf429734ff1528c - onboarding.fields.subdomain.label: 37f422f005adc2b354663ab77139561b - onboarding.fields.subdomain.placeholder: 2f1767dc31e7a8dc68b2c21bf07984ff - onboarding.success: f754711017865b6d8cd17ac78bf990b7 - onboarding.error: 361a117ad725951e608753f81ef12e5b - onboarding.unavailable: 7bc7a7ebde216139b8194a75ed8f298a - overview.title: 8332fbec31ac4a3cd9d819230e7a6087 - overview.framework_chart.title: 28ab94749a075e5c0485994bf71de1ae - overview.requirement_chart.title: 81ebb7d71c25f790c417c8c8c1f9bffe - policies.dashboard.title: b8da6df14bf06283cbf588df6998722e - policies.dashboard.all: 0357f080f91c24ea0f233561ef828c40 - policies.dashboard.policy_status: 298f1b71d8b4fcce6f3e3c01c29fe63f - policies.dashboard.policies_by_assignee: 75943a8ff82717510e319689202ceba1 - policies.dashboard.policies_by_framework: 8c3cb8aef0c46f5eb836ebc877372811 - policies.table.name: c44a478ab23a921aac17d69e34bcba6d - policies.table.statuses.draft: a1c7b53d72d9db871a2f3ea94d06f113 - policies.table.statuses.published: 1f10a7861d15aaf098ad564a7d8a9506 - policies.table.filters.owner.label: 14c125d88444bd12e79ddb959d69c14e - policies.table.filters.owner.placeholder: 7c3c087d24211c351e870e9b836aa166 - policies.filters.search: 3214ab7f38a0af1eb4474df80c652d9f - policies.filters.all: 0357f080f91c24ea0f233561ef828c40 - policies.status.draft: a1c7b53d72d9db871a2f3ea94d06f113 - policies.status.published: 1f10a7861d15aaf098ad564a7d8a9506 - policies.status.needs_review: 906a777038d2ebda5738cd53a71e74ae - policies.policies: b1dc11822e33e5f1ecb29739878bb048 - evidence_tasks.evidence_tasks: 2588e6aa8938f60682e23b2f6fb0d4ee - evidence_tasks.overview: 8332fbec31ac4a3cd9d819230e7a6087 - risk.risks: 3624933eae9a60f077f9f2954c813828 - risk.overview: 8332fbec31ac4a3cd9d819230e7a6087 - risk.create: f1fc49a78264b7beca09b3932c6b9df6 - risk.vendor.title: 2986d415899d6faed8ad189f31a432aa - risk.vendor.dashboard.title: 9c03a54994928ce527a3599fe438a2c4 - risk.vendor.dashboard.overview: b5c8e712154fbd4d85ea2da1d22e57cf - risk.vendor.dashboard.vendor_status: 4045c50fafbf976963b2abe2ff758864 - risk.vendor.dashboard.vendor_category: b6bac422c578f759975cdccf39de2401 - risk.vendor.dashboard.vendors_by_assignee: 5a661e089c7124696f959a6b0cc29606 - risk.vendor.dashboard.inherent_risk_description: 2551381346d2c58885e11d2b8b988301 - risk.vendor.dashboard.residual_risk_description: b3df7c33bb9576f3e99f490c3ceac25f - risk.vendor.register.title: 5ff135435abe7b7a293282727d1d0248 - risk.vendor.register.table.name: 4777bbaaa0aebe104606b77947d0e22d - risk.vendor.register.table.category: 624c6b241d2d14bbd285596ffcf2a9e7 - risk.vendor.register.table.status: 3397e69cce37e37c8605f57b367d6b33 - risk.vendor.register.table.owner: 5f4d7cc1e658cea56da01b8945cec7d4 - risk.vendor.assessment.title: 7a104cdaf33ccdf2565b1856d2e39749 - risk.vendor.assessment.update_success: 63b1bd53b84ea7522e3e0462079ad004 - risk.vendor.assessment.update_error: f2453d2c74e4afe1a3dd461b67e554e1 - risk.vendor.assessment.inherent_risk: 841ad642101241bfb5a8e178d505d45a - risk.vendor.assessment.residual_risk: f3f3dd8b7ec390eb4b092758e8511269 - risk.vendor.form.vendor_details: a6493f216f4fccd070e4283ea652aa7a - risk.vendor.form.vendor_name: 4777bbaaa0aebe104606b77947d0e22d - risk.vendor.form.vendor_name_placeholder: f9724e7045086b3ba9b4579232b8c657 - risk.vendor.form.vendor_website: 4a4cb60dc8cd226c68ffffe713aa9fe3 - risk.vendor.form.vendor_website_placeholder: 7850594aa937003e92139bd06c21396a - risk.vendor.form.vendor_description: ef918abfb53ea5bc4fde3764e4c199de - risk.vendor.form.vendor_description_placeholder: 4f0a6bc526ccf5985a69f595752b9f4e - risk.vendor.form.vendor_category: 624c6b241d2d14bbd285596ffcf2a9e7 - risk.vendor.form.vendor_category_placeholder: 9d74ee624d873cf13b64ee6aaed38bd8 - risk.vendor.form.vendor_status: 3397e69cce37e37c8605f57b367d6b33 - risk.vendor.form.vendor_status_placeholder: 4b432aae41faef3522bb0e16fa153e13 - risk.vendor.form.create_vendor_success: a225a3cf6ff8391735995a65c1b21542 - risk.vendor.form.create_vendor_error: d12b23040e2ce06fa6e97f31c0525a5b - risk.vendor.form.update_vendor: af068734645c7aa74b0659036246140a - risk.vendor.form.update_vendor_success: 4041caa00cdc188548d38d48be182f46 - risk.vendor.form.update_vendor_error: be1d7970075b921eda0e874aef2b5504 - risk.vendor.form.add_comment: d7c0f6427402512c742347babca1f0c2 - risk.vendor.table.name: 4777bbaaa0aebe104606b77947d0e22d - risk.vendor.table.category: 624c6b241d2d14bbd285596ffcf2a9e7 - risk.vendor.table.status: 3397e69cce37e37c8605f57b367d6b33 - risk.vendor.table.owner: 5f4d7cc1e658cea56da01b8945cec7d4 - risk.vendor.filters.search_placeholder: adefd23455f549bc301539d1f53941f8 - risk.vendor.filters.status_placeholder: b2d2be0f8cb7837bb5071ca1aac2e7dd - risk.vendor.filters.category_placeholder: fa395f277d79168d098cddebc1571864 - risk.vendor.filters.owner_placeholder: 5dcb2b8638fb2a00d999196414631ddd - risk.vendor.empty_states.no_vendors.title: dc57302b77376ef37fe5a5d3f116d2bb - risk.vendor.empty_states.no_vendors.description: c2303c495a5f1108062ae465394612c2 - risk.vendor.empty_states.no_results.title: 3fcc064a645e61dd3d642ff1e52b3754 - risk.vendor.empty_states.no_results.description: 5d3f1d31cec631239093a8da2e0c67aa - risk.vendor.empty_states.no_results.description_with_filters: b8662468f89ba12988a84dfbe186d959 - risk.vendor.actions.create: d0d6becbf94f98e981cc47b89b0ab1d6 - risk.vendor.status.not_assessed: 873ff59465c27a78413d843b190a5919 - risk.vendor.status.in_progress: 5af8d2e40ce41d4dcbe8306a9a1c9c6e - risk.vendor.status.assessed: 3a752f70d3615e5edc52168cb4819e49 - risk.vendor.category.cloud: 5c34769796428a071fefe395e879ead6 - risk.vendor.category.infrastructure: 4d1cdbb44a7d5e92555c45767478ba8c - risk.vendor.category.software_as_a_service: bd72a2b5c79769563d8bda8ef0482592 - risk.vendor.category.finance: c989712e880443a42d6e891e9ac1e5e8 - risk.vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b - risk.vendor.category.sales: adcc30327981bffd4f2f27d482e52e78 - risk.vendor.category.hr: 904ccf096c781e601bd74b5fbe5eb4fd - risk.vendor.category.other: c2295235a535ea3e85b7a0e5ab85afb0 - risk.vendor.risk_level.low: c3f5d0c1c069ca6c9090620a1ff3c938 - risk.vendor.risk_level.medium: d8e1f99f9ac1c9d7a6110c79daf2d7db - risk.vendor.risk_level.high: f615e2d9443eaa282c99891152c16584 - risk.vendor.risk_level.unknown: da71ed9cc9993f503aea4d64f2c5c9e2 - risk.dashboard.title: 629e199d421911b329a2909925beeb50 - risk.dashboard.overview: 26e76fbba4a3399549740e2eca1dce49 - risk.dashboard.risk_status: 0a627f8ea427c0e25dfc78522d5643c5 - risk.dashboard.risks_by_department: 7888a04699015e06cc29af328d5e423b - risk.dashboard.risks_by_assignee: 1ec19bb7b98e694f8948089e6f812a20 - risk.dashboard.inherent_risk_description: c9613e10af2a68cb4da908a7adc423a3 - risk.dashboard.residual_risk_description: dbcd670168c184733609234c23b2bd85 - risk.dashboard.risk_assessment_description: 30b8f812ab145f121995deb91193d4b2 - risk.register.title: 61d643869401b0def6f6e0e6e7933999 - risk.register.table.risk: 3620a2f5d04be0ef2ecd685297baf1d3 - risk.register.empty.no_risks.title: d2a2fdeed9b560c7e88edc3796bc1609 - risk.register.empty.no_risks.description: 59d96a7ae35a64898efbfb3d30c9bdf3 - risk.register.empty.create_risk: 4f2f6f3ae82433fa8e43c10678f5f762 - risk.metrics.probability: d3d5c9b1993c4b0dae7f8ee8d3e1d82e - risk.metrics.impact: 5c5a54a8bb5bb610beec1345cd62c2e9 - risk.metrics.inherentRisk: 841ad642101241bfb5a8e178d505d45a - risk.metrics.residualRisk: f3f3dd8b7ec390eb4b092758e8511269 - risk.form.update_inherent_risk: 6b8ae77751a43bceac1d9201c0f0aa94 - risk.form.update_inherent_risk_description: f8f2af5157c0a2e0ce0e0fc0cb057ff8 - risk.form.update_inherent_risk_success: be5b549489af3cf7e015eb51b03d6c34 - risk.form.update_inherent_risk_error: 809c88f1edb97468645362e9c55fd653 - risk.form.update_residual_risk: 9dac278cbcaf9fff450e1e2157dbe782 - risk.form.update_residual_risk_description: a061274d1986daf93fa530284a09d62d - risk.form.update_residual_risk_success: 3992b5db1b63cd9b708bcdfc77d0a86e - risk.form.update_residual_risk_error: 142f02264a202188b9d651f915a48ab3 - risk.form.update_risk: c3658c7b3b0c7ac09af1467c9fdda1ed - risk.form.update_risk_description: b2fa15881df6f8ccc32e11323f729a12 - risk.form.update_risk_success: 73cfa7fd713a79aa930d491e5708cd2c - risk.form.update_risk_error: 9abbfda76af7e4b8afc13f1b49de6fee - risk.form.create_risk_success: 3756811ec25fdaf619da644b06c6d8c7 - risk.form.create_risk_error: 2c8ec008bca99e96ec51ceba662c9dc2 - risk.form.risk_details: da8a061c175d7b3c716341be73d7423c - risk.form.risk_title: ce4c388c597e87c042bc75f127ead96d - risk.form.risk_title_description: 84c263a458392d15c99684919f1e2f20 - risk.form.risk_description: ef918abfb53ea5bc4fde3764e4c199de - risk.form.risk_description_description: 8876f07dfe8e3b9e917a2a5172118336 - risk.form.risk_category: 624c6b241d2d14bbd285596ffcf2a9e7 - risk.form.risk_category_placeholder: eef1eb3f6044522aa46e11ae63e25f31 - risk.form.risk_department: 8295f968e1676d62158d33a57b26963b - risk.form.risk_department_placeholder: 311cb58c4ec975e8a66ad3022298e64a - risk.form.risk_status: 0a627f8ea427c0e25dfc78522d5643c5 - risk.form.risk_status_placeholder: fd5662cabcd09101dfd36df3e755a2ab - risk.tasks.title: 8fa33a1f2be10005d07ff40ad5c07833 - risk.tasks.attachments: 3c675ef97f2e8c747c72f7e29e75ca03 - risk.tasks.overview: c97c3679892cd9f277a87e31f8f81de7 - risk.tasks.form.title: 061b8973c59e51c470b3f8fb43dc0a6c - risk.tasks.form.task_title: 45f740f8a769209786f678a35f304c7a - risk.tasks.form.status: 5dc811f6c15e1ee3b53a1eed289b9716 - risk.tasks.form.status_placeholder: 67782de260e8eadd7542c52ebc585bca - risk.tasks.form.task_title_description: 46d004214a5b4dcf6ba7d2f13f270940 - risk.tasks.form.description: ef918abfb53ea5bc4fde3764e4c199de - risk.tasks.form.description_description: cf292bd94791296e7a6915ed78270503 - risk.tasks.form.due_date: d152e4af87d6a196851755fc80feb3b9 - risk.tasks.form.due_date_description: b17c1659af2df64d0dd98662782581ae - risk.tasks.form.success: 3e28bb124bf2e69e269ba1a526396090 - risk.tasks.form.error: 99e1f2738e21436abda28e4b86b6cca6 - risk.tasks.sheet.title: ee9156ca95ea9a72b86b19e25aa1fb5f - risk.tasks.sheet.update: fdae7b5bb7c0a34bb97e38552ed1d98b - risk.tasks.sheet.update_description: 45a7233f773abc244687691805ec419c - risk.tasks.empty.description_create: 6923bda5bdb36b1850fb0cb3fb964f2a - settings.general.title: 0db377921f4ce762c62526131097968f - settings.general.org_name: 478342a6b4ea7f7168b7b8d581ec21c1 - settings.general.org_name_description: 80d33dac21009d44ea1176d249ff97d3 - settings.general.org_name_tip: 3733ffc1871bfb2f144c900911a72a94 - settings.general.org_website: b3b8b0a9b77a6d8af2d9dc6ec8ed07aa - settings.general.org_website_description: 131506a8e1a4e993487e88db9f113aae - settings.general.org_website_tip: 50c0b81452541b6f33e1aab8d504bf9e - settings.general.org_website_error: 5db8285329a18a7f31c52124b3812692 - settings.general.org_website_updated: 1a351c5a044de9fd4b45b64d38c29b9b - settings.general.org_delete: 673c9473e892eef78b5f527de5802443 - settings.general.org_delete_description: 951f64e6d3fbf0f2677c29087e5a164e - settings.general.org_delete_alert_title: 23c2131e46eaf5d4aeffb21da318d7d7 - settings.general.org_delete_alert_description: 956f7ffbf0ac76293bf3fab0e5aba1e1 - settings.general.org_delete_error: 40ab06fb663838d078976dac34d6d490 - settings.general.org_delete_success: 4a9d9e89698322c279786fdaa161d126 - settings.general.org_name_updated: ebeb359367b2c914c37360f4179b5062 - settings.general.org_name_error: f9a3a64b93b513032e60c0160aec55ef - settings.general.save_button: d3270bdb8d2c1caaca4178dbe19be03a - settings.general.delete_button: 5b5c9f9dc839dcc858b3c4371b014930 - settings.general.delete_confirm: 5b346a8cc9dcda80d2877a1978b31a42 - settings.general.delete_confirm_tip: 664270af44585897f9a0b40e7d9fa307 - settings.general.cancel_button: 847607d75e504090b5aff16a6e6c8351 - settings.members.title: 9ea156a3d5841bad7dc6c133f02900c6 - settings.billing.title: 8982385e6e341d53c9a2dd9ab05dd687 - user_menu.theme: f055088fba41cb53e3806e55a9f6896e - user_menu.language: d62a3259ece127d00905fbe37f1b5cea - user_menu.sign_out: 0daed4d43928c4a72d4eabff46d766fe - user_menu.account: d1ef184f21c6a19615f873478fe03462 - user_menu.support: 54532bac0cc2df67791b1e6c2c172b32 - user_menu.settings: 4d3c4eb9f350e268f00f8097de526194 - user_menu.teams: 4b511bad2c32b63ff2afb991137d1d32 - frameworks.title: dfefdb66581190514404f57cdf74a8eb - frameworks.controls.title: 26beed84513191c01e2574d317c239d0 - frameworks.controls.description: c66fb3f4f466340d913817703755fe06 - frameworks.controls.table.status: 3397e69cce37e37c8605f57b367d6b33 - frameworks.controls.table.control: a1595abbb4c3a326636dd178757cd6c1 - frameworks.controls.table.artifacts: 669da5aa8d89fb83aea89a92341f1f4f - frameworks.controls.table.actions: a6f0cb2b955bb2e7116afe7a52e40092 - frameworks.controls.statuses.not_started: 085cdbd670e41e8db6c3523e31ae29f8 - frameworks.controls.statuses.compliant: d47dc6e6227796be6bb0e78f77644f13 - frameworks.controls.statuses.non_compliant: 947a679a4f62277537c4fb0e1f73b5fe - vendor.title: 629e199d421911b329a2909925beeb50 - vendor.register_title: 5ce1a6ffb5e88d09fef032c3e8a28c24 - vendor.dashboard.title: 629e199d421911b329a2909925beeb50 - vendor.dashboard.overview: f3067058fb1f7b2557690ad96d828e16 - vendor.dashboard.vendor_status: 872a23023e0e8519b9243dd39f26b5b2 - vendor.dashboard.vendor_category: dcc913af0597d229d2e30439291e9f0d - vendor.dashboard.vendors_by_assignee: 8931f9a8092c319c41199fa735ef6f93 - vendor.dashboard.inherent_risk_description: 2551381346d2c58885e11d2b8b988301 - vendor.dashboard.residual_risk_description: b3df7c33bb9576f3e99f490c3ceac25f - vendor.register.title: 01c64987b47ee2ed893a989b5b1b2aa9 - vendor.register.table.name: 4777bbaaa0aebe104606b77947d0e22d - vendor.register.table.category: 624c6b241d2d14bbd285596ffcf2a9e7 - vendor.register.table.status: 3397e69cce37e37c8605f57b367d6b33 - vendor.register.table.owner: 5f4d7cc1e658cea56da01b8945cec7d4 - vendor.category.cloud: 5c34769796428a071fefe395e879ead6 - vendor.category.infrastructure: 4d1cdbb44a7d5e92555c45767478ba8c - vendor.category.software_as_a_service: b0ca9e41d61885345eef09f928c9ea58 - vendor.category.finance: c989712e880443a42d6e891e9ac1e5e8 - vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b - vendor.category.sales: adcc30327981bffd4f2f27d482e52e78 - vendor.category.hr: 904ccf096c781e601bd74b5fbe5eb4fd - vendor.category.other: c2295235a535ea3e85b7a0e5ab85afb0 - vendor.vendors: 8de6d4c46d616eb4c358ba6f63bb54dc - vendor.form.vendor_details: a83c56d1fb7a07d6a42bd518710821ae - vendor.form.vendor_name: 4777bbaaa0aebe104606b77947d0e22d - vendor.form.vendor_name_placeholder: f9724e7045086b3ba9b4579232b8c657 - vendor.form.vendor_website: 4a4cb60dc8cd226c68ffffe713aa9fe3 - vendor.form.vendor_website_placeholder: 7850594aa937003e92139bd06c21396a - vendor.form.vendor_description: ef918abfb53ea5bc4fde3764e4c199de - vendor.form.vendor_description_placeholder: 4f0a6bc526ccf5985a69f595752b9f4e - vendor.form.vendor_category: 624c6b241d2d14bbd285596ffcf2a9e7 - vendor.form.vendor_category_placeholder: 9d74ee624d873cf13b64ee6aaed38bd8 - vendor.form.vendor_status: 3397e69cce37e37c8605f57b367d6b33 - vendor.form.vendor_status_placeholder: 4b432aae41faef3522bb0e16fa153e13 - vendor.form.create_vendor_success: a225a3cf6ff8391735995a65c1b21542 - vendor.form.create_vendor_error: d12b23040e2ce06fa6e97f31c0525a5b - vendor.form.update_vendor_success: 4041caa00cdc188548d38d48be182f46 - vendor.form.update_vendor_error: be1d7970075b921eda0e874aef2b5504 - vendor.form.contacts: 1561016df889501b9f81d66980057904 - vendor.form.contact_name: 7ff12886818a3171be16929855c25f79 - vendor.form.contact_email: c78d63f5dd66fcbebee54239bed70af4 - vendor.form.contact_role: e81f4b49bcb5e9bd84a750d57746d15e - vendor.form.add_contact: 1c18151e2bc992ce6346630c477b11ed - vendor.form.new_contact: 02c00537619bd598542714092e1538f3 - vendor.form.min_one_contact_required: 8b223d20058218bd5e6404469451f357 - vendor.empty_states.no_vendors.title: dc57302b77376ef37fe5a5d3f116d2bb - vendor.empty_states.no_vendors.description: c2303c495a5f1108062ae465394612c2 - vendor.empty_states.no_results.title: 3fcc064a645e61dd3d642ff1e52b3754 - vendor.empty_states.no_results.description: 5d3f1d31cec631239093a8da2e0c67aa - vendor.empty_states.no_results.description_with_filters: b8662468f89ba12988a84dfbe186d959 - people.title: d4e50a9ea2253c9f06bc6bd451fb3a2c - people.details.taskProgress: 81905e40b816572e1d218a616ae4fb48 - people.details.tasks: 8fa33a1f2be10005d07ff40ad5c07833 - people.details.noTasks: 67b0ecfdfae8700dc31823a6d8d436d7 - people.description: 796c2736dca73a8857bb6c500a7a05a0 - people.filters.search: 2b8dfea5416a9f1dc0394116fcb4d8c8 - people.filters.role: 1d7524a32f2cdd7a4df73f44d73582db - people.actions.invite: d96c8afc504dd5d0d96ff29adae2481d - people.actions.clear: af85d57c83ad1d84bce2c9b15c24f23f - people.table.name: 4777bbaaa0aebe104606b77947d0e22d - people.table.email: f04c54105510249e49af8b509e3f7a42 - people.table.department: 8295f968e1676d62158d33a57b26963b - people.table.externalId: 14988ff2367a22226ec1919c356a8aaf - people.empty.no_employees.title: e18d1f56154b4ce21b2bae2635bbf0a3 - people.empty.no_employees.description: 73ab164c7f2f753c4d091d2aa4f34e09 - people.empty.no_results.title: 3fcc064a645e61dd3d642ff1e52b3754 - people.empty.no_results.description: 6922b396db0c34d86471c54bae62dc63 - people.empty.no_results.description_with_filters: b8662468f89ba12988a84dfbe186d959 - people.invite.title: d96c8afc504dd5d0d96ff29adae2481d - people.invite.description: 62c0fd69dd40592a593c9ff5229c36f8 - people.invite.email.label: c16fbc6d64f825e71e9357ade2b299d2 - people.invite.email.placeholder: ef2fc7b5a10529a04fa8f06b3f5b9581 - people.invite.role.label: e5640a09d8faad21ce298743fe237a47 - people.invite.role.placeholder: 87cd703ed52e051f85cbbbddbfa70f42 - people.invite.name.label: 4777bbaaa0aebe104606b77947d0e22d - people.invite.name.placeholder: c8c5122a4991b298bc8bfc6f6191510e - people.invite.department.label: 8295f968e1676d62158d33a57b26963b - people.invite.department.placeholder: 311cb58c4ec975e8a66ad3022298e64a - people.invite.submit: d96c8afc504dd5d0d96ff29adae2481d - people.invite.success: 11ea1ddd721785d60778118157be18dd - people.invite.error: 6b6b9938ed912ecccb74c0871cc0394a - errors.unexpected: 9935609876f05892e8e58ddd3c34f6d4 - src/locales/pt.ts: - languages.es: 4c00162f37c68542a6ff4928b0a54ddc - languages.fr: 2f327580fa61447b4ef7af6b0ecdd2d1 - languages.no: 87ea6257a5a39f7e5f498221f15c4484 - languages.pt: 10fef620608967668bce27dc9ab6fe8e - languages.en: 4ef88329965d99db469751ad439dc7c9 - language.title: c88b33a3250b4e28f34e1ececba69206 - language.description: 9955d9bfa3362cc30a28320e9b693a70 - language.placeholder: 888cde41cf10b9387ccb49e6b3382cb0 - common.actions.save: eb7a0fed691fc71db1ac92407ca5430a - common.actions.edit: ef485eb67ac89238a4fede745a0ae94c - common.actions.delete: 856c379026c86863c3669fee546a1478 - common.actions.cancel: 847607d75e504090b5aff16a6e6c8351 - common.actions.clear: 8ae0d2d4dd7fecb4726c027b80e9d8ad - common.actions.create: 75b1629abe8e883f24abf751d7390879 - common.actions.send: 30cc00aea30ec70b7c1292b6458181c0 - common.actions.return: b6c74a4632a10a2370352564a9836765 - common.actions.success: 5297e8a08974bbcefbdb16bbc34459b0 - common.actions.error: 6112d49c7fa285c90030ad22946aa6bc - common.actions.next: f3ee1fd23d48a9ff460b32332eed5e06 - common.actions.complete: ab5aff5eaadd748bafc75f91339225ea - common.assignee.label: 42e17d509c98db2d608023fd35845109 - common.assignee.placeholder: 5310ccd08269aa38a92a86a42df163c6 - common.date.pick: d148dedebe042cdc389b640cf76c43df - common.date.due_date: cb1fc9039c600277139f70bb49a33e2b - common.status.open: b4925f97ad1407b533eb0afb37925646 - common.status.pending: ec51ded1eadec8cf7f8521794fe22deb - common.status.closed: 61f2afba43804815c397a4a961fc2bdc - common.status.archived: 2016bdc4864542b865d3bc7bca54ac15 - common.status.compliant: 324646500393a11e761356c6a0771cfd - common.status.non_compliant: 680dc7e2c72ac15e6785794cfc625110 - common.status.not_started: 05e327f5143017912e95c92a537bff01 - common.status.in_progress: c61e4c72b6da9e8ed715f8c653f1cad5 - common.status.published: 1f10a7861d15aaf098ad564a7d8a9506 - common.status.needs_review: 4ddbd0600f9836c0dae1983c4f4a3e5e - common.status.draft: 81a9e7726e3797ca8f1a076902ec64c5 - common.status.not_assessed: ffe6161b109bfbc579ecce68a9c9a001 - common.status.assessed: ce82d3d58e2a2d97fb99ba6c837caec9 - common.status.active: 4f9d837801726854629e6441618a5248 - common.status.inactive: ea1ccb9c709d9d0ac2557a9c0d7c2dce - common.filters.clear: 1c871b2ed3b78632ff9abf1831140a31 - common.filters.search: 45190492f54b2de49468bc1969319a00 - common.filters.status: ec53a8c4f07baed5d8825072c89799be - common.filters.department: 8295f968e1676d62158d33a57b26963b - common.filters.owner.label: 42e17d509c98db2d608023fd35845109 - common.filters.owner.placeholder: ea01cc33ecd9b3f7f9f5fd60c8a64171 - common.table.title: 09b79d379db0c82b4615d749b22475f0 - common.table.status: ec53a8c4f07baed5d8825072c89799be - common.table.assigned_to: 3b6d823dea1e47255b1681445f4b7007 - common.table.due_date: cb1fc9039c600277139f70bb49a33e2b - common.table.last_updated: 028e36b73abbde40da7eb0fbed8cab47 - common.table.no_results: 862b1847e091e28b1f598fb563d2886d - common.empty_states.no_results.title: ff5cfeac7ccb04f0964a795a3a9ce249 - common.empty_states.no_results.title_tasks: a3de37b791a40750b277aa705e8ad832 - common.empty_states.no_results.title_risks: f9a2b45fde00af075a484dfd3c19ef37 - common.empty_states.no_results.description: 3b2e713c5c1ff15b83595179f37c5f3d - common.empty_states.no_results.description_filters: 3b2e713c5c1ff15b83595179f37c5f3d - common.empty_states.no_results.description_no_tasks: 64ae635723b8c447884413ab2f45d738 - common.empty_states.no_results.description_no_risks: 325ee4d8a2c1df3c74b2f7318f20cf97 - common.empty_states.no_items.title: bdcb31be9a643883a28b08f48ee1fdb4 - common.empty_states.no_items.description: 80a7ebab020a79b79b066782463f57d5 - common.pagination.of: 5f02f0889301fd7be1ac972c11bf3e7d - common.pagination.items_per_page: 4278372fa919d874c10ac7a5c8f8c195 - common.pagination.rows_per_page: 10d68f351edf6bef4e66bd0653b45d35 - common.pagination.page_x_of_y: c18a6102c5d20acaa6d56e0cd4117fc3 - common.pagination.go_to_first_page: 6f0b4e4f5c835c282df6075c23b1a012 - common.pagination.go_to_previous_page: 357b948b8b788fea74d9085e48bad39b - common.pagination.go_to_next_page: 4ac38251032c8fd32c0f8eee0905e703 - common.pagination.go_to_last_page: 45577af48b903ab7e5df3fe3112999ed - common.comments.title: 5597584f522c61bb31c582e80106645a - common.comments.description: cafb8b600d1ae73c9dd2e67d6ce98971 - common.comments.add: 926b7564d52b75632dc6f385fbc7699e - common.comments.new: 90d4b6f5fcc3c131f67e34851de58342 - common.comments.save: 30c553cada2dd05ad0466c0d13f2884f - common.comments.success: 7a344c2f1a922094959e53d653cccf91 - common.comments.error: c751fed8efe63672f8ccd26bf7fd5db1 - common.comments.placeholder: 5da194254007c00ccb74a20fbb7c375e - common.comments.empty.title: 22d855bb0a191f689bef40b2f7c450ac - common.comments.empty.description: 694cd59e8a6a04af1926c4d892ed4b0b - common.attachments.title: 270774c2dc685cc979a7d7a2426bf193 - common.attachments.description: 272867e7e9ee50c8632e60934733e97b - common.attachments.upload: 28686e8efadb180216b27d20424b5bd4 - common.attachments.upload_description: 457a5ac0995f69b9692f7a2916a77041 - common.attachments.drop: fdebed8eb8723cab5c1ea83ab596419b - common.attachments.drop_description: d2c708b154d306fa050140cc6b37c4bd - common.attachments.drop_files_description: ed7ceed3975376362e27564de1f49140 - common.attachments.empty.title: 1ae9eaae2591681ef7244bbd2878b416 - common.attachments.empty.description: 272867e7e9ee50c8632e60934733e97b - common.attachments.toasts.error: 2d6168312ef0924cb02dca314a930a27 - common.attachments.toasts.error_uploading_files: d281049da2d4b1dc7faf78eb6e2b5f22 - common.attachments.toasts.error_uploading_files_multiple: c733b5b7b9e709d603e6960e36ac42e2 - common.attachments.toasts.error_no_files_selected: cdc282d2e79705fffce31b555d40df17 - common.attachments.toasts.error_file_rejected: 65e08daccaf03158ba8931d354ce8264 - common.attachments.toasts.error_failed_to_upload_files: 429aa5b87b2921e7a8388be1c2849671 - common.attachments.toasts.error_failed_to_upload_files_multiple: 429aa5b87b2921e7a8388be1c2849671 - common.attachments.toasts.error_failed_to_upload_files_single: 69e8f5c12266730db60b3f543bf2dcd7 - common.attachments.toasts.success_uploading_files: f6c0ccbf6c83c916a91f717aacf5df1c - common.attachments.toasts.success_uploading_files_multiple: f6c0ccbf6c83c916a91f717aacf5df1c - common.attachments.toasts.success_uploading_files_single: f2b05f8b144b6483afac907725615f7e - common.attachments.toasts.success_uploading_files_target: 4f4f854b846e0cf5835652f02fcc4202 - common.attachments.toasts.uploading_files: 1ea227e4762ecd399142642631946026 - common.attachments.toasts.remove_file: 9f50ec6fa949d3a61a8b2f4d1d9647ab - header.discord.button: 3e097932ea7b044d3ee86e4466da5be3 - header.feedback.button: bea4c2c8eb82d05891ddd71584881b56 - header.feedback.title: 807a2189c2d4b05e7b3f9ed644af350a - header.feedback.description: 0042be326af8c0a31139eb94c34e4adb - header.feedback.placeholder: 2c4545d251bcc2e7a5e6b6e46c2bce85 - header.feedback.success: 807a2189c2d4b05e7b3f9ed644af350a - header.feedback.error: 684a84e252a5955032434be76f4e252b - header.feedback.send: 05e0c6e79a7616e75690a1940e77c8dd - not_found.title: 28c595576890f8fac581ab66bd47a8ff - not_found.description: 5b03bd3a1e1f0c56f21f0070d1b2141e - not_found.return: 2e69b282e6b87d393ddd0f63fad2ac5e - theme.options.light: abfd24adfebef98d653b605aa62baf2f - theme.options.dark: ae89b1e92ad911530a418a02d22ce2be - theme.options.system: b431d1485aa37ae09fa4bfa7883356ca - sidebar.overview: cd28583cdbf0f1c34b19e9d0873507a1 - sidebar.policies: 4baeafc5b98154e818683d92ca8db26e - sidebar.risk: 89e67233324f6bf6482a163efbda2369 - sidebar.vendors: c49681b875095566ed81d8c9455e6a29 - sidebar.integrations: 6ea79a8a769fc5a36cec1433f739cce6 - sidebar.settings: 2571dd516a1452eb3b5a17d007c5bac8 - sidebar.evidence: 79659c6536da5576e799c8963d424989 - sidebar.people: de14276d9e07d3296ba1bce76ad662c9 - auth.title: d3dee5288f72e4006f7b387b33e8b0fd - auth.description: 44d8091282bf87cc8b02cb7b50fbc272 - auth.options: 9febeddd5826cda96b734eff7e15c2f6 - auth.google: e2f4aa3b734883b594e9bc1a9c64f6ed - auth.email.description: 361997457f147f9501938a657bba07d3 - auth.email.placeholder: f030b88f98efc5be67a08c28be0e1263 - auth.email.button: a28904929e7a3da701df543b1d7e4e3a - auth.email.magic_link_sent: e8c3531a07bd180b5ad59a57441bfa62 - auth.email.magic_link_description: 097f805fee9ac18297eb468667ab8a6e - auth.email.magic_link_try_again: c395014b79d95b611745a4c317cdb4d4 - auth.email.success: acd0ae4bd3549336a010fcf989da3f1c - auth.email.error: 805f95100697eecdb8cef96fb15d10cd - auth.terms: 41a8f1fa81e9b287091995bd22be1f17 - onboarding.title: 5d6c3337b9384c5301f2354348702016 - onboarding.setup: 55d582fb4f8b2f2ec10923e0fc8c9443 - onboarding.description: 2a53dba72fc5a88f7d1404131041fcad - onboarding.fields.name.label: c284797ea69dae13341c890c9bae42cb - onboarding.fields.name.placeholder: c7fdda77b1c21c452a28665395b85bdd - onboarding.fields.website.label: 15bbb9d0bbf25e8d2978de1168c749dc - onboarding.fields.website.placeholder: d81cdec86f715b8622cf347dc4973016 - onboarding.fields.subdomain.label: dabf829b1d3442c8badfc2a3d4e430cf - onboarding.fields.subdomain.placeholder: 8eb90ec152bd30f4a53f15bf805783dc - onboarding.success: f169b0588571a64267de3cbf9db7b33e - onboarding.error: 2d6168312ef0924cb02dca314a930a27 - onboarding.unavailable: 188e7af993bcd42736645153c43cdcb7 - overview.title: cd28583cdbf0f1c34b19e9d0873507a1 - overview.framework_chart.title: 96e7fa45ec20d87983cbf574d0dd6764 - overview.requirement_chart.title: 8b0319e7fc9a6f7c87280fa4fd4196a1 - policies.dashboard.title: 96a7b5490bcd3652a0c2bf36c1ffce2b - policies.dashboard.all: c5baae8efe552d4e76e37f708bf42b55 - policies.dashboard.policy_status: 60d2b66ef83e5571dab65baaf6770ebc - policies.dashboard.policies_by_assignee: 0bbc93363ac5efef606d89761cbe5119 - policies.dashboard.policies_by_framework: 6c295c5e4d8d4df08d474f4868c275c2 - policies.table.name: 8334ac9c9adf7b5d08fbce9ffbaf2b71 - policies.table.statuses.draft: 81a9e7726e3797ca8f1a076902ec64c5 - policies.table.statuses.published: 1f10a7861d15aaf098ad564a7d8a9506 - policies.table.filters.owner.label: 42e17d509c98db2d608023fd35845109 - policies.table.filters.owner.placeholder: ea01cc33ecd9b3f7f9f5fd60c8a64171 - policies.filters.search: 53ea9ad8d3da19ff64cd290e649de0b0 - policies.filters.all: c5baae8efe552d4e76e37f708bf42b55 - policies.status.draft: 81a9e7726e3797ca8f1a076902ec64c5 - policies.status.published: 1f10a7861d15aaf098ad564a7d8a9506 - policies.status.needs_review: 4ddbd0600f9836c0dae1983c4f4a3e5e - policies.policies: b1dc11822e33e5f1ecb29739878bb048 - evidence_tasks.evidence_tasks: 79659c6536da5576e799c8963d424989 - evidence_tasks.overview: cd28583cdbf0f1c34b19e9d0873507a1 - risk.risks: 1a3cfae873932512f8de83d0e8460230 - risk.overview: cd28583cdbf0f1c34b19e9d0873507a1 - risk.create: aa66bfbc1954619721cc70562df00658 - risk.vendor.title: ce8b8497c0273fa2f2ef89813324a694 - risk.vendor.dashboard.title: 5ab98eaf54ba7f97b14e9a8d33911774 - risk.vendor.dashboard.overview: 86d10b5fa129cb56914ea9bdd36f54d6 - risk.vendor.dashboard.vendor_status: 91730c68a5fed0e1346dafe2ae32a2b4 - risk.vendor.dashboard.vendor_category: a81f5288b74e8d16de1e446fec13bd7c - risk.vendor.dashboard.vendors_by_assignee: aec30b4652068d4ef3745d04c01bda25 - risk.vendor.dashboard.inherent_risk_description: f965942278a201c2aa1d0d8f7a008afa - risk.vendor.dashboard.residual_risk_description: 2440cac623c600164a04f3b05f78c373 - risk.vendor.register.title: f6e06a1f3c90f935e2b5bca7d0788382 - risk.vendor.register.table.name: c0289e98897ab58f231c168b19a67b2e - risk.vendor.register.table.category: 70c4fe802624c6daef688eced9f59cbc - risk.vendor.register.table.status: ec53a8c4f07baed5d8825072c89799be - risk.vendor.register.table.owner: 42e17d509c98db2d608023fd35845109 - risk.vendor.assessment.title: 414a4f3056cd69c64403f45c03bb93ee - risk.vendor.assessment.update_success: 73bc563946eded7e955e572b295f62b6 - risk.vendor.assessment.update_error: 553c38f3cfed038e66e41577cb56a828 - risk.vendor.assessment.inherent_risk: 697112dd2beccbf5dc87c4c638558164 - risk.vendor.assessment.residual_risk: aac9a2ffa7686712343487e079deed94 - risk.vendor.form.vendor_details: a3298588bcf6866cec770faaa9d06798 - risk.vendor.form.vendor_name: c0289e98897ab58f231c168b19a67b2e - risk.vendor.form.vendor_name_placeholder: bd3ad8123533e654111d5f5581869b2d - risk.vendor.form.vendor_website: 15bbb9d0bbf25e8d2978de1168c749dc - risk.vendor.form.vendor_website_placeholder: c218ac76e32ab77bd9d0f269f1207e4a - risk.vendor.form.vendor_description: c1c2501bcc9382417cb275c94f29fc48 - risk.vendor.form.vendor_description_placeholder: a5ed5cc3d50b95e31bc9520ba51ab91e - risk.vendor.form.vendor_category: 70c4fe802624c6daef688eced9f59cbc - risk.vendor.form.vendor_category_placeholder: 17d2a3856c291ffea6eda334f4424027 - risk.vendor.form.vendor_status: ec53a8c4f07baed5d8825072c89799be - risk.vendor.form.vendor_status_placeholder: 10e68e59fac1690037f17f8c88fec65a - risk.vendor.form.create_vendor_success: 0879e68cdb20b8323da83f4c580ea560 - risk.vendor.form.create_vendor_error: 76facd664848f7497dd394c2ad887c92 - risk.vendor.form.update_vendor: b2385eb375e485f29467d82a87f5ed69 - risk.vendor.form.update_vendor_success: 2f1a758fe63847632dd896077c6d3831 - risk.vendor.form.update_vendor_error: af47bf45ba564e753c0077e36a3c0bcb - risk.vendor.form.add_comment: 926b7564d52b75632dc6f385fbc7699e - risk.vendor.table.name: c0289e98897ab58f231c168b19a67b2e - risk.vendor.table.category: 70c4fe802624c6daef688eced9f59cbc - risk.vendor.table.status: ec53a8c4f07baed5d8825072c89799be - risk.vendor.table.owner: e61f95fd2a8da8531a4052e6d619d03d - risk.vendor.filters.search_placeholder: 526ab1f4258f972d442accfbf7d628a0 - risk.vendor.filters.status_placeholder: 0a37cd71955558ebceb296071b5771e5 - risk.vendor.filters.category_placeholder: e56a33cc92809bf48100557efe063f4d - risk.vendor.filters.owner_placeholder: dd71b7bc9e24213f4dbc1098a57ac73f - risk.vendor.empty_states.no_vendors.title: 744210194114cc4a2fd31524e50eba40 - risk.vendor.empty_states.no_vendors.description: 3e90762081ce5f2740438c6ff481038d - risk.vendor.empty_states.no_results.title: 862b1847e091e28b1f598fb563d2886d - risk.vendor.empty_states.no_results.description: b174c45c623da80e3354e959e25b4455 - risk.vendor.empty_states.no_results.description_with_filters: 7a2e20b527b82016631de60b987185df - risk.vendor.actions.create: c6d7f1949919661ec78783c0cf87de58 - risk.vendor.status.not_assessed: ffe6161b109bfbc579ecce68a9c9a001 - risk.vendor.status.in_progress: c61e4c72b6da9e8ed715f8c653f1cad5 - risk.vendor.status.assessed: ce82d3d58e2a2d97fb99ba6c837caec9 - risk.vendor.category.cloud: d8f1ac63ebc38eb42b842e37f6c00f7b - risk.vendor.category.infrastructure: 76f1e8b834b9e58d9e0115e9f36c6cb0 - risk.vendor.category.software_as_a_service: 4819a83a9f40aa0eb8fc3445495cad06 - risk.vendor.category.finance: f9a72aba65a7c21dbfca9aafa4b6dc82 - risk.vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b - risk.vendor.category.sales: 385d3cdb883bdeba854341141b694a56 - risk.vendor.category.hr: 9508a19d7801e07ee7b7628c31bfdd47 - risk.vendor.category.other: 21e6facb2210089479e2aa9c41762ca0 - risk.vendor.risk_level.low: ce02913c9941fd9da1fee0451594bf6b - risk.vendor.risk_level.medium: ba2d1a289288d5ee48035071ee912bd1 - risk.vendor.risk_level.high: 639fdfd4c0a6887e608aeeb00f035f42 - risk.vendor.risk_level.unknown: 58801ed4ae2e727c89431a8bdd4c58ab - risk.dashboard.title: 96a7b5490bcd3652a0c2bf36c1ffce2b - risk.dashboard.overview: 7820022e25f8b03293664c9bede3468b - risk.dashboard.risk_status: 3944857c84689246f44b9bc2ffba4af3 - risk.dashboard.risks_by_department: 36636303b0a6c1af8bdf3973982352c7 - risk.dashboard.risks_by_assignee: a17cb075856bc875840221cc7c410996 - risk.dashboard.inherent_risk_description: 2fcf43599608f68e47a6365a5c534480 - risk.dashboard.residual_risk_description: a70e0df117fcf0eed62933ecd7f347d2 - risk.dashboard.risk_assessment_description: 9e0bb9f710e60d4d7b25d6c7ddaad681 - risk.register.title: 4b11e02c643bb840fa72e66bb9452118 - risk.register.table.risk: 89e67233324f6bf6482a163efbda2369 - risk.register.empty.no_risks.title: 325ee4d8a2c1df3c74b2f7318f20cf97 - risk.register.empty.no_risks.description: 15f3d07d22c396f1ab2b62bc6369b377 - risk.register.empty.create_risk: c1f81c1f811a92eab56e1bfaf5d2e405 - risk.metrics.probability: 3132a67fc5e91b7b3cd37e5ea3d1cb80 - risk.metrics.impact: 5c5a54a8bb5bb610beec1345cd62c2e9 - risk.metrics.inherentRisk: 697112dd2beccbf5dc87c4c638558164 - risk.metrics.residualRisk: aac9a2ffa7686712343487e079deed94 - risk.form.update_inherent_risk: 95662fbf36edb0c79750f6d1bb18a2a3 - risk.form.update_inherent_risk_description: 22643f16bdd9c99e1ca59690edf126d1 - risk.form.update_inherent_risk_success: d4d1a21e86933491685d88524bbfcca2 - risk.form.update_inherent_risk_error: 742a1fe4187bd5101566965f11bb01f0 - risk.form.update_residual_risk: b9a8bfbd96b2a67eb4c4ff0d6ab07d3a - risk.form.update_residual_risk_description: 3f238ba2256a467093240a17504d4495 - risk.form.update_residual_risk_success: b4ae56729bf7b1fbd0edacd80e7e0cd2 - risk.form.update_residual_risk_error: 00d0a73df2969cd72130d1dc42decaf7 - risk.form.update_risk: 77aa997939ee70c49c8983cc8b337414 - risk.form.update_risk_description: a23dc78d61ec199e35c9ef20c6b03b5a - risk.form.update_risk_success: eb383ceadb5acb8e4c5a8c67b26b2794 - risk.form.update_risk_error: 5519353863c4d53f79d5e1c628cec293 - risk.form.create_risk_success: 2087e3af5f33076a7bf1abee8aacf4f3 - risk.form.create_risk_error: 3cd55fed30677567cb4b350bdc8fbe67 - risk.form.risk_details: 83aec7283c39c233747d587584953af7 - risk.form.risk_title: 68652ef8c5e1e00cec64b5a4edba7d83 - risk.form.risk_title_description: dbdad73e6af7ec2848ff4862bfddcbd0 - risk.form.risk_description: c1c2501bcc9382417cb275c94f29fc48 - risk.form.risk_description_description: dedf417f4b4d7ce71ee2c48cb70fc877 - risk.form.risk_category: 70c4fe802624c6daef688eced9f59cbc - risk.form.risk_category_placeholder: 65fc9322f796e9e58ed1487dcca329ab - risk.form.risk_department: 8295f968e1676d62158d33a57b26963b - risk.form.risk_department_placeholder: 3645419486d6418952e3a03c3ec6667b - risk.form.risk_status: 3944857c84689246f44b9bc2ffba4af3 - risk.form.risk_status_placeholder: 840270830540663cdbd9b5a39c7f700b - risk.tasks.title: b3cbbfcad6f3e417a9806b2aef4bc1e7 - risk.tasks.attachments: 270774c2dc685cc979a7d7a2426bf193 - risk.tasks.overview: 7461c318975f1e8a62eae97c76fc30d0 - risk.tasks.form.title: 325957719cdade998c839f8f3cb6dc03 - risk.tasks.form.task_title: 8268ad91fb6ddfdd262e3fa550b0dcc4 - risk.tasks.form.status: dc2c81cba8d9027d9b6a980d1daa7de4 - risk.tasks.form.status_placeholder: cadec19150249777b87de5c742fab360 - risk.tasks.form.task_title_description: e9211721622d13836564fd13f87f4552 - risk.tasks.form.description: c1c2501bcc9382417cb275c94f29fc48 - risk.tasks.form.description_description: 88a401fc067062292a0c7979fb0ecbde - risk.tasks.form.due_date: cb1fc9039c600277139f70bb49a33e2b - risk.tasks.form.due_date_description: fe5f76727449a9d858ec1f609f176372 - risk.tasks.form.success: d75b32b4a0df4a9035b59ca005c8ecdd - risk.tasks.form.error: b4fea2ec922c17684a0c0972ad97ccb2 - risk.tasks.sheet.title: 4190961de70fa6de3c4a5fee5663229c - risk.tasks.sheet.update: 0615b088bc762ba3091315168d1598c1 - risk.tasks.sheet.update_description: 4b4d1e0696989b23e585bbe1106a8726 - risk.tasks.empty.description_create: 6486acace7656babb2158c1ba50507a2 - settings.general.title: 42238015090fc2146650bd7f9d58906b - settings.general.org_name: c284797ea69dae13341c890c9bae42cb - settings.general.org_name_description: 9ce71182dd9e5e85a2f62b56f8a691f2 - settings.general.org_name_tip: 7b8522878ea20a58b8c520d9e1db95f5 - settings.general.org_website: 1bebecedcdca28f65a6061ad9b224733 - settings.general.org_website_description: c75b8827b23ca3cb1149fbf33d526e59 - settings.general.org_website_tip: 28df9ff1b1948735dc9459625998327b - settings.general.org_website_error: 218e614be93028229c3b1fe86075f1d7 - settings.general.org_website_updated: c89da6ad5dbe9ec8800c1343178e2fbd - settings.general.org_delete: db3ad60a9ae7246527ef1cef12b63988 - settings.general.org_delete_description: 61d5665062c698eeac4ef7f72ab9ba25 - settings.general.org_delete_alert_title: da782681d68eb314ddd0d6943e4b71ed - settings.general.org_delete_alert_description: 0e261b16beb44a8be4439e9a40de324a - settings.general.org_delete_error: 3692b96ecb1f66c9f68f0398d71cf27b - settings.general.org_delete_success: c0efc9cf51a6b8b5df766e8807ec45f9 - settings.general.org_name_updated: 6630dec5903ae536758c507841c821bf - settings.general.org_name_error: 9cfe63f246f0632c24b05628a8758ee1 - settings.general.save_button: eb7a0fed691fc71db1ac92407ca5430a - settings.general.delete_button: 856c379026c86863c3669fee546a1478 - settings.general.delete_confirm: 88c696cdd318ec057f03d1117070caa1 - settings.general.delete_confirm_tip: 716577e83795c92f3b36b6586ce5af39 - settings.general.cancel_button: 847607d75e504090b5aff16a6e6c8351 - settings.members.title: 0a32c571a23ff25825a98355c504e644 - settings.billing.title: 4cef1eb01568374a2f344dc7ab04d5de - user_menu.theme: f055088fba41cb53e3806e55a9f6896e - user_menu.language: d62a3259ece127d00905fbe37f1b5cea - user_menu.sign_out: 790ed91ff5545849d3b4cb2e88c750e4 - user_menu.account: 8192dbe80e3401ebe872e0aed980daa1 - user_menu.support: 76420e3e2ec10bca79d6bfcc6356354c - user_menu.settings: 2571dd516a1452eb3b5a17d007c5bac8 - user_menu.teams: efd4f70e8bf06861f8037d6e3ce93ea9 - frameworks.title: e9a26954f3386e69508ceb81f858cc21 - frameworks.controls.title: 26beed84513191c01e2574d317c239d0 - frameworks.controls.description: c1e880d8b3d944000e8945d03adfd389 - frameworks.controls.table.status: ec53a8c4f07baed5d8825072c89799be - frameworks.controls.table.control: 35c43f0e9257f550812716f62519b08c - frameworks.controls.table.artifacts: 6a755bbcf3e0bfd53426ff65a839caae - frameworks.controls.table.actions: fc5f5e82d59c64157e30b122567488f9 - frameworks.controls.statuses.not_started: 05e327f5143017912e95c92a537bff01 - frameworks.controls.statuses.compliant: 324646500393a11e761356c6a0771cfd - frameworks.controls.statuses.non_compliant: 680dc7e2c72ac15e6785794cfc625110 - vendor.title: 96a7b5490bcd3652a0c2bf36c1ffce2b - vendor.register_title: e9688c6f464f67883d1e0698e11353db - vendor.dashboard.title: 96a7b5490bcd3652a0c2bf36c1ffce2b - vendor.dashboard.overview: 2e36d54666859c9fea4b575c8dee0263 - vendor.dashboard.vendor_status: 91730c68a5fed0e1346dafe2ae32a2b4 - vendor.dashboard.vendor_category: a81f5288b74e8d16de1e446fec13bd7c - vendor.dashboard.vendors_by_assignee: aec30b4652068d4ef3745d04c01bda25 - vendor.dashboard.inherent_risk_description: f0d48ce192ae0b005e7ec35ca57cb7b3 - vendor.dashboard.residual_risk_description: 2440cac623c600164a04f3b05f78c373 - vendor.register.title: f6e06a1f3c90f935e2b5bca7d0788382 - vendor.register.table.name: c0289e98897ab58f231c168b19a67b2e - vendor.register.table.category: 70c4fe802624c6daef688eced9f59cbc - vendor.register.table.status: ec53a8c4f07baed5d8825072c89799be - vendor.register.table.owner: e61f95fd2a8da8531a4052e6d619d03d - vendor.category.cloud: d8f1ac63ebc38eb42b842e37f6c00f7b - vendor.category.infrastructure: 76f1e8b834b9e58d9e0115e9f36c6cb0 - vendor.category.software_as_a_service: b0ca9e41d61885345eef09f928c9ea58 - vendor.category.finance: f9a72aba65a7c21dbfca9aafa4b6dc82 - vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b - vendor.category.sales: 385d3cdb883bdeba854341141b694a56 - vendor.category.hr: 9508a19d7801e07ee7b7628c31bfdd47 - vendor.category.other: 21e6facb2210089479e2aa9c41762ca0 - vendor.vendors: d05a1e8f4af4f67d1bb53699a0620305 - vendor.form.vendor_details: a3298588bcf6866cec770faaa9d06798 - vendor.form.vendor_name: c0289e98897ab58f231c168b19a67b2e - vendor.form.vendor_name_placeholder: 6b87b3ced79ecdf4ca122a481b2f3135 - vendor.form.vendor_website: 15bbb9d0bbf25e8d2978de1168c749dc - vendor.form.vendor_website_placeholder: de95e6e14146096c4c57e03646c9a334 - vendor.form.vendor_description: c1c2501bcc9382417cb275c94f29fc48 - vendor.form.vendor_description_placeholder: 5a3f3ccac15e3c49e1cc1067b4edac68 - vendor.form.vendor_category: 70c4fe802624c6daef688eced9f59cbc - vendor.form.vendor_category_placeholder: 17d2a3856c291ffea6eda334f4424027 - vendor.form.vendor_status: ec53a8c4f07baed5d8825072c89799be - vendor.form.vendor_status_placeholder: 10e68e59fac1690037f17f8c88fec65a - vendor.form.create_vendor_success: 0879e68cdb20b8323da83f4c580ea560 - vendor.form.create_vendor_error: 76facd664848f7497dd394c2ad887c92 - vendor.form.update_vendor_success: 2f1a758fe63847632dd896077c6d3831 - vendor.form.update_vendor_error: af47bf45ba564e753c0077e36a3c0bcb - vendor.form.contacts: 4602565d6d53416500329655da650db3 - vendor.form.contact_name: 9b00db010cd829a3173d211bd98d679c - vendor.form.contact_email: 3c7b2715d2b837f53b1602e5b8d73fb6 - vendor.form.contact_role: 2dfe3611c32274fd06c09fbda97baf13 - vendor.form.add_contact: 16dea9930657f69a7200ef8107b606eb - vendor.form.new_contact: 208c272dcf48ebf096b583bb702523e6 - vendor.form.min_one_contact_required: 2da7ac3bc73f4654a10387012cdbabff - vendor.empty_states.no_vendors.title: 744210194114cc4a2fd31524e50eba40 - vendor.empty_states.no_vendors.description: 3e90762081ce5f2740438c6ff481038d - vendor.empty_states.no_results.title: 862b1847e091e28b1f598fb563d2886d - vendor.empty_states.no_results.description: b174c45c623da80e3354e959e25b4455 - vendor.empty_states.no_results.description_with_filters: 7a2e20b527b82016631de60b987185df - people.title: de14276d9e07d3296ba1bce76ad662c9 - people.details.taskProgress: 99f91ad5736e6e0e28293ea4666f9325 - people.details.tasks: b3cbbfcad6f3e417a9806b2aef4bc1e7 - people.details.noTasks: 017f0c642dbadc67ef139bed5b105d3f - people.description: 3324626e8ebf65a5a59c0126d0648e45 - people.filters.search: 105ab8ef319a09e18284b3884a270d22 - people.filters.role: cf21f9ec1502cab0cde92f9ef4f23671 - people.actions.invite: ad7d5f0640b499c20262396d52c0ad7e - people.actions.clear: 1c871b2ed3b78632ff9abf1831140a31 - people.table.name: c0289e98897ab58f231c168b19a67b2e - people.table.email: ce8ae9da5b7cd6c3df2929543a9af92d - people.table.department: 8295f968e1676d62158d33a57b26963b - people.table.externalId: 5631db58ab63e92ccbb9af8f04256a98 - people.empty.no_employees.title: 3da7656577f669e120508a55a3227874 - people.empty.no_employees.description: fb799e2f9e0aab131101641b3b1bb1d2 - people.empty.no_results.title: 862b1847e091e28b1f598fb563d2886d - people.empty.no_results.description: 0732b0b799782fa2fc2abf93e5847c05 - people.empty.no_results.description_with_filters: 7a2e20b527b82016631de60b987185df - people.invite.title: ad7d5f0640b499c20262396d52c0ad7e - people.invite.description: 0b0a1c58aa1e24551cee8f736a8811dc - people.invite.email.label: 1967607bee452269643095c8444907cf - people.invite.email.placeholder: 6d30afa49e14951befc0a3cb5e7ad0cc - people.invite.role.label: 8dd5e244a5bb391135b671b9a0b1ba67 - people.invite.role.placeholder: 3a30ffd4e9ccb21876bfa08fea6e2eac - people.invite.name.label: c0289e98897ab58f231c168b19a67b2e - people.invite.name.placeholder: fada62ea46d5b3f957f2ecc64032c1dd - people.invite.department.label: 8295f968e1676d62158d33a57b26963b - people.invite.department.placeholder: 3645419486d6418952e3a03c3ec6667b - people.invite.submit: ad7d5f0640b499c20262396d52c0ad7e - people.invite.success: e67fc65e2c44a2a2f88e0b3a60e33f23 - people.invite.error: 769ce470a83583ec5d5c4da7ab509604 - errors.unexpected: a52e3b2219bb8c8a7bac3f1b3f625f88 - src/locales/fr.ts: - languages.es: 6a77de34cb21ce61732b71a27825c63a - languages.fr: e0545693906575b04aa1650abd60faba - languages.no: 1aca30cfbbaac249bf033d480f8e2b73 - languages.pt: 292fba65c6fd3610931fb93fd1b012e8 - languages.en: b82673617c50d2c2b79893656315994a - language.title: 1ea21417b4fc870a18d6a244983be72b - language.description: d070e9c230541b0ea87e9535f819f63c - language.placeholder: b884345f1cf7b083cbb162cbb91b21a1 - common.actions.save: aed88202e2432ee2a613f9120ef7486b - common.actions.edit: 898c079d2e62a4b1971dfbad9d860838 - common.actions.delete: ccfd9851b50aaa671513b50d158ed579 - common.actions.cancel: d12c3b0dcf75614dafb2ac6bdaa77a26 - common.actions.clear: 1e9a49ea1dfc342c61fe75a9eb9e7b23 - common.actions.create: 205be9be7dda08c4608df07c0295340b - common.actions.send: 770a1a1e17972d73a5f39914e0d5c6b1 - common.actions.return: 9ce5c3f80eb821b677c66063a6861d07 - common.actions.success: f3ca514e91e895424f467c94b204d32f - common.actions.error: fe7d2cb7d4db59ae3c13b1d29aa2515e - common.actions.next: 257a7b4c17035553819990bc73114989 - common.actions.complete: a2824b0e3feba7627a4fa3cbc0e52857 - common.assignee.label: ff63fdc126b306fc67c01e481a93eda9 - common.assignee.placeholder: 2c8be12ef0c2e4bfdf2984c75a6dee61 - common.date.pick: c9baf91d28972545488f147e10b713c9 - common.date.due_date: de9507035b945d2715634ac4c1baa402 - common.status.open: b19a0a5407807fe32f57d10a3f53ce2f - common.status.pending: 439149be8bfe2e2ff0c156e35bfd5894 - common.status.closed: e7cd586e50130b30c68e169d2cfe9368 - common.status.archived: 9fd0976b1c14abf3cd2dcfa25083daec - common.status.compliant: 324646500393a11e761356c6a0771cfd - common.status.non_compliant: e43c8d536e0e1b5419b7704893374be8 - common.status.not_started: 97a8462abdccd0463ba462fb9ee0833a - common.status.in_progress: 7202b8ffa44d203b76371de10e54d0b8 - common.status.published: daaf3c6e6a7579155c08ff51243512c6 - common.status.needs_review: 38ba5b4ca898f3bac2201694b48bebc9 - common.status.draft: 540e360892172e34f1d10ba632cebb01 - common.status.not_assessed: 121637ecde942b30505a7b7192065ae9 - common.status.assessed: 241639d85e1ad7d3ebd95b273adc743a - common.status.active: a9f35372e5f038fe5244dc297166e30e - common.status.inactive: f620242d11962f68a10edf059eac2242 - common.filters.clear: 180c6431db153b1503b8623e96c2e710 - common.filters.search: da21962e48634867f8aec7b5e6488bf4 - common.filters.status: 87a831bc99060c55b50dbe91c6aab6e9 - common.filters.department: df393600825b049c6ee18c9980aaf28a - common.filters.owner.label: ff63fdc126b306fc67c01e481a93eda9 - common.filters.owner.placeholder: 09950ebe6f41d2edf4fd543f6afea6f9 - common.table.title: 99fb48ddce014d8ad24810eeb3bfde68 - common.table.status: 87a831bc99060c55b50dbe91c6aab6e9 - common.table.assigned_to: ff63fdc126b306fc67c01e481a93eda9 - common.table.due_date: de9507035b945d2715634ac4c1baa402 - common.table.last_updated: 2849ca53fc1e67155cf0492d958c2a3c - common.table.no_results: 5bb69fe3b7a4d5220a445c029fb02c19 - common.empty_states.no_results.title: 17e6abcc4dedc0279075ef696d7015f8 - common.empty_states.no_results.title_tasks: b12536be908db1d99be1fe81caf8a797 - common.empty_states.no_results.title_risks: 0cf054bd1e2bbbcf4520b78a8afb94c1 - common.empty_states.no_results.description: 253e55c16cbdf08574a69fd77ee1369c - common.empty_states.no_results.description_filters: 253e55c16cbdf08574a69fd77ee1369c - common.empty_states.no_results.description_no_tasks: 589b3766f524e9cf302309ca0c6b6bc8 - common.empty_states.no_results.description_no_risks: afe3d187294fb343c64c78892f7a60d6 - common.empty_states.no_items.title: a2aa17abe12b80a0d67da4e866462c3c - common.empty_states.no_items.description: 219188375ccd9447b4cae0683522d15b - common.pagination.of: 5f02f0889301fd7be1ac972c11bf3e7d - common.pagination.items_per_page: 8d980ee75cfdeda7d522597b829b9fbc - common.pagination.rows_per_page: eec799c82ad6fa8aa71025a60d139546 - common.pagination.page_x_of_y: a67de57207aa54765439caee7fd5a443 - common.pagination.go_to_first_page: 135f878d3f8dcd0c0b41e3c50c226fe9 - common.pagination.go_to_previous_page: 292138d3fdbb1e4481eec9afe25e926f - common.pagination.go_to_next_page: a5ac391d5bff89b404ba2dcfa30bf0f3 - common.pagination.go_to_last_page: 1a4f7f54745a0be5fc64177cf2a612fc - common.comments.title: 5c24fbbfb392e568825bb135061ba191 - common.comments.description: 6f740138d70543ed65d133c81ac7dede - common.comments.add: 04979267671e33bcd261434689879386 - common.comments.new: d2524d2d1778e4d9fa845eb2196ac14b - common.comments.save: 3d98c13645056d1dbb602b7fd5c41b23 - common.comments.success: 1c0e3d2ff72596c36a7251ec434a283e - common.comments.error: 46a5adfdacd82ded622f4f44e9aeee99 - common.comments.placeholder: 1ce0f77b60460f31ac0d8737f4c55d20 - common.comments.empty.title: b0571496f7eabcb36a9e88bdafc77752 - common.comments.empty.description: 45befd23701b8333276482d157dd096d - common.attachments.title: 7517e49d3a1f76eda505075e22139876 - common.attachments.description: 07e4e32a76a7ca28ad8d55130e8798da - common.attachments.upload: 84ee1b7210866cf40ecd985f355864c9 - common.attachments.upload_description: 0b8f185d25b8584a6d514cdfc4d46cc0 - common.attachments.drop: a622b08f62d1e86d8f2624f6f583e3d7 - common.attachments.drop_description: 5425dcc731eac557b7ff621205d04e17 - common.attachments.drop_files_description: f80b7f937fe32459859ca9744578f231 - common.attachments.empty.title: 274d7e6eb96b1f13f5afec3e17f8de50 - common.attachments.empty.description: 07e4e32a76a7ca28ad8d55130e8798da - common.attachments.toasts.error: 34056dd5780c5ce0db55bbbe40ed7908 - common.attachments.toasts.error_uploading_files: 4ef4e08b2e5117a1199cac1627922442 - common.attachments.toasts.error_uploading_files_multiple: 9f0fe47189c3a38b3213fecf6454c9d2 - common.attachments.toasts.error_no_files_selected: 674a8934ec879aee45b7bca6510086ef - common.attachments.toasts.error_file_rejected: d850819e566556f064525a1d2c9a3b16 - common.attachments.toasts.error_failed_to_upload_files: 1f62656efb4499f26706973bc258076e - common.attachments.toasts.error_failed_to_upload_files_multiple: 1f62656efb4499f26706973bc258076e - common.attachments.toasts.error_failed_to_upload_files_single: fcdfd5cf6cfc086848fa495ee3dd6ea1 - common.attachments.toasts.success_uploading_files: 716c2d42220f747f34db9c25425c32cf - common.attachments.toasts.success_uploading_files_multiple: 716c2d42220f747f34db9c25425c32cf - common.attachments.toasts.success_uploading_files_single: a4d1651fe8f1c236be76d2f12c97d990 - common.attachments.toasts.success_uploading_files_target: e13e03d9b5e6742e78594531f1b82b73 - common.attachments.toasts.uploading_files: 86bbec742ccec94af0dbf327e7c16c4d - common.attachments.toasts.remove_file: 207436b9083d98b60132bf2d835053f9 - header.discord.button: 323331b0d9775db6561544fefa3aa793 - header.feedback.button: 19d8c9f2c75b15539dd3168a41d85ba1 - header.feedback.title: fa8254ef84a9eff403cf44b4babbaf25 - header.feedback.description: ebeeae5e45bcd0d10936e1c60b8226ad - header.feedback.placeholder: 3d33a19a5f33da89cab0678e2f7285a5 - header.feedback.success: fa8254ef84a9eff403cf44b4babbaf25 - header.feedback.error: 8bec949efd475a5e9e481e2a90325964 - header.feedback.send: 9356894a834f01c9c761606799ad6e33 - not_found.title: 5c44cae06137d5abc98833d14009e91f - not_found.description: d4ea72f060fea4b7be9f293620babb7f - not_found.return: f27714bfa8734faaa1621bed3a939d93 - theme.options.light: c7e206a03eb924b8cf6f15e8c70f1f07 - theme.options.dark: 19bdcdffdcb06cb2f0a62af523ec7fea - theme.options.system: b222ce1d25f19d7b8ca005440c794baf - sidebar.overview: 39909e63e1c7c5c0be8caab4e5e04b70 - sidebar.policies: c1fe3cce74c4745582c235364d9b8412 - sidebar.risk: 508428a451143207631e5bbd5d88e4d5 - sidebar.vendors: 20a50f9498efd294c6c653d2804c0827 - sidebar.integrations: 4c772dc39d61569ecea19082f498b8e6 - sidebar.settings: e7785de91330713fc2d12404bb6bd556 - sidebar.evidence: d45cf3774e592d0684d86c7e054949ff - sidebar.people: 5557260365f759ca82cf108b3d8bef8f - auth.title: ebdfba346dd9e4711096c80e9e9c2e87 - auth.description: 3aee5e88dd1aaaee41469153656b49bd - auth.options: 46b0e6460135122c2066d3a59fc99a7c - auth.google: b21b990297dd2872b27b79827f0c4d41 - auth.email.description: e1ba2101ca538a7c06b7c296b8990a51 - auth.email.placeholder: 5a6940a4d212e6c6fd224ae8c9744232 - auth.email.button: 9ba2458f84fd2145422c83643921dbc6 - auth.email.magic_link_sent: 2c8df655d6a6c44b95a6249bc565f938 - auth.email.magic_link_description: 8120a9c352bc3fed0399ac19907832c0 - auth.email.magic_link_try_again: 7391a7f1fe944d3e1adde8a6d03eb8ad - auth.email.success: 5226f9acf605ea0bf2708f92c4d85a74 - auth.email.error: bbe96386040cf929f3016bdd22885d17 - auth.terms: 121af8bef59e82f7d546fe020a7eb717 - onboarding.title: 94bc46a0fe49ed676d3c28c0be6c5d01 - onboarding.setup: 254f642527b45bc260048e30704edb39 - onboarding.description: c50fec9a9bd2275d0dbc56d68cf8be2d - onboarding.fields.name.label: a4cd2eb4b24cfd61f366e642e6a05186 - onboarding.fields.name.placeholder: 008dcd606c353e78aa6406768db89870 - onboarding.fields.website.label: ca09410963c66f80a9bd39bdc8ae95cf - onboarding.fields.website.placeholder: d0db696a804edd4fd8dda2c727dc3539 - onboarding.fields.subdomain.label: f6a31676af3d50ed039c99b52565a3fb - onboarding.fields.subdomain.placeholder: 771f5924706521c73464341fc48afb05 - onboarding.success: 8c85b7115a0125bcdee80439d80a897d - onboarding.error: 34056dd5780c5ce0db55bbbe40ed7908 - onboarding.unavailable: 1e3a8dc8a682114a6494f0086f174ad0 - overview.title: 39909e63e1c7c5c0be8caab4e5e04b70 - overview.framework_chart.title: c854a940f23a125f6284b589155184f3 - overview.requirement_chart.title: f2b3b5556d4c3bef00fd5eabb5078d28 - policies.dashboard.title: 4a37efc27391cc18714c72981d59c072 - policies.dashboard.all: 88f396f7dfc148c975e87eae138752a5 - policies.dashboard.policy_status: e920d82fba73ed51d5276bf69030b2cb - policies.dashboard.policies_by_assignee: a9e4d167fe7ed9733c0247b0ec565911 - policies.dashboard.policies_by_framework: 77c8d6f367e8cdf9dd716fab866a1025 - policies.table.name: c00be24152065be8946cbfb9ea8680b3 - policies.table.statuses.draft: 540e360892172e34f1d10ba632cebb01 - policies.table.statuses.published: daaf3c6e6a7579155c08ff51243512c6 - policies.table.filters.owner.label: d7c40c83e9f9d6509c9bc4326c6b122d - policies.table.filters.owner.placeholder: 2159fb1a6c2a7408629642faa64d218d - policies.filters.search: add69877c7aaf3ce79382a81ba94acf7 - policies.filters.all: 88f396f7dfc148c975e87eae138752a5 - policies.status.draft: 540e360892172e34f1d10ba632cebb01 - policies.status.published: daaf3c6e6a7579155c08ff51243512c6 - policies.status.needs_review: 7b6b03f2f1c7eb07108ee383dd0cdd1b - policies.policies: 301a659b98579990507bb5fd0c87aacb - evidence_tasks.evidence_tasks: d45cf3774e592d0684d86c7e054949ff - evidence_tasks.overview: 39909e63e1c7c5c0be8caab4e5e04b70 - risk.risks: 653844d548b2148728f6fb70ee8263f7 - risk.overview: 39909e63e1c7c5c0be8caab4e5e04b70 - risk.create: 8a3449d840bc2e83e264c5b72dd7ae3a - risk.vendor.title: d329c47d548a0b3361120bbf4fd8078c - risk.vendor.dashboard.title: fbf3e31e131c3418d0634807c7439c5c - risk.vendor.dashboard.overview: 4aa84eb88453f8e042500f2869ab4158 - risk.vendor.dashboard.vendor_status: f7575b36883502afd77ff2bce285f15b - risk.vendor.dashboard.vendor_category: 682dfd2d7c6c78fc44e6e161c4b7f3be - risk.vendor.dashboard.vendors_by_assignee: 5bb86b827c40ab9f69c2b26e6d24668d - risk.vendor.dashboard.inherent_risk_description: d9e71f7212a9487e2e2b3509774eff72 - risk.vendor.dashboard.residual_risk_description: f6650c5de31a483d483fd9b36337a963 - risk.vendor.register.title: 0f9930d48eca11656701168f119d050d - risk.vendor.register.table.name: d4700b697a54fbd43a1a613d32694e7f - risk.vendor.register.table.category: 8c6b7f206708b567f49f36edb123c060 - risk.vendor.register.table.status: 87a831bc99060c55b50dbe91c6aab6e9 - risk.vendor.register.table.owner: 79115f7790c58d35dd8ca592f8fc7540 - risk.vendor.assessment.title: 1e9051147a298718e743803c2e85156c - risk.vendor.assessment.update_success: e38ad4046bb8dc7baa3fb84672cc61a7 - risk.vendor.assessment.update_error: 54e23257ca5c1e96e7aa1cf381588992 - risk.vendor.assessment.inherent_risk: d0f6eef6f70a0f4460ff7f23e2521173 - risk.vendor.assessment.residual_risk: c7ae88c7793fd7dac31fe5da239d25e5 - risk.vendor.form.vendor_details: 1bb4aeaae548a238511f99d518238478 - risk.vendor.form.vendor_name: d4700b697a54fbd43a1a613d32694e7f - risk.vendor.form.vendor_name_placeholder: cd2aa7cd16fb54955e164de2b43b8fb9 - risk.vendor.form.vendor_website: ca09410963c66f80a9bd39bdc8ae95cf - risk.vendor.form.vendor_website_placeholder: e638609e6b476e4afc5c0c5acf5e4a3f - risk.vendor.form.vendor_description: b5a7adde1af5c87d7fd797b6245c2a39 - risk.vendor.form.vendor_description_placeholder: be93ad19bb1bc1ea3d35f4696bb461c2 - risk.vendor.form.vendor_category: 8c6b7f206708b567f49f36edb123c060 - risk.vendor.form.vendor_category_placeholder: ba77a55f2b2d0042a894b0ba568716e6 - risk.vendor.form.vendor_status: 87a831bc99060c55b50dbe91c6aab6e9 - risk.vendor.form.vendor_status_placeholder: 374dfef4c4c0a7491740b2f7331b5406 - risk.vendor.form.create_vendor_success: 63c2cb7f1cfab5fff3da2cebb0ebc830 - risk.vendor.form.create_vendor_error: 2afbd110bb32876e75f4926cee33a773 - risk.vendor.form.update_vendor: af5047e83fb1724263d1d0ebfb2629e0 - risk.vendor.form.update_vendor_success: 45ae9b8988aeb3a9e7c2543023f81a3f - risk.vendor.form.update_vendor_error: 0172d1b03b3209f32668261a5996b8c8 - risk.vendor.form.add_comment: 04979267671e33bcd261434689879386 - risk.vendor.table.name: d4700b697a54fbd43a1a613d32694e7f - risk.vendor.table.category: 8c6b7f206708b567f49f36edb123c060 - risk.vendor.table.status: 87a831bc99060c55b50dbe91c6aab6e9 - risk.vendor.table.owner: 79115f7790c58d35dd8ca592f8fc7540 - risk.vendor.filters.search_placeholder: 5ba5bf2d06160d5065ab748f8c3ab837 - risk.vendor.filters.status_placeholder: 48b9a4856edd97f109ddf552db80a161 - risk.vendor.filters.category_placeholder: 3f51cb58d60b967cc9da370484cfc201 - risk.vendor.filters.owner_placeholder: 2fef97a44fea321219b376c274c61444 - risk.vendor.empty_states.no_vendors.title: 606073a51edd78da1425c242ddb2f7ed - risk.vendor.empty_states.no_vendors.description: 4067f9154a8581c979ef6b890aea8dd1 - risk.vendor.empty_states.no_results.title: 5bb69fe3b7a4d5220a445c029fb02c19 - risk.vendor.empty_states.no_results.description: 272e8ffa88987801e1ce4df4610db9ea - risk.vendor.empty_states.no_results.description_with_filters: 85a145167c2b86ce831cbed8aa8ad9da - risk.vendor.actions.create: 7621068f66100474a766c19ce607cfa1 - risk.vendor.status.not_assessed: 121637ecde942b30505a7b7192065ae9 - risk.vendor.status.in_progress: 7202b8ffa44d203b76371de10e54d0b8 - risk.vendor.status.assessed: 241639d85e1ad7d3ebd95b273adc743a - risk.vendor.category.cloud: c8e2277ecfb1427838c488c217f99466 - risk.vendor.category.infrastructure: cba4f4cee5c6a3e6d8be8da68fa1234e - risk.vendor.category.software_as_a_service: 4a06db299715fa31d9d9c47f85e39d65 - risk.vendor.category.finance: c482980d384a9d0e7bc39e1140270870 - risk.vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b - risk.vendor.category.sales: 02e2b4ea2fa8f1802d2bb66fbdcb7089 - risk.vendor.category.hr: efd7bbf7b102a4e4b8f32e9ecd963a66 - risk.vendor.category.other: 977a7223997e10d4daa2ce0d309fafc6 - risk.vendor.risk_level.low: afc59091c7492858b2e5e57a735a3104 - risk.vendor.risk_level.medium: 8078e37eb5b3a24260e97d949640db1f - risk.vendor.risk_level.high: d2ca4a42f73e121b83a980d7b2803916 - risk.vendor.risk_level.unknown: dc48ecb8404ae3ab468675d916ca2042 - risk.dashboard.title: 4a37efc27391cc18714c72981d59c072 - risk.dashboard.overview: 90dc8fea58d739c70d03ef33aedc0895 - risk.dashboard.risk_status: db714059827d4c1b15d2cb01c9d628e0 - risk.dashboard.risks_by_department: 42371964a1687b83d38ab6800164bf45 - risk.dashboard.risks_by_assignee: f1844d10a7d3434c8446782169198a6b - risk.dashboard.inherent_risk_description: d6abeb8e8d53383dbfca9de0518187b6 - risk.dashboard.residual_risk_description: c1bef4f6d1b6b4dc4555105c56bc264a - risk.dashboard.risk_assessment_description: 83dab77a32f5eb23bbc74a6a514cad2e - risk.register.title: b71a48800257700e97a6d80e00764e38 - risk.register.table.risk: 508428a451143207631e5bbd5d88e4d5 - risk.register.empty.no_risks.title: afe3d187294fb343c64c78892f7a60d6 - risk.register.empty.no_risks.description: f4059eab05090c769c968bc47d06e1e5 - risk.register.empty.create_risk: 1974b648b6f3c54cebb3aa9b0e3a6a8c - risk.metrics.probability: ec7d137de973ceb6b9dde7dca67775f5 - risk.metrics.impact: 21f59b54f62b5b8b4bc0f63f0f617fc1 - risk.metrics.inherentRisk: d0f6eef6f70a0f4460ff7f23e2521173 - risk.metrics.residualRisk: c7ae88c7793fd7dac31fe5da239d25e5 - risk.form.update_inherent_risk: 179a98c3fbd8287c68b5accd4a46bbbe - risk.form.update_inherent_risk_description: 6cc90d6d4161ede7385d9b146dd62ff6 - risk.form.update_inherent_risk_success: 044b069647b121465ab413db136e98ab - risk.form.update_inherent_risk_error: 0c3bf80ed4fb6e9a8899a655f2c9e37f - risk.form.update_residual_risk: 5729da992f06cf7e5a50fa065a755072 - risk.form.update_residual_risk_description: 9d3008937a441babb184c82ba7bf7574 - risk.form.update_residual_risk_success: 607f04ebbc5f9237d0d157707cf37320 - risk.form.update_residual_risk_error: bfd971908edc0764c1abb494c77f0d69 - risk.form.update_risk: af545b421aea216f5a54d5f2edf2c6f8 - risk.form.update_risk_description: 1c59d3eae2538af10d6cb7a5ba68237b - risk.form.update_risk_success: 2d92a27e195c17c8782c7edb9b833de6 - risk.form.update_risk_error: 7be0c206936eec9c64a725392b5080e5 - risk.form.create_risk_success: d24add5516b958aff0932d64cd2d2f0d - risk.form.create_risk_error: 11a3e521fbbfaca0887cd680018ebcd2 - risk.form.risk_details: 4702d4bf414618c33f38768c6208ba5c - risk.form.risk_title: 138c003d49fee33b2e7a7aac3fc5bfdd - risk.form.risk_title_description: 440eaccaddc59e9abb6757b2108779a1 - risk.form.risk_description: b5a7adde1af5c87d7fd797b6245c2a39 - risk.form.risk_description_description: e9e5eefa1ea134a6fd5eaafa5191bc36 - risk.form.risk_category: 8c6b7f206708b567f49f36edb123c060 - risk.form.risk_category_placeholder: ba77a55f2b2d0042a894b0ba568716e6 - risk.form.risk_department: df393600825b049c6ee18c9980aaf28a - risk.form.risk_department_placeholder: 1a42316ebebde77b62ac6930e67c739f - risk.form.risk_status: 553e988e41718a14ca8842c2639b354b - risk.form.risk_status_placeholder: 8c2155a2870153cec76c0be23b292b8b - risk.tasks.title: 1c309074b8348cf83eef81c27d4e5e97 - risk.tasks.attachments: 7517e49d3a1f76eda505075e22139876 - risk.tasks.overview: 2ebd2cc1c9fdbd5f7e67cd3e6f644785 - risk.tasks.form.title: 30a650651b387c9393fe44128e51bbd2 - risk.tasks.form.task_title: 7e43dbe779e6fd5664ab69208299a875 - risk.tasks.form.status: a9629a0e07fd720db9961cff7fac1185 - risk.tasks.form.status_placeholder: 89d26edf359c91d18d847d9e3aad9def - risk.tasks.form.task_title_description: add5856346445eececa98f697b428894 - risk.tasks.form.description: b5a7adde1af5c87d7fd797b6245c2a39 - risk.tasks.form.description_description: a66f60c7a94b790afeb4fe8d0966147e - risk.tasks.form.due_date: de9507035b945d2715634ac4c1baa402 - risk.tasks.form.due_date_description: 3646562d3d00448319128870b2ac0828 - risk.tasks.form.success: 7ba9a97209ee59e7764a4a4e25713db0 - risk.tasks.form.error: 299ad6b4dbf762b2fe83942b837bfd87 - risk.tasks.sheet.title: 62eca27b8ceec030ca201df371221438 - risk.tasks.sheet.update: 98563374b52f32c0eb1c01190d309639 - risk.tasks.sheet.update_description: e39c8c82c6f171d3e8d283d81a6e84a0 - risk.tasks.empty.description_create: e6af67c7415ff61de82b4dc75797d50a - settings.general.title: cbf5d231135412fb14429e086c09a722 - settings.general.org_name: a4cd2eb4b24cfd61f366e642e6a05186 - settings.general.org_name_description: b07616ecf1de337807310db01f2fbbe0 - settings.general.org_name_tip: 5a927b41121a0e11406517374044713f - settings.general.org_website: ed5531a245693e022188fed5d2223154 - settings.general.org_website_description: 864a5f3b2aae67461a5ec67439277bc4 - settings.general.org_website_tip: f5709a2d62e3a5a61bfe489a25362b6a - settings.general.org_website_error: 3f29010229d70705c4faebc5074052a9 - settings.general.org_website_updated: 5a665fd851d34d4e9c932b5ca10f79ff - settings.general.org_delete: c6f33d653b62ccbfef5bfe13daf0cc61 - settings.general.org_delete_description: 0852031d9ecf38fc602d78eb4fc3b317 - settings.general.org_delete_alert_title: 71ca62b605390d06886fada52e020d1f - settings.general.org_delete_alert_description: abb6f206e997df56c39afc67447ac370 - settings.general.org_delete_error: 5c0f0a41659ebc25df85b0dc5dcb77b1 - settings.general.org_delete_success: 764468db490b487edb22f18b87078bbf - settings.general.org_name_updated: 782e0d23006d8fccab95422b33d8175d - settings.general.org_name_error: 5ed941c3c8b182934ec062d2dd71f3e3 - settings.general.save_button: aed88202e2432ee2a613f9120ef7486b - settings.general.delete_button: ccfd9851b50aaa671513b50d158ed579 - settings.general.delete_confirm: 52d60adc57156360329f47a3c9920fc5 - settings.general.delete_confirm_tip: 086302f9b59e2dc918293b6cdfb1f43f - settings.general.cancel_button: d12c3b0dcf75614dafb2ac6bdaa77a26 - settings.members.title: 3cd8733d1f3de18707f83b720d6fd17e - settings.billing.title: ad04f7da0d0ebf71e846914e95a0a697 - user_menu.theme: d45db514d9389d60dc5c229eaf7edbdf - user_menu.language: e7733389c419c59c3243e719055f83da - user_menu.sign_out: dca4963c5966650520f3b5b8859591cb - user_menu.account: 4cd05effefac83d92a4cbd939beac4ef - user_menu.support: db5eb84117d06047c97c9a0191b5fffe - user_menu.settings: e7785de91330713fc2d12404bb6bd556 - user_menu.teams: c37fc91290e82268088a586b315ccf9b - frameworks.title: eba1e38e54facdb539a6fcc1efc6aa9e - frameworks.controls.title: 1594471bda8bc4125956d82cc963f13c - frameworks.controls.description: 3f401ca56e69e6e088beef09ef2ae519 - frameworks.controls.table.status: 87a831bc99060c55b50dbe91c6aab6e9 - frameworks.controls.table.control: 0eea7c40f68977378fdb8e7386626647 - frameworks.controls.table.artifacts: 08004d9d4c599f44814a861568d200cb - frameworks.controls.table.actions: 06df33001c1d7187fdd81ea1f5b277aa - frameworks.controls.statuses.not_started: 97a8462abdccd0463ba462fb9ee0833a - frameworks.controls.statuses.compliant: 324646500393a11e761356c6a0771cfd - frameworks.controls.statuses.non_compliant: e43c8d536e0e1b5419b7704893374be8 - vendor.title: 4a37efc27391cc18714c72981d59c072 - vendor.register_title: d329c47d548a0b3361120bbf4fd8078c - vendor.dashboard.title: 4a37efc27391cc18714c72981d59c072 - vendor.dashboard.overview: 4aa84eb88453f8e042500f2869ab4158 - vendor.dashboard.vendor_status: 4e863e715f7ef7ec95c440a5ca4c0344 - vendor.dashboard.vendor_category: 682dfd2d7c6c78fc44e6e161c4b7f3be - vendor.dashboard.vendors_by_assignee: 5bb86b827c40ab9f69c2b26e6d24668d - vendor.dashboard.inherent_risk_description: d9e71f7212a9487e2e2b3509774eff72 - vendor.dashboard.residual_risk_description: f6650c5de31a483d483fd9b36337a963 - vendor.register.title: 0f9930d48eca11656701168f119d050d - vendor.register.table.name: d4700b697a54fbd43a1a613d32694e7f - vendor.register.table.category: 8c6b7f206708b567f49f36edb123c060 - vendor.register.table.status: 87a831bc99060c55b50dbe91c6aab6e9 - vendor.register.table.owner: 79115f7790c58d35dd8ca592f8fc7540 - vendor.category.cloud: c8e2277ecfb1427838c488c217f99466 - vendor.category.infrastructure: cba4f4cee5c6a3e6d8be8da68fa1234e - vendor.category.software_as_a_service: b0ca9e41d61885345eef09f928c9ea58 - vendor.category.finance: c482980d384a9d0e7bc39e1140270870 - vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b - vendor.category.sales: 02e2b4ea2fa8f1802d2bb66fbdcb7089 - vendor.category.hr: 9508a19d7801e07ee7b7628c31bfdd47 - vendor.category.other: 977a7223997e10d4daa2ce0d309fafc6 - vendor.vendors: 9d0fa032c588081b09041bb15862764a - vendor.form.vendor_details: 1bb4aeaae548a238511f99d518238478 - vendor.form.vendor_name: d4700b697a54fbd43a1a613d32694e7f - vendor.form.vendor_name_placeholder: cd2aa7cd16fb54955e164de2b43b8fb9 - vendor.form.vendor_website: ca09410963c66f80a9bd39bdc8ae95cf - vendor.form.vendor_website_placeholder: e638609e6b476e4afc5c0c5acf5e4a3f - vendor.form.vendor_description: b5a7adde1af5c87d7fd797b6245c2a39 - vendor.form.vendor_description_placeholder: be93ad19bb1bc1ea3d35f4696bb461c2 - vendor.form.vendor_category: 8c6b7f206708b567f49f36edb123c060 - vendor.form.vendor_category_placeholder: ba77a55f2b2d0042a894b0ba568716e6 - vendor.form.vendor_status: 87a831bc99060c55b50dbe91c6aab6e9 - vendor.form.vendor_status_placeholder: 374dfef4c4c0a7491740b2f7331b5406 - vendor.form.create_vendor_success: 63c2cb7f1cfab5fff3da2cebb0ebc830 - vendor.form.create_vendor_error: 2afbd110bb32876e75f4926cee33a773 - vendor.form.update_vendor_success: 45ae9b8988aeb3a9e7c2543023f81a3f - vendor.form.update_vendor_error: 0172d1b03b3209f32668261a5996b8c8 - vendor.form.contacts: ff02db12038f147550c2687ee4d6a5ee - vendor.form.contact_name: bfa04556e3fe0369bdbfb759bcee7306 - vendor.form.contact_email: 7a73b8ac54508f36f1739e45b969b643 - vendor.form.contact_role: 23a3045b1103fc412e8db9090e23bf6d - vendor.form.add_contact: b95a1f3ac003992336e117277d6e3083 - vendor.form.new_contact: d22a6b31fb3b4b6206ff1e3243aa4b3b - vendor.form.min_one_contact_required: 5db2db62acd3124d08688425d17d079f - vendor.empty_states.no_vendors.title: 606073a51edd78da1425c242ddb2f7ed - vendor.empty_states.no_vendors.description: 4067f9154a8581c979ef6b890aea8dd1 - vendor.empty_states.no_results.title: 5bb69fe3b7a4d5220a445c029fb02c19 - vendor.empty_states.no_results.description: 272e8ffa88987801e1ce4df4610db9ea - vendor.empty_states.no_results.description_with_filters: 85a145167c2b86ce831cbed8aa8ad9da - people.title: 5557260365f759ca82cf108b3d8bef8f - people.details.taskProgress: 3cb06e12073d38f3f21997f827281a23 - people.details.tasks: 1c309074b8348cf83eef81c27d4e5e97 - people.details.noTasks: d888c934668143d74bd2b16d4759092d - people.description: 6605f724e235a56bfec58d3e9b4c8848 - people.filters.search: 73644c4eb55d832abf7004b551a68365 - people.filters.role: fc7996777084d85145881ce61b277ada - people.actions.invite: 0377e2862a56907572c6253feb96ac1e - people.actions.clear: 180c6431db153b1503b8623e96c2e710 - people.table.name: d4700b697a54fbd43a1a613d32694e7f - people.table.email: ce8ae9da5b7cd6c3df2929543a9af92d - people.table.department: df393600825b049c6ee18c9980aaf28a - people.table.externalId: 28b88162773d6ffc266f49bf77306459 - people.empty.no_employees.title: f475b60fd85a800c0f74551c13f5468f - people.empty.no_employees.description: 5bbf430992e8ad2f48acf17b3ee47abf - people.empty.no_results.title: 5bb69fe3b7a4d5220a445c029fb02c19 - people.empty.no_results.description: 50e9c7be9c0414116fd2d7dec40bffe3 - people.empty.no_results.description_with_filters: 85a145167c2b86ce831cbed8aa8ad9da - people.invite.title: 0377e2862a56907572c6253feb96ac1e - people.invite.description: 0d1501eb5ca25a88675a1b67505c6371 - people.invite.email.label: e920754fa88b7c38cdd1bcc259bac5d0 - people.invite.email.placeholder: 5a6940a4d212e6c6fd224ae8c9744232 - people.invite.role.label: 19772a94ff8636c21be02e839fbc9a09 - people.invite.role.placeholder: 86c306c23929c264d9fe1637bab1b2eb - people.invite.name.label: d4700b697a54fbd43a1a613d32694e7f - people.invite.name.placeholder: 7fc5abf04fa882ceace7754ec99d70e8 - people.invite.department.label: df393600825b049c6ee18c9980aaf28a - people.invite.department.placeholder: 1a42316ebebde77b62ac6930e67c739f - people.invite.submit: 0377e2862a56907572c6253feb96ac1e - people.invite.success: 83dd88a7224d8a74ca74127613a347a0 - people.invite.error: 4cca4a705d84aa6194c1788cb1b1b5ca - errors.unexpected: 18105319b34e382d1e0ed2e165f4d960 - src/locales/no.ts: - languages.es: b980859f1670214519fd5cd3942dddf8 - languages.fr: 939843e67f5fd5de8870aed96875c98e - languages.no: 64435a0abd1ab6bcf0375f5c918b43b3 - languages.pt: d1fcbbcfff8016c8e8193b1009a2f0c9 - languages.en: 2cf6d7f4e34ede86abc5a7b3091a959d - language.title: c2bd871e40a477404d746ca7b6e5a377 - language.description: fd49b803ed37c59214bb26e2795f1679 - language.placeholder: d44825bb4a3981426357c8b2588a8890 - common.actions.save: fe9e85aad2e6e67bf18e246f33f176b5 - common.actions.edit: 4879221911b456dfa72873487686c9e2 - common.actions.delete: f0142486dccb8d28a5d7af2e5d7ce8ac - common.actions.cancel: edfc4be89515f79e98fcb523d67c0513 - common.actions.clear: 9fa2c728a443e032dfc4309e6e39f536 - common.actions.create: 9f966b16b69b8b0237b0f9ce40009a1a - common.actions.send: 94966d90747b97d1f0f206c98a8b1ac3 - common.actions.return: c6fd448a3b36eb1b223e5aabb5bb5636 - common.actions.success: 12d61cc2eee0a4732e3af043518aa96d - common.actions.error: 37b36affedd2dfffae538585fcd42a8d - common.actions.next: f312b12ad707c26fd9a096e06eafcbcd - common.actions.complete: 2e2224769089d0373b5d63f0a2e67a8d - common.assignee.label: 70df1818e94ce2c3e785396a057e79f1 - common.assignee.placeholder: 2818c8a8601c1ebfcf87489b9ab5fbfd - common.date.pick: ae1fa045065769e1a3315192d477c91b - common.date.due_date: 8f3787566b41a9f94ca8f2fe0deaf4c7 - common.status.open: 231541b4dddf5f3156a391c6a0064f83 - common.status.pending: 8a02ac12947e6ea465c54e580ccd4234 - common.status.closed: c8e65a1761beace0612b3e060723d4f9 - common.status.archived: 4d3c61e248204d279c0cb0ddc28cc1f5 - common.status.compliant: 4a89f1f84dcc4f6200247a826f3ce895 - common.status.non_compliant: 4ad91f27c8831896c11a989c421773e7 - common.status.not_started: 7dbd6504ae0b5c2f8e085eafb34357d7 - common.status.in_progress: 57d6a98183069a501704325d2d4a59e2 - common.status.published: 0b6fd91ab02b565b70b08f08fe5513ff - common.status.needs_review: 624b773af82bf224be675b95e0d3b51e - common.status.draft: abfde03cf0ca2e57e306b6c72a9be650 - common.status.not_assessed: 1354bd740ef68d84a4f275a3b64f01f3 - common.status.assessed: df6410132c5eb02a8f490cc29eaeaca5 - common.status.active: c44e07cffb5cd991f28e866e8854b548 - common.status.inactive: 2aaad1e130dd23b7195ed5235483cef4 - common.filters.clear: 96bd86f3df0455cf1ede53f7a86a84c5 - common.filters.search: 1d052b8f61911e14861c8108d01ef467 - common.filters.status: ec53a8c4f07baed5d8825072c89799be - common.filters.department: 6aa4e6545f4382dacc5dc92afa154494 - common.filters.owner.label: 70df1818e94ce2c3e785396a057e79f1 - common.filters.owner.placeholder: 1bb8d5220eafc054f40609639545d20b - common.table.title: d256d9e23b555adf22ebc4f1422911d0 - common.table.status: ec53a8c4f07baed5d8825072c89799be - common.table.assigned_to: ed55363ce86199141979b80ab29a99a0 - common.table.due_date: 8f3787566b41a9f94ca8f2fe0deaf4c7 - common.table.last_updated: c7ae112fec49ffb145e6e5f0bdf3c3dc - common.table.no_results: 3c22fe33782fde4bb60715cfba3c18b5 - common.empty_states.no_results.title: 092c6f9e6516d410a4a803c3b40ed2a7 - common.empty_states.no_results.title_tasks: 39282d48f4e245630e8357faae99f7af - common.empty_states.no_results.title_risks: f4c8ffefa5c604168cd50486f2294ccd - common.empty_states.no_results.description: ec15e4042d993eed15217582b8b15b59 - common.empty_states.no_results.description_filters: ec15e4042d993eed15217582b8b15b59 - common.empty_states.no_results.description_no_tasks: 2752c7e502096fa14ff15d91c004fa53 - common.empty_states.no_results.description_no_risks: 69f58dd05fc7f78c2db9b5648aaa04a6 - common.empty_states.no_items.title: 829c44ea1f4926b6280cdccfa1edcaf1 - common.empty_states.no_items.description: f33f76a576d7c4a119eaeb384d8a0d77 - common.pagination.of: aac1259dfa2c6c5ead508f34e52bb990 - common.pagination.items_per_page: fd2c5210bc13e223cf6e4968e9653a22 - common.pagination.rows_per_page: 22a4a8d4bc06c6fd33c6d0f08f92720b - common.pagination.page_x_of_y: 8a80659d9d29a1d270641c3126405d35 - common.pagination.go_to_first_page: a6e20c58c5ebfd5dbed360b89ab772c0 - common.pagination.go_to_previous_page: f807b7c2b7e92c3741acf485a0efd5c8 - common.pagination.go_to_next_page: 41ff0bea252d9e270286e5caf9a03e96 - common.pagination.go_to_last_page: d49bca86843bc91676b14f6308c5370d - common.comments.title: 10c77cffbed1efe93c1c2d687ce12bb0 - common.comments.description: 6a590fdafd73add34acc58795207f30b - common.comments.add: 01121e35f9097773e7d599beeaf25dc8 - common.comments.new: 009ff67e816ac63d9859c8dfd0a42dd7 - common.comments.save: 4a8944cf4b5f8acecd8b793a99003cc1 - common.comments.success: 564affe04f0e91c941bc210f8207287d - common.comments.error: a2f7f10d50f1610fe99206bf97e8a086 - common.comments.placeholder: 95313c918ac9d75cbc8aad4391c747d8 - common.comments.empty.title: 7eb83860456820b0d27e53d10611dbcf - common.comments.empty.description: 1b02f2c160cf04905bced30cfbc059e3 - common.attachments.title: 302a01ac24f797a7597958a1f8ef4a58 - common.attachments.description: dfee743b01ed29b11e99aa8ce167daa0 - common.attachments.upload: 4d283866e4b09dcf9f7b09edd83b4f6d - common.attachments.upload_description: 34fde22ac10a23a279f37648f054f880 - common.attachments.drop: deca645c2d8fede398c7ea76e02699a4 - common.attachments.drop_description: 0e487657dd2fb7af4c2ed75dc568f421 - common.attachments.drop_files_description: d81e09c3dbe2038a49a7fa9f490bfb8a - common.attachments.empty.title: aefbdf351f88810d21c45733816fa2f9 - common.attachments.empty.description: dfee743b01ed29b11e99aa8ce167daa0 - common.attachments.toasts.error: 9883526e2173eaf1752a19d871ced330 - common.attachments.toasts.error_uploading_files: e07d19a54dbf46ec69179d7a9ee15619 - common.attachments.toasts.error_uploading_files_multiple: 1c07b9eac911fda3d80ff8b5defa7a56 - common.attachments.toasts.error_no_files_selected: e5c72f3febc70185afa2c123146c9558 - common.attachments.toasts.error_file_rejected: 360c5764530fb55d93648676aec146dc - common.attachments.toasts.error_failed_to_upload_files: d5d5614ccb37530707f7796029a457c8 - common.attachments.toasts.error_failed_to_upload_files_multiple: d5d5614ccb37530707f7796029a457c8 - common.attachments.toasts.error_failed_to_upload_files_single: 183389aa5a0bc48118b3a0e9b595da16 - common.attachments.toasts.success_uploading_files: d453995a3e3a88f4ddc98fb6c5b9d725 - common.attachments.toasts.success_uploading_files_multiple: d453995a3e3a88f4ddc98fb6c5b9d725 - common.attachments.toasts.success_uploading_files_single: 817db6fd2165189934af18b077c9da29 - common.attachments.toasts.success_uploading_files_target: d453995a3e3a88f4ddc98fb6c5b9d725 - common.attachments.toasts.uploading_files: 6734dda6fa7cef8cc1dd0a9bab57879f - common.attachments.toasts.remove_file: f5bdd59d552b6313d06416df199e4790 - header.discord.button: eca90714006c502f796e70f1f40d2f0f - header.feedback.button: e10032b5be380e387e9ba747850fbefd - header.feedback.title: 5207d2e0d8ad08de13c3565be04b70db - header.feedback.description: 5dc84642f3ced692d500e37cb3eb663a - header.feedback.placeholder: 8f6978e80b4e64fba36ab0a677f052b7 - header.feedback.success: 5207d2e0d8ad08de13c3565be04b70db - header.feedback.error: 33d6eadd01633cf0ecea7ba3d257bc20 - header.feedback.send: 7c0b657754697e4aaeda7832df9ce445 - not_found.title: 56dfbbed261a89fc7959b1f5a10d73dc - not_found.description: 90241036bbe7b7e262aa2aad45d90594 - not_found.return: 570c33e07d133b138852af03003eab2b - theme.options.light: 84e8b4db17288b8890eccfba74b1d534 - theme.options.dark: 89ba50ed6483d8cc8069772e4c5b3a6f - theme.options.system: a45da96d0bf6575970f2d27af22be28a - sidebar.overview: a0d7e99227de0ca1ed7eba299cbb329c - sidebar.policies: b012eceb18ce860363f3813a33b90b48 - sidebar.risk: 33d37f9288ad443f3861e5ce991f23f1 - sidebar.vendors: 512e556ddabdc392de3bcf7b41373efd - sidebar.integrations: 5a68d939af838db8152ed6d9578aa26d - sidebar.settings: c049758877fff5326b89af831719c191 - sidebar.evidence: 905fbb72b445394a3e752b6ddd1a2c23 - sidebar.people: 57e876a07af4ab8a4ebcf862d4dd5a27 - auth.title: b6ec3d7a6754a230e89a097b3d1c2297 - auth.description: 7afbd5d2815f3bbabf2df979be6c3424 - auth.options: eadbdc1841301752c51cbd7036d50909 - auth.google: 342ef2110ceb391b7127aa75a5674c67 - auth.email.description: 207024b504448f08ee7b62f4195e7388 - auth.email.placeholder: ab3db257d633aad4d9159503c7cdbdad - auth.email.button: a9cbcaa90120f7c1fc292458cc25a9cb - auth.email.magic_link_sent: 312827cd0632a2198d4a88c0e748f8bd - auth.email.magic_link_description: e6e6152a4b28928195127abadf7ccead - auth.email.magic_link_try_again: d5f5800d65f156529584a0f4f2d67183 - auth.email.success: 43c1db17bc1dbd285f07315a1d00a7d2 - auth.email.error: 1f7e05f0deb084ffc6cc9c32057e37ae - auth.terms: 16581f4c1316b9d3fd9a11a6cede8ef2 - onboarding.title: 807c42791de59302a9b622605f01373f - onboarding.setup: 9b456b22410183503e1725e6dc10e1a0 - onboarding.description: 95365ed8cdb94af34d488efff80294ad - onboarding.fields.name.label: ad98ea7d155525c139fd76ee8449f241 - onboarding.fields.name.placeholder: 85e1c7bc60f7713d031144033d44a8fe - onboarding.fields.website.label: e94da4372d39f6cd24a3bd48330172aa - onboarding.fields.website.placeholder: 7f6652f3495ed883f844102075807d85 - onboarding.fields.subdomain.label: 2be9ecfaa5dcafdb580023c7eb47068c - onboarding.fields.subdomain.placeholder: ada0af40e7425494e070e7024ad987d3 - onboarding.success: 6302ce973c31767ec3960672d19980f0 - onboarding.error: 9883526e2173eaf1752a19d871ced330 - onboarding.unavailable: c345109963764f6a095dd5ca242686f4 - overview.title: a0d7e99227de0ca1ed7eba299cbb329c - overview.framework_chart.title: a982893125a0818af19d3d3e02d6a5ba - overview.requirement_chart.title: 8c0cc6e516853b1d41b278d894255486 - policies.dashboard.title: 5967ab15ec405a77b8db5dcdb885d6c6 - policies.dashboard.all: 9f02efc5bbf283daeeedc9d41d434dba - policies.dashboard.policy_status: a2aa64d6afb64400381c70945935c8e6 - policies.dashboard.policies_by_assignee: 60e1dfe04babd956d8f0ada98ea8d821 - policies.dashboard.policies_by_framework: f4061b1feec3ead2742463ae97a430f1 - policies.table.name: b3b7e66ba2a94dc62e75e956e6f09f3c - policies.table.statuses.draft: abfde03cf0ca2e57e306b6c72a9be650 - policies.table.statuses.published: 0b6fd91ab02b565b70b08f08fe5513ff - policies.table.filters.owner.label: 70df1818e94ce2c3e785396a057e79f1 - policies.table.filters.owner.placeholder: 1bb8d5220eafc054f40609639545d20b - policies.filters.search: 34b19a0e3864bda69bb63176ba8891bd - policies.filters.all: 9f02efc5bbf283daeeedc9d41d434dba - policies.status.draft: abfde03cf0ca2e57e306b6c72a9be650 - policies.status.published: 0b6fd91ab02b565b70b08f08fe5513ff - policies.status.needs_review: 03b0c7909be559aa6fe26cdc0d39ed80 - policies.policies: 9c26d93d3f140ca69a3cef63e72916b3 - evidence_tasks.evidence_tasks: 905fbb72b445394a3e752b6ddd1a2c23 - evidence_tasks.overview: a0d7e99227de0ca1ed7eba299cbb329c - risk.risks: 7ad52774933cd98cab80a32956a2004d - risk.overview: a0d7e99227de0ca1ed7eba299cbb329c - risk.create: 25bf0fff8c9a046dc7399522def19630 - risk.vendor.title: b9a2b4aa2cf65b26cd6ae81c13510609 - risk.vendor.dashboard.title: b9fc9d911bf90c2edcc10f615dad432d - risk.vendor.dashboard.overview: 6dd1c0ce1dc8cd66be5b885c4ae31350 - risk.vendor.dashboard.vendor_status: 2a4d7e041e4848f784a1fb71b4956388 - risk.vendor.dashboard.vendor_category: b14cf27d5255aeba0337de69bd06dbe2 - risk.vendor.dashboard.vendors_by_assignee: ad9ca4e599f9624d738a849288c5c902 - risk.vendor.dashboard.inherent_risk_description: 45abc445f611bd3718c356b59f160c0e - risk.vendor.dashboard.residual_risk_description: df00319a2f508cd6fb3d631585b705ee - risk.vendor.register.title: 12fbcb22d19496fc82e821711db878fd - risk.vendor.register.table.name: 3ffcaf33f0c7f7a222bdff749d3d48a4 - risk.vendor.register.table.category: 21a0269431d5e6ba1eebf25827cadeba - risk.vendor.register.table.status: ec53a8c4f07baed5d8825072c89799be - risk.vendor.register.table.owner: 087deef1a4032da761fa539a6dab8435 - risk.vendor.assessment.title: c68280e303c3c84fcfbbcde1c0772dd9 - risk.vendor.assessment.update_success: 4c8b118e3f8a3ead1897233e504d7d2c - risk.vendor.assessment.update_error: 4f7d9289eef697c1bf4e4ba92e754a79 - risk.vendor.assessment.inherent_risk: ebeb800cea23f9bdb9351397f255471a - risk.vendor.assessment.residual_risk: fca8b654cd31477d05212b045f810d31 - risk.vendor.form.vendor_details: 7975806fd497b6a6fe1a82beca89b540 - risk.vendor.form.vendor_name: 3ffcaf33f0c7f7a222bdff749d3d48a4 - risk.vendor.form.vendor_name_placeholder: 8bec3408fe198dea51a31316cb386896 - risk.vendor.form.vendor_website: e94da4372d39f6cd24a3bd48330172aa - risk.vendor.form.vendor_website_placeholder: d411635d010c8782a5e9e0c7abd1870a - risk.vendor.form.vendor_description: 59869029490390f1fc4943085f8e08bb - risk.vendor.form.vendor_description_placeholder: 3178d56056e36d3013963c3110a4b86d - risk.vendor.form.vendor_category: 21a0269431d5e6ba1eebf25827cadeba - risk.vendor.form.vendor_category_placeholder: a87a4179a6dccc6d36b5ae0fb3b89c09 - risk.vendor.form.vendor_status: ec53a8c4f07baed5d8825072c89799be - risk.vendor.form.vendor_status_placeholder: 72ce53e5caf4c43fba49352b71378968 - risk.vendor.form.create_vendor_success: df6e4b976bdafb8bb510ea5bfca35e82 - risk.vendor.form.create_vendor_error: 28eb3c7da59123eb74980cfc5a51b108 - risk.vendor.form.update_vendor: ea05096345cc5439bdb51047b7dff5a6 - risk.vendor.form.update_vendor_success: de1cbdb65ca00cc0a0c1dc228a572f0e - risk.vendor.form.update_vendor_error: 32573ca330db2ace4eb6e4f176443714 - risk.vendor.form.add_comment: 9bcbc9d0a1d75326277586befe6e5a3f - risk.vendor.table.name: 3ffcaf33f0c7f7a222bdff749d3d48a4 - risk.vendor.table.category: 21a0269431d5e6ba1eebf25827cadeba - risk.vendor.table.status: ec53a8c4f07baed5d8825072c89799be - risk.vendor.table.owner: 087deef1a4032da761fa539a6dab8435 - risk.vendor.filters.search_placeholder: 7b85b08f9623e98d31c5a094de46eb03 - risk.vendor.filters.status_placeholder: 35d51f02278f103015a5264d39b44980 - risk.vendor.filters.category_placeholder: 404144333eb5fedd33f9243554fb1b67 - risk.vendor.filters.owner_placeholder: 31bfe5fb16b482977a1b0689fa36128f - risk.vendor.empty_states.no_vendors.title: e8a9538b069b592bda0f6c405123e6c2 - risk.vendor.empty_states.no_vendors.description: 6e69538c9cda2e6d2badf016b9d55885 - risk.vendor.empty_states.no_results.title: 3c22fe33782fde4bb60715cfba3c18b5 - risk.vendor.empty_states.no_results.description: a72b67b1eda315e9ba64841737db162f - risk.vendor.empty_states.no_results.description_with_filters: 6675ce8f4b11d67226042fd01dcee422 - risk.vendor.actions.create: 84a73ff941e3416297f07171c5bf530d - risk.vendor.status.not_assessed: 444dfd899cc9fbfdf0158b61e3fd31ae - risk.vendor.status.in_progress: 99ac75396490fa878f622e311f7a1d11 - risk.vendor.status.assessed: df6410132c5eb02a8f490cc29eaeaca5 - risk.vendor.category.cloud: 03462a41aec357b74c89eb8d272532f7 - risk.vendor.category.infrastructure: 555b6edf52d9fda65d141d7bba972f45 - risk.vendor.category.software_as_a_service: 84fde0bec68d395cf70da59e4c45cd00 - risk.vendor.category.finance: 5999a773cd1e8f482778926f4666f152 - risk.vendor.category.marketing: 913ca6cf2b6df9a4dd2bdff7bfbde3b4 - risk.vendor.category.sales: 9c04f49a10b7f08fd66c28ef73ce6293 - risk.vendor.category.hr: fd4c638da5f85d025963f99fe90b1b1a - risk.vendor.category.other: ec56ec1646b8b5163ea5455385d6c016 - risk.vendor.risk_level.low: 5b19c2e26db7f72ab6079aea9f9d216a - risk.vendor.risk_level.medium: d8c994d8fa7ee584e8f4fc017d56f5b5 - risk.vendor.risk_level.high: d778a39f67247b3782739849fc70078b - risk.vendor.risk_level.unknown: c968a8e299ba16db050ecafc7518384c - risk.dashboard.title: 5967ab15ec405a77b8db5dcdb885d6c6 - risk.dashboard.overview: c6b910bd1da16aa119d9371f43d5c5de - risk.dashboard.risk_status: cc668db25736d5f07de2e8905167e873 - risk.dashboard.risks_by_department: acfcacbdb05fd0e6ca58916bdf8f41f0 - risk.dashboard.risks_by_assignee: 87a5c70685dea39094b83082e2585887 - risk.dashboard.inherent_risk_description: f3d3dffa59354153dce56ff83b48939a - risk.dashboard.residual_risk_description: 6d09af7428c85094c3e98b910ed3b655 - risk.dashboard.risk_assessment_description: b09917a6480e6e8f023fa08f26c313c1 - risk.register.title: 852e03af9adf456a284af6fb605e1fd6 - risk.register.table.risk: 33d37f9288ad443f3861e5ce991f23f1 - risk.register.empty.no_risks.title: 69f58dd05fc7f78c2db9b5648aaa04a6 - risk.register.empty.no_risks.description: 0e6f54b2eaf2782f1540587be785a261 - risk.register.empty.create_risk: 7f5a9aae7bb10b20c7c452538144d6d0 - risk.metrics.probability: 82b9c969f45e983725f58f2738efed1f - risk.metrics.impact: fb5af28f02b70e35f56126da295ff956 - risk.metrics.inherentRisk: 7b6224c6f170f3317c31453ffb0b2687 - risk.metrics.residualRisk: 89b09d808513840bdad57114b82c9e83 - risk.form.update_inherent_risk: b0d99b156ee80ca5890d56bc2b46da32 - risk.form.update_inherent_risk_description: 5d93c2d955cc5538be98319d6aab08cb - risk.form.update_inherent_risk_success: 99798521b546f029efc82b581c37ab50 - risk.form.update_inherent_risk_error: c535e2d625b7ff39da544e54fa16cec8 - risk.form.update_residual_risk: 2e1cd6be7671ad8ea4c3a4975ba2f3f7 - risk.form.update_residual_risk_description: 2b7721040569e6a85050eae0a2130728 - risk.form.update_residual_risk_success: deea9345ed9058774d5b94e891b4a460 - risk.form.update_residual_risk_error: 128e8230b5915be48ee2025a59b6d704 - risk.form.update_risk: b03a8bb3efc718e4e85bf7fc843f8951 - risk.form.update_risk_description: a71071ec63e5f68387535e800568d008 - risk.form.update_risk_success: d7d4d38b82644dc9092c0846b6e5b9ce - risk.form.update_risk_error: 5e022203fa27addde9c0d126f3aa50ca - risk.form.create_risk_success: 67dd75a055ba3ea196ffac0216f1e0eb - risk.form.create_risk_error: 6c5284d17c8e50860f5c9e63312aaa23 - risk.form.risk_details: 67e029f15edaea66fbc83d344e7bfebe - risk.form.risk_title: 2a6820651706cf5fbb406d1ac6c3fc87 - risk.form.risk_title_description: b2e8fe1fee5adb1e27cac79fef44a5d2 - risk.form.risk_description: 59869029490390f1fc4943085f8e08bb - risk.form.risk_description_description: 2dec2c48afdfc3baa26ebacdb564f3f5 - risk.form.risk_category: 21a0269431d5e6ba1eebf25827cadeba - risk.form.risk_category_placeholder: 94ace2a9e405df2178c6936d8cbfde80 - risk.form.risk_department: 6aa4e6545f4382dacc5dc92afa154494 - risk.form.risk_department_placeholder: f17b6366c86ebceb7c12b4f81a2417f3 - risk.form.risk_status: cc668db25736d5f07de2e8905167e873 - risk.form.risk_status_placeholder: b7566c9295e0cb655e290213238ac0fa - risk.tasks.title: 11f2d40053448dfc357a23fada3d2130 - risk.tasks.attachments: 302a01ac24f797a7597958a1f8ef4a58 - risk.tasks.overview: d45e699e336e33398934eb23ae44b7c0 - risk.tasks.form.title: d532d940b70df86fa502b5d2c61bfc9b - risk.tasks.form.task_title: fba51f3e94e6458c96d35ca036d24b6e - risk.tasks.form.status: a09877d1ca9d81884641a41392505bdb - risk.tasks.form.status_placeholder: a8de2d77b56de6df29926e3fcd6e2c04 - risk.tasks.form.task_title_description: 699f09812cd95c3bd5554fe97bcd3be3 - risk.tasks.form.description: 59869029490390f1fc4943085f8e08bb - risk.tasks.form.description_description: 51523980d67910f35bc242dc9a150eab - risk.tasks.form.due_date: 8f3787566b41a9f94ca8f2fe0deaf4c7 - risk.tasks.form.due_date_description: 28b58558d733ef7e34a778662acd5ba8 - risk.tasks.form.success: 2be9cf9fe0b95a001f56f1d43d24519f - risk.tasks.form.error: a3db672d6e4f09620076b714d34cb989 - risk.tasks.sheet.title: 7bc38b246dfbc678df009ec511a37a7f - risk.tasks.sheet.update: 8fab9b71f562163e6d8183ebf9475230 - risk.tasks.sheet.update_description: 52c43fc3885953a8227f554bd826b345 - risk.tasks.empty.description_create: 3bedf7b927e56cf72bcec34b9f45d29a - settings.general.title: a3f43d574940dccc8643842769e48fd4 - settings.general.org_name: ad98ea7d155525c139fd76ee8449f241 - settings.general.org_name_description: f816e289306aead6e86f11ce20df123b - settings.general.org_name_tip: d67ab36fb0cb52a2c0ec8d18ccab83e3 - settings.general.org_website: 2afa3b90ad5edb80e331a01312bf2f71 - settings.general.org_website_description: 9e13af26c62c865e9e2060363684617c - settings.general.org_website_tip: 003f6177401607c0a97fbe4df22e53ff - settings.general.org_website_error: 9df88c469148c58d613481074d803ec6 - settings.general.org_website_updated: bba518754e4ac5379b8df2d460866a63 - settings.general.org_delete: eefaac2f1d2c89aa35586f30fdfea891 - settings.general.org_delete_description: 421c9ce555e53bb5901f236ef85566fc - settings.general.org_delete_alert_title: 170543bdda8321f62b9b238b09fb4bb7 - settings.general.org_delete_alert_description: b54aa40ee6730901940d7a483b32dad4 - settings.general.org_delete_error: ee2fc465207ed530bcad83a9adc0c553 - settings.general.org_delete_success: 60ba3663293e8692f2f33bf3f38fd794 - settings.general.org_name_updated: d577a4798e824ac332a68283a772aa18 - settings.general.org_name_error: e6ba5043b2677d49a80ff3d4258ecee5 - settings.general.save_button: fe9e85aad2e6e67bf18e246f33f176b5 - settings.general.delete_button: f0142486dccb8d28a5d7af2e5d7ce8ac - settings.general.delete_confirm: f62caac35c3c729d6eca06b96a403fab - settings.general.delete_confirm_tip: 2289b8c7b1fb404b5e41f87462254980 - settings.general.cancel_button: edfc4be89515f79e98fcb523d67c0513 - settings.members.title: c1ced8b91fbd958c70c0b7d119f81c29 - settings.billing.title: 809c896e05a39d3b9df97b6e5d66ffa7 - user_menu.theme: f055088fba41cb53e3806e55a9f6896e - user_menu.language: c2bd871e40a477404d746ca7b6e5a377 - user_menu.sign_out: eca541d61ed771af71e52c39f00907f0 - user_menu.account: 8ef1b2ce0360df8af6e52bfdab6e6e9e - user_menu.support: 895cc6b3d812c01b304d5dd06a2be816 - user_menu.settings: c049758877fff5326b89af831719c191 - user_menu.teams: ac848fa228f49ba2b8a5fbd76596817d - frameworks.title: 21e683e741607c45ef400c7dbf6e8798 - frameworks.controls.title: 2ca21079513381553a995babdfef91bf - frameworks.controls.description: 1b4bffb0093416c8a6477e1f666f6a63 - frameworks.controls.table.status: ec53a8c4f07baed5d8825072c89799be - frameworks.controls.table.control: ec25fac07d54a790dc31af1f6b77045e - frameworks.controls.table.artifacts: 4940c8f25276c5117930e1f6cbac1a9b - frameworks.controls.table.actions: 96d4ad2ff651e9bb4ff2408afe0a123f - frameworks.controls.statuses.not_started: 7dbd6504ae0b5c2f8e085eafb34357d7 - frameworks.controls.statuses.compliant: 6794126adda846768777e380f3261fb8 - frameworks.controls.statuses.non_compliant: d4ec60b0fb306838ce1935d2383aadf9 - vendor.title: 5967ab15ec405a77b8db5dcdb885d6c6 - vendor.register_title: b9a2b4aa2cf65b26cd6ae81c13510609 - vendor.dashboard.title: 5967ab15ec405a77b8db5dcdb885d6c6 - vendor.dashboard.overview: 6dd1c0ce1dc8cd66be5b885c4ae31350 - vendor.dashboard.vendor_status: 2a4d7e041e4848f784a1fb71b4956388 - vendor.dashboard.vendor_category: b14cf27d5255aeba0337de69bd06dbe2 - vendor.dashboard.vendors_by_assignee: ad9ca4e599f9624d738a849288c5c902 - vendor.dashboard.inherent_risk_description: 45abc445f611bd3718c356b59f160c0e - vendor.dashboard.residual_risk_description: df00319a2f508cd6fb3d631585b705ee - vendor.register.title: 12fbcb22d19496fc82e821711db878fd - vendor.register.table.name: 3ffcaf33f0c7f7a222bdff749d3d48a4 - vendor.register.table.category: 21a0269431d5e6ba1eebf25827cadeba - vendor.register.table.status: ec53a8c4f07baed5d8825072c89799be - vendor.register.table.owner: 087deef1a4032da761fa539a6dab8435 - vendor.category.cloud: 03462a41aec357b74c89eb8d272532f7 - vendor.category.infrastructure: 555b6edf52d9fda65d141d7bba972f45 - vendor.category.software_as_a_service: b0ca9e41d61885345eef09f928c9ea58 - vendor.category.finance: 5999a773cd1e8f482778926f4666f152 - vendor.category.marketing: 913ca6cf2b6df9a4dd2bdff7bfbde3b4 - vendor.category.sales: 9c04f49a10b7f08fd66c28ef73ce6293 - vendor.category.hr: fd4c638da5f85d025963f99fe90b1b1a - vendor.category.other: ec56ec1646b8b5163ea5455385d6c016 - vendor.vendors: 11c109b95b4f159cf3e4cf767435f6d7 - vendor.form.vendor_details: 7975806fd497b6a6fe1a82beca89b540 - vendor.form.vendor_name: 3ffcaf33f0c7f7a222bdff749d3d48a4 - vendor.form.vendor_name_placeholder: 8bec3408fe198dea51a31316cb386896 - vendor.form.vendor_website: e94da4372d39f6cd24a3bd48330172aa - vendor.form.vendor_website_placeholder: d411635d010c8782a5e9e0c7abd1870a - vendor.form.vendor_description: 59869029490390f1fc4943085f8e08bb - vendor.form.vendor_description_placeholder: 3178d56056e36d3013963c3110a4b86d - vendor.form.vendor_category: 21a0269431d5e6ba1eebf25827cadeba - vendor.form.vendor_category_placeholder: a87a4179a6dccc6d36b5ae0fb3b89c09 - vendor.form.vendor_status: ec53a8c4f07baed5d8825072c89799be - vendor.form.vendor_status_placeholder: 72ce53e5caf4c43fba49352b71378968 - vendor.form.create_vendor_success: 71b14513b7176035227d3faef318cb44 - vendor.form.create_vendor_error: 923686330ce1ef7c1c5592ce43d69a30 - vendor.form.update_vendor_success: de1cbdb65ca00cc0a0c1dc228a572f0e - vendor.form.update_vendor_error: 32573ca330db2ace4eb6e4f176443714 - vendor.form.contacts: b6303e3ce1e97c541b2a8c87f67e9102 - vendor.form.contact_name: 576e829681f05a3ae8e7305f1ab85144 - vendor.form.contact_email: 622881fa45db8af48bdaa6168fdcf799 - vendor.form.contact_role: 1eabc34be8786645573ce7dd7803d885 - vendor.form.add_contact: 156ee98c09a38359c14640316eac062f - vendor.form.new_contact: cb18c05c7a9f9ae944a7c0da2dbba5be - vendor.form.min_one_contact_required: d27f3482238aeb9af604a346b901e416 - vendor.empty_states.no_vendors.title: e8a9538b069b592bda0f6c405123e6c2 - vendor.empty_states.no_vendors.description: 6e69538c9cda2e6d2badf016b9d55885 - vendor.empty_states.no_results.title: 3c22fe33782fde4bb60715cfba3c18b5 - vendor.empty_states.no_results.description: 1e9b36605d59f796996b61f3311f91c9 - vendor.empty_states.no_results.description_with_filters: 6675ce8f4b11d67226042fd01dcee422 - people.title: 57e876a07af4ab8a4ebcf862d4dd5a27 - people.details.taskProgress: 997fd2d3bb0f6f02d416828712f0a2ec - people.details.tasks: 11f2d40053448dfc357a23fada3d2130 - people.details.noTasks: 4c9f41882ac15524da29d87d298d96de - people.description: 2eba0390b6febbaee197811e6b7db571 - people.filters.search: 36655c069b2b9fe980b7653017979bb5 - people.filters.role: a92d3c0b5f9d41b68c2671a528e00c66 - people.actions.invite: 37c4a5450b50726eee1d78a367c993a0 - people.actions.clear: 6042d93be36dfd7c3de692d0dfd93848 - people.table.name: 3ffcaf33f0c7f7a222bdff749d3d48a4 - people.table.email: 3d4125cf83f671c7e93e7ad2fabc73f3 - people.table.department: 6aa4e6545f4382dacc5dc92afa154494 - people.table.externalId: 44c32c6817870f12f7ee46612ebc9c2e - people.empty.no_employees.title: 8a4eec0bee427d3110e1b5771bf029ee - people.empty.no_employees.description: 019f8a12ee03ca63b2dae49b4e6062fa - people.empty.no_results.title: 3c22fe33782fde4bb60715cfba3c18b5 - people.empty.no_results.description: db933a220e91b4066964552244bf3f1f - people.empty.no_results.description_with_filters: 6675ce8f4b11d67226042fd01dcee422 - people.invite.title: 37c4a5450b50726eee1d78a367c993a0 - people.invite.description: 5ba68a4bab6f11aad27335338838b80d - people.invite.email.label: 38c5197eaa551733bd6493ec960d2d0b - people.invite.email.placeholder: ab3db257d633aad4d9159503c7cdbdad - people.invite.role.label: e897f3e6021c38043df9faf67a822f9d - people.invite.role.placeholder: 3db326bf79052f7a39167f76fea6eb74 - people.invite.name.label: 3ffcaf33f0c7f7a222bdff749d3d48a4 - people.invite.name.placeholder: e74fefb3e8bdb0a991064f1a85160480 - people.invite.department.label: 6aa4e6545f4382dacc5dc92afa154494 - people.invite.department.placeholder: f17b6366c86ebceb7c12b4f81a2417f3 - people.invite.submit: 37c4a5450b50726eee1d78a367c993a0 - people.invite.success: 935b6980e030df518e8197b96f087ca1 - people.invite.error: ceb8416eedbe080470864058cd64b494 - errors.unexpected: 2a8556e4045893123086934cbcc5487b + evidence.overview: 376eeb70e956ecef2611d88a28269c5b + evidence.edit: 25f314af9636c15fee70586fda83e696 + evidence.dashboard.layout: 2938c7f7e560ed972f8a4f68e80ff834 + evidence.dashboard.layout_back_button: 0557fa923dcee4d0f86b1409f5c2167f + evidence.dashboard.title: 7d19de8ddf0362f6be1af76f0c02b0ad + evidence.dashboard.by_department: 553fa2baad73c2ec6b8d971c56a9a7d7 + evidence.dashboard.by_assignee: e2653e1b505990acb762b672b67225ec + evidence.dashboard.by_framework: fc4ded0c76857f808b406cf1f3a3f004 + evidence.items: 691d502cfd0e0626cd3b058e5682ad1c + evidence.status.up_to_date: e519a1ecd0afa6828cea3c07f7d09b4a + evidence.status.needs_review: 994f197b212a0f4dc844cc3534e889c2 + evidence.status.draft: f03ab16cd58372c77ba45a3d9a5a1cb9 + evidence.status.empty: ce2c8aed9c2fa0cfbed56cbda4d8bf07 + evidence.departments.none: 0d015d96f63a8c12d96b8399482b593f + evidence.departments.admin: 7258e7251413465e0a3eb58094430bde + evidence.departments.gov: 5a935787d6f091fc760443ab4c491465 + evidence.departments.hr: d19092ef5301d9548911f87a817f8c44 + evidence.departments.it: 73595e157019f972a82f2fea61332a73 + evidence.departments.itsm: 1856585762a862d699c7538b61d6fa8b + evidence.departments.qms: 3b88c0772d938028236e5098c096b2d5 + evidence.details.review_section: 659514b42799e5982d28793d9e003ae3 + evidence.details.content: 393ae95538cd395eb8d1f7521f652b10 diff --git a/apps/app/src/locales/es.ts b/apps/app/src/locales/es.ts index 0fb3b35e3f..33ea1d54a1 100644 --- a/apps/app/src/locales/es.ts +++ b/apps/app/src/locales/es.ts @@ -2,56 +2,56 @@ export default { language: { title: "Idiomas", description: "Cambia el idioma utilizado en la interfaz de usuario.", - placeholder: "Seleccionar idioma", + placeholder: "Seleccionar idioma" }, languages: { en: "Inglés", no: "Noruego", es: "Español", fr: "Francés", - pt: "Portugués", + pt: "Portugués" }, common: { actions: { save: "Guardar", edit: "Editar", - delete: "Eliminar", + "delete": "Eliminar", cancel: "Cancelar", clear: "Limpiar", create: "Crear", send: "Enviar", - return: "Regresar", + "return": "Regresar", success: "Éxito", error: "Error", next: "Siguiente", complete: "Completar", - addNew: "Agregar Nuevo", + addNew: "Agregar nuevo" }, assignee: { - label: "Asignado a", - placeholder: "Seleccionar asignado", + label: "Asignado", + placeholder: "Seleccionar asignado" }, date: { - pick: "Seleccionar una fecha", - due_date: "Fecha de vencimiento", + pick: "Elegir una fecha", + due_date: "Fecha de vencimiento" }, status: { open: "Abierto", pending: "Pendiente", closed: "Cerrado", archived: "Archivado", - compliant: "Cumplido", - non_compliant: "No Cumplido", - not_started: "No Iniciado", - in_progress: "En Progreso", + compliant: "Cumplidor", + non_compliant: "No cumplidor", + not_started: "No iniciado", + in_progress: "En progreso", published: "Publicado", - needs_review: "Necesita Revisión", + needs_review: "Necesita revisión", draft: "Borrador", - not_assessed: "No Evaluado", + not_assessed: "No evaluado", assessed: "Evaluado", active: "Activo", inactive: "Inactivo", - title: "Estado", + title: "Estado" }, filters: { clear: "Limpiar filtros", @@ -59,9 +59,9 @@ export default { status: "Estado", department: "Departamento", owner: { - label: "Asignado a", - placeholder: "Filtrar por asignado", - }, + label: "Asignado", + placeholder: "Filtrar por asignado" + } }, table: { title: "Título", @@ -69,7 +69,7 @@ export default { assigned_to: "Asignado a", due_date: "Fecha de vencimiento", last_updated: "Última actualización", - no_results: "No se encontraron resultados", + no_results: "No se encontraron resultados" }, empty_states: { no_results: { @@ -79,12 +79,12 @@ export default { description: "Intenta otra búsqueda o ajusta los filtros", description_filters: "Intenta otra búsqueda o ajusta los filtros", description_no_tasks: "Crea una tarea para comenzar", - description_no_risks: "Crea un riesgo para comenzar", + description_no_risks: "Crea un riesgo para comenzar" }, no_items: { title: "No se encontraron elementos", - description: "Intenta ajustar tu búsqueda o filtros", - }, + description: "Intenta ajustar tu búsqueda o filtros" + } }, pagination: { of: "de", @@ -94,42 +94,39 @@ export default { go_to_first_page: "Ir a la primera página", go_to_previous_page: "Ir a la página anterior", go_to_next_page: "Ir a la siguiente página", - go_to_last_page: "Ir a la última página", + go_to_last_page: "Ir a la última página" }, comments: { title: "Comentarios", - description: - "Agrega un comentario utilizando el formulario a continuación.", + description: "Agrega un comentario utilizando el formulario a continuación.", add: "Nuevo comentario", - new: "Nuevo Comentario", - save: "Guardar Comentario", + "new": "Nuevo comentario", + save: "Guardar comentario", success: "Comentario agregado con éxito", error: "Error al agregar comentario", placeholder: "Escribe tu comentario aquí...", empty: { - title: "Sin comentarios aún", - description: "Sé el primero en agregar un comentario", - }, + title: "No hay comentarios aún", + description: "Sé el primero en agregar un comentario" + } }, attachments: { title: "Adjuntos", - description: "Agrega un archivo haciendo clic en 'Agregar Adjunto'.", - upload: "Subir archivo adjunto", - upload_description: - "Sube un adjunto o agrega un enlace a un recurso externo.", + description: "Agrega un archivo haciendo clic en 'Agregar adjunto'.", + upload: "Subir adjunto", + upload_description: "Sube un adjunto o agrega un enlace a un recurso externo.", drop: "Suelta los archivos aquí", - drop_description: - "Suelta archivos aquí o haz clic para elegir archivos de tu dispositivo.", - drop_files_description: "Los archivos pueden tener un tamaño de hasta ", + drop_description: "Suelta archivos aquí o haz clic para elegir archivos de tu dispositivo.", + drop_files_description: "Los archivos pueden ser de hasta ", empty: { - title: "Sin adjuntos", - description: "Agrega un archivo haciendo clic en 'Agregar Adjunto'.", + title: "No hay adjuntos", + description: "Agrega un archivo haciendo clic en 'Agregar adjunto'." }, toasts: { error: "Algo salió mal, por favor intenta de nuevo.", error_uploading_files: "No se puede subir más de 1 archivo a la vez", error_uploading_files_multiple: "No se pueden subir más de 10 archivos", - error_no_files_selected: "No se seleccionaron archivos", + error_no_files_selected: "No se han seleccionado archivos", error_file_rejected: "El archivo {file} fue rechazado", error_failed_to_upload_files: "Error al subir archivos", error_failed_to_upload_files_multiple: "Error al subir archivos", @@ -139,18 +136,18 @@ export default { success_uploading_files_single: "Archivo subido con éxito", success_uploading_files_target: "Archivos subidos", uploading_files: "Subiendo {target}...", - remove_file: "Eliminar archivo", - }, + remove_file: "Eliminar archivo" + } }, notifications: { inbox: "Bandeja de entrada", archive: "Archivo", archive_all: "Archivar todo", - no_notifications: "No hay nuevas notificaciones", + no_notifications: "No hay nuevas notificaciones" }, edit: "Editar", errors: { - unexpected_error: "Ocurrió un error inesperado", + unexpected_error: "Ocurrió un error inesperado" }, description: "Descripción", last_updated: "Última actualización", @@ -159,35 +156,34 @@ export default { weekly: "Semanal", monthly: "Mensual", quarterly: "Trimestral", - yearly: "Anual", - }, + yearly: "Anual" + } }, header: { discord: { - button: "Únete a nosotros en Discord", + button: "Únete a nosotros en Discord" }, feedback: { button: "Comentarios", title: "¡Gracias por tus comentarios!", description: "Volveremos contigo lo antes posible", - placeholder: - "Ideas para mejorar esta página o problemas que estás experimentando.", + placeholder: "Ideas para mejorar esta página o problemas que estás experimentando.", success: "¡Gracias por tus comentarios!", error: "Error al enviar comentarios - ¿intentar de nuevo?", - send: "Enviar Comentarios", - }, + send: "Enviar comentarios" + } }, not_found: { title: "404 - Página no encontrada", description: "La página que buscas no existe.", - return: "Regresar al panel", + "return": "Volver al panel de control" }, theme: { options: { light: "Claro", dark: "Oscuro", - system: "Sistema", - }, + system: "Sistema" + } }, sidebar: { overview: "Resumen", @@ -197,12 +193,11 @@ export default { integrations: "Integraciones", settings: "Configuraciones", evidence: "Tareas de Evidencia", - people: "Personas", + people: "Personas" }, auth: { title: "Automatiza el cumplimiento de SOC 2, ISO 27001 y GDPR con IA.", - description: - "Crea una cuenta gratuita o inicia sesión con una cuenta existente para continuar.", + description: "Crea una cuenta gratuita o inicia sesión con una cuenta existente para continuar.", options: "Más opciones", google: "Continuar con Google", email: { @@ -210,14 +205,12 @@ export default { placeholder: "Ingresa la dirección de correo electrónico", button: "Continuar con correo electrónico", magic_link_sent: "Enlace mágico enviado", - magic_link_description: - "Revisa tu bandeja de entrada para un enlace mágico.", + magic_link_description: "Revisa tu bandeja de entrada para un enlace mágico.", magic_link_try_again: "Intenta de nuevo.", success: "Correo enviado - ¡revisa tu bandeja de entrada!", - error: "Error al enviar el correo - ¿intentar de nuevo?", + error: "Error al enviar el correo - ¿intentar de nuevo?" }, - terms: - "Al hacer clic en continuar, reconoces que has leído y aceptas los Términos de Servicio y la Política de Privacidad.", + terms: "Al hacer clic en continuar, reconoces que has leído y aceptas los Términos de Servicio y la Política de Privacidad." }, onboarding: { title: "Crear una organización", @@ -226,71 +219,71 @@ export default { fields: { name: { label: "Nombre de la Organización", - placeholder: "El nombre de tu organización", + placeholder: "El nombre de tu organización" }, website: { label: "Sitio web", - placeholder: "El sitio web de tu organización", + placeholder: "El sitio web de tu organización" }, subdomain: { label: "Subdominio", - placeholder: "ejemplo", + placeholder: "ejemplo" }, fullName: { label: "Tu Nombre", - placeholder: "Tu nombre completo", - }, + placeholder: "Tu nombre completo" + } }, success: "¡Gracias, estás listo!", error: "Algo salió mal, por favor intenta de nuevo.", unavailable: "No disponible", check_availability: "Verificando disponibilidad", - available: "Disponible", + available: "Disponible" }, overview: { title: "Resumen", framework_chart: { - title: "Progreso del Marco", + title: "Progreso del Marco" }, requirement_chart: { - title: "Estado de Cumplimiento", - }, + title: "Estado de Cumplimiento" + } }, policies: { dashboard: { - title: "Panel", + title: "Panel de Control", all: "Todas las Políticas", policy_status: "Política por Estado", policies_by_assignee: "Políticas por Asignado", policies_by_framework: "Políticas por Marco", sub_pages: { - overview: "Descripción general", - edit_policy: "Editar política", - }, + overview: "Resumen", + edit_policy: "Editar Política" + } }, table: { - name: "Nombre de la Política", + name: "Nombre de la política", statuses: { draft: "Borrador", published: "Publicado", - archived: "Archivado", + archived: "Archivado" }, filters: { owner: { - label: "Asignado", - placeholder: "Filtrar por asignado", - }, - }, + label: "Responsable", + placeholder: "Filtrar por responsable" + } + } }, filters: { search: "Buscar políticas...", - all: "Todas las Políticas", + all: "Todas las políticas" }, status: { draft: "Borrador", published: "Publicado", - needs_review: "Necesita Revisión", - archived: "Archivado", + needs_review: "Necesita revisión", + archived: "Archivado" }, policies: "políticas", title: "Políticas", @@ -311,171 +304,159 @@ export default { title: "Resumen de la Política", form: { update_policy: "Actualizar Política", - update_policy_description: - "Actualice el título o la descripción de la política.", + update_policy_description: "Actualiza el título o la descripción de la política.", update_policy_success: "Política actualizada con éxito", update_policy_error: "Error al actualizar la política", update_policy_title: "Nombre de la Política", review_frequency: "Frecuencia de Revisión", - review_frequency_placeholder: "Seleccione una frecuencia de revisión", - review_date: "Fecha de Revisión", - review_date_placeholder: "Seleccione una fecha de revisión", - }, - }, + review_frequency_placeholder: "Selecciona una frecuencia de revisión", + review_date: "Fecha de revisión", + review_date_placeholder: "Seleccionar una fecha de revisión" + } + } }, evidence_tasks: { - evidence_tasks: "Tareas de Evidencia", - overview: "Resumen", + evidence_tasks: "Tareas de evidencia", + overview: "Resumen" }, risk: { risks: "riesgos", overview: "Resumen", - create: "Crear Nuevo Riesgo", + create: "Crear nuevo riesgo", vendor: { - title: "Gestión de Proveedores", + title: "Gestión de proveedores", dashboard: { - title: "Panel de Proveedores", - overview: "Resumen de Proveedores", - vendor_status: "Estado del Proveedor", - vendor_category: "Categorías de Proveedores", - vendors_by_assignee: "Proveedores por Asignado", - inherent_risk_description: - "Nivel de riesgo inicial antes de aplicar controles", - residual_risk_description: - "Nivel de riesgo restante después de aplicar controles", + title: "Tablero de proveedores", + overview: "Resumen del proveedor", + vendor_status: "Estado del proveedor", + vendor_category: "Categorías de proveedores", + vendors_by_assignee: "Proveedores por responsable", + inherent_risk_description: "Nivel de riesgo inicial antes de aplicar controles", + residual_risk_description: "Nivel de riesgo restante después de aplicar controles" }, register: { - title: "Registro de Proveedores", + title: "Registro de proveedores", table: { name: "Nombre", category: "Categoría", status: "Estado", - owner: "Propietario", - }, + owner: "Propietario" + } }, assessment: { - title: "Evaluación de Proveedores", - update_success: - "Evaluación de riesgo del proveedor actualizada con éxito", - update_error: - "Error al actualizar la evaluación de riesgo del proveedor", - inherent_risk: "Riesgo Inherente", - residual_risk: "Riesgo Residual", + title: "Evaluación del proveedor", + update_success: "Evaluación de riesgo del proveedor actualizada con éxito", + update_error: "Error al actualizar la evaluación de riesgo del proveedor", + inherent_risk: "Riesgo inherente", + residual_risk: "Riesgo residual" }, form: { - vendor_details: "Detalles del Proveedor", + vendor_details: "Detalles del proveedor", vendor_name: "Nombre", - vendor_name_placeholder: "Ingresa el nombre del proveedor", + vendor_name_placeholder: "Ingrese el nombre del proveedor", vendor_website: "Sitio web", - vendor_website_placeholder: "Ingresa el sitio web del proveedor", + vendor_website_placeholder: "Ingrese el sitio web del proveedor", vendor_description: "Descripción", - vendor_description_placeholder: "Ingresa la descripción del proveedor", + vendor_description_placeholder: "Ingrese la descripción del proveedor", vendor_category: "Categoría", - vendor_category_placeholder: "Selecciona categoría", + vendor_category_placeholder: "Seleccionar categoría", vendor_status: "Estado", - vendor_status_placeholder: "Selecciona estado", + vendor_status_placeholder: "Seleccionar estado", create_vendor_success: "Proveedor creado con éxito", create_vendor_error: "Error al crear el proveedor", - update_vendor: "Actualizar Proveedor", + update_vendor: "Actualizar proveedor", update_vendor_success: "Proveedor actualizado con éxito", update_vendor_error: "Error al actualizar el proveedor", - add_comment: "Agregar Comentario", + add_comment: "Agregar comentario" }, table: { name: "Nombre", category: "Categoría", status: "Estado", - owner: "Propietario", + owner: "Propietario" }, filters: { search_placeholder: "Buscar proveedores...", status_placeholder: "Filtrar por estado", category_placeholder: "Filtrar por categoría", - owner_placeholder: "Filtrar por propietario", + owner_placeholder: "Filtrar por propietario" }, empty_states: { no_vendors: { - title: "Aún no hay proveedores", - description: "Comienza creando tu primer proveedor", + title: "No hay proveedores aún", + description: "Comienza creando tu primer proveedor" }, no_results: { title: "No se encontraron resultados", description: "No hay proveedores que coincidan con tu búsqueda", - description_with_filters: "Intenta ajustar tus filtros", - }, + description_with_filters: "Intenta ajustar tus filtros" + } }, actions: { - create: "Crear Proveedor", + create: "Crear proveedor" }, status: { - not_assessed: "No Evaluado", - in_progress: "En Progreso", - assessed: "Evaluado", + not_assessed: "No evaluado", + in_progress: "En progreso", + assessed: "Evaluado" }, category: { cloud: "Nube", infrastructure: "Infraestructura", - software_as_a_service: "Software como Servicio", + software_as_a_service: "Software como servicio", finance: "Finanzas", marketing: "Marketing", sales: "Ventas", hr: "RRHH", - other: "Otro", + other: "Otro" }, risk_level: { - low: "Bajo Riesgo", - medium: "Riesgo Medio", - high: "Alto Riesgo", - unknown: "Riesgo Desconocido", - }, + low: "Riesgo bajo", + medium: "Riesgo medio", + high: "Riesgo alto", + unknown: "Riesgo desconocido" + } }, dashboard: { title: "Tablero", - overview: "Resumen de Riesgos", + overview: "Resumen de riesgos", risk_status: "Estado del Riesgo", risks_by_department: "Riesgos por Departamento", risks_by_assignee: "Riesgos por Asignado", - inherent_risk_description: - "El riesgo inherente se calcula como probabilidad * impacto. Calculado antes de aplicar cualquier control.", - residual_risk_description: - "El riesgo residual se calcula como probabilidad * impacto. Este es el nivel de riesgo después de aplicar controles.", - risk_assessment_description: - "Compara los niveles de riesgo inherente y residual", + inherent_risk_description: "El riesgo inherente se calcula como probabilidad * impacto. Calculado antes de que se apliquen controles.", + residual_risk_description: "El riesgo residual se calcula como probabilidad * impacto. Este es el nivel de riesgo después de que se aplican controles.", + risk_assessment_description: "Comparar los niveles de riesgo inherente y residual" }, register: { title: "Registro de Riesgos", table: { - risk: "Riesgo", + risk: "Riesgo" }, empty: { no_risks: { title: "Crea un riesgo para comenzar", - description: - "Rastrea y puntúa riesgos, crea y asigna tareas de mitigación para tu equipo, y gestiona tu registro de riesgos todo en una interfaz simple.", + description: "Rastrea y puntúa riesgos, crea y asigna tareas de mitigación para tu equipo, y gestiona tu registro de riesgos todo en una interfaz simple." }, - create_risk: "Crear un riesgo", - }, + create_risk: "Crear un riesgo" + } }, metrics: { probability: "Probabilidad", impact: "Impacto", inherentRisk: "Riesgo Inherente", - residualRisk: "Riesgo Residual", + residualRisk: "Riesgo Residual" }, form: { update_inherent_risk: "Guardar Riesgo Inherente", - update_inherent_risk_description: - "Actualiza el riesgo inherente del riesgo. Este es el nivel de riesgo antes de aplicar cualquier control.", + update_inherent_risk_description: "Actualiza el riesgo inherente del riesgo. Este es el nivel de riesgo antes de que se apliquen controles.", update_inherent_risk_success: "Riesgo inherente actualizado con éxito", update_inherent_risk_error: "Error al actualizar el riesgo inherente", update_residual_risk: "Guardar Riesgo Residual", - update_residual_risk_description: - "Actualiza el riesgo residual del riesgo. Este es el nivel de riesgo después de aplicar controles.", + update_residual_risk_description: "Actualiza el riesgo residual del riesgo. Este es el nivel de riesgo después de que se aplican controles.", update_residual_risk_success: "Riesgo residual actualizado con éxito", update_residual_risk_error: "Error al actualizar el riesgo residual", update_risk: "Actualizar Riesgo", - update_risk_description: - "Actualiza el título o la descripción del riesgo.", + update_risk_description: "Actualiza el título o la descripción del riesgo.", update_risk_success: "Riesgo actualizado con éxito", update_risk_error: "Error al actualizar el riesgo", create_risk_success: "Riesgo creado con éxito", @@ -490,7 +471,7 @@ export default { risk_department: "Departamento", risk_department_placeholder: "Selecciona un departamento", risk_status: "Estado del Riesgo", - risk_status_placeholder: "Selecciona un estado de riesgo", + risk_status_placeholder: "Selecciona un estado de riesgo" }, tasks: { title: "Tareas", @@ -505,41 +486,35 @@ export default { description: "Descripción", description_description: "Ingresa una descripción para la tarea", due_date: "Fecha de Vencimiento", - due_date_description: - "Selecciona la fecha de vencimiento para la tarea", + due_date_description: "Selecciona la fecha de vencimiento para la tarea", success: "Tarea creada con éxito", - error: "Error al crear la tarea", + error: "Error al crear la tarea" }, sheet: { title: "Crear Tarea", update: "Actualizar Tarea", - update_description: "Actualiza el título o la descripción de la tarea.", + update_description: "Actualiza el título o la descripción de la tarea." }, empty: { - description_create: - "Crea una tarea de mitigación para este riesgo, agrega un plan de tratamiento y asígnala a un miembro del equipo.", - }, - }, + description_create: "Crea una tarea de mitigación para este riesgo, añade un plan de tratamiento y asígnalo a un miembro del equipo." + } + } }, settings: { general: { title: "General", org_name: "Nombre de la organización", - org_name_description: - "Este es el nombre visible de tu organización. Debes usar el nombre legal de tu organización.", + org_name_description: "Este es el nombre visible de tu organización. Debes usar el nombre legal de tu organización.", org_name_tip: "Por favor, usa un máximo de 32 caracteres.", - org_website: "Sitio web de la organización", - org_website_description: - "Esta es la URL oficial del sitio web de tu organización. Asegúrate de incluir la URL completa con https://.", + org_website: "Sitio Web de la Organización", + org_website_description: "Esta es la URL del sitio web oficial de tu organización. Asegúrate de incluir la URL completa con https://.", org_website_tip: "Por favor, ingresa una URL válida incluyendo https://", org_website_error: "Error al actualizar el sitio web de la organización", org_website_updated: "Sitio web de la organización actualizado", org_delete: "Eliminar organización", - org_delete_description: - "Elimina permanentemente tu organización y todo su contenido de la plataforma Comp AI. Esta acción no es reversible - por favor, continúa con precaución.", + org_delete_description: "Elimina permanentemente tu organización y todo su contenido de la plataforma Comp AI. Esta acción no es reversible - por favor, continúa con precaución.", org_delete_alert_title: "¿Estás absolutamente seguro?", - org_delete_alert_description: - "Esta acción no se puede deshacer. Esto eliminará permanentemente tu organización y eliminará tus datos de nuestros servidores.", + org_delete_alert_description: "Esta acción no se puede deshacer. Esto eliminará permanentemente tu organización y eliminará tus datos de nuestros servidores.", org_delete_error: "Error al eliminar la organización", org_delete_success: "Organización eliminada", org_name_updated: "Nombre de la organización actualizado", @@ -548,14 +523,14 @@ export default { delete_button: "Eliminar", delete_confirm: "ELIMINAR", delete_confirm_tip: "Escribe ELIMINAR para confirmar.", - cancel_button: "Cancelar", + cancel_button: "Cancelar" }, members: { - title: "Miembros", + title: "Miembros" }, billing: { - title: "Facturación", - }, + title: "Facturación" + } }, user_menu: { theme: "Tema", @@ -564,81 +539,75 @@ export default { account: "Cuenta", support: "Soporte", settings: "Configuraciones", - teams: "Equipos", + teams: "Equipos" }, frameworks: { title: "Marcos", controls: { title: "Controles", - description: "Revisa y gestiona los controles de cumplimiento", + description: "Revisar y gestionar controles de cumplimiento", table: { status: "Estado", control: "Control", artifacts: "Artefactos", - actions: "Acciones", + actions: "Acciones" }, statuses: { - not_started: "No iniciado", - compliant: "Cumple", - non_compliant: "No cumple", + not_started: "No Comenzado", completed: "Completado", - in_progress: "En Progreso", - }, + in_progress: "En Progreso" + } }, overview: { - error: "Error al cargar los marcos", + error: "Error al cargar marcos", loading: "Cargando marcos...", empty: { title: "No se han seleccionado marcos", - description: "Seleccione marcos para comenzar su viaje de cumplimiento", + description: "Selecciona marcos para comenzar tu viaje de cumplimiento" }, progress: { - title: "Progreso del marco", + title: "Progreso del Marco", empty: { title: "Aún no hay marcos", - description: - "Comience agregando un marco de cumplimiento para rastrear su progreso", - action: "Agregar marco", - }, + description: "Comienza agregando un marco de cumplimiento para rastrear tu progreso", + action: "Agregar Marco" + } }, grid: { welcome: { title: "Bienvenido a Comp AI", - description: - "Comience seleccionando los marcos de cumplimiento que le gustaría implementar. Le ayudaremos a gestionar y rastrear su viaje de cumplimiento a través de múltiples estándares.", - action: "Comenzar", + description: "Comienza seleccionando los marcos de cumplimiento que te gustaría implementar. Te ayudaremos a gestionar y rastrear tu viaje de cumplimiento a través de múltiples estándares.", + action: "Comenzar" }, - title: "Seleccionar marcos", + title: "Seleccionar Marcos", version: "Versión", actions: { clear: "Borrar", - confirm: "Confirmar selección", - }, - }, - }, + confirm: "Confirmar Selección" + } + } + } }, vendor: { title: "Tablero", - register_title: "Gestión de proveedores", + register_title: "Gestión de Proveedores", dashboard: { title: "Tablero", - overview: "Resumen del proveedor", - vendor_status: "Estado del proveedor", - vendor_category: "Categorías de proveedores", - vendors_by_assignee: "Proveedores por asignado", - inherent_risk_description: - "Nivel de riesgo inicial antes de aplicar controles", - residual_risk_description: - "Nivel de riesgo restante después de aplicar controles", + overview: "Resumen del Proveedor", + vendor_status: "Estado del Proveedor", + vendor_category: "Categorías de Proveedores", + vendors_by_assignee: "Proveedores por Asignado", + inherent_risk_description: "Nivel de riesgo inicial antes de aplicar controles", + residual_risk_description: "Nivel de riesgo restante después de aplicar controles" }, register: { - title: "Registro de proveedores", + title: "Registro de Proveedores", table: { name: "Nombre", category: "Categoría", status: "Estado", - owner: "Propietario", - }, + owner: "Propietario" + } }, category: { cloud: "Nube", @@ -648,11 +617,11 @@ export default { marketing: "Marketing", sales: "Ventas", hr: "RRHH", - other: "Otro", + other: "Otro" }, vendors: "proveedores", form: { - vendor_details: "Detalles del proveedor", + vendor_details: "Detalles del Proveedor", vendor_name: "Nombre", vendor_name_placeholder: "Ingresa el nombre del proveedor", vendor_website: "Sitio web", @@ -660,92 +629,92 @@ export default { vendor_description: "Descripción", vendor_description_placeholder: "Ingresa la descripción del proveedor", vendor_category: "Categoría", - vendor_category_placeholder: "Selecciona categoría", + vendor_category_placeholder: "Seleccionar categoría", vendor_status: "Estado", - vendor_status_placeholder: "Selecciona estado", + vendor_status_placeholder: "Seleccionar estado", create_vendor_success: "Proveedor creado con éxito", create_vendor_error: "Error al crear el proveedor", update_vendor_success: "Proveedor actualizado con éxito", update_vendor_error: "Error al actualizar el proveedor", - contacts: "Contactos del proveedor", - contact_name: "Nombre del contacto", - contact_email: "Correo electrónico del contacto", - contact_role: "Rol del contacto", - add_contact: "Agregar contacto", - new_contact: "Nuevo contacto", - min_one_contact_required: "Un proveedor debe tener al menos un contacto", + contacts: "Contactos del Proveedor", + contact_name: "Nombre del Contacto", + contact_email: "Correo Electrónico del Contacto", + contact_role: "Rol del Contacto", + add_contact: "Agregar Contacto", + new_contact: "Nuevo Contacto", + min_one_contact_required: "Un proveedor debe tener al menos un contacto" }, empty_states: { no_vendors: { title: "Aún no hay proveedores", - description: "Comienza creando tu primer proveedor", + description: "Comienza creando tu primer proveedor" }, no_results: { title: "No se encontraron resultados", - description: "No hay proveedores que coincidan con tu búsqueda", - description_with_filters: "Intenta ajustar tus filtros", - }, - }, + description: "Ningún proveedor coincide con tu búsqueda", + description_with_filters: "Intenta ajustar tus filtros" + } + } }, people: { title: "Personas", details: { taskProgress: "Progreso de la Tarea", tasks: "Tareas", - noTasks: "Aún no hay tareas asignadas", + noTasks: "No hay tareas asignadas aún" }, description: "Gestiona a los miembros de tu equipo y sus roles.", filters: { search: "Buscar personas...", - role: "Filtrar por rol", + role: "Filtrar por rol" }, actions: { - invite: "Agregar empleado", - clear: "Limpiar filtros", + invite: "Agregar Empleado", + clear: "Limpiar filtros" }, table: { name: "Nombre", - email: "Correo electrónico", + email: "Correo Electrónico", department: "Departamento", - externalId: "ID externo", + externalId: "ID Externo" }, empty: { no_employees: { - title: "Aún no hay empleados", - description: "Comienza invitando a tu primer miembro del equipo.", + title: "No hay empleados aún", + description: "Comienza invitando a tu primer miembro del equipo." }, no_results: { title: "No se encontraron resultados", description: "No hay empleados que coincidan con tu búsqueda", - description_with_filters: "Intenta ajustar tus filtros", - }, + description_with_filters: "Intenta ajustar tus filtros" + } }, invite: { - title: "Agregar empleado", + title: "Agregar Empleado", description: "Agrega un empleado a tu organización.", email: { label: "Dirección de correo electrónico", - placeholder: "Ingresa la dirección de correo electrónico", + placeholder: "Ingresa la dirección de correo electrónico" }, role: { label: "Rol", - placeholder: "Selecciona un rol", + placeholder: "Selecciona un rol" }, name: { label: "Nombre", - placeholder: "Ingresa el nombre", + placeholder: "Ingresa el nombre" }, department: { label: "Departamento", - placeholder: "Selecciona un departamento", + placeholder: "Selecciona un departamento" }, - submit: "Agregar empleado", + submit: "Agregar Empleado", success: "Empleado agregado con éxito", - error: "Error al agregar empleado", - }, + error: "Error al agregar empleado" + } }, errors: { - unexpected: "Algo salió mal, por favor intenta de nuevo", + unexpected: "Algo salió mal, por favor intenta de nuevo" }, sub_pages: { risk: { @@ -754,29 +723,29 @@ export default { risk_overview: "Resumen de Riesgos", risk_comments: "Comentarios sobre Riesgos", tasks: { - task_overview: "Resumen de Tareas", - }, + task_overview: "Resumen de Tareas" + } }, policies: { all: "Todas las Políticas", editor: "Editor de Políticas", - policy_details: "Detalles de la política", + policy_details: "Detalles de la Política" }, people: { all: "Personas", - employee_details: "Detalles del Empleado", + employee_details: "Detalles del Empleado" }, settings: { - members: "Miembros del Equipo", + members: "Miembros del Equipo" }, frameworks: { - overview: "Marcos", + overview: "Marcos" }, evidence: { title: "Evidencia", - list: "Lista de Evidencias", - overview: "Resumen de Evidencias", - }, + list: "Lista de Evidencia", + overview: "Resumen de Evidencia" + } }, editor: { ai: { @@ -784,25 +753,51 @@ export default { thinking_spinner: "La IA está pensando", edit_or_generate: "Editar o generar...", tell_ai_what_to_do_next: "Dile a la IA qué hacer a continuación", - request_limit_reached: - "Has alcanzado tu límite de solicitudes para el día.", + request_limit_reached: "Ha alcanzado su límite de solicitudes para el día." }, ai_selector: { improve: "Mejorar la redacción", fix: "Corregir la gramática", shorter: "Hacer más corto", longer: "Hacer más largo", - continue: "Continuar escribiendo", + "continue": "Continuar escribiendo", replace: "Reemplazar selección", insert: "Insertar abajo", - discard: "Descartar", - }, + discard: "Descartar" + } }, evidence: { - title: "Tareas de Evidencia", - description: - "Gestiona y rastrea las tareas de evidencia para tus requisitos de cumplimiento.", - dashboard: "Tablero", - list: "Todas las Evidencias", - }, + title: "Evidencia", + list: "Toda la Evidencia", + overview: "Resumen de Evidencia", + edit: "Editar Evidencia", + dashboard: { + layout: "Tablero", + layout_back_button: "Atrás", + title: "Tablero de Evidencia", + by_department: "Por Departamento", + by_assignee: "Por Asignado", + by_framework: "Por Marco" + }, + items: "elementos", + status: { + up_to_date: "Actualizado", + needs_review: "Necesita Revisión", + draft: "Borrador", + empty: "Vacío" + }, + departments: { + none: "Sin Categorizar", + admin: "Administración", + gov: "Gobernanza", + hr: "Recursos Humanos", + it: "Tecnologías de la Información", + itsm: "Gestión de Servicios de TI", + qms: "Gestión de Calidad" + }, + details: { + review_section: "Revisar Información", + content: "Contenido de Evidencia" + } + } } as const; diff --git a/apps/app/src/locales/fr.ts b/apps/app/src/locales/fr.ts index 556324dd6c..5ca6b636f3 100644 --- a/apps/app/src/locales/fr.ts +++ b/apps/app/src/locales/fr.ts @@ -4,36 +4,36 @@ export default { fr: "Français", no: "Norvégien", pt: "Portugais", - en: "Anglais", + en: "Anglais" }, language: { title: "Langues", - description: "Changez la langue utilisée dans l'interface utilisateur.", - placeholder: "Sélectionner la langue", + description: "Changer la langue utilisée dans l'interface utilisateur.", + placeholder: "Sélectionner la langue" }, common: { actions: { save: "Enregistrer", edit: "Modifier", - delete: "Supprimer", + "delete": "Supprimer", cancel: "Annuler", clear: "Effacer", create: "Créer", send: "Envoyer", - return: "Retourner", + "return": "Retourner", success: "Succès", error: "Erreur", next: "Suivant", - complete: "Terminer", - addNew: "Ajouter Nouveau", + complete: "Compléter", + addNew: "Ajouter nouveau" }, assignee: { - label: "Assigné à", - placeholder: "Sélectionner l'assigné", + label: "Assigné", + placeholder: "Sélectionner l'assigné" }, date: { pick: "Choisir une date", - due_date: "Date d'échéance", + due_date: "Date d'échéance" }, status: { open: "Ouvert", @@ -51,17 +51,17 @@ export default { assessed: "Évalué", active: "Actif", inactive: "Inactif", - title: "Statut", + title: "Statut" }, filters: { clear: "Effacer les filtres", - search: "Rechercher...", + search: "Recherche...", status: "Statut", department: "Département", owner: { - label: "Assigné à", - placeholder: "Filtrer par assigné", - }, + label: "Assigné", + placeholder: "Filtrer par assigné" + } }, table: { title: "Titre", @@ -69,7 +69,7 @@ export default { assigned_to: "Assigné à", due_date: "Date d'échéance", last_updated: "Dernière mise à jour", - no_results: "Aucun résultat trouvé", + no_results: "Aucun résultat trouvé" }, empty_states: { no_results: { @@ -77,15 +77,14 @@ export default { title_tasks: "Aucune tâche trouvée", title_risks: "Aucun risque trouvé", description: "Essayez une autre recherche ou ajustez les filtres", - description_filters: - "Essayez une autre recherche ou ajustez les filtres", + description_filters: "Essayez une autre recherche ou ajustez les filtres", description_no_tasks: "Créez une tâche pour commencer", - description_no_risks: "Créez un risque pour commencer", + description_no_risks: "Créez un risque pour commencer" }, no_items: { title: "Aucun élément trouvé", - description: "Essayez d'ajuster votre recherche ou vos filtres", - }, + description: "Essayez d'ajuster votre recherche ou vos filtres" + } }, pagination: { of: "de", @@ -95,69 +94,60 @@ export default { go_to_first_page: "Aller à la première page", go_to_previous_page: "Aller à la page précédente", go_to_next_page: "Aller à la page suivante", - go_to_last_page: "Aller à la dernière page", + go_to_last_page: "Aller à la dernière page" }, comments: { title: "Commentaires", - description: - "Ajoutez un commentaire en utilisant le formulaire ci-dessous.", + description: "Ajoutez un commentaire en utilisant le formulaire ci-dessous.", add: "Nouveau commentaire", - new: "Nouveau commentaire", + "new": "Nouveau commentaire", save: "Enregistrer le commentaire", success: "Commentaire ajouté avec succès", error: "Échec de l'ajout du commentaire", placeholder: "Écrivez votre commentaire ici...", empty: { title: "Aucun commentaire pour le moment", - description: "Soyez le premier à ajouter un commentaire", - }, + description: "Soyez le premier à ajouter un commentaire" + } }, attachments: { title: "Pièces jointes", - description: - "Ajoutez un fichier en cliquant sur 'Ajouter une pièce jointe'.", - upload: "Télécharger une pièce jointe", - upload_description: - "Téléchargez une pièce jointe ou ajoutez un lien vers une ressource externe.", + description: "Ajoutez un fichier en cliquant sur 'Ajouter une pièce jointe'.", + upload: "Télécharger la pièce jointe", + upload_description: "Téléchargez une pièce jointe ou ajoutez un lien vers une ressource externe.", drop: "Déposez les fichiers ici", - drop_description: - "Déposez des fichiers ici ou cliquez pour choisir des fichiers sur votre appareil.", - drop_files_description: "Les fichiers peuvent aller jusqu'à ", + drop_description: "Déposez des fichiers ici ou cliquez pour choisir des fichiers depuis votre appareil.", + drop_files_description: "Les fichiers peuvent faire jusqu'à ", empty: { title: "Aucune pièce jointe", - description: - "Ajoutez un fichier en cliquant sur 'Ajouter une pièce jointe'.", + description: "Ajoutez un fichier en cliquant sur 'Ajouter une pièce jointe'." }, toasts: { - error: "Une erreur s'est produite, veuillez réessayer.", - error_uploading_files: - "Impossible de télécharger plus d'un fichier à la fois", - error_uploading_files_multiple: - "Impossible de télécharger plus de 10 fichiers", + error: "Quelque chose a mal tourné, veuillez réessayer.", + error_uploading_files: "Impossible de télécharger plus d'un fichier à la fois", + error_uploading_files_multiple: "Impossible de télécharger plus de 10 fichiers", error_no_files_selected: "Aucun fichier sélectionné", error_file_rejected: "Le fichier {file} a été rejeté", error_failed_to_upload_files: "Échec du téléchargement des fichiers", - error_failed_to_upload_files_multiple: - "Échec du téléchargement des fichiers", - error_failed_to_upload_files_single: - "Échec du téléchargement du fichier", + error_failed_to_upload_files_multiple: "Échec du téléchargement des fichiers", + error_failed_to_upload_files_single: "Échec du téléchargement du fichier", success_uploading_files: "Fichiers téléchargés avec succès", success_uploading_files_multiple: "Fichiers téléchargés avec succès", success_uploading_files_single: "Fichier téléchargé avec succès", success_uploading_files_target: "Fichiers téléchargés", uploading_files: "Téléchargement de {target}...", - remove_file: "Supprimer le fichier", - }, + remove_file: "Supprimer le fichier" + } }, notifications: { inbox: "Boîte de réception", archive: "Archive", archive_all: "Archiver tout", - no_notifications: "Aucune nouvelle notification", + no_notifications: "Aucune nouvelle notification" }, edit: "Modifier", errors: { - unexpected_error: "Une erreur inattendue est survenue", + unexpected_error: "Une erreur inattendue est survenue" }, description: "Description", last_updated: "Dernière mise à jour", @@ -166,65 +156,61 @@ export default { weekly: "Hebdomadaire", monthly: "Mensuel", quarterly: "Trimestriel", - yearly: "Annuel", - }, + yearly: "Annuel" + } }, header: { discord: { - button: "Rejoignez-nous sur Discord", + button: "Rejoignez-nous sur Discord" }, feedback: { button: "Retour d'information", title: "Merci pour vos retours !", description: "Nous reviendrons vers vous dès que possible", - placeholder: - "Idées pour améliorer cette page ou problèmes que vous rencontrez.", + placeholder: "Idées pour améliorer cette page ou problèmes que vous rencontrez.", success: "Merci pour vos retours !", - error: "Erreur lors de l'envoi du retour - réessayer ?", - send: "Envoyer un retour", - }, + error: "Erreur lors de l'envoi des retours - réessayer ?", + send: "Envoyer des retours" + } }, not_found: { title: "404 - Page non trouvée", description: "La page que vous recherchez n'existe pas.", - return: "Retour au tableau de bord", + "return": "Retour au tableau de bord" }, theme: { options: { light: "Clair", dark: "Sombre", - system: "Système", - }, + system: "Système" + } }, sidebar: { overview: "Aperçu", policies: "Politiques", - risk: "Gestion des Risques", + risk: "Gestion des risques", vendors: "Fournisseurs", integrations: "Intégrations", settings: "Paramètres", evidence: "Tâches de preuve", - people: "Personnes", + people: "Personnes" }, auth: { title: "Automatisez la conformité SOC 2, ISO 27001 et RGPD avec l'IA.", - description: - "Créez un compte gratuit ou connectez-vous avec un compte existant pour continuer.", + description: "Créez un compte gratuit ou connectez-vous avec un compte existant pour continuer.", options: "Plus d'options", google: "Continuer avec Google", email: { description: "Entrez votre adresse e-mail pour continuer.", - placeholder: "Entrez l'adresse e-mail", + placeholder: "Entrer l'adresse e-mail", button: "Continuer avec l'e-mail", magic_link_sent: "Lien magique envoyé", - magic_link_description: - "Vérifiez votre boîte de réception pour un lien magique.", + magic_link_description: "Vérifiez votre boîte de réception pour un lien magique.", magic_link_try_again: "Réessayer.", success: "E-mail envoyé - vérifiez votre boîte de réception !", - error: "Erreur lors de l'envoi de l'e-mail - réessayer ?", + error: "Erreur lors de l'envoi de l'e-mail - réessayer ?" }, - terms: - "En cliquant sur continuer, vous reconnaissez avoir lu et accepté les Conditions d'utilisation et la Politique de confidentialité.", + terms: "En cliquant sur continuer, vous reconnaissez avoir lu et accepté les Conditions d'utilisation et la Politique de confidentialité." }, onboarding: { title: "Créer une organisation", @@ -233,71 +219,71 @@ export default { fields: { name: { label: "Nom de l'organisation", - placeholder: "Le nom de votre organisation", + placeholder: "Le nom de votre organisation" }, website: { - label: "Site Web", - placeholder: "Le site Web de votre organisation", + label: "Site web", + placeholder: "Le site web de votre organisation" }, subdomain: { label: "Sous-domaine", - placeholder: "exemple", + placeholder: "exemple" }, fullName: { - label: "Votre Nom", - placeholder: "Votre nom complet", - }, + label: "Votre nom", + placeholder: "Votre nom complet" + } }, success: "Merci, vous êtes prêt !", - error: "Une erreur s'est produite, veuillez réessayer.", + error: "Quelque chose s'est mal passé, veuillez réessayer.", unavailable: "Indisponible", check_availability: "Vérification de la disponibilité", - available: "Disponible", + available: "Disponible" }, overview: { title: "Aperçu", framework_chart: { - title: "Progrès du cadre", + title: "Progrès du cadre" }, requirement_chart: { - title: "État de conformité", - }, + title: "Statut de conformité" + } }, policies: { dashboard: { title: "Tableau de bord", all: "Toutes les politiques", - policy_status: "Politique par Statut", + policy_status: "Politique par statut", policies_by_assignee: "Politiques par responsable", policies_by_framework: "Politiques par cadre", sub_pages: { overview: "Aperçu", - edit_policy: "Modifier la politique", - }, + edit_policy: "Modifier la politique" + } }, table: { name: "Nom de la politique", statuses: { draft: "Brouillon", published: "Publié", - archived: "Archivé", + archived: "Archivé" }, filters: { owner: { label: "Responsable", - placeholder: "Filtrer par responsable", - }, - }, + placeholder: "Filtrer par responsable" + } + } }, filters: { search: "Rechercher des politiques...", - all: "Toutes les politiques", + all: "Toutes les politiques" }, status: { draft: "Brouillon", published: "Publié", - needs_review: "Nécessite une révision", - archived: "Archivé", + needs_review: "Besoin de révision", + archived: "Archivé" }, policies: "politiques", title: "Politiques", @@ -310,29 +296,28 @@ export default { create_first: "Créer la première politique", no_description: "Aucune description fournie", last_updated: "Dernière mise à jour : {{date}}", - save: "Sauvegarder", - saving: "Sauvegarde en cours...", - saved_success: "Politique sauvegardée avec succès", - saved_error: "Échec de la sauvegarde de la politique", + save: "Enregistrer", + saving: "Enregistrement...", + saved_success: "Politique enregistrée avec succès", + saved_error: "Échec de l'enregistrement de la politique", overview: { - title: "Aperçu de la Politique", + title: "Aperçu de la politique", form: { - update_policy: "Mettre à jour la Politique", - update_policy_description: - "Mettez à jour le titre ou la description de la politique.", + update_policy: "Mettre à jour la politique", + update_policy_description: "Mettez à jour le titre ou la description de la politique.", update_policy_success: "Politique mise à jour avec succès", update_policy_error: "Échec de la mise à jour de la politique", - update_policy_title: "Nom de la Politique", - review_frequency: "Fréquence de Révision", + update_policy_title: "Nom de la politique", + review_frequency: "Fréquence de révision", review_frequency_placeholder: "Sélectionnez une fréquence de révision", - review_date: "Date de Révision", - review_date_placeholder: "Sélectionnez une date de révision", - }, - }, + review_date: "Date de révision", + review_date_placeholder: "Sélectionnez une date de révision" + } + } }, evidence_tasks: { evidence_tasks: "Tâches de preuve", - overview: "Aperçu", + overview: "Aperçu" }, risk: { risks: "risques", @@ -343,13 +328,11 @@ export default { dashboard: { title: "Tableau de bord des fournisseurs", overview: "Aperçu des fournisseurs", - vendor_status: "État du fournisseur", + vendor_status: "Statut du fournisseur", vendor_category: "Catégories de fournisseurs", vendors_by_assignee: "Fournisseurs par responsable", - inherent_risk_description: - "Niveau de risque initial avant l'application de tout contrôle", - residual_risk_description: - "Niveau de risque restant après l'application des contrôles", + inherent_risk_description: "Niveau de risque initial avant l'application de tout contrôle", + residual_risk_description: "Niveau de risque restant après l'application des contrôles" }, register: { title: "Registre des fournisseurs", @@ -357,67 +340,65 @@ export default { name: "Nom", category: "Catégorie", status: "Statut", - owner: "Propriétaire", - }, + owner: "Propriétaire" + } }, assessment: { title: "Évaluation des fournisseurs", - update_success: - "Évaluation du risque fournisseur mise à jour avec succès", - update_error: - "Échec de la mise à jour de l'évaluation du risque fournisseur", + update_success: "Évaluation du risque fournisseur mise à jour avec succès", + update_error: "Échec de la mise à jour de l'évaluation du risque fournisseur", inherent_risk: "Risque inhérent", - residual_risk: "Risque résiduel", + residual_risk: "Risque résiduel" }, form: { vendor_details: "Détails du fournisseur", vendor_name: "Nom", vendor_name_placeholder: "Entrez le nom du fournisseur", - vendor_website: "Site Web", - vendor_website_placeholder: "Entrez le site Web du fournisseur", + vendor_website: "Site web", + vendor_website_placeholder: "Entrez le site web du fournisseur", vendor_description: "Description", vendor_description_placeholder: "Entrez la description du fournisseur", vendor_category: "Catégorie", - vendor_category_placeholder: "Sélectionnez une catégorie", + vendor_category_placeholder: "Sélectionner une catégorie", vendor_status: "Statut", - vendor_status_placeholder: "Sélectionnez un statut", + vendor_status_placeholder: "Sélectionner un statut", create_vendor_success: "Fournisseur créé avec succès", create_vendor_error: "Échec de la création du fournisseur", update_vendor: "Mettre à jour le fournisseur", update_vendor_success: "Fournisseur mis à jour avec succès", update_vendor_error: "Échec de la mise à jour du fournisseur", - add_comment: "Ajouter un commentaire", + add_comment: "Ajouter un commentaire" }, table: { name: "Nom", category: "Catégorie", status: "Statut", - owner: "Propriétaire", + owner: "Propriétaire" }, filters: { search_placeholder: "Rechercher des fournisseurs...", status_placeholder: "Filtrer par statut", category_placeholder: "Filtrer par catégorie", - owner_placeholder: "Filtrer par propriétaire", + owner_placeholder: "Filtrer par propriétaire" }, empty_states: { no_vendors: { title: "Aucun fournisseur pour le moment", - description: "Commencez par créer votre premier fournisseur", + description: "Commencez par créer votre premier fournisseur" }, no_results: { title: "Aucun résultat trouvé", description: "Aucun fournisseur ne correspond à votre recherche", - description_with_filters: "Essayez d'ajuster vos filtres", - }, + description_with_filters: "Essayez d'ajuster vos filtres" + } }, actions: { - create: "Créer un fournisseur", + create: "Créer un fournisseur" }, status: { not_assessed: "Non évalué", in_progress: "En cours", - assessed: "Évalué", + assessed: "Évalué" }, category: { cloud: "Cloud", @@ -427,62 +408,55 @@ export default { marketing: "Marketing", sales: "Ventes", hr: "Ressources humaines", - other: "Autre", + other: "Autre" }, risk_level: { low: "Risque faible", medium: "Risque moyen", high: "Risque élevé", - unknown: "Risque inconnu", - }, + unknown: "Risque inconnu" + } }, dashboard: { title: "Tableau de bord", overview: "Aperçu des risques", - risk_status: "Statut des risques", + risk_status: "Statut du risque", risks_by_department: "Risques par département", - risks_by_assignee: "Risques par responsable", - inherent_risk_description: - "Le risque inhérent est calculé comme probabilité * impact. Calculé avant l'application de tout contrôle.", - residual_risk_description: - "Le risque résiduel est calculé comme probabilité * impact. C'est le niveau de risque après l'application des contrôles.", - risk_assessment_description: - "Comparer les niveaux de risque inhérent et résiduel", + risks_by_assignee: "Risques par assigné", + inherent_risk_description: "Le risque inhérent est calculé comme probabilité * impact. Calculé avant l'application de tout contrôle.", + residual_risk_description: "Le risque résiduel est calculé comme probabilité * impact. C'est le niveau de risque après l'application des contrôles.", + risk_assessment_description: "Comparer les niveaux de risque inhérent et résiduel" }, register: { title: "Registre des risques", table: { - risk: "Risque", + risk: "Risque" }, empty: { no_risks: { title: "Créez un risque pour commencer", - description: - "Suivez et évaluez les risques, créez et assignez des tâches d'atténuation à votre équipe, et gérez votre registre des risques dans une interface simple.", + description: "Suivez et évaluez les risques, créez et assignez des tâches d'atténuation pour votre équipe, et gérez votre registre des risques dans une interface simple." }, - create_risk: "Créer un risque", - }, + create_risk: "Créer un risque" + } }, metrics: { probability: "Probabilité", impact: "Impact", inherentRisk: "Risque inhérent", - residualRisk: "Risque résiduel", + residualRisk: "Risque résiduel" }, form: { update_inherent_risk: "Enregistrer le risque inhérent", - update_inherent_risk_description: - "Mettez à jour le risque inhérent du risque. C'est le niveau de risque avant l'application de tout contrôle.", + update_inherent_risk_description: "Mettez à jour le risque inhérent du risque. C'est le niveau de risque avant l'application de tout contrôle.", update_inherent_risk_success: "Risque inhérent mis à jour avec succès", update_inherent_risk_error: "Échec de la mise à jour du risque inhérent", update_residual_risk: "Enregistrer le risque résiduel", - update_residual_risk_description: - "Mettez à jour le risque résiduel du risque. C'est le niveau de risque après l'application des contrôles.", + update_residual_risk_description: "Mettez à jour le risque résiduel du risque. C'est le niveau de risque après l'application des contrôles.", update_residual_risk_success: "Risque résiduel mis à jour avec succès", update_residual_risk_error: "Échec de la mise à jour du risque résiduel", update_risk: "Mettre à jour le risque", - update_risk_description: - "Mettez à jour le titre ou la description du risque.", + update_risk_description: "Mettez à jour le titre ou la description du risque.", update_risk_success: "Risque mis à jour avec succès", update_risk_error: "Échec de la mise à jour du risque", create_risk_success: "Risque créé avec succès", @@ -497,7 +471,7 @@ export default { risk_department: "Département", risk_department_placeholder: "Sélectionnez un département", risk_status: "Statut du risque", - risk_status_placeholder: "Sélectionnez un statut de risque", + risk_status_placeholder: "Sélectionnez un statut de risque" }, tasks: { title: "Tâches", @@ -514,40 +488,33 @@ export default { due_date: "Date d'échéance", due_date_description: "Sélectionnez la date d'échéance pour la tâche", success: "Tâche créée avec succès", - error: "Échec de la création de la tâche", + error: "Échec de la création de la tâche" }, sheet: { title: "Créer une tâche", update: "Mettre à jour la tâche", - update_description: - "Mettez à jour le titre ou la description de la tâche.", + update_description: "Mettez à jour le titre ou la description de la tâche." }, empty: { - description_create: - "Créez une tâche d'atténuation pour ce risque, ajoutez un plan de traitement et assignez-le à un membre de l'équipe.", - }, - }, + description_create: "Créez une tâche d'atténuation pour ce risque, ajoutez un plan de traitement et assignez-le à un membre de l'équipe." + } + } }, settings: { general: { title: "Général", org_name: "Nom de l'organisation", - org_name_description: - "Ceci est le nom visible de votre organisation. Vous devez utiliser le nom légal de votre organisation.", + org_name_description: "C'est le nom visible de votre organisation. Vous devez utiliser le nom légal de votre organisation.", org_name_tip: "Veuillez utiliser un maximum de 32 caractères.", org_website: "Site Web de l'organisation", - org_website_description: - "Ceci est l'URL du site Web officiel de votre organisation. Assurez-vous d'inclure l'URL complète avec https://.", + org_website_description: "C'est l'URL du site Web officiel de votre organisation. Assurez-vous d'inclure l'URL complète avec https://.", org_website_tip: "Veuillez entrer une URL valide incluant https://", - org_website_error: - "Erreur lors de la mise à jour du site Web de l'organisation", + org_website_error: "Erreur lors de la mise à jour du site Web de l'organisation", org_website_updated: "Site Web de l'organisation mis à jour", org_delete: "Supprimer l'organisation", - org_delete_description: - "Supprimez définitivement votre organisation et tout son contenu de la plateforme Comp AI. Cette action n'est pas réversible - veuillez continuer avec prudence.", + org_delete_description: "Supprimez définitivement votre organisation et tout son contenu de la plateforme Comp AI. Cette action n'est pas réversible - veuillez continuer avec prudence.", org_delete_alert_title: "Êtes-vous absolument sûr ?", - org_delete_alert_description: - "Cette action ne peut pas être annulée. Cela supprimera définitivement votre organisation et retirera vos données de nos serveurs.", + org_delete_alert_description: "Cette action ne peut pas être annulée. Cela supprimera définitivement votre organisation et retirera vos données de nos serveurs.", org_delete_error: "Erreur lors de la suppression de l'organisation", org_delete_success: "Organisation supprimée", org_name_updated: "Nom de l'organisation mis à jour", @@ -556,75 +523,70 @@ export default { delete_button: "Supprimer", delete_confirm: "SUPPRIMER", delete_confirm_tip: "Tapez SUPPRIMER pour confirmer.", - cancel_button: "Annuler", + cancel_button: "Annuler" }, members: { - title: "Membres", + title: "Membres" }, billing: { - title: "Facturation", - }, + title: "Facturation" + } }, user_menu: { theme: "Thème", language: "Langue", sign_out: "Se déconnecter", account: "Compte", - support: "Support", + support: "Assistance", settings: "Paramètres", - teams: "Équipes", + teams: "Équipes" }, frameworks: { title: "Cadres", controls: { title: "Contrôles", - description: "Examinez et gérez les contrôles de conformité", + description: "Examiner et gérer les contrôles de conformité", table: { status: "Statut", control: "Contrôle", artifacts: "Artifacts", - actions: "Actions", + actions: "Actions" }, statuses: { not_started: "Non commencé", - compliant: "Conforme", - non_compliant: "Non conforme", completed: "Terminé", - in_progress: "En cours", - }, + in_progress: "En cours" + } }, overview: { error: "Échec du chargement des cadres", loading: "Chargement des cadres...", empty: { title: "Aucun cadre sélectionné", - description: - "Sélectionnez des cadres pour commencer votre parcours de conformité", + description: "Sélectionnez des cadres pour commencer votre parcours de conformité" }, progress: { title: "Progression du cadre", empty: { - title: "Aucun cadre pour le moment", - description: - "Commencez par ajouter un cadre de conformité pour suivre vos progrès", - action: "Ajouter un cadre", - }, + title: "Pas encore de cadres", + description: "Commencez par ajouter un cadre de conformité pour suivre vos progrès", + action: "Ajouter un cadre" + } }, grid: { welcome: { title: "Bienvenue dans Comp AI", - description: - "Commencez par sélectionner les cadres de conformité que vous souhaitez mettre en œuvre. Nous vous aiderons à gérer et à suivre votre parcours de conformité à travers plusieurs normes.", - action: "Commencer", + description: "Commencez par sélectionner les cadres de conformité que vous souhaitez mettre en œuvre. Nous vous aiderons à gérer et à suivre votre parcours de conformité à travers plusieurs normes.", + action: "Commencer" }, title: "Sélectionner des cadres", version: "Version", actions: { clear: "Effacer", - confirm: "Confirmer la sélection", - }, - }, - }, + confirm: "Confirmer la sélection" + } + } + } }, vendor: { title: "Tableau de bord", @@ -632,13 +594,11 @@ export default { dashboard: { title: "Tableau de bord", overview: "Aperçu des fournisseurs", - vendor_status: "Statut des fournisseurs", + vendor_status: "Statut du fournisseur", vendor_category: "Catégories de fournisseurs", vendors_by_assignee: "Fournisseurs par responsable", - inherent_risk_description: - "Niveau de risque initial avant l'application de tout contrôle", - residual_risk_description: - "Niveau de risque restant après l'application des contrôles", + inherent_risk_description: "Niveau de risque initial avant l'application de tout contrôle", + residual_risk_description: "Niveau de risque restant après l'application des contrôles" }, register: { title: "Registre des fournisseurs", @@ -646,8 +606,8 @@ export default { name: "Nom", category: "Catégorie", status: "Statut", - owner: "Propriétaire", - }, + owner: "Propriétaire" + } }, category: { cloud: "Cloud", @@ -656,22 +616,22 @@ export default { finance: "Finance", marketing: "Marketing", sales: "Ventes", - hr: "RH", - other: "Autre", + hr: "Ressources humaines", + other: "Autre" }, vendors: "fournisseurs", form: { vendor_details: "Détails du fournisseur", vendor_name: "Nom", vendor_name_placeholder: "Entrez le nom du fournisseur", - vendor_website: "Site Web", - vendor_website_placeholder: "Entrez le site Web du fournisseur", + vendor_website: "Site web", + vendor_website_placeholder: "Entrez le site web du fournisseur", vendor_description: "Description", vendor_description_placeholder: "Entrez la description du fournisseur", vendor_category: "Catégorie", - vendor_category_placeholder: "Sélectionnez une catégorie", + vendor_category_placeholder: "Sélectionner une catégorie", vendor_status: "Statut", - vendor_status_placeholder: "Sélectionnez un statut", + vendor_status_placeholder: "Sélectionner un statut", create_vendor_success: "Fournisseur créé avec succès", create_vendor_error: "Échec de la création du fournisseur", update_vendor_success: "Fournisseur mis à jour avec succès", @@ -682,110 +642,110 @@ export default { contact_role: "Rôle du contact", add_contact: "Ajouter un contact", new_contact: "Nouveau contact", - min_one_contact_required: "Un fournisseur doit avoir au moins un contact", + min_one_contact_required: "Un fournisseur doit avoir au moins un contact" }, empty_states: { no_vendors: { - title: "Aucun fournisseur pour le moment", - description: "Commencez par créer votre premier fournisseur", + title: "Pas encore de fournisseurs", + description: "Commencez par créer votre premier fournisseur" }, no_results: { title: "Aucun résultat trouvé", description: "Aucun fournisseur ne correspond à votre recherche", - description_with_filters: "Essayez d'ajuster vos filtres", - }, - }, + description_with_filters: "Essayez d'ajuster vos filtres" + } + } }, people: { title: "Personnes", details: { - taskProgress: "Progression des tâches", + taskProgress: "Progression de la tâche", tasks: "Tâches", - noTasks: "Aucune tâche assignée pour le moment", + noTasks: "Aucune tâche assignée pour le moment" }, description: "Gérez vos membres d'équipe et leurs rôles.", filters: { search: "Rechercher des personnes...", - role: "Filtrer par rôle", + role: "Filtrer par rôle" }, actions: { invite: "Ajouter un employé", - clear: "Effacer les filtres", + clear: "Effacer les filtres" }, table: { name: "Nom", email: "Email", department: "Département", - externalId: "ID externe", + externalId: "ID externe" }, empty: { no_employees: { title: "Aucun employé pour le moment", - description: "Commencez par inviter votre premier membre d'équipe.", + description: "Commencez par inviter votre premier membre d'équipe." }, no_results: { title: "Aucun résultat trouvé", description: "Aucun employé ne correspond à votre recherche", - description_with_filters: "Essayez d'ajuster vos filtres", - }, + description_with_filters: "Essayez d'ajuster vos filtres" + } }, invite: { title: "Ajouter un employé", description: "Ajoutez un employé à votre organisation.", email: { label: "Adresse e-mail", - placeholder: "Entrez l'adresse e-mail", + placeholder: "Entrez l'adresse e-mail" }, role: { label: "Rôle", - placeholder: "Sélectionnez un rôle", + placeholder: "Sélectionnez un rôle" }, name: { label: "Nom", - placeholder: "Entrez le nom", + placeholder: "Entrez le nom" }, department: { label: "Département", - placeholder: "Sélectionnez un département", + placeholder: "Sélectionnez un département" }, submit: "Ajouter un employé", success: "Employé ajouté avec succès", - error: "Échec de l'ajout de l'employé", - }, + error: "Échec de l'ajout de l'employé" + } }, errors: { - unexpected: "Une erreur s'est produite, veuillez réessayer", + unexpected: "Quelque chose s'est mal passé, veuillez réessayer" }, sub_pages: { risk: { - overview: "Gestion des Risques", - register: "Registre des Risques", - risk_overview: "Aperçu des Risques", - risk_comments: "Commentaires sur les Risques", + overview: "Gestion des risques", + register: "Registre des risques", + risk_overview: "Aperçu des risques", + risk_comments: "Commentaires sur les risques", tasks: { - task_overview: "Aperçu des Tâches", - }, + task_overview: "Aperçu des tâches" + } }, policies: { - all: "Toutes les Politiques", - editor: "Éditeur de Politique", - policy_details: "Détails de la politique", + all: "Toutes les politiques", + editor: "Éditeur de politique", + policy_details: "Détails de la politique" }, people: { all: "Personnes", - employee_details: "Détails de l'Employé", + employee_details: "Détails de l'employé" }, settings: { - members: "Membres de l'Équipe", + members: "Membres de l'équipe" }, frameworks: { - overview: "Cadres", + overview: "Cadres" }, evidence: { title: "Preuve", list: "Liste des preuves", - overview: "Aperçu des preuves", - }, + overview: "Aperçu des preuves" + } }, editor: { ai: { @@ -793,25 +753,51 @@ export default { thinking_spinner: "L'IA réfléchit", edit_or_generate: "Modifier ou générer...", tell_ai_what_to_do_next: "Dites à l'IA quoi faire ensuite", - request_limit_reached: - "Vous avez atteint votre limite de demandes pour la journée.", + request_limit_reached: "Vous avez atteint votre limite de demandes pour la journée." }, ai_selector: { improve: "Améliorer l'écriture", fix: "Corriger la grammaire", - shorter: "Rendre plus court", - longer: "Rendre plus long", - continue: "Continuer à écrire", + shorter: "Raccourcir", + longer: "Allonger", + "continue": "Continuer l'écriture", replace: "Remplacer la sélection", insert: "Insérer ci-dessous", - discard: "Jeter", - }, + discard: "Jeter" + } }, evidence: { - title: "Tâches de preuve", - description: - "Gérez et suivez les tâches de preuve pour vos exigences de conformité.", - dashboard: "Tableau de bord", + title: "Preuve", list: "Toutes les preuves", - }, + overview: "Aperçu des preuves", + edit: "Modifier la preuve", + dashboard: { + layout: "Tableau de bord", + layout_back_button: "Retour", + title: "Tableau de bord des preuves", + by_department: "Par département", + by_assignee: "Par responsable", + by_framework: "Par cadre" + }, + items: "articles", + status: { + up_to_date: "À jour", + needs_review: "Nécessite une révision", + draft: "Brouillon", + empty: "Vide" + }, + departments: { + none: "Non classé", + admin: "Administration", + gov: "Gouvernance", + hr: "Ressources humaines", + it: "Technologies de l'information", + itsm: "Gestion des services informatiques", + qms: "Gestion de la qualité" + }, + details: { + review_section: "Informations de révision", + content: "Contenu de la preuve" + } + } } as const; diff --git a/apps/app/src/locales/no.ts b/apps/app/src/locales/no.ts index 2bbb791d8d..6cd8d175b9 100644 --- a/apps/app/src/locales/no.ts +++ b/apps/app/src/locales/no.ts @@ -4,36 +4,36 @@ export default { fr: "Fransk", no: "Norsk", pt: "Portugisisk", - en: "Engelsk", + en: "Engelsk" }, language: { title: "Språk", description: "Endre språket som brukes i brukergrensesnittet.", - placeholder: "Velg språk", + placeholder: "Velg språk" }, common: { actions: { save: "Lagre", edit: "Rediger", - delete: "Slett", + "delete": "Slett", cancel: "Avbryt", clear: "Tøm", create: "Opprett", send: "Send", - return: "Tilbake", + "return": "Tilbake", success: "Suksess", error: "Feil", next: "Neste", - complete: "Fullfør", - addNew: "Legg til ny", + complete: "Fullført", + addNew: "Legg til ny" }, assignee: { label: "Tildelt", - placeholder: "Velg tildelt", + placeholder: "Velg tildelt" }, date: { pick: "Velg en dato", - due_date: "Forfallsdato", + due_date: "Forfallsdato" }, status: { open: "Åpen", @@ -45,13 +45,13 @@ export default { not_started: "Ikke startet", in_progress: "Pågår", published: "Publisert", - needs_review: "Trenger vurdering", + needs_review: "Trenger gjennomgang", draft: "Utkast", not_assessed: "Ikke vurdert", assessed: "Vurdert", active: "Aktiv", inactive: "Inaktiv", - title: "Status", + title: "Status" }, filters: { clear: "Tøm filtre", @@ -60,16 +60,16 @@ export default { department: "Avdeling", owner: { label: "Tildelt", - placeholder: "Filtrer etter tildelt", - }, + placeholder: "Filtrer etter tildelt" + } }, table: { title: "Tittel", status: "Status", - assigned_to: "Tildelt Til", + assigned_to: "Tildelt til", due_date: "Forfallsdato", last_updated: "Sist oppdatert", - no_results: "Ingen resultater funnet", + no_results: "Ingen resultater funnet" }, empty_states: { no_results: { @@ -79,12 +79,12 @@ export default { description: "Prøv et annet søk, eller juster filtrene", description_filters: "Prøv et annet søk, eller juster filtrene", description_no_tasks: "Opprett en oppgave for å komme i gang", - description_no_risks: "Opprett en risiko for å komme i gang", + description_no_risks: "Opprett en risiko for å komme i gang" }, no_items: { title: "Ingen elementer funnet", - description: "Prøv å justere søket eller filtrene", - }, + description: "Prøv å justere søket ditt eller filtrene" + } }, pagination: { of: "av", @@ -94,35 +94,33 @@ export default { go_to_first_page: "Gå til første side", go_to_previous_page: "Gå til forrige side", go_to_next_page: "Gå til neste side", - go_to_last_page: "Gå til siste side", + go_to_last_page: "Gå til siste side" }, comments: { title: "Kommentarer", description: "Legg til en kommentar ved å bruke skjemaet nedenfor.", add: "Ny kommentar", - new: "Ny kommentar", + "new": "Ny kommentar", save: "Lagre kommentar", - success: "Kommentar lagt til", + success: "Kommentar lagt til med suksess", error: "Kunne ikke legge til kommentar", - placeholder: "Skriv din kommentar her...", + placeholder: "Skriv kommentaren din her...", empty: { title: "Ingen kommentarer ennå", - description: "Vær den første til å legge til en kommentar", - }, + description: "Vær den første til å legge til en kommentar" + } }, attachments: { title: "Vedlegg", description: "Legg til en fil ved å klikke på 'Legg til vedlegg'.", upload: "Last opp vedlegg", - upload_description: - "Last opp et vedlegg eller legg til en lenke til en ekstern ressurs.", + upload_description: "Last opp et vedlegg eller legg til en lenke til en ekstern ressurs.", drop: "Slipp filene her", - drop_description: - "Slipp filer her eller klikk for å velge filer fra enheten din.", + drop_description: "Slipp filer her eller klikk for å velge filer fra enheten din.", drop_files_description: "Filer kan være opptil ", empty: { title: "Ingen vedlegg", - description: "Legg til en fil ved å klikke på 'Legg til vedlegg'.", + description: "Legg til en fil ved å klikke på 'Legg til vedlegg'." }, toasts: { error: "Noe gikk galt, vennligst prøv igjen.", @@ -130,26 +128,26 @@ export default { error_uploading_files_multiple: "Kan ikke laste opp mer enn 10 filer", error_no_files_selected: "Ingen filer valgt", error_file_rejected: "Fil {file} ble avvist", - error_failed_to_upload_files: "Kunne ikke laste opp filer", - error_failed_to_upload_files_multiple: "Kunne ikke laste opp filer", - error_failed_to_upload_files_single: "Kunne ikke laste opp fil", - success_uploading_files: "Filer lastet opp", - success_uploading_files_multiple: "Filer lastet opp", - success_uploading_files_single: "Fil lastet opp", + error_failed_to_upload_files: "Feil ved opplasting av filer", + error_failed_to_upload_files_multiple: "Feil ved opplasting av filer", + error_failed_to_upload_files_single: "Feil ved opplasting av fil", + success_uploading_files: "Filer lastet opp med suksess", + success_uploading_files_multiple: "Filer lastet opp med suksess", + success_uploading_files_single: "Fil lastet opp med suksess", success_uploading_files_target: "Filer lastet opp", uploading_files: "Laster opp {target}...", - remove_file: "Fjern fil", - }, + remove_file: "Fjern fil" + } }, notifications: { inbox: "Innboks", archive: "Arkiv", archive_all: "Arkiver alt", - no_notifications: "Ingen nye varsler", + no_notifications: "Ingen nye varsler" }, edit: "Rediger", errors: { - unexpected_error: "En uventet feil oppstod", + unexpected_error: "En uventet feil oppstod" }, description: "Beskrivelse", last_updated: "Sist oppdatert", @@ -158,35 +156,34 @@ export default { weekly: "Ukentlig", monthly: "Månedlig", quarterly: "Kvartalsvis", - yearly: "Årlig", - }, + yearly: "Årlig" + } }, header: { discord: { - button: "Bli med oss på Discord", + button: "Bli med oss på Discord" }, feedback: { button: "Tilbakemelding", title: "Takk for tilbakemeldingen!", - description: "Vi kommer tilbake til deg så snart som mulig", - placeholder: - "Ideer for å forbedre denne siden eller problemer du opplever.", + description: "Vi vil komme tilbake til deg så snart som mulig", + placeholder: "Ideer for å forbedre denne siden eller problemer du opplever.", success: "Takk for tilbakemeldingen!", error: "Feil ved sending av tilbakemelding - prøv igjen?", - send: "Send tilbakemelding", - }, + send: "Send tilbakemelding" + } }, not_found: { title: "404 - Siden ble ikke funnet", description: "Siden du leter etter eksisterer ikke.", - return: "Gå tilbake til dashbordet", + "return": "Gå tilbake til dashbordet" }, theme: { options: { light: "Lys", dark: "Mørk", - system: "System", - }, + system: "System" + } }, sidebar: { overview: "Oversikt", @@ -196,12 +193,11 @@ export default { integrations: "Integrasjoner", settings: "Innstillinger", evidence: "Bevisoppgaver", - people: "Personer", + people: "Personer" }, auth: { title: "Automatiser SOC 2, ISO 27001 og GDPR-overholdelse med AI.", - description: - "Opprett en gratis konto eller logg inn med en eksisterende konto for å fortsette.", + description: "Opprett en gratis konto eller logg inn med en eksisterende konto for å fortsette.", options: "Flere alternativer", google: "Fortsett med Google", email: { @@ -212,10 +208,9 @@ export default { magic_link_description: "Sjekk innboksen din for en magisk lenke.", magic_link_try_again: "Prøv igjen.", success: "E-post sendt - sjekk innboksen din!", - error: "Feil ved sending av e-post - prøv igjen?", + error: "Feil ved sending av e-post - prøv igjen?" }, - terms: - "Ved å klikke på fortsett, bekrefter du at du har lest og godtar vilkårene for bruk og personvernerklæringen.", + terms: "Ved å klikke på fortsett, bekrefter du at du har lest og godtar vilkårene for tjenesten og personvernerklæringen." }, onboarding: { title: "Opprett en organisasjon", @@ -224,112 +219,110 @@ export default { fields: { name: { label: "Organisasjonsnavn", - placeholder: "Ditt organisasjonsnavn", + placeholder: "Ditt organisasjonsnavn" }, website: { label: "Nettsted", - placeholder: "Ditt organisasjonsnettsted", + placeholder: "Ditt organisasjonsnettsted" }, subdomain: { label: "Underdomene", - placeholder: "eksempel", + placeholder: "eksempel" }, fullName: { label: "Ditt navn", - placeholder: "Ditt fulle navn", - }, + placeholder: "Ditt fulle navn" + } }, success: "Takk, du er klar!", error: "Noe gikk galt, vennligst prøv igjen.", unavailable: "Ikke tilgjengelig", check_availability: "Sjekker tilgjengelighet", - available: "Tilgjengelig", + available: "Tilgjengelig" }, overview: { title: "Oversikt", framework_chart: { - title: "Rammeverk Fremdrift", + title: "Fremdrift i rammeverket" }, requirement_chart: { - title: "Overholdelsesstatus", - }, + title: "Overholdelsesstatus" + } }, policies: { dashboard: { title: "Dashbord", all: "Alle retningslinjer", - policy_status: "Policy etter status", + policy_status: "Retningslinje etter status", policies_by_assignee: "Retningslinjer etter tildelt", policies_by_framework: "Retningslinjer etter rammeverk", sub_pages: { overview: "Oversikt", - edit_policy: "Rediger policy", - }, + edit_policy: "Rediger retningslinje" + } }, table: { - name: "Retningslinjenavn", + name: "Policy Navn", statuses: { draft: "Utkast", published: "Publisert", - archived: "Arkivert", + archived: "Arkivert" }, filters: { owner: { label: "Tildelt", - placeholder: "Filtrer etter tildelt", - }, - }, + placeholder: "Filtrer etter tildelt" + } + } }, filters: { - search: "Søk etter retningslinjer...", - all: "Alle retningslinjer", + search: "Søk etter policyer...", + all: "Alle Policyer" }, status: { draft: "Utkast", published: "Publisert", - needs_review: "Trenger gjennomgang", - archived: "Arkivert", + needs_review: "Trenger Gjennomgang", + archived: "Arkivert" }, - policies: "retningslinjer", - title: "Retningslinjer", - create_new: "Opprett ny retningslinje", - search_placeholder: "Søk etter retningslinjer...", + policies: "policyer", + title: "Policyer", + create_new: "Opprett Ny Policy", + search_placeholder: "Søk etter policyer...", status_filter: "Filtrer etter status", all_statuses: "Alle statuser", - no_policies_title: "Ingen retningslinjer ennå", - no_policies_description: - "Kom i gang med å opprette din første retningslinje", - create_first: "Opprett første retningslinje", + no_policies_title: "Ingen policyer ennå", + no_policies_description: "Kom i gang med å opprette din første policy", + create_first: "Opprett første policy", no_description: "Ingen beskrivelse gitt", last_updated: "Sist oppdatert: {{date}}", save: "Lagre", saving: "Lagrer...", - saved_success: "Retningslinje lagret", - saved_error: "Kunne ikke lagre retningslinje", + saved_success: "Policy lagret vellykket", + saved_error: "Feil ved lagring av policy", overview: { - title: "Oversikt over policy", + title: "Retningslinjeoversikt", form: { - update_policy: "Oppdater policy", - update_policy_description: - "Oppdater policyens tittel eller beskrivelse.", - update_policy_success: "Policy oppdatert vellykket", - update_policy_error: "Feil ved oppdatering av policy", - update_policy_title: "Policy navn", + update_policy: "Oppdater retningslinje", + update_policy_description: "Oppdater retningslinjetittelen eller beskrivelsen.", + update_policy_success: "Retningslinje oppdatert med suksess", + update_policy_error: "Feil ved oppdatering av retningslinje", + update_policy_title: "Retningslinjenavn", review_frequency: "Gjennomgangsfrekvens", review_frequency_placeholder: "Velg en gjennomgangsfrekvens", review_date: "Gjennomgangsdato", - review_date_placeholder: "Velg en gjennomgangsdato", - }, - }, + review_date_placeholder: "Velg en gjennomgangsdato" + } + } }, evidence_tasks: { evidence_tasks: "Bevisoppgaver", - overview: "Oversikt", + overview: "Oversikt" }, risk: { risks: "risikoer", overview: "Oversikt", - create: "Opprett ny risiko", + create: "Opprett Ny Risiko", vendor: { title: "Leverandøradministrasjon", dashboard: { @@ -337,11 +330,9 @@ export default { overview: "Leverandøroversikt", vendor_status: "Leverandørstatus", vendor_category: "Leverandørkategorier", - vendors_by_assignee: "Leverandører etter tildelt", - inherent_risk_description: - "Innledende risikonivå før noen kontroller er anvendt", - residual_risk_description: - "Gjenstående risikonivå etter at kontroller er anvendt", + vendors_by_assignee: "Leverandører etter Tildelt", + inherent_risk_description: "Innledende risikonivå før noen kontroller er anvendt", + residual_risk_description: "Gjenstående risikonivå etter at kontroller er anvendt" }, register: { title: "Leverandørregister", @@ -349,22 +340,22 @@ export default { name: "Navn", category: "Kategori", status: "Status", - owner: "Eier", - }, + owner: "Eier" + } }, assessment: { title: "Leverandørvurdering", - update_success: "Leverandørvurdering oppdatert vellykket", - update_error: "Feil ved oppdatering av leverandørvurdering", - inherent_risk: "Inherent risiko", - residual_risk: "Gjenstående risiko", + update_success: "Leverandørens risikovurdering oppdatert vellykket", + update_error: "Feil ved oppdatering av leverandørens risikovurdering", + inherent_risk: "Inherent Risiko", + residual_risk: "Residual Risiko" }, form: { vendor_details: "Leverandørdetaljer", vendor_name: "Navn", vendor_name_placeholder: "Skriv inn leverandørnavn", vendor_website: "Nettsted", - vendor_website_placeholder: "Skriv inn leverandørnettsted", + vendor_website_placeholder: "Skriv inn leverandørens nettsted", vendor_description: "Beskrivelse", vendor_description_placeholder: "Skriv inn leverandørbeskrivelse", vendor_category: "Kategori", @@ -374,57 +365,57 @@ export default { create_vendor_success: "Leverandør opprettet vellykket", create_vendor_error: "Feil ved oppretting av leverandør", update_vendor: "Oppdater Leverandør", - update_vendor_success: "Leverandør oppdatert", - update_vendor_error: "Kunne ikke oppdatere leverandør", - add_comment: "Legg til Kommentar", + update_vendor_success: "Leverandør oppdatert vellykket", + update_vendor_error: "Feil ved oppdatering av leverandør", + add_comment: "Legg til Kommentar" }, table: { name: "Navn", category: "Kategori", status: "Status", - owner: "Eier", + owner: "Eier" }, filters: { search_placeholder: "Søk etter leverandører...", status_placeholder: "Filtrer etter status", category_placeholder: "Filtrer etter kategori", - owner_placeholder: "Filtrer etter eier", + owner_placeholder: "Filtrer etter eier" }, empty_states: { no_vendors: { title: "Ingen leverandører ennå", - description: "Kom i gang med å opprette din første leverandør", + description: "Kom i gang med å opprette din første leverandør" }, no_results: { title: "Ingen resultater funnet", - description: "Ingen leverandører matcher søket ditt", - description_with_filters: "Prøv å justere filtrene dine", - }, + description: "Ingen leverandører samsvarer med søket ditt", + description_with_filters: "Prøv å justere filtrene dine" + } }, actions: { - create: "Opprett Leverandør", + create: "Opprett Leverandør" }, status: { not_assessed: "Ikke Vurdert", - in_progress: "Under Behandling", - assessed: "Vurdert", + in_progress: "Pågår", + assessed: "Vurdert" }, category: { cloud: "Sky", infrastructure: "Infrastruktur", software_as_a_service: "Programvare som en Tjeneste", - finance: "Finans", + finance: "Økonomi", marketing: "Markedsføring", sales: "Salg", hr: "HR", - other: "Annet", + other: "Annet" }, risk_level: { low: "Lav Risiko", medium: "Moderat Risiko", high: "Høy Risiko", - unknown: "Ukjent Risiko", - }, + unknown: "Ukjent Risiko" + } }, dashboard: { title: "Dashbord", @@ -432,49 +423,43 @@ export default { risk_status: "Risiko Status", risks_by_department: "Risikoer etter Avdeling", risks_by_assignee: "Risikoer etter Tildelt", - inherent_risk_description: - "Inherent risiko beregnes som sannsynlighet * påvirkning. Beregnet før noen kontroller er anvendt.", - residual_risk_description: - "Residual risiko beregnes som sannsynlighet * påvirkning. Dette er risikonivået etter at kontroller er anvendt.", - risk_assessment_description: - "Sammenlign inherent og residual risikonivåer", + inherent_risk_description: "Inherent risiko beregnes som sannsynlighet * påvirkning. Beregnet før noen kontroller er anvendt.", + residual_risk_description: "Residual risiko beregnes som sannsynlighet * påvirkning. Dette er risikonivået etter at kontroller er anvendt.", + risk_assessment_description: "Sammenlign inherent og residual risikonivåer" }, register: { title: "Risiko Register", table: { - risk: "Risiko", + risk: "Risiko" }, empty: { no_risks: { title: "Opprett en risiko for å komme i gang", - description: - "Følg med på og vurder risikoer, opprett og tildel tiltak for teamet ditt, og administrer risiko registeret ditt i ett enkelt grensesnitt.", + description: "Spor og vurder risikoer, opprett og tildel tiltak for teamet ditt, og administrer risikoregisteret ditt alt i ett enkelt grensesnitt." }, - create_risk: "Opprett en risiko", - }, + create_risk: "Opprett en risiko" + } }, metrics: { probability: "Sannsynlighet", impact: "Påvirkning", inherentRisk: "Inherent Risiko", - residualRisk: "Residual Risiko", + residualRisk: "Residual Risiko" }, form: { update_inherent_risk: "Lagre Inherent Risiko", - update_inherent_risk_description: - "Oppdater den inherent risikoen for risikoen. Dette er risikonivået før noen kontroller er anvendt.", - update_inherent_risk_success: "Inherent risiko oppdatert", + update_inherent_risk_description: "Oppdater den inherente risikoen for risikoen. Dette er risikonivået før noen kontroller er anvendt.", + update_inherent_risk_success: "Inherent risiko oppdatert vellykket", update_inherent_risk_error: "Kunne ikke oppdatere inherent risiko", update_residual_risk: "Lagre Residual Risiko", - update_residual_risk_description: - "Oppdater den residual risikoen for risikoen. Dette er risikonivået etter at kontroller er anvendt.", - update_residual_risk_success: "Residual risiko oppdatert", + update_residual_risk_description: "Oppdater den residuale risikoen for risikoen. Dette er risikonivået etter at kontroller er anvendt.", + update_residual_risk_success: "Residual risiko oppdatert vellykket", update_residual_risk_error: "Kunne ikke oppdatere residual risiko", update_risk: "Oppdater Risiko", update_risk_description: "Oppdater risikotittelen eller beskrivelsen.", - update_risk_success: "Risiko oppdatert", + update_risk_success: "Risiko oppdatert vellykket", update_risk_error: "Kunne ikke oppdatere risiko", - create_risk_success: "Risiko opprettet", + create_risk_success: "Risiko opprettet vellykket", create_risk_error: "Kunne ikke opprette risiko", risk_details: "Risiko Detaljer", risk_title: "Risiko Tittel", @@ -486,12 +471,12 @@ export default { risk_department: "Avdeling", risk_department_placeholder: "Velg en avdeling", risk_status: "Risiko Status", - risk_status_placeholder: "Velg en risikostatus", + risk_status_placeholder: "Velg en risikostatus" }, tasks: { title: "Oppgaver", attachments: "Vedlegg", - overview: "Oppgaveoversikt", + overview: "Oppgave Oversikt", form: { title: "Oppgave Detaljer", task_title: "Oppgave Tittel", @@ -502,55 +487,50 @@ export default { description_description: "Skriv inn en beskrivelse for oppgaven", due_date: "Forfallsdato", due_date_description: "Velg forfallsdato for oppgaven", - success: "Oppgave opprettet", - error: "Kunne ikke opprette oppgave", + success: "Oppgave opprettet vellykket", + error: "Kunne ikke opprette oppgave" }, sheet: { title: "Opprett Oppgave", update: "Oppdater Oppgave", - update_description: "Oppdater oppgavetittelen eller beskrivelsen.", + update_description: "Oppdater oppgavetittelen eller beskrivelsen." }, empty: { - description_create: - "Opprett en tiltakoppgave for denne risikoen, legg til en behandlingsplan, og tildel den til et teammedlem.", - }, - }, + description_create: "Opprett en tiltakoppgave for denne risikoen, legg til en behandlingsplan, og tildel den til et teammedlem." + } + } }, settings: { general: { title: "Generelt", org_name: "Organisasjonsnavn", - org_name_description: - "Dette er organisasjonens synlige navn. Du bør bruke det juridiske navnet på organisasjonen din.", - org_name_tip: "Vennligst bruk maks 32 tegn.", - org_website: "Organisasjonsnettsted", - org_website_description: - "Dette er organisasjonens offisielle nettsted-URL. Sørg for å inkludere hele URL-en med https://.", + org_name_description: "Dette er organisasjonens synlige navn. Du bør bruke det juridiske navnet på organisasjonen din.", + org_name_tip: "Vennligst bruk maksimalt 32 tegn.", + org_website: "Organisasjonens Nettsted", + org_website_description: "Dette er organisasjonens offisielle nettsted-URL. Sørg for å inkludere den fullstendige URL-en med https://.", org_website_tip: "Vennligst skriv inn en gyldig URL inkludert https://", - org_website_error: "Feil ved oppdatering av organisasjonsnettsted", - org_website_updated: "Organisasjonsnettsted oppdatert", + org_website_error: "Feil ved oppdatering av organisasjonens nettsted", + org_website_updated: "Organisasjonens nettsted oppdatert", org_delete: "Slett organisasjon", - org_delete_description: - "Fjern organisasjonen din og alt innhold permanent fra Comp AI-plattformen. Denne handlingen kan ikke angres - vennligst fortsett med forsiktighet.", + org_delete_description: "Fjern permanent organisasjonen din og alt innholdet fra Comp AI-plattformen. Denne handlingen kan ikke angres - vennligst fortsett med forsiktighet.", org_delete_alert_title: "Er du helt sikker?", - org_delete_alert_description: - "Denne handlingen kan ikke angres. Dette vil permanent slette organisasjonen din og fjerne dataene dine fra våre servere.", + org_delete_alert_description: "Denne handlingen kan ikke angres. Dette vil permanent slette organisasjonen din og fjerne dataene dine fra serverne våre.", org_delete_error: "Feil ved sletting av organisasjon", - org_delete_success: "Organisasjon slettet", + org_delete_success: "Organisasjonen er slettet", org_name_updated: "Organisasjonsnavn oppdatert", org_name_error: "Feil ved oppdatering av organisasjonsnavn", save_button: "Lagre", delete_button: "Slett", delete_confirm: "SLETT", delete_confirm_tip: "Skriv SLETT for å bekrefte.", - cancel_button: "Avbryt", + cancel_button: "Avbryt" }, members: { - title: "Medlemmer", + title: "Medlemmer" }, billing: { - title: "Fakturering", - }, + title: "Fakturering" + } }, user_menu: { theme: "Tema", @@ -559,7 +539,7 @@ export default { account: "Konto", support: "Støtte", settings: "Innstillinger", - teams: "Team", + teams: "Team" }, frameworks: { title: "Rammeverk", @@ -570,47 +550,43 @@ export default { status: "Status", control: "Kontroll", artifacts: "Artefakter", - actions: "Handlinger", + actions: "Handlinger" }, statuses: { not_started: "Ikke startet", - compliant: "Samsvarende", - non_compliant: "Ikke samsvarende", completed: "Fullført", - in_progress: "Pågår", - }, + in_progress: "Pågår" + } }, overview: { error: "Kunne ikke laste rammeverk", loading: "Laster rammeverk...", empty: { title: "Ingen rammeverk valgt", - description: "Velg rammeverk for å komme i gang med din samsvarsreise", + description: "Velg rammeverk for å komme i gang med din samsvarsreise" }, progress: { title: "Rammeverksprogresjon", empty: { title: "Ingen rammeverk ennå", - description: - "Kom i gang ved å legge til et samsvarsrammeverk for å spore fremgangen din", - action: "Legg til rammeverk", - }, + description: "Kom i gang med å legge til et samsvarsrammeverk for å spore fremdriften din", + action: "Legg til rammeverk" + } }, grid: { welcome: { title: "Velkommen til Comp AI", - description: - "Kom i gang ved å velge samsvarsrammeverkene du ønsker å implementere. Vi hjelper deg med å administrere og spore samsvarsreisen din på tvers av flere standarder.", - action: "Kom i gang", + description: "Kom i gang med å velge samsvarsrammeverkene du ønsker å implementere. Vi hjelper deg med å administrere og spore samsvarsreisen din på tvers av flere standarder.", + action: "Kom i gang" }, title: "Velg rammeverk", version: "Versjon", actions: { clear: "Tøm", - confirm: "Bekreft valg", - }, - }, - }, + confirm: "Bekreft valg" + } + } + } }, vendor: { title: "Dashbord", @@ -620,11 +596,9 @@ export default { overview: "Leverandøroversikt", vendor_status: "Leverandørstatus", vendor_category: "Leverandørkategorier", - vendors_by_assignee: "Leverandører etter tildelt", - inherent_risk_description: - "Innledende risikonivå før noen kontroller er anvendt", - residual_risk_description: - "Gjenstående risikonivå etter at kontroller er anvendt", + vendors_by_assignee: "Leverandører etter ansvarlig", + inherent_risk_description: "Innledende risikonivå før noen kontroller er anvendt", + residual_risk_description: "Gjenstående risikonivå etter at kontroller er anvendt" }, register: { title: "Leverandørregister", @@ -632,8 +606,8 @@ export default { name: "Navn", category: "Kategori", status: "Status", - owner: "Eier", - }, + owner: "Eier" + } }, category: { cloud: "Sky", @@ -643,7 +617,7 @@ export default { marketing: "Markedsføring", sales: "Salg", hr: "HR", - other: "Annet", + other: "Annet" }, vendors: "leverandører", form: { @@ -658,89 +632,89 @@ export default { vendor_category_placeholder: "Velg kategori", vendor_status: "Status", vendor_status_placeholder: "Velg status", - create_vendor_success: "Leverandør opprettet", + create_vendor_success: "Leverandør opprettet med suksess", create_vendor_error: "Kunne ikke opprette leverandør", - update_vendor_success: "Leverandør oppdatert", + update_vendor_success: "Leverandør oppdatert med suksess", update_vendor_error: "Kunne ikke oppdatere leverandør", contacts: "Leverandørkontakter", - contact_name: "Kontaktpersonens navn", - contact_email: "Kontaktpersonens e-post", - contact_role: "Kontaktpersonens rolle", + contact_name: "Kontaktperson", + contact_email: "Kontakt-e-post", + contact_role: "Kontaktrolle", add_contact: "Legg til kontakt", new_contact: "Ny kontakt", - min_one_contact_required: "En leverandør må ha minst én kontakt", + min_one_contact_required: "En leverandør må ha minst én kontakt" }, empty_states: { no_vendors: { title: "Ingen leverandører ennå", - description: "Kom i gang med å opprette din første leverandør", + description: "Kom i gang med å opprette din første leverandør" }, no_results: { title: "Ingen resultater funnet", description: "Ingen leverandører samsvarer med søket ditt", - description_with_filters: "Prøv å justere filtrene dine", - }, - }, + description_with_filters: "Prøv å justere filtrene dine" + } + } }, people: { title: "Personer", details: { - taskProgress: "Oppgavefremdrift", + taskProgress: "Oppgave Fremdrift", tasks: "Oppgaver", - noTasks: "Ingen oppgaver tildelt ennå", + noTasks: "Ingen oppgaver tildelt ennå" }, description: "Administrer teammedlemmene dine og deres roller.", filters: { search: "Søk etter personer...", - role: "Filtrer etter rolle", + role: "Filtrer etter rolle" }, actions: { - invite: "Legg til ansatt", - clear: "Fjern filtre", + invite: "Legg til Ansatt", + clear: "Fjern filtre" }, table: { name: "Navn", email: "E-post", department: "Avdeling", - externalId: "Ekstern ID", + externalId: "Ekstern ID" }, empty: { no_employees: { title: "Ingen ansatte ennå", - description: "Kom i gang med å invitere ditt første teammedlem.", + description: "Kom i gang med å invitere ditt første teammedlem." }, no_results: { title: "Ingen resultater funnet", description: "Ingen ansatte samsvarer med søket ditt", - description_with_filters: "Prøv å justere filtrene dine", - }, + description_with_filters: "Prøv å justere filtrene dine" + } }, invite: { - title: "Legg til ansatt", + title: "Legg til Ansatt", description: "Legg til en ansatt i organisasjonen din.", email: { label: "E-postadresse", - placeholder: "Skriv inn e-postadresse", + placeholder: "Skriv inn e-postadresse" }, role: { label: "Rolle", - placeholder: "Velg en rolle", + placeholder: "Velg en rolle" }, name: { label: "Navn", - placeholder: "Skriv inn navn", + placeholder: "Skriv inn navn" }, department: { label: "Avdeling", - placeholder: "Velg en avdeling", + placeholder: "Velg en avdeling" }, - submit: "Legg til ansatt", - success: "Ansatt lagt til", - error: "Kunne ikke legge til ansatt", - }, + submit: "Legg til Ansatt", + success: "Ansatt lagt til vellykket", + error: "Kunne ikke legge til ansatt" + } }, errors: { - unexpected: "Noe gikk galt, vennligst prøv igjen", + unexpected: "Noe gikk galt, vennligst prøv igjen" }, sub_pages: { risk: { @@ -749,53 +723,81 @@ export default { risk_overview: "Risikooversikt", risk_comments: "Risiko-kommentarer", tasks: { - task_overview: "Oppgaveoversikt", - }, + task_overview: "Oppgaveoversikt" + } }, policies: { all: "Alle retningslinjer", editor: "Retningslinje-redigerer", - policy_details: "Policy Detaljer", + policy_details: "Retningslinjedetaljer" }, people: { all: "Personer", - employee_details: "Ansattdetaljer", + employee_details: "Ansatt-detaljer" }, settings: { - members: "Teammedlemmer", + members: "Teammedlemmer" }, frameworks: { - overview: "Rammeverk", + overview: "Rammer" }, evidence: { title: "Bevis", list: "Bevisliste", - overview: "Oversikt over Bevis", - }, + overview: "Bevisoversikt" + } }, editor: { ai: { thinking: "AI tenker", thinking_spinner: "AI tenker", edit_or_generate: "Rediger eller generer...", - tell_ai_what_to_do_next: "Fortell AI hva den skal gjøre neste gang", - request_limit_reached: "Du har nådd forespørselgrensen for dagen.", + tell_ai_what_to_do_next: "Fortell AI hva den skal gjøre neste", + request_limit_reached: "Du har nådd forespørselgrensen for dagen." }, ai_selector: { improve: "Forbedre skriving", fix: "Rett grammatikk", shorter: "Gjør kortere", longer: "Gjør lengre", - continue: "Fortsett å skrive", + "continue": "Fortsett å skrive", replace: "Erstatt valg", insert: "Sett inn under", - discard: "Forkast", - }, + discard: "Forkast" + } }, evidence: { - title: "Bevisoppgaver", - description: "Administrer og spor bevisoppgaver for dine samsvarsbehov.", - dashboard: "Dashbord", + title: "Bevis", list: "Alle Bevis", - }, + overview: "Oversikt over Bevis", + edit: "Rediger Bevis", + dashboard: { + layout: "Dashbord", + layout_back_button: "Tilbake", + title: "Bevis Dashbord", + by_department: "Etter Avdeling", + by_assignee: "Etter Tildelt", + by_framework: "Etter Rammeverk" + }, + items: "elementer", + status: { + up_to_date: "Oppdatert", + needs_review: "Trenger Gjennomgang", + draft: "Utkast", + empty: "Tom" + }, + departments: { + none: "Uklassifisert", + admin: "Administrasjon", + gov: "Styring", + hr: "Personal", + it: "Informasjonsteknologi", + itsm: "IT-tjenesteforvaltning", + qms: "Kvalitetsforvaltning" + }, + details: { + review_section: "Gjennomgå Informasjon", + content: "Bevisinnhold" + } + } } as const; diff --git a/apps/app/src/locales/pt.ts b/apps/app/src/locales/pt.ts index 2f6a6f2fe5..3cf1805245 100644 --- a/apps/app/src/locales/pt.ts +++ b/apps/app/src/locales/pt.ts @@ -4,36 +4,36 @@ export default { fr: "Francês", no: "Norueguês", pt: "Português", - en: "Inglês", + en: "Inglês" }, language: { title: "Idiomas", description: "Altere o idioma usado na interface do usuário.", - placeholder: "Selecione o idioma", + placeholder: "Selecione o idioma" }, common: { actions: { save: "Salvar", edit: "Editar", - delete: "Excluir", + "delete": "Excluir", cancel: "Cancelar", clear: "Limpar", create: "Criar", send: "Enviar", - return: "Retornar", + "return": "Retornar", success: "Sucesso", error: "Erro", next: "Próximo", complete: "Completo", - addNew: "Adicionar Novo", + addNew: "Adicionar Novo" }, assignee: { label: "Responsável", - placeholder: "Selecione o responsável", + placeholder: "Selecione o responsável" }, date: { pick: "Escolher uma data", - due_date: "Data de Vencimento", + due_date: "Data de Vencimento" }, status: { open: "Aberto", @@ -51,7 +51,7 @@ export default { assessed: "Avaliado", active: "Ativo", inactive: "Inativo", - title: "Status", + title: "Status" }, filters: { clear: "Limpar filtros", @@ -60,8 +60,8 @@ export default { department: "Departamento", owner: { label: "Responsável", - placeholder: "Filtrar por responsável", - }, + placeholder: "Filtrar por responsável" + } }, table: { title: "Título", @@ -69,7 +69,7 @@ export default { assigned_to: "Atribuído A", due_date: "Data de Vencimento", last_updated: "Última Atualização", - no_results: "Nenhum resultado encontrado", + no_results: "Nenhum resultado encontrado" }, empty_states: { no_results: { @@ -79,12 +79,12 @@ export default { description: "Tente outra pesquisa ou ajuste os filtros", description_filters: "Tente outra pesquisa ou ajuste os filtros", description_no_tasks: "Crie uma tarefa para começar", - description_no_risks: "Crie um risco para começar", + description_no_risks: "Crie um risco para começar" }, no_items: { title: "Nenhum item encontrado", - description: "Tente ajustar sua pesquisa ou filtros", - }, + description: "Tente ajustar sua pesquisa ou filtros" + } }, pagination: { of: "de", @@ -94,42 +94,38 @@ export default { go_to_first_page: "Ir para a primeira página", go_to_previous_page: "Ir para a página anterior", go_to_next_page: "Ir para a próxima página", - go_to_last_page: "Ir para a última página", + go_to_last_page: "Ir para a última página" }, comments: { title: "Comentários", description: "Adicione um comentário usando o formulário abaixo.", add: "Novo Comentário", - new: "Novo Comentário", + "new": "Novo Comentário", save: "Salvar Comentário", success: "Comentário adicionado com sucesso", error: "Falha ao adicionar comentário", placeholder: "Escreva seu comentário aqui...", empty: { title: "Nenhum comentário ainda", - description: "Seja o primeiro a adicionar um comentário", - }, + description: "Seja o primeiro a adicionar um comentário" + } }, attachments: { title: "Anexos", description: "Adicione um arquivo clicando em 'Adicionar Anexo'.", upload: "Enviar anexo", - upload_description: - "Carregue um anexo ou adicione um link para um recurso externo.", + upload_description: "Carregue um anexo ou adicione um link para um recurso externo.", drop: "Solte os arquivos aqui", - drop_description: - "Solte arquivos aqui ou clique para escolher arquivos do seu dispositivo.", + drop_description: "Solte arquivos aqui ou clique para escolher arquivos do seu dispositivo.", drop_files_description: "Os arquivos podem ter até ", empty: { title: "Nenhum anexo", - description: "Adicione um arquivo clicando em 'Adicionar Anexo'.", + description: "Adicione um arquivo clicando em 'Adicionar Anexo'." }, toasts: { error: "Algo deu errado, por favor tente novamente.", - error_uploading_files: - "Não é possível carregar mais de 1 arquivo por vez", - error_uploading_files_multiple: - "Não é possível carregar mais de 10 arquivos", + error_uploading_files: "Não é possível carregar mais de 1 arquivo por vez", + error_uploading_files_multiple: "Não é possível carregar mais de 10 arquivos", error_no_files_selected: "Nenhum arquivo selecionado", error_file_rejected: "Arquivo {file} foi rejeitado", error_failed_to_upload_files: "Falha ao carregar arquivos", @@ -140,18 +136,18 @@ export default { success_uploading_files_single: "Arquivo carregado com sucesso", success_uploading_files_target: "Arquivos carregados", uploading_files: "Carregando {target}...", - remove_file: "Remover arquivo", - }, + remove_file: "Remover arquivo" + } }, notifications: { inbox: "Caixa de entrada", archive: "Arquivo", archive_all: "Arquivar tudo", - no_notifications: "Sem novas notificações", + no_notifications: "Sem novas notificações" }, edit: "Editar", errors: { - unexpected_error: "Ocorreu um erro inesperado", + unexpected_error: "Ocorreu um erro inesperado" }, description: "Descrição", last_updated: "Última atualização", @@ -160,35 +156,34 @@ export default { weekly: "Semanal", monthly: "Mensal", quarterly: "Trimestral", - yearly: "Anual", - }, + yearly: "Anual" + } }, header: { discord: { - button: "Junte-se a nós no Discord", + button: "Junte-se a nós no Discord" }, feedback: { button: "Feedback", title: "Obrigado pelo seu feedback!", description: "Voltaremos a você assim que possível", - placeholder: - "Ideias para melhorar esta página ou problemas que você está enfrentando.", + placeholder: "Ideias para melhorar esta página ou problemas que você está enfrentando.", success: "Obrigado pelo seu feedback!", error: "Erro ao enviar feedback - tentar novamente?", - send: "Enviar Feedback", - }, + send: "Enviar Feedback" + } }, not_found: { title: "404 - Página não encontrada", description: "A página que você está procurando não existe.", - return: "Retornar ao painel", + "return": "Retornar ao painel" }, theme: { options: { light: "Claro", dark: "Escuro", - system: "Sistema", - }, + system: "Sistema" + } }, sidebar: { overview: "Visão Geral", @@ -198,12 +193,11 @@ export default { integrations: "Integrações", settings: "Configurações", evidence: "Tarefas de Evidência", - people: "Pessoas", + people: "Pessoas" }, auth: { title: "Automatize a conformidade com SOC 2, ISO 27001 e GDPR com IA.", - description: - "Crie uma conta gratuita ou faça login com uma conta existente para continuar.", + description: "Crie uma conta gratuita ou faça login com uma conta existente para continuar.", options: "Mais opções", google: "Continuar com o Google", email: { @@ -211,14 +205,12 @@ export default { placeholder: "Insira o endereço de e-mail", button: "Continuar com e-mail", magic_link_sent: "Link mágico enviado", - magic_link_description: - "Verifique sua caixa de entrada para um link mágico.", + magic_link_description: "Verifique sua caixa de entrada para um link mágico.", magic_link_try_again: "Tente novamente.", success: "E-mail enviado - verifique sua caixa de entrada!", - error: "Erro ao enviar e-mail - tentar novamente?", + error: "Erro ao enviar e-mail - tentar novamente?" }, - terms: - "Ao clicar em continuar, você reconhece que leu e concorda com os Termos de Serviço e a Política de Privacidade.", + terms: "Ao clicar em continuar, você reconhece que leu e concorda com os Termos de Serviço e a Política de Privacidade." }, onboarding: { title: "Criar uma organização", @@ -227,35 +219,35 @@ export default { fields: { name: { label: "Nome da Organização", - placeholder: "O nome da sua organização", + placeholder: "O nome da sua organização" }, website: { label: "Website", - placeholder: "O website da sua organização", + placeholder: "O website da sua organização" }, subdomain: { label: "Subdomínio", - placeholder: "exemplo", + placeholder: "exemplo" }, fullName: { label: "Seu Nome", - placeholder: "Seu nome completo", - }, + placeholder: "Seu nome completo" + } }, success: "Obrigado, tudo pronto!", error: "Algo deu errado, por favor tente novamente.", unavailable: "Indisponível", check_availability: "Verificando disponibilidade", - available: "Disponível", + available: "Disponível" }, overview: { title: "Visão Geral", framework_chart: { - title: "Progresso do Framework", + title: "Progresso do Framework" }, requirement_chart: { - title: "Status de Conformidade", - }, + title: "Status de Conformidade" + } }, policies: { dashboard: { @@ -266,32 +258,32 @@ export default { policies_by_framework: "Políticas por Framework", sub_pages: { overview: "Visão Geral", - edit_policy: "Editar Política", - }, + edit_policy: "Editar Política" + } }, table: { name: "Nome da Política", statuses: { draft: "Rascunho", published: "Publicado", - archived: "Arquivado", + archived: "Arquivado" }, filters: { owner: { label: "Responsável", - placeholder: "Filtrar por responsável", - }, - }, + placeholder: "Filtrar por responsável" + } + } }, filters: { search: "Pesquisar políticas...", - all: "Todas as Políticas", + all: "Todas as Políticas" }, status: { draft: "Rascunho", published: "Publicado", needs_review: "Necessita Revisão", - archived: "Arquivado", + archived: "Arquivado" }, policies: "políticas", title: "Políticas", @@ -312,21 +304,20 @@ export default { title: "Visão Geral da Política", form: { update_policy: "Atualizar Política", - update_policy_description: - "Atualize o título ou a descrição da política.", + update_policy_description: "Atualize o título ou a descrição da política.", update_policy_success: "Política atualizada com sucesso", update_policy_error: "Falha ao atualizar a política", update_policy_title: "Nome da Política", review_frequency: "Frequência de Revisão", review_frequency_placeholder: "Selecione uma frequência de revisão", review_date: "Data da Revisão", - review_date_placeholder: "Selecione uma data de revisão", - }, - }, + review_date_placeholder: "Selecione uma data de revisão" + } + } }, evidence_tasks: { evidence_tasks: "Tarefas de Evidência", - overview: "Visão Geral", + overview: "Visão Geral" }, risk: { risks: "riscos", @@ -340,10 +331,8 @@ export default { vendor_status: "Status do Fornecedor", vendor_category: "Categorias de Fornecedor", vendors_by_assignee: "Fornecedores por Responsável", - inherent_risk_description: - "Nível de risco inicial antes da aplicação de quaisquer controles", - residual_risk_description: - "Nível de risco restante após a aplicação de controles", + inherent_risk_description: "Nível de risco inicial antes da aplicação de quaisquer controles", + residual_risk_description: "Nível de risco restante após a aplicação de controles" }, register: { title: "Registro de Fornecedor", @@ -351,16 +340,15 @@ export default { name: "Nome", category: "Categoria", status: "Status", - owner: "Responsável", - }, + owner: "Responsável" + } }, assessment: { title: "Avaliação de Fornecedor", - update_success: - "Avaliação de risco do fornecedor atualizada com sucesso", + update_success: "Avaliação de risco do fornecedor atualizada com sucesso", update_error: "Falha ao atualizar a avaliação de risco do fornecedor", inherent_risk: "Risco Inerente", - residual_risk: "Risco Residual", + residual_risk: "Risco Residual" }, form: { vendor_details: "Detalhes do Fornecedor", @@ -379,38 +367,38 @@ export default { update_vendor: "Atualizar Fornecedor", update_vendor_success: "Fornecedor atualizado com sucesso", update_vendor_error: "Falha ao atualizar fornecedor", - add_comment: "Adicionar Comentário", + add_comment: "Adicionar Comentário" }, table: { name: "Nome", category: "Categoria", status: "Status", - owner: "Proprietário", + owner: "Proprietário" }, filters: { search_placeholder: "Pesquisar fornecedores...", status_placeholder: "Filtrar por status", category_placeholder: "Filtrar por categoria", - owner_placeholder: "Filtrar por proprietário", + owner_placeholder: "Filtrar por proprietário" }, empty_states: { no_vendors: { title: "Nenhum fornecedor ainda", - description: "Comece criando seu primeiro fornecedor", + description: "Comece criando seu primeiro fornecedor" }, no_results: { title: "Nenhum resultado encontrado", description: "Nenhum fornecedor corresponde à sua pesquisa", - description_with_filters: "Tente ajustar seus filtros", - }, + description_with_filters: "Tente ajustar seus filtros" + } }, actions: { - create: "Criar Fornecedor", + create: "Criar Fornecedor" }, status: { not_assessed: "Não Avaliado", in_progress: "Em Andamento", - assessed: "Avaliado", + assessed: "Avaliado" }, category: { cloud: "Nuvem", @@ -420,14 +408,14 @@ export default { marketing: "Marketing", sales: "Vendas", hr: "RH", - other: "Outro", + other: "Outro" }, risk_level: { low: "Baixo Risco", medium: "Risco Médio", high: "Alto Risco", - unknown: "Risco Desconhecido", - }, + unknown: "Risco Desconhecido" + } }, dashboard: { title: "Painel", @@ -435,42 +423,36 @@ export default { risk_status: "Status do Risco", risks_by_department: "Riscos por Departamento", risks_by_assignee: "Riscos por Responsável", - inherent_risk_description: - "O risco inerente é calculado como probabilidade * impacto. Calculado antes de qualquer controle ser aplicado.", - residual_risk_description: - "O risco residual é calculado como probabilidade * impacto. Este é o nível de risco após a aplicação de controles.", - risk_assessment_description: - "Compare os níveis de risco inerente e residual", + inherent_risk_description: "O risco inerente é calculado como probabilidade * impacto. Calculado antes de qualquer controle ser aplicado.", + residual_risk_description: "O risco residual é calculado como probabilidade * impacto. Este é o nível de risco após a aplicação de controles.", + risk_assessment_description: "Compare os níveis de risco inerente e residual" }, register: { title: "Registro de Risco", table: { - risk: "Risco", + risk: "Risco" }, empty: { no_risks: { title: "Crie um risco para começar", - description: - "Acompanhe e classifique riscos, crie e atribua tarefas de mitigação para sua equipe e gerencie seu registro de risco tudo em uma interface simples.", + description: "Acompanhe e classifique riscos, crie e atribua tarefas de mitigação para sua equipe e gerencie seu registro de risco tudo em uma interface simples." }, - create_risk: "Criar um risco", - }, + create_risk: "Criar um risco" + } }, metrics: { probability: "Probabilidade", impact: "Impacto", inherentRisk: "Risco Inerente", - residualRisk: "Risco Residual", + residualRisk: "Risco Residual" }, form: { update_inherent_risk: "Salvar Risco Inerente", - update_inherent_risk_description: - "Atualize o risco inerente do risco. Este é o nível de risco antes de qualquer controle ser aplicado.", + update_inherent_risk_description: "Atualize o risco inerente do risco. Este é o nível de risco antes de qualquer controle ser aplicado.", update_inherent_risk_success: "Risco inerente atualizado com sucesso", update_inherent_risk_error: "Falha ao atualizar risco inerente", update_residual_risk: "Salvar Risco Residual", - update_residual_risk_description: - "Atualize o risco residual do risco. Este é o nível de risco após a aplicação de controles.", + update_residual_risk_description: "Atualize o risco residual do risco. Este é o nível de risco após a aplicação de controles.", update_residual_risk_success: "Risco residual atualizado com sucesso", update_residual_risk_error: "Falha ao atualizar risco residual", update_risk: "Atualizar Risco", @@ -489,7 +471,7 @@ export default { risk_department: "Departamento", risk_department_placeholder: "Selecione um departamento", risk_status: "Status do Risco", - risk_status_placeholder: "Selecione um status de risco", + risk_status_placeholder: "Selecione um status de risco" }, tasks: { title: "Tarefas", @@ -506,38 +488,33 @@ export default { due_date: "Data de Vencimento", due_date_description: "Selecione a data de vencimento para a tarefa", success: "Tarefa criada com sucesso", - error: "Falha ao criar tarefa", + error: "Falha ao criar tarefa" }, sheet: { title: "Criar Tarefa", update: "Atualizar Tarefa", - update_description: "Atualize o título ou a descrição da tarefa.", + update_description: "Atualize o título ou a descrição da tarefa." }, empty: { - description_create: - "Crie uma tarefa de mitigação para este risco, adicione um plano de tratamento e atribua a um membro da equipe.", - }, - }, + description_create: "Crie uma tarefa de mitigação para este risco, adicione um plano de tratamento e atribua a um membro da equipe." + } + } }, settings: { general: { title: "Geral", org_name: "Nome da Organização", - org_name_description: - "Este é o nome visível da sua organização. Você deve usar o nome legal da sua organização.", + org_name_description: "Este é o nome visível da sua organização. Você deve usar o nome legal da sua organização.", org_name_tip: "Por favor, use no máximo 32 caracteres.", org_website: "Website da Organização", - org_website_description: - "Este é o URL do website oficial da sua organização. Certifique-se de incluir o URL completo com https://.", + org_website_description: "Este é o URL do website oficial da sua organização. Certifique-se de incluir o URL completo com https://.", org_website_tip: "Por favor, insira um URL válido incluindo https://", org_website_error: "Erro ao atualizar o website da organização", org_website_updated: "Website da organização atualizado", org_delete: "Excluir organização", - org_delete_description: - "Remova permanentemente sua organização e todo o seu conteúdo da plataforma Comp AI. Esta ação não é reversível - continue com cautela.", + org_delete_description: "Remova permanentemente sua organização e todo o seu conteúdo da plataforma Comp AI. Esta ação não é reversível - continue com cautela.", org_delete_alert_title: "Você tem certeza absoluta?", - org_delete_alert_description: - "Esta ação não pode ser desfeita. Isso excluirá permanentemente sua organização e removerá seus dados de nossos servidores.", + org_delete_alert_description: "Esta ação não pode ser desfeita. Isso excluirá permanentemente sua organização e removerá seus dados de nossos servidores.", org_delete_error: "Erro ao excluir organização", org_delete_success: "Organização excluída", org_name_updated: "Nome da organização atualizado", @@ -546,14 +523,14 @@ export default { delete_button: "Excluir", delete_confirm: "EXCLUIR", delete_confirm_tip: "Digite EXCLUIR para confirmar.", - cancel_button: "Cancelar", + cancel_button: "Cancelar" }, members: { - title: "Membros", + title: "Membros" }, billing: { - title: "Faturamento", - }, + title: "Faturamento" + } }, user_menu: { theme: "Tema", @@ -562,7 +539,7 @@ export default { account: "Conta", support: "Suporte", settings: "Configurações", - teams: "Equipes", + teams: "Equipes" }, frameworks: { title: "Estruturas", @@ -573,48 +550,43 @@ export default { status: "Status", control: "Controle", artifacts: "Artefatos", - actions: "Ações", + actions: "Ações" }, statuses: { not_started: "Não Iniciado", - compliant: "Conforme", - non_compliant: "Não Conforme", completed: "Concluído", - in_progress: "Em Andamento", - }, + in_progress: "Em Andamento" + } }, overview: { error: "Falha ao carregar frameworks", loading: "Carregando frameworks...", empty: { title: "Nenhum framework selecionado", - description: - "Selecione frameworks para começar sua jornada de conformidade", + description: "Selecione frameworks para começar sua jornada de conformidade" }, progress: { title: "Progresso do Framework", empty: { title: "Nenhum framework ainda", - description: - "Comece adicionando um framework de conformidade para acompanhar seu progresso", - action: "Adicionar Framework", - }, + description: "Comece adicionando um framework de conformidade para acompanhar seu progresso", + action: "Adicionar Framework" + } }, grid: { welcome: { title: "Bem-vindo ao Comp AI", - description: - "Comece selecionando os frameworks de conformidade que você gostaria de implementar. Nós o ajudaremos a gerenciar e acompanhar sua jornada de conformidade em múltiplos padrões.", - action: "Começar", + description: "Comece selecionando os frameworks de conformidade que você gostaria de implementar. Nós o ajudaremos a gerenciar e acompanhar sua jornada de conformidade em múltiplos padrões.", + action: "Começar" }, title: "Selecionar Frameworks", version: "Versão", actions: { clear: "Limpar", - confirm: "Confirmar Seleção", - }, - }, - }, + confirm: "Confirmar Seleção" + } + } + } }, vendor: { title: "Painel", @@ -625,10 +597,8 @@ export default { vendor_status: "Status do Fornecedor", vendor_category: "Categorias de Fornecedor", vendors_by_assignee: "Fornecedores por Responsável", - inherent_risk_description: - "Nível de risco inicial antes que quaisquer controles sejam aplicados", - residual_risk_description: - "Nível de risco restante após a aplicação de controles", + inherent_risk_description: "Nível de risco inicial antes que quaisquer controles sejam aplicados", + residual_risk_description: "Nível de risco restante após a aplicação de controles" }, register: { title: "Registro de Fornecedor", @@ -636,8 +606,8 @@ export default { name: "Nome", category: "Categoria", status: "Status", - owner: "Proprietário", - }, + owner: "Proprietário" + } }, category: { cloud: "Nuvem", @@ -647,7 +617,7 @@ export default { marketing: "Marketing", sales: "Vendas", hr: "RH", - other: "Outro", + other: "Outro" }, vendors: "fornecedores", form: { @@ -672,79 +642,79 @@ export default { contact_role: "Função do Contato", add_contact: "Adicionar Contato", new_contact: "Novo Contato", - min_one_contact_required: "Um fornecedor deve ter pelo menos um contato", + min_one_contact_required: "Um fornecedor deve ter pelo menos um contato" }, empty_states: { no_vendors: { title: "Nenhum fornecedor ainda", - description: "Comece criando seu primeiro fornecedor", + description: "Comece criando seu primeiro fornecedor" }, no_results: { title: "Nenhum resultado encontrado", description: "Nenhum fornecedor corresponde à sua pesquisa", - description_with_filters: "Tente ajustar seus filtros", - }, - }, + description_with_filters: "Tente ajustar seus filtros" + } + } }, people: { title: "Pessoas", details: { taskProgress: "Progresso da Tarefa", tasks: "Tarefas", - noTasks: "Nenhuma tarefa atribuída ainda", + noTasks: "Nenhuma tarefa atribuída ainda" }, description: "Gerencie os membros da sua equipe e seus papéis.", filters: { search: "Pesquisar pessoas...", - role: "Filtrar por papel", + role: "Filtrar por papel" }, actions: { invite: "Adicionar Funcionário", - clear: "Limpar filtros", + clear: "Limpar filtros" }, table: { name: "Nome", email: "Email", department: "Departamento", - externalId: "ID Externo", + externalId: "ID Externo" }, empty: { no_employees: { title: "Nenhum funcionário ainda", - description: "Comece convidando seu primeiro membro da equipe.", + description: "Comece convidando seu primeiro membro da equipe." }, no_results: { title: "Nenhum resultado encontrado", description: "Nenhum funcionário corresponde à sua pesquisa", - description_with_filters: "Tente ajustar seus filtros", - }, + description_with_filters: "Tente ajustar seus filtros" + } }, invite: { title: "Adicionar Funcionário", description: "Adicione um funcionário à sua organização.", email: { label: "Endereço de email", - placeholder: "Digite o endereço de email", + placeholder: "Digite o endereço de email" }, role: { label: "Função", - placeholder: "Selecione uma função", + placeholder: "Selecione uma função" }, name: { label: "Nome", - placeholder: "Digite o nome", + placeholder: "Digite o nome" }, department: { label: "Departamento", - placeholder: "Selecione um departamento", + placeholder: "Selecione um departamento" }, submit: "Adicionar Funcionário", success: "Funcionário adicionado com sucesso", - error: "Falha ao adicionar funcionário", - }, + error: "Falha ao adicionar funcionário" + } }, errors: { - unexpected: "Algo deu errado, por favor tente novamente", + unexpected: "Algo deu errado, por favor tente novamente" }, sub_pages: { risk: { @@ -753,29 +723,29 @@ export default { risk_overview: "Visão Geral dos Riscos", risk_comments: "Comentários sobre Riscos", tasks: { - task_overview: "Visão Geral da Tarefa", - }, + task_overview: "Visão Geral da Tarefa" + } }, policies: { all: "Todas as Políticas", editor: "Editor de Políticas", - policy_details: "Detalhes da política", + policy_details: "Detalhes da política" }, people: { all: "Pessoas", - employee_details: "Detalhes do Funcionário", + employee_details: "Detalhes do Funcionário" }, settings: { - members: "Membros da Equipe", + members: "Membros da Equipe" }, frameworks: { - overview: "Estruturas", + overview: "Estruturas" }, evidence: { title: "Evidência", list: "Lista de Evidências", - overview: "Visão Geral das Evidências", - }, + overview: "Visão Geral das Evidências" + } }, editor: { ai: { @@ -783,25 +753,21 @@ export default { thinking_spinner: "A IA está pensando", edit_or_generate: "Editar ou gerar...", tell_ai_what_to_do_next: "Diga à IA o que fazer a seguir", - request_limit_reached: - "Você atingiu seu limite de solicitações para o dia.", + request_limit_reached: "Você atingiu seu limite de solicitações para o dia." }, ai_selector: { improve: "Melhorar a escrita", fix: "Corrigir gramática", shorter: "Tornar mais curto", longer: "Tornar mais longo", - continue: "Continuar escrevendo", + "continue": "Continuar escrevendo", replace: "Substituir seleção", insert: "Inserir abaixo", - discard: "Descartar", - }, + discard: "Descartar" + } }, evidence: { title: "Tarefas de Evidência", - description: - "Gerencie e acompanhe as tarefas de evidência para seus requisitos de conformidade.", - dashboard: "Painel", - list: "Todas as Evidências", - }, + list: "Todas as Evidências" + } } as const;