mirror of
https://github.com/penpot/penpot.git
synced 2026-10-29 14:00:37 +00:00
Four defects the first by-hand pass found, and one of them was a lie the copy told. The exit door has a button. The limits dialog and three refusal messages told a user that any branch can become an ordinary file, and nothing under `frontend/src` called the command that does it. The kebab now carries the action between Archive and Delete for an open branch, behind a confirmation whose copy says what is kept and what is lost: the content stays, and the file stops being a branch, so it can no longer be compared with main or merged into main. The counters say what they count. Both spans carry a title naming the direction and the unit, which is entity-level changes across shapes, pages, components, colours, typographies, media, and tokens, and stating that saves are not counted. That reading is what made a jump from 7 to 420 look like a regression when the number was right. The update resolver showed each side's values under the other side's heading, and the cause was not a swapped label. The conflict payload is role-keyed rather than document-keyed: `compute-merge*` runs the update direction with the branch as `theirs`, and `three-way-entities` writes `:main` for `theirs`, so an update hands the branch under the key named `:main`. One binding re-keys each conflict's two sides, and the values inside `:changed-attrs` with them, in update mode only. The headings, the chips, and the resolution keywords then all speak documents, the bulk buttons select the side they name, and the merge mode is unchanged by construction rather than by inspection. The modal's fallback diff fetch now also runs in the mode's own direction, so its key space matches. The two bars keep off each other. The banner publishes the room it takes from the bottom edge as one custom property, measured from its live box, and the palette lifts itself by that value. So the offset follows the collapsed and the expanded state, and no literal is repeated in two stylesheets. Verified in the running frontend rather than by inspection: both namespaces reload with no warnings, the re-keying is an involution on a synthetic update conflict with base, id, reason, and label intact, the real row component renders the new menu for open, archived, and merged rows, and the confirm's accept path reaches the backend command with the branch file id.