// fixtures/strip.mjs — the slide strip: one item per slide, each a // server-drawn picture of it (`/d/{sqid}/slides/{id}.svg`, thumbs.go), // the slide's label, and the word "current" on the one on stage. // // An of an SVG, not a scaled copy of the slide's HTML, which is // what this used to be: nine sections with every block and every run // live in the page, re-laid-out on every resize, and a second opinion // about what a slide looks like. One image each is smaller to send, // cheaper to paint, and is the same picture the PDF export is made of, // because both come off one paint list. // // The server renders the whole strip on the page; this keeps it in // line with the Y.Doc afterwards. sync() reconciles the items with the // deck's slide order (adding, dropping, reordering — never re-fetching // on its own), and marks anything it added as dirty; mark(id) marks a // slide whose content changed. flush() re-points every dirty // thumbnail's src at a URL carrying the deck's current seq — and the // caller decides when: after a remote change, straight away; after a // local one, once the save has landed, because until then the server // would draw the slide as it was (or, for a new slide, not at all). // The seq is what makes the browser ask again; the route's ETag is // what makes asking cheap for the slides that did not change. // // Navigation is the URL hash: every item's link is #, and // editor-entry.js loads the stage on hashchange. No click handler for // it — the link is the control, for a pointer and a keyboard alike. // Each item also carries its menu (add after, duplicate, move, delete), // cloned with the item from the page's