Skip to content

Commit c7ce4c7

Browse files
Merge remote-tracking branch 'origin/dev' into in-house-filter-sort/Jordan
2 parents cb447ae + ab76c7b commit c7ce4c7

26 files changed

Lines changed: 1597 additions & 404 deletions

File tree

‎apps/codebility/app/(marketing)/codevs/_components/CodevsProfiles.tsx‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ export const revalidate = 0;
1515

1616
export default async function CodevsProfiles() {
1717
const [{ data: allCodevs, error }] = await Promise.all([
18+
// Accepted developers are identified by application_status, not by role_id.
19+
// The accept flow sets application_status "passed" while role_id tracks the
20+
// Intern → Codev → Mentor progression, so filtering on role_id 10 hid every
21+
// newly accepted developer. /profiles already uses this same filter.
22+
getCodevs({ filters: { application_status: "passed" } }),
1823
getCodevs({ filters: { application_status: "passed" } }), // show only accepted Codevs
1924
]);
2025

‎apps/codebility/app/(marketing)/hire-a-codev/_components/HiringProcess.tsx‎

Lines changed: 76 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"use client";
22

33
import { useEffect, useRef } from "react";
4+
import { motion } from "framer-motion";
5+
import { fadeInOutDownToUp } from "@/components/FramerAnimation/Framer";
46
import { SectionWrapper } from "@/components/shared/home";
57
import { User, MessageSquare, UserCheck, Handshake } from "lucide-react";
68

@@ -248,30 +250,81 @@ const HiringProcess = () => {
248250
})}
249251
</div>
250252

251-
{/* ── Call to Action (unchanged from original) ── */}
252-
<div className="mt-16 text-center">
253-
<h3 className="mb-4 text-2xl font-semibold text-white">
254-
Ready to Build Your Dream Team?
255-
</h3>
256-
<p className="mb-6 text-gray-300 max-w-2xl mx-auto">
257-
Start your hiring journey today. Get matched with skilled developers
258-
who can bring your vision to life.
259-
</p>
260-
<div className="flex flex-col gap-4 items-center sm:flex-row sm:justify-center">
261-
<a
262-
href="/contact"
263-
className="inline-flex items-center justify-center rounded-full bg-customViolet-100 px-8 py-3 text-sm font-medium text-white transition-all hover:bg-customViolet-100/90"
264-
>
265-
Start Hiring Process
266-
</a>
267-
<a
268-
href="/bookacall"
269-
className="inline-flex items-center justify-center rounded-full border border-customTeal/20 bg-customTeal/10 px-8 py-3 text-sm font-medium text-customTeal transition-all hover:bg-customTeal/20 hover:border-customTeal/40"
270-
>
271-
Schedule a Call
272-
</a>
253+
{/* Call to Action */}
254+
<motion.div
255+
variants={fadeInOutDownToUp}
256+
initial="hidden"
257+
whileInView="visible"
258+
viewport={{ once: false, amount: 0.3 }}
259+
className="mt-16 px-4 sm:px-6 lg:px-0"
260+
>
261+
<div className="relative mx-auto max-w-5xl overflow-hidden rounded-2xl p-6 sm:p-8 lg:p-10 backdrop-blur-sm transition-all duration-300">
262+
263+
{/* Ambient animated glow background */}
264+
<div className="absolute inset-0 -z-10 overflow-hidden rounded-2xl">
265+
<motion.div
266+
className="pointer-events-none absolute inset-0"
267+
animate={{
268+
background: [
269+
"radial-gradient(circle at 30% 50%, rgba(45,212,191,0.15), transparent 60%)",
270+
"radial-gradient(circle at 70% 50%, rgba(124,58,237,0.15), transparent 60%)",
271+
"radial-gradient(circle at 30% 50%, rgba(45,212,191,0.15), transparent 60%)",
272+
],
273+
}}
274+
transition={{ duration: 8, repeat: Infinity, ease: "easeInOut" }}
275+
/>
276+
</div>
277+
278+
<div className="relative flex flex-col gap-10 text-center md:flex-row md:items-center md:justify-between md:gap-8 md:text-left">
279+
280+
{/* Column 1: Text */}
281+
<motion.div
282+
initial={{ opacity: 0, y: 20 }}
283+
whileInView={{ opacity: 1, y: 0 }}
284+
viewport={{ once: false, amount: 0.3 }}
285+
transition={{ duration: 0.6, ease: "easeOut" }}
286+
className="flex flex-col gap-4 min-w-0"
287+
>
288+
<h3 className="text-3xl sm:text-4xl lg:text-4xl font-bold text-white leading-tight">
289+
Ready to Build Your Dream Team?
290+
</h3>
291+
<p className="text-base sm:text-xs text-gray-300">
292+
Start your hiring journey today. Get matched with skilled developers who can bring your vision to life.
293+
</p>
294+
</motion.div>
295+
296+
{/* Column 2: Buttons */}
297+
<motion.div
298+
initial={{ opacity: 0, y: 20 }}
299+
whileInView={{ opacity: 1, y: 0 }}
300+
viewport={{ once: false, amount: 0.3 }}
301+
transition={{ duration: 0.6, ease: "easeOut", delay: 0.2 }}
302+
className="flex flex-col sm:flex-row gap-3 items-center justify-center md:justify-end shrink-0 w-full md:w-auto"
303+
>
304+
<motion.a
305+
initial={{ opacity: 0, y: 10 }}
306+
whileInView={{ opacity: 1, y: 0 }}
307+
viewport={{ once: false, amount: 0.3 }}
308+
transition={{ duration: 0.5, delay: 0.3 }}
309+
href="/contact"
310+
className="inline-flex w-full sm:w-auto items-center justify-center rounded-full bg-[#7C3AED] px-8 py-2.5 text-sm sm:text-base font-medium text-white transition-all hover:bg-[#7C3AED]/90"
311+
>
312+
Start Hiring
313+
</motion.a>
314+
<motion.a
315+
initial={{ opacity: 0, y: 10 }}
316+
whileInView={{ opacity: 1, y: 0 }}
317+
viewport={{ once: false, amount: 0.3 }}
318+
transition={{ duration: 0.5, delay: 0.45 }}
319+
href="/bookacall"
320+
className="inline-flex w-full sm:w-auto items-center justify-center rounded-full border border-customTeal/20 bg-transparent px-8 py-2.5 text-sm sm:text-base font-medium text-customTeal transition-all hover:bg-customTeal/20 hover:border-customTeal/40"
321+
>
322+
Schedule a Call
323+
</motion.a>
324+
</motion.div>
325+
</div>
273326
</div>
274-
</div>
327+
</motion.div>
275328
</div>
276329

277330
{/* Background decoration (unchanged from original) */}

‎apps/codebility/app/(marketing)/profiles/_components/CodevCard.tsx‎

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { useMemo, useState } from "react";
66
import Image from "next/image";
77
import Link from "next/link";
88
import CodevBadge from "@/components/CodevBadge";
9+
import { item } from "@/components/FramerAnimation/Framer";
910
import {
1011
AnimatePresence,
1112
motion,
@@ -116,19 +117,21 @@ const CodevCard = ({ codev, color }: Props) => {
116117
}, [codev.level, codev.codev_points]);
117118

118119
return (
119-
<div
120-
className="h-64"
120+
<motion.div
121+
variants={item}
122+
transition={{ duration: 0.4, ease: "easeOut" }}
123+
className="h-80"
121124
onMouseEnter={() => setHovered(true)}
122125
onMouseLeave={() => setHovered(false)}
123126
>
124-
<div
127+
<div
125128
onClick={() => window.location.href = `https://www.codebility.tech/profiles/${codev.id}`}
126-
className="group relative flex h-full w-full flex-col items-center justify-between rounded-lg border border-white/20 bg-white/10 p-4 shadow-2xl backdrop-blur-md transition-all duration-300 cursor-pointer hover:bg-white/20 hover:scale-[1.02] dark:border-white/10 dark:bg-white/5 dark:hover:bg-white/10"
129+
className="group relative flex h-full w-full flex-col items-center justify-between rounded-lg border border-white/20 bg-white/10 p-6 shadow-2xl backdrop-blur-md transition-all duration-300 ease-out cursor-pointer hover:bg-white/20 hover:scale-[1.02] dark:border-white/10 dark:bg-white/5 dark:hover:bg-white/10"
127130
>
128131
{/* Background decoration */}
129132
<div className="from-customBlue-50/30 dark:from-customBlue-950/10 absolute inset-0 bg-gradient-to-br to-purple-50/30 opacity-0 transition-opacity duration-300 group-hover:opacity-100 dark:to-purple-950/10" />
130133
<div className="absolute -right-4 -top-4 h-32 w-32 rounded-full bg-gradient-to-br from-yellow-400/10 to-orange-400/10 opacity-0 blur-2xl transition-opacity duration-500 group-hover:opacity-100" />
131-
134+
132135
<div className="grid w-full grid-cols-4 gap-2">
133136
<div className="col-span-1" />
134137
<div className="relative col-span-2 flex justify-center">
@@ -141,9 +144,9 @@ const CodevCard = ({ codev, color }: Props) => {
141144
? codev.image_url
142145
: "/assets/svgs/icon-codebility-black.svg"
143146
}
144-
width={70}
145-
height={70}
146-
className={`${color} h-[70px] w-[70px] rounded-full bg-cover object-cover p-0.5`}
147+
width={96}
148+
height={96}
149+
className={`${color} h-24 w-24 rounded-full bg-cover object-cover p-0.5 transition-transform duration-300 group-hover:scale-105`}
147150
onMouseMove={handleMouseMove}
148151
onError={(e) => {
149152
console.error(
@@ -186,7 +189,7 @@ const CodevCard = ({ codev, color }: Props) => {
186189
<div className="absolute bottom-[1px] right-[1px]">
187190
<p
188191
className={cn(
189-
"rounded-full border-2 p-2 text-[9px]",
192+
"rounded-full border-2 p-2.5 text-[9px]",
190193
codev.availability_status
191194
? "border-green-600 bg-green-500"
192195
: "border-red-600 bg-red-500",
@@ -202,9 +205,9 @@ const CodevCard = ({ codev, color }: Props) => {
202205
<Button
203206
variant="outline"
204207
size="icon"
205-
className="h-8 w-8 rounded-full border-white/30 bg-white/20 backdrop-blur-sm transition-all duration-300 hover:bg-white/30 dark:border-white/20 dark:bg-white/10 dark:hover:bg-white/20"
208+
className="relative z-10 h-9 w-9 rounded-full border-white/30 bg-white/20 backdrop-blur-sm transition-all duration-300 hover:bg-white/30 active:scale-95 dark:border-white/20 dark:bg-white/10 dark:hover:bg-white/20"
206209
>
207-
<BookOpenIcon className="h-3.5 w-3.5" />
210+
<BookOpenIcon className="h-4 w-4" />
208211
</Button>
209212
</Link>
210213
</TooltipTrigger>
@@ -217,29 +220,31 @@ const CodevCard = ({ codev, color }: Props) => {
217220
</div>
218221
<div className="flex flex-col items-center gap-0.5">
219222
<div className="flex flex-col gap-1 text-center">
220-
<p className="md:text-md relative z-10 text-sm capitalize text-white dark:text-white lg:text-base">
223+
<p className="relative z-10 text-base capitalize text-white dark:text-white lg:text-lg">
221224
{codev.first_name} {codev.last_name}
222225
</p>
223226
{codev.display_position ? (
224-
<p className="relative z-10 text-sm text-gray-200 dark:text-gray-300">
227+
<p className="relative z-10 text-sm text-gray-200 dark:text-gray-300 lg:text-base">
225228
{codev.display_position}
226229
</p>
227230
) : (
228231
<div className="relative z-10 text-sm lg:text-base">&nbsp;</div>
229232
)}
230233
</div>
231234
</div>
232-
<div className="flex min-h-[20px] items-center justify-center">
235+
<div className="flex min-h-[24px] items-center justify-center">
233236
{filteredLevel && Object.keys(filteredLevel).length > 0 ? (
234237
<CodevBadge
235238
level={filteredLevel}
236239
className="transition-transform group-hover:scale-100"
237240
/>
238241
) : null}
239242
</div>
240-
<CodevHireCodevButton codevId={codev.id} />
243+
<div className="relative z-10">
244+
<CodevHireCodevButton codevId={codev.id} />
245+
</div>
241246
</div>
242-
</div>
247+
</motion.div>
243248
);
244249
};
245250

‎apps/codebility/app/(marketing)/profiles/_components/CodevContainer.tsx‎

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,27 @@ import { motion } from "framer-motion";
77

88
export default function CodevContainer() {
99
return (
10-
<div className="relative flex flex-col gap-6">
11-
<motion.div
12-
variants={fadeInOutDownToUp}
13-
initial="hidden"
14-
whileInView="visible"
15-
className="relative z-10 mx-auto"
16-
>
17-
<H2 className="text-white drop-shadow-lg">Codevs</H2>
18-
</motion.div>
19-
<motion.div
20-
variants={fadeInOutDownToUp}
21-
initial="hidden"
22-
whileInView="visible"
23-
className="relative z-10 mx-auto max-w-[700px] rounded-2xl border border-white/10 bg-white/5 p-6 text-center shadow-xl backdrop-blur-sm"
24-
>
25-
<div className="mb-4 text-white">
26-
<Heading3>Meet Our Skilled Team Network</Heading3>
27-
</div>
28-
<div className="text-gray-200">
29-
<IntroText>
30-
Discover our carefully vetted professionals, ready to join your team
31-
and deliver exceptional results. Every member brings proven expertise,
32-
strong communication, and a passion for getting things done right.
33-
</IntroText>
34-
</div>
35-
</motion.div>
36-
</div>
10+
<div className="relative flex flex-col gap-6">
11+
<motion.div
12+
variants={fadeInOutDownToUp}
13+
initial="hidden"
14+
whileInView="visible"
15+
viewport={{ once: false, amount: 0.3 }}
16+
className="relative z-10 mx-auto"
17+
>
18+
<H2 className="text-white drop-shadow-lg">Our Skilled Network</H2>
19+
</motion.div>
20+
<motion.div
21+
variants={fadeInOutDownToUp}
22+
initial="hidden"
23+
whileInView="visible"
24+
viewport={{ once: false, amount: 0.3 }}
25+
className="relative z-10 mx-auto max-w-auto px-6 py-2 text-center shadow-xl backdrop-blur-sm"
26+
>
27+
<p className="text-gray-200 text-2xl leading-relaxed">
28+
Discover our carefully vetted professionals, ready to join your team and deliver exceptional results. Every member brings proven expertise, strong communication, and a passion for getting things done right.
29+
</p>
30+
</motion.div>
31+
</div>
3732
);
3833
}

‎apps/codebility/app/(marketing)/profiles/_components/CodevHireCodevButton.tsx‎

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import { useModal } from "@/hooks/use-modal";
44

5-
import { cn } from "@codevs/ui";
65
import { Button } from "@codevs/ui/button";
76

87
interface CodevHireCodevButtonProps {
@@ -13,20 +12,19 @@ export function CodevHireCodevButton({ codevId }: CodevHireCodevButtonProps) {
1312
const { onOpen } = useModal();
1413

1514
return (
16-
<>
17-
<Button
18-
variant="purple"
19-
size="sm"
20-
className="h-[1.75rem] rounded-md bg-purple-600 px-3 py-0.5 text-xs opacity-100"
21-
onClick={(e) => {
22-
e.stopPropagation();
23-
onOpen("marketingCodevHireCodevModal", codevId);
24-
}}
25-
onMouseEnter={(e) => e.stopPropagation()}
26-
onMouseLeave={(e) => e.stopPropagation()}
27-
>
28-
Hire Me
29-
</Button>
30-
</>
15+
<Button
16+
variant="outline"
17+
size="sm"
18+
className="relative z-10h-[1.75rem] rounded-full border !border-purple-500 !bg-transparent px-4 py-0.5 text-xs font-medium !text-purple-400 transition-all duration-300 hover:!bg-purple-500/10 hover:!text-purple-300"
19+
onClick={(e) => {
20+
e.stopPropagation();
21+
// onOpen("marketingCodevHireCodevModal", codevId);
22+
window.location.href = `https://www.codebility.tech/profiles/${codevId}`
23+
}}
24+
onMouseEnter={(e) => e.stopPropagation()}
25+
onMouseLeave={(e) => e.stopPropagation()}
26+
>
27+
Learn More
28+
</Button>
3129
);
32-
}
30+
}

0 commit comments

Comments
 (0)