- );
-}
diff --git a/apps/trust/src/components/DocumentPageErrorBoundary.tsx b/apps/trust/src/components/DocumentPageErrorBoundary.tsx
deleted file mode 100644
index 8af28bfe5..000000000
--- a/apps/trust/src/components/DocumentPageErrorBoundary.tsx
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useTranslate } from "@probo/i18n";
-import {
- FullNameRequiredError,
- NDASignatureRequiredError,
- UnAuthenticatedError,
-} from "@probo/relay";
-import { Button, IconChevronLeft, IconPageCross } from "@probo/ui";
-import { Link, Navigate, useLocation, useRouteError } from "react-router";
-
-export function DocumentPageErrorBoundary() {
- const error = useRouteError();
- const location = useLocation();
- const { __ } = useTranslate();
-
- const search = new URLSearchParams();
-
- if (location.pathname !== "/" || location.search !== "") {
- search.set("continue", window.location.href);
- }
-
- const queryString = search.toString();
-
- if (error instanceof UnAuthenticatedError) {
- return (
-
- );
- }
-
- if (error instanceof FullNameRequiredError) {
- return (
-
- );
- }
-
- if (error instanceof NDASignatureRequiredError) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
-
- {__("Document not found")}
-
-
- {__("The document you are looking for does not exist or has been removed.")}
-
-
-
-
-
- );
-}
diff --git a/apps/trust/src/components/DocumentRow.tsx b/apps/trust/src/components/DocumentRow.tsx
deleted file mode 100644
index a0b31a5fb..000000000
--- a/apps/trust/src/components/DocumentRow.tsx
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { formatError } from "@probo/helpers";
-import { useTranslate } from "@probo/i18n";
-import { UnAuthenticatedError } from "@probo/relay";
-import {
- Button,
- IconArrowLink,
- IconLock,
- IconPageTextLine,
- useToast,
-} from "@probo/ui";
-import { useFragment, useMutation } from "react-relay";
-import { useLocation, useNavigate, useSearchParams } from "react-router";
-import { graphql } from "relay-runtime";
-
-import type { DocumentRow_requestAccessMutation } from "./__generated__/DocumentRow_requestAccessMutation.graphql";
-import type { DocumentRowFragment$key } from "./__generated__/DocumentRowFragment.graphql";
-
-const requestAccessMutation = graphql`
- mutation DocumentRow_requestAccessMutation(
- $input: RequestDocumentAccessInput!
- ) {
- requestDocumentAccess(input: $input) {
- document {
- access {
- id
- status
- }
- }
- }
- }
-`;
-
-const documentRowFragment = graphql`
- fragment DocumentRowFragment on Document {
- id
- alias
- title
- isUserAuthorized
- access {
- id
- status
- }
- }
-`;
-
-export function DocumentRow(props: { document: DocumentRowFragment$key }) {
- const { __ } = useTranslate();
- const { toast } = useToast();
- const navigate = useNavigate();
- const location = useLocation();
- const [searchParams] = useSearchParams();
-
- const document = useFragment(documentRowFragment, props.document);
- const documentPath = document.alias ?? document.id;
- const hasRequested = document.access?.status === "REQUESTED";
-
- const [requestAccess, isRequestingAccess]
- = useMutation(requestAccessMutation);
-
- const handleRequestAccess = () => {
- requestAccess({
- variables: {
- input: {
- documentId: document.id,
- },
- },
- onCompleted: (_, errors) => {
- if (errors?.length) {
- toast({
- title: __("Error"),
- description: formatError(__("Cannot request access"), errors),
- variant: "error",
- });
- return;
- }
- toast({
- title: __("Success"),
- description: __("Access request submitted successfully."),
- variant: "success",
- });
- },
- onError: (error) => {
- if (error instanceof UnAuthenticatedError) {
- searchParams.set("request-document-id", document.id);
- const urlSearchParams = new URLSearchParams([[
- "continue",
- window.location.origin + location.pathname + "?" + searchParams.toString(),
- ]]);
- void navigate(`/connect?${urlSearchParams.toString()}`);
-
- return;
- }
-
- toast({
- title: __("Error"),
- description: error.message ?? __("Cannot request access"),
- variant: "error",
- });
- },
- });
- };
-
- return (
-
- );
-}
diff --git a/apps/trust/src/components/FrameworkBadge.tsx b/apps/trust/src/components/FrameworkBadge.tsx
deleted file mode 100644
index 0e14612c2..000000000
--- a/apps/trust/src/components/FrameworkBadge.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { FrameworkLogo } from "@probo/ui";
-import { useFragment } from "react-relay";
-import { graphql } from "relay-runtime";
-
-import type { FrameworkBadgeFragment$key } from "./__generated__/FrameworkBadgeFragment.graphql";
-
-const frameworkFragment = graphql`
- fragment FrameworkBadgeFragment on Framework {
- # eslint-disable-next-line relay/unused-fields
- id
- name
- lightLogo {
- downloadUrl
- }
- darkLogo {
- downloadUrl
- }
- }
-`;
-
-export function FrameworkBadge(props: { framework: FrameworkBadgeFragment$key }) {
- const framework = useFragment(frameworkFragment, props.framework);
-
- return (
-
-
-
- {framework.name}
-
-
- );
-}
diff --git a/apps/trust/src/components/OrganizationSidebar.tsx b/apps/trust/src/components/OrganizationSidebar.tsx
deleted file mode 100644
index 240e1c830..000000000
--- a/apps/trust/src/components/OrganizationSidebar.tsx
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { detectSocialName, externalLinkProps, formatError } from "@probo/helpers";
-import { useSystemTheme } from "@probo/hooks";
-import { useTranslate } from "@probo/i18n";
-import { UnAuthenticatedError } from "@probo/relay";
-import {
- Button,
- Card,
- IconBell2,
- IconBlock,
- IconLock,
- IconMedal,
- SocialIcon,
- useToast,
-} from "@probo/ui";
-import { type PropsWithChildren } from "react";
-import { useMutation } from "react-relay";
-import { useLocation, useNavigate, useSearchParams } from "react-router";
-import { graphql } from "relay-runtime";
-
-import type { CompliancePortalGraphCurrentQuery$data } from "#/queries/__generated__/CompliancePortalGraphCurrentQuery.graphql";
-
-import type { OrganizationSidebar_requestAllAccessesMutation } from "./__generated__/OrganizationSidebar_requestAllAccessesMutation.graphql";
-import type { OrganizationSidebar_subscribeToMailingListMutation } from "./__generated__/OrganizationSidebar_subscribeToMailingListMutation.graphql";
-import type { OrganizationSidebar_unsubscribeFromMailingListMutation } from "./__generated__/OrganizationSidebar_unsubscribeFromMailingListMutation.graphql";
-import { FrameworkBadge } from "./FrameworkBadge";
-
-const requestAllAccessesMutation = graphql`
- mutation OrganizationSidebar_requestAllAccessesMutation {
- requestAllAccesses {
- compliancePortalAccess {
- id
- }
- }
- }
-`;
-
-const subscribeToMailingListMutation = graphql`
- mutation OrganizationSidebar_subscribeToMailingListMutation {
- subscribeToMailingList {
- subscription {
- id
- email
- createdAt
- updatedAt
- }
- }
- }
-`;
-
-const unsubscribeFromMailingListMutation = graphql`
- mutation OrganizationSidebar_unsubscribeFromMailingListMutation {
- unsubscribeFromMailingList {
- deletedMailingListSubscriberId @deleteRecord
- }
- }
-`;
-
-export function OrganizationSidebar({
- compliancePortal,
- isAuthenticated,
-}: {
- compliancePortal: CompliancePortalGraphCurrentQuery$data["currentCompliancePortal"];
- isAuthenticated: boolean;
-}) {
- const compliancePortalId = compliancePortal?.id;
- const { __ } = useTranslate();
- const { toast } = useToast();
- const theme = useSystemTheme();
- const [searchParams] = useSearchParams();
- const navigate = useNavigate();
- const location = useLocation();
-
- const logoFileUrl = theme === "dark"
- ? (compliancePortal?.darkLogo?.downloadUrl ?? compliancePortal?.logo?.downloadUrl)
- : compliancePortal?.logo?.downloadUrl;
-
- const [requestAllAccesses, isRequestingAccess]
- = useMutation(
- requestAllAccessesMutation,
- );
-
- const [subscribeToMailingList, isSubscribing]
- = useMutation(
- subscribeToMailingListMutation,
- );
-
- const [unsubscribeFromMailingList, isUnsubscribing]
- = useMutation(
- unsubscribeFromMailingListMutation,
- );
-
- const handleRequestAllAccesses = () => {
- requestAllAccesses({
- variables: {},
- onCompleted: (_, errors) => {
- if (errors?.length) {
- toast({
- title: __("Error"),
- description: formatError(__("Cannot request access"), errors),
- variant: "error",
- });
- return;
- }
- toast({
- title: __("Success"),
- description: __("Access request submitted successfully."),
- variant: "success",
- });
-
- window.location.href = location.pathname;
- },
- onError: (error) => {
- if (error instanceof UnAuthenticatedError) {
- searchParams.set("request-all", "true");
- const urlSearchParams = new URLSearchParams([[
- "continue",
- window.location.origin + location.pathname + "?" + searchParams.toString(),
- ]]);
- void navigate(`/connect?${urlSearchParams.toString()}`);
-
- return;
- }
-
- toast({
- title: __("Error"),
- description: error.message ?? __("Cannot request access"),
- variant: "error",
- });
- },
- });
- };
-
- const handleSubscribe = () => {
- subscribeToMailingList({
- variables: {},
- updater: (store, data) => {
- const subscription = data?.subscribeToMailingList?.subscription;
- if (!subscription?.id || !compliancePortalId) return;
- const compliancePortalRecord = store.get(compliancePortalId);
- if (!compliancePortalRecord) return;
- const subscriptionRecord = store.get(subscription.id);
- if (!subscriptionRecord) return;
- compliancePortalRecord.setLinkedRecord(subscriptionRecord, "viewerSubscription");
- },
- onCompleted: (_, errors) => {
- if (errors?.length) {
- toast({
- title: __("Error"),
- description: formatError(__("Cannot subscribe"), errors),
- variant: "error",
- });
- return;
- }
- toast({
- title: __("Subscribed"),
- description: __("You will be notified of security updates."),
- variant: "success",
- });
- },
- onError: (error) => {
- toast({
- title: __("Error"),
- description: error.message ?? __("Cannot subscribe"),
- variant: "error",
- });
- },
- });
- };
-
- const handleUnsubscribe = () => {
- unsubscribeFromMailingList({
- variables: {},
- onCompleted: (_, errors) => {
- if (errors?.length) {
- toast({
- title: __("Error"),
- description: formatError(__("Cannot unsubscribe"), errors),
- variant: "error",
- });
- return;
- }
- toast({
- title: __("Unsubscribed"),
- description: __("You will no longer receive security updates."),
- variant: "success",
- });
- },
- onError: (error) => {
- toast({
- title: __("Error"),
- description: error.message ?? __("Cannot unsubscribe"),
- variant: "error",
- });
- },
- });
- };
-
- if (!compliancePortal) {
- return null;
- }
-
- return (
-
-
- {logoFileUrl
- ? (
-
- )
- : (
-
- )}
-
- );
-}
diff --git a/apps/trust/src/components/PageError.tsx b/apps/trust/src/components/PageError.tsx
deleted file mode 100644
index b67ede768..000000000
--- a/apps/trust/src/components/PageError.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useTranslate } from "@probo/i18n";
-import {
- Button,
- ErrorDetailMessage,
- ErrorDetails,
- ErrorLayout,
-} from "@probo/ui";
-import { useEffect, useRef } from "react";
-import { Link, useLocation, useRouteError } from "react-router";
-
-type Props = {
- resetErrorBoundary?: () => void;
- error?: Error;
-};
-
-export function PageError({ resetErrorBoundary, error: propsError }: Props) {
- const routeError = useRouteError();
- const error = routeError ?? propsError;
- const { __ } = useTranslate();
- const location = useLocation();
- const baseLocation = useRef(location);
-
- const isFullPage = Boolean(routeError ?? propsError);
-
- // Reset error boundary on page change
- useEffect(() => {
- if (
- location.pathname !== baseLocation.current.pathname
- && resetErrorBoundary
- ) {
- resetErrorBoundary();
- }
- }, [location, resetErrorBoundary]);
-
- const actions = (
-
- );
-
- const layoutProps = {
- fullPage: isFullPage,
- showLogo: isFullPage,
- actions,
- };
-
- if (!error) {
- return (
-
- );
- }
-
- if (error instanceof Error
- && error.message
- .toLowerCase()
- .match(/(token|expired|invalid|401|unauthorized)/)
- ) {
- const isExpiredToken = error.message.toLowerCase().includes("expired");
- const title = isExpiredToken
- ? __("Expired token")
- : __("Invalid Access Link");
- const description = isExpiredToken
- ? __(
- "This access link has expired. Compliance page access links are valid for 7 days for security reasons.",
- )
- : __(
- "This access link is not valid. It may have been revoked or the link might be incorrect.",
- );
- return (
-
- );
- }
-
- return (
-
- {error instanceof Error && (
-
- {error.message}
-
- )}
-
- );
-}
diff --git a/apps/trust/src/components/RootErrorBoundary.tsx b/apps/trust/src/components/RootErrorBoundary.tsx
deleted file mode 100644
index 90daa68da..000000000
--- a/apps/trust/src/components/RootErrorBoundary.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { FullNameRequiredError, NDASignatureRequiredError, UnAuthenticatedError } from "@probo/relay";
-import { Navigate, useLocation, useRouteError } from "react-router";
-
-import { PageError } from "./PageError";
-
-export function RootErrorBoundary() {
- const error = useRouteError();
- const location = useLocation();
-
- const search = new URLSearchParams();
-
- if (location.pathname !== "/" || location.search !== "") {
- search.set("continue", window.location.href);
- }
-
- const queryString = search.toString();
-
- if (error instanceof UnAuthenticatedError) {
- return (
-
- );
- }
-
- if (error instanceof FullNameRequiredError) {
- return (
-
- );
- }
-
- if (error instanceof NDASignatureRequiredError) {
- return (
-
- );
- }
-
- return ;
-}
diff --git a/apps/trust/src/components/RowHeader.tsx b/apps/trust/src/components/RowHeader.tsx
deleted file mode 100644
index e3af96a96..000000000
--- a/apps/trust/src/components/RowHeader.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import type { PropsWithChildren } from "react";
-
-export function RowHeader({ children }: PropsWithChildren) {
- return (
-
- {children}
-
- );
-}
diff --git a/apps/trust/src/components/Rows.tsx b/apps/trust/src/components/Rows.tsx
deleted file mode 100644
index bff9d35a0..000000000
--- a/apps/trust/src/components/Rows.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { clsx } from "clsx";
-import type { PropsWithChildren } from "react";
-
-export function Rows({
- children,
- className,
-}: PropsWithChildren<{ className?: string }>) {
- return (
-
- {children}
-
- );
-}
diff --git a/apps/trust/src/components/Skeletons/MainSkeleton.tsx b/apps/trust/src/components/Skeletons/MainSkeleton.tsx
deleted file mode 100644
index c1677c5e6..000000000
--- a/apps/trust/src/components/Skeletons/MainSkeleton.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { getCompliancePortalUrl } from "@probo/helpers";
-import { useTranslate } from "@probo/i18n";
-import { Skeleton, TabLink, Tabs } from "@probo/ui";
-
-import { TabSkeleton } from "./TabSkeleton";
-
-export function MainSkeleton() {
- const { __ } = useTranslate();
- return (
-
- );
-}
diff --git a/apps/trust/src/components/Skeletons/TabSkeleton.tsx b/apps/trust/src/components/Skeletons/TabSkeleton.tsx
deleted file mode 100644
index 83614a7e5..000000000
--- a/apps/trust/src/components/Skeletons/TabSkeleton.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { Skeleton } from "@probo/ui";
-
-export function TabSkeleton() {
- return (
-
-
-
-
-
- );
-}
diff --git a/apps/trust/src/components/SubprocessorRow.tsx b/apps/trust/src/components/SubprocessorRow.tsx
deleted file mode 100644
index 2e1494ecd..000000000
--- a/apps/trust/src/components/SubprocessorRow.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { faviconUrl, getCountryName } from "@probo/helpers";
-import { useTranslate } from "@probo/i18n";
-import { IconPin } from "@probo/ui";
-import { useFragment } from "react-relay";
-import { graphql } from "relay-runtime";
-
-import type { SubprocessorRowFragment$key } from "./__generated__/SubprocessorRowFragment.graphql";
-
-const subprocessorRowFragment = graphql`
- fragment SubprocessorRowFragment on Subprocessor {
- name
- description
- websiteUrl
- countries
- }
-`;
-
-export function SubprocessorRow(props: { subprocessor: SubprocessorRowFragment$key; hasAnyCountries?: boolean }) {
- const subprocessor = useFragment(subprocessorRowFragment, props.subprocessor);
- const logo = faviconUrl(subprocessor.websiteUrl);
- const { __ } = useTranslate();
-
- return (
-
- );
-}
diff --git a/apps/trust/src/helpers/documents.ts b/apps/trust/src/helpers/documents.ts
deleted file mode 100644
index b9f53b7be..000000000
--- a/apps/trust/src/helpers/documents.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-export function documentTypeLabel(type: string, __: (s: string) => string) {
- switch (type) {
- case "POLICY":
- return __("Policy");
- case "GOVERNANCE":
- return __("Governance");
- case "PROCEDURE":
- return __("Procedure");
- case "PLAN":
- return __("Plan");
- case "REGISTER":
- return __("Register");
- case "RECORD":
- return __("Record");
- case "REPORT":
- return __("Report");
- case "TEMPLATE":
- return __("Template");
- default:
- return __("Other");
- }
-}
diff --git a/apps/trust/src/hooks/useCompliancePortal.ts b/apps/trust/src/hooks/useCompliancePortal.ts
deleted file mode 100644
index 8dcd3385e..000000000
--- a/apps/trust/src/hooks/useCompliancePortal.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useContext } from "react";
-
-import { CompliancePortalContext } from "#/providers/CompliancePortalProvider";
-
-export function useCompliancePortal(): {
- id: string;
- entityName: string;
-} {
- const context = useContext(CompliancePortalContext);
- if (!context) {
- throw new Error("useCompliancePortal must be used within a CompliancePortalProvider");
- }
- return context;
-}
diff --git a/apps/trust/src/hooks/useFormWithSchema.ts b/apps/trust/src/hooks/useFormWithSchema.ts
deleted file mode 100644
index 4534edbcf..000000000
--- a/apps/trust/src/hooks/useFormWithSchema.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
-import { type FieldValues, useForm, type UseFormReturn } from "react-hook-form";
-import type { z } from "zod";
-
-export function useFormWithSchema>(
- schema: T,
- options: Parameters, unknown, z.output>>[0],
-): UseFormReturn, unknown, z.output> {
- return useForm, unknown, z.output>({
- ...options,
- resolver: standardSchemaResolver(schema),
- });
-}
diff --git a/apps/trust/src/hooks/useMutationWithToast.ts b/apps/trust/src/hooks/useMutationWithToast.ts
deleted file mode 100644
index 90fca2a5d..000000000
--- a/apps/trust/src/hooks/useMutationWithToast.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useTranslate } from "@probo/i18n";
-import { useToast } from "@probo/ui";
-import { useCallback } from "react";
-import { useMutation, type UseMutationConfig } from "react-relay";
-import type { GraphQLTaggedNode, MutationParameters } from "relay-runtime";
-
-/**
- * A decorated useMutation hook that emits toast notifications on success or error.
- */
-export function useMutationWithToasts(
- query: GraphQLTaggedNode,
- baseOptions?: {
- onSuccess?: (response: T["response"]) => void;
- errorMessage?: string;
- },
-) {
- const [mutate, isLoading] = useMutation(query);
- const { toast } = useToast();
- const { __ } = useTranslate();
- const mutateWithToast = useCallback(
- (
- queryOptions: UseMutationConfig & {
- onSuccess?: (response: T["response"]) => void;
- errorMessage?: string;
- },
- ) => {
- const options = { ...baseOptions, ...queryOptions };
- return new Promise((resolve, reject) =>
- mutate({
- ...queryOptions,
- onCompleted: (response, error) => {
- options.onCompleted?.(response, error);
- if (error) {
- toast({
- title: __("Error"),
- description:
- options.errorMessage
- ?? __("Failed to commit this operation."),
- variant: "error",
- });
- reject(error instanceof Error ? error : new Error(__("Failed to commit this operation.")));
- return;
- }
- options.onSuccess?.(response);
- resolve();
- },
- onError: (error) => {
- toast({
- title: __("Error"),
- description:
- options.errorMessage ?? __("Failed to commit this operation."),
- variant: "error",
- });
- reject(error);
- },
- }),
- );
- },
- [mutate, toast, __, baseOptions],
- );
-
- return [mutateWithToast, isLoading] as const;
-}
diff --git a/apps/trust/src/hooks/useRequestAccessCallback.ts b/apps/trust/src/hooks/useRequestAccessCallback.ts
deleted file mode 100644
index 41b8768d5..000000000
--- a/apps/trust/src/hooks/useRequestAccessCallback.ts
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { formatError, type GraphQLError } from "@probo/helpers";
-import { useTranslate } from "@probo/i18n";
-import { useToast } from "@probo/ui";
-import { useEffect } from "react";
-import { useMutation } from "react-relay";
-import { useLocation, useSearchParams } from "react-router";
-import { graphql } from "relay-runtime";
-
-import type { useRequestAccessCallback_allMutation } from "./__generated__/useRequestAccessCallback_allMutation.graphql";
-import type { useRequestAccessCallback_documentMutation } from "./__generated__/useRequestAccessCallback_documentMutation.graphql";
-import type { useRequestAccessCallback_fileMutation } from "./__generated__/useRequestAccessCallback_fileMutation.graphql";
-import type { useRequestAccessCallback_reportMutation } from "./__generated__/useRequestAccessCallback_reportMutation.graphql";
-
-const documentMutation = graphql`
- mutation useRequestAccessCallback_documentMutation(
- $input: RequestDocumentAccessInput!
- ) {
- requestDocumentAccess(input: $input) {
- document {
- access {
- id
- status
- }
- }
- }
- }
-`;
-
-const reportMutation = graphql`
- mutation useRequestAccessCallback_reportMutation(
- $input: RequestReportAccessInput!
- ) {
- requestReportAccess(input: $input) {
- audit {
- reportFile {
- access {
- id
- status
- }
- }
- }
- }
- }
-`;
-
-const fileMutation = graphql`
- mutation useRequestAccessCallback_fileMutation(
- $input: RequestCompliancePortalFileAccessInput!
- ) {
- requestCompliancePortalFileAccess(input: $input) {
- file {
- access {
- id
- status
- }
- }
- }
- }
-`;
-
-const allMutation = graphql`
- mutation useRequestAccessCallback_allMutation {
- requestAllAccesses {
- compliancePortalAccess {
- id
- }
- }
- }
-`;
-
-function errorToastArgs(__: (s: string) => string, error: GraphQLError | GraphQLError[]) {
- return {
- title: __("Error"),
- description: formatError(__("Cannot request access"), error),
- variant: "error" as const,
- };
-}
-
-function successToastArgs(__: (s: string) => string) {
- return {
- title: __("Success"),
- description: __("Access request submitted successfully."),
- variant: "success" as const,
- };
-}
-
-export function useRequestAccessCallback() {
- const [searchParams, setSearchParams] = useSearchParams();
- const location = useLocation();
-
- const documentId = searchParams.get("request-document-id");
- const reportId = searchParams.get("request-report-id");
- const fileId = searchParams.get("request-file-id");
- const all = searchParams.get("request-all");
-
- const { __ } = useTranslate();
- const { toast } = useToast();
-
- const [requestDocumentAccess] = useMutation(documentMutation);
- const [requestReportAccess] = useMutation(reportMutation);
- const [requestFileAccess] = useMutation(fileMutation);
- const [requestAll] = useMutation(allMutation);
-
- useEffect(() => {
- if (documentId) {
- searchParams.delete("request-document-id");
- void requestDocumentAccess({
- variables: {
- input: { documentId },
- },
- onCompleted: (_, errors) => {
- if (errors?.length) {
- toast(errorToastArgs(__, errors));
- return;
- }
-
- toast(successToastArgs(__));
- },
- onError: (error) => {
- toast(errorToastArgs(__, error));
- },
- });
- setSearchParams(searchParams);
- } else if (reportId) {
- searchParams.delete("request-report-id");
- void requestReportAccess({
- variables: {
- input: { reportId },
- },
- onCompleted: (_, errors) => {
- if (errors?.length) {
- toast(errorToastArgs(__, errors));
- return;
- }
-
- toast(successToastArgs(__));
- },
- onError: (error) => {
- toast(errorToastArgs(__, error));
- },
- });
- setSearchParams(searchParams);
- } else if (fileId) {
- searchParams.delete("request-file-id");
- void requestFileAccess({
- variables: {
- input: { compliancePortalFileId: fileId },
- },
- onCompleted: (_, errors) => {
- if (errors?.length) {
- toast(errorToastArgs(__, errors));
- return;
- }
-
- toast(successToastArgs(__));
- },
- onError: (error) => {
- toast(errorToastArgs(__, error));
- },
- });
- setSearchParams(searchParams);
- } else if (all) {
- searchParams.delete("request-all");
- void requestAll({
- variables: {},
- onCompleted: (_, errors) => {
- if (errors?.length) {
- toast(errorToastArgs(__, errors));
- return;
- }
-
- toast(successToastArgs(__));
- window.location.href = window.location.origin + location.pathname;
- },
- onError: (error) => {
- toast(errorToastArgs(__, error));
- },
- });
- setSearchParams(searchParams);
- }
- }, [
- documentId,
- reportId,
- fileId,
- all,
- __,
- requestDocumentAccess,
- requestReportAccess,
- requestFileAccess,
- requestAll,
- searchParams,
- setSearchParams,
- toast,
- location,
- ]);
-}
diff --git a/apps/trust/src/hooks/useSafeContinueUrl.ts b/apps/trust/src/hooks/useSafeContinueUrl.ts
deleted file mode 100644
index e42bdc446..000000000
--- a/apps/trust/src/hooks/useSafeContinueUrl.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useMemo } from "react";
-import { useSearchParams } from "react-router";
-
-export function useSafeContinueUrl(): URL {
- const [searchParams] = useSearchParams();
-
- const continueUrlParam = searchParams.get("continue");
- const fallback = window.location.origin + "/";
-
- const safeContinueUrl = useMemo(() => {
- if (continueUrlParam) {
- let continueUrl: URL;
- try {
- continueUrl = new URL(continueUrlParam, window.location.origin);
- } catch {
- return new URL(fallback, window.location.origin);
- }
- if (
- continueUrl.origin === window.location.origin
- && continueUrl.pathname.startsWith("/")
- ) {
- return new URL(
- continueUrl.pathname + continueUrl.search,
- window.location.origin,
- );
- }
- return new URL(fallback, window.location.origin);
- }
- return new URL(fallback, window.location.origin);
- }, [continueUrlParam, fallback]);
-
- return safeContinueUrl;
-}
diff --git a/apps/trust/src/index.css b/apps/trust/src/index.css
deleted file mode 100644
index a4e4ea3fb..000000000
--- a/apps/trust/src/index.css
+++ /dev/null
@@ -1,10 +0,0 @@
-@import url("https://fonts.googleapis.com/css2?family=Geist:wght@100..900&display=swap");
-@import "tailwindcss";
-@import "@probo/ui/src/theme.css";
-@import "tw-animate-css";
-@source "../../../packages/ui/src";
-@source "../../../packages/helpers/src";
-
-.react-pdf__Page__annotations.annotationLayer {
- display: none;
-}
diff --git a/apps/trust/src/layouts/MainLayout.tsx b/apps/trust/src/layouts/MainLayout.tsx
deleted file mode 100644
index 69408722f..000000000
--- a/apps/trust/src/layouts/MainLayout.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useFavicon, useSystemTheme } from "@probo/hooks";
-import { useTranslate } from "@probo/i18n";
-import { Logo, TabLink, Tabs } from "@probo/ui";
-import { type PreloadedQuery, usePreloadedQuery } from "react-relay";
-import { Outlet } from "react-router";
-
-import { OrganizationSidebar } from "#/components/OrganizationSidebar";
-import { useRequestAccessCallback } from "#/hooks/useRequestAccessCallback";
-import { CompliancePortalProvider } from "#/providers/CompliancePortalProvider";
-import type { CompliancePortalGraphCurrentQuery } from "#/queries/__generated__/CompliancePortalGraphCurrentQuery.graphql";
-import { currentCompliancePortalGraphQuery } from "#/queries/CompliancePortalGraph";
-
-type Props = {
- queryRef: PreloadedQuery;
-};
-
-export function MainLayout(props: Props) {
- const { __ } = useTranslate();
- const data = usePreloadedQuery(currentCompliancePortalGraphQuery, props.queryRef);
- const compliancePortal = data.currentCompliancePortal;
- const isAuthenticated = data.viewer != null;
-
- const theme = useSystemTheme();
-
- useFavicon(
- theme === "dark"
- ? (compliancePortal?.darkLogo?.downloadUrl ?? compliancePortal?.logo?.downloadUrl)
- : compliancePortal?.logo?.downloadUrl,
- );
- useRequestAccessCallback();
-
- return (
-
-
- {__("This file cannot be previewed in the browser.")}
-
-
-
-
- )
- )
- )
- : (
-
-
-
-
- {nodeTitle}
-
-
- {__("This document requires access approval before viewing.")}
-
-
-
-
- )}
-
-
- );
-}
diff --git a/apps/trust/src/pages/DocumentPageLoader.tsx b/apps/trust/src/pages/DocumentPageLoader.tsx
deleted file mode 100644
index 848f86d53..000000000
--- a/apps/trust/src/pages/DocumentPageLoader.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useEffect } from "react";
-import { useQueryLoader } from "react-relay";
-import { useParams } from "react-router";
-
-import { RelayProvider } from "#/providers/RelayProviders";
-
-import type { DocumentPageQuery } from "./__generated__/DocumentPageQuery.graphql";
-import { DocumentPage, documentPageQuery } from "./DocumentPage";
-
-function DocumentPageQueryLoader() {
- const { documentId } = useParams<{ documentId: string }>();
- const [queryRef, loadQuery] = useQueryLoader(documentPageQuery);
-
- useEffect(() => {
- if (documentId) {
- loadQuery({ alias: documentId });
- }
- }, [documentId, loadQuery]);
-
- if (!queryRef) return null;
-
- return ;
-}
-
-export default function DocumentPageLoader() {
- return (
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/DocumentsPage.tsx b/apps/trust/src/pages/DocumentsPage.tsx
deleted file mode 100644
index 91c372199..000000000
--- a/apps/trust/src/pages/DocumentsPage.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { groupBy, objectEntries } from "@probo/helpers";
-import { useTranslate } from "@probo/i18n";
-import { Fragment } from "react";
-import { type PreloadedQuery, usePreloadedQuery } from "react-relay";
-
-import { CompliancePortalFileRow } from "#/components/CompliancePortalFileRow";
-import { DocumentRow } from "#/components/DocumentRow";
-import { RowHeader } from "#/components/RowHeader";
-import { Rows } from "#/components/Rows";
-import { documentTypeLabel } from "#/helpers/documents";
-import type { CompliancePortalGraphCurrentDocumentsQuery } from "#/queries/__generated__/CompliancePortalGraphCurrentDocumentsQuery.graphql";
-import { currentTrustDocumentsQuery } from "#/queries/CompliancePortalGraph";
-
-type Props = {
- queryRef: PreloadedQuery;
-};
-
-export function DocumentsPage({ queryRef }: Props) {
- const { __ } = useTranslate();
- const data = usePreloadedQuery(
- currentTrustDocumentsQuery,
- queryRef,
- );
- const documents
- = data.currentCompliancePortal?.documents.edges.map(edge => edge.node) ?? [];
- const files
- = data.currentCompliancePortal?.compliancePortalFiles.edges.map(edge => edge.node) ?? [];
- const documentsPerType = groupBy(documents, document =>
- documentTypeLabel(document.documentType, __),
- );
- const filesPerCategory = groupBy(files, file => file.category);
- return (
-
-
{__("Documents")}
-
- {__("Security and compliance documentation:")}
-
- );
-}
diff --git a/apps/trust/src/pages/NDAPageLoader.tsx b/apps/trust/src/pages/NDAPageLoader.tsx
deleted file mode 100644
index b3dbd4bee..000000000
--- a/apps/trust/src/pages/NDAPageLoader.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useEffect } from "react";
-import { useQueryLoader } from "react-relay";
-
-import { RelayProvider } from "#/providers/RelayProviders";
-
-import type { NDAPageQuery } from "./__generated__/NDAPageQuery.graphql";
-import { NDAPage, ndaPageQuery } from "./NDAPage";
-
-function NDAPageQueryLoader() {
- const [queryRef, loadQuery]
- = useQueryLoader(ndaPageQuery);
-
- useEffect(() => {
- if (!queryRef) {
- loadQuery({});
- }
- });
-
- if (!queryRef) return null;
-
- return ;
-}
-
-export default function NDAPageLoader() {
- return (
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/OverviewPage.tsx b/apps/trust/src/pages/OverviewPage.tsx
deleted file mode 100644
index ca2eb1f3e..000000000
--- a/apps/trust/src/pages/OverviewPage.tsx
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import {
- getCompliancePortalUrl,
- groupBy,
- objectEntries,
- sprintf,
-} from "@probo/helpers";
-import { useTranslate } from "@probo/i18n";
-import { Card, IconChevronRight } from "@probo/ui";
-import { Fragment } from "react";
-import { useFragment } from "react-relay";
-import { Link, useOutletContext } from "react-router";
-import { graphql } from "relay-runtime";
-
-import { AuditRow } from "#/components/AuditRow";
-import { CompliancePortalFileRow } from "#/components/CompliancePortalFileRow";
-import { DocumentRow } from "#/components/DocumentRow";
-import { RowHeader } from "#/components/RowHeader";
-import { Rows } from "#/components/Rows";
-import { SubprocessorRow } from "#/components/SubprocessorRow";
-import { documentTypeLabel } from "#/helpers/documents";
-import type { CompliancePortalGraphCurrentQuery$data } from "#/queries/__generated__/CompliancePortalGraphCurrentQuery.graphql";
-
-import type {
- OverviewPageFragment$data,
- OverviewPageFragment$key,
-} from "./__generated__/OverviewPageFragment.graphql";
-
-const overviewFragment = graphql`
- fragment OverviewPageFragment on CompliancePortal {
- references(first: 14) {
- edges {
- node {
- id
- name
- logo {
- downloadUrl
- }
- websiteUrl
- }
- }
- }
- subprocessors(first: 3) {
- edges {
- node {
- id
- countries
- ...SubprocessorRowFragment
- }
- }
- }
- documents(first: 5) {
- edges {
- node {
- id
- documentType
- ...DocumentRowFragment
- }
- }
- }
- compliancePortalFiles(first: 5) {
- edges {
- node {
- id
- category
- ...CompliancePortalFileRowFragment
- }
- }
- }
- }
-`;
-
-export function OverviewPage() {
- const { compliancePortal } = useOutletContext<{
- compliancePortal: OverviewPageFragment$key
- & CompliancePortalGraphCurrentQuery$data["currentCompliancePortal"];
- }>();
- const fragment = useFragment(overviewFragment, compliancePortal);
- return (
-
- );
-}
diff --git a/apps/trust/src/pages/SubprocessorsPage.tsx b/apps/trust/src/pages/SubprocessorsPage.tsx
deleted file mode 100644
index 338ced46b..000000000
--- a/apps/trust/src/pages/SubprocessorsPage.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { sprintf } from "@probo/helpers";
-import { useTranslate } from "@probo/i18n";
-import { type PreloadedQuery, usePreloadedQuery } from "react-relay";
-
-import { Rows } from "#/components/Rows";
-import { SubprocessorRow } from "#/components/SubprocessorRow";
-import type { CompliancePortalGraphCurrentSubprocessorsQuery } from "#/queries/__generated__/CompliancePortalGraphCurrentSubprocessorsQuery.graphql";
-import { currentTrustSubprocessorsQuery } from "#/queries/CompliancePortalGraph";
-
-type Props = {
- queryRef: PreloadedQuery;
-};
-
-export function SubprocessorsPage({ queryRef }: Props) {
- const { __ } = useTranslate();
- const data = usePreloadedQuery(currentTrustSubprocessorsQuery, queryRef);
- const subprocessors
- = data.currentCompliancePortal?.subprocessors.edges.map(edge => edge.node) ?? [];
-
- const hasAnyCountries = subprocessors.some(subprocessor => subprocessor.countries.length > 0);
-
- return (
-
- );
-}
diff --git a/apps/trust/src/pages/UpdatesPage.tsx b/apps/trust/src/pages/UpdatesPage.tsx
deleted file mode 100644
index d98863cfe..000000000
--- a/apps/trust/src/pages/UpdatesPage.tsx
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useTranslate } from "@probo/i18n";
-import { IconChevronDown } from "@probo/ui";
-import { useState } from "react";
-import { type PreloadedQuery, usePreloadedQuery } from "react-relay";
-import { graphql } from "relay-runtime";
-
-import { Rows } from "#/components/Rows";
-import type { UpdatesPageQuery } from "#/pages/__generated__/UpdatesPageQuery.graphql";
-
-export const currentTrustUpdatesQuery = graphql`
- query UpdatesPageQuery {
- currentCompliancePortal {
- id
- updates(first: 50) {
- edges {
- node {
- id
- title
- body
- updatedAt
- }
- }
- }
- }
- }
-`;
-
-type Props = {
- queryRef: PreloadedQuery;
-};
-
-export function UpdatesPage({ queryRef }: Props) {
- const { __ } = useTranslate();
- const data = usePreloadedQuery(
- currentTrustUpdatesQuery,
- queryRef,
- );
-
- const items
- = data.currentCompliancePortal?.updates.edges.map(e => e.node) ?? [];
-
- return (
-
-
{__("Updates")}
- {items.length === 0
- ? (
-
-
- {__("No updates have been published yet.")}
-
-
- )
- : (
- <>
-
- {__("Latest compliance and security updates")}
-
- );
-}
diff --git a/apps/trust/src/pages/auth/AuthLayout.tsx b/apps/trust/src/pages/auth/AuthLayout.tsx
deleted file mode 100644
index 4dea72238..000000000
--- a/apps/trust/src/pages/auth/AuthLayout.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useSystemTheme } from "@probo/hooks";
-import { Card, Logo } from "@probo/ui";
-import { type PreloadedQuery, usePreloadedQuery } from "react-relay";
-import { Outlet } from "react-router";
-import { graphql } from "relay-runtime";
-
-import type { AuthLayoutQuery } from "./__generated__/AuthLayoutQuery.graphql";
-
-export const authLayoutQuery = graphql`
- query AuthLayoutQuery {
- currentCompliancePortal @required(action: THROW) {
- logo {
- downloadUrl
- }
- darkLogo {
- downloadUrl
- }
- }
- }
-`;
-
-export function AuthLayout(props: { queryRef: PreloadedQuery }) {
- const { queryRef } = props;
-
- const { currentCompliancePortal: compliancePage } = usePreloadedQuery(authLayoutQuery, queryRef);
- const theme = useSystemTheme();
-
- const logoFileUrl = theme === "dark"
- ? compliancePage.darkLogo?.downloadUrl ?? compliancePage.logo?.downloadUrl
- : compliancePage.logo?.downloadUrl;
-
- return (
-
-
-
- {logoFileUrl
- ? (
-
- )
- : }
-
-
-
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/auth/AuthLayoutLoader.tsx b/apps/trust/src/pages/auth/AuthLayoutLoader.tsx
deleted file mode 100644
index bf26b7684..000000000
--- a/apps/trust/src/pages/auth/AuthLayoutLoader.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useEffect } from "react";
-import { useQueryLoader } from "react-relay";
-
-import { RelayProvider } from "#/providers/RelayProviders";
-
-import type { AuthLayoutQuery } from "./__generated__/AuthLayoutQuery.graphql";
-import { AuthLayout, authLayoutQuery } from "./AuthLayout";
-
-function AuthLayoutQueryLoader() {
- const [queryRef, loadQuery] = useQueryLoader(authLayoutQuery);
-
- useEffect(() => {
- if (!queryRef) {
- return loadQuery({});
- }
- });
-
- if (!queryRef) return null;
-
- return ;
-}
-
-export default function AuthLayoutLoader() {
- return (
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/auth/ConnectPage.tsx b/apps/trust/src/pages/auth/ConnectPage.tsx
deleted file mode 100644
index 9ca7486fd..000000000
--- a/apps/trust/src/pages/auth/ConnectPage.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { usePageTitle } from "@probo/hooks";
-import { useTranslate } from "@probo/i18n";
-import { Button } from "@probo/ui";
-import { type PreloadedQuery, usePreloadedQuery } from "react-relay";
-import { graphql } from "relay-runtime";
-
-import { useSafeContinueUrl } from "#/hooks/useSafeContinueUrl";
-
-import type { ConnectPageQuery } from "./__generated__/ConnectPageQuery.graphql";
-
-export const connectPageQuery = graphql`
- query ConnectPageQuery {
- currentCompliancePortal @required(action: THROW) {
- entityName
- }
- }
-`;
-
-export function ConnectPage(props: {
- queryRef: PreloadedQuery;
-}) {
- const { queryRef } = props;
-
- const { __ } = useTranslate();
- const safeContinueUrl = useSafeContinueUrl();
-
- const {
- currentCompliancePortal: { entityName },
- } = usePreloadedQuery(connectPageQuery, queryRef);
-
- usePageTitle(__(`Connect to ${entityName}'s Compliance Page`));
-
- const initiateURL = new URL("/initiate", window.location.origin);
- initiateURL.searchParams.set("continue", safeContinueUrl.toString());
-
- return (
-
-
-
- {__(`Connect to ${entityName}'s Compliance Page`)}
-
-
- {__(
- "Sign in to start requesting access to documents",
- )}
-
-
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/auth/ConnectPageLoader.tsx b/apps/trust/src/pages/auth/ConnectPageLoader.tsx
deleted file mode 100644
index f468c8c25..000000000
--- a/apps/trust/src/pages/auth/ConnectPageLoader.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { Suspense, useEffect } from "react";
-import { useQueryLoader } from "react-relay";
-
-import { RelayProvider } from "#/providers/RelayProviders";
-
-import type { ConnectPageQuery } from "./__generated__/ConnectPageQuery.graphql";
-import { ConnectPage, connectPageQuery } from "./ConnectPage";
-
-function ConnectPageQueryLoader() {
- const [queryRef, loadQuery]
- = useQueryLoader(connectPageQuery);
-
- useEffect(() => {
- if (!queryRef) {
- loadQuery({});
- }
- });
-
- if (!queryRef) return null;
-
- return (
-
-
-
- );
-}
-
-export default function ConnectPageLoader() {
- return (
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/auth/FullNamePage.tsx b/apps/trust/src/pages/auth/FullNamePage.tsx
deleted file mode 100644
index ddc8a849f..000000000
--- a/apps/trust/src/pages/auth/FullNamePage.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import type { GraphQLError } from "@probo/helpers";
-import { useTranslate } from "@probo/i18n";
-import { Button, Field, useToast } from "@probo/ui";
-import {
- useMutation,
-} from "react-relay";
-import { useSearchParams } from "react-router";
-import { graphql } from "relay-runtime";
-import { z } from "zod";
-
-import { useFormWithSchema } from "#/hooks/useFormWithSchema";
-
-import type { FullNamePageMutation } from "./__generated__/FullNamePageMutation.graphql";
-
-const updateMutation = graphql`
- mutation FullNamePageMutation($input: UpdateFullNameInput!) {
- updateFullName(input: $input) {
- success
- }
- }
-`;
-
-const schema = z.object({
- fullName: z.string().min(2),
-});
-
-type FormData = z.infer;
-
-export default function FullNamePage() {
- const { __ } = useTranslate();
- const { toast } = useToast();
- const [searchParams] = useSearchParams();
-
- const continueUrlParam = searchParams.get("continue");
- let safeContinueUrl: string;
- if (continueUrlParam) {
- try {
- const continueUrl = new URL(continueUrlParam, window.location.origin);
- if (continueUrl.origin === window.location.origin && continueUrl.pathname.startsWith("/")) {
- safeContinueUrl = window.location.origin + continueUrl.pathname + continueUrl.search;
- } else {
- safeContinueUrl = window.location.origin;
- }
- } catch {
- safeContinueUrl = window.location.origin;
- }
- } else {
- safeContinueUrl = window.location.origin;
- }
-
- const {
- handleSubmit: handleSubmitWrapper,
- register,
- formState,
- } = useFormWithSchema(schema, {
- defaultValues: {
- fullName: "",
- },
- });
-
- const [update] = useMutation(
- updateMutation,
- );
-
- const handleSubmit = handleSubmitWrapper(({ fullName }: FormData) => {
- update({
- variables: {
- input: {
- fullName,
- },
- },
- onCompleted: (_, errors: GraphQLError[] | null) => {
- if (errors) {
- for (const err of errors) {
- if (err.extensions?.code === "ALREADY_AUTHENTICATED") {
- window.location.href = "/";
- return;
- }
- }
- toast({
- title: __("Error"),
- description: __("Cannot send magic link"),
- variant: "error",
- });
- return;
- }
-
- toast({
- title: __("Success"),
- description: __("Full name updated!"),
- variant: "success",
- });
-
- window.location.href = safeContinueUrl;
- },
- onError: (error) => {
- toast({
- title: __("Error"),
- description: error.message,
- variant: "error",
- });
- },
- });
- });
-
- return (
-
-
-
- {__("Please set your profile's full name")}
-
-
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/auth/MagicLinkAlreadyUsedPage.tsx b/apps/trust/src/pages/auth/MagicLinkAlreadyUsedPage.tsx
deleted file mode 100644
index ba3798a81..000000000
--- a/apps/trust/src/pages/auth/MagicLinkAlreadyUsedPage.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { usePageTitle } from "@probo/hooks";
-import { useTranslate } from "@probo/i18n";
-import { Button } from "@probo/ui";
-import { useNavigate } from "react-router";
-
-export default function MagicLinkAlreadyUsedPage() {
- const { __ } = useTranslate();
- const navigate = useNavigate();
-
- usePageTitle(__("Link Already Used"));
-
- return (
-
-
-
{__("Link Already Used")}
-
- {__(
- "This magic link has already been used. Magic links can only be used once. Please request a new one if you need to sign in again.",
- )}
-
-
-
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/auth/MagicLinkExpiredPage.tsx b/apps/trust/src/pages/auth/MagicLinkExpiredPage.tsx
deleted file mode 100644
index ab34083c9..000000000
--- a/apps/trust/src/pages/auth/MagicLinkExpiredPage.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { usePageTitle } from "@probo/hooks";
-import { useTranslate } from "@probo/i18n";
-import { Button } from "@probo/ui";
-import { useNavigate } from "react-router";
-
-export default function MagicLinkExpiredPage() {
- const { __ } = useTranslate();
- const navigate = useNavigate();
-
- usePageTitle(__("Link Expired"));
-
- return (
-
-
-
{__("Link Expired")}
-
- {__(
- "This magic link has expired. Magic links are only valid for 15 minutes. Please request a new one.",
- )}
-
-
-
-
-
-
- );
-}
diff --git a/apps/trust/src/pages/auth/_components/Divider.tsx b/apps/trust/src/pages/auth/_components/Divider.tsx
deleted file mode 100644
index 14c990c1d..000000000
--- a/apps/trust/src/pages/auth/_components/Divider.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-export function Divider({ children }: { children: React.ReactNode }) {
- return (
-
-
-
- {children}
-
-
- );
-}
diff --git a/apps/trust/src/pages/auth/_components/OIDCButton.tsx b/apps/trust/src/pages/auth/_components/OIDCButton.tsx
deleted file mode 100644
index bf250e473..000000000
--- a/apps/trust/src/pages/auth/_components/OIDCButton.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) 2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { useTranslate } from "@probo/i18n";
-import { Button, Google, Microsoft } from "@probo/ui";
-import type { ComponentProps } from "react";
-import { useFragment } from "react-relay";
-import { useSearchParams } from "react-router";
-import { graphql } from "relay-runtime";
-
-import { useSafeContinueUrl } from "#/hooks/useSafeContinueUrl";
-
-import type { OIDCButtonFragment$key } from "./__generated__/OIDCButtonFragment.graphql";
-
-const fragment = graphql`
- fragment OIDCButtonFragment on OIDCProviderInfo {
- name
- loginURL
- }
-`;
-
-const providerIcons: Record<
- string,
- (props: ComponentProps<"svg">) => React.ReactNode
-> = {
- google: Google,
- microsoft: Microsoft,
-};
-
-export function OIDCButton({
- providerRef,
-}: {
- providerRef: OIDCButtonFragment$key;
-}) {
- const { __ } = useTranslate();
- const [searchParams] = useSearchParams();
- const safeContinueUrl = useSafeContinueUrl();
- const provider = useFragment(fragment, providerRef);
- const Icon = providerIcons[provider.name];
- const organizationId = searchParams.get("organization-id");
-
- return (
-
- );
-}
diff --git a/apps/trust/src/providers/AuthProvider.tsx b/apps/trust/src/providers/AuthProvider.tsx
deleted file mode 100644
index 87d6dacad..000000000
--- a/apps/trust/src/providers/AuthProvider.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { createContext, useMemo } from "react";
-
-export const AuthContext = createContext({ isAuthenticated: false });
-
-type Props = {
- children: React.ReactNode;
- isAuthenticated: boolean;
-};
-
-export function AuthProvider({ children, isAuthenticated }: Props) {
- const value = useMemo(() => ({ isAuthenticated }), [isAuthenticated]);
- return {children};
-}
diff --git a/apps/trust/src/providers/CompliancePortalProvider.tsx b/apps/trust/src/providers/CompliancePortalProvider.tsx
deleted file mode 100644
index 31cc18684..000000000
--- a/apps/trust/src/providers/CompliancePortalProvider.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { createContext, type ReactNode } from "react";
-
-import type { CompliancePortalGraphCurrentQuery$data } from "#/queries/__generated__/CompliancePortalGraphCurrentQuery.graphql";
-
-export const CompliancePortalContext = createContext<
- CompliancePortalGraphCurrentQuery$data["currentCompliancePortal"] | null
->(null);
-
-export const CompliancePortalProvider = ({
- children,
- compliancePortal,
-}: {
- children: ReactNode;
- compliancePortal: CompliancePortalGraphCurrentQuery$data["currentCompliancePortal"];
-}) => {
- return (
-
- {children}
-
- );
-};
diff --git a/apps/trust/src/providers/RelayProviders.tsx b/apps/trust/src/providers/RelayProviders.tsx
deleted file mode 100644
index a1789a5e8..000000000
--- a/apps/trust/src/providers/RelayProviders.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { makeFetchQuery } from "@probo/relay";
-import type { PropsWithChildren } from "react";
-import { RelayEnvironmentProvider } from "react-relay";
-import {
- Environment,
- Network,
- RecordSource,
- Store,
-} from "relay-runtime";
-
-export function buildEndpoint(): string {
- let host = import.meta.env.VITE_API_URL;
-
- if (!host) {
- host = window.location.origin;
- }
-
- const formattedHost
- = host.startsWith("http://") || host.startsWith("https://")
- ? host
- : `https://${host}`;
-
- const url = new URL(formattedHost);
-
- // Compliance pages are always served at the root of a dedicated host.
- url.pathname = "/graphql";
-
- return url.toString();
-}
-
-const source = new RecordSource();
-const store = new Store(source, {
- queryCacheExpirationTime: 1 * 60 * 1000,
- gcReleaseBufferSize: 20,
-});
-
-export const consoleEnvironment = new Environment({
- configName: "compliance-page",
- network: Network.create(makeFetchQuery(buildEndpoint())),
- store,
-});
-
-/**
- * Provider for relay with the probo environment
- */
-export function RelayProvider({ children }: PropsWithChildren) {
- return (
-
- {children}
-
- );
-}
diff --git a/apps/trust/src/providers/TranslatorProvider.tsx b/apps/trust/src/providers/TranslatorProvider.tsx
deleted file mode 100644
index 32578e5df..000000000
--- a/apps/trust/src/providers/TranslatorProvider.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import type { PropsWithChildren } from "react";
-
-import { TranslatorProvider as ProboTranslatorProvider } from "../../../../packages/i18n/TranslatorProvider";
-
-// TODO : implement a way to retrieve translations strings
-const loader = () => {
- return Promise.resolve({} as Record);
-};
-
-/**
- * Provider for the translator
- */
-export function TranslatorProvider({ children }: PropsWithChildren) {
- return (
-
- {children}
-
- );
-}
diff --git a/apps/trust/src/queries/CompliancePortalGraph.ts b/apps/trust/src/queries/CompliancePortalGraph.ts
deleted file mode 100644
index a49a92725..000000000
--- a/apps/trust/src/queries/CompliancePortalGraph.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { graphql } from "relay-runtime";
-
-/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
-
-// Queries for custom domain (subdomain) approach
-export const currentCompliancePortalGraphQuery = graphql`
- query CompliancePortalGraphCurrentQuery {
- viewer {
- id
- }
- currentCompliancePortal @required(action: THROW) {
- id
- slug
- entityName
- description
- websiteUrl
- email
- headquarterAddress
- viewerSubscription {
- id
- email
- createdAt
- updatedAt
- }
- logo {
- downloadUrl
- }
- darkLogo {
- downloadUrl
- }
- nonDisclosureAgreement {
- fileName
- fileUrl
- viewerSignature {
- status
- }
- }
- customLinks(first: 20) {
- edges {
- node {
- id
- name
- url
- }
- }
- }
- ...OverviewPageFragment
- subprocessorInfo: subprocessors(first: 0) {
- totalCount
- }
- audits(first: 50) {
- edges {
- node {
- id
- ...AuditRowFragment
- }
- }
- }
- complianceFrameworks(first: 50) {
- edges {
- node {
- id
- framework {
- ...FrameworkBadgeFragment
- }
- }
- }
- }
- }
- }
-`;
-
-export const currentTrustDocumentsQuery = graphql`
- query CompliancePortalGraphCurrentDocumentsQuery {
- currentCompliancePortal {
- id
- documents(first: 50) {
- edges {
- node {
- id
- documentType
- ...DocumentRowFragment
- }
- }
- }
- compliancePortalFiles(first: 50) {
- edges {
- node {
- id
- category
- ...CompliancePortalFileRowFragment
- }
- }
- }
- }
- }
-`;
-
-export const currentTrustSubprocessorsQuery = graphql`
- query CompliancePortalGraphCurrentSubprocessorsQuery {
- currentCompliancePortal {
- id
- entityName
- subprocessors(first: 50) {
- edges {
- node {
- id
- countries
- ...SubprocessorRowFragment
- }
- }
- }
- }
- }
-`;
diff --git a/apps/trust/src/routes.tsx b/apps/trust/src/routes.tsx
deleted file mode 100644
index dd81876ec..000000000
--- a/apps/trust/src/routes.tsx
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { lazy } from "@probo/react-lazy";
-import {
- type AppRoute,
- loaderFromQueryLoader,
- routeFromAppRoute,
- withQueryRef,
-} from "@probo/routes";
-import { Fragment } from "react";
-import { loadQuery } from "react-relay";
-import { createBrowserRouter, redirect } from "react-router";
-
-import { MainLayout } from "#/layouts/MainLayout";
-import { DocumentsPage } from "#/pages/DocumentsPage";
-import { OverviewPage } from "#/pages/OverviewPage";
-import { SubprocessorsPage } from "#/pages/SubprocessorsPage";
-import { currentTrustUpdatesQuery, UpdatesPage } from "#/pages/UpdatesPage";
-import {
- currentCompliancePortalGraphQuery,
- currentTrustDocumentsQuery,
- currentTrustSubprocessorsQuery,
-} from "#/queries/CompliancePortalGraph";
-
-import { DocumentPageErrorBoundary } from "./components/DocumentPageErrorBoundary";
-import { PageError } from "./components/PageError";
-import { RootErrorBoundary } from "./components/RootErrorBoundary";
-import { MainSkeleton } from "./components/Skeletons/MainSkeleton";
-import { TabSkeleton } from "./components/Skeletons/TabSkeleton";
-import { consoleEnvironment } from "./providers/RelayProviders";
-
-const routes = [
- {
- Component: lazy(() => import("#/pages/auth/AuthLayoutLoader")),
- children: [
- {
- path: "/connect",
- Component: lazy(() => import("#/pages/auth/ConnectPageLoader")),
- },
- {
- path: "/full-name",
- Component: lazy(() => import("#/pages/auth/FullNamePage")),
- },
- ],
- },
- {
- path: "/",
- loader: () => {
- // eslint-disable-next-line
- throw redirect("/overview");
- },
- Component: Fragment,
- ErrorBoundary: RootErrorBoundary,
- },
- {
- path: "/nda",
- Component: lazy(() => import("#/pages/NDAPageLoader")),
- ErrorBoundary: RootErrorBoundary,
- },
- // Custom domain routes (subdomain-based)
- {
- path: "/overview",
- loader: loaderFromQueryLoader(() =>
- loadQuery(consoleEnvironment, currentCompliancePortalGraphQuery, {}),
- ),
- Component: withQueryRef(MainLayout),
- Fallback: MainSkeleton,
- ErrorBoundary: RootErrorBoundary,
- children: [
- {
- path: "",
- Fallback: TabSkeleton,
- Component: OverviewPage,
- },
- ],
- },
- {
- path: "/documents/:documentId",
- Component: lazy(() => import("#/pages/DocumentPageLoader")),
- ErrorBoundary: DocumentPageErrorBoundary,
- },
- {
- path: "/documents",
- loader: loaderFromQueryLoader(() =>
- loadQuery(consoleEnvironment, currentCompliancePortalGraphQuery, {}),
- ),
- Component: withQueryRef(MainLayout),
- Fallback: MainSkeleton,
- ErrorBoundary: RootErrorBoundary,
- children: [
- {
- path: "",
- loader: loaderFromQueryLoader(() =>
- loadQuery(consoleEnvironment, currentTrustDocumentsQuery, {}),
- ),
- Fallback: TabSkeleton,
- Component: withQueryRef(DocumentsPage),
- },
- ],
- },
- {
- path: "/subprocessors",
- loader: loaderFromQueryLoader(() =>
- loadQuery(consoleEnvironment, currentCompliancePortalGraphQuery, {}),
- ),
- Component: withQueryRef(MainLayout),
- Fallback: MainSkeleton,
- ErrorBoundary: RootErrorBoundary,
- children: [
- {
- path: "",
- loader: loaderFromQueryLoader(() =>
- loadQuery(consoleEnvironment, currentTrustSubprocessorsQuery, {}),
- ),
- Fallback: TabSkeleton,
- Component: withQueryRef(SubprocessorsPage),
- },
- ],
- },
- {
- path: "/updates",
- loader: loaderFromQueryLoader(() =>
- loadQuery(consoleEnvironment, currentCompliancePortalGraphQuery, {}),
- ),
- Component: withQueryRef(MainLayout),
- Fallback: MainSkeleton,
- ErrorBoundary: RootErrorBoundary,
- children: [
- {
- path: "",
- loader: loaderFromQueryLoader(() =>
- loadQuery(consoleEnvironment, currentTrustUpdatesQuery, {}),
- ),
- Fallback: TabSkeleton,
- Component: withQueryRef(UpdatesPage),
- },
- ],
- },
- // Fallback URL to the NotFound Page
- {
- path: "*",
- Component: PageError,
- },
-] satisfies AppRoute[];
-
-export const router = createBrowserRouter(routes.map(routeFromAppRoute), {});
diff --git a/apps/trust/src/types.ts b/apps/trust/src/types.ts
deleted file mode 100644
index 7917aec15..000000000
--- a/apps/trust/src/types.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-export type NodeOf
- = NonNullable extends
- | { readonly edges: ReadonlyArray<{ readonly node: infer U }> }
- | undefined
- ? U
- : never;
-
-export type ItemOf = T extends (infer U)[] ? U : never;
diff --git a/apps/trust/src/vite-env.d.ts b/apps/trust/src/vite-env.d.ts
deleted file mode 100644
index 43adc10cc..000000000
--- a/apps/trust/src/vite-env.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-///
-
-interface ImportMetaEnv {
- readonly VITE_API_URL: string;
-}
-
-interface ImportMeta {
- readonly env: ImportMetaEnv;
-}
diff --git a/apps/trust/trust.go b/apps/trust/trust.go
deleted file mode 100644
index b5b809836..000000000
--- a/apps/trust/trust.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-package truststatics
-
-import "embed"
-
-//go:embed dist
-var StaticFiles embed.FS
diff --git a/apps/trust/tsconfig.app.json b/apps/trust/tsconfig.app.json
deleted file mode 100644
index a60b37b47..000000000
--- a/apps/trust/tsconfig.app.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
- "target": "ES2020",
- "useDefineForClassFields": true,
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
- "module": "ESNext",
- "skipLibCheck": true,
-
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": false,
- "verbatimModuleSyntax": true,
- "moduleDetection": "force",
- "noEmit": true,
- "jsx": "react-jsx",
- "paths": {
- "#/*": ["./src/*"]
- },
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "erasableSyntaxOnly": true,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedSideEffectImports": true
- },
- "include": ["src"]
-}
diff --git a/apps/trust/tsconfig.json b/apps/trust/tsconfig.json
deleted file mode 100644
index 1ffef600d..000000000
--- a/apps/trust/tsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "files": [],
- "references": [
- { "path": "./tsconfig.app.json" },
- { "path": "./tsconfig.node.json" }
- ]
-}
diff --git a/apps/trust/tsconfig.node.json b/apps/trust/tsconfig.node.json
deleted file mode 100644
index 87ae7cd5e..000000000
--- a/apps/trust/tsconfig.node.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "allowJs": true,
- "target": "ES2022",
- "lib": ["ES2023"],
- "module": "ESNext",
- "skipLibCheck": true,
-
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": false,
- "verbatimModuleSyntax": true,
- "moduleDetection": "force",
- "noEmit": true,
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "erasableSyntaxOnly": true,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedSideEffectImports": true
- },
- "include": ["vite.config.ts"]
-}
diff --git a/apps/trust/vite.config.ts b/apps/trust/vite.config.ts
deleted file mode 100644
index b32e5a4a1..000000000
--- a/apps/trust/vite.config.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-import { fileURLToPath, URL } from "node:url";
-
-import babel from "@rolldown/plugin-babel";
-import tailwindcss from "@tailwindcss/vite";
-import react from "@vitejs/plugin-react";
-import { defineConfig } from "vite";
-
-// https://vite.dev/config/
-// @vitejs/plugin-react@6 (Vite 8) no longer runs Babel, so the Relay tagged
-// template transform is applied via @rolldown/plugin-babel instead.
-export default defineConfig({
- plugins: [
- react(),
- babel({ plugins: ["relay"] }),
- tailwindcss(),
- ],
- build: {
- assetsDir: "assets",
- },
- base: "./",
- server: {
- port: 5175,
- proxy: {
- "^/trust/[^/]+/api": {
- target: "http://localhost:8080",
- changeOrigin: true,
- },
- },
- },
- resolve: {
- alias: {
- "#": fileURLToPath(new URL("./src", import.meta.url)),
- },
- },
-});
diff --git a/contrib/claude/file-naming.md b/contrib/claude/file-naming.md
index 1dadcf969..080ea5404 100644
--- a/contrib/claude/file-naming.md
+++ b/contrib/claude/file-naming.md
@@ -5,7 +5,7 @@
Template files use the extension pattern `..tmpl`:
```
-pkg/trust/sitemap.xml.tmpl
+pkg/complianceportal/visitor/sitemap.xml.tmpl
pkg/server/mailactions/templates/page.html.tmpl
pkg/cookiebanner/prompts/tracker_identification.txt.tmpl
pkg/probo/templates/risk_list.json.tmpl
diff --git a/contrib/claude/relay.md b/contrib/claude/relay.md
index 8f2f49797..0c5aa46f2 100644
--- a/contrib/claude/relay.md
+++ b/contrib/claude/relay.md
@@ -17,7 +17,7 @@ Configured in `apps/console/src/environments.ts`. Each has its own store with 1-
## Relay compiler
-Config lives in `relay.config.json` at the repo root with three projects (`core`, `iam`, `trust`) mapped to different source directories and schemas. Each project uses `schema` pointing to `base.graphql` and `schemaExtensions` pointing to the `graphql/` directory containing the per-entity schema files. Generated files go into `__generated__/` directories.
+Config lives in `relay.config.json` at the repo root with three projects (`core`, `iam`, `complianceportal`) mapped to different source directories and schemas. Each project uses `schema` pointing to `base.graphql` and `schemaExtensions` pointing to the `graphql/` directory containing the per-entity schema files. Generated files go into `__generated__/` directories.
```sh
make relay # merge split schemas + clean + compile
diff --git a/contrib/lima/provision.sh b/contrib/lima/provision.sh
index 40bfd1664..4f749f2e7 100755
--- a/contrib/lima/provision.sh
+++ b/contrib/lima/provision.sh
@@ -120,7 +120,7 @@ PROBOD_AUTH_COOKIE_SECRET="this-is-a-secure-secret-for-cookie-signing-at-least-3
PROBOD_AUTH_PASSWORD_PEPPER="this-is-a-secure-pepper-for-password-hashing-at-least-32-bytes" \
PROBOD_ENCRYPTION_KEY="thisisnotasecretAAAAAAAAAAAAAAAAAAAAAAAAAAA=" \
PROBOD_OAUTH2_SERVER_SIGNING_KEY="$(cat "${OAUTH2_SIGNING_KEY_PATH}")" \
-PROBOD_API_CORS_ALLOWED_ORIGINS="http://${VM_IP}:8080,http://${VM_IP}:5173,http://${VM_IP}:5174,http://${VM_IP}:5175" \
+PROBOD_API_CORS_ALLOWED_ORIGINS="http://${VM_IP}:8080,http://${VM_IP}:5173,http://${VM_IP}:5174" \
PROBOD_AWS_ENDPOINT="http://127.0.0.1:8333" \
PROBOD_AWS_ACCESS_KEY_ID="probod" \
PROBOD_AWS_SECRET_ACCESS_KEY="thisisnotasecret" \
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 1fce7c0ad..604d1910a 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -4,7 +4,7 @@ import { defineConfig, globalIgnores } from "eslint/config";
// Workspaces that are linted by this root config. Each gets the shared rule
// sets below; everything else is ignored so a bare `eslint .` keeps the same
// scope as the previous per-workspace configs.
-const appDirs = ["apps/console/**", "apps/trust/**", "apps/compliance-portal/**"];
+const appDirs = ["apps/console/**", "apps/compliance-portal/**"];
const reactDirs = [...appDirs, "packages/ui/**", "packages/relay/**", "packages/routes/**"];
const lintedDirs = [...reactDirs, "packages/eslint-config/**"];
@@ -50,8 +50,8 @@ export default defineConfig([
{
// compliance-portal mutates through the awaitable useMutation bound in
// #/lib/relay/useMutation (over @probo/relay's createUseMutation), never
- // react-relay's useMutation directly. Scoped to this app only: console and
- // trust still use react-relay's useMutation.
+ // react-relay's useMutation directly. Scoped to this app only: console
+ // still uses react-relay's useMutation.
files: ["apps/compliance-portal/**"],
rules: {
"no-restricted-imports": [
diff --git a/package-lock.json b/package-lock.json
index 08150cc0d..8067470fb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -594,292 +594,6 @@
"url": "https://github.com/sponsors/colinhacks"
}
},
- "apps/trust": {
- "name": "@probo/trust",
- "version": "0.0.0",
- "dependencies": {
- "@hookform/resolvers": "^5.0.1",
- "@probo/helpers": "1.0.0",
- "@probo/hooks": "1.0.0",
- "@probo/i18n": "1.0.0",
- "@probo/routes": "^1.0.0",
- "@probo/ui": "1.0.0",
- "clsx": "^2.1.1",
- "react": "^19.2.7",
- "react-dom": "^19.2.7",
- "react-error-boundary": "^6.0.0",
- "react-hook-form": "^7.56.4",
- "react-pdf": "^10.3.0",
- "react-relay": "^21.0.1",
- "react-router": "^8.1.0",
- "relay-runtime": "^21.0.1",
- "usehooks-ts": "^3.1.1",
- "zod": "^4.4.3"
- },
- "devDependencies": {
- "@babel/core": "^8.0.1",
- "@rolldown/plugin-babel": "^0.2.3",
- "@tailwindcss/vite": "^4.3.2",
- "@types/babel__core": "^7.20.5",
- "@types/node": "^26",
- "@types/react": "^19.2.17",
- "@types/react-dom": "^19.2.3",
- "@vitejs/plugin-react": "^6.0.2",
- "babel-plugin-relay": "^21.0.1",
- "graphql": "^17.0.1",
- "tailwindcss": "^4.3.1",
- "typescript": "~6.0.3",
- "vite": "^8.1.2"
- }
- },
- "apps/trust/node_modules/@babel/code-frame": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz",
- "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^8.0.0",
- "js-tokens": "^10.0.0"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/compat-data": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-8.0.0.tgz",
- "integrity": "sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/core": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.1.tgz",
- "integrity": "sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^8.0.0",
- "@babel/generator": "^8.0.0",
- "@babel/helper-compilation-targets": "^8.0.0",
- "@babel/helpers": "^8.0.0",
- "@babel/parser": "^8.0.0",
- "@babel/template": "^8.0.0",
- "@babel/traverse": "^8.0.0",
- "@babel/types": "^8.0.0",
- "@types/gensync": "^1.0.5",
- "convert-source-map": "^2.0.0",
- "empathic": "^2.0.1",
- "gensync": "^1.0.0-beta.2",
- "import-meta-resolve": "^4.2.0",
- "json5": "^2.2.3",
- "obug": "^2.1.1",
- "semver": "^7.7.3"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "apps/trust/node_modules/@babel/generator": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz",
- "integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^8.0.0",
- "@babel/types": "^8.0.0",
- "@jridgewell/gen-mapping": "^0.3.12",
- "@jridgewell/trace-mapping": "^0.3.28",
- "@types/jsesc": "^2.5.0",
- "jsesc": "^3.0.2"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/helper-compilation-targets": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.0.tgz",
- "integrity": "sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^8.0.0",
- "@babel/helper-validator-option": "^8.0.0",
- "browserslist": "^4.24.0",
- "lru-cache": "^11.0.0",
- "semver": "^7.7.3"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/helper-globals": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz",
- "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/helper-string-parser": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz",
- "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/helper-validator-identifier": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.2.tgz",
- "integrity": "sha512-9Fr9QeyCAyi1BR1jKZ6uYQ24EIhQUx5ReHfQU7drOE+TPOb+w11/dsqLkMOT2U29OdCT71XajrOT8xDc1C7orA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/helper-validator-option": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-8.0.0.tgz",
- "integrity": "sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/helpers": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.0.tgz",
- "integrity": "sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^8.0.0",
- "@babel/types": "^8.0.0"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/parser": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz",
- "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^8.0.0"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/template": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz",
- "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^8.0.0",
- "@babel/parser": "^8.0.0",
- "@babel/types": "^8.0.0"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/traverse": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz",
- "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^8.0.0",
- "@babel/generator": "^8.0.0",
- "@babel/helper-globals": "^8.0.0",
- "@babel/parser": "^8.0.0",
- "@babel/template": "^8.0.0",
- "@babel/types": "^8.0.0",
- "obug": "^2.1.1"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/@babel/types": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz",
- "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^8.0.0",
- "@babel/helper-validator-identifier": "^8.0.0"
- },
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "apps/trust/node_modules/js-tokens": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
- "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==",
- "dev": true,
- "license": "MIT"
- },
- "apps/trust/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "apps/trust/node_modules/semver": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "apps/trust/node_modules/zod": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
- "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
"examples/cookie-banner-react": {
"name": "@probo/example-cookie-banner-react",
"version": "0.0.0",
@@ -4826,10 +4540,6 @@
"resolved": "packages/skills",
"link": true
},
- "node_modules/@probo/trust": {
- "resolved": "apps/trust",
- "link": true
- },
"node_modules/@probo/tsconfig": {
"resolved": "packages/tsconfig",
"link": true
diff --git a/packages/helpers/src/compliancePortalUrl.ts b/packages/helpers/src/compliancePortalUrl.ts
deleted file mode 100644
index 63ad4f083..000000000
--- a/packages/helpers/src/compliancePortalUrl.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2025-2026 Probo Inc .
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-export function getCompliancePortalUrl(path: string): string {
- const currentPath = window.location.pathname;
- const trustMatch = currentPath.match(/^\/trust\/([^/]+)/);
-
- if (!trustMatch) {
- return `/${path}`;
- }
-
- return `../${path}`;
-}
diff --git a/packages/helpers/src/index.ts b/packages/helpers/src/index.ts
index 8b63499af..b6164556d 100644
--- a/packages/helpers/src/index.ts
+++ b/packages/helpers/src/index.ts
@@ -122,7 +122,6 @@ export {
fromMaxAgeSeconds,
} from "./duration";
export { getTrackerTypeBadge, getTrackerSourceBadge } from "./tracker";
-export { getCompliancePortalUrl } from "./compliancePortalUrl";
export { detectSocialName } from "./socialUrl";
export { formatError, type GraphQLError } from "./error";
export { Role, roles, getAssignableRoles } from "./roles";
diff --git a/relay.config.json b/relay.config.json
index 94ba92463..afe97274c 100644
--- a/relay.config.json
+++ b/relay.config.json
@@ -7,7 +7,6 @@
"sources": {
"apps/console/src/pages/iam": "iam",
"apps/console/src": "core",
- "apps/trust/src": "trust",
"apps/compliance-portal/src": "complianceportal"
},
"projects": {
@@ -43,16 +42,6 @@
"Map": "Record"
}
},
- "trust": {
- "schema": "pkg/server/api/complianceportal/v1/schema.graphql",
- "language": "typescript",
- "noFutureProofEnums": true,
- "customScalarTypes": {
- "Datetime": "string",
- "CursorKey": "string",
- "EmailAddr": "string"
- }
- },
"complianceportal": {
"schema": "pkg/server/api/complianceportal/v1/schema.graphql",
"language": "typescript",