diff --git a/app/components/OnboardingDialog.tsx b/app/components/OnboardingDialog.tsx
new file mode 100644
index 0000000..27665d6
--- /dev/null
+++ b/app/components/OnboardingDialog.tsx
@@ -0,0 +1,162 @@
+"use client";
+
+import {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog";
+import { Button } from "@/components/ui/button";
+import Image from "next/image";
+import ImageStep1 from '@/public/onboarding-images/step-1.png';
+import ImageStep2 from '@/public/onboarding-images/step-2.png';
+import ImageStep3 from '@/public/onboarding-images/step-3.png';
+import PointingHand from '@/public/onboarding-images/pointinghand.png';
+import { ArrowRight } from "lucide-react";
+import { useSearchParams } from 'next/navigation'
+import * as React from 'react';
+
+const OnboardingDialog = () => {
+ // Look for showNux query param in the URL.
+ const searchParams = useSearchParams();
+ let showNux = searchParams.get('shownux') === 'true';
+
+ // Check browser width, and don't show NUX if on mobile device.
+ window.innerWidth < 640 ? showNux = false : "";
+
+ const [openNux, setOpenNux] = React.useState(showNux);
+ const [currentStep, setCurrentStep] = React.useState(0);
+
+ const onboardingSteps = [
+ {
+ "title": "Welcome to Furever!",
+ "description": "Take a quick tour to learn more.",
+ "imageClassName": "scale-[0.85]",
+ "cursorClassName": "opacity-0",
+ "imageURL": ImageStep1,
+ }, {
+ "title": "Eplore components on different pages.",
+ "description": "Components can be found in Payments, Payouts, Finances, and My Account.",
+ "imageClassName": "scale-[1.6] translate-x-[280px] translate-y-[25px]",
+ "cursorClassName": "opacity-100 translate-x-[60px] translate-y-[-160px]",
+ "imageURL": ImageStep2,
+ }, {
+ "title": "View component outlines",
+ "description": "Turn on borders to visualize embedded components in dashboard.",
+ "imageClassName": "scale-[1.8] translate-x-[450px] translate-y-[-450px]",
+ "cursorClassName": "opacity-100 translate-x-[208px] translate-y-[-75px]",
+ "imageURL": ImageStep3,
+ }
+ ]
+
+ const DecrementButon = () => {
+ // If user is at first step, show a close button
+ if (currentStep == 0) {
+ return (
+
+
+
+ )
+ }
+
+ // If not, show a back button
+ return (
+
+ )
+ }
+
+ const IncrementButton = () => {
+ if (currentStep == onboardingSteps.length - 1) {
+ return (
+
+
+
+ )
+ }
+
+ return (
+
+ )
+ }
+
+ const ProgressIndicator = () => {
+ const progressDot = (isActive: boolean) => {
+ const bg = isActive ? "bg-[#675DFF]" : "bg-neutral-200"
+ return
+ }
+
+ return (
+
+ { progressDot(currentStep >= 0) }
+ { progressDot(currentStep >= 1) }
+ { progressDot(currentStep >= 2) }
+
+ )
+ }
+
+ return (
+ <>
+
+ >
+ );
+};
+
+export default OnboardingDialog;
diff --git a/app/components/QuickstartButton.tsx b/app/components/QuickstartButton.tsx
index 5f57f9e..e7f672e 100644
--- a/app/components/QuickstartButton.tsx
+++ b/app/components/QuickstartButton.tsx
@@ -194,10 +194,10 @@ const QuickstartButton = () => {
email: `${salonName}_${emailNumber}@stripe.com`,
password: `${passwordWords[0]}-${passwordWords[1]}-${passwordNumber}`,
businessName: salonName,
- callbackUrl: '/home',
+ callbackUrl: '/home?shownux=true',
});
- router.push('/home'); // Redirect to the dashboard
+ router.push('/home?shownux=true'); // Redirect to the dashboard
}
const onClick = async () => {
diff --git a/app/components/Schedule.tsx b/app/components/Schedule.tsx
index 6b3fac3..06ee30e 100644
--- a/app/components/Schedule.tsx
+++ b/app/components/Schedule.tsx
@@ -50,7 +50,7 @@ const renderDayProgressBar = () => {
return (
{
Today's schedule
{getCurrentDate()}
-
+
{renderDayProgressBar()}
diff --git a/components/ui/input.tsx b/components/ui/input.tsx
index 00b8340..cb7e59d 100644
--- a/components/ui/input.tsx
+++ b/components/ui/input.tsx
@@ -11,7 +11,7 @@ const Input = React.forwardRef(
span]:line-clamp-1',
+ 'placeholder:text-muted-foreground flex w-full items-center justify-between rounded-md border border-gray-300 bg-background px-2 py-1 text-base font-medium ring-offset-background focus:outline-accent disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',
className
)}
{...props}
@@ -105,7 +105,7 @@ const SelectLabel = React.forwardRef<
>(({className, ...props}, ref) => (
));
@@ -118,7 +118,7 @@ const SelectItem = React.forwardRef<