github emdash-cms/emdash @emdash-cms/admin@0.9.0

latest releases: @emdash-cms/x402@0.9.0, @emdash-cms/plugin-forms@0.2.0, @emdash-cms/plugin-embeds@0.1.9...
6 hours ago

Minor Changes

  • #731 9dfc65c Thanks @drudge! - Adds a media_picker Block 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 plain text_input — existing content continues to work after swapping. The mime_type_filter is restricted to image MIME types (image/ or image/<subtype>); wildcards and non-image types are rejected.

  • #809 e7df21f Thanks @ascorbic! - Adds an optional category field to PortableTextBlockConfig for 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 a838000 Thanks @arashackdev! - rtl srtyle improvements and LTR/RTL compatible arrow/caret icons

  • #854 491aeec Thanks @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 shared EditorHeader component for editor pages that want the same sticky-header pattern. Fixes #233.

Patch Changes

  • #849 d6754ae Thanks @drudge! - Fixes the datetime field 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 emitted YYYY-MM-DDTHH:mm on save, which the field's zod schema rejected. Strips the suffix for display, appends :00.000Z on save, and normalizes date-only stored values to UTC midnight for the input. Applies to the top-level datetime widget in the content editor and the datetime sub-field type inside RepeaterField.

  • #702 0ee372a Thanks @ilicfilip! - Adds @emdash-cms/plugin-field-kit — composable field widgets for json fields. Four widgets (object-form, list, grid, tags) are configured entirely through seed options so 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.options to Array<{ value: string; label: string }> | Record<string, unknown> so plugin widgets can accept arbitrary widget config (not only enum choices). The array shape for select / multiSelect continues to work unchanged.

  • #856 ef3f076 Thanks @ask-bonk! - Fixes npm install peer dependency conflicts (#819) by removing react and react-dom from dependencies. They were declared in both dependencies and peerDependencies, which made npm think the admin package required an exact pinned React version and conflicted with the host Astro app's React. They remain peerDependencies (^18.0.0 || ^19.0.0), and the host app supplies React.

  • #821 8d0feb3 Thanks @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 /settings sub-route.

  • #862 8354088 Thanks @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 as Invalid character class when compiled with the v (unicode-sets) flag — the mode browsers now use for the pattern attribute. 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 254a443 Thanks @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 25128b2 Thanks @ahliweb! - Fixes malformed ICU plural syntax in Indonesian (id) locale — ContentList item count now renders correctly

  • #872 ab45916 Thanks @ahliweb! - Enables Indonesian (Bahasa Indonesia) locale in the admin UI

  • #807 0913a39 Thanks @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 ddbf808 Thanks @ascorbic! - Fixes content list loading state showing No results for "" instead of a loader while items are being fetched. The trash tab gets the same treatment.

  • #870 1c958fb Thanks @CacheMeOwside! - Fixes the image-settings icon in the Section editor so it actually opens <ImageDetailPanel> in the sidebar.

  • #816 d4be24f Thanks @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 :any qualifier with the more conspicuous :unrestricted. Old names are still accepted with @deprecated warnings; emdash plugin bundle and emdash plugin validate warn for each deprecated name and emdash plugin publish refuses 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 with read:content resolve to content:read and reach the same code path.

    Old New
    read:content content:read
    write:content content:write
    read:media media:read
    write:media media:write
    read:users users:read
    network:fetch network:request
    network:fetch:any network:request:unrestricted
    email:provide hooks.email-transport:register
    email:intercept hooks.email-events:register
    page:inject hooks.page-fragments:register

    Existing installs keep working — manifests are normalized at every external boundary and diffCapabilities normalizes 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

Don't miss a new emdash release

NewReleases is sending notifications on new releases.