diff --git a/web/components/answers/answer-compatibility-question-button.tsx b/web/components/answers/answer-compatibility-question-button.tsx
index a2443be..044b095 100644
--- a/web/components/answers/answer-compatibility-question-button.tsx
+++ b/web/components/answers/answer-compatibility-question-button.tsx
@@ -51,9 +51,10 @@ export function AnswerCompatibilityQuestionButton(props: {
setOpen={setOpen}
user={user}
otherQuestions={questionsToAnswer}
+ fromSignup={fromSignup}
refreshCompatibilityAll={refreshCompatibilityAll}
onClose={() => {
- if (fromSignup) router.push('/')
+ if (fromSignup) router.push('/onboarding/soft-gate')
}}
/>
>
@@ -74,8 +75,9 @@ export function AnswerSkippedCompatibilityQuestionsButton(props: {
user: User | null | undefined
skippedQuestions: QuestionWithCountType[]
refreshCompatibilityAll: () => void
+ fromSignup?: boolean
}) {
- const {user, skippedQuestions, refreshCompatibilityAll} = props
+ const {user, skippedQuestions, refreshCompatibilityAll, fromSignup} = props
const [open, setOpen] = useState(false)
const t = useT()
if (!user) return null
@@ -92,12 +94,56 @@ export function AnswerSkippedCompatibilityQuestionsButton(props: {
setOpen={setOpen}
user={user}
otherQuestions={skippedQuestions}
+ fromSignup={fromSignup}
refreshCompatibilityAll={refreshCompatibilityAll}
/>
>
)
}
+function CompatibilityOnboardingScreen({onNext, onSkip}: { onNext: () => void; onSkip: () => void }) {
+ const t = useT()
+
+ return (
+
+
+ {t('compatibility.onboarding.title', 'See who you\'ll actually align with')}
+
+
+
+
+ {t('compatibility.onboarding.body1', 'Answer a few short questions to calculate compatibility based on values and preferences — not photos or swipes.')}
+
+
+ {t('compatibility.onboarding.body2', 'Your answers directly affect who matches with you and how strongly.')}
+
+
+
+
+
+ {t('compatibility.onboarding.impact', 'Most people who answer at least 5 questions see far more relevant matches.')}
+
+
+
+
+
+ {t('compatibility.onboarding.start', 'Start answering')}
+
+
+ {t('compatibility.onboarding.later', 'Do this later')}
+
+
+
+ )
+}
+
function AnswerCompatibilityQuestionModal(props: {
open: boolean
setOpen: (open: boolean) => void
@@ -105,9 +151,21 @@ function AnswerCompatibilityQuestionModal(props: {
otherQuestions: QuestionWithCountType[]
refreshCompatibilityAll: () => void
onClose?: () => void
+ fromSignup?: boolean
}) {
- const {open, setOpen, user, otherQuestions, refreshCompatibilityAll, onClose} = props
+ const {open, setOpen, user, otherQuestions, refreshCompatibilityAll, onClose, fromSignup} = props
const [questionIndex, setQuestionIndex] = useState(0)
+ const [showOnboarding, setShowOnboarding] = useState(fromSignup ?? false)
+
+ const handleStartQuestions = () => {
+ setShowOnboarding(false)
+ }
+
+ const handleSkipOnboarding = () => {
+ setShowOnboarding(false)
+ setOpen(false)
+ }
+
return (
{
refreshCompatibilityAll()
setQuestionIndex(0)
+ setShowOnboarding(fromSignup ?? false)
onClose?.()
}}
>
- {
- setOpen(false)
- }}
- isLastQuestion={questionIndex === otherQuestions.length - 1}
- onNext={() => {
- if (questionIndex === otherQuestions.length - 1) {
+ {showOnboarding ? (
+
+ ) : (
+ {
setOpen(false)
- } else {
- setQuestionIndex(questionIndex + 1)
- }
- }}
- />
+ }}
+ isLastQuestion={questionIndex === otherQuestions.length - 1}
+ onNext={() => {
+ if (questionIndex === otherQuestions.length - 1) {
+ setOpen(false)
+ } else {
+ setQuestionIndex(questionIndex + 1)
+ }
+ }}
+ />
+ )}
)
diff --git a/web/components/bio/profile-bio-block.tsx b/web/components/bio/profile-bio-block.tsx
index e7a61c5..ab7ec61 100644
--- a/web/components/bio/profile-bio-block.tsx
+++ b/web/components/bio/profile-bio-block.tsx
@@ -1,16 +1,17 @@
-import { PencilIcon, XIcon } from '@heroicons/react/outline'
-import { JSONContent } from '@tiptap/core'
+import {PencilIcon, XIcon} from '@heroicons/react/outline'
+import {JSONContent} from '@tiptap/core'
import clsx from 'clsx'
-import { Profile } from 'common/profiles/profile'
+import {Profile} from 'common/profiles/profile'
import DropdownMenu from 'web/components/comments/dropdown-menu'
-import { Col } from 'web/components/layout/col'
-import { Row } from 'web/components/layout/row'
-import { Content } from 'web/components/widgets/editor'
-import { updateProfile } from 'web/lib/api'
-import { EditableBio } from './editable-bio'
-import { tryCatch } from 'common/util/try-catch'
-import { useT } from 'web/lib/locale'
+import {Col} from 'web/components/layout/col'
+import {Row} from 'web/components/layout/row'
+import {Content} from 'web/components/widgets/editor'
+import {updateProfile} from 'web/lib/api'
+import {EditableBio} from './editable-bio'
+import {tryCatch} from 'common/util/try-catch'
+import {useT} from 'web/lib/locale'
+import {Tooltip} from "web/components/widgets/tooltip";
export function BioBlock(props: {
isCurrentUser: boolean
@@ -46,6 +47,7 @@ export function BioBlock(props: {
/>
)}
{isCurrentUser && !edit && (
+
+
)}
diff --git a/web/components/optional-profile-form.tsx b/web/components/optional-profile-form.tsx
index 221fab5..c9eaf32 100644
--- a/web/components/optional-profile-form.tsx
+++ b/web/components/optional-profile-form.tsx
@@ -488,26 +488,90 @@ export const OptionalProfileUserForm = (props: {
>}
-
+
+
+
+
+
+
+
- {/**/}
- {/* {t('profile.optional.languages', 'Languages')}*/}
- {/* */}
-
-
-
- setProfile('languages', selected)}
- />
-
-
-
+
+ {t('profile.optional.education_level', 'Highest completed education level')}
+
+
+ [t(`profile.education.${v}`, k), v]))}
+ setChoice={(c) => setProfile('education_level', c)}
+ />
+
+
+
+ {t('profile.optional.university', 'University')}
+
+ setProfile('university', e.target.value)}
+ className={'w-52'}
+ value={profile['university'] ?? undefined}
+ />
+
+
+
+
+
+
+ {profile['company']
+ ? t('profile.optional.job_title_at_company', 'Job title at {company}', {company: profile['company']})
+ : t('profile.optional.job_title', 'Job title')}
+
+ setProfile('occupation_title', e.target.value)}
+ className={'w-52'}
+ value={profile['occupation_title'] ?? undefined}
+ />
+
+
+
+
+ {t('profile.optional.company', 'Company')}
+
+ setProfile('company', e.target.value)}
+ className={'w-52'}
+ value={profile['company'] ?? undefined}
+ />
+
+
+
+
@@ -550,26 +614,6 @@ export const OptionalProfileUserForm = (props: {
/>
-
-
-
-
-
-
@@ -597,70 +641,6 @@ export const OptionalProfileUserForm = (props: {
/>
-
-
-
-
- {profile['company']
- ? t('profile.optional.job_title_at_company', 'Job title at {company}', {company: profile['company']})
- : t('profile.optional.job_title', 'Job title')}
-
- setProfile('occupation_title', e.target.value)}
- className={'w-52'}
- value={profile['occupation_title'] ?? undefined}
- />
-
-
-
-
- {t('profile.optional.company', 'Company')}
-
- setProfile('company', e.target.value)}
- className={'w-52'}
- value={profile['company'] ?? undefined}
- />
-
-
-
-
-
-
-
-
- {t('profile.optional.education_level', 'Highest completed education level')}
-
-
- [t(`profile.education.${v}`, k), v]))}
- setChoice={(c) => setProfile('education_level', c)}
- />
-
-
-
-
-
- {t('profile.optional.university', 'University')}
-
- setProfile('university', e.target.value)}
- className={'w-52'}
- value={profile['university'] ?? undefined}
- />
-
-
@@ -694,6 +674,26 @@ export const OptionalProfileUserForm = (props: {
/>
+
+
+
+ {/**/}
+ {/* {t('profile.optional.languages', 'Languages')}*/}
+ {/* */}
+
+
+
+ setProfile('languages', selected)}
+ />
+
+
+
+
+
{/*
Birthplace
+
{
@@ -90,7 +92,9 @@ export default function ProfileHeader(props: {
>
+
+
+
) : (
diff --git a/web/messages/de.json b/web/messages/de.json
index c261983..bbbb91c 100644
--- a/web/messages/de.json
+++ b/web/messages/de.json
@@ -544,6 +544,16 @@
"profile.language.serbo-croatian": "Serbokroatisch",
"profile.language.shona": "Shona",
"profile.language.sindhi": "Sindhi",
+ "onboarding.soft-gate.seo.title": "Sie sind bereit zu erkunden - Compass",
+ "onboarding.soft-gate.seo.description": "Starten Sie mit Compass - transparente Verbindungen ohne Algorithmen",
+ "onboarding.soft-gate.title": "Sie sind bereit zu erkunden",
+ "onboarding.soft-gate.intro": "Sie haben Ihre ersten Kompatibilitätsfragen beantwortet und Ihre Hauptinteressen geteilt.",
+ "onboarding.soft-gate.what_it_means": "Das bedeutet das für Sie:",
+ "onboarding.soft-gate.bullet1": "Kompatibilitätswerte spiegeln jetzt Ihre Werte und Präferenzen wider",
+ "onboarding.soft-gate.bullet2": "Sie sehen Übereinstimmungswerte, die eng mit dem übereinstimmen, was Ihnen wichtig ist",
+ "onboarding.soft-gate.bullet3": "Sie können Ihr Profil jederzeit aktualisieren, um die Chancen zu erhöhen, dass die richtigen Personen sich an Sie wenden.",
+ "onboarding.soft-gate.explore_button": "Profile jetzt erkunden",
+ "onboarding.soft-gate.refine_button": "Profil verfeinern",
"profile.language.sinhala": "Singhalesisch",
"profile.language.somali": "Somali",
"profile.language.southern-min": "Süd-Min",
@@ -927,5 +937,40 @@
"vote.toast.created": "Vorschlag erstellt",
"vote.urgent": "Dringend",
"vote.voted": "Stimme gespeichert",
+ "onboarding.skip": "Onboarding überspringen",
+ "onboarding.welcome": "Willkommen bei Compass",
+ "onboarding.step1.title": "Keine Black Box. Keine Manipulation.",
+ "onboarding.step1.body1": "Compass entscheidet nicht, wen Sie sehen sollten.",
+ "onboarding.step1.body2": "Es gibt keinen Engagement-Algorithmus, kein Swipe-Ranking, keine boosteten Profile und keine Aufmerksamkeitsoptimierung. Sie können die vollständige Datenbank durchsuchen, Ihre eigenen Filter anwenden und genau sehen, warum jemand mit Ihnen übereinstimmt.",
+ "onboarding.step1.body3": "Sie behalten die Kontrolle über die Entdeckung. Immer.",
+ "onboarding.step1.footer": "Transparenz ist ein Grundprinzip, keine Funktion.",
+ "onboarding.step2.title": "Suchen, nicht scrollen.",
+ "onboarding.step2.body1": "Anstatt endlosem Swiping erlaubt Ihnen Compass, gezielt zu suchen.",
+ "onboarding.step2.body2": "Suchen Sie Personen nach:",
+ "onboarding.step2.item1": "Interessen und Schlüsselwörtern",
+ "onboarding.step2.item2": "Werten und Ideen",
+ "onboarding.step2.item3": "Kompatibilitätsantworten",
+ "onboarding.step2.item4": "Standort und Absicht",
+ "onboarding.step2.body3": "Sie können Suchen speichern und benachrichtigt werden, wenn neue Personen übereinstimmen. Keine Notwendigkeit, die App jeden Tag zu überprüfen.",
+ "onboarding.step2.footer": "Weniger Lärm. Mehr Signal.",
+ "onboarding.step3.title": "Kompatibilität, die Sie verstehen können.",
+ "onboarding.step3.body1": "Matches sind weder magisch noch mysteriös.",
+ "onboarding.step3.body2": "Ihr Kompatibilitäts-Score kommt von expliziten Fragen:",
+ "onboarding.step3.item1": "Ihre Antwort",
+ "onboarding.step3.item2": "Welche Antworten Sie von anderen akzeptieren",
+ "onboarding.step3.item3": "Wie wichtig jede Frage für Sie ist",
+ "onboarding.step3.body3": "Sie können das System inspizieren, in Frage stellen und verbessern. Die vollständige Mathematik ist Open Source.",
+ "onboarding.step3.footer": "Wenn Sie nicht mit der Funktionsweise einverstanden sind, können Sie helfen, sie zu ändern.",
+ "onboarding.step3.continue": "Loslegen",
+ "common.continue": "Weiter",
+ "compatibility.onboarding.title": "Sehen Sie, mit wem Sie tatsächlich übereinstimmen",
+ "compatibility.onboarding.body1": "Beantworten Sie einige kurze Fragen, um die Kompatibilität basierend auf Werten und Vorlieben zu berechnen — nicht auf Fotos oder Swipes.",
+ "compatibility.onboarding.body2": "Ihre Antworten beeinflussen direkt, wer mit Ihnen übereinstimmt und wie stark.",
+ "compatibility.onboarding.impact": "Die meisten Menschen, die mindestens 3 Fragen beantworten, sehen wesentlich relevantere Übereinstimmungen.",
+ "compatibility.onboarding.start": "Fragen beantworten beginnen",
+ "compatibility.onboarding.later": "Später erledigen",
+ "more_options_user.edit_profile": "Profil bearbeiten",
+ "more_options_user.profile_options": "Profiloptionen",
+ "more_options_user.edit_bio": "Bio bearbeiten",
"vote.with_priority": "mit Priorität"
}
\ No newline at end of file
diff --git a/web/messages/fr.json b/web/messages/fr.json
index d503b9d..6aa6041 100644
--- a/web/messages/fr.json
+++ b/web/messages/fr.json
@@ -544,6 +544,16 @@
"profile.language.serbo-croatian": "Serbo-croate",
"profile.language.shona": "Shona",
"profile.language.sindhi": "Sindhi",
+ "onboarding.soft-gate.seo.title": "Vous êtes prêt à explorer - Compass",
+ "onboarding.soft-gate.seo.description": "Commencez avec Compass - des connexions transparentes sans algorithmes",
+ "onboarding.soft-gate.title": "Vous êtes prêt à explorer",
+ "onboarding.soft-gate.intro": "Vous avez répondu à vos premières questions de compatibilité et partagé vos principaux centres d'intérêt.",
+ "onboarding.soft-gate.what_it_means": "Voici ce que cela signifie pour vous :",
+ "onboarding.soft-gate.bullet1": "Les scores de compatibilité reflètent désormais vos valeurs et préférences",
+ "onboarding.soft-gate.bullet2": "Vous verrez des pourcentages de compatibilité qui correspondent étroitement à ce qui vous importe",
+ "onboarding.soft-gate.bullet3": "Vous pouvez mettre à jour votre profil à tout moment pour augmenter les chances que les bonnes personnes vous contactent.",
+ "onboarding.soft-gate.explore_button": "Explorer les profils maintenant",
+ "onboarding.soft-gate.refine_button": "Affiner votre profil",
"profile.language.sinhala": "Cingalais",
"profile.language.somali": "Somali",
"profile.language.southern-min": "Min du Sud",
@@ -927,5 +937,40 @@
"vote.toast.created": "Proposition créée",
"vote.urgent": "Urgente",
"vote.voted": "Vote enregistré",
+ "onboarding.skip": "Passer le tutoriel",
+ "onboarding.welcome": "Bienvenue sur Compass!",
+ "onboarding.step1.title": "Pas de boîte noire. Pas de manipulation.",
+ "onboarding.step1.body1": "Compass ne décide pas qui vous devriez voir.",
+ "onboarding.step1.body2": "Il n'y a pas d'algorithme d'engagement, pas de classement par swipe, pas de profils boostés et pas d'optimisation de l'attention. Vous pouvez parcourir la base de données complète, appliquer vos propres filtres et voir exactement pourquoi quelqu'un vous correspond.",
+ "onboarding.step1.body3": "Vous gardez le contrôle de la découverte. Toujours.",
+ "onboarding.step1.footer": "La transparence est un principe fondamental, pas une fonctionnalité.",
+ "onboarding.step2.title": "Cherchez, sans swipe.",
+ "onboarding.step2.body1": "Au lieu d'un défilement sans fin, Compass vous permet de chercher intentionnellement.",
+ "onboarding.step2.body2": "Cherchez des personnes par :",
+ "onboarding.step2.item1": "Intérêts et mots-clés",
+ "onboarding.step2.item2": "Valeurs et idées",
+ "onboarding.step2.item3": "Réponses de compatibilité",
+ "onboarding.step2.item4": "Lieu et intention",
+ "onboarding.step2.body3": "Vous pouvez sauvegarder des recherches et être notifié lorsque de nouvelles personnes vous correspondent. Pas besoin de vérifier l'application chaque jour.",
+ "onboarding.step2.footer": "Moins de bruit. Plus de signal.",
+ "onboarding.step3.title": "Compatibilité que vous pouvez comprendre.",
+ "onboarding.step3.body1": "Les correspondances ne sont ni magiques ni mystérieuses.",
+ "onboarding.step3.body2": "Votre score de compatibilité provient de questions explicites :",
+ "onboarding.step3.item1": "Votre réponse",
+ "onboarding.step3.item2": "Quelles réponses vous acceptez des autres",
+ "onboarding.step3.item3": "L'importance de chaque question pour vous",
+ "onboarding.step3.body3": "Vous pouvez inspecter, questionner et améliorer le système. Les maths derrière sont open source.",
+ "onboarding.step3.footer": "Si vous n'êtes pas d'accord avec son fonctionnement, vous pouvez aider à le changer.",
+ "onboarding.step3.continue": "Commencer",
+ "common.continue": "Continuer",
+ "compatibility.onboarding.title": "Questions de compatibilité",
+ "compatibility.onboarding.body1": "Répondez à quelques questions courtes pour calculer la compatibilité basée sur les valeurs et les préférences — pas sur les photos ou les swipes.",
+ "compatibility.onboarding.body2": "Vos réponses affectent directement qui vous correspond et avec quelle force.",
+ "compatibility.onboarding.impact": "La plupart des personnes qui répondent à au moins 5 questions trouvent des correspondances beaucoup plus pertinentes.",
+ "compatibility.onboarding.start": "Commencer à répondre",
+ "compatibility.onboarding.later": "Faire ça plus tard",
+ "more_options_user.edit_profile": "Modifier le profil",
+ "more_options_user.profile_options": "Options du profil",
+ "more_options_user.edit_bio": "Options de biographie",
"vote.with_priority": "avec priorité"
}
\ No newline at end of file
diff --git a/web/pages/onboarding/index.tsx b/web/pages/onboarding/index.tsx
new file mode 100644
index 0000000..b3d1411
--- /dev/null
+++ b/web/pages/onboarding/index.tsx
@@ -0,0 +1,227 @@
+import {useState} from 'react'
+import {Col} from 'web/components/layout/col'
+import Router from 'next/router'
+import {Button} from 'web/components/buttons/button'
+import {CompassLoadingIndicator} from "web/components/widgets/loading-indicator";
+import {useT} from "web/lib/locale";
+
+interface OnboardingStepProps {
+ onNext: () => void
+ onSkip: () => void
+}
+
+interface OnboardingScreenProps {
+ title: string
+ content: React.ReactNode
+ footerText?: string
+ onNext: () => void
+ onSkip: () => void
+ onBack?: () => void
+ continueText?: string
+ welcomeTitle?: string
+}
+
+function OnboardingScreen({
+ title,
+ content,
+ footerText,
+ onNext,
+ onSkip,
+ onBack,
+ continueText = undefined,
+ welcomeTitle
+ }: OnboardingScreenProps) {
+ const t = useT()
+ return (
+
+ {onBack && (
+
+
+ ← {t("common.back", "Back")}
+
+
+ )}
+
+ {welcomeTitle && (
+
+ {welcomeTitle}
+
+ )}
+
+
+ {title}
+
+
+
+ {content}
+
+
+ {footerText && (
+
+ {footerText}
+
+ )}
+
+
+
+ {continueText ?? t('common.continue', 'Continue')}
+
+
+ {t('onboarding.skip', 'Skip onboarding')}
+
+
+
+ )
+}
+
+function Step1NoHiddenAlgorithms({onNext, onSkip}: OnboardingStepProps) {
+ const t = useT()
+ const content = (
+
+
+ {t('onboarding.step1.body1', 'Compass does not decide who you should see.')}
+
+
+ {t('onboarding.step1.body2', 'There is no engagement algorithm, no swipe-ranking, no boosted profiles, and no attention optimization. You can browse the full database, apply your own filters, and see exactly why someone matches with you.')}
+
+
+ {t('onboarding.step1.body3', 'You stay in control of discovery. Always.')}
+
+
+ )
+
+ return (
+
+ )
+}
+
+function Step2SearchBeatsSwiping({onNext, onSkip, onBack}: OnboardingStepProps & { onBack: () => void }) {
+ const t = useT()
+ const content = (
+
+
+ {t('onboarding.step2.body1', 'Instead of endless swiping, Compass lets you search intentionally.')}
+
+
+ {t('onboarding.step2.body2', 'Look for people by:')}
+
+
+ {t('onboarding.step2.item1', 'Interests and keywords')}
+ {t('onboarding.step2.item2', 'Values and ideas')}
+ {t('onboarding.step2.item3', 'Compatibility answers')}
+ {t('onboarding.step2.item4', 'Location and intent')}
+
+
+ {t('onboarding.step2.body3', 'You can save searches and get notified when new people match them. No need to check the app every day.')}
+
+
+ )
+
+ return (
+
+ )
+}
+
+function Step3CompatibilityInspect({onNext, onSkip, onBack}: OnboardingStepProps & { onBack: () => void }) {
+ const t = useT()
+ const content = (
+
+
+ {t('onboarding.step3.body1', 'Matches aren\'t magic or mysterious.')}
+
+
+ {t('onboarding.step3.body2', 'Your compatibility score comes from explicit questions:')}
+
+
+ {t('onboarding.step3.item1', 'Your answer')}
+ {t('onboarding.step3.item2', 'What answers you accept from others')}
+ {t('onboarding.step3.item3', 'How important each question is to you')}
+
+
+ {t('onboarding.step3.body3', 'You can inspect, question, and improve the system. The full math is open source.')}
+
+
+ )
+
+ return (
+
+ )
+}
+
+export default function OnboardingPage() {
+ const [currentStep, setCurrentStep] = useState(0)
+
+ const handleNext = () => {
+ setCurrentStep(currentStep + 1)
+ }
+
+ const handleBack = () => {
+ setCurrentStep(currentStep - 1)
+ }
+
+ const handleSkip = () => {
+ Router.push('/signup')
+ }
+
+ const handleComplete = () => {
+ Router.push('/signup')
+ return
+ }
+
+ const renderStep = () => {
+ switch (currentStep) {
+ case 0:
+ return
+ case 1:
+ return
+ case 2:
+ return
+ default:
+ return handleComplete()
+ }
+ }
+
+ return (
+ //
+ //
+
+ {renderStep()}
+
+ //
+ )
+}
diff --git a/web/pages/onboarding/soft-gate.tsx b/web/pages/onboarding/soft-gate.tsx
new file mode 100644
index 0000000..f755ae8
--- /dev/null
+++ b/web/pages/onboarding/soft-gate.tsx
@@ -0,0 +1,74 @@
+import {Col} from 'web/components/layout/col'
+import Router from 'next/router'
+import {Button} from 'web/components/buttons/button'
+import {useUser} from "web/hooks/use-user";
+import {PageBase} from "web/components/page-base";
+import {SEO} from "web/components/SEO";
+import {useT} from "web/lib/locale";
+
+
+export default function SoftGatePage() {
+ const user = useUser()
+ const t = useT()
+
+ const handleExplore = () => {
+ Router.push('/')
+ }
+
+ const handleRefine = () => {
+ Router.push(`/${user?.username ?? ''}`)
+ }
+
+ return (
+
+
+
+
+
+ {t("onboarding.soft-gate.title", "You're ready to explore")}
+
+
+
+
+ {t("onboarding.soft-gate.intro", "You've answered your first compatibility questions and shared your top interests.")}
+
+
+ {t("onboarding.soft-gate.what_it_means", "Here's what that means for you:")}
+
+
+
+
+ {t("onboarding.soft-gate.bullet1", "Compatibility scores now reflect your values and preferences")}
+
+
+ {t("onboarding.soft-gate.bullet2", "You'll see match percentages that align closely with what you care about")}
+
+
+ {t("onboarding.soft-gate.bullet3", "You can update your profile anytime to increase the chances of the right people reaching out.")}
+
+
+
+
+
+
+ {t("onboarding.soft-gate.explore_button", "Explore Profiles Now")}
+
+
+
+ {t("onboarding.soft-gate.refine_button", "Refine Profile")}
+
+
+
+
+
+ )
+}
diff --git a/web/pages/register.tsx b/web/pages/register.tsx
index 90727e4..8ed130a 100644
--- a/web/pages/register.tsx
+++ b/web/pages/register.tsx
@@ -51,8 +51,8 @@ function RegisterComponent() {
console.log("Router.push('/')")
await Router.push('/')
} else {
- console.log("Router.push('/signup')")
- await Router.push('/signup')
+ console.log("Router.push('/onboarding')")
+ await Router.push('/onboarding')
}
setIsLoading(false)
}
diff --git a/web/pages/signin.tsx b/web/pages/signin.tsx
index 8f999a5..a3ee90f 100644
--- a/web/pages/signin.tsx
+++ b/web/pages/signin.tsx
@@ -52,7 +52,7 @@ function RegisterComponent() {
if (profile) {
await Router.push('/')
} else {
- await Router.push('/signup')
+ await Router.push('/onboarding')
}
} catch (error) {
console.error("Error fetching profile profile:", error)
diff --git a/web/styles/globals.css b/web/styles/globals.css
index b5b48be..989c98d 100644
--- a/web/styles/globals.css
+++ b/web/styles/globals.css
@@ -494,3 +494,38 @@ ol > li::marker {
color: #374151; /* pick a visible color */
}
+/* Onboarding animations */
+@keyframes fade-in {
+ from {
+ opacity: 0;
+ transform: translateY(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes fade-out-slow {
+ 0% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ 80% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ 100% {
+ opacity: 0;
+ transform: translateY(-5px);
+ }
+}
+
+.animate-fade-in {
+ animation: fade-in 0.8s ease-out;
+}
+
+.animate-fade-out-slow {
+ animation: fade-out-slow 3s ease-out forwards;
+}
+