Integrations
∞
diff --git a/apps/app/src/app/(app)/onboarding/[orgId]/layout.tsx b/apps/app/src/app/(app)/onboarding/[orgId]/layout.tsx
index 8152247a3..c270f5c48 100644
--- a/apps/app/src/app/(app)/onboarding/[orgId]/layout.tsx
+++ b/apps/app/src/app/(app)/onboarding/[orgId]/layout.tsx
@@ -1,9 +1,10 @@
import { CheckoutCompleteDialog } from '@/components/dialogs/checkout-complete-dialog';
-import { OnboardingLayout } from '@/components/onboarding/OnboardingLayout';
+import { MinimalHeader } from '@/components/layout/MinimalHeader';
import { auth } from '@/utils/auth';
import { db } from '@db';
import { headers } from 'next/headers';
import { notFound } from 'next/navigation';
+import { OnboardingSidebar } from '../../setup/components/OnboardingSidebar';
interface OnboardingRouteLayoutProps {
children: React.ReactNode;
@@ -42,9 +43,24 @@ export default async function OnboardingRouteLayout({
}
return (
-
- {children}
+
+
+ {/* Form Section - Left Side */}
+
+
+ {children}
+
+
+ {/* Sidebar Section - Right Side, Hidden on Mobile */}
+
+
+
+
-
+
);
}
diff --git a/apps/app/src/app/(app)/onboarding/[orgId]/page.tsx b/apps/app/src/app/(app)/onboarding/[orgId]/page.tsx
index e1b081bd0..a8a5e59ce 100644
--- a/apps/app/src/app/(app)/onboarding/[orgId]/page.tsx
+++ b/apps/app/src/app/(app)/onboarding/[orgId]/page.tsx
@@ -77,7 +77,7 @@ export default async function OnboardingPage({ params }: OnboardingPageProps) {
Object.assign(initialData, {
describe:
initialData.describe ||
- 'comp ai is a grc platform saas that gets companies compliant with soc2 iso and hipaa in days',
+ 'Bubba AI, Inc. is the company behind Comp AI - the fastest way to get SOC 2 compliant.',
industry: initialData.industry || 'SaaS',
teamSize: initialData.teamSize || '1-10',
devices: initialData.devices || 'Personal laptops',
diff --git a/apps/app/src/app/(app)/onboarding/components/PostPaymentOnboarding.tsx b/apps/app/src/app/(app)/onboarding/components/PostPaymentOnboarding.tsx
index a5116e889..9af1b2431 100644
--- a/apps/app/src/app/(app)/onboarding/components/PostPaymentOnboarding.tsx
+++ b/apps/app/src/app/(app)/onboarding/components/PostPaymentOnboarding.tsx
@@ -1,13 +1,15 @@
'use client';
import { OnboardingStepInput } from '@/app/(app)/setup/components/OnboardingStepInput';
+import { AnimatedWrapper } from '@/components/animated-wrapper';
import { LogoSpinner } from '@/components/logo-spinner';
import { Button } from '@comp/ui/button';
-import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@comp/ui/card';
import { Form, FormControl, FormField, FormItem, FormMessage } from '@comp/ui/form';
import type { Organization } from '@db';
-import { ArrowLeft, ArrowRight } from 'lucide-react';
+import { AnimatePresence, motion } from 'framer-motion';
+import { Loader2 } from 'lucide-react';
import { useEffect, useMemo } from 'react';
+import Balancer from 'react-wrap-balancer';
import { usePostPaymentOnboarding } from '../hooks/usePostPaymentOnboarding';
interface PostPaymentOnboardingProps {
@@ -51,6 +53,17 @@ export function PostPaymentOnboarding({
);
}, []);
+ // Check if current step has valid input
+ const currentStepValue = form.watch(step?.key);
+ const isCurrentStepValid = (() => {
+ if (!step) return false;
+ if (step.key === 'frameworkIds') {
+ return Array.isArray(currentStepValue) && currentStepValue.length > 0;
+ }
+ // For other fields, check if they have a value
+ return Boolean(currentStepValue) && String(currentStepValue).trim().length > 0;
+ })();
+
// Dispatch custom event for background animation when step changes
useEffect(() => {
if (typeof window !== 'undefined') {
@@ -73,132 +86,166 @@ export function PostPaymentOnboarding({
}
}, [stepIndex, isFinalizing, totalSteps]);
- return (
-
-
-
- {(isLoading || isFinalizing) && (
-
-
-
- )}
-
-
-
-
- Step {stepIndex + 1} of {totalSteps}
-
-
- {step?.question || ''}
-
-
-
-
- {!isLoading && (
-