Skip to content

feat(scrubber): modern glassy redesign with density tick marks#3496

Open
karlitschek wants to merge 1 commit into
frank/feat/photos-fun-featuresfrom
frank/feat/photos-scrubber-redesign
Open

feat(scrubber): modern glassy redesign with density tick marks#3496
karlitschek wants to merge 1 commit into
frank/feat/photos-fun-featuresfrom
frank/feat/photos-scrubber-redesign

Conversation

@karlitschek

Copy link
Copy Markdown
Member

The right-edge date scrubber gets a state-of-the-art makeover:

Visual direction

  • Idle: a hairline gradient strip that just hints "drag here". No tick marks, no labels, nothing competing with the photo grid.
  • Hover / scrub: the strip glassens, year pills slide in from the right, tick marks light up across the track, and the thumb expands into a glassy capsule that shows the active month inline.
  • The previous floating-tooltip-next-to-the-thumb is gone; the date now lives inside the thumb pill, so the user's eye doesn't have to dart between two surfaces while scrubbing.

Density tick marks (the new affordance)

  • One tick per month, width proportional to that month's photo count. Reads as a tiny histogram of where the user's library is dense — January's vacation snaps stand out as a bigger tick next to a quiet February.
  • Width derived from a --tick-density CSS custom property bound at the element so the renderer keeps everything visual (no per-tick inline-width recompute on resize).
  • 95th-percentile clamp on the max so a single bursty month doesn't crush the scale and turn every other month into a flat short tick.
  • Empty months still render at the minimum 4px so the rhythm stays consistent.

Other touches

  • Year pills are pill-shaped + frosted-glass (NC color-mix + backdrop-filter); the year that contains the active month gets a stronger treatment so the user knows where the thumb sits at a glance.
  • Thumb expansion uses an ease-out-quint curve (cubic-bezier 0.22, 1, 0.36, 1) for the same "deliberate" feel the photo hover effect uses.
  • Active scrubbing adds a soft halo (8px primary-element shadow at 30% mix) so the user feels they have a firm grip.

Wiring

  • TimelineView exposes monthCounts (built from fileIdsByMonthUngrouped so the histogram reflects the true distribution, not the visible-tile count after burst stacking).
  • DateScrubber takes a new optional monthCounts prop. Falls back gracefully when absent (uniform-rhythm strip, same drag UX).

Build refresh attached.

The right-edge date scrubber gets a state-of-the-art makeover:

Visual direction
- Idle: a hairline gradient strip that just hints "drag here".
  No tick marks, no labels, nothing competing with the photo
  grid.
- Hover / scrub: the strip glassens, year pills slide in from
  the right, tick marks light up across the track, and the
  thumb expands into a glassy capsule that shows the active
  month inline.
- The previous floating-tooltip-next-to-the-thumb is gone; the
  date now lives *inside* the thumb pill, so the user's eye
  doesn't have to dart between two surfaces while scrubbing.

Density tick marks (the new affordance)
- One tick per month, width proportional to that month's photo
  count. Reads as a tiny histogram of where the user's library
  is dense — January's vacation snaps stand out as a bigger
  tick next to a quiet February.
- Width derived from a `--tick-density` CSS custom property
  bound at the element so the renderer keeps everything visual
  (no per-tick inline-width recompute on resize).
- 95th-percentile clamp on the max so a single bursty month
  doesn't crush the scale and turn every other month into a
  flat short tick.
- Empty months still render at the minimum 4px so the rhythm
  stays consistent.

Other touches
- Year pills are pill-shaped + frosted-glass (NC `color-mix` +
  `backdrop-filter`); the year that contains the active month
  gets a stronger treatment so the user knows where the thumb
  sits at a glance.
- Thumb expansion uses an ease-out-quint curve (cubic-bezier
  0.22, 1, 0.36, 1) for the same "deliberate" feel the photo
  hover effect uses.
- Active scrubbing adds a soft halo (8px primary-element
  shadow at 30% mix) so the user feels they have a firm grip.

Wiring
- TimelineView exposes `monthCounts` (built from
  `fileIdsByMonthUngrouped` so the histogram reflects the true
  distribution, not the visible-tile count after burst stacking).
- DateScrubber takes a new optional `monthCounts` prop. Falls
  back gracefully when absent (uniform-rhythm strip, same
  drag UX).

Build refresh attached.

Signed-off-by: Frank Karlitschek <frank@nextcloud.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@karlitschek

Copy link
Copy Markdown
Member Author

@codecov

codecov Bot commented May 4, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 0% with 52 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/components/DateScrubber.vue 0.00% 43 Missing ⚠️
src/views/TimelineView.vue 0.00% 9 Missing ⚠️

📢 Thoughts on this report? Let us know!

@jancborchardt jancborchardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Will check :)
@karlitschek as with the other pull requests as well, it would be very helpful to have before/after screenshots, to quickly know what to look out for.

@skjnldsv

skjnldsv commented May 5, 2026

Copy link
Copy Markdown
Member

And I see a lot of them are based onto other branches, which makes it very hard to know what the actual set of changes is this about.

Could you adjust and make each PR against master ? :)
Or maybe explain the order we should review if they are all dependent on each others ?

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