+ {/* ── Engagement floaters overlay (React-controlled, fixed position) ── */}
+ {liveFloaters.length > 0 && (
+
+ {liveFloaters.map((floater) => (
+
+ {floater.text}
+
+ ))}
+
+ )}
+ {/* ── Hero ── */}
+
+
+
+
+
+
+
+
+ {/* Dot grid — shifts subtly with scroll */}
+
+
+ {/* Floating particles */}
+
+
+
+
+
+
+
+ {tagsReady &&
+ RISING_TAGS_DESKTOP.map((tag) => (
+
+ {tag.label}
+
+ ))}
+
+
+ {/* Single radial hero glow */}
+
+
+ {/* Centered text content */}
+
+
+ {/* Mobile-only rising tags */}
+
+ {tagsReady &&
+ RISING_TAGS_MOBILE.map((tag) => (
+
+ {tag.label}
+
+ ))}
+
+
+ {/* Headline */}
+
+
+ Join top dev community.
+
+
+ Build your feed identity.
+
+
+
+
+ {/* Subtext */}
+
+
+ Tap into live signals from the global dev community, then lock
+ your feed to your stack with GitHub import or AI setup.
+
+
+
+ {/* Hero CTA group */}
+
+
+
+
+
+
+
+
+ {/* Mobile-only bottom rising tags */}
+
+ {tagsReady &&
+ RISING_TAGS_MOBILE.map((tag) => (
+
+ {tag.label}
+
+ ))}
+
+
+
+
+ {/* ── Full-screen confetti (fixed, above everything) ── */}
+ {feedReadyState && (
+
+ {confettiParticles.map((p) => {
+ const sizeMap: Record = {
+ xl: 'h-4 w-2.5',
+ lg: 'h-3 w-2',
+ md: 'h-2.5 w-1.5',
+ };
+ const sizeClass = sizeMap[p.size] ?? 'h-2 w-1';
+ const shapeMap: Record = {
+ circle: 'rounded-full',
+ star: 'onb-confetti-star',
+ };
+ const shapeClass = shapeMap[p.shape] ?? 'rounded-[1px]';
+ return (
+
+ );
+ })}
+
+ )}
+
+ {/* ── Feed Ready: Celebration Banner ── */}
+ {feedReadyState && (
+
+ {/* Radial burst glows — multi-layered */}
+
+
+
+
+ {/* Sparkle accents */}
+ {[
+ { left: '15%', top: '18%', delay: '200ms', size: 12 },
+ { left: '80%', top: '12%', delay: '500ms', size: 16 },
+ { left: '25%', top: '65%', delay: '700ms', size: 10 },
+ { left: '72%', top: '55%', delay: '400ms', size: 14 },
+ { left: '50%', top: '8%', delay: '100ms', size: 18 },
+ { left: '90%', top: '40%', delay: '600ms', size: 8 },
+ ].map((s) => (
+
+ ))}
+
+
+ {/* Celebration icon with glow ring */}
+
+
+ {/* Headline */}
+
+ Your feed is ready
+
+
+ Here's how to get the most out of daily.dev
+
+
+ {/* Action chips */}
+
+ {/* Install extension */}
+
+
+ {/* Get mobile app */}
+
+
+ {/* Enable notifications */}
+
+
+
+ {/* Go to feed */}
+
+
+
+ )}
+
+ {/* ── Feed ── */}
+
+
+
+ {/* Scroll sentinel — triggers panel at ~50% of feed */}
+
+
+ {/* ── Personalization Panel ── */}
+
+
+ {/* Dark gradient overlay — fades feed out progressively */}
+
+
+
+
+
+
+ {/* Section title */}
+
+
+ You just explored the global feed.
+
+
+ Now build a feed that is truly yours
+
+
+
+ {/* Two-path layout */}
+
+ {/* ── Path A: GitHub ── */}
+
+ {/* Animated orb — full-width energy field */}
+
+ {/* Radial gradient from top center */}
+
+ {/* Wide glow */}
+
+ {/* Outer ring */}
+
+ {/* Middle ring */}
+
+ {/* Inner ring */}
+
+ {/* Particles from far away */}
+ {[
+ {
+ px: '-6rem',
+ py: '-3.5rem',
+ dur: '3.0s',
+ delay: '0s',
+ color: 'bg-accent-cheese-default',
+ },
+ {
+ px: '5.5rem',
+ py: '-4rem',
+ dur: '3.4s',
+ delay: '0.5s',
+ color: 'bg-accent-water-default',
+ },
+ {
+ px: '-5rem',
+ py: '3.5rem',
+ dur: '3.2s',
+ delay: '1.0s',
+ color: 'bg-accent-cabbage-default',
+ },
+ {
+ px: '6rem',
+ py: '3rem',
+ dur: '3.6s',
+ delay: '1.5s',
+ color: 'bg-accent-onion-default',
+ },
+ {
+ px: '0.5rem',
+ py: '-5rem',
+ dur: '2.8s',
+ delay: '0.7s',
+ color: 'bg-accent-cheese-default',
+ },
+ {
+ px: '-6.5rem',
+ py: '0.5rem',
+ dur: '3.1s',
+ delay: '1.2s',
+ color: 'bg-accent-water-default',
+ },
+ ].map((p) => (
+
+ ))}
+ {/* Center icon with pulse */}
+
+
+
+
+ One-click setup
+
+
+ Connect GitHub and let our AI do the rest.
+
+
+
+ {[
+ {
+ text: 'We spot your stack from GitHub',
+ icon: 'stack',
+ },
+ {
+ text: 'AI matches your skills to topics',
+ icon: 'ai',
+ },
+ {
+ text: 'Your feed is ready in seconds',
+ icon: 'feed',
+ },
+ ].map(({ text, icon }) => (
+
+
+ {icon === 'stack' && (
+
+ )}
+ {icon === 'ai' && (
+
+ )}
+ {icon === 'feed' && (
+
+ )}
+
+
+ {text}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+ Read-only access · No special permissions
+
+
+
+ {/* ── Path B: Manual ── */}
+
+ {/* Static icon zone */}
+
+ {/* Radial gradient from top center */}
+
+
+
+
+
+
+
+ Tell our AI about yourself
+
+
+ Describe your stack and let AI build your feed.
+
+
+ {/* Textarea */}
+
+
+
+ {/* Selected chips */}
+ {selectedTopics.size > 0 && (
+
+ {Array.from(selectedTopics).map((topic) => (
+
+ ))}
+
+ )}
+
+ {/* Matched tags */}
+
0
+ ? 'max-h-40 opacity-100'
+ : 'max-h-0 opacity-0',
+ )}
+ >
+
+ {recommendedTopics.map(({ label }) => (
+
+ ))}
+
+
+
+ {/* Build feed CTA — disabled when no input */}
+
+
+
+
+
+ AI-powered · instant personalization
+
+
+
+
+
+
+
+
+
+ {/* Footer links for SEO — placed at the bottom of the page */}
+ {!feedReadyState && (
+
+
+
+ )}
+
+
+
+
+ {/* ── CSS: feed limit, article fade, marquee, sidebar disable ── */}
+ {/* eslint-disable-next-line react/no-unknown-property */}
+
+
+ {/* ── Header signup chooser popup ── */}
+ {showSignupChooser && (
+
+
+
+
+
+
+
+
+
+ Stay up to date, level up with the community, and unlock more.
+
+
+ Build your developer identity
+
+
+
+
+ {/* ── Path A: GitHub ── */}
+
+ {/* Animated orb — full-width energy field */}
+
+
+
+
+
+
+ {[
+ {
+ px: '-6rem',
+ py: '-3.5rem',
+ dur: '3.0s',
+ delay: '0s',
+ color: 'bg-accent-cheese-default',
+ },
+ {
+ px: '5.5rem',
+ py: '-4rem',
+ dur: '3.4s',
+ delay: '0.5s',
+ color: 'bg-accent-water-default',
+ },
+ {
+ px: '-5rem',
+ py: '3.5rem',
+ dur: '3.2s',
+ delay: '1.0s',
+ color: 'bg-accent-cabbage-default',
+ },
+ {
+ px: '6rem',
+ py: '3rem',
+ dur: '3.6s',
+ delay: '1.5s',
+ color: 'bg-accent-onion-default',
+ },
+ {
+ px: '0.5rem',
+ py: '-5rem',
+ dur: '2.8s',
+ delay: '0.7s',
+ color: 'bg-accent-cheese-default',
+ },
+ {
+ px: '-6.5rem',
+ py: '0.5rem',
+ dur: '3.1s',
+ delay: '1.2s',
+ color: 'bg-accent-water-default',
+ },
+ ].map((p) => (
+
+ ))}
+
+
+
+
+ One-click setup
+
+
+ Connect GitHub and let our AI do the rest.
+
+
+
+ {[
+ {
+ text: 'We spot your stack from GitHub',
+ icon: 'stack',
+ },
+ {
+ text: 'AI matches your skills to topics',
+ icon: 'ai',
+ },
+ {
+ text: 'Your feed is ready in seconds',
+ icon: 'feed',
+ },
+ ].map(({ text, icon }) => (
+
+
+ {icon === 'stack' && (
+
+ )}
+ {icon === 'ai' && (
+
+ )}
+ {icon === 'feed' && (
+
+ )}
+
+
+ {text}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+ Read-only access · No special permissions
+
+
+
+ {/* ── Path B: Manual ── */}
+
+ {/* Static icon zone */}
+
+
+
+ Tell our AI about yourself
+
+
+ Describe your stack and let AI build your feed.
+
+
+ {/* Textarea */}
+
+
+
+ {/* Selected chips */}
+ {selectedTopics.size > 0 && (
+
+ {Array.from(selectedTopics).map((topic) => (
+
+ ))}
+
+ )}
+
+ {/* Matched tags */}
+
0
+ ? 'max-h-40 opacity-100'
+ : 'max-h-0 opacity-0',
+ )}
+ >
+
+ {recommendedTopics.map(({ label }) => (
+
+ ))}
+
+
+
+ {/* Build feed CTA — disabled when no input */}
+
+
+
+
+
+ AI-powered · instant personalization
+
+
+
+
+
+
+ )}
+
+ {/* ── Persistent backdrop during import→extension transition ── */}
+ {githubImportExiting && (
+
+ )}
+
+ {/* ── Extension Promotion Overlay ── */}
+ {showExtensionPromo && (
+
+
+
+
+
+
+
+ {/* Status badge */}
+
+
+
+
+
+ Your feed is ready
+
+
+
+ {/* Headline */}
+
+ See it every time{' '}
+
+ you open a tab.
+
+
+
+ {/* Screenshot */}
+
+

+
+
+ {/* Value props */}
+
+ {(
+ [
+ 'Zero clicks to your personalized feed',
+ 'Catch trending tools & discussions early',
+ 'Trusted by 1M+ developers daily',
+ ] as const
+ ).map((label) => (
+
+ ))}
+
+
+ {/* CTA */}
+
+
+
+
+ {/* Community proof */}
+
+
+
+
+
+
+
+
+
+ "I open 50+ tabs a day. daily.dev makes each one count.
+ It's the best dev tool I've installed this
+ year."
+
+
+
+
+
+ )}
+
+ {/* ── Profile Import Overlay ── */}
+ {showGithubImportFlow && (
+
+ {/* Full-screen scrim — blurred glass so feed peeks through */}
+
+
+ {/* Centered content */}
+
+
+ {/* ── Animated orb — full-width energy field ── */}
+
+
+
+
+
+
+ {[
+ {
+ px: '-6rem',
+ py: '-3.5rem',
+ dur: '3.0s',
+ delay: '0s',
+ color: 'bg-accent-cheese-default',
+ },
+ {
+ px: '5.5rem',
+ py: '-4rem',
+ dur: '3.4s',
+ delay: '0.5s',
+ color: 'bg-accent-water-default',
+ },
+ {
+ px: '-5rem',
+ py: '3.5rem',
+ dur: '3.2s',
+ delay: '1.0s',
+ color: 'bg-accent-cabbage-default',
+ },
+ {
+ px: '6rem',
+ py: '3rem',
+ dur: '3.6s',
+ delay: '1.5s',
+ color: 'bg-accent-onion-default',
+ },
+ {
+ px: '0.5rem',
+ py: '-5rem',
+ dur: '2.8s',
+ delay: '0.7s',
+ color: 'bg-accent-cheese-default',
+ },
+ {
+ px: '-6.5rem',
+ py: '0.5rem',
+ dur: '3.1s',
+ delay: '1.2s',
+ color: 'bg-accent-water-default',
+ },
+ ].map((p) => (
+
+ ))}
+
+ {(() => {
+ if (isAwaitingSeniorityInput) {
+ return (
+
+
+
+ );
+ }
+
+ if (importFlowSource === 'github') {
+ return (
+
+ );
+ }
+
+ return (
+
+ );
+ })()}
+
+
+
+ {/* ── Title & progress ── */}
+
+ {(() => {
+ if (githubImportPhase === 'complete') {
+ return 'Your feed is ready';
+ }
+ if (
+ githubImportPhase === 'awaitingSeniority' ||
+ githubImportPhase === 'confirmingSeniority'
+ ) {
+ return 'Almost there';
+ }
+ return importFlowSource === 'github'
+ ? 'Reading your GitHub'
+ : 'Analyzing your profile';
+ })()}
+
+
+
+ {(() => {
+ if (githubImportPhase === 'complete') {
+ return 'We built a personalized feed just for you.';
+ }
+ if (githubImportPhase === 'awaitingSeniority') {
+ return importFlowSource === 'github'
+ ? 'One thing we couldn\u2019t find on your profile.'
+ : 'One last detail to finish your profile setup.';
+ }
+ if (githubImportPhase === 'confirmingSeniority') {
+ return 'Got it. Finishing up...';
+ }
+ return currentImportStep;
+ })()}
+
+
+ {/* ── Progress track ── */}
+ {githubImportPhase !== 'idle' && (
+
+ )}
+
+ {githubImportBodyPhase !== 'default' && (
+
+
+
+ {/* ── Import checklist (during active import) ── */}
+ {githubImportBodyPhase === 'checklist' && (
+
+ {importSteps.map((step, i) => {
+ const done = githubImportProgress >= step.threshold;
+ const active =
+ !done &&
+ githubImportProgress >= step.threshold - 16;
+ // eslint-disable-next-line no-nested-ternary
+ const statusText = done
+ ? 'Done'
+ : active
+ ? 'In progress'
+ : 'Up next';
+
+ return (
+
+
+ {done ? (
+
+ ) : (
+
+ )}
+
+
+ {step.label}
+
+
+ {statusText}
+
+
+ );
+ })}
+
+ )}
+
+ {/* ── Seniority question ── */}
+ {githubImportBodyPhase === 'seniority' && (
+
+
+ What is your seniority level?
+
+
+ {EXPERIENCE_LEVEL_OPTIONS.map((option) => {
+ const optionParts = getExperienceLevelOptionParts(
+ option.label,
+ );
+ const optionMeta =
+ optionParts.meta ?? 'Non-technical';
+ const isSelected =
+ selectedExperienceLevel === option.value;
+
+ return (
+
+ );
+ })}
+
+
+ )}
+
+
+
+ )}
+
+ {/* Completion handled by feedReadyState banner — auto-transition */}
+
+
+ )}
+
+ {/* ── Contextual Signup Modal ── */}
+ {showSignupPrompt && (
+
+ {/* Backdrop */}
+
setShowSignupPrompt(false)}
+ role="presentation"
+ />
+
+ {/* Modal */}
+
+ {/* Close */}
+
+
+ {/* Content */}
+
+ {/* ── GitHub context ── */}
+ {signupContext === 'github' && (
+ <>
+
+
+
+
+ Connect GitHub
+
+
+ One-click personalization
+
+
+
+
+ We'll scan your public repos and stars to build a feed
+ that matches your stack.
+
+
+ {[
+ 'Read-only access to public info',
+ 'No write permissions required',
+ 'Revoke anytime from settings',
+ ].map((text, i) => (
+
+ ))}
+
+ >
+ )}
+
+ {/* ── Topics context ── */}
+ {signupContext === 'topics' && (
+ <>
+
+ Your feed is ready
+
+
+ Sign up to save your personalized feed with{' '}
+
+ {selectedTopics.size} topics
+
+ .
+
+
+ {Array.from(selectedTopics).map((t, i) => (
+
+ {t}
+
+ ))}
+
+ >
+ )}
+
+ {/* ── Shared AI setup context (manual + ai) ── */}
+ {isAiSetupContext && (
+ <>
+
+
+
+ Tell our AI about yourself
+
+
+ Describe your stack and let AI build your feed.
+
+
+
+
+
+ {selectedTopics.size > 0 && (
+
+ {Array.from(selectedTopics).map((topic) => (
+
+ ))}
+
+ )}
+ {recommendedTopics.length > 0 && (
+
+
+ {recommendedTopics.map(({ label }) => (
+
+ ))}
+
+
+ )}
+ >
+ )}
+
+ {/* ── Auth buttons ── */}
+
+
+ {signupContext === 'github' && (
+
+ )}
+ {isAiSetupContext && (
+ <>
+
+
+ AI-powered · instant personalization
+
+ >
+ )}
+ {!isAiSetupContext && signupContext !== 'github' && (
+
+ )}
+
+
+
+
+ )}
+
+ );
+};
+
+OnboardingV2Page.getLayout = (
+ page: ReactNode,
+ _pageProps: Record
,
+ layoutProps: MainLayoutProps,
+): ReactNode =>
+ getFooterNavBarLayout(
+
+ {page}
+ ,
+ );
+
+OnboardingV2Page.layoutProps = {
+ seo,
+ mainPage: true,
+ screenCentered: false,
+ hideSearchField: true,
+};
+
+export default OnboardingV2Page;