diff --git a/packages/client/ui-sidebar/src/client/SidebarRoot.module.css b/packages/client/ui-sidebar/src/client/SidebarRoot.module.css index 300075b88d..abe0021813 100644 --- a/packages/client/ui-sidebar/src/client/SidebarRoot.module.css +++ b/packages/client/ui-sidebar/src/client/SidebarRoot.module.css @@ -250,13 +250,15 @@ } .settingsArea, -.footerActions { +.footerActions, +.extraActions { flex: none; min-width: 0; width: 100%; } -.footerActions { +.footerActions, +.extraActions { display: flex; } @@ -265,7 +267,8 @@ } .collapsed .settingsArea, -.collapsed .footerActions { +.collapsed .footerActions, +.collapsed .extraActions { display: flex; justify-content: center; width: auto; diff --git a/packages/client/ui-sidebar/src/client/SidebarRoot.tsx b/packages/client/ui-sidebar/src/client/SidebarRoot.tsx index d3fe6a63c1..3e5e338e6f 100644 --- a/packages/client/ui-sidebar/src/client/SidebarRoot.tsx +++ b/packages/client/ui-sidebar/src/client/SidebarRoot.tsx @@ -178,8 +178,12 @@ export function SidebarRoot({ })} - {/* Footer actions stack above Settings in both sidebar widths. */} + {/* Footer actions stack above Settings in both sidebar widths; the + extra seat (ambient status rows) stacks one level above them. */}
+
+ {renderSlot('sidebar.footer.extra', { wide })} +
{renderSlot('sidebar.footer.action', { wide })}
diff --git a/packages/client/ui-sidebar/src/client/contract/slots.ts b/packages/client/ui-sidebar/src/client/contract/slots.ts index a8c4f2894d..a01a4a63c0 100644 --- a/packages/client/ui-sidebar/src/client/contract/slots.ts +++ b/packages/client/ui-sidebar/src/client/contract/slots.ts @@ -33,6 +33,13 @@ declare module '@deepseek-ai/dsh-client-ui-slots' { * package's 'sidebar' entry; each action receives only the column state. */ 'sidebar.footer.action': { kind: 'list'; scope: 'root'; owner: SidebarFooterActionOwnerProps } + /** + * Additive extra row stacked ABOVE the footer actions (one row above + * Settings). Declared by this package's 'sidebar' entry; each entry + * receives only the column state. This seat gives ambient status rows a + * line of their own instead of displacing the footer actions. + */ + 'sidebar.footer.extra': { kind: 'list'; scope: 'root'; owner: SidebarFooterExtraOwnerProps } } } @@ -62,6 +69,12 @@ export interface SidebarFooterActionOwnerProps { wide: boolean } +/** Owner share of an extra row stacked above the footer actions. */ +export interface SidebarFooterExtraOwnerProps { + /** Whether the sidebar renders wide content (false = 56px rail). */ + wide: boolean +} + /** * Registrant-private injected share (arrives via the register inject * factory). The shell keeps only its own controls: starting a Session from @@ -85,5 +98,5 @@ export type SidebarRootInjected = { */ export type SidebarRootComponentProps = PropsRuntime<'sidebar'> - & PropsRenderSlots<'sidebar.workspaces' | 'sidebar.settings' | 'sidebar.footer.action'> + & PropsRenderSlots<'sidebar.workspaces' | 'sidebar.settings' | 'sidebar.footer.action' | 'sidebar.footer.extra'> & SidebarRootInjected & PropsLocale<'sidebar'> diff --git a/packages/client/ui-sidebar/src/client/index.ts b/packages/client/ui-sidebar/src/client/index.ts index 0bd2c98295..aa05b73d7d 100644 --- a/packages/client/ui-sidebar/src/client/index.ts +++ b/packages/client/ui-sidebar/src/client/index.ts @@ -48,6 +48,7 @@ export function apply(ctx: ClientContext): void { 'sidebar.workspaces': { kind: 'single', scope: 'root' }, 'sidebar.settings': { kind: 'single', scope: 'root' }, 'sidebar.footer.action': { kind: 'list', scope: 'root' }, + 'sidebar.footer.extra': { kind: 'list', scope: 'root' }, }, inject: injectProps, }, SidebarRoot),