Cells are normal blocks (text, bind unlabeled, free controls, …). No nested table or scroll. Bind/slider/toggle inside cells must omit label/label_key (put copy in an adjacent cell). Empty {} or null = spacer. Cell blocks may override align_h / align_v.
Early — not final UX. The slot grid works; layout, labels, and comfort (filters, previews, per-story views) are not polished yet.
Slot grid for opt-in save / load screens. Clicks emit save_slot:N or load_slot:N.
Key
Type
Default
Effect
mode
"save" | "load"
"save"
Save writes a slot; load opens occupied compatible slots
columns
int
3
Buttons per row (1–6)
style
string
"menu_button"
Button theme prefix
empty_label / empty_label_key
string
Slot {n} — Empty
Empty cell; {n} = slot number (literal token, not a story flag)
occupied_label / occupied_label_key
string
Slot {n} — {node}
Occupied; {n}, {node}, and (multi-story) {story} / {story_title}
spacing / row_gap
int
10
Gaps
Slot count comes from session.save_slots (see Save and session). Empty load cells are disabled. No built-in save / load screens ship — build them yourself with this block, then point menus at screen:save / screen:load (immediate "save" / "load" stay slot 1).