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.
- package/client.js +23 -33
- package/package.json +1 -1
- 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.
|
|
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
|
-
//
|
|
13966
|
-
//
|
|
13967
|
-
//
|
|
13968
|
-
//
|
|
13969
|
-
".docke2-
|
|
13970
|
-
".docke2-
|
|
13971
|
-
".docke2-
|
|
13972
|
-
".docke2-
|
|
13973
|
-
".docke2-
|
|
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
|
|
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
|
-
|
|
14125
|
-
|
|
14126
|
-
|
|
14127
|
-
|
|
14128
|
-
|
|
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("
|
|
14554
|
-
{ name: "
|
|
14555
|
-
(props) => import_react26.default.createElement(
|
|
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.
|
|
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
|
-
//
|
|
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.
|
|
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
|
-
//
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
".docke2-
|
|
133
|
-
".docke2-
|
|
134
|
-
".docke2-
|
|
135
|
-
".docke2-
|
|
136
|
-
".docke2-
|
|
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
|
-
|
|
307
|
-
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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("
|
|
695
|
-
{ name: "
|
|
696
|
-
(props) => react.createElement(
|
|
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)));
|