Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
67fa933
refactor: consolidate password strength indicator into shared UI package
anmolsinghbhatia Jul 23, 2025
c13e8ff
chore: remove old password strength meter implementations
anmolsinghbhatia Jul 23, 2025
f71e842
chore: update package dependencies for password strength refactor
anmolsinghbhatia Jul 23, 2025
de44915
chore: code refactor
anmolsinghbhatia Jul 23, 2025
3e63183
Merge branch 'chore-consolidate-password-strength-indicator' of githu…
anmolsinghbhatia Jul 23, 2025
c45a6b8
Merge branch 'preview' of github.com:makeplane/plane into feat-onboar…
anmolsinghbhatia Jul 25, 2025
ba491c1
chore: brand logo added
anmolsinghbhatia Jul 25, 2025
cef1ad6
chore: terms and conditions refactor
anmolsinghbhatia Jul 25, 2025
acda27c
chore: auth form refactor
anmolsinghbhatia Jul 25, 2025
0281e2b
chore: oauth enhancements and refactor
anmolsinghbhatia Jul 25, 2025
7dc75d5
chore: plane new logos added
anmolsinghbhatia Jul 25, 2025
f7ec8dc
chore: auth input form field added to ui package
anmolsinghbhatia Jul 25, 2025
62c5eb2
chore: password input component added
anmolsinghbhatia Jul 25, 2025
6d47051
chore: web auth refactor
anmolsinghbhatia Jul 25, 2025
2e8d4a5
chore: update brand colors and remove onboarding-specific styles
anmolsinghbhatia Jul 25, 2025
905810f
chore: clean up unused assets
anmolsinghbhatia Jul 28, 2025
27c3aac
chore: profile menu text overflow
anmolsinghbhatia Jul 29, 2025
ae9ce4c
chore: theme related changes
anmolsinghbhatia Jul 29, 2025
d7d2442
chore: logo spinner updated
anmolsinghbhatia Jul 29, 2025
fa2b024
chore: onboarding constant and types updated
anmolsinghbhatia Jul 29, 2025
4820e5a
chore: theme changes and code refactor
anmolsinghbhatia Jul 29, 2025
2507f62
feat: onboarding flow revamp
anmolsinghbhatia Jul 29, 2025
fda05b5
fix: build error and code refactoring
anmolsinghbhatia Jul 29, 2025
aa55aff
chore: code refactor
anmolsinghbhatia Jul 29, 2025
ea82f15
fix: build error
anmolsinghbhatia Jul 29, 2025
2ac0a52
chore: consent option added to onboarding and code refactor
anmolsinghbhatia Jul 30, 2025
b88602b
fix: build fix
anmolsinghbhatia Jul 30, 2025
4812ccd
chore: code refactor
anmolsinghbhatia Jul 30, 2025
4297121
preview sync
anmolsinghbhatia Jul 30, 2025
da09560
chore: auth screen revamp and code refactor
anmolsinghbhatia Jul 30, 2025
a331a17
chore: onboarding enhancements
anmolsinghbhatia Jul 31, 2025
e3adef0
chore: code refactor
anmolsinghbhatia Jul 31, 2025
4632d59
chore: onboarding logic improvement
anmolsinghbhatia Jul 31, 2025
d65c887
chore: code refactor
anmolsinghbhatia Jul 31, 2025
3d20cef
fix: onboarding pre release improvements
anmolsinghbhatia Jul 31, 2025
473d104
Merge branch 'preview' of github.com:makeplane/plane into feat-onboar…
anmolsinghbhatia Aug 5, 2025
9c4f62d
chore: color token updated
anmolsinghbhatia Aug 5, 2025
4fc8522
chore: color token updated
anmolsinghbhatia Aug 5, 2025
df0af62
chore: auth screen line height and size improvements
anmolsinghbhatia Aug 5, 2025
3864069
chore: input height updated
anmolsinghbhatia Aug 5, 2025
f83a2b9
chore: n-progress theme updated
anmolsinghbhatia Aug 5, 2025
bfff930
chore: theme and logo enhancements
anmolsinghbhatia Aug 5, 2025
c16fca1
chore: space auth and code refactor
anmolsinghbhatia Aug 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/admin/app/(all)/(dashboard)/sidebar-dropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export const AdminSidebarDropdown = observer(() => {
)}
>
<div className="flex flex-col gap-2.5 pb-2">
<span className="px-2 text-custom-sidebar-text-200">{currentUser?.email}</span>
<span className="px-2 text-custom-sidebar-text-200 truncate">{currentUser?.email}</span>
</div>
<div className="py-2">
<Menu.Item
Expand Down
74 changes: 37 additions & 37 deletions apps/admin/styles/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,24 @@
:root {
color-scheme: light !important;

--color-primary-10: 236, 241, 255;
--color-primary-20: 217, 228, 255;
--color-primary-30: 197, 214, 255;
--color-primary-40: 178, 200, 255;
--color-primary-50: 159, 187, 255;
--color-primary-60: 140, 173, 255;
--color-primary-70: 121, 159, 255;
--color-primary-80: 101, 145, 255;
--color-primary-90: 82, 132, 255;
--color-primary-100: 63, 118, 255;
--color-primary-200: 57, 106, 230;
--color-primary-300: 50, 94, 204;
--color-primary-400: 44, 83, 179;
--color-primary-500: 38, 71, 153;
--color-primary-600: 32, 59, 128;
--color-primary-700: 25, 47, 102;
--color-primary-800: 19, 35, 76;
--color-primary-900: 13, 24, 51;
--color-primary-10: 229, 243, 250;
--color-primary-20: 216, 237, 248;
--color-primary-30: 199, 229, 244;
--color-primary-40: 169, 214, 239;
--color-primary-50: 144, 202, 234;
--color-primary-60: 109, 186, 227;
--color-primary-70: 75, 170, 221;
--color-primary-80: 41, 154, 214;
--color-primary-90: 34, 129, 180;
--color-primary-100: 0, 99, 153;
--color-primary-200: 0, 92, 143;
--color-primary-300: 0, 86, 133;
--color-primary-400: 0, 77, 117;
--color-primary-500: 0, 66, 102;
--color-primary-600: 0, 53, 82;
--color-primary-700: 0, 43, 66;
--color-primary-800: 0, 33, 51;
--color-primary-900: 0, 23, 36;

--color-background-100: 255, 255, 255; /* primary bg */
--color-background-90: 247, 247, 247; /* secondary bg */
Expand Down Expand Up @@ -197,6 +197,25 @@
[data-theme="dark-contrast"] {
color-scheme: dark !important;

--color-primary-10: 8, 31, 43;
--color-primary-20: 10, 37, 51;
--color-primary-30: 13, 49, 69;
--color-primary-40: 16, 58, 81;
--color-primary-50: 18, 68, 94;
--color-primary-60: 23, 86, 120;
--color-primary-70: 28, 104, 146;
--color-primary-80: 31, 116, 163;
--color-primary-90: 34, 129, 180;
--color-primary-100: 40, 146, 204;
--color-primary-200: 41, 154, 214;
--color-primary-300: 75, 170, 221;
--color-primary-400: 109, 186, 227;
--color-primary-500: 144, 202, 234;
--color-primary-600: 169, 214, 239;
--color-primary-700: 199, 229, 244;
--color-primary-800: 216, 237, 248;
--color-primary-900: 229, 243, 250;

--color-background-100: 25, 25, 25; /* primary bg */
--color-background-90: 32, 32, 32; /* secondary bg */
--color-background-80: 44, 44, 44; /* tertiary bg */
Expand Down Expand Up @@ -286,25 +305,6 @@
[data-theme="dark"],
[data-theme="light-contrast"],
[data-theme="dark-contrast"] {
--color-primary-10: 236, 241, 255;
--color-primary-20: 217, 228, 255;
--color-primary-30: 197, 214, 255;
--color-primary-40: 178, 200, 255;
--color-primary-50: 159, 187, 255;
--color-primary-60: 140, 173, 255;
--color-primary-70: 121, 159, 255;
--color-primary-80: 101, 145, 255;
--color-primary-90: 82, 132, 255;
--color-primary-100: 63, 118, 255;
--color-primary-200: 57, 106, 230;
--color-primary-300: 50, 94, 204;
--color-primary-400: 44, 83, 179;
--color-primary-500: 38, 71, 153;
--color-primary-600: 32, 59, 128;
--color-primary-700: 25, 47, 102;
--color-primary-800: 19, 35, 76;
--color-primary-900: 13, 24, 51;

--color-sidebar-background-100: var(--color-background-100); /* primary sidebar bg */
--color-sidebar-background-90: var(--color-background-90); /* secondary sidebar bg */
--color-sidebar-background-80: var(--color-background-80); /* tertiary sidebar bg */
Expand Down
14 changes: 6 additions & 8 deletions apps/space/core/components/account/auth-forms/auth-header.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
"use client";

import { FC, ReactNode } from "react";
import { FC } from "react";
// helpers
import { EAuthModes } from "@/types/auth";

type TAuthHeader = {
authMode: EAuthModes;
children: ReactNode;
};

type TAuthHeaderContent = {
Expand All @@ -30,15 +29,15 @@ const Titles: TAuthHeaderDetails = {
};

export const AuthHeader: FC<TAuthHeader> = (props) => {
const { authMode, children } = props;
const { authMode } = props;

const getHeaderSubHeader = (mode: EAuthModes | null): TAuthHeaderContent => {
if (mode) {
return Titles[mode];
}

return {
header: "Comment or react to work itemss",
header: "Comment or react to work items",
subHeader: "Use plane to add your valuable inputs to features.",
};
};
Expand All @@ -47,11 +46,10 @@ export const AuthHeader: FC<TAuthHeader> = (props) => {

return (
<>
<div className="space-y-1 text-center">
<h3 className="text-xl sm:text-2xl md:text-3xl font-bold text-onboarding-text-100">{header}</h3>
<p className="text-xs sm:text-sm md:text-base font-medium text-onboarding-text-400">{subHeader}</p>
<div className="flex flex-col gap-1">
<span className="text-2xl font-semibold text-custom-text-100 leading-7">{header}</span>
<span className="text-2xl font-semibold text-custom-text-400 leading-7">{subHeader}</span>
</div>
{children}
</>
);
};
61 changes: 56 additions & 5 deletions apps/space/core/components/account/auth-forms/auth-root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@

import React, { FC, useEffect, useState } from "react";
import { observer } from "mobx-react";
import Image from "next/image";
import { useSearchParams } from "next/navigation";
import { useTheme } from "next-themes";
// plane imports
import { API_BASE_URL } from "@plane/constants";
import { SitesAuthService } from "@plane/services";
import { IEmailCheckData } from "@plane/types";
import { OAuthOptions } from "@plane/ui";
// components
import {
AuthHeader,
AuthBanner,
AuthEmailForm,
AuthUniqueCodeForm,
AuthPasswordForm,
OAuthOptions,
TermsAndConditions,
} from "@/components/account";
// helpers
Expand All @@ -27,6 +30,11 @@ import {
import { useInstance } from "@/hooks/store";
// types
import { EAuthModes, EAuthSteps } from "@/types/auth";
// assets
import GithubLightLogo from "/public/logos/github-black.png";
import GithubDarkLogo from "/public/logos/github-dark.svg";
import GitlabLogo from "/public/logos/gitlab-logo.svg";
import GoogleLogo from "/public/logos/google-logo.svg";

const authService = new SitesAuthService();

Expand All @@ -36,13 +44,15 @@ export const AuthRoot: FC = observer(() => {
const emailParam = searchParams.get("email") || undefined;
const error_code = searchParams.get("error_code") || undefined;
const nextPath = searchParams.get("next_path") || undefined;
const next_path = searchParams.get("next_path");
// states
const [authMode, setAuthMode] = useState<EAuthModes>(EAuthModes.SIGN_UP);
const [authStep, setAuthStep] = useState<EAuthSteps>(EAuthSteps.EMAIL);
const [email, setEmail] = useState(emailParam ? emailParam.toString() : "");
const [errorInfo, setErrorInfo] = useState<TAuthErrorInfo | undefined>(undefined);
const [isPasswordAutoset, setIsPasswordAutoset] = useState(true);
// hooks
const { resolvedTheme } = useTheme();
const { config } = useInstance();

useEffect(() => {
Expand Down Expand Up @@ -146,12 +156,54 @@ export const AuthRoot: FC = observer(() => {
});
};

const content = authMode === EAuthModes.SIGN_UP ? "Sign up" : "Sign in";

const OAuthConfig = [
{
id: "google",
text: `${content} with Google`,
icon: <Image src={GoogleLogo} height={18} width={18} alt="Google Logo" />,
onClick: () => {
window.location.assign(`${API_BASE_URL}/auth/google/${next_path ? `?next_path=${next_path}` : ``}`);
},
enabled: config?.is_google_enabled,
},
{
id: "github",
text: `${content} with GitHub`,
icon: (
<Image
src={resolvedTheme === "dark" ? GithubDarkLogo : GithubLightLogo}
height={18}
width={18}
alt="GitHub Logo"
/>
),
onClick: () => {
window.location.assign(`${API_BASE_URL}/auth/github/${next_path ? `?next_path=${next_path}` : ``}`);
},
enabled: config?.is_github_enabled,
},
{
id: "gitlab",
text: `${content} with GitLab`,
icon: <Image src={GitlabLogo} height={18} width={18} alt="GitLab Logo" />,
onClick: () => {
window.location.assign(`${API_BASE_URL}/auth/gitlab/${next_path ? `?next_path=${next_path}` : ``}`);
},
enabled: config?.is_gitlab_enabled,
},
];

return (
<div className="relative flex flex-col space-y-6">
<AuthHeader authMode={authMode}>
<div className="flex flex-col justify-center items-center flex-grow w-full py-6 mt-10">
<div className="relative flex flex-col gap-6 max-w-[22.5rem] w-full">
{errorInfo && errorInfo?.type === EErrorAlertType.BANNER_ALERT && (
<AuthBanner bannerData={errorInfo} handleBannerData={(value) => setErrorInfo(value)} />
)}
<AuthHeader authMode={authMode} />
{isOAuthEnabled && <OAuthOptions options={OAuthConfig} compact={authStep === EAuthSteps.PASSWORD} />}

{authStep === EAuthSteps.EMAIL && <AuthEmailForm defaultEmail={email} onSubmit={handleEmailVerification} />}
{authStep === EAuthSteps.UNIQUE_CODE && (
<AuthUniqueCodeForm
Expand Down Expand Up @@ -182,9 +234,8 @@ export const AuthRoot: FC = observer(() => {
}}
/>
)}
{isOAuthEnabled && <OAuthOptions />}
<TermsAndConditions isSignUp={authMode === EAuthModes.SIGN_UP ? true : false} />
</AuthHeader>
</div>
</div>
);
});
10 changes: 5 additions & 5 deletions apps/space/core/components/account/auth-forms/email.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ export const AuthEmailForm: FC<TAuthEmailForm> = observer((props) => {
return (
<form onSubmit={handleFormSubmit} className="mt-5 space-y-4">
<div className="space-y-1">
<label className="text-sm text-onboarding-text-300 font-medium" htmlFor="email">
<label className="text-sm text-custom-text-300 font-medium" htmlFor="email">
Email
</label>
<div
className={cn(
`relative flex items-center rounded-md bg-onboarding-background-200 border`,
!isFocused && Boolean(emailError?.email) ? `border-red-500` : `border-onboarding-border-100`
`relative flex items-center rounded-md bg-custom-background-100 border`,
!isFocused && Boolean(emailError?.email) ? `border-red-500` : `border-custom-border-100`
)}
onFocus={() => {
setIsFocused(true);
Expand All @@ -68,7 +68,7 @@ export const AuthEmailForm: FC<TAuthEmailForm> = observer((props) => {
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="name@company.com"
className={`disable-autofill-style h-[46px] w-full placeholder:text-onboarding-text-400 autofill:bg-red-500 border-0 focus:bg-none active:bg-transparent`}
className={`disable-autofill-style h-10 w-full placeholder:text-custom-text-400 autofill:bg-red-500 border-0 focus:bg-none active:bg-transparent`}
autoComplete="on"
autoFocus
ref={inputRef}
Expand All @@ -83,7 +83,7 @@ export const AuthEmailForm: FC<TAuthEmailForm> = observer((props) => {
}}
tabIndex={-1}
>
<XCircle className="h-[46px] w-11 px-3 stroke-custom-text-400 hover:cursor-pointer text-xs" />
<XCircle className="h-10 w-11 px-3 stroke-custom-text-400 hover:cursor-pointer text-xs" />
</button>
)}
</div>
Expand Down
18 changes: 9 additions & 9 deletions apps/space/core/components/account/auth-forms/password.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,11 @@ export const AuthPasswordForm: React.FC<Props> = observer((props: Props) => {
<input type="hidden" value={passwordFormData.email} name="email" />
<input type="hidden" value={nextPath} name="next_path" />
<div className="space-y-1">
<label className="text-sm font-medium text-onboarding-text-300" htmlFor="email">
<label className="text-sm font-medium text-custom-text-300" htmlFor="email">
Email
</label>
<div
className={`relative flex items-center rounded-md bg-onboarding-background-200 border border-onboarding-border-100`}
className={`relative flex items-center rounded-md bg-custom-background-100 border border-custom-border-100`}
>
<Input
id="email"
Expand All @@ -130,7 +130,7 @@ export const AuthPasswordForm: React.FC<Props> = observer((props: Props) => {
value={passwordFormData.email}
onChange={(e) => handleFormChange("email", e.target.value)}
placeholder="name@company.com"
className={`disable-autofill-style h-[46px] w-full placeholder:text-onboarding-text-400 border-0`}
className={`disable-autofill-style h-10 w-full placeholder:text-custom-text-400 border-0`}
disabled
/>
{passwordFormData.email.length > 0 && (
Expand All @@ -143,17 +143,17 @@ export const AuthPasswordForm: React.FC<Props> = observer((props: Props) => {
</div>

<div className="space-y-1">
<label className="text-sm text-onboarding-text-300 font-medium" htmlFor="password">
<label className="text-sm text-custom-text-300 font-medium" htmlFor="password">
{mode === EAuthModes.SIGN_IN ? "Password" : "Set a password"}
</label>
<div className="relative flex items-center rounded-md bg-onboarding-background-200">
<div className="relative flex items-center rounded-md bg-custom-background-100">
<Input
type={showPassword?.password ? "text" : "password"}
name="password"
value={passwordFormData.password}
onChange={(e) => handleFormChange("password", e.target.value)}
placeholder="Enter password"
className="disable-autofill-style h-[46px] w-full border border-onboarding-border-100 !bg-onboarding-background-200 pr-12 placeholder:text-onboarding-text-400"
className="disable-autofill-style h-10 w-full border border-custom-border-100 !bg-custom-background-100 pr-12 placeholder:text-custom-text-400"
onFocus={() => setIsPasswordInputFocused(true)}
onBlur={() => setIsPasswordInputFocused(false)}
autoComplete="on"
Expand All @@ -176,17 +176,17 @@ export const AuthPasswordForm: React.FC<Props> = observer((props: Props) => {

{mode === EAuthModes.SIGN_UP && (
<div className="space-y-1">
<label className="text-sm text-onboarding-text-300 font-medium" htmlFor="confirm_password">
<label className="text-sm text-custom-text-300 font-medium" htmlFor="confirm_password">
Confirm password
</label>
<div className="relative flex items-center rounded-md bg-onboarding-background-200">
<div className="relative flex items-center rounded-md bg-custom-background-100">
<Input
type={showPassword?.retypePassword ? "text" : "password"}
name="confirm_password"
value={passwordFormData.confirm_password}
onChange={(e) => handleFormChange("confirm_password", e.target.value)}
placeholder="Confirm password"
className="disable-autofill-style h-[46px] w-full border border-onboarding-border-100 !bg-onboarding-background-200 pr-12 placeholder:text-onboarding-text-400"
className="disable-autofill-style h-10 w-full border border-custom-border-100 !bg-custom-background-100 pr-12 placeholder:text-custom-text-400"
onFocus={() => setIsRetryPasswordInputFocused(true)}
onBlur={() => setIsRetryPasswordInputFocused(false)}
/>
Expand Down
Loading