Skip to content

feat(schedule): add timeline nav prototype#121

Open
chiptus wants to merge 6 commits into
mainfrom
claude/timeline-nav-prototype
Open

feat(schedule): add timeline nav prototype#121
chiptus wants to merge 6 commits into
mainfrom
claude/timeline-nav-prototype

Conversation

@chiptus

@chiptus chiptus commented Jul 9, 2026

Copy link
Copy Markdown
Owner

Throwaway prototype: three timeline navigation + my-vote filtering variants on the timeline route behind ?variant= (a: slim jump bar, b: segmented rail, c: mini-map), to validate the agreed scrollTo/jump-bar design before the PRD is published.
Without ?variant= the production timeline renders untouched; verdict placeholders and the deletion list live in prototype/NOTES.md.

Verification

  • Open an edition's timeline with ?variant=a; jump bar with day buttons + Now pill renders, clicking a day smooth-scrolls the strip and writes scrollTo to the URL.
  • Swipe/scroll the strip, wait a moment, reload; position is restored from scrollTo (also when returning from a set page via back).
  • Cycle variants with the floating bottom bar or ←/→ keys; scroll position carries over.
  • In variant a, expand Filters and select Must Go + Interested; strip narrows to those sets and the badge counts them.
  • In variant c, drag the mini-map viewport window and click elsewhere on the map; the strip follows.
  • Open the timeline without ?variant=; the existing production timeline renders with no switcher.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WeDJWUoheP7zyhpchNa3DW


Generated by Claude Code

claude added 2 commits July 9, 2026 18:18
Three structurally different variants on the existing schedule/timeline
route, gated by ?variant= (a: slim jump bar, b: segmented rail, c: mini-map),
all sharing the agreed scrollTo URL mechanics (debounced write, 5-min
rounding, one-way ownership, mount precedence). My-vote chips in three
placements/forms; now indicator in three treatments; fake now + fake anon
votes for demoability. See prototype/NOTES.md for the questions this
answers and the deletion list.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WeDJWUoheP7zyhpchNa3DW
Gate on the variant param being present instead of dev-build only, so a
shared preview deploy can flip variants; normal users still never see it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WeDJWUoheP7zyhpchNa3DW
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@vercel

vercel Bot commented Jul 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
upline Ready Ready Preview, Comment Jul 12, 2026 4:12pm

A future edition without its schedule publicly revealed (reveal level
below "full") was hitting ScheduleNotRevealedPlaceholder before the
?variant= check ever ran, hiding the prototype (Now button included)
entirely. Testing nav/filtering shouldn't depend on public reveal state.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WeDJWUoheP7zyhpchNa3DW
Tomorrowland's schedule reveal level is already "full", so canShowTime
was never the actual blocker — the earlier bypass wasn't needed. The
real fix for the Now button was already in place (fake "now" computed
from the edition's own dates, independent of the real clock).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WeDJWUoheP7zyhpchNa3DW
Two testers tried round 1: one preferred variant a, the other loved
variant c's mini-map for being visual but flagged the plain switcher
and general noise. Folds their feedback into all three variants:

- Filters move into a bottom sheet instead of an inline expanding
  panel, so the schedule stays the visual focus.
- Variant c's mini-map now collapses to a's slim day-strip by default,
  with a "Show overview" toggle to reveal the full density map — what
  testers valued was one control doing "jump to a day" + "filter by my
  votes" together, not the density map being loud all the time.
- Day labels now include the date ("Thu 13", not bare "Thu") — a real
  bug: multi-weekend festivals (Tomorrowland's two long weekends)
  repeat weekday names with no way to tell them apart.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WeDJWUoheP7zyhpchNa3DW

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a throwaway, URL-driven prototype for timeline navigation + “my-vote” filtering on the existing schedule timeline route, gated behind ?variant= so the production timeline UI remains unchanged when the param is absent.

Changes:

  • Adds variant and scrollTo search params and a TimelinePrototype entrypoint rendered only when ?variant= is present.
  • Implements three prototype UI variants (slim jump bar, segmented rail, minimap) sharing a scrollTo URL/scroll synchronization hook.
  • Introduces prototype-only vote chips, fake “now”, and fake votes (when logged out) to support anonymous demos, plus internal notes.

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/pages/EditionView/tabs/ScheduleTab/horizontal/Timeline.tsx Gates the prototype rendering behind ?variant= on the timeline route.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/TimelinePrototype.tsx Prototype controller: builds filtered timeline data + routes to variant A/B/C UIs.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/VariantSlimBar.tsx Variant A: sticky slim jump bar + filters drawer vote chips + smooth jumps.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/VariantSegmented.tsx Variant B: segmented day rail + inline vote chips with counts + instant jumps.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/VariantMinimap.tsx Variant C: collapsible minimap with draggable viewport and compact vote chips.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/useScrollToUrl.ts Shared scrollTo URL mechanics (debounced write, rounding, mount restore).
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/PrototypeCanvas.tsx Shared scroll surface reusing production timeline rows/scale + now indicator overlay.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/PrototypeFilters.tsx Shared bottom-sheet filter UI for day/time/stage (+ optional vote chips slot).
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/VoteChips.tsx Prototype vote filter chip UI (optionally compact, optionally with counts).
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/NowIndicator.tsx Prototype-only now-indicator visual treatments for each variant.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/usePrototypeVotes.ts Uses real votes when logged in; deterministic fake votes when logged out.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/useFakeNow.ts Fakes “now” within the edition window for consistent demos.
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/types.ts Shared types/helpers for variants (e.g., day jump model, now-in-window check).
src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/NOTES.md Prototype runbook + decision log placeholders + deletion checklist.
src/lib/searchSchemas.ts Extends timeline search schema to include variant and scrollTo.
src/components/prototype/PrototypeSwitcher.tsx Floating in-prototype UI to cycle variants (buttons + ←/→ keys).

Comment thread src/lib/searchSchemas.ts
Comment on lines +43 to 46
// PROTOTYPE (timeline nav & filtering) — remove with src/pages/EditionView/tabs/ScheduleTab/horizontal/prototype/
variant: z.enum(["a", "b", "c"]).optional(),
scrollTo: z.string().optional(),
});
Comment on lines +25 to +37
<button
key={voteType}
type="button"
onClick={() => onToggle(voteType)}
aria-pressed={isSelected}
title={config.label}
className={cn(
"inline-flex items-center gap-1.5 rounded-full border text-xs font-medium transition-colors",
compact ? "px-2 py-1" : "px-3 py-1.5",
isSelected
? cn("border-transparent text-white", config.buttonSelected)
: cn("bg-transparent", config.buttonUnselected),
)}
Comment on lines +67 to +78
function update() {
setViewport({ left: el!.scrollLeft, width: el!.clientWidth });
setMapWidth(mapRef.current?.clientWidth ?? 0);
}

update();
el.addEventListener("scroll", update, { passive: true });
window.addEventListener("resize", update);
return () => {
el.removeEventListener("scroll", update);
window.removeEventListener("resize", update);
};
Comment on lines +121 to +122
// Jump-bar days derive from the *filtered* strip: nav operates on what is
// rendered (open sub-question — see NOTES.md).
The Filters button sat alone on its own line above the nav row,
wasting a full row for a single icon on narrow viewports. Moved it
inline with each variant's existing toolbar (jump bar, segmented rail,
overview toggle) instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WeDJWUoheP7zyhpchNa3DW
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants