Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
a550197
fix(org): reduce organization settings query payload (#5538)
idoshamun Feb 22, 2026
903246d
feat(onboarding): add redesigned onboarding page and remove header se…
tsahimatsliah Feb 24, 2026
7c7fd58
feat(onboarding): improve feed preview, scroll behavior, and modal UX
tsahimatsliah Feb 24, 2026
fc2a895
feat(onboarding): polish onboarding v2 feed dynamics and setup flows
tsahimatsliah Feb 24, 2026
8e36c2b
feat: add magical breathing glow animation to onboarding hero cover
tsahimatsliah Feb 25, 2026
3bb7226
feat(onboarding): add mobile header bar and polish hero section
tsahimatsliah Feb 25, 2026
4b876ff
Merge branch 'main' into feat/redesign-onboarding
tsahimatsliah Feb 25, 2026
d1e5ecc
fix(onboarding): remove unused variable and replace for...of loop to …
github-actions[bot] Feb 25, 2026
a9488ca
fix(onboarding): fix all review issues - DOM mutations, hardcoded col…
github-actions[bot] Feb 25, 2026
1433346
Merge branch 'main' into feat/redesign-onboarding
tsahimatsliah Feb 25, 2026
3523eb3
fix(onboarding): move background-size to CSS class to fix no-custom-c…
github-actions[bot] Feb 25, 2026
cc9764e
Merge branch 'main' into feat/redesign-onboarding
tsahimatsliah Feb 25, 2026
dda02ca
fix(onboarding): resolve ESLint errors breaking build and CI
tsahimatsliah Feb 25, 2026
256d6b0
fix(onboarding): resolve all ESLint errors to fix Vercel and CircleCI…
github-actions[bot] Feb 25, 2026
a45201a
fix(sidebar): satisfy lint formatting in desktop sidebar
tsahimatsliah Feb 25, 2026
d900665
Merge remote-tracking branch 'origin/feat/redesign-onboarding' into f…
github-actions[bot] Feb 25, 2026
4f3829d
fix(onboarding): fix remaining lint errors after merge
github-actions[bot] Feb 25, 2026
a89a164
Merge remote-tracking branch 'origin/feat/redesign-onboarding' into f…
github-actions[bot] Feb 25, 2026
c9c7628
Merge branch 'main' into feat/redesign-onboarding
tsahimatsliah Feb 25, 2026
c26bb12
Merge remote-tracking branch 'origin/feat/redesign-onboarding' into f…
github-actions[bot] Feb 25, 2026
375ecd5
feat(onboarding): rewrite engagement animation from scratch for perfe…
tsahimatsliah Feb 26, 2026
965e3ef
feat(onboarding): scale up engagement animation with dynamic numbers …
tsahimatsliah Feb 26, 2026
3f5d57b
fix(onboarding): use correct semantic colors for engagement animation
tsahimatsliah Feb 26, 2026
a4bcccf
fix(onboarding): hide scroll to top button on onboarding v2
tsahimatsliah Feb 26, 2026
0645686
fix(onboarding): refine onboarding v2 modal polish
tsahimatsliah Feb 26, 2026
cbff82d
fix(onboarding): refresh onboarding v2 bullet styling and copy
tsahimatsliah Feb 26, 2026
6d3ccc4
fix(onboarding): fix all ESLint and TypeScript build errors
github-actions[bot] Feb 26, 2026
5318a1c
fix(onboarding): fix all review issues in onboarding-v2
github-actions[bot] Feb 26, 2026
00a0d70
fix(onboarding): fix no-param-reassign, no-multi-assign, and prettier…
github-actions[bot] Feb 26, 2026
40a43b8
fix(onboarding): restore subtree:true on MutationObserver to fix feed…
github-actions[bot] Feb 27, 2026
3300321
fix(onboarding): route header signup through layout callback and alig…
tsahimatsliah Feb 27, 2026
dd69925
Merge origin/main into feat/redesign-onboarding
tsahimatsliah Feb 27, 2026
abe0765
fix(onboarding): clip engagement floaters within article bounds and s…
tsahimatsliah Mar 2, 2026
ac73528
fix(onboarding): resolve lint errors in floater code and FooterNavBar…
tsahimatsliah Mar 2, 2026
08f4431
fix(onboarding): restore engagement floater visibility
tsahimatsliah Mar 2, 2026
4ecf5f6
fix(onboarding): defer panel observer until feed is visible and relax…
tsahimatsliah Mar 2, 2026
a8cb5fe
fix(onboarding): speed up engagement floaters and position closer to …
tsahimatsliah Mar 2, 2026
8ed36d7
fix(onboarding): faster engagement floaters, uniform position, no lan…
tsahimatsliah Mar 2, 2026
f114859
fix(onboarding): engagement floaters instantly visible and tight to c…
tsahimatsliah Mar 2, 2026
8cb271a
fix(onboarding): refine engagement animation size, position, and timing
tsahimatsliah Mar 2, 2026
344dbf1
fix(onboarding): rewrite engagement animation to match Polymarket style
tsahimatsliah Mar 2, 2026
8fec551
Revert "fix(onboarding): rewrite engagement animation to match Polyma…
tsahimatsliah Mar 2, 2026
32610e9
fix(onboarding): improve engagement animation reliability and polish
tsahimatsliah Mar 2, 2026
3b1450d
fix(onboarding): improve mobile rising tags visibility
tsahimatsliah Mar 2, 2026
7d026e1
feat(onboarding): add auth provider signup popup before extension promo
tsahimatsliah Mar 2, 2026
b81bae2
fix(onboarding): polish auth signup popup and wire into AI flow only
tsahimatsliah Mar 2, 2026
777b6ac
Merge branch 'main' into feat/redesign-onboarding
AmarTrebinjac Mar 3, 2026
6dd11a8
Merge branch 'main' into feat/redesign-onboarding
AmarTrebinjac Mar 3, 2026
60e63a9
fix lint
AmarTrebinjac Mar 4, 2026
2e2287e
smooth out animations
AmarTrebinjac Mar 4, 2026
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
22 changes: 8 additions & 14 deletions packages/shared/src/components/InteractionCounter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export default function InteractionCounter({
}, [value]);

const elementClassName = classNames(
'flex h-5 min-w-[1ch] flex-col overflow-hidden',
'flex h-5 min-w-[2ch] flex-col items-start overflow-hidden text-left !leading-5',
className,
);

Expand All @@ -49,27 +49,21 @@ export default function InteractionCounter({
setShownValue(value);
};

const childClassName =
'h-5 inline-block transition-[opacity,transform] ease-in-out duration-300 will-change-[opacity,transform]';
const animationContainerClassName =
'flex flex-col items-start transition-transform duration-300 ease-in-out will-change-transform';
const rowClassName = 'inline-block h-5 shrink-0 !leading-5';

return (
<span className={elementClassName} {...props}>
<span
className={classNames(
childClassName,
animate ? '-translate-y-full opacity-0' : 'translate-y-0 opacity-100',
)}
>
{largeNumberFormat(shownValue)}
</span>
<span
className={classNames(
childClassName,
animate ? '-translate-y-full opacity-100' : 'translate-y-0 opacity-0',
animationContainerClassName,
animate ? '-translate-y-5' : 'translate-y-0',
)}
onTransitionEnd={updateShownValue}
>
{largeNumberFormat(value)}
<span className={rowClassName}>{largeNumberFormat(shownValue)}</span>
<span className={rowClassName}>{largeNumberFormat(value)}</span>
</span>
</span>
);
Expand Down
7 changes: 7 additions & 0 deletions packages/shared/src/components/LoginButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ interface ClassName {

interface LoginButtonProps {
className?: ClassName;
onSignupClick?: () => boolean | void;
}

enum ButtonCopy {
Expand All @@ -32,11 +33,17 @@ const getLogEvent = (copy: ButtonCopy): LogEvent => ({

export default function LoginButton({
className = {},
onSignupClick,
}: LoginButtonProps): ReactElement {
const { logEvent } = useLogContext();
const { showLogin } = useAuthContext();
const onClick = (copy: ButtonCopy) => {
logEvent(getLogEvent(copy));

if (copy === ButtonCopy.Signup && onSignupClick?.()) {
return;
}

showLogin({
trigger: AuthTriggers.MainButton,
options: {
Expand Down
29 changes: 28 additions & 1 deletion packages/shared/src/components/MainLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { PromptElement } from './modals/Prompt';
import { useNotificationParams } from '../hooks/useNotificationParams';
import { useAuthContext } from '../contexts/AuthContext';
import { SharedFeedPage } from './utilities';
import { isTesting, onboardingUrl } from '../lib/constants';
import { isTesting, onboardingUrl, onboardingV2Path } from '../lib/constants';
import { useBanner } from '../hooks/useBanner';
import { useGrowthBookContext } from './GrowthBookProvider';
import {
Expand Down Expand Up @@ -58,6 +58,7 @@ export interface MainLayoutProps
screenCentered?: boolean;
customBanner?: ReactNode;
showSidebar?: boolean;
sidebarDisabled?: boolean;
onNavTabClick?: (tab: string) => void;
canGoBack?: string;
hideBackButton?: boolean;
Expand All @@ -71,8 +72,10 @@ function MainLayoutComponent({
isNavItemsButton,
customBanner,
additionalButtons,
hideSearchField,
screenCentered = true,
showSidebar = true,
sidebarDisabled = true,
className,
onLogoClick,
onNavTabClick,
Expand All @@ -97,6 +100,26 @@ function MainLayoutComponent({
useAuthVerificationRecovery();
useNotificationParams();

const onSignupClick = (): boolean => {
if (router.pathname !== onboardingV2Path) {
return false;
}

router.replace(
{
pathname: router.pathname,
query: {
...router.query,
onbSignup: '1',
},
},
undefined,
{ shallow: true },
);

return true;
};

useEffect(() => {
if (!isNotificationsReady || unreadCount === 0 || hasLoggedImpression) {
return;
Expand Down Expand Up @@ -192,7 +215,9 @@ function MainLayoutComponent({
hasBanner={isBannerAvailable}
sidebarRendered={sidebarRendered}
additionalButtons={additionalButtons}
hideSearchField={hideSearchField}
onLogoClick={onLogoClick}
onSignupClick={onSignupClick}
/>
<main
className={classNames(
Expand All @@ -202,6 +227,7 @@ function MainLayoutComponent({
isAuthReady &&
!isScreenCentered &&
sidebarExpanded &&
!sidebarDisabled &&
'laptop:!pl-60',
isBannerAvailable && 'laptop:pt-24',
)}
Expand All @@ -212,6 +238,7 @@ function MainLayoutComponent({
onNavTabClick={onNavTabClick}
onLogoClick={onLogoClick}
activePage={activePage}
disabled={sidebarDisabled}
/>
)}
{children}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export const OnboardingRegistrationForm = ({
onLogin={() => onExistingEmail?.('')}
className={{
container:
'mx-auto mt-6 text-center text-text-secondary typo-callout',
'mx-auto mt-6 w-full justify-center border-t border-border-subtlest-tertiary pt-6 text-center text-text-secondary typo-callout',
login: '!text-inherit',
}}
/>
Expand Down
13 changes: 8 additions & 5 deletions packages/shared/src/components/auth/RegistrationForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import {
TypographyTag,
TypographyType,
} from '../typography/Typography';
import { onboardingGradientClasses } from '../onboarding/common';

import { useAuthData } from '../../contexts/AuthDataContext';
import { authAtom } from '../../features/onboarding/store/onboarding.store';
import { FunnelTargetId } from '../../features/onboarding/types/funnelEvents';
Expand Down Expand Up @@ -81,6 +81,8 @@ const RegistrationForm = ({
const [isSubmitted, setIsSubmitted] = useState<boolean>(false);
const [name, setName] = useState('');
const isRecruiterOnboarding = trigger === AuthTriggers.RecruiterSelfServe;
const hideExperienceLevel =
isRecruiterOnboarding || trigger === AuthTriggers.Onboarding;
const {
username,
setUsername,
Expand Down Expand Up @@ -162,7 +164,7 @@ const RegistrationForm = ({
);
delete values?.['cf-turnstile-response'];

const requiresExperienceLevel = !isRecruiterOnboarding;
const requiresExperienceLevel = !hideExperienceLevel;
if (
!values['traits.name']?.length ||
!values['traits.username']?.length ||
Expand Down Expand Up @@ -271,9 +273,10 @@ const RegistrationForm = ({
variant={ButtonVariant.Secondary}
/>
<Typography
className={classNames('mt-0.5 flex-1', onboardingGradientClasses)}
className="mt-0.5 flex-1 text-text-primary"
tag={TypographyTag.H2}
type={TypographyType.Title1}
type={TypographyType.Title2}
bold
>
Join daily.dev
</Typography>
Expand Down Expand Up @@ -385,7 +388,7 @@ const RegistrationForm = ({
}
rightIcon={usernameIcon}
/>
{!isRecruiterOnboarding && (
{!hideExperienceLevel && (
<ExperienceLevelDropdown
className={{ container: 'w-full' }}
name="traits.experienceLevel"
Expand Down
32 changes: 18 additions & 14 deletions packages/shared/src/components/auth/SocialRegistrationForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type {
AuthTriggersType,
SocialRegistrationParameters,
} from '../../lib/auth';
import { AuthEventNames } from '../../lib/auth';
import { AuthEventNames, AuthTriggers } from '../../lib/auth';
import { formToJson } from '../../lib/form';
import { Button, ButtonVariant } from '../buttons/Button';
import ImageInput from '../fields/ImageInput';
Expand Down Expand Up @@ -57,9 +57,11 @@ export const SocialRegistrationForm = ({
onSignup,
isLoading,
simplified,
trigger,
}: SocialRegistrationFormProps): ReactElement => {
const { logEvent } = useLogContext();
const { user } = useContext(AuthContext);
const hideExperienceLevel = trigger === AuthTriggers.Onboarding;
const [nameHint, setNameHint] = useState<string>(null);
const [usernameHint, setUsernameHint] = useState<string>(null);
const [experienceLevelHint, setExperienceLevelHint] = useState<string>(null);
Expand Down Expand Up @@ -118,7 +120,7 @@ export const SocialRegistrationForm = ({
return;
}

if (!values.experienceLevel?.length) {
if (!hideExperienceLevel && !values.experienceLevel?.length) {
logError('Experience level not provided');
setExperienceLevelHint('Please select your experience level');
return;
Expand Down Expand Up @@ -229,18 +231,20 @@ export const SocialRegistrationForm = ({
}
rightIcon={isLoadingUsername ? <Loader /> : null}
/>
<ExperienceLevelDropdown
className={{ container: 'w-full' }}
name="experienceLevel"
onChange={() => {
if (experienceLevelHint) {
setExperienceLevelHint(null);
}
}}
valid={experienceLevelHint === null}
hint={experienceLevelHint}
saveHintSpace
/>
{!hideExperienceLevel && (
<ExperienceLevelDropdown
className={{ container: 'w-full' }}
name="experienceLevel"
onChange={() => {
if (experienceLevelHint) {
setExperienceLevelHint(null);
}
}}
valid={experienceLevelHint === null}
hint={experienceLevelHint}
saveHintSpace
/>
)}
<span className="border-b border-border-subtlest-tertiary pb-4 text-text-secondary typo-subhead">
Your email will be used to send you product and community updates
</span>
Expand Down
3 changes: 3 additions & 0 deletions packages/shared/src/components/layout/HeaderButtons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ import { OpportunityEntryButton } from '../opportunity/OpportunityEntryButton';

interface HeaderButtonsProps {
additionalButtons?: ReactNode;
onSignupClick?: () => boolean | void;
}

const Container = classed('div', 'ml-auto flex justify-end gap-3');

export function HeaderButtons({
additionalButtons,
onSignupClick,
}: HeaderButtonsProps): ReactElement {
const { isLoggedIn, isAuthReady } = useAuthContext();
const { loadedSettings } = useSettingsContext();
Expand All @@ -28,6 +30,7 @@ export function HeaderButtons({
return (
<Container>
<LoginButton
onSignupClick={onSignupClick}
className={{
container: 'gap-4',
button: 'hidden laptop:block',
Expand Down
12 changes: 10 additions & 2 deletions packages/shared/src/components/layout/MainLayoutHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ export interface MainLayoutHeaderProps {
sidebarRendered?: boolean;
additionalButtons?: ReactNode;
onLogoClick?: (e: React.MouseEvent) => unknown;
hideSearchField?: boolean;
onSignupClick?: () => boolean | void;
}

const SearchPanel = dynamic(
Expand All @@ -39,6 +41,8 @@ function MainLayoutHeader({
sidebarRendered,
additionalButtons,
onLogoClick,
hideSearchField,
onSignupClick,
}: MainLayoutHeaderProps): ReactElement {
const { loadedSettings } = useSettingsContext();
const { streak, isStreaksEnabled } = useReadingStreak();
Expand All @@ -56,6 +60,7 @@ function MainLayoutHeader({

const RenderSearchPanel = useCallback(
() =>
!hideSearchField &&
loadedSettings && (
<SearchPanel
className={{
Expand All @@ -70,7 +75,7 @@ function MainLayoutHeader({
}}
/>
),
[loadedSettings, isSearchPage, hasBanner],
[loadedSettings, isSearchPage, hasBanner, hideSearchField],
);

if (loadedSettings && !isLaptop) {
Expand Down Expand Up @@ -114,7 +119,10 @@ function MainLayoutHeader({
/>
</div>
<RenderSearchPanel />
<HeaderButtons additionalButtons={additionalButtons} />
<HeaderButtons
additionalButtons={additionalButtons}
onSignupClick={onSignupClick}
/>
</>
)}
</header>
Expand Down
4 changes: 4 additions & 0 deletions packages/shared/src/components/sidebar/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ interface SidebarProps {
isNavButtons?: boolean;
onNavTabClick?: (tab: string) => void;
onLogoClick?: (e: React.MouseEvent) => unknown;
disabled?: boolean;
}

export const Sidebar = ({
isNavButtons,
onNavTabClick,
onLogoClick,
activePage,
disabled,
}: SidebarProps): ReactElement => {
const isLaptop = useViewSize(ViewSize.Laptop);
const isTablet = useViewSize(ViewSize.Tablet);
Expand All @@ -39,6 +41,7 @@ export const Sidebar = ({
activePage={activePage}
onLogoClick={onLogoClick}
featureTheme={featureTheme}
disabled={disabled}
/>
);
}
Expand All @@ -52,6 +55,7 @@ export const Sidebar = ({
featureTheme={featureTheme}
isNavButtons={isNavButtons}
onNavTabClick={onNavTabClick}
disabled={disabled}
/>
);
}
Expand Down
Loading