From d657aec391d46ca2fe229a76b0665e4bf0a5c65f Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Sat, 25 Apr 2026 19:45:45 +0200 Subject: [PATCH] feat: add support for right-side composer sidebar and update related types --- components/email/email-composer.tsx | 5 +++++ lib/__tests__/plugin-store.test.ts | 1 + lib/plugin-api.ts | 3 ++- lib/plugin-types.ts | 7 +++++++ stores/plugin-store.ts | 2 +- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/components/email/email-composer.tsx b/components/email/email-composer.tsx index 607a4edb..b8982a40 100644 --- a/components/email/email-composer.tsx +++ b/components/email/email-composer.tsx @@ -1105,6 +1105,7 @@ export function EmailComposer({ name="composer-sidebar" className="hidden md:flex shrink-0 h-full overflow-hidden border-r border-border" /> + {/* Right-side composer sidebar slot is rendered after the main content div below. */}
)}
+ ); } diff --git a/lib/__tests__/plugin-store.test.ts b/lib/__tests__/plugin-store.test.ts index 823cc335..72105892 100644 --- a/lib/__tests__/plugin-store.test.ts +++ b/lib/__tests__/plugin-store.test.ts @@ -48,6 +48,7 @@ function resetStore() { 'email-footer': [], 'composer-toolbar': [], 'composer-sidebar': [], + 'composer-sidebar-right': [], 'sidebar-widget': [], 'email-detail-sidebar': [], 'settings-section': [], diff --git a/lib/plugin-api.ts b/lib/plugin-api.ts index 3efd68d1..62d244bc 100644 --- a/lib/plugin-api.ts +++ b/lib/plugin-api.ts @@ -612,7 +612,8 @@ export function createPluginAPI(plugin: InstalledPlugin): PluginAPI { registerComposerSidebar: (widget: SidebarWidget) => { requirePermission(plugin, 'ui:composer-sidebar'); - return registerSlot(plugin.id, 'composer-sidebar', widget.render as React.ComponentType>, widget.order ?? 100); + const slot = widget.side === 'right' ? 'composer-sidebar-right' : 'composer-sidebar'; + return registerSlot(plugin.id, slot, widget.render as React.ComponentType>, widget.order ?? 100); }, registerDetailSidebar: (widget: SidebarWidget) => { diff --git a/lib/plugin-types.ts b/lib/plugin-types.ts index 43e05d74..1195b3eb 100644 --- a/lib/plugin-types.ts +++ b/lib/plugin-types.ts @@ -110,6 +110,7 @@ export type SlotName = | 'email-footer' | 'composer-toolbar' | 'composer-sidebar' + | 'composer-sidebar-right' | 'sidebar-widget' | 'email-detail-sidebar' | 'settings-section' @@ -159,6 +160,12 @@ export interface SidebarWidget { label: string; render: React.ComponentType; order?: number; + /** + * For composer sidebars, choose which side of the New Message dialog the + * panel renders on. Defaults to `'left'` for backwards compatibility. + * Ignored by other sidebar slots. + */ + side?: 'left' | 'right'; } export interface ContextMenuItem { diff --git a/stores/plugin-store.ts b/stores/plugin-store.ts index 46e8bfdf..55499fcd 100644 --- a/stores/plugin-store.ts +++ b/stores/plugin-store.ts @@ -20,7 +20,7 @@ import { apiFetch } from '@/lib/browser-navigation'; // ─── Slot State ────────────────────────────────────────────── const SLOT_NAMES: SlotName[] = [ - 'toolbar-actions', 'email-banner', 'email-footer', 'composer-toolbar', 'composer-sidebar', + 'toolbar-actions', 'email-banner', 'email-footer', 'composer-toolbar', 'composer-sidebar', 'composer-sidebar-right', 'sidebar-widget', 'email-detail-sidebar', 'settings-section', 'context-menu-email', 'navigation-rail-bottom', 'calendar-event-actions', 'admin-plugin-page', ];