11import { useState , useEffect } from "react" ;
2- import { Clock , MapPin , User , Monitor } from "lucide-react" ;
2+ import { Clock , MapPin , User , Monitor , Utensils } from "lucide-react" ;
3+ import foodDrinkBg from "@assets/image_1768474260490.png" ;
34
45interface KioskSession {
56 id : string ;
@@ -84,15 +85,6 @@ const DUMMY_SESSIONS: KioskSession[] = [
8485 speakers : [ { name : "Ruben Visser" } ] ,
8586 categories : [ "Deepdive" ] ,
8687 } ,
87- {
88- id : "9" ,
89- title : "Retrospective & Borrel" ,
90- room : "Zaal 2 — Workshopruimte" ,
91- startTime : "2026-04-16T17:00:00" ,
92- endTime : "2026-04-16T18:00:00" ,
93- speakers : [ ] ,
94- categories : [ "Feedback" ] ,
95- } ,
9688 {
9789 id : "10" ,
9890 title : "Diner" ,
@@ -117,6 +109,10 @@ function formatTime(iso: string) {
117109 return new Date ( iso ) . toLocaleTimeString ( "nl-NL" , { hour : "2-digit" , minute : "2-digit" } ) ;
118110}
119111
112+ function isFoodDrinkSession ( categories : string [ ] ) : boolean {
113+ return categories . some ( c => c . toLowerCase ( ) === "eten & drinken" ) ;
114+ }
115+
120116type SessionStatus = "now" | "next" | "later" ;
121117
122118function getSessionStatus ( session : KioskSession , now : Date ) : SessionStatus {
@@ -155,70 +151,81 @@ function SessionBlock({
155151} ) {
156152 const isNow = status === "now" ;
157153 const isNext = status === "next" ;
158- const isLater = status === "later" ;
159- const isCompact = heightPx < 120 ;
154+ const isCompact = heightPx < 140 ;
155+ const isFoodDrink = isFoodDrinkSession ( session . categories ) ;
160156
161157 return (
162158 < div
163159 className = { `
164- rounded-2xl border-2 p-4 overflow-hidden flex flex-col justify-between transition-all
160+ rounded-2xl border-2 p-5 overflow-hidden flex flex-col justify-between transition-all relative
165161 ${ isNow
166162 ? "border-green-400 bg-green-50 dark:bg-green-950/30 dark:border-green-600 shadow-lg shadow-green-100 dark:shadow-green-900/20"
167163 : isNext
168164 ? "border-amber-400 bg-amber-50 dark:bg-amber-950/30 dark:border-amber-600 shadow-md shadow-amber-100 dark:shadow-amber-900/20"
169- : "border-border/40 bg-muted/30 opacity-70 "
165+ : "border-border bg-card "
170166 }
171167 ` }
172168 style = { { height : `${ heightPx } px` , minHeight : "60px" } }
173169 data-testid = { `kiosk-session-${ session . id } ` }
174170 >
175- < div >
176- < div className = "flex items-center gap-2 mb-1" >
171+ { isFoodDrink && (
172+ < div
173+ className = "absolute inset-0 pointer-events-none opacity-[0.12] dark:opacity-[0.10]"
174+ style = { {
175+ backgroundImage : `url(${ foodDrinkBg } )` ,
176+ backgroundSize : "cover" ,
177+ backgroundPosition : "center" ,
178+ } }
179+ />
180+ ) }
181+ < div className = "relative z-10" >
182+ < div className = "flex items-center gap-2 mb-1.5" >
177183 { isNow && (
178- < span className = "inline-flex items-center gap-1.5 rounded-full bg-green-600 px-2.5 py-0.5 text-xs font-bold text-white animate-pulse" data-testid = "badge-now" >
179- < span className = "h-1.5 w-1.5 rounded-full bg-white" />
184+ < span className = "inline-flex items-center gap-1.5 rounded-full bg-green-600 px-3 py-1 text-sm font-bold text-white animate-pulse" data-testid = "badge-now" >
185+ < span className = "h-2 w-2 rounded-full bg-white" />
180186 NU BEZIG
181187 </ span >
182188 ) }
183189 { isNext && (
184- < span className = "inline-flex items-center gap-1.5 rounded-full bg-amber-500 px-2.5 py-0.5 text-xs font-bold text-white" data-testid = "badge-next" >
190+ < span className = "inline-flex items-center gap-1.5 rounded-full bg-amber-500 px-3 py-1 text-sm font-bold text-white" data-testid = "badge-next" >
185191 AANKOMEND
186192 </ span >
187193 ) }
188- { isLater && (
189- < span className = "inline-flex items-center gap-1.5 rounded-full bg-muted px-2.5 py-0.5 text-xs font-medium text-muted-foreground" >
194+ { status === "later" && (
195+ < span className = "inline-flex items-center gap-1.5 rounded-full bg-muted px-3 py-1 text-sm font-medium text-muted-foreground" >
190196 LATER
191197 </ span >
192198 ) }
193199 { session . categories . length > 0 && (
194- < span className = { `text-xs font-medium ${ isLater ? "text-muted-foreground/70" : "text-muted-foreground" } ` } >
200+ < span className = "text-sm font-medium text-muted-foreground" >
201+ { isFoodDrink && < Utensils className = "inline mr-1 h-3.5 w-3.5" /> }
195202 { session . categories . join ( ", " ) }
196203 </ span >
197204 ) }
198205 </ div >
199206
200207 < h3
201208 className = { `font-bold leading-tight mb-1 ${
202- isNow ? "text-xl " : isNext ? "text-lg " : "text-base text-muted-foreground/70 "
209+ isNow ? "text-2xl " : isNext ? "text-xl " : "text-lg "
203210 } ${ isCompact ? "line-clamp-1" : "line-clamp-2" } `}
204211 data-testid = { `kiosk-title-${ session . id } ` }
205212 >
206213 { session . title }
207214 </ h3 >
208215
209216 { session . speakers . length > 0 && ! isCompact && (
210- < div className = { ` flex items-center gap-1.5 ${ isLater ? " text-muted-foreground/60" : "text-muted-foreground" } ` } >
211- < User className = "h-3.5 w-3.5 shrink-0" />
212- < span className = "text-sm truncate" >
217+ < div className = " flex items-center gap-2 text-muted-foreground" >
218+ < User className = "h-4 w-4 shrink-0" />
219+ < span className = "text-base truncate" >
213220 { session . speakers . map ( s => s . name ) . join ( ", " ) }
214221 </ span >
215222 </ div >
216223 ) }
217224 </ div >
218225
219- < div className = { ` flex items-center gap-1.5 mt-1 ${ isLater ? " text-muted-foreground/60" : "text-muted-foreground" } ` } >
220- < Clock className = "h-3.5 w-3.5 shrink-0" />
221- < span className = "text-xs font-medium" >
226+ < div className = " flex items-center gap-2 mt-1 text-muted-foreground relative z-10" >
227+ < Clock className = "h-4 w-4 shrink-0" />
228+ < span className = "text-sm font-medium" >
222229 { formatTime ( session . startTime ) } – { formatTime ( session . endTime ) }
223230 </ span >
224231 </ div >
@@ -266,33 +273,33 @@ export default function Kiosk() {
266273
267274 return (
268275 < div className = "fixed inset-0 z-[100] flex flex-col bg-background overflow-hidden" data-testid = "kiosk-container" >
269- < header className = "flex items-center justify-between px-8 py-4 border-b bg-[hsl(var(--primary))] text-primary-foreground shrink-0" >
270- < div className = "flex items-center gap-4 " >
271- < img src = "/logo.svg" alt = "Caesar Forum" className = "h-10 brightness-0 invert" data-testid = "kiosk-logo" />
272- < div className = "h-8 w-px bg-primary-foreground/30" />
273- < h1 className = "text-2xl font-bold tracking-tight" data-testid = "kiosk-title" > Sessierooster</ h1 >
276+ < header className = "flex items-center justify-between px-8 py-5 border-b bg-[hsl(var(--primary))] text-primary-foreground shrink-0" >
277+ < div className = "flex items-center gap-5 " >
278+ < img src = "/logo.svg" alt = "Caesar Forum" className = "h-12 brightness-0 invert" data-testid = "kiosk-logo" />
279+ < div className = "h-9 w-px bg-primary-foreground/30" />
280+ < h1 className = "text-3xl font-bold tracking-tight" data-testid = "kiosk-title" > Sessierooster</ h1 >
274281 </ div >
275- < div className = "flex items-center gap-3 text-primary-foreground/80" >
276- < Monitor className = "h-5 w-5 " />
277- < time className = "text-xl font-mono font-semibold tabular-nums" data-testid = "kiosk-clock" >
282+ < div className = "flex items-center gap-4 text-primary-foreground/80" >
283+ < Monitor className = "h-6 w-6 " />
284+ < time className = "text-2xl font-mono font-semibold tabular-nums" data-testid = "kiosk-clock" >
278285 { now . toLocaleTimeString ( "nl-NL" , { hour : "2-digit" , minute : "2-digit" } ) }
279286 </ time >
280- < span className = "text-lg " >
287+ < span className = "text-xl " >
281288 { now . toLocaleDateString ( "nl-NL" , { weekday : "long" , day : "numeric" , month : "long" } ) }
282289 </ span >
283290 </ div >
284291 </ header >
285292
286293 < main className = "flex-1 overflow-auto p-6" >
287294 < div className = "flex gap-4 h-full" >
288- < div className = "w-16 shrink-0 relative" style = { { height : `${ timelineHeightPx } px` } } >
295+ < div className = "w-20 shrink-0 relative" style = { { height : `${ timelineHeightPx } px` } } >
289296 { timeMarkers . map ( ( marker , i ) => (
290297 < div
291298 key = { i }
292299 className = "absolute right-0 flex items-center gap-1 -translate-y-1/2"
293300 style = { { top : `${ marker . offset } px` } }
294301 >
295- < span className = "text-xs font-mono text-muted-foreground font-medium " >
302+ < span className = "text-sm font-mono text-muted-foreground font-semibold " >
296303 { marker . time . toLocaleTimeString ( "nl-NL" , { hour : "2-digit" , minute : "2-digit" } ) }
297304 </ span >
298305 </ div >
@@ -310,9 +317,9 @@ export default function Kiosk() {
310317
311318 return (
312319 < div key = { room } className = "flex flex-col min-w-0" >
313- < div className = "flex items-center gap-2 rounded-xl bg-[hsl(var(--primary))] px-4 py-2.5 text-primary-foreground shrink-0 mb-4" >
314- < MapPin className = "h-4 w-4 shrink-0" />
315- < h2 className = "text-sm font-bold truncate" data-testid = { `kiosk-room-name-${ room } ` } > { room } </ h2 >
320+ < div className = "flex items-center gap-2 rounded-xl bg-[hsl(var(--primary))] px-5 py-3 text-primary-foreground shrink-0 mb-4" >
321+ < MapPin className = "h-5 w-5 shrink-0" />
322+ < h2 className = "text-base font-bold truncate" data-testid = { `kiosk-room-name-${ room } ` } > { room } </ h2 >
316323 </ div >
317324
318325 < div className = "relative" style = { { height : `${ timelineHeightPx } px` } } >
0 commit comments