Skip to content

[pull] main from TryGhost:main - #1529

Merged
pull[bot] merged 9 commits into
code:mainfrom
TryGhost:main
Sep 30, 2026
Merged

pull[bot] merged 9 commits into
code:mainfrom
TryGhost:main

Conversation

@pull

@pull pull Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

peterzimon and others added 9 commits September 30, 2026 08:13
Refined the React posts and pages lists after release, with one commit
for each item in
[PLA-462](https://linear.app/ghost/issue/PLA-462/post-release-refinements).

- Restored normal letter spacing for list titles.
- Used Shade's focus ring for keyboard navigation within rows.
- Darkened empty thumbnails on hover in both color schemes to
distinguish them from the row background.
- Replaced native action titles with white Shade tooltips with an
explicit one-second hover delay (overriding the sidebar’s zero-delay
provider); action icons match the muted analytics icons and darken on
hover while the button stays white.
- Increased draft, scheduled, and error statuses to medium weight.
- Changed the pages context-menu label to “Copy link to page.”
- Used an outline button for “Show all posts/pages” in filtered empty
states.

Validation: all 383 posts-list unit tests and 130 browser acceptance
tests pass, including analytics/edit tooltips and resource-specific
copy-link labels. Admin typecheck passes. Visually checked the posts and
pages lists in the running development site.
Once the React editor had a post on screen, a failed background read of
it (after a save, or on reconnect) replaced the editor with "Couldn't
load this post." or the not-found page. That disposed the editing
session and lost everything typed since the last save.

- The loader now shows the load error or not-found page only for a read
that never produced the post.
- With a post on screen, the editor stays and the next save's own
outcome takes over as before: the deleted banner, the sign-in dialog or
the conflict banner.
#31084)

no ref

Cmd/Ctrl+K in the editor is the link shortcut; we needed to suppress the Search shortcut from Admin.
no ref

The React editor kept no browser-local copies of drafts, so `/restore` had nothing to offer for work lost in it (a crash, a closed tab, an exit that skipped the leave guard).

- Drafts with unsaved changes are copied to local storage in the format
the restore screen reads (`post-revision-<id|draft>-<timestamp>`).
Published, scheduled and sent posts are never copied.
- Only the writer's changes count. The change tracker decides, so
Koenig's load-time normalisation of an opened post never writes a copy.
- The first change writes at once, then at most one copy a minute. A
copy is also written straight away when the tab is hidden, the editor
unmounts with unsaved work, a history revision replaces the body, or a
save stops on a conflict, deleted post, expired session or crash.
- Each post keeps its newest five copies; an uncreated post keeps five
per session and re-keys them once created. When storage is full the
oldest copies go first. Storage failures go to Sentry and never
interrupt editing.
ref https://github.com/TryGhost/Ghost/actions/runs/36679131769/job/109770756659

Flaky test patch. 

The member-import acceptance test can send Escape before the reopened composite-field picker is interactive.
)

ref https://github.com/TryGhost/Ghost/actions/runs/36625576562/job/109602176335

Flaky test patch.

The Author-role posts-list test failed during teardown with an unhandled `POST /stats/posts-member-counts/`, even though the failure's route listing includes that exact fake. This is consistent with a request arriving after teardown removes the test's handlers.
no ref

With unsaved work in the React editor, browser Back/Forward, a trackpad swipe or a hash change made outside the router left without the leave decision, and the work was lost. The editor's history entries usually come from plain hash links, not the router, so React Router's blocker can't undo those pops. It let them through, or "undid" them with `history.go(0)` (a reload) or a jump several entries back.
no ref

When a newsletter failed to send, the React editor's status line reported it with nothing to act on, and the publish flow's email-failure step was unreachable.
no ref

`/restore` is now a React screen in the editor domain. The Ember route, controller, template, tests and the local-revisions service methods only it used are removed; the Ember editor still writes copies.

This has received some minor UI updates/fixes.
@pull pull Bot locked and limited conversation to collaborators Sep 30, 2026
@pull pull Bot added the ⤵️ pull label Sep 30, 2026
@pull
pull Bot merged commit 8f6727f into code:main Sep 30, 2026
1 check passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants