Skip to content

feat(timeline): sticky header strip + unboxed timeline#241

Merged
chiptus merged 20 commits into
mainfrom
claude/234-sticky-timeline-header
Jul 25, 2026
Merged

feat(timeline): sticky header strip + unboxed timeline#241
chiptus merged 20 commits into
mainfrom
claude/234-sticky-timeline-header

Conversation

@chiptus

@chiptus chiptus commented Jul 25, 2026

Copy link
Copy Markdown
Owner

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

  • Open the Timeline view and scroll down through stages; the date band + hour scale stay pinned and readable.
  • Scroll horizontally; the pinned header strip tracks the sets under it without lag or misalignment.
  • Confirm the header strip keeps a solid background — set blocks never show through it while scrolling.
  • Confirm the timeline has no surrounding framing panel and spans the full content width.

Generated by Claude Code

@vercel

vercel Bot commented Jul 25, 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 25, 2026 5:22pm

@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 →

@chiptus
chiptus changed the base branch from claude/233-sticky-toolbar-layout-constants to main July 25, 2026 14:38
@chiptus
chiptus requested a review from Copilot July 25, 2026 14:38
@chiptus

chiptus commented Jul 25, 2026

Copy link
Copy Markdown
Owner Author

closing as base branch was deprecated

@chiptus chiptus closed this Jul 25, 2026
@chiptus chiptus reopened this Jul 25, 2026
@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 →

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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 TimelineContainer and refactors TimeScale into 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 }}

Comment thread src/pages/EditionView/tabs/ScheduleTab/ScheduleNavigation.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineContainer.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineContainer.tsx Outdated
Comment thread src/lib/layout-constants.ts Outdated
claude added 9 commits July 25, 2026 15:33
…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
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.
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineToolbar.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/StageLabels.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/StageLabels.tsx Outdated
Comment thread src/lib/layout-constants.ts
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineContainer.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineContainer.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimeScale.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineContainer.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/ScheduleNavigation.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimeScale.tsx
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimelineContainer.tsx Outdated
Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/useScrollLeft.ts Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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, timeSlot may be after the actual timezone midnight (e.g. half-hour offset timezones), so position will be late and the date band will drift. Compute the boundary from ${currentDate}T00:00:00 in the festival timezone instead.
        changes.push({
          date: timeSlot,
          position: timeToOffset(timeSlot, timeSlots[0]),
        });
      }

Comment thread src/pages/EditionView/tabs/ScheduleTab/horizontal/TimeScale.tsx
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.

chiptus commented Jul 25, 2026

Copy link
Copy Markdown
Owner Author

Fixed in cdc9d6e — dropped useIsMobile in favor of a responsive Tailwind class (HEADER_STRIP_TOP_CLASS, matching the existing STICKY_TOP_BELOW_TOP_BAR_CLASS pattern) so there's no first-render offset flash on mobile, and switched the strip background from bg-gray-900/95 backdrop-blur-md to fully opaque bg-gray-900.


Generated by Claude Code

chiptus commented Jul 25, 2026

Copy link
Copy Markdown
Owner Author

Agreed this is out of scope for this PR — tracked as a follow-up in #248.


Generated by Claude Code

@chiptus
chiptus merged commit 2353638 into main Jul 25, 2026
6 checks passed
@chiptus
chiptus deleted the claude/234-sticky-timeline-header branch July 25, 2026 17:27
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.

Timeline sticky chrome: toolbar offset, sticky header strip, unboxed timeline

3 participants