atualizacao layout

This commit is contained in:
eycksilva 2026-01-19 15:58:33 -03:00
parent 2e69727486
commit ffa0203ec0
16 changed files with 505 additions and 279 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

BIN
frontend/public/optr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
frontend/public/vaga.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

BIN
frontend/public/vaga1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

View file

@ -51,8 +51,8 @@
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.68 0.22 45); /* Orange Brand Color */
--primary-foreground: oklch(0.985 0 0);
--primary: oklch(0.68 0.24 35); /* #FF6B2C Orange */
--primary-foreground: oklch(1 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
@ -62,20 +62,20 @@
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.68 0.22 45);
--chart-1: oklch(0.68 0.22 45);
--ring: oklch(0.68 0.24 35);
--chart-1: oklch(0.68 0.24 35);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.68 0.22 45);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.68 0.24 35);
--sidebar-primary-foreground: oklch(1 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.68 0.22 45);
--sidebar-ring: oklch(0.68 0.24 35);
}
.dark {
@ -85,8 +85,8 @@
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.205 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.68 0.22 45); /* Orange Brand Color */
--primary-foreground: oklch(0.985 0 0);
--primary: oklch(0.68 0.24 35); /* #FF6B2C Orange */
--primary-foreground: oklch(1 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
@ -96,8 +96,8 @@
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.68 0.22 45);
--chart-1: oklch(0.68 0.22 45);
--ring: oklch(0.68 0.24 35);
--chart-1: oklch(0.68 0.24 35);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);

View file

@ -112,7 +112,7 @@ export default function LoginPage() {
>
<div className="flex items-center justify-center gap-3 mb-8">
<Image
src="/logohorse.png"
src="/logohorseee.png"
alt="GoHorseJobs"
width={140}
height={140}

View file

@ -101,76 +101,159 @@ export default function HomePage() {
<main className="flex-1">
{/* Hero Section */}
<section className="container mx-auto px-4 sm:px-6 lg:px-8 py-20 lg:py-32">
<div className="grid lg:grid-cols-2 gap-12 items-center max-w-7xl mx-auto">
<div className="text-center lg:text-left">
<motion.h1
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
className="text-4xl sm:text-5xl lg:text-6xl font-bold text-balance mb-6"
>
{t('home.hero.title')}
</motion.h1>
<motion.p
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.1 }}
className="text-lg sm:text-xl text-muted-foreground text-balance mb-8 leading-relaxed"
>
{t('home.hero.subtitle')}
</motion.p>
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.2 }}
className="flex flex-col sm:flex-row gap-4 justify-center lg:justify-start"
>
<Link href="/jobs">
<Button size="lg" className="w-full sm:w-auto">
{t('home.hero.searchJobs')}
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</Link>
<Link href="/post-job">
<Button size="lg" variant="outline" className="w-full sm:w-auto bg-transparent">
<Building2 className="mr-2 h-4 w-4" />
{t('home.hero.postJob')}
</Button>
</Link>
</motion.div>
</div>
<motion.div
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.6, delay: 0.3 }}
className="relative hidden lg:block"
>
<div className="relative aspect-square rounded-2xl overflow-hidden bg-muted">
<Image
src="/minimalist-professional-workspace-with-laptop-and-.jpg"
alt="Professional Workspace"
fill
className="object-cover opacity-20"
priority
sizes="100vw"
/>
<section className="bg-primary text-white relative overflow-hidden flex items-center min-h-[640px]">
<div className="absolute inset-0 z-0">
<Image
src="/vaga1.png"
alt="Background"
fill
className="object-center"
quality={100}
priority
/>
</div>
<div className="container mx-auto px-4 sm:px-6 lg:px-8 w-full relative z-10">
<div className="max-w-7xl mx-auto">
<div className="text-left max-w-2xl">
<motion.h1
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
className="text-4xl sm:text-5xl lg:text-5xl font-bold mb-6"
>
{t('home.hero.title')}<br/>{t('home.hero.titleLine2')}
</motion.h1>
<motion.p
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.1 }}
className="text-lg mb-8 leading-relaxed text-white/90"
>
{t('home.hero.subtitle')}
</motion.p>
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.2 }}
>
<Link href="/jobs">
<Button size="lg" className="bg-white text-primary hover:bg-white/90 font-semibold px-12 py-6 text-base">
{t('home.hero.cta')}
</Button>
</Link>
</motion.div>
</div>
</motion.div>
</div>
</div>
</section>
{/* Search Bar Section */}
<section className="bg-white py-12">
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-6xl">
<div className="bg-white rounded-xl shadow-md p-8">
<div className="flex items-center gap-3 mb-6">
<div className="flex-1 relative">
<svg className="absolute left-4 top-1/2 -translate-y-1/2 w-5 h-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg>
<input
type="text"
placeholder={t('home.search.placeholder')}
className="w-full pl-12 pr-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent text-sm"
/>
</div>
<Button className="bg-primary hover:bg-primary/90 text-white px-8 py-3 rounded-lg font-medium flex items-center gap-2">
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
{t('home.search.filter')}
</Button>
</div>
<div className="grid grid-cols-1 md:grid-cols-4 gap-6">
<div className="border border-gray-300 rounded-lg p-4">
<button className="flex items-center justify-between w-full mb-3">
<span className="text-sm font-semibold text-gray-900">{t('home.search.contractType')}</span>
<svg className="w-4 h-4 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
</svg>
</button>
<div className="space-y-2">
<label className="flex items-center text-sm text-gray-700 cursor-pointer hover:text-gray-900">
<input type="checkbox" className="w-4 h-4 text-primary border-gray-300 rounded focus:ring-primary mr-2" />
<span>{t('home.search.pj')}</span>
</label>
<label className="flex items-center text-sm text-gray-700 cursor-pointer hover:text-gray-900">
<input type="checkbox" className="w-4 h-4 text-primary border-gray-300 rounded focus:ring-primary mr-2" />
<span>{t('home.search.clt')}</span>
</label>
<label className="flex items-center text-sm text-gray-700 cursor-pointer hover:text-gray-900">
<input type="checkbox" className="w-4 h-4 text-primary border-gray-300 rounded focus:ring-primary mr-2" />
<span>{t('home.search.freelancer')}</span>
</label>
</div>
</div>
<div className="border border-gray-300 rounded-lg p-4">
<button className="flex items-center justify-between w-full mb-3">
<span className="text-sm font-semibold text-gray-900">{t('home.search.workMode')}</span>
<svg className="w-4 h-4 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
</svg>
</button>
<div className="space-y-2">
<label className="flex items-center text-sm text-gray-700 cursor-pointer hover:text-gray-900">
<input type="checkbox" className="w-4 h-4 text-primary border-gray-300 rounded focus:ring-primary mr-2" />
<span>{t('home.search.homeOffice')}</span>
</label>
<label className="flex items-center text-sm text-gray-700 cursor-pointer hover:text-gray-900">
<input type="checkbox" className="w-4 h-4 text-primary border-gray-300 rounded focus:ring-primary mr-2" />
<span>{t('home.search.presencial')}</span>
</label>
<label className="flex items-center text-sm text-gray-700 cursor-pointer hover:text-gray-900">
<input type="checkbox" className="w-4 h-4 text-primary border-gray-300 rounded focus:ring-primary mr-2" />
<span>{t('home.search.hybrid')}</span>
</label>
</div>
</div>
<div className="border border-gray-300 rounded-lg p-4">
<button className="flex items-center justify-between w-full mb-3">
<span className="text-sm font-semibold text-gray-900">{t('home.search.location')}</span>
<svg className="w-4 h-4 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
</svg>
</button>
<select className="w-full px-3 py-2 text-sm text-gray-500 bg-gray-50 border border-gray-200 rounded focus:outline-none focus:ring-2 focus:ring-primary">
<option>{t('home.search.select')}</option>
</select>
</div>
<div className="border border-gray-300 rounded-lg p-4">
<button className="flex items-center justify-between w-full mb-3">
<span className="text-sm font-semibold text-gray-900">{t('home.search.salary')}</span>
<svg className="w-4 h-4 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
</svg>
</button>
<select className="w-full px-3 py-2 text-sm text-gray-500 bg-gray-50 border border-gray-200 rounded focus:outline-none focus:ring-2 focus:ring-primary">
<option>{t('home.search.select')}</option>
</select>
</div>
</div>
</div>
</div>
</section>
{/* Featured Jobs */}
<section className="bg-muted/30 py-20">
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-12">
<h2 className="text-3xl font-bold mb-4">{t('home.featured.title')}</h2>
<p className="text-muted-foreground text-base">{t('home.featured.subtitle')}</p>
<section className="bg-white py-12">
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-6xl">
<div className="mb-8">
<h2 className="text-2xl font-bold text-gray-900">{t('home.featuredJobs.title')}</h2>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-7xl mx-auto">
{featuredJobs.map((job, index) => (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
{(featuredJobs.length >= 8 ? featuredJobs.slice(0, 8) : mockJobs.slice(0, 8)).map((job, index) => (
<motion.div
key={job.id}
initial={{ opacity: 0, y: 20 }}
@ -178,106 +261,71 @@ export default function HomePage() {
viewport={{ once: true }}
transition={{ duration: 0.5, delay: index * 0.1 }}
>
<JobCard job={job} />
<Card className="hover:shadow-md transition-shadow border border-gray-200">
<CardContent className="p-5">
<div className="bg-[#1a1f2e] rounded-lg p-8 mb-4 min-h-[160px] flex items-center justify-center">
<div className="w-16 h-16 bg-primary rounded-full flex items-center justify-center">
<Building2 className="w-8 h-8 text-white" />
</div>
</div>
<div className="mb-4">
<h3 className="font-semibold text-base mb-1.5">{job.title}</h3>
<p className="text-xs text-gray-500">{job.company} · {job.location}</p>
</div>
<div className="flex items-center justify-between mb-4">
<span className="text-xs text-gray-400 flex items-center gap-1">📅 Ontem</span>
</div>
<Link href={`/jobs/${job.id}`}>
<Button size="sm" className="w-full bg-primary hover:bg-primary/90 text-white rounded-md">
{t('home.featuredJobs.apply')}
</Button>
</Link>
</CardContent>
</Card>
</motion.div>
))}
</div>
</div>
</section>
<div className="text-center mt-12">
{/* More Jobs Section */}
<section className="bg-white py-12">
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-6xl">
<div className="flex justify-between items-center mb-6">
<h2 className="text-2xl font-bold text-gray-900">{t('home.moreJobs.title')}</h2>
<Link href="/jobs">
<Button variant="outline" size="lg">
{t('home.featured.viewAll')}
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
<Button className="bg-primary hover:bg-primary/90 text-white rounded-md px-6">{t('home.moreJobs.viewAll')}</Button>
</Link>
</div>
</div>
</section>
{/* How it Works */}
<section className="py-20 relative overflow-hidden">
<div className="absolute inset-0 opacity-5">
<Image src="/abstract-minimal-geometric-pattern-light-gray.jpg" alt="" fill className="object-cover" />
</div>
<div className="container mx-auto px-4 sm:px-6 lg:px-8 relative">
<div className="text-center mb-16">
<h2 className="text-3xl font-bold mb-4">{t('home.howItWorks.title')}</h2>
<p className="text-muted-foreground text-base">{t('home.howItWorks.subtitle')}</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 max-w-5xl mx-auto">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5 }}
className="text-center"
>
<div className="w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-6 bg-background">
<Users className="text-primary w-9 h-9" />
</div>
<h3 className="text-xl font-semibold mb-3">{t('home.howItWorks.step1.title')}</h3>
<p className="text-muted-foreground leading-relaxed">{t('home.howItWorks.step1.description')}</p>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.1 }}
className="text-center"
>
<div className="w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-6 bg-background">
<FileText className="text-primary w-9 h-9" />
</div>
<h3 className="text-xl font-semibold mb-3">{t('home.howItWorks.step2.title')}</h3>
<p className="text-muted-foreground leading-relaxed">{t('home.howItWorks.step2.description')}</p>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.2 }}
className="text-center"
>
<div className="w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-6 bg-background">
<CheckCircle className="text-primary h-9 w-9" />
</div>
<h3 className="text-xl font-semibold mb-3">{t('home.howItWorks.step3.title')}</h3>
<p className="text-muted-foreground leading-relaxed">{t('home.howItWorks.step3.description')}</p>
</motion.div>
</div>
</div>
</section>
{/* Testimonials */}
<section className="bg-muted/30 py-20 border-0">
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-12">
<h2 className="text-3xl font-bold mb-4">{t('home.testimonials.title')}</h2>
<p className="text-muted-foreground text-base">{t('home.testimonials.subtitle')}</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 max-w-6xl mx-auto">
{mockTestimonials.map((testimonial, index) => (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
{(featuredJobs.length >= 12 ? featuredJobs.slice(8, 12) : mockJobs.slice(0, 4)).map((job, index) => (
<motion.div
key={testimonial.id}
key={job.id}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: index * 0.1 }}
>
<Card>
<CardContent className="pt-6">
<div className="flex items-center gap-4 mb-4">
<div>
<p className="font-semibold">{testimonial.name}</p>
<p className="text-sm text-muted-foreground">{testimonial.role}</p>
<Card className="hover:shadow-md transition-shadow border border-gray-200 bg-white">
<CardContent className="p-5">
<div className="bg-[#1a1f2e] rounded-lg p-8 mb-4 min-h-[160px] flex items-center justify-center">
<div className="w-16 h-16 bg-primary rounded-full flex items-center justify-center">
<Building2 className="w-8 h-8 text-white" />
</div>
</div>
<p className="text-muted-foreground leading-relaxed text-pretty">{testimonial.content}</p>
<div className="mb-4">
<h3 className="font-semibold text-base mb-1.5">{job.title}</h3>
<p className="text-xs text-gray-500">{job.company} · {job.location}</p>
</div>
<div className="flex items-center justify-between mb-4">
<span className="text-xs text-gray-400 flex items-center gap-1">📅 Ontem</span>
</div>
<Link href={`/jobs/${job.id}`}>
<Button size="sm" className="w-full bg-primary hover:bg-primary/90 text-white rounded-md">
{t('home.featuredJobs.apply')}
</Button>
</Link>
</CardContent>
</Card>
</motion.div>
@ -287,38 +335,41 @@ export default function HomePage() {
</section>
{/* CTA Section */}
<section className="py-20">
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
<Card className="overflow-hidden bg-primary">
<div className="grid lg:grid-cols-2 gap-0">
<section className="py-12 bg-white">
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-6xl">
<div className="bg-primary rounded-2xl overflow-hidden shadow-lg relative">
<div className="absolute inset-0 z-0">
<Image
src="/optr.png"
alt="Background"
fill
className="object-cover object-right"
quality={100}
/>
</div>
<div className="grid lg:grid-cols-2 gap-8 items-center p-8 lg:p-12 relative z-10">
{/* Text Content */}
<CardContent className="py-16 px-8 lg:px-12 flex flex-col justify-center bg-primary text-primary-foreground">
<h2 className="text-3xl lg:text-4xl font-bold mb-4 text-balance">{t('home.cta.title')}</h2>
<p className="mb-8 text-primary-foreground/90 text-balance leading-relaxed text-base">
<div className="text-white">
<div className="flex items-center gap-2 mb-6">
<svg className="w-6 h-6" viewBox="0 0 24 24" fill="none">
<path d="M12 2L2 7L12 12L22 7L12 2Z" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
<path d="M2 17L12 22L22 17" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
<path d="M2 12L12 17L22 12" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
</svg>
<span className="font-medium text-sm">{t('home.cta.badge')}</span>
</div>
<h2 className="text-3xl lg:text-4xl font-bold mb-4 leading-tight">
{t('home.cta.title')}
</h2>
<p className="mb-6 text-white/90 text-sm">
{t('home.cta.subtitle')}
</p>
<div>
<Link href="/register/candidate">
<Button size="lg" variant="secondary">
{t('home.cta.button')}
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</Link>
</div>
</CardContent>
{/* Image */}
<div className="relative h-64 lg:h-auto min-h-[500px]">
<Image
src="/professional-person-smiling-at-laptop-optimistic.jpg"
alt="Professional smiling at laptop"
fill
className="object-cover opacity-10"
sizes="100vw"
/>
<Button size="lg" className="bg-white text-primary hover:bg-white/90 font-semibold px-8 rounded-md">
{t('home.cta.button')}
</Button>
</div>
</div>
</Card>
</div>
</div>
</section>
</main>

View file

@ -137,7 +137,7 @@ export default function PublicPostJobPage() {
>
<div className="flex items-center justify-center gap-3 mb-8">
<Image
src="/logohorse.png"
src="/logohorse1.png"
alt="GoHorse Jobs"
width={80}
height={80}

View file

@ -0,0 +1,41 @@
"use client"
import Link from "next/link"
import { useTranslation } from "@/lib/i18n"
export function FooterSimple() {
const { t } = useTranslation()
const currentYear = new Date().getFullYear()
return (
<footer className="border-t border-gray-200 bg-white py-8">
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-6xl">
<div className="flex flex-col md:flex-row items-center justify-between gap-4">
<div className="flex items-center gap-8 text-sm text-gray-600">
<Link href="/jobs" className="hover:text-primary transition-colors">
{t('footer.vagas')}
</Link>
<Link href="/companies" className="hover:text-primary transition-colors">
{t('footer.empresas')}
</Link>
<Link href="/blog" className="hover:text-primary transition-colors">
{t('footer.blog')}
</Link>
</div>
<div>
<Link href="/login">
<button className="px-6 py-2 text-sm font-medium text-gray-700 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors">
{t('footer.login')}
</button>
</Link>
</div>
</div>
<div className="mt-6 pt-6 border-t border-gray-200 text-center">
<p className="text-xs text-gray-500">© {currentYear} {t('footer.copyright')}</p>
</div>
</div>
</footer>
)
}

View file

@ -8,84 +8,86 @@ export function Footer() {
const currentYear = new Date().getFullYear()
return (
<footer className="border-t border-border bg-muted/30 mt-24">
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-12">
<div className="grid grid-cols-1 md:grid-cols-5 gap-8">
<div className="col-span-1 md:col-span-2">
<div className="flex items-center gap-2 mb-4">
<span className="text-xl font-semibold">GoHorse Jobs</span>
<footer className="border-t border-gray-200 bg-white py-12">
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-6xl">
<div className="grid grid-cols-1 md:grid-cols-4 gap-8">
<div>
<h3 className="font-bold mb-4 text-gray-900">Informações</h3>
<ul className="space-y-3">
<li>
<Link href="/about" className="text-sm text-gray-600 hover:text-primary transition-colors">
Sobre nós
</Link>
</li>
<li>
<Link href="/contact" className="text-sm text-gray-600 hover:text-primary transition-colors">
Contato
</Link>
</li>
</ul>
</div>
<div>
<h3 className="font-bold mb-4 text-gray-900">Para Candidatos</h3>
<ul className="space-y-3">
<li>
<Link href="/jobs" className="text-sm text-gray-600 hover:text-primary transition-colors">
Buscar Vagas
</Link>
</li>
<li>
<Link href="/register/candidate" className="text-sm text-gray-600 hover:text-primary transition-colors">
Criar Conta
</Link>
</li>
</ul>
</div>
<div>
<h3 className="font-bold mb-4 text-gray-900">Para Empresas</h3>
<ul className="space-y-3">
<li>
<Link href="/post-job" className="text-sm text-gray-600 hover:text-primary transition-colors">
Publicar Vaga
</Link>
</li>
</ul>
</div>
<div>
<h3 className="font-bold mb-4 text-gray-900">Redes Sociais</h3>
<div className="flex gap-3">
<a href="#" className="w-10 h-10 rounded-lg border-2 border-gray-300 hover:bg-gray-50 text-primary flex items-center justify-center transition-colors">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/>
</svg>
</a>
<a href="#" className="w-10 h-10 rounded-lg border-2 border-gray-300 hover:bg-gray-50 text-primary flex items-center justify-center transition-colors">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M9 8h-3v4h3v12h5v-12h3.642l.358-4h-4v-1.667c0-.955.192-1.333 1.115-1.333h2.885v-5h-3.808c-3.596 0-5.192 1.583-5.192 4.615v3.385z"/>
</svg>
</a>
<a href="#" className="w-10 h-10 rounded-lg border-2 border-gray-300 hover:bg-gray-50 text-primary flex items-center justify-center transition-colors">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z"/>
</svg>
</a>
<a href="#" className="w-10 h-10 rounded-lg border-2 border-gray-300 hover:bg-gray-50 text-primary flex items-center justify-center transition-colors">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/>
</svg>
</a>
<a href="#" className="w-10 h-10 rounded-lg border-2 border-gray-300 hover:bg-gray-50 text-primary flex items-center justify-center transition-colors">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z"/>
</svg>
</a>
</div>
<p className="text-muted-foreground text-sm leading-relaxed max-w-md">
{t('home.hero.subtitle')}
</p>
</div>
<div>
<h3 className="font-semibold mb-4">{t('footer.jobsByTech')}</h3>
<ul className="space-y-2 text-sm text-muted-foreground">
<li>
<Link href="/jobs?tech=python" className="hover:text-foreground transition-colors">
Python Developer
</Link>
</li>
<li>
<Link href="/jobs?tech=react" className="hover:text-foreground transition-colors">
React Developer
</Link>
</li>
<li>
<Link href="/jobs?tech=data" className="hover:text-foreground transition-colors">
Data Analyst
</Link>
</li>
<li>
<Link href="/jobs?type=remote" className="hover:text-foreground transition-colors">
{t('workMode.remote')}
</Link>
</li>
</ul>
</div>
<div>
<h3 className="font-semibold mb-4">{t('footer.company')}</h3>
<ul className="space-y-2 text-sm text-muted-foreground">
<li>
<Link href="/about" className="hover:text-foreground transition-colors">
{t('footer.about')}
</Link>
</li>
<li>
<Link href="/contact" className="hover:text-foreground transition-colors">
{t('nav.contact')}
</Link>
</li>
<li>
<Link href="/jobs" className="hover:text-foreground transition-colors">
{t('nav.jobs')}
</Link>
</li>
</ul>
</div>
<div>
<h3 className="font-semibold mb-4">{t('footer.legal')}</h3>
<ul className="space-y-2 text-sm text-muted-foreground">
<li>
<Link href="/privacy" className="hover:text-foreground transition-colors">
{t('footer.privacy')}
</Link>
</li>
<li>
<Link href="/terms" className="hover:text-foreground transition-colors">
{t('footer.terms')}
</Link>
</li>
</ul>
</div>
</div>
<div className="mt-12 pt-8 border-t border-border text-center text-sm text-muted-foreground">
<p>{t('footer.copyright', { year: currentYear })}</p>
<div className="mt-12 pt-8 border-t border-gray-200 text-center">
<p className="text-sm text-gray-600">© {currentYear} Ghorse jobs. Todos os direitos reservados.</p>
</div>
</div>
</footer>

View file

@ -17,36 +17,35 @@ export function Navbar() {
const navigationItems = [
{ href: "/jobs", label: t('nav.jobs') },
{ href: "/about", label: t('nav.about') },
{ href: "/contact", label: t('nav.contact') },
{ href: "/companies", label: t('footer.empresas') },
{ href: "/blog", label: t('footer.blog') },
]
return (
<nav className="border-b border-border bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 sticky top-0 z-50">
<nav className="border-b border-border bg-white sticky top-0 z-50 shadow-sm">
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex h-16 items-center justify-between">
{/* Logo */}
<Link href="/" className="flex items-center gap-3 hover:opacity-80 transition-opacity">
<Image src="/logohorse.png" alt="GoHorse Jobs" width={48} height={48} />
<span className="text-xl font-bold tracking-tight">GoHorse Jobs</span>
<Link href="/" className="flex items-center gap-2 hover:opacity-80 transition-opacity">
<Image src="/logohorse1.png" alt="GoHorse Jobs" width={48} height={48} />
<span className="text-lg font-normal text-[#FF6200]">Gohorse <span className="font-semibold">Jobs</span></span>
</Link>
{/* Desktop Navigation */}
<div className="hidden md:flex items-center gap-6">
{/* Desktop Navigation - moved to right side */}
<div className="hidden md:flex items-center gap-8 ml-auto mr-8">
{navigationItems.map((item) => (
<Link
key={item.href}
href={item.href}
className="text-sm text-muted-foreground hover:text-foreground transition-colors relative group"
className="text-sm font-medium text-foreground hover:text-primary transition-colors"
>
{item.label}
<span className="absolute -bottom-1 left-0 w-0 h-0.5 bg-primary transition-all group-hover:w-full" />
</Link>
))}
</div>
{/* Desktop Auth Buttons + Language Switcher */}
<div className="hidden md:flex items-center gap-4">
<div className="hidden md:flex items-center gap-3">
<LanguageSwitcher />
{user ? (
<Link href="/dashboard">
@ -58,15 +57,13 @@ export function Navbar() {
) : (
<>
<Link href="/login">
<Button variant="ghost" className="gap-2">
<LogIn className="w-4 h-4" />
{t('nav.login')}
<Button variant="outline" className="gap-2 text-primary border-primary hover:bg-primary hover:text-white">
{t('footer.login')}
</Button>
</Link>
<Link href="/register">
<Button className="gap-2">
<User className="w-4 h-4" />
{t('nav.register')}
<Button variant="ghost" size="icon" className="text-primary">
<Menu className="w-5 h-5" />
</Button>
</Link>
</>
@ -83,7 +80,7 @@ export function Navbar() {
<SheetContent side="right" className="w-80">
<div className="flex flex-col gap-4 mt-6">
<div className="flex items-center gap-2 pb-4 border-b justify-center">
<Image src="/logohorse.png" alt="GoHorse Jobs" width={48} height={48} />
<Image src="/logohorse1.png" alt="GoHorse Jobs" width={48} height={48} />
<span className="text-lg font-bold">GoHorse Jobs</span>
</div>

View file

@ -1195,5 +1195,50 @@
"createFailed": "Failed to create ticket",
"subjectRequired": "Subject is required"
}
},
"home": {
"hero": {
"title": "Find Your Dream IT Job.",
"titleLine2": "",
"subtitle": "We connect you with the best companies and tech opportunities.",
"cta": "Search Jobs"
},
"search": {
"placeholder": "Enter keywords",
"filter": "Filter Jobs",
"contractType": "Contract Type",
"workMode": "Work Mode",
"location": "City and State",
"salary": "Salary Expectation",
"select": "Select",
"pj": "Contractor",
"clt": "Full-time",
"freelancer": "Freelancer",
"homeOffice": "Remote",
"presencial": "On-site",
"hybrid": "Hybrid"
},
"featuredJobs": {
"title": "Featured Jobs",
"yesterday": "Yesterday",
"apply": "Apply now"
},
"moreJobs": {
"title": "More Jobs",
"viewAll": "View All Jobs"
},
"cta": {
"badge": "Social Networks",
"title": "Thousands of opportunities await you.",
"subtitle": "Connect positions, talents, and job actions.",
"button": "Sign up"
}
},
"footer": {
"vagas": "Jobs",
"empresas": "Companies",
"blog": "Blog",
"login": "Login",
"copyright": "Ghorse jobs. All rights reserved."
}
}

View file

@ -1196,5 +1196,50 @@
"createFailed": "Error al crear ticket",
"subjectRequired": "El asunto es requerido"
}
},
"home": {
"hero": {
"title": "Encuentra el Trabajo de TI",
"titleLine2": "de Tus Sueños.",
"subtitle": "Te conectamos con las mejores empresas y tecnologías.",
"cta": "Buscar Empleos"
},
"search": {
"placeholder": "Ingresa palabras clave",
"filter": "Filtrar Empleos",
"contractType": "Tipo de contratación",
"workMode": "Régimen de Trabajo",
"location": "Ciudad y estado",
"salary": "Expectativa salarial",
"select": "Seleccione",
"pj": "Contratista",
"clt": "Tiempo completo",
"freelancer": "Freelancer",
"homeOffice": "Remoto",
"presencial": "Presencial",
"hybrid": "Híbrido"
},
"featuredJobs": {
"title": "Empleos Destacados",
"yesterday": "Ayer",
"apply": "Aplicar ahora"
},
"moreJobs": {
"title": "Más Empleos",
"viewAll": "Ver Todos los Empleos"
},
"cta": {
"badge": "Redes Sociales",
"title": "Miles de oportunidades te esperan.",
"subtitle": "Conecta posiciones, talentos, acciones de empleos.",
"button": "Regístrate"
}
},
"footer": {
"vagas": "Empleos",
"empresas": "Empresas",
"blog": "Blog",
"login": "Iniciar sesión",
"copyright": "Ghorse jobs. Todos los derechos reservados."
}
}

View file

@ -1223,5 +1223,50 @@
"createFailed": "Erro ao criar ticket",
"subjectRequired": "O assunto é obrigatório"
}
},
"home": {
"hero": {
"title": "Encontre a Vaga de TI.",
"titleLine2": "dos Seus Sonhos.",
"subtitle": "Conectamos você com as melhores empresas e techs.",
"cta": "Buscar Vagas"
},
"search": {
"placeholder": "Digite as palavras-chave",
"filter": "Filtrar Vagas",
"contractType": "Tipo de contratação",
"workMode": "Regime de Trabalho",
"location": "Cidade e estado",
"salary": "Pretensão salarial",
"select": "Selecione",
"pj": "PJ",
"clt": "CLT",
"freelancer": "Freelancer",
"homeOffice": "Home-Office",
"presencial": "Presencial",
"hybrid": "Híbrido"
},
"featuredJobs": {
"title": "Vagas em Destaque",
"yesterday": "Ontem",
"apply": "Aplicar agora"
},
"moreJobs": {
"title": "Mais Vagas",
"viewAll": "Ver Todas Vagas"
},
"cta": {
"badge": "Redes Sociais",
"title": "Milhares de oportunidades esperam você.",
"subtitle": "Conecte cargos, talentos, tomada de ações de vagas.",
"button": "Cadastre-se"
}
},
"footer": {
"vagas": "Vagas",
"empresas": "Empresas",
"blog": "Blog",
"login": "Login",
"copyright": "Ghorse jobs. Todos os direitos reservados."
}
}