feat(timeline): sticky header strip + unboxed timeline#241
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
|
closing as base branch was deprecated |
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
There was a problem hiding this comment.
Pull request overview
This PR updates the Schedule “Timeline” layout so the date band + hour scale live in a sticky header strip outside the horizontal scroller, synced via translateX(-scrollLeft), and removes the framing panel so the timeline can span the full width. It also introduces shared sticky layout constants intended to unify sticky offset calculations.
Changes:
- Adds a sticky, horizontally-synced header strip in
TimelineContainerand refactorsTimeScaleinto a pure layout component (no scroll listeners). - Adjusts sticky offset handling for schedule chrome via new
src/lib/layout-constants.ts. - Removes the “boxed” framing wrapper around the timeline and tweaks spacing for stage labels.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| src/pages/EditionView/tabs/ScheduleTab/ScheduleNavigation.tsx | Makes the Schedule view switcher sticky below the top bar. |
| src/pages/EditionView/tabs/ScheduleTab/horizontal/TimeScale.tsx | Simplifies the time scale to be a pure render of date + hour labels. |
| src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineToolbar.tsx | Changes the toolbar sticky offset to depend on “below switcher” constants. |
| src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineContainer.tsx | Introduces the sticky header strip and scroll-left mirroring; adjusts timeline spacing. |
| src/pages/EditionView/tabs/ScheduleTab/horizontal/Timeline.tsx | Removes the surrounding panel (“unboxed timeline”). |
| src/pages/EditionView/tabs/ScheduleTab/horizontal/StageLabels.tsx | Updates vertical positioning to match the new header/layout. |
| src/lib/layout-constants.ts | Adds shared sticky offset constants for top bar / switcher / timeline toolbar. |
| CONTEXT.md | Updates domain language (“Schedule” is presented via Now/Timeline/List). |
Comments suppressed due to low confidence (1)
src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineContainer.tsx:117
- The header strip background uses
bg-gray-900/95, which is not fully opaque. The acceptance criteria requires the strip to have a constant opaque background so set blocks never show through while scrolling.
<div
className="sticky z-30 overflow-hidden bg-gray-900/95 backdrop-blur-md"
style={{ top: headerStripTop }}
…stants The view switcher now docks below the fixed top bar instead of scrolling behind it. Adds a shared layout-constants module so sticky bars derive their offsets from one source (top-bar height) instead of scattered magic numbers; the timeline toolbar and list day header build on this in follow-up PRs. Refs #231, #233. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011MJJ4etMSZmx916fNiyzqF
…ox timeline Lifts the date band + hour scale out of the horizontal scroller into a sticky strip below the toolbar, synced to horizontal scroll via translateX(-scrollLeft), with a constant opaque background. The timeline itself drops its framing panel so it uses the full content width. Refs #231, #234. Builds on #233 (shared layout constants). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011MJJ4etMSZmx916fNiyzqF
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011MJJ4etMSZmx916fNiyzqF
The Now/Timeline/List switcher was made sticky in a prior pass, but the #231 spec and #233 both explicitly require it to stay non-sticky and scroll away with content. Reverts that and has the timeline toolbar and header strip dock directly below the fixed top bar instead of below the switcher. Refs #231, #234.
The header-strip translateX synced off a scrollLeft that started at 0 and only updated on the next native scroll event, so it could render misaligned for a moment after useTimelineScrollSync's mount-time scroll. Reads the container's actual scrollLeft in a layout effect that runs after that sync instead. Refs #234.
The date-band refactor for the sticky header strip dropped the per-day purple background bar, leaving plain floating text. Since the whole strip is now sticky (no more need for the old JS-driven pinned-label trick), render the date directly inside a solid per-day bar again. Refs #234.
… overlap Three follow-up fixes from visual QA against main: - The toolbar's real rendered height (63px) was larger than the TIMELINE_TOOLBAR_HEIGHT_PX constant (52px) used to position the header strip below it, so the strip crept up under the toolbar. Corrected the constant to match. - The date-band refactor dropped the original pinned-current-day-label behavior (label stays at the strip's left edge while scrolling through a day, fading over to the next day's label as its boundary nears). Restored it by passing the already-tracked scrollLeft down to TimeScale instead of having it track scroll itself. - Stage labels overlapped their own row's sets, because the row stack's top margin no longer left room for a label above each row once TimeScale moved out of the scrolling content. Reworked the label stack to sit in the blank gap directly above each row (mirroring the row stack's own spacing) instead of overlapping the row's cards. Refs #234.
… header strip Removing overflow-y-hidden from the scroll container lets position: sticky work relative to the page scroll directly, so TimeScale no longer needs a translateX(-scrollLeft) mirror or a scrollLeft prop - it goes back to tracking its own scroll container internally, same as on main.
…ring for header strip" This reverts commit 4dc3df8.
4dc3df8 to
f46eb4d
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
src/pages/EditionView/tabs/ScheduleTab/horizontal/TimeScale.tsx:45
- When the day changes,
timeSlotmay be after the actual timezone midnight (e.g. half-hour offset timezones), sopositionwill be late and the date band will drift. Compute the boundary from${currentDate}T00:00:00in the festival timezone instead.
changes.push({
date: timeSlot,
position: timeToOffset(timeSlot, timeSlots[0]),
});
}
Replace useIsMobile (false on first render, causing a desktop-offset flash on mobile) with a responsive Tailwind class for the header strip's sticky top, and drop the 95%-opacity/backdrop-blur background for a fully opaque one so set blocks never show through while scrolling, per PR review feedback on #241.
|
Fixed in cdc9d6e — dropped Generated by Claude Code |
|
Agreed this is out of scope for this PR — tracked as a follow-up in #248. Generated by Claude Code |
Lifts the date band + hour scale out of the horizontal scroller into a sticky strip below the toolbar, synced to horizontal scroll via translateX(-scrollLeft), with a constant opaque background. The timeline drops its framing panel so it uses the full content width.
Builds on #233 (base branch). Closes #234.
Verification
Generated by Claude Code