@deepseek-ai/dsh-client-ui-sidebar 0.1.7-alpha.2 → 0.1.7-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -1,6 +1,55 @@
1
- # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
2
- # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
- # after editing either side, bring the other along and re-record with:
1
+ # Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
2
+ # section, a hash of its English and Chinese blocks outside code blocks and generated regions.
3
+ # After editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/client/ui-sidebar/README.md
5
- README.md: 94bb3a70ca8c06b5838f41436bb0f2ba2751501e
6
- README.zh.md: 86f54882ba1c96b9b50898993931757f7afef4e5
5
+ /:
6
+ en: 7884381c2c554eca
7
+ zh: e6d7199a9bb2f0f8
8
+ /deepseek-ai-dsh-client-ui-sidebar:
9
+ en: 3b3885c78b619c8a
10
+ zh: 2cabf9cfec748497
11
+ /deepseek-ai-dsh-client-ui-sidebar/summary:
12
+ en: af17f03561e5372b
13
+ zh: 91a1b9f6c7a51025
14
+ /deepseek-ai-dsh-client-ui-sidebar/table-of-contents:
15
+ en: d152484eb41ac6b4
16
+ zh: 09388d293f9be9cb
17
+ /deepseek-ai-dsh-client-ui-sidebar/use-this-package:
18
+ en: a970f0547496634f
19
+ zh: 36ef9a85b26e19f1
20
+ /deepseek-ai-dsh-client-ui-sidebar/use-this-package/brand-and-new-session:
21
+ en: d084cd6732966c41
22
+ zh: 466e028ca49b4230
23
+ /deepseek-ai-dsh-client-ui-sidebar/use-this-package/global-panel-entries:
24
+ en: 5d3300d3506254c5
25
+ zh: 541ae1ee1e10b921
26
+ /deepseek-ai-dsh-client-ui-sidebar/use-this-package/collapse-behavior:
27
+ en: 8996c9b65c8eb635
28
+ zh: 9c7ce08b90f3c1f5
29
+ /deepseek-ai-dsh-client-ui-sidebar/use-this-package/macos-desktop:
30
+ en: bcf4ba5b9276faa4
31
+ zh: f200ecad86631695
32
+ /deepseek-ai-dsh-client-ui-sidebar/use-this-package/scrollbars:
33
+ en: d053b1ed0f4fd293
34
+ zh: ff25a56541f57530
35
+ /deepseek-ai-dsh-client-ui-sidebar/understand-the-implementation:
36
+ en: 676cd4c309b4110d
37
+ zh: 25d1bd0b2c7db645
38
+ /deepseek-ai-dsh-client-ui-sidebar/understand-the-implementation/slot-discipline:
39
+ en: 6eefc5c45abe8a8f
40
+ zh: 20b651e48a0ea903
41
+ /deepseek-ai-dsh-client-ui-sidebar/further-exploration:
42
+ en: 5083bbf74e47bb67
43
+ zh: 0236e569178756a2
44
+ /deepseek-ai-dsh-client-ui-sidebar/model-experience:
45
+ en: 3120df665299c634
46
+ zh: 1d9f365d091d0d2a
47
+ /deepseek-ai-dsh-client-ui-sidebar/model-experience/kv-cache-effect:
48
+ en: ca75c51c89c2c9b0
49
+ zh: de54f3467ef3b9be
50
+ /deepseek-ai-dsh-client-ui-sidebar/known-limitations-and-deferred-work:
51
+ en: 262db5b10dfb7d98
52
+ zh: c1b5cf6aa58b054e
53
+ /deepseek-ai-dsh-client-ui-sidebar/known-limitations-and-deferred-work/dev-note:
54
+ en: c8d74533efbc8d23
55
+ zh: eb58f7098335f55e
package/README.md CHANGED
@@ -29,7 +29,7 @@ The sidebar is the navigation shell: users see the brand, start new sessions, co
29
29
 
30
30
  ### Brand and New Session
31
31
 
32
- The expanded brand row renders `sidebar.brand.mark` and `sidebar.brand.name` as independent single slots; the collapsed rail renders the same mark slot. Without occupants, the shell uses the fish mark and a localized local-build label. A complete build stacks a code badge below the label as `version[-commit][-dirty]`, using `DSH_CLIENT_VERSION`, the optional 7-character `DSH_CLIENT_COMMIT_HASH`, and `DSH_CLIENT_GIT_DIRTY=true`; missing version metadata omits the badge. New Session targets the explicit Workspace used by a scoped action, otherwise the current Session's Workspace, otherwise the most recently active Workspace; when none exists it clears into the blank New Session page.
32
+ The expanded brand row renders `sidebar.brand.mark` and `sidebar.brand.name` as independent single slots; the collapsed rail renders the same mark slot. Without occupants, the shell uses the fish mark and a localized local-build label. A complete build stacks a code badge below the label as `version[-commit][-dirty]`, using `DSH_CLIENT_VERSION`, the optional 7-character `DSH_CLIENT_COMMIT_HASH`, and `DSH_CLIENT_GIT_DIRTY=true`; missing version metadata omits the badge. New Session targets the explicit Workspace used by a scoped action, otherwise the current Session's Workspace, otherwise the most recently active Workspace; when none exists it clears into the blank New Session page. The expanded New Session button displays the effective binding as trailing grey text on hover or keyboard focus. While the shortcut is visible, the centered icon and label fade before it when space is narrow; CSS reserves the shortcut’s width without measuring the button. Icon-only controls retain tooltips with platform-formatted keycaps, including the resident macOS header control when the sidebar is hidden. All controls expose `aria-keyshortcuts`.
33
33
 
34
34
  ### Global panel entries
35
35
 
@@ -37,6 +37,8 @@ Plugins add an icon component to the root-scoped `sidebar.panellist` list with a
37
37
 
38
38
  ### Collapse behavior
39
39
 
40
+ The sidebar and conversation-header toggles show the effective shortcut from the command catalog in their hover and keyboard-focus tooltips and `aria-keyshortcuts`. An unbound command shows only the action label.
41
+
40
42
  The top expand button hosts the optional, non-interactive `sidebar.toggle.badge` slot while collapsed. Its occupant supplies status and tooltip content without adding another action or changing the button's navigation behavior.
41
43
 
42
44
  During a live collapse, the expanded content fades out at its current width, the upper controls share one fade and leftward translation into the 56px rail, and the layout's column slide ends the motion. A page that starts collapsed renders the rail statically, and reduced-motion mode disables both transitions. The bottom-pinned `sidebar.settings` control shares the fade timing but has no horizontal translation.
@@ -45,7 +47,7 @@ On Windows Electron, `html[data-windows-titlebar]` fixes the sidebar toggle in t
45
47
 
46
48
  ### macOS desktop
47
49
 
48
- Under `html[data-platform='darwin']` (set only by the desktop preload) the expanded column opens with a 52px top strip that clears the hiddenInset traffic lights and carries the collapse toggle; the frame's own drag band (ui-layout `.leadingBand`) covers that strip, and the logo row below extends the drag surface, so the brand wordmark is not a New Session shortcut there — the dedicated New Session button keeps the action — and collapsing hides the column entirely instead of leaving the rail. The package registers `HeaderLeadingControls` into the frame's `shell.leading` window-chrome seat (ui-layout), which mounts it — the open-sidebar and New Session controls beside the traffic lights — only while the column is hidden, over every main panel. Rationale and the window-integration contract: the [macOS hidden-titlebar Agent Note](../../../.agents/notes/implemented/feature/2026-09-13-macos-hidden-titlebar-vibrancy.md).
50
+ Under `html[data-platform='darwin']` (set only by the desktop preload) the expanded column opens with a 52px top strip that clears the hiddenInset traffic lights and carries the collapse toggle; the strip and the logo row below each mark themselves `data-window-drag`, so each row's own box is the window's drag region (ui-web base.css declares the one darwin drag rule), and the brand wordmark is not a New Session shortcut there — the dedicated New Session button keeps the action — and collapsing hides the column entirely instead of leaving the rail. The package registers `HeaderLeadingControls` into the frame's `shell.leading` window-chrome seat (ui-layout), which mounts it — the open-sidebar and New Session controls beside the traffic lights — only while the column is hidden, over every main panel. Rationale and the window-integration contract: the [macOS hidden-titlebar Agent Note](../../../.agents/notes/implemented/feature/2026-09-13-macos-hidden-titlebar-vibrancy.md).
49
51
 
50
52
  ### Scrollbars
51
53
 
package/README.zh.md CHANGED
@@ -29,7 +29,7 @@ dsh Web 客户端的侧边栏让用户识别当前构建、启动新会话、将
29
29
 
30
30
  ### 品牌与 New Session
31
31
 
32
- 展开的品牌行把 `sidebar.brand.mark` 与 `sidebar.brand.name` 渲染为两个独立的 single slot;收起轨道则渲染同一个 mark slot。没有占位者时,外壳使用鱼形标记和本地化的本地构建标签。完整构建会在标签下方显示代码徽标;该徽标使用 `DSH_CLIENT_VERSION`、可选的 7 位 `DSH_CLIENT_COMMIT_HASH` 与 `DSH_CLIENT_GIT_DIRTY=true` 组装成 `version[-commit][-dirty]`;缺少版本元数据时不显示徽标。New Session 优先使用作用域操作明确指定的 Workspace,否则使用当前 Session 所属 Workspace,再否则使用最近活跃 Workspace;一个 Workspace 都没有时则清空选择,进入空白 New Session 页面。
32
+ 展开的品牌行把 `sidebar.brand.mark` 与 `sidebar.brand.name` 渲染为两个独立的 single slot;收起轨道则渲染同一个 mark slot。没有占位者时,外壳使用鱼形标记和本地化的本地构建标签。完整构建会在标签下方显示代码徽标;该徽标使用 `DSH_CLIENT_VERSION`、可选的 7 位 `DSH_CLIENT_COMMIT_HASH` 与 `DSH_CLIENT_GIT_DIRTY=true` 组装成 `version[-commit][-dirty]`;缺少版本元数据时不显示徽标。New Session 优先使用作用域操作明确指定的 Workspace,否则使用当前 Session 所属 Workspace,再否则使用最近活跃 Workspace;一个 Workspace 都没有时则清空选择,进入空白 New Session 页面。 展开态的新建会话按钮在悬停或键盘聚焦时于右侧以灰色文字显示当前有效绑定。快捷键可见且空间较窄时,居中的图标与文字在快捷键之前渐隐;CSS 为快捷键保留宽度,无需测量按钮。纯图标控件保留使用平台键位样式的 tooltip,侧栏隐藏时常驻的 macOS 头部控件也保持一致。所有控件均提供 `aria-keyshortcuts`。
33
33
 
34
34
  ### 全局面板入口
35
35
 
@@ -37,6 +37,8 @@ dsh Web 客户端的侧边栏让用户识别当前构建、启动新会话、将
37
37
 
38
38
  ### 折叠行为
39
39
 
40
+ 侧栏及会话头部的开关从命令目录读取当前有效快捷键,用于悬停、键盘聚焦提示和 `aria-keyshortcuts`。未绑定的命令只显示操作名称。
41
+
40
42
  侧栏收起时,顶部展开按钮承载可选、不可交互的 `sidebar.toggle.badge` slot。占用方提供状态和提示内容,不增加操作,也不改变按钮的导航行为。
41
43
 
42
44
  实时收起时,展开内容在当前宽度淡出,上方控件共用同一段透明度渐变,并向左平移进入 56px 轨道,由布局的栏滑动结束整段动画。页面初始即为收起状态时会静态渲染轨道;减少动态效果模式会禁用两段过渡。固定在底部的 `sidebar.settings` 控件共用相同的透明度渐变时序,但不发生横向位移。
@@ -45,7 +47,7 @@ dsh Web 客户端的侧边栏让用户识别当前构建、启动新会话、将
45
47
 
46
48
  ### macOS 桌面
47
49
 
48
- 在 `html[data-platform='darwin']`(仅由桌面 preload 设置)下,展开的侧边栏列顶部有一条 52px 的顶部条:避开 hiddenInset 红绿灯并承载收起按钮;框架自身的拖拽带(ui-layout `.leadingBand`)覆盖这条顶部条,其下的 logo 行延伸这块拖拽面,因此品牌 wordmark 在 macOS 上不再是 New Session 快捷入口——专用的 New Session 按钮保留该操作;收起时整列隐藏而非保留轨道。本包向框架的 `shell.leading` 窗口 chrome 座(ui-layout)注册 `HeaderLeadingControls`——打开侧边栏与 New Session 两个控件,由框架仅在列隐藏时挂载于红绿灯旁,覆盖所有主面板。设计依据与窗口集成约定见 [macOS 隐藏标题栏 Agent Note](../../../.agents/notes/implemented/feature/2026-09-13-macos-hidden-titlebar-vibrancy.zh.md)。
50
+ 在 `html[data-platform='darwin']`(仅由桌面 preload 设置)下,展开的侧边栏列顶部有一条 52px 的顶部条:避开 hiddenInset 红绿灯并承载收起按钮;顶部条与其下的 logo 行各自打上 `data-window-drag`,于是每行自己的盒子就是窗口的拖拽区(唯一的 darwin drag 规则由 ui-web base.css 声明),因此品牌 wordmark 在 macOS 上不再是 New Session 快捷入口——专用的 New Session 按钮保留该操作;收起时整列隐藏而非保留轨道。本包向框架的 `shell.leading` 窗口 chrome 座(ui-layout)注册 `HeaderLeadingControls`——打开侧边栏与 New Session 两个控件,由框架仅在列隐藏时挂载于红绿灯旁,覆盖所有主面板。设计依据与窗口集成约定见 [macOS 隐藏标题栏 Agent Note](../../../.agents/notes/implemented/feature/2026-09-13-macos-hidden-titlebar-vibrancy.zh.md)。
49
51
 
50
52
  ### 滚动条
51
53
 
package/lib/client.js CHANGED
@@ -10,7 +10,7 @@ window.__ModuleLoader__.load({
10
10
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
11
11
  let react = require("react");
12
12
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-sidebar/src/client/HeaderLeadingControls.module.css.mjs
13
- const css$1 = ".IW6AQa_controls{align-items:center;gap:8px;display:flex}.IW6AQa_iconButton{corner-shape:round;width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.IW6AQa_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}";
13
+ const css$1 = ".IW6AQa_controls{align-items:center;gap:8px;display:flex}.IW6AQa_iconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.IW6AQa_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}";
14
14
  const tagId$1 = "@deepseek-ai/dsh-client-ui-sidebar/HeaderLeadingControls.module.css";
15
15
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
16
16
  const tag = document.createElement("style");
@@ -35,16 +35,20 @@ window.__ModuleLoader__.load({
35
35
  * @param props - Injected sidebar actions plus the sidebar locale seat.
36
36
  * @returns the two window-chrome controls.
37
37
  */
38
- function HeaderLeadingControls({ toggleSidebar, startSession, t }) {
38
+ function HeaderLeadingControls({ toggleSidebar, startSession, useShortcuts, t }) {
39
+ const shortcut = useShortcuts((rows) => rows.find((row) => row.id === "sidebar.left.toggle"));
40
+ const newShortcut = useShortcuts((rows) => rows.find((row) => row.id === "session.new"));
39
41
  return (0, react_jsx_runtime.jsxs)("div", {
40
42
  className: HeaderLeadingControls_module_css_default.controls,
41
43
  children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
42
44
  label: t("toggle.open"),
45
+ shortcutKeys: shortcut?.keys,
43
46
  delayMs: 500,
44
47
  children: (0, react_jsx_runtime.jsx)("button", {
45
48
  type: "button",
46
49
  className: HeaderLeadingControls_module_css_default.iconButton,
47
50
  "aria-label": t("toggle.open"),
51
+ "aria-keyshortcuts": shortcut?.aria,
48
52
  onClick: () => {
49
53
  toggleSidebar();
50
54
  },
@@ -52,11 +56,13 @@ window.__ModuleLoader__.load({
52
56
  })
53
57
  }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
54
58
  label: t("session.new.label"),
59
+ shortcutKeys: newShortcut?.keys,
55
60
  delayMs: 500,
56
61
  children: (0, react_jsx_runtime.jsx)("button", {
57
62
  type: "button",
58
63
  className: HeaderLeadingControls_module_css_default.iconButton,
59
64
  "aria-label": t("session.new.label"),
65
+ "aria-keyshortcuts": newShortcut?.aria,
60
66
  onClick: () => {
61
67
  startSession();
62
68
  },
@@ -82,7 +88,7 @@ window.__ModuleLoader__.load({
82
88
  }
83
89
  //#endregion
84
90
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-sidebar/src/client/SidebarRoot.module.css.mjs
85
- const css = ".hHd-Xa_root{--dsh-sidebar-inline-padding:12px;height:100%;padding:6px var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:14px;display:flex}[data-platform=darwin] .hHd-Xa_root{background:0 0}.hHd-Xa_root.hHd-Xa_collapsed{padding:18px 10px 6px}[data-windows-titlebar] .hHd-Xa_root .hHd-Xa_logoRow{height:40px;margin:0;padding:0}[data-windows-titlebar] .hHd-Xa_toggle{top:calc((var(--dsh-windows-titlebar-height) - 28px) / 2);z-index:30;-webkit-app-region:no-drag;position:fixed;left:12px}[data-windows-titlebar] .hHd-Xa_root.hHd-Xa_collapsed .hHd-Xa_logoRow{height:0}[data-windows-titlebar] .hHd-Xa_root:not(.hHd-Xa_collapsed) .hHd-Xa_brand{padding-left:4px}[data-windows-titlebar] .hHd-Xa_brandIdentity{transform:translateY(1px)}[data-windows-titlebar] .hHd-Xa_brandMark{transform:translate(1px)}[data-windows-titlebar] .hHd-Xa_brandName{font-weight:400}[data-windows-titlebar] .hHd-Xa_root.hHd-Xa_collapsed{padding:0}[data-windows-titlebar] .hHd-Xa_root:not(.hHd-Xa_collapsed) .hHd-Xa_newSession{margin-top:8px;margin-left:0}[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_panelList,[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_regionArea,[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_footArea{display:none}html[data-windows-titlebar]:has([data-sidebar-collapsed=true]){--dsh-windows-menu-start:84px}[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_newSession{top:calc((var(--dsh-windows-titlebar-height) - 28px) / 2);z-index:30;-webkit-app-region:no-drag;border:none;margin:0;padding:0;position:fixed;left:48px}[data-windows-titlebar] .hHd-Xa_railIn .hHd-Xa_iconButton,[data-windows-titlebar] .hHd-Xa_railIn .hHd-Xa_newSession{animation:none}[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_toggle,[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_newSession{corner-shape:round;width:28px;height:28px;color:var(--dsw-alias-label-secondary);border-radius:50%}[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_toggle .hHd-Xa_panelIcon{display:inline}.hHd-Xa_root.hHd-Xa_quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.hHd-Xa_fading>*{opacity:0;transition:opacity .15s var(--ds-ease-in-out)}.hHd-Xa_wide{animation:hHd-Xa_wide-in .2s var(--ds-ease-in-out)}@keyframes hHd-Xa_wide-in{0%{opacity:0}}.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_panelList,.hHd-Xa_railIn .hHd-Xa_regionArea{animation:hHd-Xa_rail-in .15s var(--ds-ease-in-out) backwards}.hHd-Xa_railIn .hHd-Xa_footArea{animation:hHd-Xa_rail-fade-in .15s var(--ds-ease-in-out) backwards}@keyframes hHd-Xa_rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes hHd-Xa_rail-fade-in{0%{opacity:0}}.hHd-Xa_topStrip{box-sizing:border-box;height:52px;margin:-6px calc(-1 * var(--dsh-sidebar-inline-padding)) 0;flex:none;justify-content:flex-end;align-items:center;padding:0 12px 2px;display:flex}[data-fullscreen] .hHd-Xa_topStrip{justify-content:flex-start}.hHd-Xa_topStrip+.hHd-Xa_logoRow{margin-top:-12px}.hHd-Xa_logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:8px;height:60px;margin-bottom:4px;padding:8px 0 8px 4px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_logoRow{justify-content:flex-start;height:36px;margin-bottom:12px;padding:0}[data-platform=darwin] .hHd-Xa_logoRow{-webkit-app-region:drag}.hHd-Xa_brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}[data-platform=darwin] .hHd-Xa_brand{cursor:default}.hHd-Xa_brandIdentity{align-items:center;gap:8px;min-width:0;height:24px;display:inline-flex}.hHd-Xa_brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.hHd-Xa_brandName{letter-spacing:.04em;align-items:center;gap:6px;min-width:0;height:24px;font-size:18px;font-weight:600;line-height:24px;display:inline-flex}.hHd-Xa_fallbackBrandName{letter-spacing:0;white-space:nowrap;font-size:17px}.hHd-Xa_localBuildBrand{white-space:nowrap;flex-direction:column;flex:none;justify-content:center;align-items:flex-start;gap:1px;height:24px;display:inline-flex}.hHd-Xa_localBuildTitle{letter-spacing:0;font-size:12px;line-height:13px}.hHd-Xa_iconButton{corner-shape:round;cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.hHd-Xa_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_collapsed .hHd-Xa_iconButton{border-radius:12px;width:36px;height:36px}.hHd-Xa_collapsed .hHd-Xa_toggle .hHd-Xa_panelIcon{display:none}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_panelIcon{display:inline}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_railMark{display:none}.hHd-Xa_railMark{justify-content:center;align-items:center;display:inline-flex}.hHd-Xa_collapsed .hHd-Xa_iconButton{color:var(--dsw-alias-label-primary)}.hHd-Xa_buildVersion{height:10px;color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:2px;flex:none;align-items:center;padding:0 3px;font-size:6px;font-weight:500;line-height:10px;display:inline-flex}.hHd-Xa_newSession{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);background:var(--dsw-alias-button-elevated-fill);height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:12px;flex:none;justify-content:center;align-items:center;gap:6px;margin:0 2px 12px;padding:8px 16px;font-size:14px;font-weight:500;line-height:22px;display:flex;overflow:hidden}.hHd-Xa_newSession:hover{background:var(--dsw-alias-button-floating-hover)}[data-platform=darwin] .hHd-Xa_newSession{background:#ffffff8c}[data-platform=darwin] .hHd-Xa_newSession:hover{background:#ffffff4d}[data-platform=darwin] [data-ds-dark-theme] .hHd-Xa_newSession{background:#ffffff26}[data-platform=darwin] [data-ds-dark-theme] .hHd-Xa_newSession:hover{background:#fff3}.hHd-Xa_collapsed .hHd-Xa_newSession{background:0 0;border-color:#0000;align-self:flex-start;gap:0;width:36px;height:36px;margin:0 0 12px;padding:0}.hHd-Xa_collapsed .hHd-Xa_newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_newSessionLabel{white-space:nowrap;max-width:200px;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_newSessionLabel{max-width:0}.hHd-Xa_panelList{flex-direction:column;flex:none;gap:4px;margin-bottom:8px;display:flex}.hHd-Xa_panelRow{box-sizing:border-box;min-height:36px;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;margin:0 2px;padding:7px 8px;line-height:22px;display:flex}.hHd-Xa_panelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_panelRow.hHd-Xa_panelActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.hHd-Xa_panelRow:focus-visible{outline:2px solid var(--dsw-alias-label-primary);outline-offset:-2px}.hHd-Xa_panelGlyph{flex:none;justify-content:center;align-items:center;display:inline-flex}.hHd-Xa_panelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_panelList{gap:12px;margin-bottom:12px}.hHd-Xa_collapsed .hHd-Xa_panelRow{width:36px;height:36px;color:var(--dsw-alias-label-primary);justify-content:center;margin:0;padding:0}.hHd-Xa_regionArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:4px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_regionArea{margin-left:0;margin-right:0;padding-left:0}.hHd-Xa_footArea{flex-direction:column;flex:none;display:flex}.hHd-Xa_settingsArea,.hHd-Xa_footerActions{flex:none;width:100%;min-width:0}.hHd-Xa_footerActions{display:flex}.hHd-Xa_collapsed .hHd-Xa_footArea{align-items:center}.hHd-Xa_collapsed .hHd-Xa_settingsArea,.hHd-Xa_collapsed .hHd-Xa_footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.hHd-Xa_wide,.hHd-Xa_fading>*,.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_panelList,.hHd-Xa_railIn .hHd-Xa_footArea,.hHd-Xa_railIn .hHd-Xa_regionArea{transition:none;animation:none}}";
91
+ const css = ".hHd-Xa_root{--dsh-sidebar-inline-padding:12px;height:100%;padding:6px var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:14px;display:flex}[data-platform=darwin] .hHd-Xa_root{background:0 0}.hHd-Xa_root.hHd-Xa_collapsed{padding:18px 10px 6px}[data-windows-titlebar] .hHd-Xa_root .hHd-Xa_logoRow{height:40px;margin:0;padding:0}[data-windows-titlebar] .hHd-Xa_toggle{top:calc((var(--dsh-windows-titlebar-height) - 28px) / 2);z-index:30;-webkit-app-region:no-drag;position:fixed;left:12px}[data-windows-titlebar] .hHd-Xa_root.hHd-Xa_collapsed .hHd-Xa_logoRow{height:0}[data-windows-titlebar] .hHd-Xa_root:not(.hHd-Xa_collapsed) .hHd-Xa_brand{padding-left:4px}[data-windows-titlebar] .hHd-Xa_brandIdentity{transform:translateY(1px)}[data-windows-titlebar] .hHd-Xa_brandMark{transform:translate(1px)}[data-windows-titlebar] .hHd-Xa_brandName{font-weight:400}[data-windows-titlebar] .hHd-Xa_root.hHd-Xa_collapsed{padding:0}[data-windows-titlebar] .hHd-Xa_root:not(.hHd-Xa_collapsed) .hHd-Xa_newSession{margin-top:8px;margin-left:0}[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_panelList,[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_regionArea,[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_footArea{display:none}html[data-windows-titlebar]:has([data-sidebar-collapsed=true]){--dsh-windows-menu-start:84px}[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_newSession{top:calc((var(--dsh-windows-titlebar-height) - 28px) / 2);z-index:30;-webkit-app-region:no-drag;border:none;margin:0;padding:0;position:fixed;left:48px}[data-windows-titlebar] .hHd-Xa_railIn .hHd-Xa_iconButton,[data-windows-titlebar] .hHd-Xa_railIn .hHd-Xa_newSession{animation:none}[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_toggle,[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_newSession{corner-shape:round;width:28px;height:28px;color:var(--dsw-alias-label-secondary);border-radius:50%}[data-windows-titlebar] .hHd-Xa_collapsed .hHd-Xa_toggle .hHd-Xa_panelIcon{display:inline}.hHd-Xa_root.hHd-Xa_quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.hHd-Xa_fading>*{opacity:0;transition:opacity .15s var(--ds-ease-in-out)}.hHd-Xa_wide{animation:hHd-Xa_wide-in .2s var(--ds-ease-in-out)}@keyframes hHd-Xa_wide-in{0%{opacity:0}}.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_panelList,.hHd-Xa_railIn .hHd-Xa_regionArea{animation:hHd-Xa_rail-in .15s var(--ds-ease-in-out) backwards}.hHd-Xa_railIn .hHd-Xa_footArea{animation:hHd-Xa_rail-fade-in .15s var(--ds-ease-in-out) backwards}@keyframes hHd-Xa_rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes hHd-Xa_rail-fade-in{0%{opacity:0}}.hHd-Xa_topStrip{box-sizing:border-box;height:52px;margin:-6px calc(-1 * var(--dsh-sidebar-inline-padding)) 0;flex:none;justify-content:flex-end;align-items:center;padding:0 12px 2px;display:flex}[data-fullscreen] .hHd-Xa_topStrip{justify-content:flex-start}.hHd-Xa_topStrip+.hHd-Xa_logoRow{margin-top:-12px}.hHd-Xa_logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:8px;height:60px;margin-bottom:4px;padding:8px 0 8px 4px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_logoRow{justify-content:flex-start;height:36px;margin-bottom:12px;padding:0;overflow:visible}.hHd-Xa_brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}[data-platform=darwin] .hHd-Xa_brand{cursor:default}.hHd-Xa_brandIdentity{align-items:center;gap:8px;min-width:0;height:24px;display:inline-flex}.hHd-Xa_brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.hHd-Xa_brandName{letter-spacing:.04em;align-items:center;gap:6px;min-width:0;height:24px;font-size:18px;font-weight:600;line-height:24px;display:inline-flex}.hHd-Xa_fallbackBrandName{letter-spacing:0;white-space:nowrap;font-size:17px}.hHd-Xa_localBuildBrand{white-space:nowrap;flex-direction:column;flex:none;justify-content:center;align-items:flex-start;gap:1px;height:24px;display:inline-flex}.hHd-Xa_localBuildTitle{letter-spacing:0;font-size:12px;line-height:13px}.hHd-Xa_iconButton{border-radius:var(--dsw-radius-sm);cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.hHd-Xa_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_iconButton.hHd-Xa_toggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.hHd-Xa_collapsed .hHd-Xa_iconButton{border-radius:var(--dsw-radius-md);width:36px;height:36px}.hHd-Xa_collapsed .hHd-Xa_toggle .hHd-Xa_panelIcon{display:none}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_panelIcon{display:inline}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_railMark{display:none}.hHd-Xa_railMark{justify-content:center;align-items:center;display:inline-flex}.hHd-Xa_collapsed .hHd-Xa_iconButton{color:var(--dsw-alias-label-primary)}.hHd-Xa_buildVersion{height:10px;color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:2px;flex:none;align-items:center;padding:0 3px;font-size:6px;font-weight:500;line-height:10px;display:inline-flex}.hHd-Xa_newSession{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-button-elevated-fill);height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;flex:none;justify-content:center;align-items:center;gap:0;margin:0 2px 12px;padding:8px 12px;font-size:14px;font-weight:500;line-height:22px;display:flex;position:relative;overflow:hidden;container-type:inline-size}.hHd-Xa_newSession:hover{background:var(--dsw-alias-button-floating-hover)}[data-platform=darwin] .hHd-Xa_newSession{background:#ffffff8c}[data-platform=darwin] .hHd-Xa_newSession:hover{background:#ffffff4d}[data-platform=darwin] [data-ds-dark-theme] .hHd-Xa_newSession{background:#ffffff26}[data-platform=darwin] [data-ds-dark-theme] .hHd-Xa_newSession:hover{background:#fff3}.hHd-Xa_collapsed .hHd-Xa_newSession{background:0 0;border-color:#0000;align-self:flex-start;gap:0;width:36px;height:36px;margin:0 0 12px;padding:0}.hHd-Xa_collapsed .hHd-Xa_newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_newSessionLabel{white-space:nowrap;max-width:200px;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_newSessionLabel{max-width:0}.hHd-Xa_newSessionLabelMask{flex:1;min-width:0}.hHd-Xa_newSession:is(:hover,:focus-visible) .hHd-Xa_newSessionLabelMask:has(+.hHd-Xa_newSessionShortcut){overflow:hidden;mask-image:linear-gradient(90deg,#000 calc(100% - 16px),#0000)}.hHd-Xa_newSessionContent{justify-content:center;align-items:center;gap:6px;width:100cqw;display:flex}.hHd-Xa_newSessionContent>svg{flex:none}.hHd-Xa_newSessionShortcut{opacity:0;pointer-events:none;flex:none;font-weight:400;display:inline-flex}.hHd-Xa_newSession:is(:hover,:focus-visible) .hHd-Xa_newSessionShortcut{opacity:1}.hHd-Xa_panelList{flex-direction:column;flex:none;gap:4px;margin-bottom:8px;display:flex}.hHd-Xa_panelRow{box-sizing:border-box;border-radius:var(--dsw-radius-md);min-height:36px;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;margin:0 2px;padding:7px 8px;line-height:22px;display:flex}.hHd-Xa_panelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_panelRow.hHd-Xa_panelActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.hHd-Xa_panelRow:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.hHd-Xa_panelGlyph{flex:none;justify-content:center;align-items:center;display:inline-flex}.hHd-Xa_panelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_panelList{gap:12px;margin-bottom:12px}.hHd-Xa_collapsed .hHd-Xa_panelRow{width:36px;height:36px;color:var(--dsw-alias-label-primary);justify-content:center;margin:0;padding:0}.hHd-Xa_regionArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:4px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_regionArea{margin-left:0;margin-right:0;padding-left:0}.hHd-Xa_footArea{flex-direction:column;flex:none;display:flex}.hHd-Xa_settingsArea,.hHd-Xa_footerActions{flex:none;width:100%;min-width:0}.hHd-Xa_footerActions{display:flex}.hHd-Xa_collapsed .hHd-Xa_footArea{align-items:center}.hHd-Xa_collapsed .hHd-Xa_settingsArea,.hHd-Xa_collapsed .hHd-Xa_footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.hHd-Xa_wide,.hHd-Xa_fading>*,.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_panelList,.hHd-Xa_railIn .hHd-Xa_footArea,.hHd-Xa_railIn .hHd-Xa_regionArea{transition:none;animation:none}}";
86
92
  const tagId = "@deepseek-ai/dsh-client-ui-sidebar/SidebarRoot.module.css";
87
93
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
88
94
  const tag = document.createElement("style");
@@ -107,7 +113,10 @@ window.__ModuleLoader__.load({
107
113
  "localBuildTitle": "hHd-Xa_localBuildTitle",
108
114
  "logoRow": "hHd-Xa_logoRow",
109
115
  "newSession": "hHd-Xa_newSession",
116
+ "newSessionContent": "hHd-Xa_newSessionContent",
110
117
  "newSessionLabel": "hHd-Xa_newSessionLabel",
118
+ "newSessionLabelMask": "hHd-Xa_newSessionLabelMask",
119
+ "newSessionShortcut": "hHd-Xa_newSessionShortcut",
111
120
  "panelActive": "hHd-Xa_panelActive",
112
121
  "panelGlyph": "hHd-Xa_panelGlyph",
113
122
  "panelIcon": "hHd-Xa_panelIcon",
@@ -158,7 +167,7 @@ window.__ModuleLoader__.load({
158
167
  const SCROLLBAR_LINGER_MS = 2e3;
159
168
  /** Format complete-build metadata for the local brand badge. */
160
169
  function localBuildVersion() {
161
- return `0.1.7-alpha.2-68cf316` + ({}.DSH_CLIENT_GIT_DIRTY === "true" ? "-dirty" : "");
170
+ return `0.1.7-rc.2-c127551` + ({}.DSH_CLIENT_GIT_DIRTY === "true" ? "-dirty" : "");
162
171
  }
163
172
  /** Each panel row subscribes only to its own selection state. */
164
173
  function PanelRow({ id, label, wide, usePanelInfo, selectPanel, renderSlot }) {
@@ -194,8 +203,11 @@ window.__ModuleLoader__.load({
194
203
  * @param props - composed slot props (runtime share + injected callbacks, contract/slots.ts).
195
204
  * @returns the sidebar element tree.
196
205
  */
197
- function SidebarRoot({ collapsed, width, startSession, toggleSidebar, selectPanel, usePanels, usePanelInfo, t, renderSlot }) {
206
+ function SidebarRoot({ collapsed, width, startSession, toggleSidebar, selectPanel, usePanels, useShortcuts, usePanelInfo, t, renderSlot }) {
198
207
  const panels = usePanels((snapshot) => snapshot);
208
+ const shortcut = useShortcuts((rows) => rows.find((row) => row.id === "sidebar.left.toggle"));
209
+ const newShortcut = useShortcuts((rows) => rows.find((row) => row.id === "session.new"));
210
+ const toggleLabel = collapsed ? t("toggle.open") : t("toggle.collapse");
199
211
  const [settled, setSettled] = (0, react.useState)(collapsed);
200
212
  (0, react.useEffect)(() => {
201
213
  if (!collapsed) {
@@ -248,13 +260,15 @@ window.__ModuleLoader__.load({
248
260
  const buildVersion = localBuildVersion();
249
261
  const darwinDesktop = (0, _deepseek_ai_dsh_client_ui_primitives.isDarwinDesktop)();
250
262
  const toggle = (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
251
- label: collapsed ? t("toggle.open") : t("toggle.collapse"),
263
+ label: toggleLabel,
264
+ shortcutKeys: shortcut?.keys,
252
265
  delayMs: 500,
253
266
  side: captionTooltipSide,
254
267
  children: (0, react_jsx_runtime.jsxs)("button", {
255
268
  type: "button",
256
269
  className: clsx(SidebarRoot_module_css_default.iconButton, SidebarRoot_module_css_default.toggle),
257
- "aria-label": collapsed ? t("toggle.open") : t("toggle.collapse"),
270
+ "aria-label": toggleLabel,
271
+ "aria-keyshortcuts": shortcut?.aria,
258
272
  onClick: () => {
259
273
  toggleSidebar();
260
274
  },
@@ -286,10 +300,12 @@ window.__ModuleLoader__.load({
286
300
  children: [
287
301
  darwinDesktop && (0, react_jsx_runtime.jsx)("div", {
288
302
  className: SidebarRoot_module_css_default.topStrip,
303
+ "data-window-drag": true,
289
304
  children: toggle
290
305
  }),
291
306
  (0, react_jsx_runtime.jsxs)("div", {
292
307
  className: SidebarRoot_module_css_default.logoRow,
308
+ "data-window-drag": true,
293
309
  children: [wide && (() => {
294
310
  const identity = (0, react_jsx_runtime.jsxs)("span", {
295
311
  className: SidebarRoot_module_css_default.brandIdentity,
@@ -317,32 +333,50 @@ window.__ModuleLoader__.load({
317
333
  return darwinDesktop ? (0, react_jsx_runtime.jsx)("span", {
318
334
  className: clsx(SidebarRoot_module_css_default.brand, SidebarRoot_module_css_default.wide),
319
335
  children: identity
320
- }) : (0, react_jsx_runtime.jsx)("button", {
321
- type: "button",
322
- className: clsx(SidebarRoot_module_css_default.brand, SidebarRoot_module_css_default.wide),
323
- "aria-label": t("session.new.label"),
324
- onClick: () => {
325
- startSession();
326
- },
327
- children: identity
336
+ }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
337
+ label: t("session.new.label"),
338
+ shortcutKeys: newShortcut?.keys,
339
+ delayMs: 500,
340
+ children: (0, react_jsx_runtime.jsx)("button", {
341
+ type: "button",
342
+ className: clsx(SidebarRoot_module_css_default.brand, SidebarRoot_module_css_default.wide),
343
+ "aria-label": t("session.new.label"),
344
+ "aria-keyshortcuts": newShortcut?.aria,
345
+ onClick: () => {
346
+ startSession();
347
+ },
348
+ children: identity
349
+ })
328
350
  });
329
351
  })(), !darwinDesktop && toggle]
330
352
  }),
331
353
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
332
354
  label: t("session.new.label"),
355
+ shortcutKeys: newShortcut?.keys,
333
356
  delayMs: 500,
334
- disabled: wide,
335
357
  side: captionTooltipSide,
358
+ disabled: wide,
336
359
  children: (0, react_jsx_runtime.jsxs)("button", {
337
360
  type: "button",
338
361
  className: SidebarRoot_module_css_default.newSession,
339
362
  "aria-label": t("session.new.label"),
363
+ "aria-keyshortcuts": newShortcut?.aria,
340
364
  onClick: () => {
341
365
  startSession();
342
366
  },
343
- children: [wide ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconNewChatOutlineMedium, { size: 14 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconNewChatOutlineRegular, { size: windowsTitlebar ? 16 : 18 }), wide && (0, react_jsx_runtime.jsx)("span", {
344
- className: clsx(SidebarRoot_module_css_default.newSessionLabel, SidebarRoot_module_css_default.wide),
345
- children: t("session.new")
367
+ children: [(0, react_jsx_runtime.jsx)("span", {
368
+ className: SidebarRoot_module_css_default.newSessionLabelMask,
369
+ children: (0, react_jsx_runtime.jsxs)("span", {
370
+ className: SidebarRoot_module_css_default.newSessionContent,
371
+ children: [wide ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconNewChatOutlineMedium, { size: 14 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconNewChatOutlineRegular, { size: windowsTitlebar ? 16 : 18 }), wide && (0, react_jsx_runtime.jsx)("span", {
372
+ className: clsx(SidebarRoot_module_css_default.newSessionLabel, SidebarRoot_module_css_default.wide),
373
+ children: t("session.new")
374
+ })]
375
+ })
376
+ }), wide && newShortcut !== void 0 && newShortcut.keys.length > 0 && (0, react_jsx_runtime.jsx)("span", {
377
+ className: SidebarRoot_module_css_default.newSessionShortcut,
378
+ "aria-hidden": "true",
379
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.ShortcutKeys, { keys: newShortcut.keys })
346
380
  })]
347
381
  })
348
382
  }),
@@ -408,7 +442,8 @@ window.__ModuleLoader__.load({
408
442
  "slots",
409
443
  "layout",
410
444
  "uiWorkspace",
411
- "locale"
445
+ "locale",
446
+ "shortcuts"
412
447
  ];
413
448
  /** Registers the sidebar shell and its service callbacks.
414
449
  * @param ctx - Client root context.
@@ -448,7 +483,10 @@ window.__ModuleLoader__.load({
448
483
  selectPanel: (id) => {
449
484
  ctx.layout.selectPanel(id);
450
485
  },
451
- hooks: { panels }
486
+ hooks: {
487
+ panels,
488
+ shortcuts: ctx.shortcuts.catalog
489
+ }
452
490
  });
453
491
  ctx.slots.inject("sidebar", () => ctx.slots.register({
454
492
  name: "sidebar",
@@ -11,5 +11,5 @@ export type HeaderLeadingControlsProps = PropsRuntime<'shell.leading'> & InjectF
11
11
  * @param props - Injected sidebar actions plus the sidebar locale seat.
12
12
  * @returns the two window-chrome controls.
13
13
  */
14
- export declare function HeaderLeadingControls({ toggleSidebar, startSession, t }: HeaderLeadingControlsProps): import("react").JSX.Element;
14
+ export declare function HeaderLeadingControls({ toggleSidebar, startSession, useShortcuts, t }: HeaderLeadingControlsProps): import("react").JSX.Element;
15
15
  //# sourceMappingURL=HeaderLeadingControls.d.ts.map
@@ -4,5 +4,5 @@ import type { SidebarRootComponentProps } from './contract/slots.ts';
4
4
  * @param props - composed slot props (runtime share + injected callbacks, contract/slots.ts).
5
5
  * @returns the sidebar element tree.
6
6
  */
7
- export declare function SidebarRoot({ collapsed, width, startSession, toggleSidebar, selectPanel, usePanels, usePanelInfo, t, renderSlot, }: SidebarRootComponentProps): import("react").JSX.Element;
7
+ export declare function SidebarRoot({ collapsed, width, startSession, toggleSidebar, selectPanel, usePanels, useShortcuts, usePanelInfo, t, renderSlot, }: SidebarRootComponentProps): import("react").JSX.Element;
8
8
  //# sourceMappingURL=SidebarRoot.d.ts.map
@@ -10,6 +10,7 @@
10
10
  import type { InjectFace, PropsLocale, PropsRenderSlots, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
11
11
  import type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store';
12
12
  import type { WorkspaceId } from '@deepseek-ai/dsh-api-workspace-controller/client';
13
+ import type { ShortcutCatalogEntry } from '@deepseek-ai/dsh-client-shortcuts/client';
13
14
  import type { MainPanelId } from '@deepseek-ai/dsh-client-ui-layout/client';
14
15
  declare module '@deepseek-ai/dsh-client-ui-slots' {
15
16
  interface SlotMap {
@@ -146,6 +147,7 @@ export type SidebarRootInjected = {
146
147
  /** Private reactive sources bound to framework selector hooks. */
147
148
  hooks: {
148
149
  panels: ObservableSnapshot<readonly SidebarPanelMetadata[]>;
150
+ shortcuts: ObservableSnapshot<readonly ShortcutCatalogEntry[]>;
149
151
  };
150
152
  };
151
153
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-sidebar",
3
3
  "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots",
4
- "version": "0.1.7-alpha.2",
4
+ "version": "0.1.7-rc.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -33,7 +33,8 @@
33
33
  "@deepseek-ai/dsh-client-ui-layout",
34
34
  "@deepseek-ai/dsh-client-ui-session",
35
35
  "@deepseek-ai/dsh-client-ui-workspace",
36
- "@deepseek-ai/dsh-client-locale"
36
+ "@deepseek-ai/dsh-client-locale",
37
+ "@deepseek-ai/dsh-client-shortcuts"
37
38
  ],
38
39
  "platform": "web"
39
40
  }
@@ -46,17 +47,18 @@
46
47
  "@types/react": "~18.3.1",
47
48
  "react": "^18.2.0",
48
49
  "clsx": "^2.0.0",
49
- "@deepseek-ai/dsh-client-locale": "0.1.7-alpha.2",
50
- "@deepseek-ai/dsh-api-workspace-controller": "0.1.7-alpha.2",
51
- "@deepseek-ai/dsh-client-store": "0.1.7-alpha.2",
52
- "@deepseek-ai/dsh-client-test-runtime": "0.1.7-alpha.2",
53
- "@deepseek-ai/dsh-client-ui-layout": "0.1.7-alpha.2",
54
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-alpha.2",
55
- "@deepseek-ai/dsh-client-ui-slots": "0.1.7-alpha.2",
56
- "@deepseek-ai/dsh-client-ui-session": "0.1.7-alpha.2",
57
- "@deepseek-ai/dsh-client-ui-workspace": "0.1.7-alpha.2",
58
- "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-alpha.2",
59
- "@deepseek-ai/cordis": "~4.0.4"
50
+ "@deepseek-ai/dsh-api-workspace-controller": "0.1.7-rc.2",
51
+ "@deepseek-ai/dsh-client-locale": "0.1.7-rc.2",
52
+ "@deepseek-ai/dsh-client-store": "0.1.7-rc.2",
53
+ "@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.2",
54
+ "@deepseek-ai/dsh-client-ui-layout": "0.1.7-rc.2",
55
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.2",
56
+ "@deepseek-ai/dsh-client-ui-session": "0.1.7-rc.2",
57
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.2",
58
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
59
+ "@deepseek-ai/dsh-client-ui-workspace": "0.1.7-rc.2",
60
+ "@deepseek-ai/cordis": "~4.0.4",
61
+ "@deepseek-ai/dsh-client-shortcuts": "0.1.7-rc.2"
60
62
  },
61
63
  "files": [
62
64
  "lib/index.js",