diff --git a/src/app/ai-job-search/page.tsx b/src/app/ai-job-search/page.tsx new file mode 100644 index 0000000..863b697 --- /dev/null +++ b/src/app/ai-job-search/page.tsx @@ -0,0 +1,433 @@ +"use client"; + +import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider"; +import NavbarStyleCentered from "@/components/navbar/NavbarStyleCentered/NavbarStyleCentered"; +import HeroLogo from "@/components/sections/hero/HeroLogo"; +import MetricCardEleven from "@/components/sections/metrics/MetricCardEleven"; +import FeatureCardTen from "@/components/sections/feature/FeatureCardTen"; +import PricingCardTwo from "@/components/sections/pricing/PricingCardTwo"; +import TestimonialCardTen from "@/components/sections/testimonial/TestimonialCardTen"; +import FaqSplitMedia from "@/components/sections/faq/FaqSplitMedia"; +import FooterLogoEmphasis from "@/components/sections/footer/FooterLogoEmphasis"; +import { Search, Filter, Zap, CheckCircle, Database, TrendingUp, AlertCircle, Sparkles } from "lucide-react"; +import { useState } from "react"; + +export default function AIJobSearchPage() { + const navItems = [ + { name: "Dashboard", id: "dashboard" }, + { name: "Features", id: "features" }, + { name: "Pricing", id: "pricing" }, + { name: "FAQ", id: "faq" }, + { name: "Contact", id: "contact" }, + { name: "AI Job Search", id: "/ai-job-search" }, + ]; + + const [selectedCategory, setSelectedCategory] = useState("all"); + const [searchQuery, setSearchQuery] = useState(""); + const [salaryRange, setSalaryRange] = useState([50, 150]); + const [experienceLevel, setExperienceLevel] = useState("all"); + + const footerColumns = [ + { + items: [ + { label: "Dashboard", href: "/dashboard" }, + { label: "Applications", href: "/applications" }, + { label: "Interview Prep", href: "/interview-prep" }, + { label: "Settings", href: "/settings" }, + ], + }, + { + items: [ + { label: "Pricing", href: "/pricing" }, + { label: "Features", href: "#features" }, + { label: "FAQ", href: "#faq" }, + { label: "Blog", href: "/blog" }, + ], + }, + { + items: [ + { label: "About Us", href: "/about" }, + { label: "Contact", href: "/contact" }, + { label: "Support", href: "/support" }, + { label: "Status", href: "https://status.trakapply.com" }, + ], + }, + { + items: [ + { label: "Privacy Policy", href: "/privacy" }, + { label: "Terms of Service", href: "/terms" }, + { label: "Cookie Policy", href: "/cookies" }, + { label: "Accessibility", href: "/accessibility" }, + ], + }, + { + items: [ + { label: "Twitter", href: "https://twitter.com/trakapply" }, + { label: "LinkedIn", href: "https://linkedin.com/company/trakapply" }, + { label: "Instagram", href: "https://instagram.com/trakapply" }, + { label: "Discord", href: "https://discord.gg/trakapply" }, + ], + }, + ]; + + return ( + + + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ ); +} diff --git a/src/app/applications/page.tsx b/src/app/applications/page.tsx index af3c7f2..44f2247 100644 --- a/src/app/applications/page.tsx +++ b/src/app/applications/page.tsx @@ -1,15 +1,63 @@ "use client"; +import Link from "next/link"; import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider"; import NavbarStyleCentered from "@/components/navbar/NavbarStyleCentered/NavbarStyleCentered"; -import HeroLogo from "@/components/sections/hero/HeroLogo"; -import MetricCardEleven from "@/components/sections/metrics/MetricCardEleven"; -import FeatureCardTen from "@/components/sections/feature/FeatureCardTen"; +import HeroLogoBillboardSplit from "@/components/sections/hero/HeroLogoBillboardSplit"; import FooterLogoEmphasis from "@/components/sections/footer/FooterLogoEmphasis"; -import Link from "next/link"; -import { CheckCircle, Filter, Zap, Bell, Calendar, AlertCircle, FileText, Tag, Link as LinkIcon, Users, Workflow } from "lucide-react"; export default function ApplicationsPage() { + const navItems = [ + { name: "Dashboard", id: "dashboard" }, + { name: "Features", id: "features" }, + { name: "Pricing", id: "pricing" }, + { name: "FAQ", id: "faq" }, + { name: "Contact", id: "contact" }, + ]; + + const footerColumns = [ + { + items: [ + { label: "Dashboard", href: "/dashboard" }, + { label: "Applications", href: "/applications" }, + { label: "Interview Prep", href: "/interview-prep" }, + { label: "Settings", href: "/settings" }, + ], + }, + { + items: [ + { label: "Pricing", href: "/pricing" }, + { label: "Features", href: "#features" }, + { label: "FAQ", href: "#faq" }, + { label: "Blog", href: "/blog" }, + ], + }, + { + items: [ + { label: "About Us", href: "/about" }, + { label: "Contact", href: "/contact" }, + { label: "Support", href: "/support" }, + { label: "Status", href: "https://status.trakapply.com" }, + ], + }, + { + items: [ + { label: "Privacy Policy", href: "/privacy" }, + { label: "Terms of Service", href: "/terms" }, + { label: "Cookie Policy", href: "/cookies" }, + { label: "Accessibility", href: "/accessibility" }, + ], + }, + { + items: [ + { label: "Twitter", href: "https://twitter.com/trakapply" }, + { label: "LinkedIn", href: "https://linkedin.com/company/trakapply" }, + { label: "Instagram", href: "https://instagram.com/trakapply" }, + { label: "Discord", href: "https://discord.gg/trakapply" }, + ], + }, + ]; + return (
-
-
- -
+
+
+
+
+
+

Kanban Board

+

+ Visualize your entire application pipeline with our enhanced Kanban board. Drag and drop applications between columns to update their status in real-time. Color-coded cards help you quickly identify priority applications and follow-up deadlines. +

+
    +
  • + + Drag-and-drop status updates +
  • +
  • + + Customizable pipeline columns +
  • +
  • + + Color-coded priority levels +
  • +
  • + + Quick-view application details +
  • +
+
+
+ Kanban board view +
+
-
- +
+
+ AI Cover Letter Generator +
+
+

AI Cover Letter Generator

+

+ Generate personalized cover letters powered by AI. TrakApply analyzes job descriptions and your profile to create compelling, customized cover letters in seconds. Save time while making stronger applications. +

+
    +
  • + + AI-powered personalization +
  • +
  • + + One-click generation +
  • +
  • + + Edit and customize +
  • +
  • + + Cover letter history +
  • +
+
+
+ +
+
+

Interview Prep Features

+

+ Prepare for your interviews with built-in interview prep tools. Practice common questions, get AI feedback, and build confidence before your big day. Track interview progress and learnings from each round. +

+
    +
  • + + Mock interview practice +
  • +
  • + + AI feedback on answers +
  • +
  • + + Company-specific prep +
  • +
  • + + Interview notes and insights +
  • +
+
+
+ Interview prep +
+
+
+
); -} \ No newline at end of file +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 8a93f2b..381a43c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -7,42 +7,27 @@ import { ServiceWrapper } from "@/components/ServiceWrapper"; import Tag from "@/tag/Tag"; const halant = Halant({ - variable: "--font-halant", - subsets: ["latin"], + variable: "--font-halant", subsets: ["latin"], weight: ["300", "400", "500", "600", "700"], }); const inter = Inter({ - variable: "--font-inter", - subsets: ["latin"], + variable: "--font-inter", subsets: ["latin"], }); const archivo = Archivo({ - variable: "--font-archivo", - subsets: ["latin"], + variable: "--font-archivo", subsets: ["latin"], }); export const metadata: Metadata = { - title: "TrakApply - Job Application Tracker for Students", - description: "Track job applications, manage follow-ups, and land your next opportunity. Free job application tracker for students and recent graduates.", - keywords: "job application tracker, job search, application management, resume tracker, interview tracker", - openGraph: { - title: "TrakApply - Job Application Tracker", - description: "Stop managing job applications in spreadsheets. Track, organize, and succeed with TrakApply.", - siteName: "TrakApply", - type: "website", - images: [ + title: "TrakApply - Job Application Tracker for Students", description: "Track job applications, manage follow-ups, and land your next opportunity. Free job application tracker for students and recent graduates.", keywords: "job application tracker, job search, application management, resume tracker, interview tracker", openGraph: { + title: "TrakApply - Job Application Tracker", description: "Stop managing job applications in spreadsheets. Track, organize, and succeed with TrakApply.", siteName: "TrakApply", type: "website", images: [ { - url: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3Aa4DjH4nqtvm1RVk8EeBf92VBo/a-modern-job-application-tracking-dashbo-1772817322817-dd6e3967.png", - alt: "TrakApply Dashboard", - }, + url: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3Aa4DjH4nqtvm1RVk8EeBf92VBo/a-modern-job-application-tracking-dashbo-1772817322817-dd6e3967.png", alt: "TrakApply Dashboard"}, ], }, twitter: { - card: "summary_large_image", - title: "TrakApply - Job Application Tracker", - description: "Track and manage your job search in one place.", - images: ["https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3Aa4DjH4nqtvm1RVk8EeBf92VBo/a-modern-job-application-tracking-dashbo-1772817322817-dd6e3967.png"], + card: "summary_large_image", title: "TrakApply - Job Application Tracker", description: "Track and manage your job search in one place.", images: ["https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3Aa4DjH4nqtvm1RVk8EeBf92VBo/a-modern-job-application-tracking-dashbo-1772817322817-dd6e3967.png"], }, }; diff --git a/src/app/page.tsx b/src/app/page.tsx index 14993af..b2eb3da 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -18,6 +18,7 @@ export default function HomePage() { { name: "Features", id: "features" }, { name: "Pricing", id: "pricing" }, { name: "FAQ", id: "faq" }, + { name: "Follow-ups", id: "follow-ups" }, { name: "Contact", id: "contact" }, ]; @@ -88,7 +89,7 @@ export default function HomePage() {
+
+
+
+
+
+ +
+

+ Advanced Follow-Up Management +

+

+ Our intelligent follow-up system ensures you never miss an opportunity. Schedule reminders, automate your follow-up workflow, and track all your outreach in one place. +

+ + Learn More + +
+ +
+ {[ + { + title: "What follow-up scheduling options are available?", content: + "You can schedule one-time reminders on specific dates, set recurring follow-ups at custom intervals, or use our smart scheduling to automatically suggest optimal follow-up times based on company response patterns. Pro users get access to all scheduling options."}, + { + title: "How do I know when to follow up?", content: + "TrakApply recommends follow-up timing based on your application date and company typical response times. You can manually set follow-up dates or let our intelligent system suggest them. Overdue reminders ensure you never forget to reach out."}, + { + title: "Can I track follow-up history for each application?", content: + "Yes! Every follow-up reminder, email, or message you log is tracked in the application history. You can see your complete outreach timeline, previous messages, and company responses all in one place for easy reference."}, + ].map((faq, idx) => ( +
+ + {faq.title} + + ▼ + + +

{faq.content}

+
+ ))} +
+
+
+
+
@@ -427,20 +364,14 @@ export default function HomePage() {
{[ { - title: "What's your typical response time?", - content: - "Free plan users can expect responses within 24-48 hours. Pro plan users get priority support with response times typically within 2-4 hours during business hours.", - }, + title: "What's your typical response time?", content: + "Free plan users can expect responses within 24-48 hours. Pro plan users get priority support with response times typically within 2-4 hours during business hours."}, { - title: "Do you offer onboarding assistance?", - content: - "Yes! We offer guided onboarding tours, video tutorials, and email templates to help you get started. Pro plan users also get access to our weekly office hours for personalized advice.", - }, + title: "Do you offer onboarding assistance?", content: + "Yes! We offer guided onboarding tours, video tutorials, and email templates to help you get started. Pro plan users also get access to our weekly office hours for personalized advice on follow-up strategies."}, { - title: "Can I request new features?", - content: - "Absolutely! We love hearing from students about features they'd find useful. Visit our Feature Request page to suggest new features and vote on community requests.", - }, + title: "Can I request new features?", content: + "Absolutely! We love hearing from students about features they'd find useful. Visit our Feature Request page to suggest new features and vote on community requests."}, ].map((faq, idx) => (
({}); + const [loading, setLoading] = useState(false); + + const validateEmail = (value: string) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const newErrors: { email?: string; password?: string } = {}; + + if (!email.trim()) { + newErrors.email = "Email is required"; + } else if (!validateEmail(email)) { + newErrors.email = "Please enter a valid email"; + } + + if (!password.trim()) { + newErrors.password = "Password is required"; + } else if (password.length < 6) { + newErrors.password = "Password must be at least 6 characters"; + } + + setErrors(newErrors); + + if (Object.keys(newErrors).length === 0) { + setLoading(true); + setTimeout(() => { + setLoading(false); + console.log("Sign in submitted", { email, password }); + }, 1500); + } + }; + + return ( + + + +
+ +
+ +
+
+
+

+ Sign In +

+

+ Access your TrakApply dashboard +

+ + {/* OAuth Options */} +
+ + + +
+ + {/* Divider */} +
+
+
+
+
+ Or continue with email +
+
+ + {/* Email/Password Form */} +
+
+ + { + setEmail(e.target.value); + if (errors.email) setErrors({ ...errors, email: undefined }); + }} + placeholder="you@example.com" + className={`w-full px-4 py-3 rounded-lg border ${ + errors.email ? "border-red-500" : "border-gray-300" + } focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all`} + /> + {errors.email && ( +

{errors.email}

+ )} +
+ +
+ +
+ { + setPassword(e.target.value); + if (errors.password) setErrors({ ...errors, password: undefined }); + }} + placeholder="Enter your password" + className={`w-full px-4 py-3 pr-12 rounded-lg border ${ + errors.password ? "border-red-500" : "border-gray-300" + } focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all`} + /> + +
+ {errors.password && ( +

{errors.password}

+ )} +
+ +
+ + + Forgot password? + +
+ + +
+ + {/* Sign Up Link */} +

+ Don't have an account?{" "} + + Create one + +

+
+
+
+ + +
+ ); +} diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx new file mode 100644 index 0000000..e9db9a4 --- /dev/null +++ b/src/app/signup/page.tsx @@ -0,0 +1,382 @@ +"use client"; + +import Link from "next/link"; +import { useState } from "react"; +import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider"; +import NavbarStyleCentered from "@/components/navbar/NavbarStyleCentered/NavbarStyleCentered"; +import HeroLogo from "@/components/sections/hero/HeroLogo"; +import FooterLogoEmphasis from "@/components/sections/footer/FooterLogoEmphasis"; +import { Mail, Github, Linkedin, Eye, EyeOff, Check } from "lucide-react"; + +export default function SignUpPage() { + const navItems = [ + { name: "Dashboard", id: "dashboard" }, + { name: "Features", id: "features" }, + { name: "Pricing", id: "pricing" }, + { name: "FAQ", id: "faq" }, + { name: "Contact", id: "contact" }, + { name: "Sign In", id: "/signin" }, + { name: "Sign Up", id: "/signup" }, + ]; + + const footerColumns = [ + { + items: [ + { label: "Dashboard", href: "/dashboard" }, + { label: "Applications", href: "/applications" }, + { label: "Interview Prep", href: "/interview-prep" }, + { label: "Settings", href: "/settings" }, + ], + }, + { + items: [ + { label: "Pricing", href: "/pricing" }, + { label: "Features", href: "#features" }, + { label: "FAQ", href: "#faq" }, + { label: "Blog", href: "/blog" }, + ], + }, + { + items: [ + { label: "About Us", href: "/about" }, + { label: "Contact", href: "/contact" }, + { label: "Support", href: "/support" }, + { label: "Status", href: "https://status.trakapply.com" }, + ], + }, + { + items: [ + { label: "Privacy Policy", href: "/privacy" }, + { label: "Terms of Service", href: "/terms" }, + { label: "Cookie Policy", href: "/cookies" }, + { label: "Accessibility", href: "/accessibility" }, + ], + }, + { + items: [ + { label: "Twitter", href: "https://twitter.com/trakapply" }, + { label: "LinkedIn", href: "https://linkedin.com/company/trakapply" }, + { label: "Instagram", href: "https://instagram.com/trakapply" }, + { label: "Discord", href: "https://discord.gg/trakapply" }, + ], + }, + ]; + + const [showPassword, setShowPassword] = useState(false); + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [acceptTerms, setAcceptTerms] = useState(false); + const [errors, setErrors] = useState<{ + name?: string; + email?: string; + password?: string; + terms?: string; + }>({}); + const [loading, setLoading] = useState(false); + + const validateEmail = (value: string) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(value); + }; + + const validatePassword = (value: string) => { + return ( + value.length >= 8 && + /[A-Z]/.test(value) && + /[a-z]/.test(value) && + /[0-9]/.test(value) + ); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const newErrors: { + name?: string; + email?: string; + password?: string; + terms?: string; + } = {}; + + if (!name.trim()) { + newErrors.name = "Name is required"; + } else if (name.trim().length < 2) { + newErrors.name = "Name must be at least 2 characters"; + } + + if (!email.trim()) { + newErrors.email = "Email is required"; + } else if (!validateEmail(email)) { + newErrors.email = "Please enter a valid email"; + } + + if (!password.trim()) { + newErrors.password = "Password is required"; + } else if (!validatePassword(password)) { + newErrors.password = + "Password must be 8+ characters with uppercase, lowercase, and numbers"; + } + + if (!acceptTerms) { + newErrors.terms = "You must accept the terms and conditions"; + } + + setErrors(newErrors); + + if (Object.keys(newErrors).length === 0) { + setLoading(true); + setTimeout(() => { + setLoading(false); + console.log("Sign up submitted", { name, email, password, acceptTerms }); + }, 1500); + } + }; + + const passwordStrength = { + length: password.length >= 8, + uppercase: /[A-Z]/.test(password), + lowercase: /[a-z]/.test(password), + numbers: /[0-9]/.test(password), + }; + + return ( + + + +
+ +
+ +
+
+
+

+ Create Account +

+

+ Join thousands of students tracking their job search +

+ + {/* OAuth Options */} +
+ + + +
+ + {/* Divider */} +
+
+
+
+
+ Or sign up with email +
+
+ + {/* Email/Password Form */} +
+
+ + { + setName(e.target.value); + if (errors.name) setErrors({ ...errors, name: undefined }); + }} + placeholder="John Doe" + className={`w-full px-4 py-3 rounded-lg border ${ + errors.name ? "border-red-500" : "border-gray-300" + } focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all`} + /> + {errors.name && ( +

{errors.name}

+ )} +
+ +
+ + { + setEmail(e.target.value); + if (errors.email) setErrors({ ...errors, email: undefined }); + }} + placeholder="you@example.com" + className={`w-full px-4 py-3 rounded-lg border ${ + errors.email ? "border-red-500" : "border-gray-300" + } focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all`} + /> + {errors.email && ( +

{errors.email}

+ )} +
+ +
+ +
+ { + setPassword(e.target.value); + if (errors.password) setErrors({ ...errors, password: undefined }); + }} + placeholder="Create a strong password" + className={`w-full px-4 py-3 pr-12 rounded-lg border ${ + errors.password ? "border-red-500" : "border-gray-300" + } focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all`} + /> + +
+ {errors.password && ( +

{errors.password}

+ )} + + {/* Password Strength Indicator */} + {password && ( +
+

Password strength:

+
+ {[ + { label: "8+ characters", check: passwordStrength.length }, + { label: "Uppercase letter", check: passwordStrength.uppercase }, + { label: "Lowercase letter", check: passwordStrength.lowercase }, + { label: "Number", check: passwordStrength.numbers }, + ].map((item, idx) => ( +
+
+ {item.check && ( + + )} +
+ + {item.label} + +
+ ))} +
+
+ )} +
+ +
+ + {errors.terms && ( +

{errors.terms}

+ )} +
+ + +
+ + {/* Sign In Link */} +

+ Already have an account?{" "} + + Sign in + +

+
+
+
+ + +
+ ); +}