## sinelaw/fresh — v0.4.10…v0.5.0

_201+ commits._

### Features
- **feat(web): the dock is the display list, and each theme dresses it** (acc71ea)
- **feat(shell): a button's frame is its class's, not its label's** (e0cd5de)
- **feat(ui): a class slot beside the theme key** (d56b40a)
- **feat(welcome): an interactive welcome screen, as a ladder** (e96e9d6)
- **feat(widgets): fifteen host fixes and three new plugin-API primitives** (b7a5c2c)
- **Add four fresh-ui capabilities and move the plugin panels onto them** (f886c91)

### Fixes
- **perf(web): the tree is a region, so a hover repaints one** (572a74c)
- **fix(plugins): avoid redundant explorer path canonicalization (#3127)** (1124d8a)
- **fix ssh bootstrap when target is windows (#3145)** (4ecc89f)
- **perf(review diff): the unified stream is git's own output** (290496f)
- **perf(host): three costs that scale with a plugin-composed buffer** (546d223)
- **git plugins: pin every config knob that reshapes the parsed patch output (#3199)** (fb6dfd7)
- **fix(lsp): make request timeouts visible, push settings after initialized, keep inlay hints in place (#3159)** (147bd98)
- **fix(orchestrator): the folder popup keeps the keyboard, and three on-disk names that were not names (#3163)** (8c3483d)
- **fix(welcome): a startup surface — opens once, as a tab, and touches nothing else (#3147)** (89bd401)
- **fix(lsp): move Deno detection out of the editor and into a plugin (#3168)** (5ba2993)
- **fix(render): tab markers, indentation guides, block rectangles, angle brackets, and an explorer scrollbar (#3161)** (01ce509)
- **fix(editor): deno runtime detection (#3111)** (d9ef3a8)
- **fix: generated test-root paths broke on Windows** (7b60f1d)
- **fix: point the locale tests at the crate that now owns locales/, and stop** (8dfd09e)
- **fix: repoint the theme-diff job and packaging at the moved test target and assets** (8608fb8)
- **Fix the CI failures and hangs, and drop the web's plugin-panel view** (8aba3b9)
- **Fix the paint and scroll bugs the described surfaces exposed** (99687c2)
- **Describe the settings navigation chrome and fix the described panels** (f728078)

### Backend
- **Bump version to 0.5.0** (0096112)
- **CHANGELOG.md** (095a922)
- **A click on a dock widget takes the keyboard with it** (28f7b60)
- **A dock that stands on its own ground** (f9c17d0)
- **The terminal's cursor is the terminal's, and the ground it inverts states both its colours** (b49926d)
- **Quitting accounts for every workspace, and never deletes work it was not shown (#3221)** (c838a45)
- **A clip of the welcome screen: scroll to the theme card, then use it (#3228)** (e7a346f)
- **The welcome screen's lower levels index the editor, not summarise it (#3226)** (c52ad94)
- **A keystroke costs the same at either end of a line** (6cb0928)
- **A walk that indexes the file must read the position the status bar then shows** (75bfed1)
- **Paging, selecting and the horizontal clamp count lines, not read pieces** (8e0d5cf)
- **A row a pane draws is a window into its line, not the line up to it** (2dfcf29)
- **Viewport edge shading: not over the caret, and not on a guess** (11d4a63)
- **The row a pane draws is the pane's width, and structure is walked not read** (6595227)
- **core: answer where a line begins and ends without reading the line** (0556984)
- **The Welcome page is a document: centred boxes, focus where the reader is, and a selection they can see** (807da4e)
- **A block selection's highlight is what a block copy takes** (c799418)
- **Scrolling by scrollbar leaves the cursor where it is (#3192) (#3220)** (2648c86)
- **Focusing a sidebar section opens it, and the tree is found by kind** (fbddf64)
- **Showing the file explorer means the tree, not just its column** (e45a9dc)
- **Review Diff: cap at 1 MiB, and cap every git diff** (5d4d80d)
- **Review Diff: a huge file is summarised, not expanded** (a4f43a8)
- **Update CHANGELOG.md for 0.4.11** (3267c37)
- **A signalled editor hands the terminal back before it goes** (1194339)
- **terminal: a paste the child asked to be bracketed is bracketed** (0265401)
- **cursor: a read piece is not the next line, so Down can stop at the end** (8705d22)
- **viewport: address rows by byte where no wrap index can exist** (b20ded5)
- **viewport: answer a line's height from as much of it as the screen needs** (8ed7ebe)
- **buffer: a large binary file loads lazily, like large text** (42af332)
- **Shift+wheel scrolls sideways, everywhere** (17b2c22)
- **search & replace: read the whole of a long match, and stop moving a hidden cursor** (8d12efe)
- **keybindings: one name for a key, shared by the decoder and the config** (735053c)
- **Compose mode belongs to a pane, and a table's padding is not content (#3206)** (566ad6c)
- **The welcome page as a described pane: what manual use found** (ededcf5)
- **#3194's focusFollowsCursor, ported onto the tree as the page's reading row** (045a65c)
- **L5's library half: a text run's caret, selection and rows are bytes of its own string** (f5e22aa)
- **L15 and L12: what a flex child contributes to a measure, and a ground that keeps its text** (3c30015)
- **S7 the pane is a host leaf: its chrome, one paint, and a gate that says so** (7d3cf85)
- **S3+S6+S5 the described surfaces: panels, menus, settings and the file browser** (a8dc82a)
- **S1+S2 focus and keys: the description is the one fact, and the claim is the tree's word alone** (0046f9f)
- **A panel that opens hidden is told the width it was given (#3188)** (d7ac9c7)
- **Feature clips live next to the features they film, and one for the chrome migration (#3193)** (8c0d341)
- **Wave: end the show when the reader comes back, in every frontend** (27d099e)
- **host: let a plugin hand the host a composed diff stream** (0a45c33)
- **Welcome screen: keep the caret and the focus ring on the same thing (#3194)** (9c91fde)
- **update: resolve releases the way the install script does (#3198)** (4176b65)
- **Search results preview the file itself, as a preview tab (#3200)** (4aabc24)
- **review-diff: measure a row's gutter, don't assume it** (c6fad11)
- **highlight-engine: declared regions ride the marker list, like the checkpoints beside them** (d217118)
- **highlight-engine: declared regions belong to the buffer, and a hunk row is source** (4cdc1e7)
- **tests: the word-level diff still wins over the syntax colour on a changed row** (4b4d6a8)
- **highlight-engine: a plugin declares where a composed buffer carries code; the host colours it** (cd564ce)
- **Highlight source code embedded in unified diffs** (03b6b98)
- **Auto-indent: Enter on the blank last line of a text file keeps the cursor's column (#3181)** (8daf186)
- **Status bar line number follows an added or removed cursor (#3179)** (212d8de)
- **A plain mouse click collapses multiple cursors to one (#3182)** (2a72cca)
- **Prepare CHANGELOG.md for 0.4.11 (#3174)** (1600ff9)
- **Three process-lifecycle fixes: the daemon's locale (#3149), the stdin spool file (#3134), and the signal handler that crashed on the way out (#3157)** (e920a74)
- **Multi-cursor: a skip-over lands past its delimiter when an earlier cursor inserts (#3180)** (da45918)
- **Give the process-globals the integration tests share a single owner (#3178)** (5eb1781)
- **review-diff: a discard that discards, and a panel that follows the working tree** (e0022f5)
- **markdown: type brackets and quotes literally by default** (eb068b1)
- **editing: make auto-surround independent of auto-close, as documented** (89acd76)
- **input: bracketed paste into buffer-mounted panels, search rows windowed onto their match, symbolic key names (#3154)** (64b75a6)
- **keybinding editor: delete really removes a built-in binding; a user's single key outranks a built-in chord prefix (#3172)** (c310075)
- **Multi-cursor: a keystroke that only moves cursors is no longer dropped (#3158)** (c9af3d7)
- **terminal: carry the dim attribute (SGR 2) out of the grid** (6e95478)
- **terminal: make every transcript handle O_APPEND, and narrow the write-error path** (79899d7)
- **terminal: stop truncating live scrollback out of the backing file (#3151)** (152e8d8)
- **plugins: markdown_toc — a Contents sidebar section for Markdown** (cf626fc)
- **input: go-to-line fires cursor_moved, and a section's keys are not the buffer's mode's** (498fb6c)
- **sidebar: a column of collapsible sections, with plugin panels as sections** (8abfe00)
- **Dragging a divider keeps up with the pointer (#3140)** (fa4efb7)
- **Two wrap-index repair bugs around conceals: a char-boundary panic and a mis-spliced tail (#3139)** (7eac50c)
- **Split the editor's data layer into fresh-editor-core** (54b9e95)
- **Retained-mode Stage 2b: drop the scratch grid (#3135)** (7bcc8ff)
- **render: prepare the grid once per frame; count composite-side builds** (18c98b9)
- **tests: one placement, one format, one row build per pane per frame** (f76b314)
- **render: reconcile panes before the frame; the formatter reads and builds once** (bd824ec)
- **render: drop the dead third build_view_data pass and resolve the gutter per pane** (741c03f)
- **Retained-mode migration plan, the pane content seam, and a UI tree dump** (47483e8)
- **Answer leaf-set queries from the leaf set, not a probe layout** (b7cbacb)
- **One geometry pass per frame: pane rects off the shell tree** (22cd3f2)
- **fresh-ui: paint text by display width, measure Wrap::None without joining** (22df6e3)
- **Stop off-loop plugin work from owning the editor's tokio runtime** (6b76fd3)
- **Stop rendering a described panel just to resolve its state** (8a22e12)
- **Split widget hit identity from geometry, and let a panel decline a key** (867a0eb)
- **Map wrapped text in both directions from one recorded source range** (62b4e09)
- **Put the plugin widgets on the tree's focus ring** (c6b27ac)
- **Stop the render walk writing widget state, and delete the painted path** (ac50910)
- **The single-line field and the dual list leave the collector** (604a49c)
- **Memoise the static chrome and record theme provenance in the fold** (6fe15da)
- **Border styles, repaint fixes, and a plan for the retained half** (f9517ee)
- **A buffer-mounted panel becomes a subtree inside its pane** (e498b93)
- **A described panel answers its own hover, presses and drags** (0a10b50)
- **Route the prompt, dock and panel keyboards through the widget tree** (eb3061e)
- **Restore the affordances the described surfaces had quietly lost** (f4b50bd)
- **Describe the dock's contents and delete the pane-rectangle record** (1fc13c2)
- **Read pane rectangles from the layout tree, not the paint record** (9843599)
- **Modal keys become containment, and resize grips capture the pointer** (4a53778)
- **Let a layer own the keyboard, and move menu and popup keys onto it** (afcf620)
- **Make the settings dialog a description, and delete SettingsLayout** (d663f1d)
- **Describe the keybinding editor, event-debug dialog and settings chrome** (c5ef4e9)
- **Describe the calibration wizard and keybinding modal, drop stale rects** (fb60533)
- **Describe the last plugin widget kinds, closing the coverage boundary** (61295b8)
- **Turn plugin widget specs into described nodes and mount panel interiors** (2013bfe)
- **Describe the plugin panel's frame and derive separators from the tree** (d8b7fa7)
- **Scope the shell tree per window, and drop three per-frame fields** (5cdd160)
- **Paint the prompt row through the fold; strip buttons become nodes** (39c4e4c)
- **Answer pane geometry from the nodes, and repaint on hover again** (c519c92)
- **Give each pane its own host so it paints at the rectangle layout gave it** (3de1db1)
- **Withdraw the per-item-key deprecation and keep WidgetSpec unchanged** (603b320)
- **Delete the chrome memo contract's prose and its emptied shells** (8697f29)

### Tests
- **test: reach the shared helpers from master's new retained_pane_rects root** (fe8e10d)
- **test: wire master's two new test roots into the merged binary** (194a6d0)
- **test: stop the LSP drain test reading the server's log mid-backlog** (f007a1a)
- **test: wire ui_shell_frame_parity in, and make the root list check itself** (3519d96)
- **test: rename the two insta snapshots for the merged test binary** (03e7f01)
- **test: build fresh-editor's integration tests as one binary** (cd92aed)

### Docs
- **docs(internal): a class, and what each backend makes of it** (83579c0)
- **docs: one design and plan for the retained-mode UI** (d8fd509)
- **docs(internal): design the sidebar as a column of sections (#3045)** (328a9f2)
- **docs: record what the fresh-editor-core split actually bought** (31a6aa9)

### Chore
- **build: discover the integration-test roots instead of listing them by hand** (46e4258)
- **build: stop one vte feature flag from compiling the crate twice** (e0441b4)
- **build: cut dev/test build time by dropping debuginfo and the git-ref dep** (a263cad)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/sinelaw/fresh?utm_source=github-action)._