feat(admin): make content settings sections reorderable#2185
Conversation
🦋 Changeset detectedLatest commit: 86d30b1 The changes in this PR will be included in the next version bump. This PR includes changesets to release 17 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Scope checkThis PR changes 1,113 lines across 13 files. Large PRs are harder to review and more likely to be closed without review. If this scope is intentional, no action needed. A maintainer will review it. If not, please consider splitting this into smaller PRs. See CONTRIBUTING.md for contribution guidelines. |
@emdash-cms/admin
@emdash-cms/auth
@emdash-cms/auth-atproto
@emdash-cms/blocks
@emdash-cms/cloudflare
@emdash-cms/contentful-to-portable-text
emdash
create-emdash
@emdash-cms/gutenberg-to-portable-text
@emdash-cms/plugin-cli
@emdash-cms/plugin-types
@emdash-cms/registry-client
@emdash-cms/registry-lexicons
@emdash-cms/registry-verification
@emdash-cms/sandbox-workerd
@emdash-cms/x402
@emdash-cms/plugin-ai-moderation
@emdash-cms/plugin-atproto
@emdash-cms/plugin-audit-log
@emdash-cms/plugin-color
@emdash-cms/plugin-embeds
@emdash-cms/plugin-field-kit
@emdash-cms/plugin-forms
@emdash-cms/plugin-webhook-notifier
commit: |
Visual regression: 4 screens changedThese admin screens render differently on this PR. Confirm every change below is intended before accepting.
Maintainers: if every change above is intended, comment Measured head: |
There was a problem hiding this comment.
This PR is a focused, well-scoped feature: it makes the admin content-settings sections reorderable with dnd-kit, stores the order per-user/collection in browser storage, and keeps the mobile settings sheet usable during keyboard/pointer sorting. The linked Discussion is approved, the changeset is present, and the implementation sticks to the admin UI surface (no new backend queries, no SQL, no logged-out route impact).
What I checked:
- Read the full diff and every changed file, plus the surrounding
ContentEditor,TaxonomySidebar,DocumentOutline, andRevisionHistorycode. - Verified Lingui usage: all user-facing strings in the new components go through
t/Trans, and imported section labels are translated before being passed in. - Verified RTL-safe Tailwind: positioning uses logical properties (
insetInlineStart,inlineSize,start/end,ps/pe) and avoids physicalleft/right/ml/mr. - Checked storage reconciliation:
parseContentSettingsLayoutrejects malformed/stale state,resolveContentSettingsLayoutdeduplicates and appends new defaults safely, and localStorage reads are deferred to a client effect to avoid hydration mismatches. - Checked mobile interaction guards:
MobileSidebarPortalGuardnow distinguishes a transient sortable-handle blur from a real sheet-leave, and Escape during keyboard sorting restores the sheet after Kumo's dismissal. - Checked tests: new unit tests cover layout parsing, keyboard reorder persistence, sorting-state callbacks, and mobile sheet behavior; existing tests were updated for the new handle labels.
Headline conclusion: no blocking issues. The feature is clean, localized, RTL-aware, and respects the existing component boundaries (destructive actions stay outside the sortable list, disclosure sections still collapse, block side panels are unaffected). Nice work.
Overlapping PRsThis PR modifies files that are also changed by other open PRs:
This may cause merge conflicts or duplicated work. A maintainer will coordinate. |
ascorbic
left a comment
There was a problem hiding this comment.
Tested and it works great. Thanks! Making them collapsible would probably be a good addition at some point
|
/accept-baselines |
|
ℹ️ The committed baselines already match the candidates; nothing to commit. |




What does this PR do?
Makes the built-in content editor settings sections reorderable from dedicated drag handles.
Editors can arrange Publish, Ownership, Bylines, Translations, Taxonomies, SEO, Outline, and Revisions around their workflow. The order is stored per user and collection in browser storage, so an arrangement made on one entry remains consistent when another entry in the same collection is opened.
The implementation also:
Discussion: #2184
Type of change
Checklist
pnpm typecheckpassespnpm lintpassespnpm testpasses (or targeted tests for my change)pnpm formathas been runmessages.pochanges except in translation PRs - a workflow extracts catalogs on merge tomain.Screenshots / test output
Validated against current
main/ EmDash 0.30:@emdash-cms/adminproduction build passed;