refactor: redesign schedule with responsive grid and expanded spacing

This commit is contained in:
2026-05-28 23:24:50 +02:00
parent 1242297742
commit f89012f23c
2 changed files with 128 additions and 110 deletions

View File

@@ -33,6 +33,8 @@
--surface-select: light-dark(#ffffff, #181818);
--text-on-accent: light-dark(#fafaf9, #0c0a09);
--overlay-subtle: light-dark(rgba(0, 0, 0, 0.04), rgba(255, 255, 255, 0.04));
--border: light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.07));
--border-light: light-dark(rgba(0, 0, 0, 0.04), rgba(255, 255, 255, 0.035));
--shadow-subtle: light-dark(0 1px 2px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.18));
--shadow-card: light-dark(0 2px 8px rgba(0, 0, 0, 0.04), 0 2px 10px rgba(0, 0, 0, 0.28));
--shadow-card-hover: light-dark(0 6px 18px rgba(0, 0, 0, 0.06), 0 6px 20px rgba(0, 0, 0, 0.34));

View File

@@ -1,12 +1,12 @@
{{define "title"}}Schedule{{end}}
{{define "content"}}
<div class="flex flex-col gap-6 pb-12">
<section class="flex items-end justify-between gap-4">
<div class="flex flex-col gap-1">
<h1 class="text-2xl font-normal tracking-[-0.02em] text-foreground">Airing Schedule</h1>
<p class="text-sm text-foreground-muted">Shows from your watchlist that are currently airing.</p>
<div class="flex flex-col gap-12 pb-24">
<section class="flex items-end justify-between gap-6 px-1">
<div class="flex flex-col gap-2">
<h1 class="text-4xl font-semibold tracking-tight text-foreground">Schedule</h1>
<p class="text-lg text-foreground-muted">Shows from your watchlist that are currently airing.</p>
</div>
<a href="/watchlist" class="text-sm text-foreground-muted transition-colors hover:text-foreground">Manage watchlist</a>
<a href="/watchlist" class="shrink-0 text-sm font-medium text-foreground-muted transition-colors hover:text-foreground">Manage watchlist</a>
</section>
<div hx-get="/api/schedule?year={{.ScheduleYear}}&week={{.ScheduleWeek}}" hx-trigger="load" hx-swap="outerHTML">
@@ -16,77 +16,81 @@
{{end}}
{{define "schedule_section"}}
<section class="flex w-full flex-col gap-4" data-schedule-section>
<section class="flex w-full flex-col gap-8" data-schedule-section>
{{if eq (len .Animes) 0}}
<div class="bg-background-surface p-10 ring-1 ring-black/5">
<div class="mx-auto flex max-w-xl flex-col items-center gap-3 text-center">
<h2 class="text-base font-medium text-foreground">Nothing airing yet</h2>
<p class="text-sm text-foreground-muted">Add currently airing shows to your watchlist to see their weekly broadcast time here.</p>
<div class="mt-2 flex flex-wrap items-center justify-center gap-3">
<a href="/browse?status=airing" class="inline-flex h-10 items-center justify-center bg-background-button px-4 text-sm font-normal text-foreground transition-colors hover:bg-background-button-hover focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">Browse airing</a>
<a href="/discover" class="inline-flex h-10 items-center justify-center bg-transparent px-4 text-sm font-normal text-foreground-muted transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">Discover</a>
<a href="/watchlist" class="inline-flex h-10 items-center justify-center bg-transparent px-4 text-sm font-normal text-foreground-muted transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">Open watchlist</a>
<div class="flex flex-col items-center justify-center gap-4 bg-background-surface px-8 py-16 text-center ring-1 ring-[var(--border)]">
<svg class="h-10 w-10 text-foreground-muted/50" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
<line x1="16" y1="2" x2="16" y2="6"/>
<line x1="8" y1="2" x2="8" y2="6"/>
<line x1="3" y1="10" x2="21" y2="10"/>
</svg>
<div class="flex max-w-md flex-col gap-1.5">
<h2 class="text-base font-normal text-foreground">Nothing airing yet</h2>
<p class="text-sm text-foreground-muted">Add currently airing shows to your watchlist to see their weekly broadcast schedule here.</p>
</div>
<div class="mt-2 flex flex-wrap items-center justify-center gap-3">
<a href="/browse?status=airing" class="inline-flex h-9 items-center justify-center bg-background-button px-4 text-sm font-normal text-foreground transition-colors hover:bg-background-button-hover focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">Browse airing</a>
<a href="/discover" class="inline-flex h-9 items-center justify-center bg-transparent px-4 text-sm font-normal text-foreground-muted transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">Discover</a>
<a href="/watchlist" class="inline-flex h-9 items-center justify-center bg-transparent px-4 text-sm font-normal text-foreground-muted transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">Open watchlist</a>
</div>
</div>
{{else}}
<div class="bg-background-surface p-4 ring-1 ring-black/5">
<div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
<div class="flex flex-wrap items-center gap-3 text-xs text-foreground-muted">
<div class="flex items-center gap-2">
<span class="text-foreground">Time</span>
<div class="inline-flex overflow-hidden ring-1 ring-black/5">
<button type="button" data-schedule-setting="timeFormat" data-schedule-value="24" class="h-9 px-3 bg-background-button hover:bg-background-button-hover text-foreground transition-colors">24H</button>
<button type="button" data-schedule-setting="timeFormat" data-schedule-value="12" class="h-9 px-3 bg-background-button hover:bg-background-button-hover text-foreground transition-colors">12H</button>
<div class="flex flex-wrap items-center justify-between gap-6 bg-background-surface px-6 py-5 ring-1 ring-[var(--border)]">
<div class="flex flex-wrap items-center gap-x-10 gap-y-4 text-sm text-foreground-muted">
<div class="flex items-center gap-4">
<span class="text-xs font-semibold uppercase tracking-wider text-foreground-muted">Time</span>
<div class="inline-flex overflow-hidden ring-1 ring-[var(--border)]">
<button type="button" data-schedule-setting="timeFormat" data-schedule-value="24" class="h-9 px-4 text-xs font-semibold bg-background-button hover:bg-background-button-hover text-foreground transition-colors">24H</button>
<button type="button" data-schedule-setting="timeFormat" data-schedule-value="12" class="h-9 px-4 text-xs font-semibold bg-background-button hover:bg-background-button-hover text-foreground transition-colors">12H</button>
</div>
</div>
<div class="flex items-center gap-2">
<span class="text-foreground">Images</span>
<div class="inline-flex overflow-hidden ring-1 ring-black/5">
<button type="button" data-schedule-setting="showImages" data-schedule-value="true" class="h-9 px-3 bg-background-button hover:bg-background-button-hover text-foreground transition-colors">Show</button>
<button type="button" data-schedule-setting="showImages" data-schedule-value="false" class="h-9 px-3 bg-background-button hover:bg-background-button-hover text-foreground transition-colors">Hide</button>
<div class="flex items-center gap-4">
<span class="text-xs font-semibold uppercase tracking-wider text-foreground-muted">Images</span>
<div class="inline-flex overflow-hidden ring-1 ring-[var(--border)]">
<button type="button" data-schedule-setting="showImages" data-schedule-value="true" class="h-9 px-4 text-xs font-semibold bg-background-button hover:bg-background-button-hover text-foreground transition-colors">Show</button>
<button type="button" data-schedule-setting="showImages" data-schedule-value="false" class="h-9 px-4 text-xs font-semibold bg-background-button hover:bg-background-button-hover text-foreground transition-colors">Hide</button>
</div>
</div>
<div class="flex items-center gap-2">
<span class="text-foreground">Sort</span>
<select data-schedule-setting="sortBy" class="h-9 bg-background-button px-3 text-foreground ring-1 ring-black/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">
<div class="flex items-center gap-4">
<span class="text-xs font-semibold uppercase tracking-wider text-foreground-muted">Sort</span>
<select data-schedule-setting="sortBy" class="h-9 bg-background-button px-4 text-xs font-semibold text-foreground ring-1 ring-[var(--border)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">
<option value="time">Time</option>
<option value="alpha">Alphabetical</option>
<option value="score">Score</option>
</select>
</div>
<div class="flex items-center gap-2">
<span class="text-foreground">Week</span>
<select data-schedule-setting="weekStart" class="h-9 bg-background-button px-3 text-foreground ring-1 ring-black/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">
<option value="monday">Monday first</option>
<option value="sunday">Sunday first</option>
<option value="saturday">Saturday first</option>
<div class="flex items-center gap-4">
<span class="text-xs font-semibold uppercase tracking-wider text-foreground-muted">Week starts</span>
<select data-schedule-setting="weekStart" class="h-9 bg-background-button px-4 text-xs font-semibold text-foreground ring-1 ring-[var(--border)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">
<option value="monday">Monday</option>
<option value="sunday">Sunday</option>
<option value="saturday">Saturday</option>
</select>
</div>
</div>
<div class="flex items-center gap-2">
<button type="button" data-schedule-week-nav="-1" class="inline-flex h-9 items-center justify-center bg-background-button px-3 text-xs text-foreground transition-colors hover:bg-background-button-hover ring-1 ring-black/5">← Previous Week</button>
<button type="button" data-schedule-week-nav="1" class="inline-flex h-9 items-center justify-center bg-background-button px-3 text-xs text-foreground transition-colors hover:bg-background-button-hover ring-1 ring-black/5">Next Week →</button>
</div>
<div class="flex items-center gap-3">
<button type="button" data-schedule-week-nav="-1" class="inline-flex h-9 items-center justify-center bg-background-button px-4 text-xs font-semibold text-foreground-muted transition-colors hover:bg-background-button-hover hover:text-foreground ring-1 ring-[var(--border)]">← Previous</button>
<button type="button" data-schedule-week-nav="1" class="inline-flex h-9 items-center justify-center bg-background-button px-4 text-xs font-semibold text-foreground-muted transition-colors hover:bg-background-button-hover hover:text-foreground ring-1 ring-[var(--border)]">Next →</button>
</div>
</div>
<div class="grid gap-3 lg:grid-cols-7" data-schedule-board>
<div class="grid gap-10 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4" data-schedule-board>
{{range (list "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday")}}
{{$day := .}}
<section class="min-w-0 bg-background-surface ring-1 ring-black/5" data-schedule-day="{{$day}}">
<header class="flex items-baseline justify-between gap-3 border-b border-black/5 px-4 py-3">
<section class="flex min-w-0 flex-col bg-background-surface ring-1 ring-[var(--border)]" data-schedule-day="{{$day}}">
<header class="flex items-baseline justify-between gap-3 border-b border-[var(--border-light)] px-7 py-6">
<div class="min-w-0">
<h2 class="text-sm font-medium text-foreground" data-schedule-day-label>{{$day}}</h2>
<div class="text-xs text-foreground-muted" data-schedule-date-label>—</div>
<h2 class="text-lg font-semibold tracking-tight text-foreground" data-schedule-day-label>{{$day}}</h2>
<div class="mt-1 text-sm text-foreground-muted" data-schedule-date-label>—</div>
</div>
<div class="text-xs text-foreground-muted tabular-nums" data-schedule-count>0</div>
<span class="shrink-0 text-sm tabular-nums font-medium text-foreground-muted" data-schedule-count>0</span>
</header>
<div class="flex flex-col gap-2 p-3" data-schedule-day-items></div>
<div class="flex flex-col pb-8 pt-4" data-schedule-day-items></div>
</section>
{{end}}
</div>
@@ -109,15 +113,15 @@
data-broadcast-time="{{$anime.Broadcast.Time}}"
data-broadcast-timezone="{{$anime.Broadcast.Timezone}}"
>
<div class="flex gap-3 bg-background px-3 py-3 ring-1 ring-black/5 hover:bg-[color:var(--color-surface-hover)] transition-colors">
<a href="/anime/{{$anime.MalID}}" class="shrink-0 overflow-hidden bg-background" data-schedule-poster>
<img src="{{$imageUrl}}" alt="{{$anime.DisplayTitle}}" class="h-16 w-12 object-cover" loading="lazy" />
<div class="flex gap-6 border-b border-[var(--border-light)] px-7 py-6 transition-colors last:border-b-0 hover:bg-[color:var(--color-surface-hover)]">
<a href="/anime/{{$anime.MalID}}" class="shrink-0 overflow-hidden bg-background-surface" data-schedule-poster>
<img src="{{$imageUrl}}" alt="{{$anime.DisplayTitle}}" class="h-28 w-20 object-cover" loading="lazy" />
</a>
<div class="min-w-0 flex-1">
<div class="flex items-start justify-between gap-2">
<div class="flex min-w-0 flex-1 flex-col justify-center gap-3">
<div class="flex items-start justify-between gap-4">
<a href="/anime/{{$anime.MalID}}" class="min-w-0">
<div class="line-clamp-2 text-sm font-medium text-foreground">{{$anime.DisplayTitle}}</div>
<h3 class="line-clamp-2 text-lg font-semibold leading-tight tracking-tight text-foreground">{{$anime.DisplayTitle}}</h3>
</a>
<button
type="button"
@@ -125,20 +129,20 @@
data-mal-id="{{$anime.MalID}}"
data-watchlist-title="{{$anime.DisplayTitle}}"
data-watchlist-state="{{if (index $.WatchlistMap $anime.MalID)}}in{{else}}out{{end}}"
class="shrink-0 text-accent hover:text-accent/80 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent disabled:opacity-50 {{if (index $.WatchlistMap $anime.MalID)}}in-watchlist{{end}}"
class="mt-1 shrink-0 text-foreground-muted transition-colors hover:text-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent disabled:opacity-50 {{if (index $.WatchlistMap $anime.MalID)}}!text-accent{{end}}"
aria-label="{{if (index $.WatchlistMap $anime.MalID)}}Remove from Watchlist{{else}}Add to Watchlist{{end}}"
>
<svg class="size-4 watchlist-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z" /></svg>
<svg class="size-5 watchlist-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z" /></svg>
</button>
</div>
<div class="mt-1 flex items-center justify-between gap-3 text-xs text-foreground-muted">
<div class="min-w-0 truncate" data-schedule-time>Unknown</div>
<div class="flex items-center gap-5 text-base text-foreground-muted">
<span class="tabular-nums font-medium" data-schedule-time>Unknown</span>
{{if $anime.Score}}
<div class="shrink-0 flex items-center gap-1 tabular-nums" title="Score">
<svg class="text-accent h-3 w-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<span class="flex items-center gap-1.5 tabular-nums font-medium" title="Score">
<svg class="h-4 w-4 fill-accent" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
<span>{{$anime.Score}}</span>
</div>
</span>
{{end}}
</div>
</div>
@@ -151,52 +155,55 @@
{{end}}
{{define "schedule_section_scraped"}}
<section class="flex w-full flex-col gap-5" data-schedule-section>
<section class="flex w-full flex-col gap-8" data-schedule-section>
{{if eq (len .ScheduleDays) 0}}
<div class="bg-background-surface p-10 ring-1 ring-black/5">
<div class="mx-auto flex max-w-xl flex-col items-center gap-3 text-center">
<h2 class="text-base font-medium text-foreground">No schedule data</h2>
<div class="flex flex-col items-center justify-center gap-4 bg-background-surface px-8 py-16 text-center ring-1 ring-[var(--border)]">
<svg class="h-10 w-10 text-foreground-muted/50" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<polyline points="12 6 12 12 16 14"/>
</svg>
<div class="flex max-w-md flex-col gap-1.5">
<h2 class="text-base font-normal text-foreground">No schedule data</h2>
<p class="text-sm text-foreground-muted">Could not load the schedule feed right now.</p>
</div>
</div>
{{else}}
<div class="flex items-center justify-end gap-2 bg-background-surface px-4 py-3 ring-1 ring-black/5">
<a href="/schedule?year={{.PrevYear}}&week={{.PrevWeek}}" class="inline-flex h-9 items-center justify-center bg-background-button px-3 text-xs text-foreground transition-colors hover:bg-background-button-hover focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent ring-1 ring-black/5">Previous Week</a>
<a href="/schedule?year={{.NextYear}}&week={{.NextWeek}}" class="inline-flex h-9 items-center justify-center bg-background-button px-3 text-xs text-foreground transition-colors hover:bg-background-button-hover focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent ring-1 ring-black/5">Next Week</a>
<div class="flex items-center justify-end gap-2">
<a href="/schedule?year={{.PrevYear}}&week={{.PrevWeek}}" class="inline-flex h-8 items-center justify-center bg-background-button px-3 text-xs font-medium text-foreground-muted transition-colors hover:bg-background-button-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent ring-1 ring-[var(--border)]">← Previous</a>
<a href="/schedule?year={{.NextYear}}&week={{.NextWeek}}" class="inline-flex h-8 items-center justify-center bg-background-button px-3 text-xs font-medium text-foreground-muted transition-colors hover:bg-background-button-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent ring-1 ring-[var(--border)]">Next </a>
</div>
<div class="overflow-x-auto">
<div class="grid gap-4 [grid-template-columns:repeat(7,minmax(260px,1fr))]">
<div class="grid gap-10 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
{{range .ScheduleDays}}
<section class="min-w-0 bg-background-surface ring-1 ring-black/5">
<header class="flex items-center justify-between gap-3 border-b border-black/5 bg-background px-3 py-2">
<section class="flex min-w-0 flex-col bg-background-surface ring-1 ring-[var(--border)]">
<header class="flex items-center justify-between gap-3 border-b border-[var(--border-light)] bg-background px-7 py-6">
<div class="min-w-0">
<div class="text-[10px] font-medium uppercase tracking-[0.1em] text-foreground-muted">{{.DateLabel}}</div>
<h2 class="mt-0.5 text-base font-medium leading-tight text-foreground">{{.WeekdayLabel}}</h2>
<div class="text-xs font-semibold uppercase tracking-wider text-foreground-muted">{{.DateLabel}}</div>
<h2 class="mt-1 text-lg font-semibold leading-tight tracking-tight text-foreground">{{.WeekdayLabel}}</h2>
</div>
</header>
<div class="flex flex-col gap-3 p-3">
<div class="flex flex-col pb-8 pt-4">
{{if eq (len .Entries) 0}}
<div class="flex min-h-20 items-center justify-center bg-background px-3 py-6 text-center text-sm text-foreground-muted ring-1 ring-black/5">No releases scheduled</div>
<div class="flex min-h-32 items-center justify-center px-7 py-10 text-center text-sm text-foreground-muted">No releases scheduled</div>
{{else}}
{{range .Entries}}
<a href="/browse?q={{urlquery .Title}}" class="group flex min-h-28 gap-3 overflow-hidden bg-background p-3 ring-1 ring-black/5 transition-colors hover:bg-[color:var(--color-surface-hover)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">
<a href="/browse?q={{urlquery .Title}}" class="group flex gap-6 border-b border-[var(--border-light)] px-7 py-6 transition-colors last:border-b-0 hover:bg-[color:var(--color-surface-hover)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent">
<div class="relative aspect-2/3 h-28 shrink-0 overflow-hidden bg-background-surface">
{{if .ImageURL}}
<img src="{{.ImageURL}}" alt="{{.Title}}" class="h-full w-full object-cover transition-transform duration-200 group-hover:scale-[1.03]" loading="lazy" />
<img src="{{.ImageURL}}" alt="{{.Title}}" class="h-full w-full object-cover" loading="lazy" />
{{end}}
<div class="absolute inset-0 bg-linear-to-t from-black/45 via-transparent to-transparent opacity-80"></div>
<div class="absolute inset-0 bg-linear-to-t from-black/40 via-transparent to-transparent opacity-70"></div>
</div>
<div class="flex min-w-0 flex-1 flex-col py-1 pr-1">
<div class="flex flex-wrap items-center gap-2 text-[11px] font-medium text-foreground-muted">
<span class="bg-background-button px-2 py-1 tabular-nums text-foreground">{{.LocalTime}}</span>
<span class="bg-background-button px-2 py-1 text-foreground">{{.EpisodeText}}</span>
<span class="ml-auto bg-accent px-2 py-1 text-[10px] font-semibold text-black/90">{{.AirType}}</span>
<div class="flex min-w-0 flex-1 flex-col justify-center">
<div class="flex flex-wrap items-center gap-3">
<span class="bg-background-button px-2.5 py-1 text-xs font-semibold tabular-nums text-foreground">{{.LocalTime}}</span>
<span class="bg-background-button px-2.5 py-1 text-xs font-semibold text-foreground-muted">{{.EpisodeText}}</span>
<span class="ml-auto bg-accent px-2 py-0.5 text-[10px] font-bold text-black/95">{{.AirType}}</span>
</div>
<h3 class="mt-3 line-clamp-2 text-sm font-medium leading-snug text-foreground">{{.Title}}</h3>
<div class="mt-auto pt-3 text-xs text-foreground-muted">Open details</div>
<h3 class="mt-3 line-clamp-2 text-lg font-semibold leading-tight tracking-tight text-foreground">{{.Title}}</h3>
<span class="mt-auto pt-4 text-sm font-medium text-foreground-muted transition-colors group-hover:text-foreground">View details →</span>
</div>
</a>
{{end}}
@@ -205,24 +212,33 @@
</section>
{{end}}
</div>
</div>
{{end}}
</section>
{{end}}
{{define "schedule_skeleton"}}
<section class="grid w-full gap-3 sm:[grid-template-columns:repeat(auto-fit,minmax(420px,1fr))] xl:[grid-template-columns:repeat(auto-fit,minmax(520px,1fr))]">
{{range (seq 6)}}
<div class="bg-background-surface p-5 ring-1 ring-black/5">
<div class="flex gap-5">
<div class="h-32 w-24 bg-background-button animate-pulse"></div>
<div class="flex-1">
<div class="h-4 w-3/4 rounded bg-background-button animate-pulse"></div>
<div class="mt-3 h-3 w-2/3 rounded bg-background-button animate-pulse opacity-70"></div>
<div class="mt-3 h-3 w-1/2 rounded bg-background-button animate-pulse opacity-70"></div>
<div class="grid gap-10 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
{{range (seq 7)}}
<div class="flex flex-col bg-background-surface ring-1 ring-[var(--border)]">
<div class="flex items-baseline justify-between border-b border-[var(--border-light)] px-7 py-6">
<div class="flex flex-col gap-2">
<div class="h-6 w-32 bg-foreground-muted/10 animate-pulse"></div>
<div class="h-4 w-20 bg-foreground-muted/10 animate-pulse"></div>
</div>
<div class="h-4 w-10 bg-foreground-muted/10 animate-pulse"></div>
</div>
<div class="flex flex-col pb-8 pt-4">
{{range (seq 3)}}
<div class="flex gap-6 px-7 py-6 border-b border-[var(--border-light)] last:border-b-0">
<div class="h-28 w-20 shrink-0 bg-foreground-muted/10 animate-pulse"></div>
<div class="flex flex-1 flex-col justify-center gap-4">
<div class="h-5 w-full bg-foreground-muted/10 animate-pulse"></div>
<div class="h-4 w-2/3 bg-foreground-muted/10 animate-pulse opacity-60"></div>
</div>
</div>
{{end}}
</section>
</div>
</div>
{{end}}
</div>
{{end}}