Skip to content

Commit 41aefb3

Browse files
committed
Grab speaker tags
1 parent a480210 commit 41aefb3

File tree

3 files changed

+66
-6
lines changed

3 files changed

+66
-6
lines changed

src/app/conf/2025/_data.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ async function getSchedule(): Promise<ScheduleSession[]> {
8282
}
8383

8484
// TODO: Preserve formatting??
85-
8685
return {
8786
...session,
8887
description: description && stripHtml(description).result,
@@ -96,3 +95,38 @@ export const speakers = await getSpeakers()
9695

9796
// TODO: Collect tags from schedule for speakers.
9897
export const schedule = await getSchedule()
98+
99+
type SpeakerUsername = SchedSpeaker["username"]
100+
101+
export const speakerSessions = new Map<SpeakerUsername, ScheduleSession[]>()
102+
103+
for (const session of schedule) {
104+
for (const speaker of session.speakers || []) {
105+
if (!speakerSessions.has(speaker.username)) {
106+
speakerSessions.set(speaker.username, [])
107+
}
108+
109+
speakerSessions.get(speaker.username)!.push(session)
110+
}
111+
}
112+
113+
export const returningSpeakers = new Set<SpeakerUsername>()
114+
115+
import { speakers as speakers2024 } from "../2024/_data"
116+
import { speakers as speakers2023 } from "../2023/_data"
117+
118+
for (const { username } of speakers2024) {
119+
if (speakerSessions.has(username)) {
120+
returningSpeakers.add(username)
121+
}
122+
}
123+
124+
for (const { username } of speakers2023) {
125+
if (speakerSessions.has(username)) {
126+
returningSpeakers.add(username)
127+
}
128+
}
129+
130+
console.log({
131+
returningSpeakers: returningSpeakers.size,
132+
})

src/app/conf/2025/components/speaker-card.tsx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { StripesDecoration } from "../../_design-system/stripes-decoration"
1010
import { SocialIcon, SocialIconType } from "../../_design-system/social-icon"
1111

1212
import styles from "./speaker-card.module.css"
13+
import { returningSpeakers, speakerSessions } from "../_data"
1314

1415
export interface SpeakerCardProps extends React.HTMLAttributes<HTMLDivElement> {
1516
tags?: string[]
@@ -42,7 +43,7 @@ export function SpeakerCard({
4243
<SpeakerLinks speaker={speaker} className="absolute right-6 top-6" />
4344
)}
4445

45-
<div className="relative aspect-square shrink-0 overflow-hidden @[420px]:basis-[176px]">
46+
<div className="relative aspect-square shrink-0 overflow-hidden @[420px]:size-[176px]">
4647
<div className="absolute inset-0 z-[1] bg-sec-light mix-blend-multiply" />
4748
{speaker.avatar ? (
4849
<Image
@@ -67,14 +68,15 @@ export function SpeakerCard({
6768
<div className="flex flex-1 flex-col gap-2">
6869
<div className="flex flex-col gap-1">
6970
<h3 className="typography-body-lg">{speaker.name}</h3>
70-
<p className="text-neu-800 typography-body-sm">
71+
<p className="line-clamp-1 text-neu-800 typography-body-sm">
7172
{[
7273
speaker.position,
7374
speaker.company === "-" ? "" : speaker.company,
7475
]
7576
.filter(Boolean)
7677
.join(", ")}
7778
</p>
79+
<SpeakerTags speaker={speaker} className="my-3" />
7880
</div>
7981
{speaker.about && (
8082
<p className="line-clamp-3 text-neu-800 typography-body-sm">
@@ -150,3 +152,26 @@ function Stripes() {
150152
</div>
151153
)
152154
}
155+
156+
function SpeakerTags({
157+
speaker,
158+
className,
159+
}: {
160+
speaker: SchedSpeaker
161+
className?: string
162+
}) {
163+
const eventType = speakerSessions.get(speaker.username)?.[0]?.event_type
164+
165+
return (
166+
<div className={clsx("flex basis-0 flex-wrap gap-2", className)}>
167+
{eventType && (
168+
<Tag color={eventsColors[eventType] || "hsl(var(--color-sec-base))"}>
169+
{eventType}
170+
</Tag>
171+
)}
172+
{returningSpeakers.has(speaker.name) && (
173+
<Tag color="hsl(var(--color-neu-500))">Returning speaker</Tag>
174+
)}
175+
</div>
176+
)
177+
}

src/app/conf/2025/schedule/_components/back-link.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import NextLink from "next/link"
2-
import ArrowDownIcon from "../../pixelarticons/arrow-down.svg?svgr"
2+
3+
import ArrowDownIcon from "@/app/conf/_design-system/pixelarticons/arrow-down.svg?svgr"
34

45
export function BackLink({
56
year,
@@ -11,9 +12,9 @@ export function BackLink({
1112
return (
1213
<NextLink
1314
href={`/conf/${year}/${kind}`}
14-
className="group typography-menu -m-2 inline-flex cursor-pointer items-center gap-2 p-2 text-sec-darker transition-all [text-box:trim-both_cap_alphabetic] hover:underline hover:underline-offset-4 dark:text-neu-700"
15+
className="group -m-2 inline-flex cursor-pointer items-center gap-2 p-2 text-sec-darker transition-all typography-menu [text-box:trim-both_cap_alphabetic] hover:underline hover:underline-offset-4 dark:text-neu-700"
1516
>
16-
<div className="[--arrow-left-x:-1px] group-hover:animate-arrow-left group-focus:animate-arrow-left">
17+
<div className="group-hover:animate-arrow-left group-focus:animate-arrow-left [--arrow-left-x:-1px]">
1718
<ArrowDownIcon className="inline-block size-4 translate-y-[-.5px] rotate-90" />
1819
</div>
1920
Back to {capitalize(kind)}

0 commit comments

Comments
 (0)