Skip to content

Tab adornments (CenterDock)

Ephemeral chrome on editor and terminal tabs — leading identity icons, trailing Phosphor indicators, and host-owned Activity. Uses the adorn metaphor (set / clear / flash / bind), not register*. See ADR 0029 and ADR 0030.

There is no ctx.tabs bag and no shared API with future side-panel tab chrome (RFC 0022).

Surfaces

ServiceTarget id
ctx.editorsEditor tab id
ctx.terminalsTerminal session id

Both expose the same verbs via TabAdornmentMethods.

Leading icon (ReactNode)

ts
ctx.editors.setIcon(editorId, { id: "acme.logo", icon: <Logo /> });
ctx.editors.clearIcon(editorId, "acme.logo");

ctx.subscriptions.push(
  ctx.editors.bindIcon({
    id: "acme.logo",
    provide: (editorId) =>
      acmeStore.hasLogo(editorId) ? { icon: <Logo /> } : null,
  }),
);

Trailing indicator (static Phosphor)

You pick a PhosphorIconName (+ optional filled / chip / color). For busy/ready/warn/error chrome use Activity instead.

ts
ctx.terminals.setIndicator(terminalId, {
  id: "acme.flag",
  icon: "Flag",
  chip: true,
  color: "warn",
});
ctx.terminals.clearIndicator(terminalId, "acme.flag");

Activity (host-owned)

Pick an Activity"working" | "ready" | "warn" | "error". The host owns glyph, color, and motion (same dots as workspace status rows; tabs use a slightly larger size). Do not pass icon or color.

ts
ctx.subscriptions.push(
  ctx.terminals.bindActivity({
    id: "acme.busy",
    provide: (terminalId) =>
      acmeStore.isBusy(terminalId)
        ? { activity: "working", tooltip: "Working" }
        : null,
  }),
);

ctx.editors.flashActivity(editorId, {
  activity: "error",
  durationMs: 800,
});

// After mutating store read by binders:
ctx.terminals.invalidateTabAdornments();

Use the SDK ActivityGlyph in your own panels when you want the same glyph (Design System page).

Deprecated shims

ctx.terminals.registerTabDecoration / invalidateTabDecorations / subscribeTabDecorations / getTabDecoration remain as thin deprecated wrappers over bindIndicator / invalidateTabAdornments for extensions that shipped against the older terminal-only API.

Types

TabIconAdornment · TabIndicatorAdornment · TabActivityAdornment · TabIconBinder · TabIndicatorBinder · TabActivityBinder · TabAdornmentColor · Activity

See also