Block Kit

Auf dieser Seite

EmDashs Block Kit ermöglicht es Sandboxed-Plugins, ihre Admin-UI als JSON zu beschreiben. Der Host rendert die Blöcke — vom Plugin bereitgestelltes JavaScript wird nie im Browser ausgeführt.

Wie es funktioniert

  1. Benutzer navigiert zu einer Admin-Seite des Plugins
  2. Der Admin 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. Der Admin rendert die Blöcke mit der BlockRenderer-Komponente
  5. Wenn der Benutzer interagiert (Button klickt, Formular absendet), sendet der Admin die Interaktion zurück an das Plugin
  6. Das Plugin gibt neue Blöcke zurück und der Zyklus wiederholt sich
// Plugin Admin-Route Handler
routes: {
  admin: {
    handler: async (ctx, { request }) => {
      const interaction = await request.json();

      if (interaction.type === "page_load") {
        return {
          blocks: [
            { type: "header", text: "My Plugin Settings" },
            {
              type: "form",
              block_id: "settings",
              fields: [
                { type: "text_input", action_id: "api_url", label: "API URL" },
                { type: "toggle", action_id: "enabled", label: "Enabled", initial_value: true },
              ],
              submit: { label: "Save", 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: "Settings saved", type: "success" },
        };
      }
    },
  },
}

Blocktypen

TypBeschreibung
headerGroße fette Überschrift
sectionText mit optionalem Zubehörelement
dividerHorizontale Linie
fieldsZweispaltige Label/Wert-Raster
tableDatentabelle mit Formatierung, Sortierung, Paginierung
actionsHorizontale Reihe von Buttons und Steuerelementen
statsDashboard-Metrik-Karten mit Trendindikatoren
formEingabefelder mit bedingter Sichtbarkeit und Submit
imageBlocklevel-Bild mit Beschriftung
contextKleiner gedämpfter Hilfetext
columns2-3 Spalten-Layout mit verschachtelten Blöcken

Elementtypen

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

Builder-Helfer

Das @emdash-cms/blocks-Paket 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 Settings"),
    form({
      blockId: "settings",
      fields: [
        textInput("site_title", "Site Title", { initialValue: "My Site" }),
        toggle("generate_sitemap", "Generate Sitemap", { initialValue: true }),
        select("robots", "Default Robots", [
          { label: "Index, Follow", value: "index,follow" },
          { label: "No Index", value: "noindex,follow" },
        ]),
      ],
      submit: { label: "Save", actionId: "save" },
    }),
  ],
};

Bedingte Felder

Formularfelder können basierend auf anderen Feldwerten bedingt angezeigt werden:

{
  "type": "toggle",
  "action_id": "auth_enabled",
  "label": "Enable Authentication"
}
{
  "type": "secret_input",
  "action_id": "api_key",
  "label": "API Key",
  "condition": { "field": "auth_enabled", "eq": true }
}

Das api_key-Feld erscheint nur, wenn auth_enabled eingeschaltet ist. Bedingungen werden clientseitig ohne Roundtrip ausgewertet.

Probieren Sie es aus

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