diff --git a/apps/login/.prettierignore b/apps/login/.prettierignore index 22dde8a90..be49df47d 100644 --- a/apps/login/.prettierignore +++ b/apps/login/.prettierignore @@ -1,6 +1,9 @@ * !constants +!constants/** !src +!src/** !locales -!scripts/healthcheck.mjs -!scripts/server.mjs \ No newline at end of file +!locales/** +!scripts +!scripts/** diff --git a/apps/login/.prettierrc b/apps/login/.prettierrc deleted file mode 100644 index ba42405b0..000000000 --- a/apps/login/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "printWidth": 125, - "trailingComma": "all", - "plugins": ["prettier-plugin-organize-imports"], - "filepath": "" -} diff --git a/apps/login/prettier.config.mjs b/apps/login/prettier.config.mjs index 5e0f9b258..8981dd329 100644 --- a/apps/login/prettier.config.mjs +++ b/apps/login/prettier.config.mjs @@ -1,5 +1,5 @@ export default { - printWidth: 80, + printWidth: 125, tabWidth: 2, useTabs: false, semi: true, diff --git a/apps/login/scripts/healthcheck.mjs b/apps/login/scripts/healthcheck.mjs index d5f7e41b1..9aa74e4a4 100644 --- a/apps/login/scripts/healthcheck.mjs +++ b/apps/login/scripts/healthcheck.mjs @@ -1,5 +1,5 @@ -import * as https from "node:https"; import * as http from "node:http"; +import * as https from "node:https"; const scheme = process.env.ZITADEL_TLS_ENABLED === "true" ? "https" : "http"; const port = process.env.PORT || "3000"; diff --git a/apps/login/scripts/server.mjs b/apps/login/scripts/server.mjs index 4f4a9a47a..c1212bf7e 100644 --- a/apps/login/scripts/server.mjs +++ b/apps/login/scripts/server.mjs @@ -1,4 +1,4 @@ -import { readFileSync, accessSync, constants } from "node:fs"; +import { accessSync, constants, readFileSync } from "node:fs"; import { createServer } from "node:https"; import { createRequire } from "node:module"; diff --git a/apps/login/src/app/(login)/accounts/page.tsx b/apps/login/src/app/(login)/accounts/page.tsx index 1b2516215..4a3501590 100644 --- a/apps/login/src/app/(login)/accounts/page.tsx +++ b/apps/login/src/app/(login)/accounts/page.tsx @@ -21,8 +21,7 @@ async function loadSessions({ serviceConfig }: { serviceConfig: ServiceConfig }) const cookieIds = await getAllSessionCookieIds(); if (cookieIds && cookieIds.length) { - const response = await listSessions({ serviceConfig, ids: cookieIds.filter((id) => !!id) as string[], - }); + const response = await listSessions({ serviceConfig, ids: cookieIds.filter((id) => !!id) as string[] }); return response?.sessions ?? []; } else { console.info("No session cookie found."); @@ -41,7 +40,7 @@ export default async function Page(props: { searchParams: Promise diff --git a/apps/login/src/app/(login)/idp/[provider]/account-not-found/page.tsx b/apps/login/src/app/(login)/idp/[provider]/account-not-found/page.tsx index 37a631803..be3bfb255 100644 --- a/apps/login/src/app/(login)/idp/[provider]/account-not-found/page.tsx +++ b/apps/login/src/app/(login)/idp/[provider]/account-not-found/page.tsx @@ -24,14 +24,13 @@ export default async function Page(props: { searchParams: Promise @@ -51,7 +50,7 @@ export default async function Page(props: { searchParams: Promise - diff --git a/apps/login/src/app/(login)/idp/[provider]/failure/page.tsx b/apps/login/src/app/(login)/idp/[provider]/failure/page.tsx index 21a1347e2..b47fe9295 100644 --- a/apps/login/src/app/(login)/idp/[provider]/failure/page.tsx +++ b/apps/login/src/app/(login)/idp/[provider]/failure/page.tsx @@ -20,11 +20,9 @@ export default async function Page(props: { const _headers = await headers(); const { serviceConfig } = getServiceConfig(_headers); - const branding = await getBrandingSettings({ serviceConfig, organization, - }); + const branding = await getBrandingSettings({ serviceConfig, organization }); - const loginSettings = await getLoginSettings({ serviceConfig, organization, - }); + const loginSettings = await getLoginSettings({ serviceConfig, organization }); let authMethods: AuthenticationMethodType[] = []; let user: User | undefined = undefined; @@ -39,8 +37,7 @@ export default async function Page(props: { } if (userId) { - const userResponse = await getUserByID({ serviceConfig, userId, - }); + const userResponse = await getUserByID({ serviceConfig, userId }); if (userResponse) { user = userResponse.user; if (user?.type.case === "human") { @@ -52,8 +49,7 @@ export default async function Page(props: { } } - const authMethodsResponse = await listAuthenticationMethodTypes({ serviceConfig, userId, - }); + const authMethodsResponse = await listAuthenticationMethodTypes({ serviceConfig, userId }); if (authMethodsResponse.authMethodTypes) { authMethods = authMethodsResponse.authMethodTypes; } diff --git a/apps/login/src/app/(login)/idp/[provider]/registration-failed/page.tsx b/apps/login/src/app/(login)/idp/[provider]/registration-failed/page.tsx index bc48a841b..82988bf03 100644 --- a/apps/login/src/app/(login)/idp/[provider]/registration-failed/page.tsx +++ b/apps/login/src/app/(login)/idp/[provider]/registration-failed/page.tsx @@ -24,14 +24,13 @@ export default async function Page(props: { searchParams: Promise @@ -51,7 +50,7 @@ export default async function Page(props: { searchParams: Promise - diff --git a/apps/login/src/app/(login)/idp/ldap/page.tsx b/apps/login/src/app/(login)/idp/ldap/page.tsx index 5546e98e6..fc598c635 100644 --- a/apps/login/src/app/(login)/idp/ldap/page.tsx +++ b/apps/login/src/app/(login)/idp/ldap/page.tsx @@ -11,15 +11,7 @@ export default async function Page(props: { params: Promise<{ provider: string }>; }) { const searchParams = await props.searchParams; - const { - idpId, - organization, - link, - requestId, - postErrorRedirectUrl, - linkToSessionId, - linkFingerprint, - } = searchParams; + const { idpId, organization, link, requestId, postErrorRedirectUrl, linkToSessionId, linkFingerprint } = searchParams; if (!idpId) { throw new Error("No idpId provided in searchParams"); @@ -30,14 +22,13 @@ export default async function Page(props: { let defaultOrganization; if (!organization) { - const org: Organization | null = await getDefaultOrg({ serviceConfig, }); + const org: Organization | null = await getDefaultOrg({ serviceConfig }); if (org) { defaultOrganization = org.id; } } - const branding = await getBrandingSettings({ serviceConfig, organization: organization ?? defaultOrganization, - }); + const branding = await getBrandingSettings({ serviceConfig, organization: organization ?? defaultOrganization }); // return login failed if no linking or creation is allowed and no user was found return ( diff --git a/apps/login/src/app/(login)/idp/page.tsx b/apps/login/src/app/(login)/idp/page.tsx index 80890d478..b304409bf 100644 --- a/apps/login/src/app/(login)/idp/page.tsx +++ b/apps/login/src/app/(login)/idp/page.tsx @@ -21,13 +21,11 @@ export default async function Page(props: { searchParams: Promise { + const identityProviders = await getActiveIdentityProviders({ serviceConfig, orgId: organization }).then((resp) => { return resp.identityProviders; }); - const branding = await getBrandingSettings({ serviceConfig, organization, - }); + const branding = await getBrandingSettings({ serviceConfig, organization }); return ( diff --git a/apps/login/src/app/(login)/layout.tsx b/apps/login/src/app/(login)/layout.tsx index 1aa9e3a82..93413ed8d 100644 --- a/apps/login/src/app/(login)/layout.tsx +++ b/apps/login/src/app/(login)/layout.tsx @@ -5,16 +5,16 @@ import { LanguageProvider } from "@/components/language-provider"; import { LanguageSwitcher } from "@/components/language-switcher"; import { Skeleton } from "@/components/skeleton"; import { ThemeProvider } from "@/components/theme-provider"; -import * as Tooltip from "@radix-ui/react-tooltip"; -import { Lato } from "next/font/google"; -import React, { Suspense } from "react"; import ThemeSwitch from "@/components/theme-switch"; -import type { Metadata } from "next"; -import { getTranslations } from "next-intl/server"; -import { headers } from "next/headers"; +import { LANGS, getLanguage } from "@/lib/i18n"; import { getServiceConfig } from "@/lib/service-url"; import { getAllowedLanguages } from "@/lib/zitadel"; -import { LANGS, getLanguage } from "@/lib/i18n"; +import * as Tooltip from "@radix-ui/react-tooltip"; +import type { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; +import { Lato } from "next/font/google"; +import { headers } from "next/headers"; +import React, { Suspense } from "react"; const lato = Lato({ weight: ["400", "700", "900"], @@ -70,7 +70,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo >
{children}
-
+
diff --git a/apps/login/src/app/(login)/loginname/page.tsx b/apps/login/src/app/(login)/loginname/page.tsx index eff635139..3df26bee8 100644 --- a/apps/login/src/app/(login)/loginname/page.tsx +++ b/apps/login/src/app/(login)/loginname/page.tsx @@ -57,16 +57,18 @@ export default async function Page(props: { searchParams: Promise
- {loginSettings?.allowLocalAuthentication && } + {loginSettings?.allowLocalAuthentication && ( + + )} {loginSettings?.allowExternalIdp && !!identityProviders?.length && (
diff --git a/apps/login/src/app/(login)/logout/done/page.tsx b/apps/login/src/app/(login)/logout/done/page.tsx index 1405b8488..a68ba89c1 100644 --- a/apps/login/src/app/(login)/logout/done/page.tsx +++ b/apps/login/src/app/(login)/logout/done/page.tsx @@ -12,8 +12,7 @@ export default async function Page(props: { searchParams: Promise }) { const { organization } = searchParams; - const branding = await getBrandingSettings({ serviceConfig, organization, - }); + const branding = await getBrandingSettings({ serviceConfig, organization }); return ( diff --git a/apps/login/src/app/(login)/otp/[method]/set/page.tsx b/apps/login/src/app/(login)/otp/[method]/set/page.tsx index 6e9bedda0..2746c8cc8 100644 --- a/apps/login/src/app/(login)/otp/[method]/set/page.tsx +++ b/apps/login/src/app/(login)/otp/[method]/set/page.tsx @@ -26,12 +26,12 @@ export default async function Page(props: { const _headers = await headers(); const { serviceConfig } = getServiceConfig(_headers); - const branding = await getBrandingSettings({ serviceConfig, organization, - }); - const loginSettings = await getLoginSettings({ serviceConfig, organization, - }); + const branding = await getBrandingSettings({ serviceConfig, organization }); + const loginSettings = await getLoginSettings({ serviceConfig, organization }); - const session = await loadMostRecentSession({ serviceConfig, sessionParams: { + const session = await loadMostRecentSession({ + serviceConfig, + sessionParams: { loginName, organization, }, @@ -40,8 +40,7 @@ export default async function Page(props: { let totpResponse: RegisterTOTPResponse | undefined, error: Error | undefined; if (session && session.factors?.user?.id) { if (method === "time-based") { - await registerTOTP({ serviceConfig, userId: session.factors.user.id, - }) + await registerTOTP({ serviceConfig, userId: session.factors.user.id }) .then((resp) => { if (resp) { totpResponse = resp; @@ -51,14 +50,12 @@ export default async function Page(props: { error = err; }); } else if (method === "sms") { - await addOTPSMS({ serviceConfig, userId: session.factors.user.id, - }).catch((_error) => { + await addOTPSMS({ serviceConfig, userId: session.factors.user.id }).catch((_error) => { // TODO: Throw this error? new Error("Could not add OTP via SMS"); }); } else if (method === "email") { - await addOTPEmail({ serviceConfig, userId: session.factors.user.id, - }).catch((_error) => { + await addOTPEmail({ serviceConfig, userId: session.factors.user.id }).catch((_error) => { // TODO: Throw this error? new Error("Could not add OTP via Email"); }); diff --git a/apps/login/src/app/(login)/passkey/set/page.tsx b/apps/login/src/app/(login)/passkey/set/page.tsx index 31d707919..0fc5e11d5 100644 --- a/apps/login/src/app/(login)/passkey/set/page.tsx +++ b/apps/login/src/app/(login)/passkey/set/page.tsx @@ -28,21 +28,21 @@ export default async function Page(props: { searchParams: Promise { const t = await getTranslations("password"); diff --git a/apps/login/src/app/(login)/register/page.tsx b/apps/login/src/app/(login)/register/page.tsx index 34647532a..ce799e366 100644 --- a/apps/login/src/app/(login)/register/page.tsx +++ b/apps/login/src/app/(login)/register/page.tsx @@ -31,25 +31,20 @@ export default async function Page(props: { searchParams: Promise { + const identityProviders = await getActiveIdentityProviders({ serviceConfig, orgId: organization }).then((resp) => { return resp.identityProviders.filter((idp) => { return idp.options?.isAutoCreation || idp.options?.isCreationAllowed; // check if IDP allows to create account automatically or manual creation is allowed }); @@ -105,21 +100,18 @@ export default async function Page(props: { searchParams: Promise )} - {legal && - passwordComplexitySettings && - organization && - loginSettings.allowLocalAuthentication && ( - - )} + {legal && passwordComplexitySettings && organization && loginSettings.allowLocalAuthentication && ( + + )} {loginSettings?.allowExternalIdp && !!identityProviders.length && ( <> diff --git a/apps/login/src/app/(login)/register/password/page.tsx b/apps/login/src/app/(login)/register/password/page.tsx index 03b24e316..2f36fef6a 100644 --- a/apps/login/src/app/(login)/register/password/page.tsx +++ b/apps/login/src/app/(login)/register/password/page.tsx @@ -21,7 +21,7 @@ export default async function Page(props: { searchParams: Promise diff --git a/apps/login/src/app/(login)/signedin/page.tsx b/apps/login/src/app/(login)/signedin/page.tsx index 36da7e0c6..7fb6a6fc4 100644 --- a/apps/login/src/app/(login)/signedin/page.tsx +++ b/apps/login/src/app/(login)/signedin/page.tsx @@ -85,9 +85,7 @@ export default async function Page(props: { searchParams: Promise }) { } const redirectUri = await resolveRedirectUri( - requestId && sessionId - ? { sessionId, requestId } - : { loginName: loginName ?? sessionFactors?.factors?.user?.loginName }, + requestId && sessionId ? { sessionId, requestId } : { loginName: loginName ?? sessionFactors?.factors?.user?.loginName }, loginSettings?.defaultRedirectUri, ); diff --git a/apps/login/src/app/(login)/u2f/set/page.tsx b/apps/login/src/app/(login)/u2f/set/page.tsx index 1894f6dc0..9c5b64905 100644 --- a/apps/login/src/app/(login)/u2f/set/page.tsx +++ b/apps/login/src/app/(login)/u2f/set/page.tsx @@ -23,14 +23,15 @@ export default async function Page(props: { searchParams: Promise diff --git a/apps/login/src/app/(login)/verify/page.tsx b/apps/login/src/app/(login)/verify/page.tsx index 687769c2f..8ec02de4d 100644 --- a/apps/login/src/app/(login)/verify/page.tsx +++ b/apps/login/src/app/(login)/verify/page.tsx @@ -9,8 +9,8 @@ import { sendEmailCode, sendInviteEmailCode } from "@/lib/server/verify"; import { getServiceConfig } from "@/lib/service-url"; import { loadMostRecentSession } from "@/lib/session"; import { getBrandingSettings, getLoginSettings, getUserByID, searchUsers } from "@/lib/zitadel"; -import { HumanUser, User } from "@zitadel/proto/zitadel/user/v2/user_pb"; import { LoginSettings } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; +import { HumanUser, User } from "@zitadel/proto/zitadel/user/v2/user_pb"; import { Metadata } from "next"; import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; diff --git a/apps/login/src/app/(login)/verify/success/page.tsx b/apps/login/src/app/(login)/verify/success/page.tsx index 55e000654..0a9d0d1e6 100644 --- a/apps/login/src/app/(login)/verify/success/page.tsx +++ b/apps/login/src/app/(login)/verify/success/page.tsx @@ -15,13 +15,13 @@ export default async function Page(props: { searchParams: Promise }) { const { loginName, organization, userId } = searchParams; - const branding = await getBrandingSettings({ serviceConfig, organization, - }); + const branding = await getBrandingSettings({ serviceConfig, organization }); - const sessionFactors = await loadMostRecentSession({ serviceConfig, sessionParams: { loginName, organization }, - }).catch((error) => { - console.warn("Error loading session:", error); - }); + const sessionFactors = await loadMostRecentSession({ serviceConfig, sessionParams: { loginName, organization } }).catch( + (error) => { + console.warn("Error loading session:", error); + }, + ); const id = userId ?? sessionFactors?.factors?.user?.id; @@ -29,8 +29,7 @@ export default async function Page(props: { searchParams: Promise }) { throw Error("Failed to get user id"); } - const userResponse = await getUserByID({ serviceConfig, userId: id, - }); + const userResponse = await getUserByID({ serviceConfig, userId: id }); let user: User | undefined; let human: HumanUser | undefined; diff --git a/apps/login/src/app/global-error.tsx b/apps/login/src/app/global-error.tsx index 5111a65e8..db56324c7 100644 --- a/apps/login/src/app/global-error.tsx +++ b/apps/login/src/app/global-error.tsx @@ -5,13 +5,7 @@ import { Button } from "@/components/button"; import { ThemeWrapper } from "@/components/theme-wrapper"; import { Translated } from "@/components/translated"; -export default function GlobalError({ - error, - reset, -}: { - error: Error & { digest?: string }; - reset: () => void; -}) { +export default function GlobalError({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) { return ( // global-error must include html and body tags diff --git a/apps/login/src/app/login/route.ts b/apps/login/src/app/login/route.ts index 3304c5e78..6d04e6f6b 100644 --- a/apps/login/src/app/login/route.ts +++ b/apps/login/src/app/login/route.ts @@ -1,7 +1,7 @@ +import { isRSCRequest, validateAuthRequest } from "@/lib/auth-utils"; import { getAllSessions } from "@/lib/cookies"; +import { FlowInitiationParams, handleOIDCFlowInitiation, handleSAMLFlowInitiation } from "@/lib/server/flow-initiation"; import { getServiceConfig } from "@/lib/service-url"; -import { validateAuthRequest, isRSCRequest } from "@/lib/auth-utils"; -import { handleOIDCFlowInitiation, handleSAMLFlowInitiation, FlowInitiationParams } from "@/lib/server/flow-initiation"; import { listSessions, ServiceConfig } from "@/lib/zitadel"; import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb"; import { headers } from "next/headers"; diff --git a/apps/login/src/app/otel-test/route.ts b/apps/login/src/app/otel-test/route.ts index dc39c7fdb..109eda03b 100644 --- a/apps/login/src/app/otel-test/route.ts +++ b/apps/login/src/app/otel-test/route.ts @@ -1,14 +1,14 @@ -import { NextResponse } from "next/server"; -import { trace, metrics, SpanStatusCode } from "@opentelemetry/api"; import { createLogger } from "@/lib/logger"; import { recordAuthAttempt, - recordAuthSuccess, recordAuthFailure, - recordRequestStart, + recordAuthSuccess, recordRequestEnd, + recordRequestStart, recordSessionCreationDuration, } from "@/lib/metrics"; +import { metrics, SpanStatusCode, trace } from "@opentelemetry/api"; +import { NextResponse } from "next/server"; export const runtime = "nodejs"; const logger = createLogger("otel-test"); diff --git a/apps/login/src/app/security/route.ts b/apps/login/src/app/security/route.ts index 80ad072f6..c1e02af47 100644 --- a/apps/login/src/app/security/route.ts +++ b/apps/login/src/app/security/route.ts @@ -9,20 +9,14 @@ export async function GET() { const _headers = await headers(); const { serviceConfig } = getServiceConfig(_headers); - const settingsService: Client = - await createServiceForHost(SettingsService, serviceConfig); + const settingsService: Client = await createServiceForHost(SettingsService, serviceConfig); - const settings = await settingsService - .getSecuritySettings({}) - .then((resp) => (resp.settings ? resp.settings : undefined)); + const settings = await settingsService.getSecuritySettings({}).then((resp) => (resp.settings ? resp.settings : undefined)); const response = NextResponse.json({ settings }, { status: 200 }); // Add Cache-Control header to cache the response for up to 1 hour - response.headers.set( - "Cache-Control", - "public, max-age=3600, stale-while-revalidate=86400", - ); + response.headers.set("Cache-Control", "public, max-age=3600, stale-while-revalidate=86400"); return response; } diff --git a/apps/login/src/components/address-bar.tsx b/apps/login/src/components/address-bar.tsx index 67417649d..a32065f9b 100644 --- a/apps/login/src/components/address-bar.tsx +++ b/apps/login/src/components/address-bar.tsx @@ -13,12 +13,7 @@ export function AddressBar({ domain }: Props) { return (
- + - {type === AlertType.ALERT && ( - - )} - {type === AlertType.INFO && ( - - )} + {type === AlertType.ALERT && } + {type === AlertType.INFO && } {children}
); diff --git a/apps/login/src/components/auth-methods.tsx b/apps/login/src/components/auth-methods.tsx index 82271c93a..8f1ec2df3 100644 --- a/apps/login/src/components/auth-methods.tsx +++ b/apps/login/src/components/auth-methods.tsx @@ -7,20 +7,10 @@ import { BadgeState, StateBadge } from "./state-badge"; const cardClasses = (alreadyAdded: boolean) => clsx( "relative bg-background-light-400 dark:bg-background-dark-400 group block space-y-1.5 rounded-md px-5 py-3 border border-divider-light dark:border-divider-dark transition-all ", - alreadyAdded - ? "opacity-50 cursor-default" - : "hover:shadow-lg hover:dark:bg-white/10", + alreadyAdded ? "opacity-50 cursor-default" : "hover:shadow-lg hover:dark:bg-white/10", ); -const LinkWrapper = ({ - alreadyAdded, - children, - link, -}: { - alreadyAdded: boolean; - children: ReactNode; - link: string; -}) => { +const LinkWrapper = ({ alreadyAdded, children, link }: { alreadyAdded: boolean; children: ReactNode; link: string }) => { return !alreadyAdded ? ( {children} @@ -33,12 +23,7 @@ const LinkWrapper = ({ export const TOTP = (alreadyAdded: boolean, link: string) => { return ( -
+
{ export const U2F = (alreadyAdded: boolean, link: string) => { return ( -
+
{ export const EMAIL = (alreadyAdded: boolean, link: string) => { return ( -
+
{ export const SMS = (alreadyAdded: boolean, link: string) => { return ( -
+
{ export const PASSKEYS = (alreadyAdded: boolean, link: string) => { return ( -
+
{ export const PASSWORD = (alreadyAdded: boolean, link: string) => { return ( -
- +
+ form-textbox-password diff --git a/apps/login/src/components/avatar.test.tsx b/apps/login/src/components/avatar.test.tsx index db577a9b8..38969bbbb 100644 --- a/apps/login/src/components/avatar.test.tsx +++ b/apps/login/src/components/avatar.test.tsx @@ -1,5 +1,5 @@ -import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; import { render } from "@testing-library/react"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { Avatar, getInitials } from "./avatar"; // Mock next-themes diff --git a/apps/login/src/components/avatar.tsx b/apps/login/src/components/avatar.tsx index b9592168d..e8850199a 100644 --- a/apps/login/src/components/avatar.tsx +++ b/apps/login/src/components/avatar.tsx @@ -1,8 +1,8 @@ "use client"; import { ColorShade, getColorHash } from "@/helpers/colors"; -import { useTheme } from "next-themes"; import { getComponentRoundness } from "@/lib/theme"; +import { useTheme } from "next-themes"; interface AvatarProps { name: string | null | undefined; diff --git a/apps/login/src/components/boundary.tsx b/apps/login/src/components/boundary.tsx index 354d92096..fd5c7fc74 100644 --- a/apps/login/src/components/boundary.tsx +++ b/apps/login/src/components/boundary.tsx @@ -56,21 +56,14 @@ export const Boundary = ({ })} >
{labels.map((label) => { return ( -