Goldie Blocks

One Page Header for Every Page

Every page draws the same header — an actions menu, a status chip and a last-edit line opening the history — and the Draft / Published footer latch and the editability badge are removed.

In plain terms: every file in the office gets the same cover sheet. Top left, a menu of what you can do with the file; top right, a tag saying who holds it and where it has been filed; at the foot, who last touched it, with the register of everything since.

Sixth revision — 2026-10-01, owner answers

  • The button says the act, not the number: Publish, Add to <Library>, or Up to date (disabled). The note above it carries the number ("Save as version 4 and publish").
  • After a publish the tab stands published: "Version 4 is already published" and Up to date, until a new Library is ticked.
  • "Source: <working document>" opens the working copy in the same tab, with no ↗ (answer 1B).
  • Published Library edits read "v3 · edited in Library" in the Library rows, the readout and the tooltip (answer 2B). A Library copy is sealed as its version 1 when made, so a later version it holds is a published Library edit.
  • On a Library Document's own page, the Library's Owner may untick to withdraw, after "Withdraw from …?"; others see the tick disabled. The server refuses anyone but the Owner (withdrawLibraryItem; answer 3B).

Fifth revision — 2026-10-01, Library Documents (owner, answers 3B and A)

Applies to Library Documents only (Libraries hold Documents).

  • Source link. A Library Document's readout reads "Source: <working document> ↗", linking to the working copy it was published from (the lineage recorded at publish, derivedFromFolioKey). When that copy is deleted or the viewer holds no seat on it: "Source unavailable", no link.
  • Publishing Library edits. An Owner or Builder who unlocked and edited a Library Document can publish those edits as its Library's next version: the same Library tab and attestation, limited to that Library (publishLibraryEdits, convex/library/libraryItemWrites.ts).
  • Library edits are tracked, not stored: a copy has Library edits when its draft differs from its last sealed version or a later version was sealed than the one its Library holds (convex/library/libraryEdits.ts). Its readout then adds "Edited in Library since v4".
  • Publishing over Library edits warns. From the working copy, the Library tab says "Precedents has edits made in the Library since v4. Publishing will replace them." with Continue and Open Library item. The server refuses such a publish unless the call carries replaceLibraryEdits.

Fourth revision — 2026-10-01, late (owner)

Supersedes the third revision's two dialogs and menu.

  • One Share button, one dialog. Top right, a labelled button (people icon and "Share"), the avatar readout beside it. It opens one dialog (Dialog atom) with tabs Share | Library | Download, in that order (kept in PAGE_SHARE_TABS, page-share-dialog.tsx, so a reorder is one line). The avatars open it on Share; "Published in N" opens it on Library.
  • Share tab: add by email and the people with access, as before. No link sharing or "general access".
  • Library tab: the publish panel of the earlier revisions (checkboxes at the left, truncated names, withdraw confirmation). Above the button a note says what will happen: "Save as version 2 and publish", or with nothing changed "Version 2 is already published", with Add v2 to <Library> or a disabled Up to date.
  • Download tab: Word (.docx) or PDF, then Download, through the same exports as the card menus' Export ›, of the edition shown. The card menus keep their Export › (it also offers YAML and JSON).
  • Which pages get what. Sharing is Document level and above: Workspace, Project and Library show the Share tab alone (no tab strip); a Document shows all three. A Module's or Block's page has no Share button at all; its access is its Document's, and the server refuses seats on a Module or Block ("Share the Document instead."). Publishing is Documents only: no Library tab elsewhere.

Third revision — 2026-10-01, night (owner, seen live)

Share and Publish open dialogs (the Dialog atom, promoted from shadcn's Base UI dialog) for more room, instead of menu flyouts. The header button's menu keeps two plain items, Share… and Publish… (Publish on Documents, Modules and Blocks only); the readout's avatars open the Share dialog and its "Published in N" opens the Publish dialog directly. Each dialog has a title ("Publish Cooking Services Agreement"), a description line, its sections and a footer with Cancel and the one action.

  • Ticks are real checkboxes at the left of their row (the owner's rule: the tick box sits left), never a menu row with a trailing check. Clicking a Library's name ticks its box. A long Library name keeps to one line, cut with an ellipsis, the full name on hover.
  • The button says what will happen. "Publish v4" when the working copy changed; with nothing changed, "Up to date" (disabled) until a new Library is ticked, then "Add v3 to Estate Planning".
  • Withdraw from <Library>? uses the shared confirmation dialog.
  • Publishing lives only in the header. The card menus' Publish to Libraries › row is removed (owner, 2026-10-01).
  • A Library copy made by the older card-menu publish from a live draft shows no version number in the Publish dialog.

The second revision below stands for everything else (snapshot, attestation, readout); where it says "flyout", read "dialog".

Second revision — 2026-10-01, evening (owner)

Supersedes the button group of the revision below; the people popover's contents move into the Share flyout. GB-333.

  • One button, top right: a people icon and the seat count (no number when it is only you). It opens a menu with two parent items, each a flyout, built from the same menu atoms as the folio cards' menus: Share › on every page and Publish › on Documents, Modules and Blocks only.
  • Share › holds the people and seats, where an inherited seat comes from ("from Project: …"), the add-by-email field and the seat changes Owners and Builders may make. On a Library item: the Library's people, read-only, with Unlock to edit / Lock again. On a Library: Listing.
  • Publish › reads "Publishing v4", then "Field data will not appear in the Library version." and an attestation tick, "I have removed sensitive content from the text." The tick starts unticked every time the flyout opens; until it is ticked the Libraries and the button are disabled. Each Library row is a tick, the Library's name, a ↗ link (new tab) and, when it already holds a version, that version and date ("v3 · 30 Sep").
  • Publishing is a snapshot. It seals the working copy as vN, files that sealed version in every ticked Library and leaves the author in a fresh working copy vN+1, silently. Later edits never reach a Library until published again. With nothing changed since the last version the button reads "Add v3 to Estate Planning" and files that version; it never mints an identical one. Unticking a Library that holds a version asks "Withdraw from <Library>?" first.
  • Field data is always stripped from the Library copy; there is no option. The server refuses a publish without the attestation.
  • The author stays on the page. Nothing navigates after publishing and no toast appears; the readout updates. The way to a Library is the ↗ link on its row in Publish ›, the only place Library links live. The flyout says nothing about the snapshot beyond its heading.
  • Left of the button, a muted readout, part of the control: the stacked avatars of the other seat holders (three, then "+N"; named for screen readers "Shared with Jane Smith, Tom Lee and 3 others") · "Published in 1 Library" / "Published in N Libraries". No "Shared with" words; either part is left out when empty. Not link-styled. Clicking the avatars opens the menu at Share ›; clicking the publish text opens it at Publish ›, and its tooltip names the Libraries.
  • Code: src/shared/ui/molecules/page-frame/page-header.tsx (the button and menu), src/features/publish-to-library/ui/publish-panel.tsx, and convex/library/snapshotWrites.ts (publishSnapshot, withdrawSnapshot, snapshotPanel).

In plain terms: one tag on the cover sheet. Open it to see who holds the file, or to file a signed-off copy in one or more Libraries. Filing freezes today's text as numbered edition 4 (with the client's answers removed) and you carry on in edition 5; the Library keeps edition 4 until you file again.

Revision — 2026-10-01, later the same day (owner)

Superseded in part by the second revision above. Supersedes rulings 3 and 5 below; the rest stand.

  • Top left is empty again. The actions tile is removed.
  • Top right is one button group (the ButtonGroup atom): at rest only the people button, a users icon and the number of people with a seat (no number when it is only you). Its accessible name reads the whole status: "Shared with 2 Builders, 3 Makers; you are Owner".
  • It opens out to the left on hover (mouse), on keyboard focus inside it, or once tapped: [ Share | Publish | people ]. Share opens the existing Share flow. Publish is Save to Library and appears only on Documents, Modules and Blocks; elsewhere the group is [ Share | people ].
  • The people button opens the popover: people and seats, where an inherited seat comes from, and the remaining items — a Library's Listing, a Library item's Unlock to edit / Lock again, and the "In My First Library" and "Published · Updated <date>" lines.
  • Segments share the gutter tiles' 32px height, radius, line and white fill; an open segment turns ink, as every open mark does.

In plain terms: the cover sheet's corner now holds one small tag showing how many people hold the file; point at it and "Share" and "Publish" slide out beside it; click the tag for the full list.

The rulings (owner, 2026-10-01)

  1. One header component for every page. Workspace, Project, Document, a Module's or Block's own page, a Library and a Library item all draw the same header, fed by props. No screen styles its own. Code: src/shared/ui/molecules/page-frame/page-header.tsx, drawn by PageFrame.
  2. The header is about editability, sharing and publishing only. Insert and Insert into… belong to the list toolbar under the header card, never to the header's menu.
  3. Top left, an actions menu, opened from a tile that is the header card's own mark tile — same size, radius, line and white fill, inverting to ink while open — standing directly over that mark. Share / invite… on every page, with four seats: Owner, Builder (changes structure), Maker (fills fields only) and Reader (views). Save to Library… on Documents, Modules and Blocks only, never on a Workspace or Project. A Library adds Listing (Private, Listed, Open). A Library item adds its lock (Unlock to edit / Lock again), which the footer latch used to hold.
  4. Sharing at any level inherits down. A seat on a folio covers everything inside it; the existing members rule (Libraries schema, Sharing) already says so.
  5. Top right, a status chip. "Only you" when nobody else holds a seat; otherwise "Shared · 2 Builders · 3 Makers", counting inherited seats. Then your own seat ("You · Builder"). A Document, Module or Block adds the Libraries it is saved to; a Library its listing; a Library item "Published · Updated <date>". Clicking it, or hovering with a mouse, opens the people and their seats, and where an inherited seat comes from.
  6. At the foot, "Last edited by <who> · <date> ▾". The arrow opens the history: who, when and what (edited, saved to Library, shared, restored), as far as the stored record reaches.
  7. Removed: the Draft / Published footer latch (PublishState, the frame's publish slot and the badge's "Approve ↓" action) and the lid's editability badge ("Editable", "Fields editable", "Read only"). The top bar's Builder / Maker preview switch stays.

Owner answers — 2026-10-01

  1. Everyone with a seat sees who has access, read-only; only Owners and Builders may change it, and only they see emails. folio/folioMembers.list answers any seat holder (canShare says who may change it) and nobody without a seat.
  2. An inherited seat names its source: "from Project: Smith Estate", "from Workspace: …", "from Library: …". The list returns the source folio's kind and name.
  3. Full history stays "Coming soon". Today the list holds the last edit (folioVersions.editedAt / editedBy) and a Library item's publication dates (libraryPins, which record no publisher).
  4. No Update from working copy or Withdraw on Library item pages.
  5. Libraries keep no Maker seat.
  6. A Library item is shared only through its Library. Its page offers no Share; its people popover shows the Library's people, read-only, "from Library: <name>".

On this page