Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,19 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/assets/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preload" href="/portfolio.json" as="fetch" type="application/json" crossorigin="anonymous" />
<link rel="preload" href="/assets/favicon.svg" as="image" crossorigin="anonymous" />
<link
rel="preload"
href="/portfolio.json"
as="fetch"
type="application/json"
crossorigin="anonymous"
/>
<link
rel="preload"
href="/assets/favicon.svg"
as="image"
crossorigin="anonymous"
/>
<title>Developer Portfolio</title>
<meta content="Developer Portfolio" property="og:title" />
<meta
Expand Down
134 changes: 77 additions & 57 deletions src/components/portfolio/cv.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ import { Chip } from "@heroui/chip";

import { usePortfolioData } from "@/hooks/usePortfolioData";
import { Education, Experience } from "@/types";
import {
HoverEffect,
getHoverEffectClasses,
getTextHoverEffectClasses,
} from "@/components/ui/hover-effect";

interface CVProps {
refreshTrigger?: number;
Expand Down Expand Up @@ -60,11 +65,13 @@ export function CV({ refreshTrigger }: CVProps) {
{isLeft ? (
<>
<div className="w-1/2 pr-8">
<Card className="shadow-lg hover:shadow-xl transition-shadow duration-300">
<Card className={`shadow-lg ${getHoverEffectClasses()}`}>
<CardBody className="p-6">
<div className="space-y-3">
<div className="flex flex-col gap-2">
<h3 className="text-lg font-semibold text-foreground">
<h3
className={`text-lg font-semibold text-foreground ${getTextHoverEffectClasses()}`}
>
{item.type === "experience"
? item.position
: item.degree}
Expand All @@ -89,15 +96,16 @@ export function CV({ refreshTrigger }: CVProps) {
<div className="flex flex-wrap gap-1 mt-3">
{item.technologies.map(
(tech: string, techIndex: number) => (
<Chip
key={techIndex}
className="text-xs"
color="secondary"
size="sm"
variant="bordered"
>
{tech}
</Chip>
<HoverEffect key={techIndex}>
<Chip
className="text-xs"
color="secondary"
size="sm"
variant="bordered"
>
{tech}
</Chip>
</HoverEffect>
),
)}
</div>
Expand All @@ -107,34 +115,40 @@ export function CV({ refreshTrigger }: CVProps) {
</Card>
</div>
<div className="w-1/2 pl-8 flex justify-start items-start pt-4">
<Chip
className="font-medium"
color="primary"
size="md"
variant="flat"
>
{item.duration}
</Chip>
<HoverEffect inheritChildStyle>
<Chip
className="font-medium"
color="primary"
size="md"
variant="flat"
>
{item.duration}
</Chip>
</HoverEffect>
</div>
</>
) : (
<>
<div className="w-1/2 pr-8 flex justify-end items-start pt-4">
<Chip
className="font-medium"
color="primary"
size="md"
variant="flat"
>
{item.duration}
</Chip>
<HoverEffect inheritChildStyle>
<Chip
className="font-medium"
color="primary"
size="md"
variant="flat"
>
{item.duration}
</Chip>
</HoverEffect>
</div>
<div className="w-1/2 pl-8">
<Card className="shadow-lg hover:shadow-xl transition-shadow duration-300">
<Card className={`shadow-lg ${getHoverEffectClasses()}`}>
<CardBody className="p-6">
<div className="space-y-3">
<div className="flex flex-col gap-2">
<h3 className="text-lg font-semibold text-foreground">
<h3
className={`text-lg font-semibold text-foreground ${getTextHoverEffectClasses()}`}
>
{item.type === "experience"
? item.position
: item.degree}
Expand All @@ -159,15 +173,16 @@ export function CV({ refreshTrigger }: CVProps) {
<div className="flex flex-wrap gap-1 mt-3">
{item.technologies.map(
(tech: string, techIndex: number) => (
<Chip
key={techIndex}
className="text-xs"
color="secondary"
size="sm"
variant="bordered"
>
{tech}
</Chip>
<HoverEffect key={techIndex}>
<Chip
className="text-xs"
color="secondary"
size="sm"
variant="bordered"
>
{tech}
</Chip>
</HoverEffect>
),
)}
</div>
Expand All @@ -193,21 +208,25 @@ export function CV({ refreshTrigger }: CVProps) {
{/* Content */}
<div className="flex-1">
<div className="mb-3">
<Chip
className="font-medium mb-3"
color="primary"
size="sm"
variant="flat"
>
{item.duration}
</Chip>
<HoverEffect inheritChildStyle>
<Chip
className="font-medium mb-3"
color="primary"
size="sm"
variant="flat"
>
{item.duration}
</Chip>
</HoverEffect>
</div>

<Card className="shadow-lg">
<Card className={`shadow-lg ${getHoverEffectClasses()}`}>
<CardBody className="p-4">
<div className="space-y-3">
<div className="flex flex-col gap-2">
<h3 className="text-lg font-semibold text-foreground">
<h3
className={`text-lg font-semibold text-foreground ${getTextHoverEffectClasses()}`}
>
{item.type === "experience" ? item.position : item.degree}
</h3>
<h4 className="text-md font-medium text-primary">
Expand All @@ -228,15 +247,16 @@ export function CV({ refreshTrigger }: CVProps) {
<div className="flex flex-wrap gap-1 mt-3">
{item.technologies.map(
(tech: string, techIndex: number) => (
<Chip
key={techIndex}
className="text-xs"
color="secondary"
size="sm"
variant="bordered"
>
{tech}
</Chip>
<HoverEffect key={techIndex}>
<Chip
className="text-xs"
color="secondary"
size="sm"
variant="bordered"
>
{tech}
</Chip>
</HoverEffect>
),
)}
</div>
Expand Down
11 changes: 8 additions & 3 deletions src/components/portfolio/github-integration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ import { Button } from "@heroui/button";
import { GithubIcon } from "@/components/icons";
import { usePortfolioData } from "@/hooks/usePortfolioData";
import { getLanguageColor } from "@/lib/language-colors";
import {
getHoverEffectClasses,
getTextHoverEffectClasses,
} from "@/components/ui/hover-effect";

const REPO_PER_PAGE = 4;

Expand Down Expand Up @@ -222,10 +226,9 @@ export function GithubIntegration({ refreshTrigger }: GithubIntegrationProps) {
<Card
key={repo.id}
isExternal
isHoverable
isPressable
as={Link}
className="group transition-all duration-300 hover:scale-[1.02] hover:shadow-lg border border-default-200/50 hover:border-primary/30 repo-card-enter"
className={`${getHoverEffectClasses()} border border-default-200/50 repo-card-enter`}
href={repo.html_url}
style={{
animationDelay: `${index * 100}ms`,
Expand All @@ -234,7 +237,9 @@ export function GithubIntegration({ refreshTrigger }: GithubIntegrationProps) {
<CardBody className="p-4">
<div className="flex items-start justify-between mb-3">
<div className="flex-1">
<h3 className="font-semibold text-lg text-foreground group-hover:text-primary transition-colors duration-200">
<h3
className={`font-semibold text-lg text-foreground ${getTextHoverEffectClasses()}`}
>
{repo.name}
</h3>
<p className="text-sm text-default-700 mt-1 line-clamp-2">
Expand Down
22 changes: 15 additions & 7 deletions src/components/portfolio/personal-info.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { Tooltip } from "@heroui/tooltip";

import favicon from "../../../assets/favicon.svg";

import { HoverEffect } from "@/components/ui/hover-effect";
import {
DiscordIcon,
GithubIcon,
Expand Down Expand Up @@ -66,12 +67,20 @@ export function PersonalInfo({ refreshTrigger }: PersonalInfoProps) {
<h1 className="text-2xl font-bold">{portfolioData.name}</h1>
<p className="text-default-500">{portfolioData.title}</p>
<div className="flex gap-2 mt-2">
<Chip color="primary" size="sm">
{portfolioData.location}
</Chip>
<Chip color="secondary" size="sm">
{portfolioData.email}
</Chip>
<HoverEffect inheritChildStyle>
<Chip color="primary" size="sm">
{portfolioData.location}
</Chip>
</HoverEffect>
<HoverEffect
inheritChildStyle
href={`mailto:${portfolioData.email}`}
isClickable={true}
>
<Chip color="secondary" size="sm">
{portfolioData.email}
</Chip>
</HoverEffect>
</div>
</div>
</div>
Expand All @@ -80,7 +89,6 @@ export function PersonalInfo({ refreshTrigger }: PersonalInfoProps) {
closeDelay={125}
color="warning"
content="This user is a contributor to the WA-DP GitHub project"
showArrow={true}
>
<Button
className="text-xs font-bold text-yellow-600 dark:text-yellow-500"
Expand Down
10 changes: 8 additions & 2 deletions src/components/portfolio/skills.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import { Chip } from "@heroui/chip";

import { usePortfolioData } from "@/hooks/usePortfolioData";
import { SkillsIcon } from "@/components/icons.tsx";
import {
getHoverEffectClasses,
getTextHoverEffectClasses,
} from "@/components/ui/hover-effect";

interface SkillsProps {
refreshTrigger?: number;
Expand Down Expand Up @@ -46,7 +50,7 @@ function SkillCard({ skill, index }: SkillCardProps) {
return (
<Card
isHoverable
className="group transition-all duration-300 hover:scale-[1.02] hover:shadow-lg border border-default-200/50 hover:border-primary/30"
className={`${getHoverEffectClasses()} border border-default-200/50`}
>
<CardBody className="p-4">
<div className="flex items-center justify-between mb-3">
Expand All @@ -57,7 +61,9 @@ function SkillCard({ skill, index }: SkillCardProps) {
backgroundColor: getSkillColor(index),
}}
/>
<h3 className="font-semibold text-lg text-foreground group-hover:text-primary transition-colors duration-200">
<h3
className={`font-semibold text-lg text-foreground ${getTextHoverEffectClasses()}`}
>
{skill.name}
</h3>
</div>
Expand Down
Loading
Loading