- {/* Expanded, the wordmark doubles as a New Session shortcut; the
+ {/* Expanded, the brand doubles as a New Session shortcut; the
collapsed rail's logo is the expand toggle below instead. */}
{wide && (
)}
{/* Rail resting state is the whale mark; hovering swaps in the panel
@@ -149,7 +163,11 @@ export function SidebarRoot({
aria-label={collapsed ? t('toggle.open') : t('toggle.collapse')}
onClick={() => { toggleSidebar() }}
>
- {!wide &&
}
+ {!wide && (
+
+ {renderSlot('sidebar.brand.mark', { size: 24 }, { fallback: })}
+
+ )}
{/* Rail icons render at 18 (figma rail spec); expanded keeps the glyph-native sizes. */}
diff --git a/packages/client/ui-sidebar/src/client/contract/slots.ts b/packages/client/ui-sidebar/src/client/contract/slots.ts
index a8c4f2894d..65f0102543 100644
--- a/packages/client/ui-sidebar/src/client/contract/slots.ts
+++ b/packages/client/ui-sidebar/src/client/contract/slots.ts
@@ -15,6 +15,17 @@ import type { WorkspaceId } from '@deepseek-ai/dsh-client-runtime/client'
declare module '@deepseek-ai/dsh-client-ui-slots' {
interface SlotMap {
+ /**
+ * Brand mark rendered in the expanded brand row and collapsed rail.
+ * Declared by this package's `sidebar` entry; deployments may replace
+ * the shell's fish fallback without replacing the surrounding controls.
+ */
+ 'sidebar.brand.mark': { kind: 'single'; scope: 'root'; owner: SidebarBrandMarkOwnerProps }
+ /**
+ * Brand name rendered beside the expanded mark. Declared by this
+ * package's `sidebar` entry; the shell supplies a generic text fallback.
+ */
+ 'sidebar.brand.name': { kind: 'single'; scope: 'root'; owner: SidebarBrandNameOwnerProps }
/**
* The workspace/session browsing region: section header, search, the
* grouped/flat session list, and every workspace dialog. Declared by this
@@ -36,6 +47,18 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
}
}
+/** Geometry supplied to the sidebar brand-mark occupant. */
+export interface SidebarBrandMarkOwnerProps {
+ /** Requested square edge in pixels. */
+ size: number
+}
+
+/** Empty owner share for the sidebar brand-name occupant. */
+export interface SidebarBrandNameOwnerProps {
+ /** Marker field: the occupant owns its own content and width. */
+ children?: never
+}
+
/**
* Owner share of the browser hole — the only facts crossing the shell/region
* boundary. Business data and actions arrive through the region's own inject.
@@ -85,5 +108,11 @@ export type SidebarRootInjected = {
*/
export type SidebarRootComponentProps =
PropsRuntime<'sidebar'>
- & PropsRenderSlots<'sidebar.workspaces' | 'sidebar.settings' | 'sidebar.footer.action'>
+ & PropsRenderSlots<
+ | 'sidebar.brand.mark'
+ | 'sidebar.brand.name'
+ | 'sidebar.workspaces'
+ | 'sidebar.settings'
+ | 'sidebar.footer.action'
+ >
& 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..5b8ac288f7 100644
--- a/packages/client/ui-sidebar/src/client/index.ts
+++ b/packages/client/ui-sidebar/src/client/index.ts
@@ -7,8 +7,8 @@ import { SidebarRoot } from './SidebarRoot.tsx'
import { en, zh, type SidebarKey } from './locales.ts'
export type {
- SidebarFooterActionOwnerProps, SidebarRootComponentProps, SidebarRootInjected,
- SidebarSectionOwnerProps, SidebarSettingsOwnerProps,
+ SidebarBrandMarkOwnerProps, SidebarBrandNameOwnerProps, SidebarFooterActionOwnerProps,
+ SidebarRootComponentProps, SidebarRootInjected, SidebarSectionOwnerProps, SidebarSettingsOwnerProps,
} from './contract/slots.ts'
export type { SidebarKey } from './locales.ts'
@@ -45,6 +45,8 @@ export function apply(ctx: ClientContext): void {
// region (header, search, session list, workspace dialogs), ui-settings
// registers the foot trigger + settings panel.
children: {
+ 'sidebar.brand.mark': { kind: 'single', scope: 'root' },
+ 'sidebar.brand.name': { kind: 'single', scope: 'root' },
'sidebar.workspaces': { kind: 'single', scope: 'root' },
'sidebar.settings': { kind: 'single', scope: 'root' },
'sidebar.footer.action': { kind: 'list', scope: 'root' },
diff --git a/packages/client/ui-sidebar/tests/__snapshots__/sidebar-snapshot.client.spec.tsx.snap b/packages/client/ui-sidebar/tests/__snapshots__/sidebar-snapshot.client.spec.tsx.snap
index f82fbc1656..a8ef9f5d4e 100644
--- a/packages/client/ui-sidebar/tests/__snapshots__/sidebar-snapshot.client.spec.tsx.snap
+++ b/packages/client/ui-sidebar/tests/__snapshots__/sidebar-snapshot.client.spec.tsx.snap
@@ -17,15 +17,24 @@ exports[`sidebar shell snapshots > renders the collapsed rail after the crossfad
class="iconButton toggle"
type="button"
>
-
+ class="railMark"
+ >
+
+
+
+