Zum Inhalt springen

Block Kit

Das Block Kit von EmDash ermöglicht es isolierten Plugins, ihre Admin-Oberfläche als JSON zu beschreiben. Der Host rendert die Blöcke, ohne dass vom Plugin bereitgestellter JavaScript-Code im Browser ausgeführt wird.

  1. Der Benutzer navigiert zur Admin-Seite eines Plugins
  2. Das Admin-Interface sendet eine page_load-Interaktion an die Admin-Route des Plugins
  3. Das Plugin gibt eine BlockResponse mit einem Array von Blöcken zurück
  4. Das Admin-Interface rendert die Blöcke mithilfe der BlockRenderer-Komponente
  5. Wenn der Benutzer interagiert (auf einen Button klickt, ein Formular absendet), sendet das Admin-Interface die Interaktion zurück an das Plugin
  6. Das Plugin gibt neue Blöcke zurück, und der Zyklus wiederholt sich
// Handler für die Admin-Route des Plugins
routes: {
admin: {
handler: async (ctx, { request }) => {
const interaction = await request.json();
if (interaction.type === "page_load") {
return {
blocks: [
{ type: "header", text: "Plugin-Einstellungen" },
{
type: "form",
block_id: "settings",
fields: [
{ type: "text_input", action_id: "api_url", label: "API-URL" },
{ type: "toggle", action_id: "enabled", label: "Aktiviert", initial_value: true },
],
submit: { label: "Speichern", action_id: "save" },
},
],
};
}
if (interaction.type === "form_submit" && interaction.action_id === "save") {
await ctx.kv.set("settings", interaction.values);
return {
blocks: [/* ... aktualisierte Blöcke ... */],
toast: { message: "Einstellungen gespeichert", type: "success" },
};
}
},
},
}
TypBeschreibung
headerGroße, fette Überschrift
sectionText mit optionalem Zusatzelement
dividerHorizontale Trennlinie
fieldsZwei-Spalten-Grid mit Label/Wert
tableDatentabelle mit Formatierung, Sortierung, Paginierung
actionsHorizontale Reihe von Buttons und Steuerelementen
statsDashboard-Metriken-Karten mit Trendindikatoren
formEingabefelder mit bedingter Sichtbarkeit und Absenden
imageBlockweites Bild mit Bildunterschrift
contextKleiner, dezent gehaltener Hilfetext
columns2-3-Spalten-Layout mit verschachtelten Blöcken
TypBeschreibung
buttonAktionsbutton mit optionalem Bestätigungsdialog
text_inputEinzeilige oder mehrzeilige Texteingabe
number_inputNumerische Eingabe mit Min/Max
selectDropdown-Auswahl
toggleEin/Aus-Schalter
secret_inputMaskierte Eingabe für API-Schlüssel und Tokens

Das Paket @emdash-cms/blocks exportiert Builder-Helfer für saubereren Code:

import { blocks, elements } from "@emdash-cms/blocks";
const { header, form, section, stats } = blocks;
const { textInput, toggle, select, button } = elements;
return {
blocks: [
header("SEO-Einstellungen"),
form({
blockId: "settings",
fields: [
textInput("site_title", "Seitentitel", { initialValue: "Meine Website" }),
toggle("generate_sitemap", "Sitemap generieren", { initialValue: true }),
select("robots", "Standard-Robots", [
{ label: "Index, Follow", value: "index,follow" },
{ label: "Nicht indexieren", value: "noindex,follow" },
]),
],
submit: { label: "Speichern", actionId: "save" },
}),
],
};

Formularfelder können basierend auf den Werten anderer Felder bedingt angezeigt werden:

{
"type": "toggle",
"action_id": "auth_enabled",
"label": "Authentifizierung aktivieren"
}
{
"type": "secret_input",
"action_id": "api_key",
"label": "API-Schlüssel",
"condition": { "field": "auth_enabled", "eq": true }
}

Das Feld api_key erscheint nur, wenn auth_enabled aktiviert ist. Bedingungen werden clientseitig ausgewertet, ohne Roundtrip zum Server.

Nutze den Block Playground, um Block-Layouts interaktiv zu erstellen und zu testen.