Skip to content
Open
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
32 changes: 0 additions & 32 deletions src/components/team/Avatar.svelte

This file was deleted.

17 changes: 17 additions & 0 deletions src/components/team/CommitDot.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<script lang="ts">
let { active = false } = $props<{
active?: boolean;
}>();
</script>

<div class="relative">
<div
class="relative inline-flex items-center justify-center rounded-full transition-all duration-200 size-2.5 bg-ecsess-500 {active
? 'bg-ecsess-200'
: 'bg-ecsess-500'}"
>
{#if active}
<div class="relative inline-flex items-center justify-center bg-ecsess-100 size-2.5 animate-ping rounded-full"></div>
{/if}
</div>
</div>
38 changes: 38 additions & 0 deletions src/components/team/ContribTimeline.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<script lang="ts">
import type { DevTeam } from '$lib/schemas';
import YearLine from './YearLine.svelte';
import DevCard from './DevCard.svelte';

let {
year,
members,
active = false
} = $props<{
year: string;
members: DevTeam[];
active?: boolean;
}>();
</script>

<div class="relative w-full">
<!-- Branch Line with Year -->
<div class="mb-6">
<YearLine {year} {active} />
</div>

<!-- Members Grid -->
<div class="ml-8 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3">
{#each members as member}
<DevCard
name={member.name}
role={member.role}
year={member.yearProgram}
src={member.image}
funFact={member.funFact}
github={member.github}
email={member.email}
{active}
/>
{/each}
</div>
</div>
126 changes: 126 additions & 0 deletions src/components/team/DevCard.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<script lang="ts">
import { Github, Mail } from '@lucide/svelte';

let {
name,
role,
year,
src,
funFact,
github,
email,
active = false
} = $props<{
name: string;
role: string;
year: string;
src: string;
funFact: string;
github: string;
email: string;
active?: boolean;
}>();

// Extract GitHub username from URL and construct avatar URL
let githubAvatar = $derived.by(() => {
if (!github) return src;
try {
const url = new URL(github);
const username = url.pathname.split('/').filter(Boolean)[0];
return username ? `https://github.com/${username}.png?size=200` : src;
} catch {
return src;
}
});
</script>

<div class="fadeup group relative flex flex-col">
<!-- Commit Card -->
<div
class="relative w-full overflow-hidden rounded-xl transition-all ease-linear duration-100 hover:scale-101 hover:shadow-ecsess-black/50 hover:shadow-md {active
? 'bg-ecsess-800 shadow-ecsess-black shadow-sm'
: 'bg-ecsess-900 shadow-ecsess-black'}"
>
<!-- Header -->
<div class="px-6 pt-5 pb-3">
<div class="flex flex-col items-center gap-2.5 text-center">
<img src={githubAvatar} alt={name} class="size-20 shrink-0 rounded-full object-cover" />
<div class="w-full">
<h3 class="text-ecsess-100 text-lg font-semibold">
{name}
</h3>
<p class="text-ecsess-400 text-base">{role}</p>
</div>
</div>
</div>

<!-- Body -->
<div class="space-y-3 px-6 pb-5">
<!-- Year Badge -->
<div class="flex items-center justify-center gap-2">
<span
class="rounded-full px-4 py-1.5 text-base font-medium {active
? 'bg-ecsess-900 text-ecsess-300'
: 'bg-ecsess-800 text-ecsess-400'}"
>
{year}
</span>
</div>

<!-- Fun Fact / Commit Message -->
<div class="min-h-[60px]">
<p class="text-ecsess-300 text-sm leading-relaxed italic">
{funFact || ``}
</p>
</div>

<!-- Actions -->
<div class="flex gap-3 pt-1">
{#if github}
<a
href={github}
target="_blank"
class="items-center justify-center gap-2 rounded-lg px-4 py-2.5 text-base font-medium transition-colors {active
? 'bg-ecsess-900 text-ecsess-300 hover:bg-ecsess-950'
: 'bg-ecsess-800 text-ecsess-400 hover:bg-ecsess-700'} {active && email
? 'flex flex-1'
: 'flex w-full'}"
>
<Github class="size-4.5" />
GitHub
</a>
{/if}
{#if email && active}
<a
href="mailto:{email}"
class="flex flex-1 items-center justify-center gap-2 rounded-lg px-4 py-2.5 text-base font-medium transition-colors {active
? 'bg-ecsess-900 text-ecsess-300 hover:bg-ecsess-950'
: 'bg-ecsess-800 text-ecsess-400 hover:bg-ecsess-700'}"
>
<Mail class="size-4.5" />
Email
</a>
{/if}
</div>
</div>
</div>
</div>

<style>
.fadeup {
animation: fadeUp both;
animation-timeline: view();
animation-range: entry 20% cover 35%;
}

@keyframes fadeUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>
63 changes: 0 additions & 63 deletions src/components/team/PastCont.svelte

This file was deleted.

Loading