diff --git a/plane-src/apps/web/core/components/auth-screens/header.tsx b/plane-src/apps/web/core/components/auth-screens/header.tsx
index d2c9a08..60980d1 100644
--- a/plane-src/apps/web/core/components/auth-screens/header.tsx
+++ b/plane-src/apps/web/core/components/auth-screens/header.tsx
@@ -50,7 +50,7 @@ export const AuthHeader = observer(function AuthHeader({ type }: AuthHeaderProps
{t(authContentMap[type].linkText)}
@@ -71,9 +71,9 @@ export function AuthHeaderBase(props: TAuthHeaderBase) {
return (
<>
+
diff --git a/plane-src/apps/web/helpers/authentication.helper.tsx b/plane-src/apps/web/helpers/authentication.helper.tsx
index c12fddf..fdf4c3c 100644
--- a/plane-src/apps/web/helpers/authentication.helper.tsx
+++ b/plane-src/apps/web/helpers/authentication.helper.tsx
@@ -6,8 +6,6 @@
import type { ReactNode } from "react";
import Link from "next/link";
-// plane imports
-import { SUPPORT_EMAIL } from "@plane/constants";
export enum EPageTypes {
PUBLIC = "PUBLIC",
@@ -37,7 +35,6 @@ export enum EErrorAlertType {
}
export enum EAuthenticationErrorCodes {
- // Global
INSTANCE_NOT_CONFIGURED = "5000",
INVALID_EMAIL = "5005",
EMAIL_REQUIRED = "5010",
@@ -45,32 +42,27 @@ export enum EAuthenticationErrorCodes {
MAGIC_LINK_LOGIN_DISABLED = "5016",
PASSWORD_LOGIN_DISABLED = "5018",
USER_ACCOUNT_DEACTIVATED = "5019",
- // Password strength
INVALID_PASSWORD = "5020",
PASSWORD_TOO_WEAK = "5021",
SMTP_NOT_CONFIGURED = "5025",
- // Sign Up
USER_ALREADY_EXIST = "5030",
AUTHENTICATION_FAILED_SIGN_UP = "5035",
REQUIRED_EMAIL_PASSWORD_SIGN_UP = "5040",
INVALID_EMAIL_SIGN_UP = "5045",
INVALID_EMAIL_MAGIC_SIGN_UP = "5050",
MAGIC_SIGN_UP_EMAIL_CODE_REQUIRED = "5055",
- // Sign In
USER_DOES_NOT_EXIST = "5060",
AUTHENTICATION_FAILED_SIGN_IN = "5065",
REQUIRED_EMAIL_PASSWORD_SIGN_IN = "5070",
INVALID_EMAIL_SIGN_IN = "5075",
INVALID_EMAIL_MAGIC_SIGN_IN = "5080",
MAGIC_SIGN_IN_EMAIL_CODE_REQUIRED = "5085",
- // Both Sign in and Sign up for magic
INVALID_MAGIC_CODE_SIGN_IN = "5090",
INVALID_MAGIC_CODE_SIGN_UP = "5092",
EXPIRED_MAGIC_CODE_SIGN_IN = "5095",
EXPIRED_MAGIC_CODE_SIGN_UP = "5097",
EMAIL_CODE_ATTEMPT_EXHAUSTED_SIGN_IN = "5100",
EMAIL_CODE_ATTEMPT_EXHAUSTED_SIGN_UP = "5102",
- // Oauth
OAUTH_NOT_CONFIGURED = "5104",
GOOGLE_NOT_CONFIGURED = "5105",
GITHUB_NOT_CONFIGURED = "5110",
@@ -78,16 +70,12 @@ export enum EAuthenticationErrorCodes {
GOOGLE_OAUTH_PROVIDER_ERROR = "5115",
GITHUB_OAUTH_PROVIDER_ERROR = "5120",
GITLAB_OAUTH_PROVIDER_ERROR = "5121",
- // Reset Password
INVALID_PASSWORD_TOKEN = "5125",
EXPIRED_PASSWORD_TOKEN = "5130",
- // Change password
INCORRECT_OLD_PASSWORD = "5135",
MISSING_PASSWORD = "5138",
INVALID_NEW_PASSWORD = "5140",
- // set password
PASSWORD_ALREADY_SET = "5145",
- // Admin
ADMIN_ALREADY_EXIST = "5150",
REQUIRED_ADMIN_EMAIL_PASSWORD_FIRST_NAME = "5155",
INVALID_ADMIN_EMAIL = "5160",
@@ -97,7 +85,6 @@ export enum EAuthenticationErrorCodes {
ADMIN_USER_ALREADY_EXIST = "5180",
ADMIN_USER_DOES_NOT_EXIST = "5185",
ADMIN_USER_DEACTIVATED = "5190",
- // Rate limit
RATE_LIMIT_EXCEEDED = "5900",
}
@@ -108,267 +95,246 @@ export type TAuthErrorInfo = {
message: ReactNode;
};
-// TODO: move all error messages to translation files
+const authLinkClass = "nodedc-auth-link font-medium";
+
const errorCodeMessages: {
[key in EAuthenticationErrorCodes]: { title: string; message: (email?: string) => ReactNode };
} = {
- // global
[EAuthenticationErrorCodes.INSTANCE_NOT_CONFIGURED]: {
- title: `Instance not configured`,
- message: () => `Instance not configured. Please contact your administrator.`,
+ title: "Пространство не настроено",
+ message: () => "Пространство не настроено. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.INVALID_EMAIL]: {
- title: `Invalid email`,
- message: () => `Invalid email. Please try again.`,
+ title: "Некорректный e-mail",
+ message: () => "Некорректный e-mail. Проверьте адрес и попробуйте снова.",
},
[EAuthenticationErrorCodes.EMAIL_REQUIRED]: {
- title: `Email required`,
- message: () => `Email required. Please try again.`,
+ title: "Нужен e-mail",
+ message: () => "Укажите e-mail и попробуйте снова.",
},
[EAuthenticationErrorCodes.SIGNUP_DISABLED]: {
- title: `Sign up disabled`,
- message: () => `Sign up disabled. Please contact your administrator.`,
+ title: "Регистрация отключена",
+ message: () => "Регистрация отключена. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.MAGIC_LINK_LOGIN_DISABLED]: {
- title: `Magic link login disabled`,
- message: () => `Magic link login disabled. Please contact your administrator.`,
+ title: "Вход по коду отключён",
+ message: () => "Вход по коду отключён. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.PASSWORD_LOGIN_DISABLED]: {
- title: `Password login disabled`,
- message: () => `Password login disabled. Please contact your administrator.`,
+ title: "Вход по паролю отключён",
+ message: () => "Вход по паролю отключён. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.USER_ACCOUNT_DEACTIVATED]: {
- title: `User account deactivated`,
- message: () => `User account deactivated. Please contact ${SUPPORT_EMAIL ? SUPPORT_EMAIL : "administrator"}.`,
+ title: "Аккаунт деактивирован",
+ message: () => "Аккаунт деактивирован. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.INVALID_PASSWORD]: {
- title: `Invalid password`,
- message: () => `Invalid password. Please try again.`,
+ title: "Неверный пароль",
+ message: () => "Неверный пароль. Попробуйте снова.",
},
[EAuthenticationErrorCodes.PASSWORD_TOO_WEAK]: {
- title: `Password too weak`,
- message: () => `Password must include upper-case, lower-case, number, special character, and must not be predictable.`,
+ title: "Слишком простой пароль",
+ message: () => "Пароль должен содержать строчные и заглавные буквы, цифру и специальный символ.",
},
[EAuthenticationErrorCodes.SMTP_NOT_CONFIGURED]: {
- title: `SMTP not configured`,
- message: () => `SMTP not configured. Please contact your administrator.`,
+ title: "Почта не настроена",
+ message: () => "Почтовый сервис не настроен. Обратитесь к администратору.",
},
-
- // sign up
[EAuthenticationErrorCodes.USER_ALREADY_EXIST]: {
- title: `User already exists`,
+ title: "Аккаунт уже существует",
message: (email = undefined) => (
- Your account is already registered.
-
- Sign In
+ Аккаунт уже зарегистрирован.
+
+ Войти
- now.
+ сейчас.
),
},
- [EAuthenticationErrorCodes.REQUIRED_EMAIL_PASSWORD_SIGN_UP]: {
- title: `Email and password required`,
- message: () => `Email and password required. Please try again.`,
- },
[EAuthenticationErrorCodes.AUTHENTICATION_FAILED_SIGN_UP]: {
- title: `Authentication failed`,
- message: () => `Authentication failed. Please try again.`,
+ title: "Не удалось выполнить вход",
+ message: () => "Не удалось выполнить вход. Проверьте данные и попробуйте снова.",
+ },
+ [EAuthenticationErrorCodes.REQUIRED_EMAIL_PASSWORD_SIGN_UP]: {
+ title: "Нужны e-mail и пароль",
+ message: () => "Укажите e-mail и пароль, затем попробуйте снова.",
},
[EAuthenticationErrorCodes.INVALID_EMAIL_SIGN_UP]: {
- title: `Invalid email`,
- message: () => `Invalid email. Please try again.`,
- },
- [EAuthenticationErrorCodes.MAGIC_SIGN_UP_EMAIL_CODE_REQUIRED]: {
- title: `Email and code required`,
- message: () => `Email and code required. Please try again.`,
+ title: "Некорректный e-mail",
+ message: () => "Некорректный e-mail. Проверьте адрес и попробуйте снова.",
},
[EAuthenticationErrorCodes.INVALID_EMAIL_MAGIC_SIGN_UP]: {
- title: `Invalid email`,
- message: () => `Invalid email. Please try again.`,
+ title: "Некорректный e-mail",
+ message: () => "Некорректный e-mail. Проверьте адрес и попробуйте снова.",
+ },
+ [EAuthenticationErrorCodes.MAGIC_SIGN_UP_EMAIL_CODE_REQUIRED]: {
+ title: "Нужны e-mail и код",
+ message: () => "Укажите e-mail и код подтверждения, затем попробуйте снова.",
},
-
[EAuthenticationErrorCodes.USER_DOES_NOT_EXIST]: {
- title: `User does not exist`,
+ title: "Аккаунт не найден",
message: (email = undefined) => (
- No account found.
-
- Create one
+ Аккаунт не найден.
+
+ Создать аккаунт
- to get started.
+ для начала работы.
),
},
- [EAuthenticationErrorCodes.REQUIRED_EMAIL_PASSWORD_SIGN_IN]: {
- title: `Email and password required`,
- message: () => `Email and password required. Please try again.`,
- },
[EAuthenticationErrorCodes.AUTHENTICATION_FAILED_SIGN_IN]: {
- title: `Authentication failed`,
- message: () => `Authentication failed. Please try again.`,
+ title: "Не удалось выполнить вход",
+ message: () => "Не удалось выполнить вход. Проверьте данные и попробуйте снова.",
+ },
+ [EAuthenticationErrorCodes.REQUIRED_EMAIL_PASSWORD_SIGN_IN]: {
+ title: "Нужны e-mail и пароль",
+ message: () => "Укажите e-mail и пароль, затем попробуйте снова.",
},
[EAuthenticationErrorCodes.INVALID_EMAIL_SIGN_IN]: {
- title: `Invalid email`,
- message: () => `Invalid email. Please try again.`,
- },
- [EAuthenticationErrorCodes.MAGIC_SIGN_IN_EMAIL_CODE_REQUIRED]: {
- title: `Email and code required`,
- message: () => `Email and code required. Please try again.`,
+ title: "Некорректный e-mail",
+ message: () => "Некорректный e-mail. Проверьте адрес и попробуйте снова.",
},
[EAuthenticationErrorCodes.INVALID_EMAIL_MAGIC_SIGN_IN]: {
- title: `Invalid email`,
- message: () => `Invalid email. Please try again.`,
+ title: "Некорректный e-mail",
+ message: () => "Некорректный e-mail. Проверьте адрес и попробуйте снова.",
+ },
+ [EAuthenticationErrorCodes.MAGIC_SIGN_IN_EMAIL_CODE_REQUIRED]: {
+ title: "Нужны e-mail и код",
+ message: () => "Укажите e-mail и код подтверждения, затем попробуйте снова.",
},
-
- // Both Sign in and Sign up
[EAuthenticationErrorCodes.INVALID_MAGIC_CODE_SIGN_IN]: {
- title: `Authentication failed`,
- message: () => `Invalid magic code. Please try again.`,
+ title: "Неверный код подтверждения",
+ message: () => "Код подтверждения неверный. Попробуйте снова.",
},
[EAuthenticationErrorCodes.INVALID_MAGIC_CODE_SIGN_UP]: {
- title: `Authentication failed`,
- message: () => `Invalid magic code. Please try again.`,
+ title: "Неверный код подтверждения",
+ message: () => "Код подтверждения неверный. Попробуйте снова.",
},
[EAuthenticationErrorCodes.EXPIRED_MAGIC_CODE_SIGN_IN]: {
- title: `Expired magic code`,
- message: () => `Expired magic code. Please try again.`,
+ title: "Код подтверждения истёк",
+ message: () => "Код подтверждения истёк. Запросите новый и попробуйте снова.",
},
[EAuthenticationErrorCodes.EXPIRED_MAGIC_CODE_SIGN_UP]: {
- title: `Expired magic code`,
- message: () => `Expired magic code. Please try again.`,
+ title: "Код подтверждения истёк",
+ message: () => "Код подтверждения истёк. Запросите новый и попробуйте снова.",
},
[EAuthenticationErrorCodes.EMAIL_CODE_ATTEMPT_EXHAUSTED_SIGN_IN]: {
- title: `Expired magic code`,
- message: () => `Expired magic code. Please try again.`,
+ title: "Лимит попыток исчерпан",
+ message: () => "Лимит попыток ввода кода исчерпан. Запросите новый код.",
},
[EAuthenticationErrorCodes.EMAIL_CODE_ATTEMPT_EXHAUSTED_SIGN_UP]: {
- title: `Expired magic code`,
- message: () => `Expired magic code. Please try again.`,
+ title: "Лимит попыток исчерпан",
+ message: () => "Лимит попыток ввода кода исчерпан. Запросите новый код.",
},
-
- // Oauth
[EAuthenticationErrorCodes.OAUTH_NOT_CONFIGURED]: {
- title: `OAuth not configured`,
- message: () => `OAuth not configured. Please contact your administrator.`,
+ title: "OAuth не настроен",
+ message: () => "OAuth не настроен. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.GOOGLE_NOT_CONFIGURED]: {
- title: `Google not configured`,
- message: () => `Google not configured. Please contact your administrator.`,
+ title: "Google OAuth не настроен",
+ message: () => "Google OAuth не настроен. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.GITHUB_NOT_CONFIGURED]: {
- title: `GitHub not configured`,
- message: () => `GitHub not configured. Please contact your administrator.`,
+ title: "GitHub OAuth не настроен",
+ message: () => "GitHub OAuth не настроен. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.GITLAB_NOT_CONFIGURED]: {
- title: `GitLab not configured`,
- message: () => `GitLab not configured. Please contact your administrator.`,
+ title: "GitLab OAuth не настроен",
+ message: () => "GitLab OAuth не настроен. Обратитесь к администратору.",
},
[EAuthenticationErrorCodes.GOOGLE_OAUTH_PROVIDER_ERROR]: {
- title: `Google OAuth provider error`,
- message: () => `Google OAuth provider error. Please try again.`,
+ title: "Ошибка Google OAuth",
+ message: () => "Не удалось авторизоваться через Google. Попробуйте снова.",
},
[EAuthenticationErrorCodes.GITHUB_OAUTH_PROVIDER_ERROR]: {
- title: `GitHub OAuth provider error`,
- message: () => `GitHub OAuth provider error. Please try again.`,
+ title: "Ошибка GitHub OAuth",
+ message: () => "Не удалось авторизоваться через GitHub. Попробуйте снова.",
},
[EAuthenticationErrorCodes.GITLAB_OAUTH_PROVIDER_ERROR]: {
- title: `GitLab OAuth provider error`,
- message: () => `GitLab OAuth provider error. Please try again.`,
+ title: "Ошибка GitLab OAuth",
+ message: () => "Не удалось авторизоваться через GitLab. Попробуйте снова.",
},
-
- // Reset Password
[EAuthenticationErrorCodes.INVALID_PASSWORD_TOKEN]: {
- title: `Invalid password token`,
- message: () => `Invalid password token.`,
+ title: "Некорректный токен",
+ message: () => "Токен сброса пароля некорректен.",
},
[EAuthenticationErrorCodes.EXPIRED_PASSWORD_TOKEN]: {
- title: `Expired password token`,
- message: () => `Expired password token. Please try again.`,
+ title: "Токен истёк",
+ message: () => "Токен сброса пароля истёк. Запросите новый.",
},
-
- // Change password
[EAuthenticationErrorCodes.MISSING_PASSWORD]: {
- title: `Password required`,
- message: () => `Password required. Please try again.`,
+ title: "Нужен пароль",
+ message: () => "Укажите пароль и попробуйте снова.",
},
[EAuthenticationErrorCodes.INCORRECT_OLD_PASSWORD]: {
- title: `Incorrect old password`,
- message: () => `Incorrect old password. Please try again.`,
+ title: "Неверный старый пароль",
+ message: () => "Неверный старый пароль. Попробуйте снова.",
},
[EAuthenticationErrorCodes.INVALID_NEW_PASSWORD]: {
- title: `Invalid new password`,
- message: () => `Invalid new password. Please try again.`,
+ title: "Некорректный новый пароль",
+ message: () => "Некорректный новый пароль. Проверьте требования и попробуйте снова.",
},
-
- // set password
[EAuthenticationErrorCodes.PASSWORD_ALREADY_SET]: {
- title: `Password already set`,
- message: () => `Password already set. Please try again.`,
+ title: "Пароль уже установлен",
+ message: () => "Пароль уже установлен. Попробуйте войти в систему.",
},
-
- // admin
[EAuthenticationErrorCodes.ADMIN_ALREADY_EXIST]: {
- title: `Admin already exists`,
- message: () => `Admin already exists. Please try again.`,
+ title: "Администратор уже существует",
+ message: () => "Администратор уже существует. Проверьте данные и попробуйте снова.",
},
[EAuthenticationErrorCodes.REQUIRED_ADMIN_EMAIL_PASSWORD_FIRST_NAME]: {
- title: `Email, password and first name required`,
- message: () => `Email, password and first name required. Please try again.`,
+ title: "Нужны имя, e-mail и пароль",
+ message: () => "Укажите имя, e-mail и пароль, затем попробуйте снова.",
},
[EAuthenticationErrorCodes.INVALID_ADMIN_EMAIL]: {
- title: `Invalid admin email`,
- message: () => `Invalid admin email. Please try again.`,
+ title: "Некорректный e-mail администратора",
+ message: () => "Некорректный e-mail администратора. Проверьте адрес и попробуйте снова.",
},
[EAuthenticationErrorCodes.INVALID_ADMIN_PASSWORD]: {
- title: `Invalid admin password`,
- message: () => `Invalid admin password. Please try again.`,
+ title: "Некорректный пароль администратора",
+ message: () => "Некорректный пароль администратора. Проверьте данные и попробуйте снова.",
},
[EAuthenticationErrorCodes.REQUIRED_ADMIN_EMAIL_PASSWORD]: {
- title: `Email and password required`,
- message: () => `Email and password required. Please try again.`,
+ title: "Нужны e-mail и пароль",
+ message: () => "Укажите e-mail и пароль, затем попробуйте снова.",
},
[EAuthenticationErrorCodes.ADMIN_AUTHENTICATION_FAILED]: {
- title: `Authentication failed`,
- message: () => `Authentication failed. Please try again.`,
+ title: "Не удалось выполнить вход",
+ message: () => "Не удалось выполнить вход. Проверьте данные и попробуйте снова.",
},
[EAuthenticationErrorCodes.ADMIN_USER_ALREADY_EXIST]: {
- title: `Admin user already exists`,
+ title: "Администратор уже существует",
message: () => (
- Admin user already exists.
-
- Sign In
+ Администратор уже существует.
+
+ Войти
- now.
+ сейчас.
),
},
[EAuthenticationErrorCodes.ADMIN_USER_DOES_NOT_EXIST]: {
- title: `Admin user does not exist`,
+ title: "Администратор не найден",
message: () => (
- Admin user does not exist.
-
- Sign In
+ Администратор не найден.
+
+ Войти
- now.
+ сейчас.
),
},
[EAuthenticationErrorCodes.ADMIN_USER_DEACTIVATED]: {
- title: `Admin user deactivated`,
- message: () =>
Your account is deactivated
,
+ title: "Аккаунт администратора деактивирован",
+ message: () =>
Аккаунт администратора деактивирован.
,
},
[EAuthenticationErrorCodes.RATE_LIMIT_EXCEEDED]: {
title: "",
- message: () => `Rate limit exceeded. Please try again later.`,
+ message: () => "Слишком много попыток. Повторите позже.",
},
};
@@ -427,13 +393,14 @@ export const authErrorHandler = (errorCode: EAuthenticationErrorCodes, email?: s
EAuthenticationErrorCodes.PASSWORD_TOO_WEAK,
];
- if (bannerAlertErrorCodes.includes(errorCode))
+ if (bannerAlertErrorCodes.includes(errorCode)) {
return {
type: EErrorAlertType.BANNER_ALERT,
code: errorCode,
- title: errorCodeMessages[errorCode]?.title || "Error",
- message: errorCodeMessages[errorCode]?.message(email) || "Something went wrong. Please try again.",
+ title: errorCodeMessages[errorCode]?.title || "Ошибка",
+ message: errorCodeMessages[errorCode]?.message(email) || "Что-то пошло не так. Попробуйте снова.",
};
+ }
return undefined;
};
diff --git a/plane-src/apps/web/styles/globals.css b/plane-src/apps/web/styles/globals.css
index a39b52f..c67db14 100644
--- a/plane-src/apps/web/styles/globals.css
+++ b/plane-src/apps/web/styles/globals.css
@@ -795,4 +795,239 @@
outline: none !important;
border-radius: 0.95rem !important;
}
+
+ .nodedc-auth-shell {
+ width: 100%;
+ max-width: 28rem;
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.75rem !important;
+ padding: 1.75rem !important;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.04) 0%, rgba(255, 255, 255, 0.015) 100%),
+ rgba(10, 10, 12, 0.82) !important;
+ -webkit-backdrop-filter: blur(34px);
+ backdrop-filter: blur(34px);
+ }
+
+ .nodedc-auth-banner {
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.15rem !important;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.038) 0%, rgba(255, 255, 255, 0.014) 100%),
+ rgba(var(--nodedc-accent-rgb), 0.12) !important;
+ color: rgb(var(--nodedc-accent-rgb)) !important;
+ -webkit-backdrop-filter: blur(24px);
+ backdrop-filter: blur(24px);
+ }
+
+ .nodedc-auth-input-shell {
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.15rem !important;
+ min-height: 3rem;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.028) 0%, rgba(255, 255, 255, 0.012) 100%),
+ rgba(255, 255, 255, 0.03) !important;
+ -webkit-backdrop-filter: blur(18px);
+ backdrop-filter: blur(18px);
+ }
+
+ .nodedc-auth-input-shell[data-error="true"] {
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.012) 100%),
+ rgba(255, 82, 82, 0.08) !important;
+ }
+
+ .nodedc-auth-input {
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ background: transparent !important;
+ color: var(--text-color-primary) !important;
+ }
+
+ .nodedc-auth-input::placeholder {
+ color: var(--text-color-placeholder) !important;
+ }
+
+ .nodedc-auth-link {
+ color: rgb(var(--nodedc-accent-rgb)) !important;
+ text-decoration: none !important;
+ }
+
+ .nodedc-auth-link:hover {
+ color: color-mix(in srgb, rgb(var(--nodedc-accent-rgb)) 82%, white) !important;
+ }
+
+ .nodedc-auth-primary-button {
+ width: 100%;
+ min-height: 3.25rem;
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.25rem !important;
+ background: rgb(var(--nodedc-card-active-rgb)) !important;
+ color: #0b1117 !important;
+ }
+
+ .nodedc-auth-primary-button:hover {
+ background: color-mix(in srgb, rgb(var(--nodedc-card-active-rgb)) 82%, white) !important;
+ color: #0b1117 !important;
+ }
+
+ .nodedc-error-shell {
+ width: 100%;
+ max-width: 36rem;
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.9rem !important;
+ padding: 2rem !important;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.04) 0%, rgba(255, 255, 255, 0.015) 100%),
+ rgba(10, 10, 12, 0.82) !important;
+ -webkit-backdrop-filter: blur(36px);
+ backdrop-filter: blur(36px);
+ }
+
+ .nodedc-error-link {
+ color: rgb(var(--nodedc-accent-rgb)) !important;
+ text-decoration: none !important;
+ }
+
+ .nodedc-error-link:hover {
+ color: color-mix(in srgb, rgb(var(--nodedc-accent-rgb)) 82%, white) !important;
+ }
+
+ .nodedc-error-primary {
+ min-height: 3rem;
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.2rem !important;
+ background: rgb(var(--nodedc-card-active-rgb)) !important;
+ color: #0b1117 !important;
+ padding-inline: 1.35rem !important;
+ }
+
+ .nodedc-error-primary:hover {
+ background: color-mix(in srgb, rgb(var(--nodedc-card-active-rgb)) 82%, white) !important;
+ color: #0b1117 !important;
+ }
+
+ .nodedc-empty-state-primary {
+ min-height: 3rem;
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.2rem !important;
+ background: rgb(var(--nodedc-card-active-rgb)) !important;
+ color: #0b1117 !important;
+ padding-inline: 1.35rem !important;
+ }
+
+ .nodedc-empty-state-primary:hover {
+ background: color-mix(in srgb, rgb(var(--nodedc-card-active-rgb)) 82%, white) !important;
+ color: #0b1117 !important;
+ }
+
+ .nodedc-empty-state-secondary {
+ min-height: 3rem;
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.2rem !important;
+ background: rgba(255, 255, 255, 0.06) !important;
+ color: var(--text-color-primary) !important;
+ padding-inline: 1.25rem !important;
+ }
+
+ .nodedc-empty-state-secondary:hover {
+ background: rgba(255, 255, 255, 0.1) !important;
+ color: var(--text-color-primary) !important;
+ }
+
+ .nodedc-external-sidebar-shell {
+ border: 0 !important;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.01) 100%),
+ rgba(8, 8, 11, 0.82) !important;
+ -webkit-backdrop-filter: blur(26px);
+ backdrop-filter: blur(26px);
+ }
+
+ .nodedc-external-tab {
+ min-height: 2.8rem;
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 999px !important;
+ background: transparent !important;
+ color: rgba(255, 255, 255, 0.78) !important;
+ padding-inline: 1rem !important;
+ }
+
+ .nodedc-external-tab:hover {
+ background: rgba(255, 255, 255, 0.05) !important;
+ color: var(--text-color-primary) !important;
+ }
+
+ .nodedc-external-tab[data-active="true"] {
+ background: rgba(255, 255, 255, 0.06) !important;
+ color: rgb(var(--nodedc-accent-rgb)) !important;
+ }
+
+ .nodedc-external-card {
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.9rem !important;
+ background: rgb(var(--nodedc-card-passive-rgb)) !important;
+ color: var(--text-color-primary) !important;
+ }
+
+ .nodedc-external-card[data-active="true"] {
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.028) 0%, rgba(255, 255, 255, 0.01) 100%),
+ rgba(255, 255, 255, 0.04) !important;
+ box-shadow: inset 0 0 0 1px rgba(var(--nodedc-accent-rgb), 0.3);
+ }
+
+ .nodedc-external-panel {
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.6rem !important;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.012) 100%),
+ rgba(255, 255, 255, 0.028) !important;
+ -webkit-backdrop-filter: blur(22px);
+ backdrop-filter: blur(22px);
+ }
+
+ .nodedc-external-section {
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.5rem !important;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.028) 0%, rgba(255, 255, 255, 0.012) 100%),
+ rgba(255, 255, 255, 0.024) !important;
+ -webkit-backdrop-filter: blur(20px);
+ backdrop-filter: blur(20px);
+ }
+
+ .nodedc-external-empty {
+ border: 0 !important;
+ outline: none !important;
+ box-shadow: none !important;
+ border-radius: 1.35rem !important;
+ background: rgba(255, 255, 255, 0.035) !important;
+ color: var(--text-color-secondary) !important;
+ }
}
diff --git a/plane-src/packages/propel/src/empty-state/detailed-empty-state.tsx b/plane-src/packages/propel/src/empty-state/detailed-empty-state.tsx
index be6d225..fa5d3d7 100644
--- a/plane-src/packages/propel/src/empty-state/detailed-empty-state.tsx
+++ b/plane-src/packages/propel/src/empty-state/detailed-empty-state.tsx
@@ -59,7 +59,16 @@ export function EmptyStateDetailed({
{actions.map((action, index) => {
const { label, variant, ...rest } = action;
return (
-
+
{label}
);