Skip to content

impl(web): filmstrip media list organization - #95

Draft
andykais-ai wants to merge 8 commits into
mainfrom
cursor/web-filmstrip-mode-6cba
Draft

andykais-ai wants to merge 8 commits into
mainfrom
cursor/web-filmstrip-mode-6cba

Conversation

@andykais-ai

@andykais-ai andykais-ai commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • implements a filmstrip layout for the browse thumbnails. Each search result gets its own horizontal strip, and the vertical list still paginates through the existing Scroller. The label/tag line sits below each strip, matching the tile view.
    • images and audio: a single thumbnail in a one-row strip
    • videos: thumbnails evenly sampled to fill the configured rows, with no pagination. Clicking a thumbnail opens the video at that timestamp.
    • series: one thumbnail per series item, paginated through MediaListRune (new series input type) as the strip scrolls right
    • groups: one thumbnail per group entry, paginated the same way. Clicking an entry opens that media reference.
  • implements previous/next page buttons as small circles on the right of each strip, aligned to the top row, so the left side stays clear. Each button disables at its end; the next button only disables once there are no more pages.
  • implements configurable keybinds that apply while a strip is focused:
    • FilmstripNextItem/FilmstripPrevItem (ArrowRight/ArrowLeft) scroll one item
    • FilmstripNextPage/FilmstripPrevPage (PageDown/PageUp) scroll one page
    • FilmstripEnd/FilmstripStart (Ctrl-ArrowRight/Ctrl-ArrowLeft) jump to the end or start
    • NextFilmstrip/PrevFilmstrip (Ctrl-PageDown/Ctrl-PageUp) move between strips
  • implements ui_defaults.media_list.organization: tiles | filmstrip and ui_defaults.media_list.filmstrip.rows. Both are read at startup and can be changed at runtime from the footer (layout toggle, plus a rows selector shown in filmstrip mode).
  • drops ui_defaults.media_view.filmstrip. The key is still accepted and discarded, because forager init wrote it into existing config files.
  • improves the keybind mapper so one key combo can trigger several actions; each handler checks its own context. Note: CopyMedia and ToggleMediaControls both default to Ctrl-C. Before, only the last one bound fired; now both do.
  • fixes a crash when switching to tiles on a group-by page whose group preview is a series. It froze the layout toggle.

Vision Testing

  • seeded a local db (90 generated images, 3 videos, a 60-item series, artist:* tags) and ran forager gui with organization: filmstrip, rows: 2
  • Puppeteer checks on the series strip:
    • ArrowRight/ArrowLeft move one column; PageDown/PageUp move a page
    • Ctrl+Arrow jumps to the end or start
    • the arrow buttons disable at the boundaries
    • Ctrl+PageDown/PageUp move focus between strips
    • at an 800px width the strip loads 30 entries, then 60 as it scrolls
  • measured the arrow buttons' vertical center against the first thumbnail row; they match (127px)
  • clicking the 8.83s thumbnail of a video opens it playing from 8.83s
  • the footer rows selector (1/2/3) resizes the video and series strips; the layout toggle switches tiles and filmstrip on both /browse and /browse?group_by=artist
  • clicking a group entry opens that media; no page errors during any run
  • zod config checks: defaults, new keys, legacy media_view.filmstrip accepted, invalid values rejected
  • deno task --cwd packages/web build:local and deno task --cwd packages/cli test pass

Filmstrip overview
Group by artist filmstrips
filmstrip_demo.mp4

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

cursoragent and others added 8 commits October 13, 2026 21:40
…ings

Replaces the unused media_view.filmstrip config (still accepted and discarded so
existing generated configs keep parsing). Adds footer controls to toggle tiles vs
filmstrip and pick the filmstrip row count at runtime.

Co-authored-by: kaisea.rpi <kaisea.rpi@gmail.com>
Co-authored-by: kaisea.rpi <kaisea.rpi@gmail.com>
Renders one horizontal filmstrip per search result. Images show a single
thumbnail, videos show thumbnails sampled to fill the configured rows (clicking
seeks the video), series and groups paginate their entries as the strip scrolls.

Co-authored-by: kaisea.rpi <kaisea.rpi@gmail.com>
Co-authored-by: kaisea.rpi <kaisea.rpi@gmail.com>
…avigation

Co-authored-by: kaisea.rpi <kaisea.rpi@gmail.com>
…ips to the rows they fill

Co-authored-by: kaisea.rpi <kaisea.rpi@gmail.com>
…mode-6cba

Co-authored-by: kaisea.rpi <kaisea.rpi@gmail.com>
…the top row, labels below the strip

Co-authored-by: kaisea.rpi <kaisea.rpi@gmail.com>
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.

2 participants