Let a page be read live as a frame and element slices

Convex re-runs a live query in full whenever a row it read is written, so
the editor's page:getSnapshot subscription re-reads every row of the page
after every edit: 58.5 KB on an 87-element page, measured on a local
deployment with dev's data. Add page:getFrame (the page, its settings, its
lineups and their images) and page:getElementSlice (the page's elements in
one public-id range, with their images, and picture aliases apart), backed
by a new elements.by_pageId_and_publicId index. Read as a frame plus slices
covering every id, a page holds what page:getSnapshot returns, and an edit
re-runs only the slice holding its row: 10.7 KB with 8 slices.

Additive only: getSnapshot answers as before (now sharing its helpers), and
no client reads the new queries yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32dc730d82Dara Adedeji committed on 10/19/2026, 8:13:08 PMparent5c7b867

Checks

Some checks failed
9 files changedLine totals unavailable