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',
];