Fixes: 1. media.ts: wrap placeholder generation in try-catch 2. toolbar.ts: check r.ok, display error message in popover
33 KiB
@emdash-cms/admin
0.9.0
Minor Changes
-
#731
9dfc65cThanks @drudge! - Adds amedia_pickerBlock Kit element: a thumbnail preview with a modal library picker and mime-type filter. Usable in plugin block forms and in Block Kit field widgets. The stored value is the selected asset's URL string, so it is value-compatible with a plaintext_input— existing content continues to work after swapping. Themime_type_filteris restricted to image MIME types (image/orimage/<subtype>); wildcards and non-image types are rejected. -
#809
e7df21fThanks @ascorbic! - Adds an optionalcategoryfield toPortableTextBlockConfigfor plugin-contributed block types. Plugins can now choose how their blocks are grouped in the admin slash menu (e.g. "Sections", "Marketing", "Media", "Layout") instead of always falling under "Embeds". Existing plugins that omit the field continue to render under "Embeds" exactly as before. -
#814
a838000Thanks @arashackdev! - rtl srtyle improvements and LTR/RTL compatible arrow/caret icons -
#854
491aeecThanks @ask-bonk! - Adds consistently-placed sticky Save buttons across editor pages so unsaved changes are always visible. The Content editor, Section editor, Content Type editor, and Settings sub-pages (General, SEO, Social Links) now render their primary save action in a sticky top-right header that stays visible while users scroll long forms. The existing bottom-of-form save buttons are preserved so keyboard and screen-reader users still hit a save action as the last interactive control on the page (DOM order is unchanged). Introduces a sharedEditorHeadercomponent for editor pages that want the same sticky-header pattern. Fixes #233.
Patch Changes
-
#849
d6754aeThanks @drudge! - Fixes thedatetimefield widget so existing values display in the editor and new values pass server validation. The widget passed raw ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) into<input type="datetime-local">, which silently rendered empty, and emittedYYYY-MM-DDTHH:mmon save, which the field's zod schema rejected. Strips the suffix for display, appends:00.000Zon save, and normalizes date-only stored values to UTC midnight for the input. Applies to the top-leveldatetimewidget in the content editor and thedatetimesub-field type insideRepeaterField. -
#702
0ee372aThanks @ilicfilip! - Adds@emdash-cms/plugin-field-kit— composable field widgets forjsonfields. Four widgets (object-form,list,grid,tags) are configured entirely through seedoptionsso site builders don't need to write React to get a usable editing UI. Widgets store clean JSON (no nesting, no mutation of shape), so removing the plugin leaves valid data in the database. See discussion #571 for background.Widens
FieldDescriptor.optionstoArray<{ value: string; label: string }> | Record<string, unknown>so plugin widgets can accept arbitrary widget config (not only enum choices). The array shape forselect/multiSelectcontinues to work unchanged. -
#856
ef3f076Thanks @ask-bonk! - Fixesnpm installpeer dependency conflicts (#819) by removingreactandreact-domfromdependencies. They were declared in bothdependenciesandpeerDependencies, which made npm think the admin package required an exact pinned React version and conflicted with the host Astro app's React. They remainpeerDependencies(^18.0.0 || ^19.0.0), and the host app supplies React. -
#821
8d0feb3Thanks @r2sake! - Fixes the Settings (gear) icon on the Plugin Manager so it links to the plugin's primary admin page instead of a non-existent/settingssub-route. -
#862
8354088Thanks @ask-bonk! - Fixes slug-style<input pattern="...">attributes so HTML form validation works in current browsers. The patterns used[a-z0-9-]+, which is rejected asInvalid character classwhen compiled with thev(unicode-sets) flag — the mode browsers now use for thepatternattribute. The dangling-is now escaped ([a-z0-9\-]+), restoring slug validation in the Sections list/edit, Menus list, and Widgets create-area dialogs. Resolves #845. -
#887
254a443Thanks @ascorbic! - Fixes stale content shown in the Portable Text editor when switching between translations of the same content. Previously, navigating from one locale's editor to another (e.g. from the English version of a post to the French version) kept the previous locale's body in the editor, and any subsequent edit would silently overwrite the new translation's content. The form now resets synchronously when the underlying content item changes, and field editors are keyed by item id so they remount cleanly on a translation switch. -
#885
25128b2Thanks @ahliweb! - Fixes malformed ICU plural syntax in Indonesian (id) locale — ContentList item count now renders correctly -
#872
ab45916Thanks @ahliweb! - Enables Indonesian (Bahasa Indonesia) locale in the admin UI -
#807
0913a39Thanks @ascorbic! - Sizes the plugin block edit modal based on field complexity so Block Kit forms have room to breathe. Simple URL embeds keep the previous compact dialog; forms with several fields get a wider one, and forms containing a repeater open at the largest size. Inputs inside the dialog now fill the available width. -
#815
ddbf808Thanks @ascorbic! - Fixes content list loading state showingNo results for ""instead of a loader while items are being fetched. The trash tab gets the same treatment. -
#870
1c958fbThanks @CacheMeOwside! - Fixes the image-settings icon in the Section editor so it actually opens<ImageDetailPanel>in the sidebar. -
#816
d4be24fThanks @ask-bonk! - Unifies plugin capability names under a single<resource>[.<sub-resource>]:<verb>[:<qualifier>]formula so capabilities read like RBAC permissions, separates hook-registration permissions from data-access ones for clearer audits, and replaces the overloaded:anyqualifier with the more conspicuous:unrestricted. Old names are still accepted with@deprecatedwarnings;emdash plugin bundleandemdash plugin validatewarn for each deprecated name andemdash plugin publishrefuses manifests that still use them.The Cloudflare sandbox bridge and HTTP fetch helper now enforce canonical names (
content:read,content:write,media:read,media:write,users:read,network:request,network:request:unrestricted). Manifests that still declare legacy names continue to work — the runner normalizes capabilities before passing them into the bridge, so installed plugins withread:contentresolve tocontent:readand reach the same code path.Old New read:contentcontent:readwrite:contentcontent:writeread:mediamedia:readwrite:mediamedia:writeread:usersusers:readnetwork:fetchnetwork:requestnetwork:fetch:anynetwork:request:unrestrictedemail:providehooks.email-transport:registeremail:intercepthooks.email-events:registerpage:injecthooks.page-fragments:registerExisting installs keep working — manifests are normalized at every external boundary and
diffCapabilitiesnormalizes both sides so version upgrades that only rename do not trigger a "capability changed" prompt. Deprecated names will be removed in the next minor. -
Updated dependencies [
7b8d496,9dfc65c,a838000]:- @emdash-cms/blocks@0.9.0
0.8.0
Minor Changes
-
#679
493e317Thanks @drudge! - Adds arepeaterBlock Kit element: array-of-objects with scalar sub-fields, drag-to-reorder, and collapsible item cards. Plugin block forms can now capture repeating data (FAQ rows, carousel slides, card grids) inline in the portable-text editor. -
#779
e402890Thanks @ascorbic! - Addssettings_getandsettings_updateMCP tools so agents can read and update site-wide settings (title, tagline, logo, favicon, URL, posts-per-page, date format, timezone, social, SEO).settings_getresolves media references (logo/favicon/seo.defaultOgImage) to URLs;settings_updateis a partial update that preserves omitted fields. Newsettings:read(EDITOR+) andsettings:manage(ADMIN) API token scopes back the tools, with matching options in the personal API token settings UI. -
#398
31333dcThanks @simnaut! - Adds pluggable auth provider system with AT Protocol as the first plugin-based provider. Refactors GitHub and Google OAuth from hardcoded buttons into the sameAuthProviderDescriptorinterface. All auth methods (passkey, AT Protocol, GitHub, Google) are equal options on the login page and setup wizard.
Patch Changes
-
#611
86b26f6Thanks @drudge! - Wires up the block configuration sidebar insideWidgetEditor.PortableTextEditornow receivesonBlockSidebarOpen/onBlockSidebarClosecallbacks that hold the activeBlockSidebarPanelin local state, and rendersImageDetailPanelwhen the panel type is"image"— mirroring the content-entry editor. Without this, clicking a block's settings button or the media picker inside widget content had no visible effect. -
#786
e998083Thanks @smart-cau! - Adds Korean translations for 21 admin UI strings that previously fell back to English. Korean (ko) coverage is now complete. -
#670
37ada52Thanks @segmentationfaulter! - Change text direction of input fields and tiptap editor depending upon the language entered -
#720
acab807Thanks @Pouf5! - Fix taxonomies not nesting correctly in a RTL layout -
#750
0ecd3b4Thanks @edrpls! - Make the admin collection list column headers sortable.Title,Status,Locale, andDateare now clickable buttons that toggle direction; the current sort state is exposed viaaria-sorton the<th>so screen readers announce it correctly.The server's
orderByfield whitelist now acceptsstatus,locale, andnamealongside the existing date fields — unchanged from a security standpoint, the repo still rejects unknown field names to prevent column enumeration.Callers of
<ContentList>that don't passonSortChangerender the previous static-label headers, so legacy integrations (e.g. the content picker) are unaffected. -
#184
4c9f04dThanks @masonjames! - Fixes plugin block defaults so initial values are seeded without overriding later edits. -
#700
ed4d880Thanks @dcardosods! - Prefill site title and tagline in Setup Wizard from seed file -
Updated dependencies [
6e0e921,493e317]:- @emdash-cms/blocks@1.0.0
0.7.0
Minor Changes
- #705
8ebdf1aThanks @eba8! - Adds admin white-labeling support viaadminconfig inastro.config.mjs. Agencies can set a custom logo, site name, and favicon for the admin panel, separate from public site settings.
Patch Changes
-
#680
2e4b205Thanks @CacheMeOwside! - Fixes dark mode toggle having no effect with the classic theme. -
#732
e3e18aaThanks @jcheese1! - Fixes select dropdown appearing behind dialog by removing explicit z-index values and addingisolateto the admin body for proper stacking context. -
#647
743b080Thanks @arashackdev! - Adds Persian (Farsi) locale with full admin translations. Adds Vazirmatn as the default font family for Farsi. -
#689
fa8d753Thanks @edrpls! - Fixes the taxonomy term picker to match across diacritic boundaries.Typing
Mexicoin the admin picker now surfaces a term labeledMéxicoinstead of prompting a duplicate create. Input and term labels are folded via NFD decomposition + lowercase before substring-matching, so editors who type without diacritics — or with locale keyboards that produce precomposed vs. combining forms — still see the canonical term.Before this fix,
"mexico"and"méxico"were treated as distinct strings, so the picker showed zero suggestions and the editor had no way to find the existing term except to create a duplicate. Duplicate terms then split the taxonomy and broke public-facing filter pages that group content by slug.The exact-match check that gates the "Create new term" button uses the same fold, so typing
MexicowhenMéxicoexists also suppresses Create — closing the duplicate-creation loop. -
Updated dependencies []:
- @emdash-cms/blocks@0.7.0
0.6.0
Minor Changes
- #565
913cb62Thanks @ophirbucai! - Adds full RTL (right-to-left) support to the admin UI by converting all directional Tailwind classes to their direction-aware equivalents.
Patch Changes
-
#610
dfcb0cdThanks @drudge! - Passes plugin block definitions into thePortableTextEditornested insideWidgetEditor, so custom plugin-registered block types (image blocks, marker blocks, etc.) can be inserted and rendered inside content-type widgets. The manifest is fetched with react-query in the top-levelWidgetscomponent, flattened into aPluginBlockDef[]list, and threaded throughWidgetAreaPanel→WidgetItem→WidgetEditor. -
#568
cf63b02Thanks @Vallhalen! - Fix document outline not showing headings on initial load. The outline now defers initial extraction to next tick (so TipTap finishes hydrating) and also listens for transaction events to catch programmatic content changes. -
#564
0b32b2fThanks @ascorbic! - Replaces the horizontal language-switch button bar on the admin login page with a dropdown, so the selector stays usable as more locales are added. -
#592
6c92d58Thanks @asdfgl98! - Adds Korean locale support to the admin UI. -
#559
a2d5afbThanks @ayfl269! - Adds Chinese (Traditional) translation for the admin UI, including login page, settings page, and locale switching. -
#604
39d285eThanks @all3f0r1! - Fixes loading spinner not centered under logo on the login page. -
Updated dependencies []:
- @emdash-cms/blocks@0.6.0
0.5.0
Minor Changes
- #551
598026cThanks @ophirbucai! - Adds RTL (right-to-left) language support infrastructure. Enables proper text direction for RTL languages like Arabic, Hebrew, Farsi, and Urdu. Includes LocaleDirectionProvider component that syncs HTML dir/lang attributes with Kumo's DirectionProvider for automatic layout mirroring when locale changes.
Patch Changes
-
#489
9ea4cf7Thanks @all3f0r1! - Adds JSON field editor in admin UI content forms -
#542
64f90d1Thanks @mohamedmostafa58! - Fixes invite flow: corrects invite URL to point to admin UI page, adds InviteAcceptPage for passkey registration. -
Updated dependencies []:
- @emdash-cms/blocks@0.5.0
0.4.0
Minor Changes
Patch Changes
-
#490
3a96aa7Thanks @all3f0r1! - Fixes mobile sidebar nav sections not displaying their pages -
#87
c869df2Thanks @txhno! - Fixes SEO sidebar text fields firing a PUT on every keystroke by debouncing saves; guards against stale server responses overwriting newer local edits. -
#302
10ebfe1Thanks @ideepakchauhan7! - Fixes autosave form reset bug. Autosave no longer invalidates the query cache, preventing form fields from reverting to server state after autosave completes. -
#36
275a21cThanks @scottbuscemi! - Fixes image field removal not persisting after save by sending null instead of undefined, which JSON.stringify was silently dropping. -
#502
af0647cThanks @pagelab! - Adds Portuguese (Brazil) locale with full pt-BR translations following the WordPress pt-BR glossary standard. -
#521
b89e7f3Thanks @ascorbic! - Wraps all user-visible strings in the admin shell and core content screens with Lingui macros so they are translatable. Covers: Sidebar (nav labels, group headings), Header (View Site, Log out, Settings), ThemeToggle, Dashboard (headings, empty states, status indicators), ContentList (table headers, actions, dialogs, status badges), SaveButton, and ContentEditor (publish panel, schedule controls, byline editor, author selector, all dialogs). Runslocale:extractto add 116 new message IDs to all catalog files. -
#528
ba0a5afThanks @ascorbic! - Wraps all remaining admin UI components with Lingui macros, completing full i18n coverage of the admin interface. Catalog grows from 296 to 1,216 message IDs. Covers media library, menus, sections, redirects, taxonomies, content types, field editor, plugins, marketplace, SEO panels, setup wizard, auth flows, and all settings pages. -
#504
e2f96aaThanks @ascorbic! - Fixes client-side locale switching and replaces toggle buttons with a Select dropdown. -
#471
4645103Thanks @ayfl269! - Adds Chinese (Simplified) translation for the admin UI, including login page, settings page, and locale switching. -
Updated dependencies []:
- @emdash-cms/blocks@0.4.0
0.3.0
Patch Changes
-
#351
c70f66fThanks @CacheMeOwside! - Fixes redirect loops causing the ERR_TOO_MANY_REDIRECTS error, by detecting circular chains when creating or editing redirects on the admin Redirects page. -
#499
0b4e61bThanks @ascorbic! - Fixes admin failing to load when installed from npm due to broken locale catalog resolution. -
Updated dependencies []:
- @emdash-cms/blocks@0.3.0
0.2.0
Minor Changes
Patch Changes
-
#467
0966223Thanks @sakibmd! - fix: move useMemo above early returns in ContentListPage -
#349
53dec88Thanks @tsikatawill! - Fixes menu editor rejecting relative URLs like /about by changing input type from url to text with pattern validation. -
#99
3b6b75bThanks @all3f0r1! - Fix content list not fetching beyond the first API page when navigating to the last client-side page -
#247
a293708Thanks @NaeemHaque! - Fixes email settings page showing empty by registering the missing API route. Adds error state to the admin UI so fetch failures are visible instead of silently swallowed. -
#316
c9bf640Thanks @mvanhorn! - Allow relative URLs in menu custom links by changing input type from "url" to "text" -
#377
5eeab91Thanks @Pouf5! - Fixes new content always being created with localeenregardless of which locale is selected in the collection locale switcher. The "Add New" link now forwards the active locale to the new-content route, and the new-content page passes it through to the create API. -
#185
e3f7db8Thanks @ophirbucai! - Fixes field scroll-into-view not triggering when navigating to a field via URL parameter. -
#93
a5e0603Thanks @eyupcanakman! - Fix taxonomy links missing from admin sidebar -
Updated dependencies [
e1349e3]:- @emdash-cms/blocks@0.2.0
0.1.1
Patch Changes
-
#328
12d73ffThanks @jdevalk! - Add OG Image field to content editor -
#200
422018aThanks @ascorbic! - Replace placeholder text branding with proper EmDash logo SVGs across admin UI, playground loading page, and preview interstitial -
#306
71744fbThanks @JULJERYT! - Align back button position in API Tokens section -
#135
018be7fThanks @fzihak! - Fix content list for large collections by implementing infinite scroll pagination -
#181
9d10d27Thanks @ilicfilip! - fix(admin): use collection urlPattern for preview button fallback URL -
#225
d211452Thanks @seslly! - AddspasskeyPublicOriginonemdash()so WebAuthnoriginandrpIdmatch the browser when dev sits behind a TLS-terminating reverse proxy. Validates the value at integration load time and threads it through all passkey-related API routes.Updates the admin passkey setup and login flows to detect non-secure origins and explain that passkeys need HTTPS or
http://localhostrather than implying the browser lacks WebAuthn support. -
#268
ab21f29Thanks @doguabaris! - Fixes passkey login error handling when no credential is returned from the authenticator -
#221
bfcda12Thanks @tohaitrieu! - Fixes form state not updating when switching between taxonomy terms in the editor dialog. -
#45
5f448d1Thanks @Flynsarmy! - Adds Back navigation to Security and Domain settings pages
0.1.0
Minor Changes
Patch Changes
- Updated dependencies [
755b501]:- @emdash-cms/blocks@0.1.0