Calendar dates jump to their day, and each session gets its own .ics #17

Merged
forgejo-admin merged 1 commit from calendar-links-and-ics into main 2026-08-05 05:16:43 +00:00

Two asks: clicking a date in the calendar should scroll to that part of the page, and each event should have its own "Add to calendar".

What's here

  • The three highlighted dates are links. 11/12/13 scroll to the Friday, Saturday and Sunday cards, using the existing smooth scroll with a 6rem offset so the sticky nav doesn't cover the heading. Verified in the built HTML that all three hrefs have matching targets.
  • Every session has its own "Add to calendar" — five per-session downloads plus the whole-weekend one, kept visually quieter than the weekend button so the primary action still reads as primary.

The schedule moved to src/lib/schedule.ts

The .ics files and the page now have to agree about times, so a session carries both its human strings ("8:00 PM–12:00 AM") and machine [y,m,d,h,m] start/end, and both consumers read the one array. Otherwise the page and someone's calendar drift apart the first time a time changes.

.ics files are generated at build time by two endpoints rather than maintained by hand: /events/<slug>.ics per session, and all-alt-tango-weekend.ics, which is deleted from public/ and now emitted from the same data at the same URL — so any link already shared keeps working.

The bit most likely to be wrong, and why it isn't

The Late Night Milonga is listed under Saturday but runs 12–3am, so its calendar entry has to be Sept 13, not Sept 12. Generated file reads DTSTART:20260913T070000Z — exactly Sept 13 00:00 PDT.

Times go out in UTC with no VTIMEZONE, which keeps the files small and is only safe because the whole weekend sits inside PDT (UTC-7) with no daylight-saving boundary. That assumption is written down in ics.ts, because moving the event to another date breaks it.

Also: long DESCRIPTION lines fold at 75 octets and commas are escaped per RFC 5545, and the calendar grid loses its blanket aria-hidden now that three cells are real links (each carries a label like "Jump to Friday, September 11").

Verified

astro check 0 errors, lint:css clean, build green, 6 .ics files emitted. Also rebuilt under CELILO_ROUTE=/nexus to confirm the URLs survive the subfolder publish — they come out as /nexus/events/pride-glow-night.ics and the files land where those resolve.

Not in this PR

The hero pulse and gutter curtains are on a separate branch: they can't merge until @celilo/visualizer publishes its glow fix, or the build would pick up the published ^0.2.0 and re-ship the janky version. This one is independent of that.

🤖 Generated with Claude Code

Two asks: clicking a date in the calendar should scroll to that part of the page, and each event should have its own "Add to calendar". ## What's here - **The three highlighted dates are links.** 11/12/13 scroll to the Friday, Saturday and Sunday cards, using the existing smooth scroll with a 6rem offset so the sticky nav doesn't cover the heading. Verified in the built HTML that all three hrefs have matching targets. - **Every session has its own "Add to calendar"** — five per-session downloads plus the whole-weekend one, kept visually quieter than the weekend button so the primary action still reads as primary. ## The schedule moved to `src/lib/schedule.ts` The `.ics` files and the page now have to agree about times, so a session carries both its human strings (`"8:00 PM–12:00 AM"`) and machine `[y,m,d,h,m]` start/end, and both consumers read the one array. Otherwise the page and someone's calendar drift apart the first time a time changes. `.ics` files are generated at build time by two endpoints rather than maintained by hand: `/events/<slug>.ics` per session, and `all-alt-tango-weekend.ics`, which is deleted from `public/` and now emitted from the same data **at the same URL** — so any link already shared keeps working. ## The bit most likely to be wrong, and why it isn't The **Late Night Milonga** is listed under Saturday but runs 12–3am, so its calendar entry has to be *Sept 13*, not Sept 12. Generated file reads `DTSTART:20260913T070000Z` — exactly Sept 13 00:00 PDT. Times go out in **UTC with no `VTIMEZONE`**, which keeps the files small and is only safe because the whole weekend sits inside PDT (UTC-7) with no daylight-saving boundary. That assumption is written down in `ics.ts`, because moving the event to another date breaks it. Also: long `DESCRIPTION` lines fold at 75 octets and commas are escaped per RFC 5545, and the calendar grid loses its blanket `aria-hidden` now that three cells are real links (each carries a label like "Jump to Friday, September 11"). ## Verified `astro check` 0 errors, `lint:css` clean, build green, 6 `.ics` files emitted. Also rebuilt under `CELILO_ROUTE=/nexus` to confirm the URLs survive the subfolder publish — they come out as `/nexus/events/pride-glow-night.ics` and the files land where those resolve. ## Not in this PR The hero pulse and gutter curtains are on a separate branch: they can't merge until `@celilo/visualizer` publishes its glow fix, or the build would pick up the published `^0.2.0` and re-ship the janky version. This one is independent of that. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The three highlighted dates are links now: 11/12/13 scroll to the Friday,
Saturday and Sunday cards. Every session also gets its own "Add to
calendar" button, kept visually quieter than the weekend button on the
calendar card so the primary action still reads as primary.

The schedule moves out of the component into src/lib/schedule.ts, because
the .ics files and the page now have to agree about times — a session
carries both its human strings and machine [y,m,d,h,m] start/end, and
both consumers read the one array.

.ics files are generated at build time by two endpoints rather than kept
by hand: /events/<slug>.ics per session and the existing
all-alt-tango-weekend.ics, which is deleted from public/ and emitted from
the same data at the same URL.

Times go out in UTC with no VTIMEZONE, which is only safe because the
whole weekend sits inside PDT (UTC-7) with no DST boundary — noted in
ics.ts, since moving the event breaks that assumption. The Late Night
Milonga is the case that proves it matters: it is listed under Saturday
but runs 12-3am, so its entry is Sept 13 00:00 PDT (20260913T070000Z),
not Sept 12.

Also folds long DESCRIPTION lines at 75 octets and escapes commas per
RFC 5545, and the calendar grid loses its blanket aria-hidden now that
three of its cells are real links.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
forgejo-admin deleted branch calendar-links-and-ics 2026-08-05 05:16:43 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
celilo/tango-nexus!17
No description provided.