dsh-dock 0.16.0 → 0.16.1

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.
Files changed (3) hide show
  1. package/client.js +23 -33
  2. package/package.json +1 -1
  3. package/src/client.jsx +23 -30
package/client.js CHANGED
@@ -13886,7 +13886,7 @@ var feature13 = {
13886
13886
  };
13887
13887
 
13888
13888
  // src/client.jsx
13889
- var DOCK_VERSION = "0.16.0";
13889
+ var DOCK_VERSION = "0.16.1";
13890
13890
  var BUILTIN_FEATURES = [feature, feature2, feature3, feature4, feature5, feature6, feature7, feature8, feature9, feature10, feature11, feature12, feature13];
13891
13891
  var PLANNED_FEATURES = [];
13892
13892
  var PLANNED_NOTES = {};
@@ -13962,16 +13962,15 @@ var SHELL_CSS = [
13962
13962
  ".dock-switch.on{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary);}",
13963
13963
  ".dock-badge{flex:none;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);border-radius:999px;padding:3px 10px;font-size:12px;}",
13964
13964
  ".dock-body{border-top:1px solid var(--dsw-alias-border-l1);padding-top:8px;color:var(--dsw-alias-label-secondary);display:flex;flex-direction:column;gap:4px;}",
13965
- // 「··· 更多」菜单里的功能坞菜单项(docke2-mi- 前缀)+ 功能坞弹出面板(dockm- 前缀,仿 dsh 设置的居中模态:遮罩 + 对话框,左导航 + 右内容)
13966
- // 菜单行指标仿宿主内置菜单项(ui-primitives Menu.module.css 的 .item/.itemIcon/.itemLabel):
13967
- // 整宽块级行(按钮直接落在菜单视口的 flex 列里)、gap 6、min-height 34、padding 6px 8px、
13968
- // 圆角 --dsw-radius-md、字号 13/行高 20;悬停与键盘聚焦(宿主菜单走真实焦点)同款高亮背景。
13969
- ".docke2-mi-item{display:flex;align-items:center;gap:6px;box-sizing:border-box;width:100%;min-height:34px;padding:6px 8px;border:none;border-radius:var(--dsw-radius-md);background:transparent;cursor:pointer;font-family:inherit;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary);text-align:left;}",
13970
- ".docke2-mi-item:hover{background:var(--dsw-alias-interactive-bg-hover);}",
13971
- ".docke2-mi-item:focus-visible{background:var(--dsw-alias-interactive-bg-hover);outline:none;}",
13972
- ".docke2-mi-icon{display:inline-flex;flex:none;width:14px;height:14px;align-items:center;justify-content:center;color:var(--dsw-alias-menu-icon);}",
13973
- ".docke2-mi-icon svg{width:14px;height:14px;}",
13974
- ".docke2-mi-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}",
13965
+ // 侧栏入口按钮(docke2- 前缀)+ 功能坞弹出面板(dockm- 前缀,仿 dsh 设置的居中模态:遮罩 + 对话框,左导航 + 右内容)
13966
+ // 侧栏入口按钮(docke2- 前缀):与 dsh 设置按钮(.VOzbGW_trigger)几何逐条对齐——
13967
+ // 宽栏同为整宽左对齐行按钮(高 42、margin 4/-2、padding 0 10px 0 8px、圆角 12),窄栏同为 36 圆钮居中,
13968
+ // 使两按钮上下成列、左右边缘完全对齐(此前右对齐/叠放都会错位)。
13969
+ ".docke2-btn{box-sizing:border-box;cursor:pointer;display:flex;align-items:center;gap:8px;border:none;background:transparent;color:var(--dsw-alias-label-primary);border-radius:12px;width:calc(100% + 4px);height:42px;margin:4px -2px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;transition:background .15s var(--ds-ease-in-out),color .15s var(--ds-ease-in-out);}",
13970
+ ".docke2-btn:hover{background:var(--dsw-alias-interactive-bg-hover);}",
13971
+ ".docke2-btn.docke2-on{color:var(--dk-accent);background:var(--dk-accent-soft);}",
13972
+ ".docke2-btn.docke2-rail{width:36px;height:36px;margin:8px 0 10px;padding:0;border-radius:50%;justify-content:center;gap:0;}",
13973
+ ".docke2-label{white-space:nowrap;overflow:hidden;}",
13975
13974
  // 遮罩固定用深色半透明:亮色主题下宿主 bg-layer-1 是纯白,白底遮罩会让弹窗与页面完全无层次
13976
13975
  ".dockm-backdrop{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;background:rgba(15,17,21,.45);backdrop-filter:blur(4px);pointer-events:auto;animation:dockm-fade .15s var(--ds-ease-in-out);}",
13977
13976
  "@keyframes dockm-fade{from{opacity:0}to{opacity:1}}",
@@ -14115,27 +14114,18 @@ function DockIcon(props) {
14115
14114
  import_react26.default.createElement("rect", { x: 9, y: 9, width: 4.4, height: 4.4, rx: 1.2 })
14116
14115
  );
14117
14116
  }
14118
- function DockMenuItem(props) {
14117
+ function DockEntry(props) {
14118
+ const wide = !!props.wide;
14119
14119
  const [open, setOpen] = import_react26.default.useState(panelNav.open);
14120
14120
  import_react26.default.useEffect(() => subscribePanel(() => setOpen(panelNav.open)), []);
14121
- return import_react26.default.createElement(
14122
- "button",
14123
- {
14124
- type: "button",
14125
- role: "menuitem",
14126
- className: "docke2-mi-item",
14127
- onClick: () => {
14128
- if (typeof props.dismiss === "function") props.dismiss();
14129
- setPanelOpen(!open);
14130
- }
14131
- },
14132
- import_react26.default.createElement(
14133
- "span",
14134
- { className: "docke2-mi-icon" },
14135
- import_react26.default.createElement(DockIcon, { size: 14 })
14136
- ),
14137
- import_react26.default.createElement("span", { className: "docke2-mi-label" }, "\u529F\u80FD\u575E")
14138
- );
14121
+ return import_react26.default.createElement("button", {
14122
+ type: "button",
14123
+ className: "docke2-btn" + (open ? " docke2-on" : "") + (wide ? "" : " docke2-rail"),
14124
+ title: "\u529F\u80FD\u575E",
14125
+ "aria-label": "\u529F\u80FD\u575E",
14126
+ "aria-expanded": open,
14127
+ onClick: () => setPanelOpen(!open)
14128
+ }, import_react26.default.createElement(DockIcon, { size: wide ? 16 : 18 }), wide ? import_react26.default.createElement("span", { className: "docke2-label" }, "\u529F\u80FD\u575E") : null);
14139
14129
  }
14140
14130
  function DockModal() {
14141
14131
  const [nav, setNav] = import_react26.default.useState({ open: panelNav.open, active: panelNav.active, params: panelNav.params });
@@ -14550,9 +14540,9 @@ function apply(ctx) {
14550
14540
  initFeatureState(BUILTIN_FEATURES.concat(PLANNED_FEATURES));
14551
14541
  const slots = ctx.get("slots");
14552
14542
  if (slots === void 0) return;
14553
- slots.inject("settings.launcher.menu.item", () => slots.register(
14554
- { name: "settings.launcher.menu.item", id: "dsh-dock", order: 1, label: "\u529F\u80FD\u575E" },
14555
- (props) => import_react26.default.createElement(DockMenuItem, props)
14543
+ slots.inject("sidebar.footer.action", () => slots.register(
14544
+ { name: "sidebar.footer.action", id: "dsh-dock", order: 1, label: "\u529F\u80FD\u575E" },
14545
+ (props) => import_react26.default.createElement(DockEntry, props)
14556
14546
  ));
14557
14547
  slots.inject("shell.overlay", () => slots.register(
14558
14548
  { name: "shell.overlay", id: "dsh-dock-panel", order: 21, label: "\u529F\u80FD\u575E\u9762\u677F" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-dock",
3
- "version": "0.16.0",
3
+ "version": "0.16.1",
4
4
  "description": "DeepSeek Harness 功能坞插件(dsh-dock):模块化功能中枢——每个功能一个 features/ 模块(可单独提取成包发布,又可经 dockBridge 装回面板)。含用量记录(LLM 调用记账/费用统计,支持各模型自定义单价、多段分时价与周末/节假日谷价)、模型设置、图片理解代理、模型余额、任务动画(19 种运行动画 + 桌面伙伴 3D 场景)、任务通知(完成/异常/需确认通知、提示音、系统通知、钉钉/飞书推送)、运行状态(进行中任务与最近完成一览)、语音朗读(浏览器 TTS 读回复:回合下方喇叭按钮 + 自动朗读);侧栏入口 + 可拖拽弹窗(最大化/最小化/缩放)。",
5
5
  "type": "module",
6
6
  "main": "index.js",
package/src/client.jsx CHANGED
@@ -8,8 +8,8 @@
8
8
  // 在浏览器端 require("dsh-dock").dockBridge.register(def) 把自己的视图注册进本面板;
9
9
  // dock 未安装时该包走自己的独立面板——「单独成包发布」与「完美集成功能坞」两全。
10
10
  //
11
- // 面板挂载在 settings.section:设置 → 功能坞;侧栏「··· 更多」弹出菜单里另有「功能坞」
12
- // 菜单项(settings.launcher.menu.item),点击弹出居中功能面板(shell.overlay)。
11
+ // 面板挂载在 settings.section:设置 → 功能坞;侧栏底部另有「功能坞」入口按钮
12
+ // (sidebar.footer.action),点击弹出居中功能面板(shell.overlay)。
13
13
  // 弹层窗口:默认大窗,支持最大化/最小化、标题栏拖动、右下角缩放(几何页内记忆)。
14
14
  import react from "react";
15
15
  import {
@@ -33,7 +33,7 @@ import { feature as fMobileRelay } from "../features/mobile-relay/view.jsx";
33
33
  import { feature as fMobile } from "../features/mobile/view.js";
34
34
 
35
35
  const name = "dsh-dock";
36
- const DOCK_VERSION = "0.16.0";
36
+ const DOCK_VERSION = "0.16.1";
37
37
 
38
38
  // ---- 内置功能注册表:新功能 = features/<id>/ 加模块 + 这里 import 一行 ----
39
39
  const BUILTIN_FEATURES = [fTokenlog, fModelconfig, fProviderConfig, fHeartbeat, fTheme, fBalance, fAnimation, fNotify, fRunState, fTts, fGames, fMobileRelay, fMobile];
@@ -125,16 +125,15 @@ const SHELL_CSS = [
125
125
  ".dock-switch.on{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary);}",
126
126
  ".dock-badge{flex:none;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);border-radius:999px;padding:3px 10px;font-size:12px;}",
127
127
  ".dock-body{border-top:1px solid var(--dsw-alias-border-l1);padding-top:8px;color:var(--dsw-alias-label-secondary);display:flex;flex-direction:column;gap:4px;}",
128
- // 「··· 更多」菜单里的功能坞菜单项(docke2-mi- 前缀)+ 功能坞弹出面板(dockm- 前缀,仿 dsh 设置的居中模态:遮罩 + 对话框,左导航 + 右内容)
129
- // 菜单行指标仿宿主内置菜单项(ui-primitives Menu.module.css 的 .item/.itemIcon/.itemLabel):
130
- // 整宽块级行(按钮直接落在菜单视口的 flex 列里)、gap 6、min-height 34、padding 6px 8px、
131
- // 圆角 --dsw-radius-md、字号 13/行高 20;悬停与键盘聚焦(宿主菜单走真实焦点)同款高亮背景。
132
- ".docke2-mi-item{display:flex;align-items:center;gap:6px;box-sizing:border-box;width:100%;min-height:34px;padding:6px 8px;border:none;border-radius:var(--dsw-radius-md);background:transparent;cursor:pointer;font-family:inherit;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary);text-align:left;}",
133
- ".docke2-mi-item:hover{background:var(--dsw-alias-interactive-bg-hover);}",
134
- ".docke2-mi-item:focus-visible{background:var(--dsw-alias-interactive-bg-hover);outline:none;}",
135
- ".docke2-mi-icon{display:inline-flex;flex:none;width:14px;height:14px;align-items:center;justify-content:center;color:var(--dsw-alias-menu-icon);}",
136
- ".docke2-mi-icon svg{width:14px;height:14px;}",
137
- ".docke2-mi-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}",
128
+ // 侧栏入口按钮(docke2- 前缀)+ 功能坞弹出面板(dockm- 前缀,仿 dsh 设置的居中模态:遮罩 + 对话框,左导航 + 右内容)
129
+ // 侧栏入口按钮(docke2- 前缀):与 dsh 设置按钮(.VOzbGW_trigger)几何逐条对齐——
130
+ // 宽栏同为整宽左对齐行按钮(高 42、margin 4/-2、padding 0 10px 0 8px、圆角 12),窄栏同为 36 圆钮居中,
131
+ // 使两按钮上下成列、左右边缘完全对齐(此前右对齐/叠放都会错位)。
132
+ ".docke2-btn{box-sizing:border-box;cursor:pointer;display:flex;align-items:center;gap:8px;border:none;background:transparent;color:var(--dsw-alias-label-primary);border-radius:12px;width:calc(100% + 4px);height:42px;margin:4px -2px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;transition:background .15s var(--ds-ease-in-out),color .15s var(--ds-ease-in-out);}",
133
+ ".docke2-btn:hover{background:var(--dsw-alias-interactive-bg-hover);}",
134
+ ".docke2-btn.docke2-on{color:var(--dk-accent);background:var(--dk-accent-soft);}",
135
+ ".docke2-btn.docke2-rail{width:36px;height:36px;margin:8px 0 10px;padding:0;border-radius:50%;justify-content:center;gap:0;}",
136
+ ".docke2-label{white-space:nowrap;overflow:hidden;}",
138
137
  // 遮罩固定用深色半透明:亮色主题下宿主 bg-layer-1 是纯白,白底遮罩会让弹窗与页面完全无层次
139
138
  ".dockm-backdrop{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;background:rgba(15,17,21,.45);backdrop-filter:blur(4px);pointer-events:auto;animation:dockm-fade .15s var(--ds-ease-in-out);}",
140
139
  "@keyframes dockm-fade{from{opacity:0}to{opacity:1}}",
@@ -303,24 +302,18 @@ function DockIcon(props) {
303
302
  react.createElement("rect", { x: 9, y: 9, width: 4.4, height: 4.4, rx: 1.2 }));
304
303
  }
305
304
 
306
- // 「··· 更多」菜单里的功能坞菜单项(settings.launcher.menu.item)。
307
- // 协议约束:恰好一个 role="menuitem" 按钮;宿主 Menu 不会因点击自动关闭,激活时先
308
- // dismiss()(关闭菜单,宿主负责焦点回还),再切换功能坞弹层;它不是 disclosure 触发器,
309
- // 不带 aria-expanded/aria-haspopup。开合状态与旧侧栏入口同源:panelNav.open + subscribePanel。
310
- function DockMenuItem(props) {
305
+ function DockEntry(props) {
306
+ const wide = !!props.wide;
311
307
  const [open, setOpen] = react.useState(panelNav.open);
312
308
  react.useEffect(() => subscribePanel(() => setOpen(panelNav.open)), []);
313
309
  return react.createElement("button", {
314
310
  type: "button",
315
- role: "menuitem",
316
- className: "docke2-mi-item",
317
- onClick: () => {
318
- if (typeof props.dismiss === "function") props.dismiss();
319
- setPanelOpen(!open);
320
- }
321
- }, react.createElement("span", { className: "docke2-mi-icon" },
322
- react.createElement(DockIcon, { size: 14 })),
323
- react.createElement("span", { className: "docke2-mi-label" }, "功能坞"));
311
+ className: "docke2-btn" + (open ? " docke2-on" : "") + (wide ? "" : " docke2-rail"),
312
+ title: "功能坞",
313
+ "aria-label": "功能坞",
314
+ "aria-expanded": open,
315
+ onClick: () => setPanelOpen(!open)
316
+ }, react.createElement(DockIcon, { size: wide ? 16 : 18 }), wide ? react.createElement("span", { className: "docke2-label" }, "功能坞") : null);
324
317
  }
325
318
 
326
319
  // ---- 功能坞弹出面板:shell.overlay(仿 dsh 设置:居中模态 = 遮罩 + 对话框) ----
@@ -691,9 +684,9 @@ export function apply(ctx) {
691
684
  const slots = ctx.get("slots");
692
685
  if (slots === undefined) return;
693
686
 
694
- slots.inject("settings.launcher.menu.item", () => slots.register(
695
- { name: "settings.launcher.menu.item", id: "dsh-dock", order: 1, label: "功能坞" },
696
- (props) => react.createElement(DockMenuItem, props)));
687
+ slots.inject("sidebar.footer.action", () => slots.register(
688
+ { name: "sidebar.footer.action", id: "dsh-dock", order: 1, label: "功能坞" },
689
+ (props) => react.createElement(DockEntry, props)));
697
690
  slots.inject("shell.overlay", () => slots.register(
698
691
  { name: "shell.overlay", id: "dsh-dock-panel", order: 21, label: "功能坞面板" },
699
692
  () => react.createElement(DockModal, null)));