Skip to content

Commit 4478d9b

Browse files
committed
fixed member cards
1 parent 4a6b01b commit 4478d9b

File tree

6 files changed

+78
-3
lines changed

6 files changed

+78
-3
lines changed

apps/blog/src/routes/+error.svelte

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import { animate } from '@a11y.cool/utils';
33
import { Warning } from 'phosphor-svelte';
4+
import { resolve } from '$app/paths';
45
56
let { errors } = $props<{ errors?: Error }>();
67
@@ -45,7 +46,7 @@
4546
<!-- Navigation back to home -->
4647
<div class="text-center">
4748
<a
48-
href="/"
49+
href={resolve('/')}
4950
class="inline-flex items-center px-6 py-3 bg-foreground text-background rounded-lg hover:bg-foreground/90 transition-colors focus:outline-none focus:ring-2 focus:ring-foreground focus:ring-offset-2"
5051
>
5152
Go back home

apps/blog/src/routes/about/+page.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { Card } from '@a11y.cool/ui';
2+
import { MemberCard } from '@a11y.cool/ui';
33
import { animate } from '@a11y.cool/utils';
44
import type { PageData } from './$types';
55
import { PersonSimpleCircle } from 'phosphor-svelte';
@@ -43,7 +43,7 @@
4343
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 w-full">
4444
{#each about.members as member, index (member.name)}
4545
<div use:animate={{ delay: 300 + index * 100 }}>
46-
<Card title={member.name} description={member.description}></Card>
46+
<MemberCard {member} />
4747
</div>
4848
{/each}
4949
</div>

packages/data/src/directus/directus.api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ export const dataQueryAbout: string = `query {
6262
name
6363
certification
6464
description
65+
website
66+
linkedin
6567
image {
6668
id
6769
description

packages/data/src/types/about.type.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ export interface Member {
33
certification: string | null;
44
description: string;
55
image: Image | null;
6+
website: string | null;
7+
linkedin: string | null;
68
}
79

810
export interface Image {

packages/ui/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export { default as Footer } from './src/components/Footer.svelte';
44
export { default as Avatar } from './src/components/Avatar.svelte';
55
export { default as Navigation } from './src/components/Navigation.svelte';
66
export { default as Card } from './src/components/Card.svelte';
7+
export { default as MemberCard } from './src/components/MemberCard.svelte';
78
export { default as HtmlRender } from './src/components/HtmlRender.svelte';
89
export { default as Eyes } from './src/components/Eyes.svelte';
910
export { default as PostInfo } from './src/components/PostInfo.svelte';
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<script lang="ts">
2+
import type { Member } from '@a11y.cool/data';
3+
import { Globe, LinkedinLogo } from 'phosphor-svelte';
4+
5+
let { member }: { member: Member } = $props();
6+
</script>
7+
8+
<article
9+
class="rounded-3xl shadow-card border border-border-input bg-background-alt p-6 flex flex-col items-start gap-4 min-h-[320px]"
10+
>
11+
<!-- Circular member image -->
12+
{#if member.image}
13+
<div
14+
class="w-24 h-24 rounded-full overflow-hidden border-2 border-border-input mb-2 self-center"
15+
>
16+
<img
17+
src={member.image.id}
18+
alt={member.image.description || `${member.name} profile picture`}
19+
class="w-full h-full object-cover"
20+
/>
21+
</div>
22+
{/if}
23+
24+
<!-- Member name -->
25+
<h3 class="text-xl md:text-2xl font-semibold text-left mb-2">
26+
{member.name}
27+
</h3>
28+
29+
<!-- Certification if available -->
30+
{#if member.certification}
31+
<p class="text-sm text-muted-foreground text-left mb-3">
32+
{member.certification}
33+
</p>
34+
{/if}
35+
36+
<!-- Description -->
37+
<p class="text-base mb-4 w-full text-left">
38+
{member.description}
39+
</p>
40+
41+
<!-- URL links at the bottom -->
42+
<div class="flex gap-4 mt-auto">
43+
{#if member.website}
44+
<a
45+
href={member.website}
46+
target="_blank"
47+
rel="noopener noreferrer"
48+
class="flex items-center gap-2 px-3 py-2 rounded-lg bg-background border border-border-input hover:bg-muted transition-colors"
49+
aria-label="Visit {member.name}'s website"
50+
>
51+
<Globe size={16} />
52+
<span class="text-sm">Website</span>
53+
</a>
54+
{/if}
55+
56+
{#if member.linkedin}
57+
<a
58+
href={member.linkedin}
59+
target="_blank"
60+
rel="noopener noreferrer"
61+
class="flex items-center gap-2 px-3 py-2 rounded-lg bg-background border border-border-input hover:bg-muted transition-colors"
62+
aria-label="Visit {member.name}'s LinkedIn profile"
63+
>
64+
<LinkedinLogo size={16} />
65+
<span class="text-sm">LinkedIn</span>
66+
</a>
67+
{/if}
68+
</div>
69+
</article>

0 commit comments

Comments
 (0)