dsh-task-ledger 0.0.131 → 0.0.133
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.md +82 -4
- package/README.zh-CN.md +86 -0
- package/assets/icon.svg +4 -0
- package/dist/client.js +1328 -907
- package/dist/client.js.map +1 -1
- package/dist/host/routes.js +31 -2
- package/dist/index.d.ts +15 -0
- package/dist/index.js +37 -2
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +12 -4
- package/skill/README.md +122 -30
- package/skill/SKILL.md +1 -1
- package/skill/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -46,10 +46,10 @@ window.__ModuleLoader__.load({
|
|
|
46
46
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
47
47
|
let react_dom = require("react-dom");
|
|
48
48
|
react_dom = __toESM(react_dom, 1);
|
|
49
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
50
|
-
const TOKENS_CSS_TEMPLATE = "\n/* ── 文字(宿主 label 四档 + 反色面用字)────────────────────────────── */\nbody{\n --dshpc-fg:var(--dsw-alias-label-primary,#1f2328);\n --dshpc-fg-2:var(--dsw-alias-label-secondary,#5c6370);\n --dshpc-fg-3:var(--dsw-alias-label-tertiary,#767d87);\n --dshpc-fg-4:var(--dsw-alias-label-caption,#9aa1ab);\n --dshpc-fg-dim:var(--dsw-alias-label-dimmed,#b9bfc7);\n /* 反色面上的字(实心钮 / 角标):暗色下是 bluish-1000,故用 -foreground 而非 -inverted */\n --dshpc-fg-inverse:var(--dsw-alias-label-primary-foreground,#fff);\n\n /* ── 面(宿主 bg-layer 三档 + 下沉轨道底)──────────────────────────── */\n --dshpc-surface-1:var(--dsw-alias-bg-layer-1,#fff);\n --dshpc-surface-2:var(--dsw-alias-bg-layer-2,#fff);\n --dshpc-surface-3:var(--dsw-alias-bg-layer-3,#fff);\n /* 「选中亮片」的底盘色(配 --dshpc-shadow-raised 用) */\n --dshpc-surface-raised:var(--dsw-alias-bg-layer-1,#fff);\n /* 轨道 / 下沉底(官方分段控件轨道用的就是这条) */\n --dshpc-surface-sunken:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06));\n /* 整页 / 编辑器底(bg-base) */\n --dshpc-surface-base:var(--dsw-alias-bg-base,#fff);\n /* 自绘浮层 / 菜单卡的不透明底(= base;不要用半透明的 specific-menu) */\n --dshpc-surface-menu:var(--dshpc-surface-base);\n /* markdown 代码块面 / 字体(会话镜像里用到) */\n --dshpc-code-surface:var(--dsw-alias-markdown-code-block,rgba(128,128,128,.10));\n --dshpc-code-font:var(--dsw-font-markdown-code-block-small,12px/18px var(--ds-font-family-code,monospace));\n /* 警告文字色(宿主 state-warn-label) */\n --dshpc-warning-label:var(--dsw-alias-state-warn-label,#f5a623);\n /* 固定中性实面(自绘浮层、深色主题下必须自己变的那几个)——只有它需要暗色覆盖 */\n --dshpc-solid:var(--dsw-static-neutral-00,#fff);\n --dshpc-on-solid:var(--dsw-alias-label-primary,#1f2328);\n /* 交付文件卡那种「浅底盘 + hover 加深」两拍 */\n --dshpc-plate:var(--dsw-static-neutral-50,#fafafa);\n --dshpc-plate-hover:var(--dsw-static-neutral-100,#f5f5f5);\n /* ⚠️ 这些**固定中性面一律用 rgba 字面量**(2026-10-19 真机教训):不要写成\n 「rgba 回退行 + 嵌 --dsw-static-* 的 color-mix 行」两条同名声明——自定义属性**后者恒胜**,\n 哪怕它的值在宿主里算不出来(static 变量 invalid)⇒ 整条 token 作废、rgba 兜底一起被废,\n 0.2.6 里 Segmented 轨道全透明就是这么来的。要跟宿主主题联动的面用 alias token(那些实测有效)。 */\n --dshpc-icon-plate:rgba(255,255,255,.5);\n /* 表头底:浅色主题**偏深**,且必须**比斑马纹(--dshpc-plate)再深一档**——\n 两者不能撞色(用户 2026-10-02:表头跟斑马纹一模一样)。 */\n --dshpc-head-bg:var(--dsw-static-neutral-100,#f5f5f5);\n /* 表格底 / 行 hover(2026-10-30 用户二次定案:表头与通栏**互换**底色):\n 表头默认底 = 通栏原来那层灰(--dshpc-surface-sunken,跟着宿主交互面走);\n 通栏默认底 = 表头原来那色(亮 #f6f8fa / 暗 #151b23,参考图实测,与深色段同源);\n 行 hover 是「一层极淡的黑」≈1.5%(用户:再浅一半,要特别淡)。 */\n --dshpc-table-head-bg:var(--dshpc-surface-sunken);\n --dshpc-table-banner-bg:#f6f8fa;\n --dshpc-table-row-hover:rgba(15,15,15,.015);\n /* 图标小底板(产出物):浅色下要**看得见**(原先取 plate ⇒ 在白底上等于没有);hover 加倍。 */\n --dshpc-chip-bg:rgba(15,15,15,.07);\n --dshpc-chip-bg-hover:rgba(15,15,15,.14);\n /* 展开行:**带透明度的蓝**——不是灰、也不是纯色,透出卡片底色,一眼看出「这是展开的」\n (用户 2026-10-02:灰色跟斑马纹分不出来)。内容区再淡一档,形成「行深 / 内容浅」的区隔。 */\n --dshpc-open-bg:rgba(37,99,235,.10);\n --dshpc-open-bg-soft:rgba(37,99,235,.05);\n --dshpc-card-hover:rgba(37,99,235,.07);\n\n /* ── 描边四档(宿主真值:l1 4% / l2 10% / l3 12% / l4 16%)────────── */\n --dshpc-border-faint:var(--dsw-alias-border-l1,#0000000a);\n --dshpc-border:var(--dsw-alias-border-l2,#0000001a);\n --dshpc-border-strong:var(--dsw-alias-border-l3,#0000001f);\n --dshpc-border-heavy:var(--dsw-alias-border-l4,#00000029);\n\n /* ── 品牌 / 语义色 ────────────────────────────────────────────────── */\n /* 品牌「面」色:明色近黑、暗色近白(官方 Switch 选中态即此),**不是蓝色** */\n --dshpc-accent:var(--dsw-alias-brand-primary,#0f1115);\n /* 蓝色:强调 / 选中 / 焦点,一律走这条 */\n --dshpc-business:var(--dsw-alias-state-business-primary,#3b5bdb);\n --dshpc-success:var(--dsw-alias-state-success-primary,#22c55e);\n /* ⚠️ 是 state-warn(不是 state-warning,后者宿主无此定义) */\n --dshpc-warning:var(--dsw-alias-state-warn-primary,#f59e0b);\n --dshpc-danger:var(--dsw-alias-state-error-primary,#ec1313);\n --dshpc-link:var(--dsw-alias-link,#3b5bdb);\n /* 语义色**实面**上的字(角标 / 实心提示):宿主红绿黄三色都是中调 ⇒ 白字两个主题都可读,\n 故这是一条与主题无关的常量;不要拿 --dshpc-fg-inverse 顶——它在暗色下是近黑,压在红底上看不清。 */\n --dshpc-on-signal:#fff;\n /* 黄底上的字:黄色是中高明度,白字看不清 ⇒ 固定深色(与主题无关)。 */\n --dshpc-on-warning:#1f2328;\n /* 告警严重度的圆点底色(2026-11-03 从 feedback.css 收到这里)。\n 与主题无关的一组常量:这几个色要在任意底色上都认得出来,所以**不跟宿主 state 色走**\n (宿主 state-warn-primary 偏亮,压白 ✕ 看不清)。语义色改动请只改这里。 */\n --dshpc-sev-info:#2563eb;\n --dshpc-sev-success:#16a34a;\n --dshpc-sev-warning:#d97706;\n --dshpc-sev-error:#dc2626;\n\n /* ── 实心按钮的 hover / active 派生态(2026-10-19 用户点名)─────────────────\n 原实现是 :hover 直接压 opacity .9:黑底压 10% 几乎看不出来,用户原话「完全感觉不到颜色变了」。\n ⇒ 改成对底色做**明确的混色**(压 22% / 34%),不用 opacity:\n · 亮色主题:黑底(--dshpc-accent)掺白提亮;红 / 绿 / 黄 / 蓝底掺黑压深;\n · 暗色主题:反过来(暗底掺白、亮底掺黑)。\n 混色对象是**固定中性色字面量**(#fff / #000),不依赖宿主 static-neutral 是否存在;\n 旧内核不认 color-mix 时整条声明作废 ⇒ 回落各档原色(可接受:仍可点,只是没有 hover 反馈)。 */\n --dshpc-accent-hover:color-mix(in srgb,var(--dshpc-accent) 78%,#ffffff);\n --dshpc-accent-active:color-mix(in srgb,var(--dshpc-accent) 64%,#ffffff);\n --dshpc-danger-hover:color-mix(in srgb,var(--dshpc-danger) 78%,#000000);\n --dshpc-danger-active:color-mix(in srgb,var(--dshpc-danger) 64%,#000000);\n --dshpc-success-hover:color-mix(in srgb,var(--dshpc-success) 78%,#000000);\n --dshpc-success-active:color-mix(in srgb,var(--dshpc-success) 64%,#000000);\n --dshpc-warning-hover:color-mix(in srgb,var(--dshpc-warning) 78%,#000000);\n --dshpc-warning-active:color-mix(in srgb,var(--dshpc-warning) 64%,#000000);\n --dshpc-business-hover:color-mix(in srgb,var(--dshpc-business) 78%,#000000);\n --dshpc-business-active:color-mix(in srgb,var(--dshpc-business) 64%,#000000);\n /* 语义色**浅底**:状态色系的「一块底色」——执行记录页每条流水账的块底就是它\n (用户 2026-10-04:正常态给同色系很浅的透明底、失败用红底透出来)。\n 用 「color-mix」 现算而不写死 rgba:状态色本身跟随宿主 alias,主题一换自动成立。\n ⚠️ **深色下要更淡**:用户 2026-10-04「深色风格的绿色和红色好像都有点深」⇒ dark 段\n 把这四条压到 5%(更贴近面板底、存在感更弱);浅色段维持 8%。两端各自给值,不共用一条曲线。\n 命名收在 tokens.ts 单点(本仓硬规矩:业务文件不许自造 --dshpc-*)。 */\n --dshpc-success-soft:color-mix(in srgb,var(--dshpc-success) 8%,transparent);\n --dshpc-warning-soft:color-mix(in srgb,var(--dshpc-warning) 8%,transparent);\n --dshpc-danger-soft:color-mix(in srgb,var(--dshpc-danger) 8%,transparent);\n --dshpc-business-soft:color-mix(in srgb,var(--dshpc-business) 8%,transparent);\n\n /* ── 扩展语义色(2026-10-29 用户拍板:分类 / 图表常用色八支)──────────────\n 宿主无对应 alias ⇒ 写死 hex(不跟随宿主换肤);实心面字色统一走 --dshpc-on-signal(白),\n 因八支明度都低于黄 / 青柠,白字两主题均 ≥4.5:1 可读。每条自带 hover/active/soft 派生;\n 暗色段只覆盖派生(base 写死、两主题同值)。 */\n --dshpc-purple:#9333ea;\n --dshpc-purple-hover:color-mix(in srgb,var(--dshpc-purple) 78%,#000000);\n --dshpc-purple-active:color-mix(in srgb,var(--dshpc-purple) 64%,#000000);\n --dshpc-purple-soft:color-mix(in srgb,var(--dshpc-purple) 8%,transparent);\n --dshpc-pink:#db2777;\n --dshpc-pink-hover:color-mix(in srgb,var(--dshpc-pink) 78%,#000000);\n --dshpc-pink-active:color-mix(in srgb,var(--dshpc-pink) 64%,#000000);\n --dshpc-pink-soft:color-mix(in srgb,var(--dshpc-pink) 8%,transparent);\n --dshpc-cyan:#0e7490;\n --dshpc-cyan-hover:color-mix(in srgb,var(--dshpc-cyan) 78%,#000000);\n --dshpc-cyan-active:color-mix(in srgb,var(--dshpc-cyan) 64%,#000000);\n --dshpc-cyan-soft:color-mix(in srgb,var(--dshpc-cyan) 8%,transparent);\n --dshpc-teal:#0f766e;\n --dshpc-teal-hover:color-mix(in srgb,var(--dshpc-teal) 78%,#000000);\n --dshpc-teal-active:color-mix(in srgb,var(--dshpc-teal) 64%,#000000);\n --dshpc-teal-soft:color-mix(in srgb,var(--dshpc-teal) 8%,transparent);\n --dshpc-orange:#c2410c;\n --dshpc-orange-hover:color-mix(in srgb,var(--dshpc-orange) 78%,#000000);\n --dshpc-orange-active:color-mix(in srgb,var(--dshpc-orange) 64%,#000000);\n --dshpc-orange-soft:color-mix(in srgb,var(--dshpc-orange) 8%,transparent);\n --dshpc-indigo:#4f46e5;\n --dshpc-indigo-hover:color-mix(in srgb,var(--dshpc-indigo) 78%,#000000);\n --dshpc-indigo-active:color-mix(in srgb,var(--dshpc-indigo) 64%,#000000);\n --dshpc-indigo-soft:color-mix(in srgb,var(--dshpc-indigo) 8%,transparent);\n --dshpc-rose:#e11d48;\n --dshpc-rose-hover:color-mix(in srgb,var(--dshpc-rose) 78%,#000000);\n --dshpc-rose-active:color-mix(in srgb,var(--dshpc-rose) 64%,#000000);\n --dshpc-rose-soft:color-mix(in srgb,var(--dshpc-rose) 8%,transparent);\n --dshpc-slate:#475569;\n --dshpc-slate-hover:color-mix(in srgb,var(--dshpc-slate) 78%,#000000);\n --dshpc-slate-active:color-mix(in srgb,var(--dshpc-slate) 64%,#000000);\n --dshpc-slate-soft:color-mix(in srgb,var(--dshpc-slate) 8%,transparent);\n\n /* ⚠️ 2026-10-18 用户拍板:宿主 alias 的 hover(暗色白 8% / 亮色 6%)**太弱**,\n 「移上去要仔细看才看得出来」⇒ 不再委托宿主 hover 别名,改为自掺中性色并加重:\n 亮色掺黑 10%、暗色掺白 14%(active 再加一档)。按钮 / 分段轨道 / 各类 hover 底同时受益。\n ⚠️ 必须保留 rgba 兜底行在前(本文件惯例,见 icon-plate 注释):掺的是**固定中性色**\n (neutral-900=#0f0f0f / neutral-00=#fff),预计算无损;旧内核不认 color-mix 时走兜底,\n 否则整条 background:var(--seg-track) 作废 ⇒ 分段轨道透明(真踩过:预览站轨道消失)。 */\n --dshpc-hover:rgba(15,15,15,.10);\n --dshpc-active:rgba(15,15,15,.18);\n /* 分段控件轨道底:专用 token(rgba 字面量、不借 --dshpc-hover 中转)——\n 2026-10-19 教训:变量链中间任何一环 invalid ⇒ background 整条作废、轨道全透明。\n 亮色:黑 7%(比 hover 的 10% 淡一档,选中白片才跳得出)。 */\n --dshpc-seg-track:rgba(15,15,15,.07);\n --dshpc-mask:var(--dsw-alias-bg-mask-1,#0000003d);\n /* 「选中面」(2026-10-06,任务日程页首创)= 当前底色**朝更深掺 12% 文字色**:\n 浅色主题下文字色是黑 ⇒ 选中面比常态底色**深一档**。深色分支见 body[data-ds-dark-theme](朝背景色掺)。\n 语义:标记「正在看的东西」,比常态明显、又不许盖住内容(不许用半透明叠状态色)。 */\n --dshpc-selected-bg:color-mix(in srgb,var(--dshpc-surface-1) 88%,var(--dshpc-fg));\n /* 任务日程页本月格默认底(2026-10-06 → 续2):浅色下给**淡蓝**(business 8% 透白底)——\n 参照用户参考稿里未选中日程块 / Tuesday 列的那种蓝、再浅一点点;\n 相邻月补位格仍走 --dshpc-surface-2(更灰),不受影响。\n 深色段维持 #23262e(用户:深色 UI 已差不多,不动)。 */\n --dshpc-cal-cell-bg:color-mix(in srgb,var(--dshpc-business) 8%,var(--dshpc-surface-1));\n /* 任务日程页「点开某天」展开的面板底(2026-10-06 续):浅色下**无限接近白、只带一丁点灰**\n (neutral-50 = #fafafa)——面板里装半透明执行记录列表,底再深整片就发糊发灰;\n 深色段沿用原 selected-bg 暗值,保持不动。 */\n --dshpc-cal-panel-bg:var(--dsw-static-neutral-50,#fafafa);\n /* 任务日程页本月格 hover 底(浅色段,2026-10-06 续3):不再走灰色通用交互底——\n 鼠标移上去应是「更亮一点点的蓝」(与深色段同语义:hover = 提亮的蓝,不是灰下去)。\n 浓度**介于**表头蓝(14%)与未选中格蓝(8%)之间、略偏表头一侧:business 12% 透白底\n (比表头浅一点、比未选中格深一点)。 */\n --dshpc-cal-cell-hover:color-mix(in srgb,var(--dshpc-business) 12%,var(--dshpc-surface-1));\n\n /* ── 投影 / 焦点 ──────────────────────────────────────────────────── */\n --dshpc-shadow-1:var(--dsw-elevation-soft,0 4px 16px 0 #00000008);\n /* 亮片自带的浮起感(选中态用;与 --dshpc-surface-raised 配对) */\n --dshpc-shadow-raised:var(--dsw-elevation-soft,0 4px 16px 0 #00000008);\n --dshpc-shadow-2:var(--dsw-shadow-lv3,0 12px 32px 0 #00000014);\n /* 键盘焦点环。⚠️ 不用宿主 --dsw-focus-ring-color:它默认值是 transparent(兜底不生效、会隐身) */\n --dshpc-focus:var(--dsw-alias-state-business-primary,#3b5bdb);\n\n /* ── 圆角(宿主真值 4 / 8 / 12 / 16 / 20 / 28)─────────────────────── */\n --dshpc-radius-xs:var(--dsw-radius-xs,4px);\n --dshpc-radius-sm:var(--dsw-radius-sm,8px);\n --dshpc-radius-md:var(--dsw-radius-md,12px);\n --dshpc-radius-lg:var(--dsw-radius-lg,16px);\n --dshpc-radius-xl:var(--dsw-radius-xl,20px);\n --dshpc-radius-panel:var(--dsw-radius-panel,28px);\n /* 全圆(胶囊标签):宿主的 radius 档最大只有 28px,撑不满 24px 高的 chip */\n --dshpc-radius-pill:999px;\n\n /* ── 间距四拍(只许用这四档,不许出现 5 / 7 / 9px)────────────────── */\n --dshpc-space-1:4px;\n --dshpc-space-2:8px;\n --dshpc-space-3:12px;\n --dshpc-space-4:16px;\n\n /* ── 控件高度:离散三档(控件用 size=\"sm|md|lg\" 选;调用点不许自定义高度,\n 真不够用才允许在调用点本地覆盖 --dshpc-control-h-*,属例外而非常态)── */\n --dshpc-control-h-sm:24px;\n --dshpc-control-h-md:28px;\n --dshpc-control-h-lg:32px;\n\n /* ── 字号 / 行高:直绑宿主字号族(宿主真值 11 / 12 / 13 / 14 / 16)───── */\n --dshpc-font-xs:var(--dsw-font-xxxs-11-font-size,11px);\n --dshpc-font-sm:var(--dsw-font-xxs-12-font-size,12px);\n --dshpc-font-md:var(--dsw-font-xs-13-font-size,13px);\n --dshpc-font-lg:var(--dsw-font-s-14-font-size,14px);\n --dshpc-font-xl:var(--dsw-font-base-16-font-size,16px);\n --dshpc-line-xs:var(--dsw-font-xxxs-11-line-height,14px);\n --dshpc-line-sm:var(--dsw-font-xxs-12-line-height,18px);\n --dshpc-line-md:var(--dsw-font-xs-13-line-height,20px);\n --dshpc-line-lg:var(--dsw-font-s-14-line-height,22px);\n --dshpc-line-xl:var(--dsw-font-base-16-line-height,24px);\n --dshpc-font-mono:var(--ds-font-family-code,monospace);\n\n /* ── 层级阶梯(业务文件不许再写裸 z-index)───────────────────────── */\n /* 页面级预览分栏 → 抽屉(新建/编辑)→ 弹窗/确认框 → 浮层菜单 → 浮层提示 */\n /* 内容层吸顶(天标签 / 表头这类「跟着滚但压住同层内容」的元素):只压同层兄弟,\n 必须低于下面所有浮层档 —— 所以它不是「开新浮层档」,而是内容层内部的排序位。 */\n --dshpc-z-sticky:10;\n --dshpc-z-dock:1030;\n --dshpc-z-drawer:1040;\n --dshpc-z-modal:1070;\n /* 收起后的耳朵:必须高于弹窗遮罩,否则弹窗一开就点不到它(2026-11-04 用户真机)。\n 只给耳朵用,页面级分栏本体仍是布局成员,不跟着抬高。 */\n --dshpc-z-ear:1080;\n --dshpc-z-menu:1100;\n --dshpc-z-tip:1200;\n /* 语义别名(2026-11-03 面板皮肤统一):业务文件只许用这两个说「我要一层浮层」,\n 不再各自写 1099/1100/1200/1201 这类字面量。\n panel = 浮层面板本体(picker 弹窗、锚定面板);\n popmenu = 叠在面板之上的菜单(▾ 选层、Picker 下拉)与其透明遮罩。 */\n --dshpc-z-panel:var(--dshpc-z-menu);\n --dshpc-z-popmenu:var(--dshpc-z-tip);\n\n /* ── 动效 ─────────────────────────────────────────────────────────── */\n --dshpc-dur:var(--ds-transition-duration,.2s);\n --dshpc-dur-fast:var(--ds-transition-duration-fast,.12s);\n --dshpc-ease:var(--ds-ease-in-out,cubic-bezier(.4,0,.2,1));\n /* 运行中状态的脉动时长(2026-10-06 统一前后两端:任务配置里的绿呼吸 → 蓝、放慢;\n 执行记录里的蓝闪 → 放慢一点。两者用同一个值,动画形状本就一致)。 */\n --dshpc-dur-run:500ms;\n}\n\n/* ── 明暗差异的**唯一**落点 ──────────────────────────────────────────────\n 判据 = body[data-ds-dark-theme](宿主 0.2.0-rc.2 源码核实:启动脚本 toggleAttribute 写入,\n 唯一明暗判据;插件禁止用 prefers-color-scheme —— 它跟的是系统、不是用户在宿主里的选择)。\n 下面只放 alias 表达不了的「固定中性面」;颜色若能靠 alias 自动跟随,一律不要写在这里。 */\nbody[data-ds-dark-theme]{\n /* 深色段的蓝**刻意不跟随宿主 alias**(唯一例外):宿主暗色 alias 给的是 #60a5fa 一档的高亮蓝,\n 实心面(Chip / Button info / 日期选中格)压白字会发糊 —— 用户 2026-10-29 实测反馈。\n ⇒ 深色下改定向浅色状态的蓝(#3b5bdb)靠,只在明度上抬一点点,保证它在暗底上仍看得见:\n #4c6bd8 对白字 ≈4.8:1(原亮蓝只有 ~2.3:1),对日历格底 ≈3.2:1 仍过 UI 件的 3:1 线。\n 代价:宿主换品牌色时深色不再自动跟着变,需要这里手动同步。 */\n --dshpc-business:#4c6bd8;\n --dshpc-solid:var(--dsw-static-neutral-900,#0f0f0f);\n --dshpc-on-solid:var(--dsw-static-neutral-00,#fff);\n /* 实心按钮 hover / active(暗色版):黑底(浅色主题的近黑 → 暗色下的近白)掺黑压深;\n 红 / 绿 / 黄 / 蓝掺白提亮。与亮色段方向相反,保证两种主题下「一眼看出变了」。 */\n --dshpc-accent-hover:color-mix(in srgb,var(--dshpc-accent) 80%,#000000);\n --dshpc-accent-active:color-mix(in srgb,var(--dshpc-accent) 66%,#000000);\n --dshpc-danger-hover:color-mix(in srgb,var(--dshpc-danger) 78%,#ffffff);\n --dshpc-danger-active:color-mix(in srgb,var(--dshpc-danger) 64%,#ffffff);\n --dshpc-success-hover:color-mix(in srgb,var(--dshpc-success) 78%,#ffffff);\n --dshpc-success-active:color-mix(in srgb,var(--dshpc-success) 64%,#ffffff);\n --dshpc-warning-hover:color-mix(in srgb,var(--dshpc-warning) 78%,#ffffff);\n --dshpc-warning-active:color-mix(in srgb,var(--dshpc-warning) 64%,#ffffff);\n /* 同上:掺白比例从 22% / 36% 收到 12% / 22% —— 底色已变深,照旧比例提亮会在 hover 瞬间\n 把白字对比打回 ~3:1(正是用户嫌糊的那一档);收窄后 hover 仍可感知、字仍清晰。 */\n --dshpc-business-hover:color-mix(in srgb,var(--dshpc-business) 88%,#ffffff);\n --dshpc-business-active:color-mix(in srgb,var(--dshpc-business) 78%,#ffffff);\n /* 暗色 hover 掺白 14% / active 24%(对齐上面 2026-10-18 的加重拍板)。rgba 兜底行同上。 */\n --dshpc-hover:rgba(255,255,255,.14);\n --dshpc-active:rgba(255,255,255,.24);\n /* 分段轨道(暗色版):白 10%——比 hover 淡一档,选中亮片才跳得出。 */\n --dshpc-seg-track:rgba(255,255,255,.10);\n --dshpc-plate:var(--dsw-static-neutral-850,#212123);\n --dshpc-plate-hover:var(--dsw-static-neutral-800,#292929);\n --dshpc-icon-plate:rgba(255,255,255,.05);\n /* 暗色主题**反过来**:表头要比卡片面**亮**、比斑马纹再**浅一档**(用户:纯黑背景没法看)。 */\n --dshpc-head-bg:var(--dshpc-surface-2);\n /* 表格(2026-10-30 用户二次定案:与通栏互换底色):通栏底取表头原来那色 #151b23\n (亮色段对应 #f6f8fa);表头默认底沿用亮色段定义的 --dshpc-surface-sunken,不在暗色段重写;\n 行 hover 是「一层极淡的白」≈3% —— 暗底上用黑会越悬越暗,看不出「浅灰」反馈。 */\n --dshpc-table-banner-bg:#151b23;\n --dshpc-table-row-hover:rgba(255,255,255,.03);\n /* 暗色底板**微亮**;hover **更亮**(原先 hover 取 plate-hover 反而更淡 ⇒ 鼠标移上去就没了)。 */\n --dshpc-chip-bg:rgba(255,255,255,.08);\n --dshpc-chip-bg-hover:rgba(255,255,255,.16);\n /* 暗色下蓝色要更亮、透明度略高才压得住深底。 */\n --dshpc-open-bg:rgba(96,165,250,.18);\n --dshpc-open-bg-soft:rgba(96,165,250,.08);\n --dshpc-card-hover:rgba(96,165,250,.13);\n /* 语义色**浅底**(深色版):用户嫌深色的绿 / 红「有点深」⇒ 压到 **5%**(浅色段是 8%),\n 更贴近面板底色、存在感更弱;块底与状态色竖条仍同源(竖条是实色,不受这条影响)。 */\n --dshpc-success-soft:color-mix(in srgb,var(--dshpc-success) 5%,transparent);\n --dshpc-warning-soft:color-mix(in srgb,var(--dshpc-warning) 5%,transparent);\n --dshpc-danger-soft:color-mix(in srgb,var(--dshpc-danger) 5%,transparent);\n --dshpc-business-soft:color-mix(in srgb,var(--dshpc-business) 5%,transparent);\n /* 扩展色深色派生:底色写死、hover 掺白 12%/22%(同 business,防白字发糊),soft 5%。 */\n --dshpc-purple-hover:color-mix(in srgb,var(--dshpc-purple) 88%,#ffffff);\n --dshpc-purple-active:color-mix(in srgb,var(--dshpc-purple) 78%,#ffffff);\n --dshpc-purple-soft:color-mix(in srgb,var(--dshpc-purple) 5%,transparent);\n --dshpc-pink-hover:color-mix(in srgb,var(--dshpc-pink) 88%,#ffffff);\n --dshpc-pink-active:color-mix(in srgb,var(--dshpc-pink) 78%,#ffffff);\n --dshpc-pink-soft:color-mix(in srgb,var(--dshpc-pink) 5%,transparent);\n --dshpc-cyan-hover:color-mix(in srgb,var(--dshpc-cyan) 88%,#ffffff);\n --dshpc-cyan-active:color-mix(in srgb,var(--dshpc-cyan) 78%,#ffffff);\n --dshpc-cyan-soft:color-mix(in srgb,var(--dshpc-cyan) 5%,transparent);\n --dshpc-teal-hover:color-mix(in srgb,var(--dshpc-teal) 88%,#ffffff);\n --dshpc-teal-active:color-mix(in srgb,var(--dshpc-teal) 78%,#ffffff);\n --dshpc-teal-soft:color-mix(in srgb,var(--dshpc-teal) 5%,transparent);\n --dshpc-orange-hover:color-mix(in srgb,var(--dshpc-orange) 88%,#ffffff);\n --dshpc-orange-active:color-mix(in srgb,var(--dshpc-orange) 78%,#ffffff);\n --dshpc-orange-soft:color-mix(in srgb,var(--dshpc-orange) 5%,transparent);\n --dshpc-indigo-hover:color-mix(in srgb,var(--dshpc-indigo) 88%,#ffffff);\n --dshpc-indigo-active:color-mix(in srgb,var(--dshpc-indigo) 78%,#ffffff);\n --dshpc-indigo-soft:color-mix(in srgb,var(--dshpc-indigo) 5%,transparent);\n --dshpc-rose-hover:color-mix(in srgb,var(--dshpc-rose) 88%,#ffffff);\n --dshpc-rose-active:color-mix(in srgb,var(--dshpc-rose) 78%,#ffffff);\n --dshpc-rose-soft:color-mix(in srgb,var(--dshpc-rose) 5%,transparent);\n --dshpc-slate-hover:color-mix(in srgb,var(--dshpc-slate) 88%,#ffffff);\n --dshpc-slate-active:color-mix(in srgb,var(--dshpc-slate) 78%,#ffffff);\n --dshpc-slate-soft:color-mix(in srgb,var(--dshpc-slate) 5%,transparent);\n /* 「选中面」(深色版,2026-10-06):掺 **~40% 背景色**(--dshpc-surface-base)⇒ 无限接近页面背景的黑、\n 只比背景略深一点点(用户:深色下展开区压着任务透明绿会发灰,底色要尽量贴近背景才不显灰)。\n ⚠️ 深色下不能掺文字色 —— 那是白,会变亮,选中反而比本月日期浅。 */\n --dshpc-selected-bg:color-mix(in srgb,var(--dshpc-surface-1) 60%,var(--dshpc-surface-base));\n /* 任务日程页本月格的默认底(深色版,2026-10-06):深的、带点灰蓝的暗色(用户给的参考图 ≈ #23262e),\n 比原来的卡片面更沉、更偏蓝灰;选中格仍走 --dshpc-selected-bg(更暗一档),层级不变。 */\n --dshpc-cal-cell-bg:#23262e;\n /* 任务日程页本月格 hover 底(深色段,2026-10-06):原先走 --dshpc-hover(宿主浅色叠加)在深底上显得\n 「灰发亮」,不好看 ⇒ 换成更贴底的蓝调微亮(与 open-bg-soft 同族),hover 时不刺眼、又有反馈。 */\n --dshpc-cal-cell-hover:rgba(96,165,250,.12);\n /* 任务日程页展开面板底(深色段,2026-10-06 续):与原 selected-bg 暗值一致,深色 UI 不动 */\n --dshpc-cal-panel-bg:color-mix(in srgb,var(--dshpc-surface-1) 60%,var(--dshpc-surface-base));\n}\n";
|
|
49
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/design/tokens-css.generated.js
|
|
50
|
+
const TOKENS_CSS_TEMPLATE = "\n/* ── 文字(宿主 label 四档 + 反色面用字)────────────────────────────── */\nbody{\n --dshpc-fg:var(--dsw-alias-label-primary,#1f2328);\n --dshpc-fg-2:var(--dsw-alias-label-secondary,#5c6370);\n --dshpc-fg-3:var(--dsw-alias-label-tertiary,#767d87);\n --dshpc-fg-4:var(--dsw-alias-label-caption,#9aa1ab);\n --dshpc-fg-dim:var(--dsw-alias-label-dimmed,#b9bfc7);\n /* 反色面上的字(实心钮 / 角标):暗色下是 bluish-1000,故用 -foreground 而非 -inverted */\n --dshpc-fg-inverse:var(--dsw-alias-label-primary-foreground,#fff);\n\n /* ── 面(宿主 bg-layer 三档 + 下沉轨道底)──────────────────────────── */\n --dshpc-surface-1:var(--dsw-alias-bg-layer-1,#fff);\n --dshpc-surface-2:var(--dsw-alias-bg-layer-2,#fff);\n --dshpc-surface-3:var(--dsw-alias-bg-layer-3,#fff);\n /* 「选中亮片」的底盘色(配 --dshpc-shadow-raised 用) */\n --dshpc-surface-raised:var(--dsw-alias-bg-layer-1,#fff);\n /* 轨道 / 下沉底(官方分段控件轨道用的就是这条) */\n --dshpc-surface-sunken:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06));\n /* 整页 / 编辑器底(bg-base) */\n --dshpc-surface-base:var(--dsw-alias-bg-base,#fff);\n /* 自绘浮层 / 菜单卡的不透明底(= base;不要用半透明的 specific-menu) */\n --dshpc-surface-menu:var(--dshpc-surface-base);\n /* markdown 代码块面 / 字体(会话镜像里用到) */\n --dshpc-code-surface:var(--dsw-alias-markdown-code-block,rgba(128,128,128,.10));\n --dshpc-code-font:var(--dsw-font-markdown-code-block-small,12px/18px var(--ds-font-family-code,monospace));\n /* 警告文字色(宿主 state-warn-label) */\n --dshpc-warning-label:var(--dsw-alias-state-warn-label,#f5a623);\n /* 固定中性实面(自绘浮层、深色主题下必须自己变的那几个)——只有它需要暗色覆盖 */\n --dshpc-solid:var(--dsw-static-neutral-00,#fff);\n --dshpc-on-solid:var(--dsw-alias-label-primary,#1f2328);\n /* 交付文件卡那种「浅底盘 + hover 加深」两拍 */\n --dshpc-plate:var(--dsw-static-neutral-50,#fafafa);\n --dshpc-plate-hover:var(--dsw-static-neutral-100,#f5f5f5);\n /* ⚠️ 这些**固定中性面一律用 rgba 字面量**(2026-10-19 真机教训):不要写成\n 「rgba 回退行 + 嵌 --dsw-static-* 的 color-mix 行」两条同名声明——自定义属性**后者恒胜**,\n 哪怕它的值在宿主里算不出来(static 变量 invalid)⇒ 整条 token 作废、rgba 兜底一起被废,\n 0.2.6 里 Segmented 轨道全透明就是这么来的。要跟宿主主题联动的面用 alias token(那些实测有效)。 */\n --dshpc-icon-plate:rgba(255,255,255,.5);\n /* 表头底:浅色主题**偏深**,且必须**比斑马纹(--dshpc-plate)再深一档**——\n 两者不能撞色(用户 2026-10-02:表头跟斑马纹一模一样)。 */\n --dshpc-head-bg:var(--dsw-static-neutral-100,#f5f5f5);\n /* 表格底 / 行 hover(2026-10-30 用户二次定案:表头与通栏**互换**底色):\n 表头默认底 = 通栏原来那层灰(--dshpc-surface-sunken,跟着宿主交互面走);\n 通栏默认底 = 表头原来那色(亮 #f6f8fa / 暗 #151b23,参考图实测,与深色段同源);\n 行 hover 是「一层极淡的黑」≈1.5%(用户:再浅一半,要特别淡)。 */\n --dshpc-table-head-bg:var(--dshpc-surface-sunken);\n --dshpc-table-banner-bg:#f6f8fa;\n --dshpc-table-row-hover:rgba(15,15,15,.015);\n /* 图标小底板(产出物):浅色下要**看得见**(原先取 plate ⇒ 在白底上等于没有);hover 加倍。 */\n --dshpc-chip-bg:rgba(15,15,15,.07);\n --dshpc-chip-bg-hover:rgba(15,15,15,.14);\n /* 展开行:**带透明度的蓝**——不是灰、也不是纯色,透出卡片底色,一眼看出「这是展开的」\n (用户 2026-10-02:灰色跟斑马纹分不出来)。内容区再淡一档,形成「行深 / 内容浅」的区隔。 */\n --dshpc-open-bg:rgba(37,99,235,.10);\n --dshpc-open-bg-soft:rgba(37,99,235,.05);\n --dshpc-card-hover:rgba(37,99,235,.07);\n\n /* ── 描边四档(宿主真值:l1 4% / l2 10% / l3 12% / l4 16%)────────── */\n --dshpc-border-faint:var(--dsw-alias-border-l1,#0000000a);\n --dshpc-border:var(--dsw-alias-border-l2,#0000001a);\n --dshpc-border-strong:var(--dsw-alias-border-l3,#0000001f);\n --dshpc-border-heavy:var(--dsw-alias-border-l4,#00000029);\n\n /* ── 品牌 / 语义色 ────────────────────────────────────────────────── */\n /* 品牌「面」色:明色近黑、暗色近白(官方 Switch 选中态即此),**不是蓝色** */\n --dshpc-accent:var(--dsw-alias-brand-primary,#0f1115);\n /* 蓝色:强调 / 选中 / 焦点,一律走这条 */\n --dshpc-business:var(--dsw-alias-state-business-primary,#3b5bdb);\n --dshpc-success:var(--dsw-alias-state-success-primary,#22c55e);\n /* ⚠️ 是 state-warn(不是 state-warning,后者宿主无此定义) */\n --dshpc-warning:var(--dsw-alias-state-warn-primary,#f59e0b);\n --dshpc-danger:var(--dsw-alias-state-error-primary,#ec1313);\n --dshpc-link:var(--dsw-alias-link,#3b5bdb);\n /* 语义色**实面**上的字(角标 / 实心提示):宿主红绿黄三色都是中调 ⇒ 白字两个主题都可读,\n 故这是一条与主题无关的常量;不要拿 --dshpc-fg-inverse 顶——它在暗色下是近黑,压在红底上看不清。 */\n --dshpc-on-signal:#fff;\n /* 黄底上的字:黄色是中高明度,白字看不清 ⇒ 固定深色(与主题无关)。 */\n --dshpc-on-warning:#1f2328;\n /* 告警严重度的圆点底色(2026-11-03 从 feedback.css 收到这里)。\n 与主题无关的一组常量:这几个色要在任意底色上都认得出来,所以**不跟宿主 state 色走**\n (宿主 state-warn-primary 偏亮,压白 ✕ 看不清)。语义色改动请只改这里。 */\n --dshpc-sev-info:#2563eb;\n --dshpc-sev-success:#16a34a;\n --dshpc-sev-warning:#d97706;\n --dshpc-sev-error:#dc2626;\n\n /* ── 实心按钮的 hover / active 派生态(2026-10-19 用户点名)─────────────────\n 原实现是 :hover 直接压 opacity .9:黑底压 10% 几乎看不出来,用户原话「完全感觉不到颜色变了」。\n ⇒ 改成对底色做**明确的混色**(压 22% / 34%),不用 opacity:\n · 亮色主题:黑底(--dshpc-accent)掺白提亮;红 / 绿 / 黄 / 蓝底掺黑压深;\n · 暗色主题:反过来(暗底掺白、亮底掺黑)。\n 混色对象是**固定中性色字面量**(#fff / #000),不依赖宿主 static-neutral 是否存在;\n 旧内核不认 color-mix 时整条声明作废 ⇒ 回落各档原色(可接受:仍可点,只是没有 hover 反馈)。 */\n --dshpc-accent-hover:color-mix(in srgb,var(--dshpc-accent) 78%,#ffffff);\n --dshpc-accent-active:color-mix(in srgb,var(--dshpc-accent) 64%,#ffffff);\n --dshpc-danger-hover:color-mix(in srgb,var(--dshpc-danger) 78%,#000000);\n --dshpc-danger-active:color-mix(in srgb,var(--dshpc-danger) 64%,#000000);\n --dshpc-success-hover:color-mix(in srgb,var(--dshpc-success) 78%,#000000);\n --dshpc-success-active:color-mix(in srgb,var(--dshpc-success) 64%,#000000);\n --dshpc-warning-hover:color-mix(in srgb,var(--dshpc-warning) 78%,#000000);\n --dshpc-warning-active:color-mix(in srgb,var(--dshpc-warning) 64%,#000000);\n --dshpc-business-hover:color-mix(in srgb,var(--dshpc-business) 78%,#000000);\n --dshpc-business-active:color-mix(in srgb,var(--dshpc-business) 64%,#000000);\n /* 语义色**浅底**:状态色系的「一块底色」——执行记录页每条流水账的块底就是它\n (用户 2026-10-04:正常态给同色系很浅的透明底、失败用红底透出来)。\n 用 「color-mix」 现算而不写死 rgba:状态色本身跟随宿主 alias,主题一换自动成立。\n ⚠️ **深色下要更淡**:用户 2026-10-04「深色风格的绿色和红色好像都有点深」⇒ dark 段\n 把这四条压到 5%(更贴近面板底、存在感更弱);浅色段维持 8%。两端各自给值,不共用一条曲线。\n 命名收在 tokens.ts 单点(本仓硬规矩:业务文件不许自造 --dshpc-*)。 */\n --dshpc-success-soft:color-mix(in srgb,var(--dshpc-success) 8%,transparent);\n --dshpc-warning-soft:color-mix(in srgb,var(--dshpc-warning) 8%,transparent);\n --dshpc-danger-soft:color-mix(in srgb,var(--dshpc-danger) 8%,transparent);\n --dshpc-business-soft:color-mix(in srgb,var(--dshpc-business) 8%,transparent);\n\n /* ── 扩展语义色(2026-10-29 用户拍板:分类 / 图表常用色八支)──────────────\n 宿主无对应 alias ⇒ 写死 hex(不跟随宿主换肤);实心面字色统一走 --dshpc-on-signal(白),\n 因八支明度都低于黄 / 青柠,白字两主题均 ≥4.5:1 可读。每条自带 hover/active/soft 派生;\n 暗色段只覆盖派生(base 写死、两主题同值)。 */\n --dshpc-purple:#9333ea;\n --dshpc-purple-hover:color-mix(in srgb,var(--dshpc-purple) 78%,#000000);\n --dshpc-purple-active:color-mix(in srgb,var(--dshpc-purple) 64%,#000000);\n --dshpc-purple-soft:color-mix(in srgb,var(--dshpc-purple) 8%,transparent);\n --dshpc-pink:#db2777;\n --dshpc-pink-hover:color-mix(in srgb,var(--dshpc-pink) 78%,#000000);\n --dshpc-pink-active:color-mix(in srgb,var(--dshpc-pink) 64%,#000000);\n --dshpc-pink-soft:color-mix(in srgb,var(--dshpc-pink) 8%,transparent);\n --dshpc-cyan:#0e7490;\n --dshpc-cyan-hover:color-mix(in srgb,var(--dshpc-cyan) 78%,#000000);\n --dshpc-cyan-active:color-mix(in srgb,var(--dshpc-cyan) 64%,#000000);\n --dshpc-cyan-soft:color-mix(in srgb,var(--dshpc-cyan) 8%,transparent);\n --dshpc-teal:#0f766e;\n --dshpc-teal-hover:color-mix(in srgb,var(--dshpc-teal) 78%,#000000);\n --dshpc-teal-active:color-mix(in srgb,var(--dshpc-teal) 64%,#000000);\n --dshpc-teal-soft:color-mix(in srgb,var(--dshpc-teal) 8%,transparent);\n --dshpc-orange:#c2410c;\n --dshpc-orange-hover:color-mix(in srgb,var(--dshpc-orange) 78%,#000000);\n --dshpc-orange-active:color-mix(in srgb,var(--dshpc-orange) 64%,#000000);\n --dshpc-orange-soft:color-mix(in srgb,var(--dshpc-orange) 8%,transparent);\n --dshpc-indigo:#4f46e5;\n --dshpc-indigo-hover:color-mix(in srgb,var(--dshpc-indigo) 78%,#000000);\n --dshpc-indigo-active:color-mix(in srgb,var(--dshpc-indigo) 64%,#000000);\n --dshpc-indigo-soft:color-mix(in srgb,var(--dshpc-indigo) 8%,transparent);\n --dshpc-rose:#e11d48;\n --dshpc-rose-hover:color-mix(in srgb,var(--dshpc-rose) 78%,#000000);\n --dshpc-rose-active:color-mix(in srgb,var(--dshpc-rose) 64%,#000000);\n --dshpc-rose-soft:color-mix(in srgb,var(--dshpc-rose) 8%,transparent);\n --dshpc-slate:#475569;\n --dshpc-slate-hover:color-mix(in srgb,var(--dshpc-slate) 78%,#000000);\n --dshpc-slate-active:color-mix(in srgb,var(--dshpc-slate) 64%,#000000);\n --dshpc-slate-soft:color-mix(in srgb,var(--dshpc-slate) 8%,transparent);\n\n /* ⚠️ 2026-10-18 用户拍板:宿主 alias 的 hover(暗色白 8% / 亮色 6%)**太弱**,\n 「移上去要仔细看才看得出来」⇒ 不再委托宿主 hover 别名,改为自掺中性色并加重:\n 亮色掺黑 10%、暗色掺白 14%(active 再加一档)。按钮 / 分段轨道 / 各类 hover 底同时受益。\n ⚠️ 必须保留 rgba 兜底行在前(本文件惯例,见 icon-plate 注释):掺的是**固定中性色**\n (neutral-900=#0f0f0f / neutral-00=#fff),预计算无损;旧内核不认 color-mix 时走兜底,\n 否则整条 background:var(--seg-track) 作废 ⇒ 分段轨道透明(真踩过:预览站轨道消失)。 */\n --dshpc-hover:rgba(15,15,15,.10);\n --dshpc-active:rgba(15,15,15,.18);\n /* 分段控件轨道底:专用 token(rgba 字面量、不借 --dshpc-hover 中转)——\n 2026-10-19 教训:变量链中间任何一环 invalid ⇒ background 整条作废、轨道全透明。\n 亮色:黑 7%(比 hover 的 10% 淡一档,选中白片才跳得出)。 */\n --dshpc-seg-track:rgba(15,15,15,.07);\n --dshpc-mask:var(--dsw-alias-bg-mask-1,#0000003d);\n /* 弹窗锁定态给**自绘控件**的降透明度档(2026-11-05)。放在 token 里是为了让消费方\n 在自己元素上写 --dshpc-lock-dim: 1 就能退出这条效果,不用 !important 打架。 */\n --dshpc-lock-dim:.5;\n /* 「选中面」(2026-10-06,任务日程页首创)= 当前底色**朝更深掺 12% 文字色**:\n 浅色主题下文字色是黑 ⇒ 选中面比常态底色**深一档**。深色分支见 body[data-ds-dark-theme](朝背景色掺)。\n 语义:标记「正在看的东西」,比常态明显、又不许盖住内容(不许用半透明叠状态色)。 */\n --dshpc-selected-bg:color-mix(in srgb,var(--dshpc-surface-1) 88%,var(--dshpc-fg));\n /* 任务日程页本月格默认底(2026-10-06 → 续2):浅色下给**淡蓝**(business 8% 透白底)——\n 参照用户参考稿里未选中日程块 / Tuesday 列的那种蓝、再浅一点点;\n 相邻月补位格仍走 --dshpc-surface-2(更灰),不受影响。\n 深色段维持 #23262e(用户:深色 UI 已差不多,不动)。 */\n --dshpc-cal-cell-bg:color-mix(in srgb,var(--dshpc-business) 8%,var(--dshpc-surface-1));\n /* 任务日程页「点开某天」展开的面板底(2026-10-06 续):浅色下**无限接近白、只带一丁点灰**\n (neutral-50 = #fafafa)——面板里装半透明执行记录列表,底再深整片就发糊发灰;\n 深色段沿用原 selected-bg 暗值,保持不动。 */\n --dshpc-cal-panel-bg:var(--dsw-static-neutral-50,#fafafa);\n /* 任务日程页本月格 hover 底(浅色段,2026-10-06 续3):不再走灰色通用交互底——\n 鼠标移上去应是「更亮一点点的蓝」(与深色段同语义:hover = 提亮的蓝,不是灰下去)。\n 浓度**介于**表头蓝(14%)与未选中格蓝(8%)之间、略偏表头一侧:business 12% 透白底\n (比表头浅一点、比未选中格深一点)。 */\n --dshpc-cal-cell-hover:color-mix(in srgb,var(--dshpc-business) 12%,var(--dshpc-surface-1));\n\n /* ── 投影 / 焦点 ──────────────────────────────────────────────────── */\n --dshpc-shadow-1:var(--dsw-elevation-soft,0 4px 16px 0 #00000008);\n /* 亮片自带的浮起感(选中态用;与 --dshpc-surface-raised 配对) */\n --dshpc-shadow-raised:var(--dsw-elevation-soft,0 4px 16px 0 #00000008);\n --dshpc-shadow-2:var(--dsw-shadow-lv3,0 12px 32px 0 #00000014);\n /* 键盘焦点环。⚠️ 不用宿主 --dsw-focus-ring-color:它默认值是 transparent(兜底不生效、会隐身) */\n --dshpc-focus:var(--dsw-alias-state-business-primary,#3b5bdb);\n\n /* ── 圆角(宿主真值 4 / 8 / 12 / 16 / 20 / 28)─────────────────────── */\n --dshpc-radius-xs:var(--dsw-radius-xs,4px);\n --dshpc-radius-sm:var(--dsw-radius-sm,8px);\n --dshpc-radius-md:var(--dsw-radius-md,12px);\n --dshpc-radius-lg:var(--dsw-radius-lg,16px);\n --dshpc-radius-xl:var(--dsw-radius-xl,20px);\n --dshpc-radius-panel:var(--dsw-radius-panel,28px);\n /* 全圆(胶囊标签):宿主的 radius 档最大只有 28px,撑不满 24px 高的 chip */\n --dshpc-radius-pill:999px;\n\n /* ── 间距四拍(只许用这四档,不许出现 5 / 7 / 9px)────────────────── */\n --dshpc-space-1:4px;\n --dshpc-space-2:8px;\n --dshpc-space-3:12px;\n --dshpc-space-4:16px;\n\n /* ── 控件高度:离散三档(控件用 size=\"sm|md|lg\" 选;调用点不许自定义高度,\n 真不够用才允许在调用点本地覆盖 --dshpc-control-h-*,属例外而非常态)── */\n --dshpc-control-h-sm:24px;\n --dshpc-control-h-md:28px;\n --dshpc-control-h-lg:32px;\n\n /* ── 字号 / 行高:直绑宿主字号族(宿主真值 11 / 12 / 13 / 14 / 16)───── */\n --dshpc-font-xs:var(--dsw-font-xxxs-11-font-size,11px);\n --dshpc-font-sm:var(--dsw-font-xxs-12-font-size,12px);\n --dshpc-font-md:var(--dsw-font-xs-13-font-size,13px);\n --dshpc-font-lg:var(--dsw-font-s-14-font-size,14px);\n --dshpc-font-xl:var(--dsw-font-base-16-font-size,16px);\n --dshpc-line-xs:var(--dsw-font-xxxs-11-line-height,14px);\n --dshpc-line-sm:var(--dsw-font-xxs-12-line-height,18px);\n --dshpc-line-md:var(--dsw-font-xs-13-line-height,20px);\n --dshpc-line-lg:var(--dsw-font-s-14-line-height,22px);\n --dshpc-line-xl:var(--dsw-font-base-16-line-height,24px);\n --dshpc-font-mono:var(--ds-font-family-code,monospace);\n\n /* ── 层级阶梯(业务文件不许再写裸 z-index)───────────────────────── */\n /* 页面级预览分栏 → 抽屉(新建/编辑)→ 弹窗/确认框 → 浮层菜单 → 浮层提示 */\n /* 内容层吸顶(天标签 / 表头这类「跟着滚但压住同层内容」的元素):只压同层兄弟,\n 必须低于下面所有浮层档 —— 所以它不是「开新浮层档」,而是内容层内部的排序位。 */\n --dshpc-z-sticky:10;\n --dshpc-z-dock:1030;\n --dshpc-z-drawer:1040;\n --dshpc-z-modal:1070;\n /* 收起后的耳朵:必须高于弹窗遮罩,否则弹窗一开就点不到它(2026-11-04 用户真机)。\n 只给耳朵用,页面级分栏本体仍是布局成员,不跟着抬高。 */\n --dshpc-z-ear:1080;\n --dshpc-z-menu:1100;\n --dshpc-z-tip:1200;\n /* 语义别名(2026-11-03 面板皮肤统一):业务文件只许用这两个说「我要一层浮层」,\n 不再各自写 1099/1100/1200/1201 这类字面量。\n panel = 浮层面板本体(picker 弹窗、锚定面板);\n popmenu = 叠在面板之上的菜单(▾ 选层、Picker 下拉)与其透明遮罩。 */\n --dshpc-z-panel:var(--dshpc-z-menu);\n --dshpc-z-popmenu:var(--dshpc-z-tip);\n\n /* ── 动效 ─────────────────────────────────────────────────────────── */\n --dshpc-dur:var(--ds-transition-duration,.2s);\n --dshpc-dur-fast:var(--ds-transition-duration-fast,.12s);\n --dshpc-ease:var(--ds-ease-in-out,cubic-bezier(.4,0,.2,1));\n /* 运行中状态的脉动时长(2026-10-06 统一前后两端:任务配置里的绿呼吸 → 蓝、放慢;\n 执行记录里的蓝闪 → 放慢一点。两者用同一个值,动画形状本就一致)。 */\n --dshpc-dur-run:500ms;\n}\n\n/* ── 明暗差异的**唯一**落点 ──────────────────────────────────────────────\n 判据 = body[data-ds-dark-theme](宿主 0.2.0-rc.2 源码核实:启动脚本 toggleAttribute 写入,\n 唯一明暗判据;插件禁止用 prefers-color-scheme —— 它跟的是系统、不是用户在宿主里的选择)。\n 下面只放 alias 表达不了的「固定中性面」;颜色若能靠 alias 自动跟随,一律不要写在这里。 */\nbody[data-ds-dark-theme]{\n /* 深色段的蓝**刻意不跟随宿主 alias**(唯一例外):宿主暗色 alias 给的是 #60a5fa 一档的高亮蓝,\n 实心面(Chip / Button info / 日期选中格)压白字会发糊 —— 用户 2026-10-29 实测反馈。\n ⇒ 深色下改定向浅色状态的蓝(#3b5bdb)靠,只在明度上抬一点点,保证它在暗底上仍看得见:\n #4c6bd8 对白字 ≈4.8:1(原亮蓝只有 ~2.3:1),对日历格底 ≈3.2:1 仍过 UI 件的 3:1 线。\n 代价:宿主换品牌色时深色不再自动跟着变,需要这里手动同步。 */\n --dshpc-business:#4c6bd8;\n --dshpc-solid:var(--dsw-static-neutral-900,#0f0f0f);\n --dshpc-on-solid:var(--dsw-static-neutral-00,#fff);\n /* 实心按钮 hover / active(暗色版):黑底(浅色主题的近黑 → 暗色下的近白)掺黑压深;\n 红 / 绿 / 黄 / 蓝掺白提亮。与亮色段方向相反,保证两种主题下「一眼看出变了」。 */\n --dshpc-accent-hover:color-mix(in srgb,var(--dshpc-accent) 80%,#000000);\n --dshpc-accent-active:color-mix(in srgb,var(--dshpc-accent) 66%,#000000);\n --dshpc-danger-hover:color-mix(in srgb,var(--dshpc-danger) 78%,#ffffff);\n --dshpc-danger-active:color-mix(in srgb,var(--dshpc-danger) 64%,#ffffff);\n --dshpc-success-hover:color-mix(in srgb,var(--dshpc-success) 78%,#ffffff);\n --dshpc-success-active:color-mix(in srgb,var(--dshpc-success) 64%,#ffffff);\n --dshpc-warning-hover:color-mix(in srgb,var(--dshpc-warning) 78%,#ffffff);\n --dshpc-warning-active:color-mix(in srgb,var(--dshpc-warning) 64%,#ffffff);\n /* 同上:掺白比例从 22% / 36% 收到 12% / 22% —— 底色已变深,照旧比例提亮会在 hover 瞬间\n 把白字对比打回 ~3:1(正是用户嫌糊的那一档);收窄后 hover 仍可感知、字仍清晰。 */\n --dshpc-business-hover:color-mix(in srgb,var(--dshpc-business) 88%,#ffffff);\n --dshpc-business-active:color-mix(in srgb,var(--dshpc-business) 78%,#ffffff);\n /* 暗色 hover 掺白 14% / active 24%(对齐上面 2026-10-18 的加重拍板)。rgba 兜底行同上。 */\n --dshpc-hover:rgba(255,255,255,.14);\n --dshpc-active:rgba(255,255,255,.24);\n /* 分段轨道(暗色版):白 10%——比 hover 淡一档,选中亮片才跳得出。 */\n --dshpc-seg-track:rgba(255,255,255,.10);\n --dshpc-plate:var(--dsw-static-neutral-850,#212123);\n --dshpc-plate-hover:var(--dsw-static-neutral-800,#292929);\n --dshpc-icon-plate:rgba(255,255,255,.05);\n /* 暗色主题**反过来**:表头要比卡片面**亮**、比斑马纹再**浅一档**(用户:纯黑背景没法看)。 */\n --dshpc-head-bg:var(--dshpc-surface-2);\n /* 表格(2026-10-30 用户二次定案:与通栏互换底色):通栏底取表头原来那色 #151b23\n (亮色段对应 #f6f8fa);表头默认底沿用亮色段定义的 --dshpc-surface-sunken,不在暗色段重写;\n 行 hover 是「一层极淡的白」≈3% —— 暗底上用黑会越悬越暗,看不出「浅灰」反馈。 */\n --dshpc-table-banner-bg:#151b23;\n --dshpc-table-row-hover:rgba(255,255,255,.03);\n /* 暗色底板**微亮**;hover **更亮**(原先 hover 取 plate-hover 反而更淡 ⇒ 鼠标移上去就没了)。 */\n --dshpc-chip-bg:rgba(255,255,255,.08);\n --dshpc-chip-bg-hover:rgba(255,255,255,.16);\n /* 暗色下蓝色要更亮、透明度略高才压得住深底。 */\n --dshpc-open-bg:rgba(96,165,250,.18);\n --dshpc-open-bg-soft:rgba(96,165,250,.08);\n --dshpc-card-hover:rgba(96,165,250,.13);\n /* 语义色**浅底**(深色版):用户嫌深色的绿 / 红「有点深」⇒ 压到 **5%**(浅色段是 8%),\n 更贴近面板底色、存在感更弱;块底与状态色竖条仍同源(竖条是实色,不受这条影响)。 */\n --dshpc-success-soft:color-mix(in srgb,var(--dshpc-success) 5%,transparent);\n --dshpc-warning-soft:color-mix(in srgb,var(--dshpc-warning) 5%,transparent);\n --dshpc-danger-soft:color-mix(in srgb,var(--dshpc-danger) 5%,transparent);\n --dshpc-business-soft:color-mix(in srgb,var(--dshpc-business) 5%,transparent);\n /* 扩展色深色派生:底色写死、hover 掺白 12%/22%(同 business,防白字发糊),soft 5%。 */\n --dshpc-purple-hover:color-mix(in srgb,var(--dshpc-purple) 88%,#ffffff);\n --dshpc-purple-active:color-mix(in srgb,var(--dshpc-purple) 78%,#ffffff);\n --dshpc-purple-soft:color-mix(in srgb,var(--dshpc-purple) 5%,transparent);\n --dshpc-pink-hover:color-mix(in srgb,var(--dshpc-pink) 88%,#ffffff);\n --dshpc-pink-active:color-mix(in srgb,var(--dshpc-pink) 78%,#ffffff);\n --dshpc-pink-soft:color-mix(in srgb,var(--dshpc-pink) 5%,transparent);\n --dshpc-cyan-hover:color-mix(in srgb,var(--dshpc-cyan) 88%,#ffffff);\n --dshpc-cyan-active:color-mix(in srgb,var(--dshpc-cyan) 78%,#ffffff);\n --dshpc-cyan-soft:color-mix(in srgb,var(--dshpc-cyan) 5%,transparent);\n --dshpc-teal-hover:color-mix(in srgb,var(--dshpc-teal) 88%,#ffffff);\n --dshpc-teal-active:color-mix(in srgb,var(--dshpc-teal) 78%,#ffffff);\n --dshpc-teal-soft:color-mix(in srgb,var(--dshpc-teal) 5%,transparent);\n --dshpc-orange-hover:color-mix(in srgb,var(--dshpc-orange) 88%,#ffffff);\n --dshpc-orange-active:color-mix(in srgb,var(--dshpc-orange) 78%,#ffffff);\n --dshpc-orange-soft:color-mix(in srgb,var(--dshpc-orange) 5%,transparent);\n --dshpc-indigo-hover:color-mix(in srgb,var(--dshpc-indigo) 88%,#ffffff);\n --dshpc-indigo-active:color-mix(in srgb,var(--dshpc-indigo) 78%,#ffffff);\n --dshpc-indigo-soft:color-mix(in srgb,var(--dshpc-indigo) 5%,transparent);\n --dshpc-rose-hover:color-mix(in srgb,var(--dshpc-rose) 88%,#ffffff);\n --dshpc-rose-active:color-mix(in srgb,var(--dshpc-rose) 78%,#ffffff);\n --dshpc-rose-soft:color-mix(in srgb,var(--dshpc-rose) 5%,transparent);\n --dshpc-slate-hover:color-mix(in srgb,var(--dshpc-slate) 88%,#ffffff);\n --dshpc-slate-active:color-mix(in srgb,var(--dshpc-slate) 78%,#ffffff);\n --dshpc-slate-soft:color-mix(in srgb,var(--dshpc-slate) 5%,transparent);\n /* 「选中面」(深色版,2026-10-06):掺 **~40% 背景色**(--dshpc-surface-base)⇒ 无限接近页面背景的黑、\n 只比背景略深一点点(用户:深色下展开区压着任务透明绿会发灰,底色要尽量贴近背景才不显灰)。\n ⚠️ 深色下不能掺文字色 —— 那是白,会变亮,选中反而比本月日期浅。 */\n --dshpc-selected-bg:color-mix(in srgb,var(--dshpc-surface-1) 60%,var(--dshpc-surface-base));\n /* 任务日程页本月格的默认底(深色版,2026-10-06):深的、带点灰蓝的暗色(用户给的参考图 ≈ #23262e),\n 比原来的卡片面更沉、更偏蓝灰;选中格仍走 --dshpc-selected-bg(更暗一档),层级不变。 */\n --dshpc-cal-cell-bg:#23262e;\n /* 任务日程页本月格 hover 底(深色段,2026-10-06):原先走 --dshpc-hover(宿主浅色叠加)在深底上显得\n 「灰发亮」,不好看 ⇒ 换成更贴底的蓝调微亮(与 open-bg-soft 同族),hover 时不刺眼、又有反馈。 */\n --dshpc-cal-cell-hover:rgba(96,165,250,.12);\n /* 任务日程页展开面板底(深色段,2026-10-06 续):与原 selected-bg 暗值一致,深色 UI 不动 */\n --dshpc-cal-panel-bg:color-mix(in srgb,var(--dshpc-surface-1) 60%,var(--dshpc-surface-base));\n}\n";
|
|
51
51
|
//#endregion
|
|
52
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
52
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/design/style-kit.js
|
|
53
53
|
/** 全生态统一的 CSS 变量前缀。 */
|
|
54
54
|
const CSS_PREFIX = "dshpc";
|
|
55
55
|
/** token 域固定名:变量定义必须先于消费它的规则出现。 */
|
|
@@ -120,7 +120,7 @@ window.__ModuleLoader__.load({
|
|
|
120
120
|
};
|
|
121
121
|
}
|
|
122
122
|
//#endregion
|
|
123
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
123
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/css.js
|
|
124
124
|
/**
|
|
125
125
|
* 当前插件的样式设施。
|
|
126
126
|
*
|
|
@@ -161,10 +161,10 @@ window.__ModuleLoader__.load({
|
|
|
161
161
|
kit.applyStyle(domain, css);
|
|
162
162
|
}
|
|
163
163
|
//#endregion
|
|
164
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
164
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/marquee-css.generated.js
|
|
165
165
|
const MARQUEE_CSS = "/* 跑马灯(MarqueeText):双层——外层只裁剪,内层才 transform 滚动;非 hover 内层自带省略号。\n 2026-10-20:本文件原是杂烩「select.css」(下拉 / 日历 / 时分的皮肤都装过),随着那些控件\n 一个个删完,最后只剩跑马灯,故按本包「一个 css 服务一个对象」的格局改名归档。\n 同批清掉的还有零引用的省略号类 .dshpc-ellipsis —— 本包三个用到截断的地方都没采纳它。 */\n.dshpc-mq{display:block;overflow:hidden;white-space:nowrap;}\n.dshpc-mq .dshpc-mq-in{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:top;}\n/* ⚠️ 跑法(用户 2026-10-03 拍板):**跑一遍、停在尾字**(播放 1 次 + forwards),不来回弹、不无限跑。\n 滚距 = 精确溢出量 ⇒ 停下时最后一个字正好贴右缘,**不会跑进黑块**(黑块是旧手写版把\n 内层盒子裁了、按「半截文本」平移导致的)。鼠标移开 ⇒ :hover 失效 ⇒ 自动复位回省略号态。 */\n.dshpc-mq-run:hover .dshpc-mq-in{max-width:none;overflow:visible;animation:dshpc-mq-scroll var(--dshpc-mq-dur,6s) linear .4s 1 forwards;}\n@keyframes dshpc-mq-scroll{from{transform:translateX(0)}to{transform:translateX(var(--dshpc-mq-dist,-40px))}}\n/* 溢出渐影(用户 2026-10-24 拍板「左右稍微有点渐影」;官方口径 = dsh-client-ui-primitives@0.2.1-rc.2\n PathLabel.module.css:13-15:mask-image 线性渐隐 + 28px 随官方)。⚠️ 只在 **hover 滚动态** 加:\n 静态态(三个点)不要渐影(用户 2026-10-24 二次拍板),hover 滚动时两端渐影——左缘柔化被裁的文字头。 */\n/* token-ok:遮罩模板色(纯黑 = 完全不透明),不是主题色;换主题也不该变。 */\n.dshpc-mq-run:hover{mask-image:linear-gradient(to right, transparent, #000 28px, #000 calc(100% - 28px), transparent);}\n";
|
|
166
166
|
//#endregion
|
|
167
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
167
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/MarqueeText.js
|
|
168
168
|
/**
|
|
169
169
|
* 跑马灯文本 —— **全站唯一实现**(L2,P6 从 editor-fields 迁入 ui)
|
|
170
170
|
*
|
|
@@ -217,43 +217,43 @@ window.__ModuleLoader__.load({
|
|
|
217
217
|
}, props.text));
|
|
218
218
|
}
|
|
219
219
|
//#endregion
|
|
220
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
220
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/segmented-css.generated.js
|
|
221
221
|
const SEGMENTED_CSS = "\n/* ── 分段控件 P2 ─────────────────────────────────────────────────────\n 结构照兄弟项目 dsh-task-dispatch-table 的 Segmented 皮肤(item 无边框、hover 只提亮文字),\n 前缀 / 变量名换成本仓口径。用户额外要的两处(兄弟没有):weekday 方块间隔(现为 2px);段内中性计数 __count。\n ⚠️ 2026-10-19 两次误判均已澄清:① 「宿主只认单行 CSS」——假,多行一直正常;\n ② 「宿主吃掉 token 块之后第一条规则」——也假,真因是 tokens 模板字符串结尾多了一个反斜杠,\n 注入文本里留下字面反引号,把紧随其后的那条规则的选择器污染掉了(见 dsh-host.md §9)。\n 样式照常多行书写,不必压行;也不需要任何「牺牲规则」。 */\n/* 外观只有一套(2026-10-26):原 variant 的 default / inset 两档在 CSS 里只差 1px 内距,\n 且 default 比文档承诺矮 2px,却让下游以为「有得选」而反复对图 ⇒ 整轴删除。\n padding 3px 是尺寸契约的一部分:item 高度 = 控制高 − 6px,加起来正好 24 / 28 / 32。 */\n/* 选中片配色收在两条局部变量里(--seg-thumb 底 / --seg-on 字):默认走主题亮片,\n tone 档与自定义 {bg, fg} 都只改这两条(后者由组件内联写根节点,内联恒胜)。 */\n.dshpc-seg{display:inline-flex;align-items:center;gap:2px;padding:3px;border-radius:var(--dshpc-radius-md);--seg-thumb:var(--dshpc-surface-raised);--seg-on:var(--dshpc-fg);background:var(--dshpc-seg-track);}\n.dshpc-seg__item{appearance:none;display:inline-flex;align-items:center;gap:4px;box-sizing:border-box;height:calc(var(--dshpc-control-h-sm) - 6px);padding:0 12px;border:0;border-radius:var(--dshpc-radius-sm);background:transparent;color:var(--dshpc-fg-2);font-family:inherit;font-size:var(--dshpc-font-xs);font-weight:500;white-space:nowrap;cursor:pointer;flex:none;transition:color var(--dshpc-dur-fast) var(--dshpc-ease),background-color var(--dshpc-dur-fast) var(--dshpc-ease),box-shadow var(--dshpc-dur-fast) var(--dshpc-ease);}\n.dshpc-seg--md .dshpc-seg__item{height:calc(var(--dshpc-control-h-md) - 6px);}\n.dshpc-seg--lg .dshpc-seg__item{height:calc(var(--dshpc-control-h-lg) - 6px);}\n/* 段内图标(前置):与 Button 同口径 —— inline-flex 吃掉行高基线,svg 按块级。 */\n.dshpc-seg__icon{display:inline-flex;align-items:center;justify-content:center;flex:none;line-height:0;}\n.dshpc-seg__icon svg{display:block;margin:0;}\n/* 只有图标(无文字 / 计数 / 角标):段必须是正方形 ⇒ 宽 = 段高、左右内距归零、内容居中;\n 否则基础规则的 0 12px 会把它拉成长方形。放在三档之后:同名特异性下后写者胜。 */\n.dshpc-seg__item--icon-only{width:calc(var(--dshpc-control-h-sm) - 6px);padding:0;justify-content:center;}\n.dshpc-seg--md .dshpc-seg__item--icon-only{width:calc(var(--dshpc-control-h-md) - 6px);}\n.dshpc-seg--lg .dshpc-seg__item--icon-only{width:calc(var(--dshpc-control-h-lg) - 6px);}\n.dshpc-seg__item:hover:not([aria-pressed='true']):not(:disabled){color:var(--dshpc-fg);}\n.dshpc-seg__item[aria-pressed='true']{background:var(--seg-thumb);box-shadow:var(--dshpc-shadow-raised);color:var(--seg-on);font-weight:600;}\n.dshpc-seg__item:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:-2px;}\n.dshpc-seg__item:disabled{cursor:default;opacity:.4;}\n/* 段内角标(如「异常」的数量):语义色实面 + 反白字,0 由组件侧不渲染。必须是正圆(用户 2026-10-03)。 */\n.dshpc-seg__badge{display:inline-flex;align-items:center;justify-content:center;flex:none;width:16px;height:16px;padding:0;overflow:hidden;border-radius:50%;background:var(--dshpc-danger);color:var(--dshpc-on-signal);font-size:10px;line-height:16px;font-weight:500;font-variant-numeric:tabular-nums;}\n/* 段内中性计数(如筛选条「全部 11」):纯文字、无底无边(对齐 task-ledger .dtl-seg__num 拍板口径);0 由组件侧不渲染。 */\n.dshpc-seg__count{display:inline;flex:none;margin-left:3px;padding:0;border:0;border-radius:0;background:none;color:var(--dshpc-fg-3);font-size:10px;line-height:1;font-weight:400;font-variant-numeric:tabular-nums;}\n/* 选中段(彩色实面)里的计数:必须跟着 --seg-on 走再压暗一档(72% 白 ≈ 「比正文稍灰」)。\n 不许用 --dshpc-fg-3:它跟主题走,暗色下是深灰 ⇒ 蓝底上几乎看不见(2026-10-29 用户截图「My todos 4」)。 */\n.dshpc-seg__item[aria-pressed='true'] .dshpc-seg__count{color:color-mix(in srgb,var(--seg-on) 72%,transparent);}\n/* block:撑满父宽(表单行用),各段等分 */\n.dshpc-seg--block{display:flex;width:100%;}\n.dshpc-seg--block .dshpc-seg__item{flex:1 1 auto;justify-content:center;}\n/* weekday:星期多选方块。基础插件的特殊化定制(用户 2026-10-01:原 WeekdayPicker 即「蓝底 + 近似方形」):\n 每格正方形(宽 = 段高)、选中品牌蓝反白字、**无外描边**(2026-10-18 重申)、\n 方块之间间距 gap:2px(2026-10-20 用户定稿:方块改小后 6px 显得太宽。10-18 曾从 2px 放宽到 6px,\n 两次都是用户拍板 —— 别自作主张改回去)。 */\n.dshpc-seg--weekday{--seg-track:var(--dshpc-seg-track);gap:2px;border:0;padding:3px;background:var(--seg-track);}\n.dshpc-seg--weekday .dshpc-seg__item{width:calc(var(--dshpc-control-h-lg) - 8px);padding:0;justify-content:center;}\n/* 蓝底反白:字色必须是常量白(--dshpc-on-signal)。2026-10-29 用户实测:暗色主题下这里曾用\n --dshpc-fg-inverse,而它跟随宿主 label-primary-foreground,暗色下是近黑 ⇒ 蓝底黑字看不清。 */\n.dshpc-seg--weekday{--seg-thumb:var(--dshpc-business);--seg-on:var(--dshpc-on-signal);}\n\n/* ── tone(2026-10-29 用户):选中片传内置基础色名,底 / 字由核心给,深浅两主题各自成立。\n 放在 weekday 之后:同名变量后写者胜,tone 与 className=\"dshpc-seg--weekday\" 同给时以 tone 为准。\n 黄底按 Chip / Button 同源口径用 on-warning(中高明度,白字看不清)。 */\n.dshpc-seg--tone-business{--seg-thumb:var(--dshpc-business);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-success{--seg-thumb:var(--dshpc-success);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-warning{--seg-thumb:var(--dshpc-warning);--seg-on:var(--dshpc-on-warning);}\n.dshpc-seg--tone-danger{--seg-thumb:var(--dshpc-danger);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-purple{--seg-thumb:var(--dshpc-purple);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-pink{--seg-thumb:var(--dshpc-pink);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-cyan{--seg-thumb:var(--dshpc-cyan);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-teal{--seg-thumb:var(--dshpc-teal);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-orange{--seg-thumb:var(--dshpc-orange);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-indigo{--seg-thumb:var(--dshpc-indigo);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-rose{--seg-thumb:var(--dshpc-rose);--seg-on:var(--dshpc-on-signal);}\n.dshpc-seg--tone-slate{--seg-thumb:var(--dshpc-slate);--seg-on:var(--dshpc-on-signal);}\n\n/* ── 单选滑动块(2026-10-26 用户:点选后选中底应「滑过去」,不是旧段消失、新段直接亮)。\n 结构 = 一块绝对定位的共用底 + 各段透明;位置/尺寸由组件量出后内联,这里只管外观与过渡。\n --slide 只在单选挂上:多选(如星期)每段各自着色,没有唯一滑块可滑,保持原样。 */\n.dshpc-seg--slide{position:relative;}\n.dshpc-seg--slide .dshpc-seg__item{position:relative;z-index:1;}\n.dshpc-seg--slide .dshpc-seg__item[aria-pressed='true']{background:transparent;box-shadow:none;}\n.dshpc-seg__thumb{position:absolute;z-index:0;border-radius:var(--dshpc-radius-sm);background:var(--seg-thumb);box-shadow:var(--dshpc-shadow-raised);pointer-events:none;transition:left var(--dshpc-dur) var(--dshpc-ease),top var(--dshpc-dur) var(--dshpc-ease),width var(--dshpc-dur) var(--dshpc-ease),height var(--dshpc-dur) var(--dshpc-ease);}\n\n/* ── bordered 外框(2026-10-20 用户要的第二种模式):**只在最外面套一圈 1px 描边**,\n 里面一概不动 —— 选中片的填充色 / 阴影 / 文字色全部保持原样(weekday 的蓝面照旧),\n 这里不写任何针对 __item 的规则。\n 总高必须与无框版逐像素一致:border 1px×2 由 padding 各让 1px 抵消(3 → 2);\n weekday 自己声明的 3px 在文件更后面,靠双类选择器压回 2px。 */\n.dshpc-seg--bordered{border:1px solid var(--dshpc-border);padding:2px;}\n.dshpc-seg--bordered.dshpc-seg--weekday{padding:2px;}\n\n@media (prefers-reduced-motion: reduce){.dshpc-seg__item{transition:none;}.dshpc-seg__thumb{transition:none;}}\n";
|
|
222
222
|
//#endregion
|
|
223
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
223
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/actions/button-css.generated.js
|
|
224
224
|
const BUTTON_CSS = "\n/* ── 按钮 / 图标钮 P2 ───────────────────────────────────────────────────\n 与 Segmented 同一条高度纪律:--dshpc-control-h-sm(24) / -md(28) / -lg(32),\n 有边框的 variant 用 1px 真边框 + 内部 padding 补回,**有边 / 无边同高**。\n\n 三条受控轴(2026-10-19 重写,对齐主流 UI 框架的分类口径):\n · variant —— 外观档 = 形态 + 语义色,共 10 档:\n primary / secondary / outline / ghost / danger / success / warning / info /\n danger-outline(红字描边)/ link(行内链接)\n · size —— sm / md / lg\n · block —— 撑满父宽\n 每一档**只填 5 个局部变量**(--btn-bg / -fg / -border / -bg-hover / -bg-active),\n 结构与交互只有上面这一份;任何档位都不许再写一遍 display/height/padding。\n 自定义颜色(Button 的 color 参数)同样只覆盖这 5 个变量(token 覆盖,不是新皮肤)。\n\n ⚠️ hover 不再用 opacity 压一层(用户 2026-10-19:「黑色和红色的按钮移上去变化太小,\n 完全感觉不到颜色变了」)⇒ 走 --dshpc-*-hover / -active 的明确混色,见 tokens-css.ts。 */\n.dshpc-btn{--btn-bg:transparent;--btn-fg:var(--dshpc-fg);--btn-border:transparent;--btn-pad:12px;\n --btn-bg-hover:var(--dshpc-hover);--btn-bg-active:var(--dshpc-active);--btn-fg-hover:var(--btn-fg);\n appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;\n box-sizing:border-box;border:1px solid var(--btn-border);border-radius:var(--dshpc-radius-md);\n background-color:var(--btn-bg);color:var(--btn-fg);font-family:inherit;font-weight:500;white-space:nowrap;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),border-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease),box-shadow var(--dshpc-dur-fast) var(--dshpc-ease),transform var(--dshpc-dur-fast) var(--dshpc-ease);}\n.dshpc-btn--sm{--btn-pad:10px;height:var(--dshpc-control-h-sm);padding:0 var(--btn-pad);font-size:var(--dshpc-font-sm);line-height:1;}\n.dshpc-btn--md{--btn-pad:12px;height:var(--dshpc-control-h-md);padding:0 var(--btn-pad);font-size:var(--dshpc-font-md);line-height:1;}\n.dshpc-btn--lg{--btn-pad:14px;height:var(--dshpc-control-h-lg);padding:0 var(--btn-pad);font-size:var(--dshpc-font-md);line-height:1;}\n/* block:撑满父宽(表单底栏 / 抽屉底部的主操作) */\n.dshpc-btn--block{display:flex;width:100%;}\n/* block + 前置图标 ⇒ 文字视觉居中(2026-10-19 用户点名):\n 内容组 [图标 + 间距 + 文字] 整体在盒内居中时,**文字**的中心会被图标推右半格。\n 把右内边距补上「图标宽 + 间距」,可用盒随之左移同量 ⇒ 文字落回视觉中心,图标贴左侧。\n 图标宽按 1.2em 估(官方图标 14/16px vs 字号 12/13px),em 随字号档自动缩放。 */\n.dshpc-btn--block.dshpc-btn--icon-start{padding-right:calc(var(--btn-pad) + 1.2em + 6px);}\n/* 图标比同档文字小一号(用户 2026-11-02):容器吃掉 0.875em,内联 SVG 一律跟随 1em,\n 不再由调用方的 size={16} 说了算 —— 全站按钮图标尺寸只由这一处决定。 */\n.dshpc-btn__icon,.dshpc-btn__icon-end{display:inline-flex;align-items:center;justify-content:center;flex:none;line-height:0;font-size:.875em;}\n.dshpc-btn__icon svg,.dshpc-btn__icon-end svg{display:block;margin:0;width:1em;height:1em;}\n/* maxWidth 包 MarqueeText 时:标签作为 flex 子项必须能收缩到内容以下,否则省略号 / 跑马灯测不准 */\n.dshpc-btn .dshpc-btn__label{min-width:0;}\n/* loading:不换 DOM 结构,只在文案前插一枚 Loader(size=xs,12px)。\n 环的画法与动画统一在 controls/loader.css(本文件不再维护第二份 SVG 弧 / keyframes)。 */\n\n/* 交互态:颜色变化写在变量上 ⇒ 所有档位一次生效,且变化幅度由 token 决定(够明显) */\n.dshpc-btn:hover:not(:disabled){background-color:var(--btn-bg-hover);color:var(--btn-fg-hover);}\n.dshpc-btn:active:not(:disabled){background-color:var(--btn-bg-active);transform:translateY(1px);}\n.dshpc-btn:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:2px;}\n.dshpc-btn:disabled{cursor:default;opacity:.5;}\n\n.dshpc-btn--primary{--btn-bg:var(--dshpc-accent);--btn-fg:var(--dshpc-fg-inverse);\n --btn-bg-hover:var(--dshpc-accent-hover);--btn-bg-active:var(--dshpc-accent-active);}\n/* secondary:中性实心(灰面),用于「取消 / 次要」这类与主操作并排的按钮 */\n.dshpc-btn--secondary{--btn-bg:var(--dshpc-hover);--btn-fg:var(--dshpc-fg);\n --btn-bg-hover:var(--dshpc-active);--btn-bg-active:var(--dshpc-active);}\n.dshpc-btn--outline{--btn-bg:var(--dshpc-surface-1);--btn-border:var(--dshpc-border-strong);\n --btn-bg-hover:var(--dshpc-hover);--btn-bg-active:var(--dshpc-active);}\n.dshpc-btn--ghost{--btn-fg:var(--dshpc-fg-2);--btn-fg-hover:var(--dshpc-fg);\n --btn-bg-hover:var(--dshpc-hover);--btn-bg-active:var(--dshpc-active);}\n.dshpc-btn--danger{--btn-bg:var(--dshpc-danger);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-danger-hover);--btn-bg-active:var(--dshpc-danger-active);}\n.dshpc-btn--success{--btn-bg:var(--dshpc-success);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-success-hover);--btn-bg-active:var(--dshpc-success-active);}\n.dshpc-btn--warning{--btn-bg:var(--dshpc-warning);--btn-fg:var(--dshpc-on-warning);\n --btn-bg-hover:var(--dshpc-warning-hover);--btn-bg-active:var(--dshpc-warning-active);}\n.dshpc-btn--info{--btn-bg:var(--dshpc-business);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-business-hover);--btn-bg-active:var(--dshpc-business-active);}\n/* 扩展八色实心(2026-10-29):白字两主题均 ≥4.5:1;hover/active 走各自 token 派生。 */\n.dshpc-btn--purple{--btn-bg:var(--dshpc-purple);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-purple-hover);--btn-bg-active:var(--dshpc-purple-active);}\n.dshpc-btn--pink{--btn-bg:var(--dshpc-pink);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-pink-hover);--btn-bg-active:var(--dshpc-pink-active);}\n.dshpc-btn--cyan{--btn-bg:var(--dshpc-cyan);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-cyan-hover);--btn-bg-active:var(--dshpc-cyan-active);}\n.dshpc-btn--teal{--btn-bg:var(--dshpc-teal);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-teal-hover);--btn-bg-active:var(--dshpc-teal-active);}\n.dshpc-btn--orange{--btn-bg:var(--dshpc-orange);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-orange-hover);--btn-bg-active:var(--dshpc-orange-active);}\n.dshpc-btn--indigo{--btn-bg:var(--dshpc-indigo);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-indigo-hover);--btn-bg-active:var(--dshpc-indigo-active);}\n.dshpc-btn--rose{--btn-bg:var(--dshpc-rose);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-rose-hover);--btn-bg-active:var(--dshpc-rose-active);}\n.dshpc-btn--slate{--btn-bg:var(--dshpc-slate);--btn-fg:var(--dshpc-on-signal);\n --btn-bg-hover:var(--dshpc-slate-hover);--btn-bg-active:var(--dshpc-slate-active);}\n/* danger-outline:红字描边(破坏性次要操作,如卡片上的「删除」)。\n ⚠️ 旧修饰类 danger-ink 保留为别名(消费方可能还在挂),两者同一套皮肤。 */\n.dshpc-btn--danger-outline,.dshpc-btn--danger-ink{--btn-border:var(--dshpc-danger);--btn-fg:var(--dshpc-danger);\n --btn-fg-hover:var(--dshpc-danger);--btn-bg-hover:var(--dshpc-danger-soft);--btn-bg-active:var(--dshpc-danger-soft);}\n/* link:行内文字链接型(会话 / 产出文件名),无底无边、品牌蓝、hover 下划线 */\n.dshpc-btn--link{--btn-fg:var(--dshpc-link);--btn-fg-hover:var(--dshpc-link);\n --btn-bg-hover:transparent;--btn-bg-active:transparent;\n height:auto;padding:0;border:0;background:none;font-weight:400;text-align:left;}\n.dshpc-btn--link:hover:not(:disabled){text-decoration:underline;}\n\n/* 图标钮:纯图标,方形;尺寸档的宽高与同档文字按钮等高、圆角统一吃 md(与 .dshpc-btn 同款,2026-10-28 拍板)\n 底色 / 图标色全走局部变量:默认**无底色**,消费方可传 color(图标色)/ background(底色)覆盖(用户 2026-11-02)。 */\n.dshpc-iconbtn{--icb-bg:transparent;--icb-bg-hover:var(--dshpc-hover);--icb-fg:var(--dshpc-fg-2);--icb-fg-hover:var(--dshpc-fg);\n appearance:none;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;\n border:1px solid var(--icb-border,transparent);border-radius:var(--dshpc-radius-md);\n background:var(--icb-bg);color:var(--icb-fg);\n font-family:inherit;cursor:pointer;flex:none;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),border-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease),opacity var(--dshpc-dur-fast) var(--dshpc-ease);}\n.dshpc-iconbtn--sm{width:var(--dshpc-control-h-sm);height:var(--dshpc-control-h-sm);font-size:var(--dshpc-font-sm);}\n.dshpc-iconbtn--md{width:var(--dshpc-control-h-md);height:var(--dshpc-control-h-md);font-size:var(--dshpc-font-md);}\n.dshpc-iconbtn--lg{width:var(--dshpc-control-h-lg);height:var(--dshpc-control-h-lg);font-size:var(--dshpc-font-md);}\n/* 图标与文字按钮同口径:内联 SVG 一律跟随 1em(比 16px 档小一号) */\n.dshpc-iconbtn > svg{display:block;width:1em;height:1em;}\n.dshpc-iconbtn--outline{--icb-bg:var(--dshpc-surface-1);--icb-border:var(--dshpc-border);}\n.dshpc-iconbtn--danger{--icb-fg:var(--dshpc-danger);--icb-bg-hover:var(--dshpc-danger-soft);--icb-fg-hover:var(--dshpc-danger);}\n.dshpc-iconbtn:hover:not(:disabled){background:var(--icb-bg-hover);color:var(--icb-fg-hover);}\n.dshpc-iconbtn:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:2px;}\n.dshpc-iconbtn:disabled{cursor:default;opacity:.4;}\n\n/* ── 行式文件按钮(图标 + 文件名)P2:**全站唯一实现**(2026-10-04 收编)──────────\n 用途:「产出物 / 附件」那种**一行一个文件**的清单项(基础信息右栏产出物清单、附件区、\n 执行记录页的展开区)。平时透明、**鼠标移上去才出浅底**(沿用用户 2026-10-03 定的观感)。\n 两个形态修饰类:\n --block 撑满父宽(清单里一项一行)\n --inline 内容宽(跟在文字后头,如附件行)\n 收编原因:这份皮肤此前只写在 task-list.tsx 的 TASK_LIST_CSS 里(旧名 .dshpc-info-out),\n 执行记录页展开区要用同一种观感 ⇒ 上提基础层,避免再出现「各写一份外观」(同名不同皮的坑刚踩过)。 */\n.dshpc-filechip{appearance:none;-webkit-appearance:none;border:0;border-radius:var(--dshpc-radius-xs);\n background:transparent;color:var(--dshpc-fg);font:inherit;text-align:left;cursor:pointer;min-width:0;\n transition:background-color var(--dshpc-dur) var(--dshpc-ease);}\n.dshpc-filechip:hover:not(:disabled){background:var(--dshpc-chip-bg);}\n.dshpc-filechip:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px;}\n.dshpc-filechip:disabled{cursor:default;background:transparent;color:var(--dshpc-fg-3);}\n.dshpc-filechip--block{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;\n padding:4px 6px;font-size:var(--dshpc-font-xs);}\n.dshpc-filechip--inline{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;font-size:var(--dshpc-font-sm);}\n\n@media (prefers-reduced-motion: reduce){.dshpc-btn,.dshpc-iconbtn,.dshpc-filechip{transition:none;}}\n";
|
|
225
225
|
//#endregion
|
|
226
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
226
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/field-css.generated.js
|
|
227
227
|
const FIELD_CSS = "\n/* ── 字段 + 问号提示(hint 参数内置) ──────────────────────────────────── */\n/* 控件 + FieldHint 同一行;hint 版由组件自己包,调用方只传 hint 字符串。\n 铺满型控件(input/textarea)进包后改吃 flex 弹性,让位给问号。 */\n.dshpc-fieldwrap{display:flex;align-items:center;gap:6px;min-width:0;max-width:100%;}\n.dshpc-fieldwrap--inline{display:inline-flex;}\n.dshpc-fieldwrap > .dshpc-input,.dshpc-fieldwrap > .dshpc-textarea,.dshpc-fieldwrap > .dshpc-iwrap{flex:1 1 auto;width:auto;min-width:0;}\n/* 多行输入:问号钉在**右下角**(2026-10-20 用户:不要垂直居中),文本区底部留出它的位置。\n ⚠️ 这一档必须把 textarea 的宽度还回去(上面那条 flex 让位规则会把它缩窄)。 */\n.dshpc-fieldwrap--block{position:relative;display:block;}\n.dshpc-fieldwrap--block > .dshpc-textarea{width:100%;padding-bottom:24px;}\n.dshpc-fieldwrap--block > .dshpc-hint{position:absolute;right:8px;bottom:6px;}\n\n/* ── 输入类 P3 ────────────────────────────────────────────────────────── */\n/* 默认铺满容器(width:100%,与 .dshpc-textarea 同口径):input 原生按 size 属性取内在宽,\n 不铺满 ⇒ 调用方套定宽壳时会「右边空一截、看着没贴右」(2026-10-20 用户抓的 bug)。\n 要定宽由调用方在外面套壳控制(如 192px 搜索槽)。 */\n.dshpc-input{display:block;width:100%;box-sizing:border-box;border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);\n background:var(--dshpc-surface-1);color:var(--dshpc-fg);font-family:inherit;outline:none;\n transition:border-color var(--dshpc-dur-fast) var(--dshpc-ease),box-shadow var(--dshpc-dur-fast) var(--dshpc-ease);}\n.dshpc-input--sm{height:var(--dshpc-control-h-sm);padding:0 8px;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);}\n.dshpc-input--md{height:var(--dshpc-control-h-md);padding:0 10px;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n.dshpc-input--lg{height:var(--dshpc-control-h-lg);padding:0 12px;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n.dshpc-input::placeholder{color:var(--dshpc-fg-dim);}\n/* type=\"search\":原生清除钮(::-webkit-search-cancel-button)整个隐掉,换组件自己挂的 plain IconButton\n —— 原生那个各子系统长相不一、还不吃 token(2026-10-28 用户:不好看,要数字框加减号那种)。 */\n.dshpc-iwrap .dshpc-input::-webkit-search-cancel-button{display:none;}\n.dshpc-input:focus{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n.dshpc-input--error{border-color:var(--dshpc-danger);}\n.dshpc-input:disabled{cursor:default;opacity:.5;}\n\n/* 左侧图标槽(Input 的 icon 参数):图标绝对定位压在输入框的左内边距上,\n 输入框自己的边框 / 焦点圈 / 描红一律不动。图标不吃点击(pointer-events:none)⇒ 点在图标上照样聚焦。\n 左内边距 = 左偏 8 + 图标宽(sm 14 / md·lg 16,见 fieldMetricsOf)+ 间距 4。 */\n.dshpc-iwrap{position:relative;display:block;width:100%;min-width:0;}\n.dshpc-iwrap__icon{position:absolute;left:8px;top:50%;transform:translateY(-50%);display:inline-flex;pointer-events:none;color:var(--dshpc-fg-2);}\n.dshpc-iwrap--sm > .dshpc-input{padding-left:26px;}\n.dshpc-iwrap--md > .dshpc-input,.dshpc-iwrap--lg > .dshpc-input{padding-left:28px;}\n/* 禁用时图标跟输入框一起变淡(输入框自己已有 opacity:.5,图标不在它里面,得单独跟一下)。 */\n.dshpc-iwrap:has(> .dshpc-input:disabled) > .dshpc-iwrap__icon{opacity:.5;}\n\n/* 搜索框的清空钮(Field.ts 在「有焦点 + 有内容」时才挂出来):**并进框里**,与数字框的 − / +\n 同形态 —— 整段同高、左直右圆、hover 底色铺满这一格(2026-10-28 用户:不要一颗悬在右边的小按钮)。\n 向内让 1px,免得底色压住输入框自己的边框。 */\n.dshpc-iwrap__clear.dshpc-iconbtn{position:absolute;right:1px;top:1px;bottom:1px;height:auto;width:auto;aspect-ratio:1;\n border-radius:0 var(--dshpc-radius-md) var(--dshpc-radius-md) 0;font-size:var(--dshpc-font-md);}\n/* height:auto 必须:iconbtn--md/lg 的固定 height 会让 absolute 的 bottom 被忽略\n (top:1 + 固定高 ⇒ 整钮错位 1px,× 显得没居中,2026-10-28 用户截图抓的)。 */\n/* 文字让开这一段(宽度 = 控件高 - 2,故按档位补)。 */\n.dshpc-iwrap--clear > .dshpc-input{padding-right:calc(var(--dshpc-control-h-md) + 3px);}\n.dshpc-iwrap--clear.dshpc-iwrap--sm > .dshpc-input{padding-right:calc(var(--dshpc-control-h-sm) + 3px);}\n.dshpc-iwrap--clear.dshpc-iwrap--lg > .dshpc-input{padding-right:calc(var(--dshpc-control-h-lg) + 3px);}\n\n.dshpc-pfx{display:inline-flex;align-items:center;box-sizing:border-box;overflow:hidden;\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);color:var(--dshpc-fg);}\n.dshpc-pfx--sm{height:var(--dshpc-control-h-sm);}\n.dshpc-pfx--md{height:var(--dshpc-control-h-md);}\n.dshpc-pfx--lg{height:var(--dshpc-control-h-lg);}\n/* md / lg 档字号跟档走(与同档下拉同字号):此前写死 sm(12px),同排下拉是 13px ⇒ 显得「input 字小」。 */\n.dshpc-pfx--md .dshpc-pfx__label,.dshpc-pfx--lg .dshpc-pfx__label{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n.dshpc-pfx--md .dshpc-pfx__input,.dshpc-pfx--lg .dshpc-pfx__input{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n.dshpc-pfx--error{border-color:var(--dshpc-danger);}\n.dshpc-pfx:focus-within{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n.dshpc-pfx__label{padding:0 8px;color:var(--dshpc-fg-2);font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);white-space:nowrap;border-right:1px solid var(--dshpc-border);}\n.dshpc-pfx__input{flex:1 1 auto;min-width:0;height:100%;padding:0 8px;border:0;background:transparent;color:var(--dshpc-fg);\n font-family:inherit;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);outline:none;}\n.dshpc-pfx__input::placeholder{color:var(--dshpc-fg-dim);}\n\n.dshpc-num{display:inline-flex;align-items:center;justify-content:space-between;box-sizing:border-box;overflow:hidden;\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);color:var(--dshpc-fg);}\n/* 中段:数字 + 后缀成组居中;容器被消费端拉宽时吃掉全部余量,两端 − / + 因此钉死在左右边缘。 */\n.dshpc-num__mid{display:flex;align-items:center;justify-content:center;flex:1 1 auto;min-width:0;}\n.dshpc-num--sm{height:var(--dshpc-control-h-sm);}\n.dshpc-num--md{height:var(--dshpc-control-h-md);}\n.dshpc-num--lg{height:var(--dshpc-control-h-lg);}\n.dshpc-num--md .dshpc-num__input,.dshpc-num--lg .dshpc-num__input{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n.dshpc-num--md .dshpc-num__suffix,.dshpc-num--lg .dshpc-num__suffix{font-size:var(--dshpc-font-md);}\n.dshpc-num--disabled{opacity:.5;}\n/* 焦点态与 Input 同款(2026-10-20 用户:数字框里点进去没有蓝框):内层 input 无边框,\n 焦点状态画在整个步进控件外框上。 */\n.dshpc-num:focus-within{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n.dshpc-num__input{width:36px;height:100%;padding:0 2px;border:0;background:transparent;color:var(--dshpc-fg);\n font-family:inherit;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);text-align:center;outline:none;}\n.dshpc-num__suffix{padding:0 6px;color:var(--dshpc-fg-2);font-size:var(--dshpc-font-sm);white-space:nowrap;}\n.dshpc-num .dshpc-iconbtn{border-radius:0;color:var(--dshpc-fg-2);flex:none;}\n\n/* 官方 Switch 包装统一:选中 = success 绿。\n (合并原先 task-editor-css / task-list 两处就地覆盖;选择器带包装类 + role,特异性高于官方。) */\n.dshpc-switch button[role='switch'][aria-checked='true']{background:var(--dshpc-success);}\n\n/* 多行文本输入(提示词等,P3):**边框 / 圆角 / 底 / 焦点态与 Input 同一套口径**(用户 2026-10-20:\n 「多行输入应该和 input 的边儿是一个道理,包括圆角在内,都是一个东西」)。\n ⚠️ 旧意图「卡内无边框、视觉重心在整张卡上」已作废 —— 现在它就是一只带框的多行输入框。\n (从 task-editor-css 的 .dshpc-ed-prompt 上提而来;业务文件不再自写 textarea 皮肤。) */\n.dshpc-textarea{display:block;width:100%;box-sizing:border-box;min-height:132px;padding:8px 12px;\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);outline:none;\n background:var(--dshpc-surface-1);color:var(--dshpc-fg);font-family:inherit;font-size:var(--dshpc-font-lg);line-height:1.6;resize:vertical;\n transition:border-color var(--dshpc-dur-fast) var(--dshpc-ease),box-shadow var(--dshpc-dur-fast) var(--dshpc-ease);}\n.dshpc-textarea::placeholder{color:var(--dshpc-fg-dim);}\n.dshpc-textarea:focus{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n/* 校验不通过:与 Input 一致,走边框描红(旧版是 box-shadow 描红盒,与 Input 不同口径) */\n.dshpc-textarea--error{border-color:var(--dshpc-danger);}\n.dshpc-textarea:disabled{cursor:default;opacity:.5;}\n@media (prefers-reduced-motion: reduce){.dshpc-textarea{transition:none;}}\n\n/* 拖拽分隔条(编辑分栏 / 预览 dock 共用,U20 #3):6px 命中区,col-resize,不画线,hover/按下浮出浅带。\n 具体 z-index 由 .dshpc-ed-resizer / .dshpc-sv-resizer 各自补。 */\n.dshpc-resizer{position:absolute;top:0;bottom:0;left:0;width:6px;cursor:col-resize;background:0 0;touch-action:none;user-select:none;}\n.dshpc-resizer:hover,.dshpc-resizer:active{background:var(--dshpc-hover);}\n\n@media (prefers-reduced-motion: reduce){.dshpc-input,.dshpc-pfx{transition:none;}}\n";
|
|
228
228
|
//#endregion
|
|
229
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
229
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/feedback/loader-css.generated.js
|
|
230
230
|
const LOADER_CSS = "/* ── Loader:统一的加载动画图标(无背景 / 无定位 / 颜色跟随 currentColor)────────\n 形态 × 尺寸两轴正交:形态管几何与动画;尺寸档只改 width / height,几何按\n viewBox=\"0 0 24 24\" 等比缩放 —— 一套几何吃五档,12px 时描边即 1.5px、48px 时 6px,\n 视觉重量一致,不用逐个尺寸换算 calc。\n\n 边界:本控件**只管图标本身**。背景 / 圆角 / 内距 / 阴影 / 定位(fixed、居中、漂浮)\n 一律归调用方 —— 套 Chip、套 Card,或自己包一个 div。 */\n\n.dshpc-loader { display: inline-block; flex: none; vertical-align: middle; line-height: 0; color: inherit; }\n\n.dshpc-loader--xs { width: 12px; height: 12px; }\n.dshpc-loader--sm { width: 16px; height: 16px; }\n.dshpc-loader--md { width: 24px; height: 24px; }\n.dshpc-loader--lg { width: 32px; height: 32px; }\n.dshpc-loader--xl { width: 48px; height: 48px; }\n\n/* 形态一 ring:开口弧整体旋转。必须走 SVG 矢量弧 —— 次像素边框画圆在 12px 下会被\n 抗锯齿拉毛、看着像圆角方(2026-10-20 真机实测,曾被误判成 border-radius 被覆盖)。 */\n.dshpc-loader--ring { animation: dshpc-loader-rotate .8s linear infinite; }\n@keyframes dshpc-loader-rotate { to { transform: rotate(360deg) } }\n\n/* 形态二 blocks:三个方块依次脉动放大。\n transform-box: fill-box 是 SVG 子元素做 CSS transform 的必要条件 —— 否则 origin\n 落在 viewBox 原点,节点会绕着左上角飞出去。 */\n.dshpc-loader__node { transform-box: fill-box; transform-origin: center; }\n.dshpc-loader--blocks .dshpc-loader__node { animation: dshpc-loader-blink 1.2s ease-in-out infinite; }\n.dshpc-loader__node:nth-child(2) { animation-delay: .15s; }\n.dshpc-loader__node:nth-child(3) { animation-delay: .3s; }\n@keyframes dshpc-loader-blink {\n 0%, 80%, 100% { opacity: .25; transform: scale(.8) }\n 40% { opacity: 1; transform: scale(1) }\n}\n\n/* 降低动效:停在「全部可见、实体大小」,而不是停在动画中途的半透明小点。 */\n@media (prefers-reduced-motion: reduce) {\n .dshpc-loader--ring { animation: none; }\n .dshpc-loader__node { animation: none; opacity: 1; transform: none; }\n}\n";
|
|
231
231
|
//#endregion
|
|
232
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
232
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/layout/quick-toolbar-css.generated.js
|
|
233
233
|
const QUICK_TOOLBAR_CSS = "/* 快捷工具栏:右侧悬浮的一列独立圆钮。\n 横向 left / right 与 bottom、按钮直径、纵向间距由组件按 props 实时写入 style;\n 这里只放与位置无关的皮肤。 */\n.dshpc-quick-toolbar{\n position:fixed;\n z-index:var(--dshpc-z-dock);\n display:flex;\n flex-direction:column;\n align-items:center;\n}\n/* 出现 / 消失:挂载即淡入,退场先播 fade-out(组件延迟卸载,见 QuickToolbar.ts)。 */\n@keyframes dshpc-quick-toolbar-in{\n from{opacity:0;transform:translateY(6px) scale(.9);}\n to{opacity:1;transform:none;}\n}\n@keyframes dshpc-quick-toolbar-out{\n from{opacity:1;transform:none;}\n to{opacity:0;transform:translateY(6px) scale(.9);}\n}\n.dshpc-quick-toolbar__item{\n display:inline-flex;\n align-items:center;\n justify-content:center;\n padding:0;\n margin:0;\n box-sizing:border-box;\n border:1px solid var(--dshpc-border);\n border-radius:50%;\n /* 自定义底色 / 字色只写这两个变量(见 QuickToolbar.ts),hover/active 才能跟着混色。 */\n background:var(--dshpc-quick-toolbar-bg, var(--dshpc-solid));\n color:var(--dshpc-quick-toolbar-fg, var(--dshpc-on-solid));\n box-shadow:var(--dshpc-shadow-2);\n cursor:pointer;\n animation:dshpc-quick-toolbar-in var(--dshpc-dur) var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),\n color var(--dshpc-dur-fast) var(--dshpc-ease),\n transform var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* 退场期保留占位,避免同列其他按钮瞬时跳位。 */\n.dshpc-quick-toolbar__item.is-leaving{\n animation:dshpc-quick-toolbar-out var(--dshpc-dur) var(--dshpc-ease) forwards;\n pointer-events:none;\n}\n/* 变色与核心 Button 实心档同一套:按 --dshpc-fg 混出 hover / active 底色(自定义 color 也跟随)。 */\n.dshpc-quick-toolbar__item:hover{\n background:color-mix(in srgb, var(--dshpc-quick-toolbar-bg, var(--dshpc-solid)) 82%, var(--dshpc-fg));\n}\n.dshpc-quick-toolbar__item:active{\n background:color-mix(in srgb, var(--dshpc-quick-toolbar-bg, var(--dshpc-solid)) 70%, var(--dshpc-fg));\n transform:scale(.94);\n}\n.dshpc-quick-toolbar__item:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:2px;}\n@media (prefers-reduced-motion: reduce){\n .dshpc-quick-toolbar__item{transition:none;transform:none;animation:none;}\n .dshpc-quick-toolbar__item.is-leaving{animation:none;opacity:0;}\n}\n";
|
|
234
234
|
//#endregion
|
|
235
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
235
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/hint-css.generated.js
|
|
236
236
|
const HINT_CSS = "\n/* ── 问号提示 P4(用户 2026-10-18:对齐真实插件 HelpButton——**带圈的问号图标**)──\n 本体 14px 细圈 + 圈内 ?,颜色 fg-3、hover 只提亮不加底(与 dshpc-ed-help 同规矩)。\n 气泡不在本文件:2026-10-19 用户拍板「问号必须用官方 Tooltip 那一个」⇒ 气泡由注入的\n 官方组件渲染(src/ui/tooltip.ts),这里只管问号图标本身。 */\n.dshpc-hint{display:inline-flex;align-items:center;justify-content:center;flex:none;\n box-sizing:border-box;width:14px;height:14px;padding:0;border:1px solid currentColor;border-radius:50%;background:transparent;\n color:var(--dshpc-fg-3);font-family:inherit;font-size:8px;font-weight:600;line-height:12px;cursor:help;vertical-align:middle;\n transition:color var(--dshpc-dur-fast) var(--dshpc-ease);}\n.dshpc-hint:hover,.dshpc-hint:focus-visible{color:var(--dshpc-fg);background:0 0;}\n.dshpc-hint:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px;}\n";
|
|
237
237
|
//#endregion
|
|
238
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
238
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/layout/split-group-css.generated.js
|
|
239
239
|
const SPLIT_GROUP_CSS = "\n/* ── 拼接外壳 SplitGroup ──────────────────────────────────────────────\n 职责只有一条:把两个控件在外观上焊成一体(外框 / 圆角 / 中间 1px 分隔 / 整体聚焦圈)。\n 它**不持状态、不出联动回调** —— 选中与联动全走内件自己的 value / onChange\n (用户 2026-10-28 拍板:外壳不必知道右边那个下拉管什么)。\n\n ⚠️ 与内件类名有意耦合:内件是 Picker / Segmented 时由下面几条规则把它们自己的\n 边框 / 底色 / 圆角交出来,由外壳统一画。内件改名或改结构要同步改这里,\n 否则会出现双边框、双底色。\n\n 高度不写死:内件自己按 size 档(sm 24 / md 28 / lg 32)撑开,外壳跟着长。\n 两格要等高,就给内件传**同一个 size**。万一两格 size 不一致,外壳内件用 align-items:center\n 居中(不会顶对齐露白,用户 2026-10-28 截图反馈「本月偏上」后的处理);**别用 height:100%**,\n 它会覆盖三档高度(与 --lg/--sm 同特异性且注入更晚)。\n\n 左格统一灰底(用户 2026-10-28 拍板):滑块保留自己的灰轨,左格下拉把底色换成\n surface-sunken;右格保持原样。层次感 = 左格是「档位/范围」,右格是「值」。 */\n .dshpc-split{display:inline-flex;align-items:stretch;max-width:100%;overflow:hidden;border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);}\n /* 两格宽度都由内容给;容器再窄也让内件自己省略,不让外壳被撑破 */\n .dshpc-split > *{min-width:0;max-width:100%;}\n /* 分隔:相邻兄弟的左描边,不额外插 DOM,hover / focus 时也不会断 */\n .dshpc-split > * + *{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n /* 整体聚焦:只在**下拉展开**时画一整圈(判据是内件的 aria-expanded,不是 :focus-within)。\n 2026-11-02 用户定稿:滑块那格是「选中」不是「输入聚焦」,鼠标点它不该让整框常亮;\n 而且选取值后焦点会留在按钮上,用 :focus-within 会一直亮着。 */\n .dshpc-split:has(.dshpc-picker__trigger[aria-expanded='true']){border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n /* Picker:去掉自身外框与底色;display 改成 flex,消掉 inline-block 行盒带来的基线间隙。\n 注意**不能用 height:100%**:它会和 .dshpc-picker__trigger--lg / --sm 同特异性(都是两个类),\n 且 split-group.css 在 picker.css 之后注入,会把三档高度全吃掉(md/lg 看起来一样大)。\n 改用 align-items:center —— 同 size 时两格自然等高的同时文字垂直居中;万一两格 size 不一致,\n 较矮的格也只是居中、不会顶对齐露白。 */\n .dshpc-split .dshpc-picker{display:flex;align-items:center;}\n .dshpc-split .dshpc-picker__trigger{border:0;border-radius:0;background:transparent;}\n .dshpc-split .dshpc-picker__trigger:focus-visible{outline:0;}\n /* 左格下拉:灰底(滑块的灰轨是它自己的 --dshpc-seg-track,不在这里覆盖) */\n .dshpc-split > :first-child .dshpc-picker__trigger{background:var(--dshpc-surface-sunken);}\n /* Segmented:只去外圆角与描边,灰轨保留;padding 保持 3px 不动 —— 它是高度契约的一部分\n (3 + item + 3 = control-h)。bordered 那档去掉描边、把让给描边的 1px 还回 padding,\n 否则会比右边矮 2px。 */\n .dshpc-split .dshpc-seg{border-radius:0;border:0;}\n .dshpc-split .dshpc-seg--bordered{padding:3px;}\n";
|
|
240
240
|
//#endregion
|
|
241
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
241
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/input-group-css.generated.js
|
|
242
242
|
const INPUT_GROUP_CSS = "\n/* ── 组合输入框 InputGroup ─────────────────────────────────────────────\n 输入框 + 后置按钮(一枚或多枚)+ 可选前置标题,焊成一体。\n 与 SplitGroup 同一套外观口径:外框 / 圆角 / 相邻 1px 分隔 / 整体聚焦圈都由外壳画,\n 内件(.dshpc-input / .dshpc-btn / .dshpc-iconbtn)把自己的边框、圆角、外圈交出来。\n\n 高度默认吃 --dshpc-control-h-*(sm 24 / md 28 / lg 32);调用方要自定义就在根节点\n 内联 height,这里让内件 height:100% 跟上 —— 内件档位高度只有 0,1,0,被本文件的\n 0,2,0 压掉,不会出现「外壳变高了、里面的框还是 32」。\n (⚠️ 别改成不写 height:100% 只靠 stretch:input 有确定高度时 flex 不会拉伸它。) */\n/* min-width:输入格是 flex:1,没有它时 inline-flex 按占位文字宽收得很窄(搜索框 + 按钮的典型用法会难看)。\n 要更宽 / 更窄由调用方在外面套壳或给 className,不许在这里写死 max-width。 */\n.dshpc-igroup{display:inline-flex;align-items:stretch;min-width:200px;max-width:100%;box-sizing:border-box;overflow:hidden;\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);}\n.dshpc-igroup--sm{height:var(--dshpc-control-h-sm);}\n.dshpc-igroup--md{height:var(--dshpc-control-h-md);}\n.dshpc-igroup--lg{height:var(--dshpc-control-h-lg);}\n.dshpc-igroup--error{border-color:var(--dshpc-danger);}\n/* 整体聚焦:内件自己的焦点圈交出来,由外壳画一整圈(各画各的会变成格内半圈) */\n.dshpc-igroup:focus-within{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n\n/* 前置标题:与输入框同格,灰底区分(与 SplitGroup 左格同一口径) */\n.dshpc-igroup__label{display:inline-flex;align-items:center;flex:none;padding:0 8px;white-space:nowrap;\n background:var(--dshpc-surface-sunken);color:var(--dshpc-fg-2);\n font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);}\n.dshpc-igroup--md .dshpc-igroup__label,.dshpc-igroup--lg .dshpc-igroup__label{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n\n/* 输入格:交出边框 / 圆角 / 底色 / 焦点圈;宽度交给 flex(原生 width:100% 会和 flex-basis 打架) */\n.dshpc-igroup > .dshpc-input{flex:1 1 auto;width:auto;min-width:0;height:100%;border:0;border-radius:0;background:transparent;}\n.dshpc-igroup > .dshpc-input:focus{box-shadow:none;}\n\n/* 按钮格:交出边框与圆角;实心底色保留(右侧「确定」该有重量)。\n 纯图标钮本身是固定宽的方块,这里改成按高度撑出的正方形,自定义高度时才不会变成竖长条。 */\n.dshpc-igroup > .dshpc-btn,.dshpc-igroup > .dshpc-iconbtn{flex:none;height:100%;border-radius:0;}\n.dshpc-igroup > .dshpc-iconbtn{width:auto;aspect-ratio:1;}\n.dshpc-igroup > .dshpc-btn{border:0;}\n\n/* 分隔线:相邻兄弟的左描边,不额外插 DOM。后两条是给「清过边框」的格子补回来的,\n 必须写成 0,2,0 且写在上面的 border:0 之后 —— 否则被 border:0 压掉,格子之间没分隔。 */\n.dshpc-igroup > * + *{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n.dshpc-igroup > * + .dshpc-input{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n.dshpc-igroup > * + .dshpc-btn{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n";
|
|
243
243
|
//#endregion
|
|
244
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
244
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/table-css.generated.js
|
|
245
245
|
const TABLE_BASE_CSS = "/* ── 表格基础层(结构 + 交互 + 空态)─────────────────────────────────────\n 外观分档 = 分组件 + 分文件:本文件只放所有外观共用的部分;\n 表头底色、分隔线、悬浮 / 选中色由皮肤文件负责(table-plain.css 是第一档)。\n 皮肤选择器一律挂在 .dshpc-table--<skin> 下,与基础层不同名 —— 注入顺序不影响胜负\n (test/css-contract.test.mjs 禁止跨常量同名选择器)。\n 圆角裁剪 / 横向滚动归调用方容器,本层不设 overflow;也不做表头吸顶:\n 分组表头是多行,统一 top:0 会在滚动时互相盖住(要吸顶请在外层容器处理)。 */\n\n.dshpc-table{--dshpc-table-pad-x:var(--dshpc-space-3);--dshpc-table-head-h:44px;--dshpc-table-row-h:48px;\n width:100%;table-layout:fixed;border-collapse:separate;border-spacing:0;box-sizing:border-box;\n color:var(--dshpc-fg);font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n\n/* 密度三档:只改行高与水平内距,配色与分隔线归皮肤。compact / comfortable 各一行,\n 新增档位在此追加;列级 padding 走内联 style 覆盖(不在这里再开一套变量)。\n 默认水平内距 12px(space-3)—— 参考稿的色块间距,16px 偏松。 */\n.dshpc-table--density-compact{--dshpc-table-pad-x:var(--dshpc-space-2);--dshpc-table-head-h:36px;--dshpc-table-row-h:36px;}\n.dshpc-table--density-comfortable{--dshpc-table-pad-x:var(--dshpc-space-4);--dshpc-table-head-h:52px;--dshpc-table-row-h:60px;}\n\n.dshpc-table__head-cell,.dshpc-table__cell{box-sizing:border-box;padding:var(--dshpc-space-1) var(--dshpc-table-pad-x);\n text-align:left;vertical-align:middle;font-weight:400;}\n\n/* 表头 44 / 数据行 48 是 default 档(参考稿密度);height 在 table-cell 上是最小高,\n 多行内容会自动把行撑高,不会被截断。 */\n.dshpc-table__head-cell{height:var(--dshpc-table-head-h);font-size:var(--dshpc-font-sm);font-weight:600;color:var(--dshpc-fg-2);}\n.dshpc-table__head-cell--group{text-align:center;}\n.dshpc-table__cell{height:var(--dshpc-table-row-h);}\n\n.dshpc-table__head-cell--center,.dshpc-table__cell--center{text-align:center;}\n.dshpc-table__head-cell--right,.dshpc-table__cell--right{text-align:right;}\n\n.dshpc-table__row{transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease);}\n/* 只有传了 onRowClick 的行才是可点的(数据属性由组件按此打)。 */\n.dshpc-table__row[data-interactive='true']{cursor:pointer;}\n.dshpc-table__row:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:-2px;}\n\n/* 斑马纹是通用能力(表级 striped 开关),放在基础层:底色取 token,各档皮肤不必各自实现。\n 选择器刻意只到 3 个类级别(表级 + 行 + :nth-child);皮肤层的行态规则带 __body 上下文\n + 属性选择器,必然是 4 级 ⇒ 与注入顺序无关地压过它。\n 2026-10-30 真机事故:这里曾写满 4 级(多了一个 __body),与选中的 4 级相同 ⇒ 基础层\n 比皮肤后注入,偶数行永远被斑马纹盖住(「单数行能选中、双数行点了没反应」)。 */\n.dshpc-table--striped .dshpc-table__row:nth-child(even){background:var(--dshpc-plate);}\n\n/* 分组通栏:一个表格里放多个板块(工作区 A / 工作区 B)时,每组先来一行横跨全部列的大标题,\n 然后才是这一组自己的表头与数据行。结构 + 底色归基础层(只用 token,各档皮肤共同成立);\n 通栏底走 --dshpc-table-banner-bg(与表头互换的那一档,2026-10-30 用户定);\n 通栏与组表头之间画一条线(用户 2026-10-30:那之间也要有 border);\n 组与组之间用通栏顶线隔开,第一组顶部不画(外框已经在那儿,画了就成双线)。 */\n.dshpc-table__group-cell{height:var(--dshpc-table-head-h);padding:var(--dshpc-space-1) var(--dshpc-table-pad-x);\n box-sizing:border-box;background:var(--dshpc-table-banner-bg);border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n text-align:left;vertical-align:middle;font-size:var(--dshpc-font-sm);font-weight:600;color:var(--dshpc-fg);}\n.dshpc-table__group-body:first-of-type .dshpc-table__group-cell{border-top:0;}\n\n/* 通栏标题的固定标签(短竖线)与排版由 SectionHead 自带(4px 圆头),本层不再画。 */\n\n.dshpc-table__empty{height:80px;padding:0 var(--dshpc-space-4);text-align:center;\n color:var(--dshpc-fg-3);font-size:var(--dshpc-font-sm);}\n\n/* 加载态行(加载更多 / 没有更多 / 整表加载):单元格自身不画边框(底部状态行的顶线由皮肤补),内容居中;\n 整表加载默认占位 160px(可由 loadingHeight 覆盖),底部那行只占一行高。 */\n.dshpc-table__state-cell{padding:0;border:0;text-align:center;vertical-align:middle;}\n.dshpc-table__state{display:flex;align-items:center;justify-content:center;\n gap:var(--dshpc-space-2);min-height:40px;padding:var(--dshpc-space-1) var(--dshpc-table-pad-x);\n box-sizing:border-box;color:var(--dshpc-fg-3);font-size:var(--dshpc-font-sm);}\n.dshpc-table__state--full{flex-direction:column;min-height:160px;gap:var(--dshpc-space-3);font-size:var(--dshpc-font-sm);}\n.dshpc-table__state-text{line-height:1;}\n/* 底部哨兵:零高、无边框、无内容,只给 IntersectionObserver 一个落点。 */\n.dshpc-table__sentinel>td{height:0;padding:0;border:0;line-height:0;}\n\n/* 内建分页的外壳:表格在上、分页条在下,间距走 space-3(分页条自己管左右对齐)。 */\n.dshpc-table-frame{display:flex;flex-direction:column;gap:var(--dshpc-space-3);}\n";
|
|
246
246
|
//#endregion
|
|
247
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
247
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/table-plain-css.generated.js
|
|
248
248
|
const TABLE_PLAIN_CSS = "/* ── 外观一 · Plain(第一个样式:白卡片上的轻量表格)─────────────────────\n 特征:外框 + 灰底表头(含下边线,双行分组表头也清楚)、竖向分隔线、\n 数据行只保留极淡底线(不画重横线)、行悬浮淡蓝、选中行淡蓝底 + 左侧 3px 蓝竖条。\n 选择器全部挂在 .dshpc-table--plain 下,和基础层不同名(注入顺序无关)。\n 竖分隔线按列声明(格子上的 data-divider),不用相邻兄弟选择器 —— 后者会让每行首格\n 永远没有左线(用户 2026-10-30 真机看到的 Name 左侧缺线),且单元格跨列后会画错位置。\n 后续外观照此另建:table-grid.css / table-zebra.css,各自一个组件、各自 import 自己那份。 */\n\n/* 外框四态:all 四边 / x 只有左右 / y 只有上下 / none 全不要。\n 组件总会按 borders 属性和上对应 class,故这里不存在「无 class 的裸表」。\n 「不要左右两条边」就是 borders='y'。 */\n.dshpc-table--plain.dshpc-table--borders-all{border:1px solid var(--dshpc-border);}\n.dshpc-table--plain.dshpc-table--borders-x{border-left:1px solid var(--dshpc-border);\n border-right:1px solid var(--dshpc-border);}\n.dshpc-table--plain.dshpc-table--borders-y{border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);}\n.dshpc-table--plain.dshpc-table--borders-none{border:0;}\n\n/* 表头:中性灰底 + 下边线。底色走 --dshpc-table-head-bg(= --dshpc-surface-sunken,\n 与通栏那层灰同源;2026-10-30 用户二次定案:表头 / 通栏互换底色);下边线兜住分组表头的第二层。 */\n.dshpc-table--plain .dshpc-table__head-cell{\n background:var(--dshpc-table-head-bg);\n border-bottom:1px solid var(--dshpc-border);\n}\n.dshpc-table--plain .dshpc-table__head-cell--group{color:var(--dshpc-fg-3);}\n\n/* 表头多色:列级 headerTone 打到 data-header-tone,浅底 + 同色文字。\n 色值全部来自 token(soft 底 / 实色字),暗色主题自动跟随,不写死任何 hex。\n 这组规则比上方灰底规则多一个属性选择器,必然覆盖默认灰底。 */\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='business']{background:var(--dshpc-business-soft);color:var(--dshpc-business);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='success']{background:var(--dshpc-success-soft);color:var(--dshpc-success);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='warning']{background:var(--dshpc-warning-soft);color:var(--dshpc-warning);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='danger']{background:var(--dshpc-danger-soft);color:var(--dshpc-danger);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='purple']{background:var(--dshpc-purple-soft);color:var(--dshpc-purple);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='pink']{background:var(--dshpc-pink-soft);color:var(--dshpc-pink);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='cyan']{background:var(--dshpc-cyan-soft);color:var(--dshpc-cyan);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='teal']{background:var(--dshpc-teal-soft);color:var(--dshpc-teal);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='orange']{background:var(--dshpc-orange-soft);color:var(--dshpc-orange);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='indigo']{background:var(--dshpc-indigo-soft);color:var(--dshpc-indigo);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='rose']{background:var(--dshpc-rose-soft);color:var(--dshpc-rose);}\n.dshpc-table--plain .dshpc-table__head-cell[data-header-tone='slate']{background:var(--dshpc-slate-soft);color:var(--dshpc-slate);}\n\n/* 竖分隔线:按列声明,**默认不画**。组件只给 divider: true 的列打 data-divider='left',\n 首列恒不画(那是外框的位置)。默认表格 = 只有横线、没有一条竖线;\n 要「列间有线」就给对应列 divider:true。 */\n.dshpc-table--plain .dshpc-table__head-cell[data-divider='left'],\n.dshpc-table--plain .dshpc-table__cell[data-divider='left']{border-left:1px solid var(--dshpc-border);}\n\n/* 数据行之间的极淡底线:只帮眼睛「分行」,不回到粗横线表格的老样子。 */\n.dshpc-table--plain .dshpc-table__row + .dshpc-table__row .dshpc-table__cell{\n border-top:1px solid var(--dshpc-border-faint);\n}\n\n/* 底部状态行(加载更多 / 到底):整行通栏,与上方数据行之间补一条实线。\n 只补顶线:左右两条不由这一格重复画 —— borders=all / x 时表级外框已经兜住;\n borders=y / none 本来就没有左右边。整表加载占位行不加(表头已有下边线,再加就成双线)。 */\n.dshpc-table--plain .dshpc-table__state-row--footer .dshpc-table__state-cell{\n border-top:1px solid var(--dshpc-border);\n}\n\n/* 没有左右外框时(borders=y)底部状态行下面那条表底线也去掉:\n 状态行只留上方一条实线,否则图标 / 文案下方还多一条孤线(2026-10-31 用户定)。\n borders=none 本来就没有底边,无需在此重复。 */\n.dshpc-table--plain.dshpc-table--borders-y.dshpc-table--foot-no-bottom{border-bottom:0;}\n\n/* 行悬浮:只在可点行上给反馈,静态表格不误导用户以为能点。\n 底色是极淡中性灰(--dshpc-table-row-hover:亮色一层淡黑 ≈1.5%,暗色一层淡白 ≈3%)——\n 2026-10-30 用户:hover 要特别淡的灰、不要淡蓝(第二次又要求再浅一半)。带 __body 上下文是为了压过基础层的斑马纹(见 table.css)。 */\n.dshpc-table--plain .dshpc-table__body .dshpc-table__row[data-interactive='true']:hover{background:var(--dshpc-table-row-hover);}\n\n/* 选中行:淡蓝底 + 左侧蓝竖条。用背景渐变画条,避免 tr 上伪元素 / 定位的兼容问题;\n 两条选择器同一份声明:悬浮态(多一个属性 + 伪类)不会盖掉选中态。\n 底色用 business-soft(比悬浮再明确一档但仍是浅色),条本身才是「选中」的信号。\n 特异性 4 级,高于基础层的斑马纹(3 级)⇒ 偶数行也能正常选中。 */\n.dshpc-table--plain .dshpc-table__body .dshpc-table__row[data-selected='true'],\n.dshpc-table--plain .dshpc-table__body .dshpc-table__row[data-selected='true'][data-interactive='true']:hover{\n background:linear-gradient(to right,var(--dshpc-business) 3px,var(--dshpc-business-soft) 3px);\n}\n";
|
|
249
249
|
//#endregion
|
|
250
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
250
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/navigation/pagination-css.generated.js
|
|
251
251
|
const PAGINATION_CSS = "/* ── 分页(‹ Previous 1 2 3 … 36 Next ›)────────────────────────────────────\n 当前页 = 蓝色圆角方块 + 白字(实心面的字必须走 --dshpc-on-signal,不许用主题反色);\n 其余页码是纯文字按钮,悬浮只给极淡中性底。对齐由 --left / --center / --right 三个修饰决定,\n 组件默认 right。颜色全部走 token,明暗自动跟随宿主。 */\n\n.dshpc-pagination{display:flex;align-items:center;gap:var(--dshpc-space-2);flex-wrap:wrap;\n font-size:var(--dshpc-font-sm);line-height:1;color:var(--dshpc-fg-2);}\n\n.dshpc-pagination--left{justify-content:flex-start;}\n.dshpc-pagination--center{justify-content:center;}\n.dshpc-pagination--right{justify-content:flex-end;}\n\n.dshpc-pagination__total{color:var(--dshpc-fg-3);margin-inline-end:var(--dshpc-space-1);}\n\n.dshpc-pagination__pages{display:flex;align-items:center;gap:2px;}\n\n/* 页码 / 上下页 = 核心 Button(当前页 info 实心蓝、其余 ghost),箭头 = 全站唯一 Chevron。\n 这里只补尺寸与间距,不重画按钮皮肤;两级选择器压过 .dshpc-btn--md 的内距。 */\n.dshpc-pagination .dshpc-pagination__page{padding:0 6px;min-width:28px;}\n.dshpc-pagination .dshpc-pagination__nav{padding:0 var(--dshpc-space-2);}\n\n.dshpc-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;\n min-width:28px;height:28px;color:var(--dshpc-fg-3);}\n\n.dshpc-pagination__simple{min-width:64px;text-align:center;font-variant-numeric:tabular-nums;\n color:var(--dshpc-fg);}\n\n/* 简洁模式只留箭头:文字标签隐藏,箭头仍然可见(无障碍名还在 aria-label 上)。 */\n.dshpc-pagination--simple .dshpc-pagination__text{display:none;}\n\n/* 每页条数下拉 = 核心 Picker(箭头是全站唯一的 Chevron):只收窄不参与伸缩。 */\n.dshpc-pagination__size{flex:none;}\n";
|
|
252
252
|
//#endregion
|
|
253
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
253
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/section-head-css.generated.js
|
|
254
254
|
const SECTION_HEAD_CSS = "/* 分区标题行:标签(可选,画出来的短竖线)/ icon + 标题 + 右侧控件。 */\n.dshpc-section-head{display:flex;align-items:center;gap:var(--dshpc-space-2);\n margin-bottom:var(--dshpc-space-3);}\n.dshpc-section-head--flush{margin-bottom:0;}\n\n.dshpc-section-head__bar{flex:none;width:4px;height:1em;border-radius:999px;\n font-size:var(--dshpc-font-lg);background:var(--dshpc-fg-2);}\n\n.dshpc-section-head__icon{display:inline-flex;align-items:center;flex:none;\n line-height:var(--dshpc-line-lg);color:var(--dshpc-fg-3);}\n\n.dshpc-section-head__title{font-size:var(--dshpc-font-lg);line-height:var(--dshpc-line-lg);\n font-weight:600;color:var(--dshpc-fg);flex:none;}\n\n.dshpc-section-head__right{flex:1;display:flex;align-items:center;\n justify-content:flex-end;gap:var(--dshpc-space-2);min-width:0;}\n";
|
|
255
255
|
//#endregion
|
|
256
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
256
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/feedback/Loader.js
|
|
257
257
|
/**
|
|
258
258
|
* Loader —— 统一的加载动画图标(UI 基础层 · 反馈族)。
|
|
259
259
|
*
|
|
@@ -336,7 +336,131 @@ window.__ModuleLoader__.load({
|
|
|
336
336
|
}, variant === "ring" ? ringNode() : blockNodes());
|
|
337
337
|
}
|
|
338
338
|
//#endregion
|
|
339
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
339
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/overlay-css.generated.js
|
|
340
|
+
const OVERLAY_CSS = "/* 浮层公共骨架:遮罩 + 头部。Modal(居中)/ SideSheet(侧边)/ 选文件弹窗(锚定)共用这一份,\n 各家各自 registerStyle 同一份(幂等),谁也不许再抄一份遮罩。\n 关闭钮的皮肤在 panel.css(.dshpc-panel__close,旧类名作别名),不在这里再写一份。 */\n\n/* 遮罩 = 宿主遮罩变量 --dsw-alias-bg-mask-1(与官方 Modal / 兄弟项目 --tdt-mask 同一条真值,用户 2026-10-20)。 */\n/* 右边界让位页面级分栏(PanelDock 发布的 --dshpc-page-inset-right,用户 2026-10-22):\n 分栏不被压暗、照常可点;浮层在这块**剩下**的区域里排版,就像整页被推出去一样。 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* 锁定态:禁用手势挂在遮罩上(面板外那一圈也要一致)。 */\n.dshpc-overlay[data-dshpc-locked]{cursor:not-allowed}\n/* 锁定时的透明点击层:吃指针、不改任何外观(变灰由各控件自己的 :disabled 负责)。\n 全透明是刻意的 —— 盖一层灰会让人以为界面坏了。 */\n.dshpc-lock-catcher{position:absolute;inset:0;z-index:1;cursor:not-allowed}\n/* 锁定态:消费方自绘的原生表单元素也「看起来禁用」。\n 整条选择器包在 :where() 里 = 特异性 0 —— 消费方任意一条自己的规则都能盖回来,我们只当默认值。\n 只写 opacity / cursor 两个属性;不想被灰就在自己元素上写 --dshpc-lock-dim: 1。\n 解锁 = 规则不再匹配,不存在「还原」,也就不会冲掉别人写的样式。 */\n:where(.dshpc-locked button:not(:disabled),.dshpc-locked input:not(:disabled),.dshpc-locked select:not(:disabled),.dshpc-locked textarea:not(:disabled)){\n opacity:var(--dshpc-lock-dim);cursor:not-allowed;\n}\n/* 居中档(Modal):z 走 modal 档。 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* 侧边档(SideSheet):面板 absolute 贴边,不需要 flex 居中;z 走 drawer 档(低于 modal)。 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n/* 锚定档(选文件弹窗):遮罩照旧压暗 + 点外部关闭,面板自己 fixed 贴锚点,这里不做布局。 */\n.dshpc-overlay--plain{z-index:var(--dshpc-z-panel)}\n\n/* 头部四槽:左图标 / 标题组 / 弹性间隔 / 右侧动作区 + 关闭钮。\n 上下内距必须相等(18/12 会让标题离面板顶远、离分隔线近,用户 2026-11-02)。 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* 标题组:第一行 = 标题 + 右侧小块(徽标紧跟标题),第二行 = 副标题。 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* 标题下副标题行(兄弟项目 .dsh-tdt-sv-sid:等宽字体、caption 色、可换行)。 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n";
|
|
341
|
+
//#endregion
|
|
342
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/panel-css.generated.js
|
|
343
|
+
const PANEL_CSS = "/* 浮层面板皮肤(2026-11-03 用户定:皮肤统一,只改样式不动交互)。\n *\n * 这份文件是**所有「浮起来的框」的皮肤真源**。定位(fixed / absolute、贴谁、怎么翻转、多大的\n * 层序)留在各自控件里,这里只管表面四件:底色 / 描边宽 / 圆角 / 阴影。\n * ⚠️ 组件 CSS 里不许再写这四个字面值 —— 想改外观就改这里,别在消费方另起一套。\n *\n * 三档(差异只在这三段定义,别处分叉):\n * --modal 居中模态(Modal / ConfirmModal / AlertModal 家族)\n * --popover 贴锚点的浮层面板(pickWorkspaceFile 的选文件弹窗)\n * --menu 下拉菜单(文件浏览器 ▾ 选层、Picker 下拉)\n *\n * 不并入三档的:PanelDock 与 SideSheet 是**贴边家族**(side-panel.css 的\n * .dshpc-side-surface,surface-base、无外描边)—— 2026-11-02 拍板「两者皮肤一模一样」,\n * 一个是布局成员、一个是贴边抽屉,都不是浮层。\n */\n.dshpc-panel{\n background:var(--dshpc-panel-bg);color:var(--dshpc-fg);\n border:var(--dshpc-panel-bw) solid var(--dshpc-border);\n border-radius:var(--dshpc-panel-radius);box-shadow:var(--dshpc-panel-shadow);\n}\n.dshpc-panel--modal{\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:3px;\n --dshpc-panel-radius:var(--dshpc-radius-xl);\n --dshpc-panel-shadow:var(--dshpc-shadow-2);\n overflow:hidden;\n}\n.dshpc-panel--popover{\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:1px;\n --dshpc-panel-radius:var(--dshpc-radius-lg);\n --dshpc-panel-shadow:var(--dshpc-shadow-2);\n overflow:hidden;\n}\n.dshpc-panel--menu{\n /* 菜单底与模态同一层(用户 2026-11-03:别用页面底色,暗色下看着全黑)。 */\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:1px;\n --dshpc-panel-radius:var(--dshpc-radius-sm);\n --dshpc-panel-shadow:var(--dshpc-shadow-1);\n}\n\n/* 浮层唯一的关闭钮(20×20 方角图标位)。\n 旧类名 .dshpc-overlay-head__close 保留为别名:消费方写在旧类名上的覆盖仍生效。 */\n.dshpc-panel__close,.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-panel__close:hover,.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-panel__close:focus-visible,.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
|
|
344
|
+
//#endregion
|
|
345
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/panel.js
|
|
346
|
+
/**
|
|
347
|
+
* 浮层面板公共件(2026-11-03):`PanelSurface` = 皮肤载体,`PanelClose` = 唯一那枚关闭钮。
|
|
348
|
+
*
|
|
349
|
+
* 分工(用户 2026-11-03 定,目的就是「样式统一但各家用各家自己的逻辑」):
|
|
350
|
+
* - **定位**留在各自控件:Modal 居中、选文件弹窗贴锚点并翻转、菜单挂在触发器下方;
|
|
351
|
+
* - **表面**全部来自 `panel.css` 的三档(modal / popover / menu),组件里不许再写
|
|
352
|
+
* 底色 / 描边 / 圆角 / 阴影。
|
|
353
|
+
*
|
|
354
|
+
* 为什么不做成「一个万能 Panel 组件」:那会把定位也吞进来,等于要求所有浮层同一套交互。
|
|
355
|
+
* 这里只统一皮肤,不统一行为。
|
|
356
|
+
*/
|
|
357
|
+
/** 皮肤载体:`dshpc-panel` + 档位类,别的地方不要手拼这两个类。 */
|
|
358
|
+
function PanelSurface(props) {
|
|
359
|
+
ensureComponentStyles("panel", PANEL_CSS);
|
|
360
|
+
const className = `dshpc-panel dshpc-panel--${props.tier}${props.className === void 0 || props.className === "" ? "" : ` ${props.className}`}`;
|
|
361
|
+
return (0, react$1.createElement)("div", {
|
|
362
|
+
...props.attrs,
|
|
363
|
+
className,
|
|
364
|
+
style: props.style,
|
|
365
|
+
role: props.role,
|
|
366
|
+
onClick: props.stopPropagation === true ? (event) => event.stopPropagation() : void 0
|
|
367
|
+
}, props.children ?? null);
|
|
368
|
+
}
|
|
369
|
+
/** 浮层唯一那枚关闭钮(20×20 方角);位置由各自的头部决定,这个件不管定位。 */
|
|
370
|
+
function PanelClose(props) {
|
|
371
|
+
ensureComponentStyles("panel", PANEL_CSS);
|
|
372
|
+
return (0, react$1.createElement)("button", {
|
|
373
|
+
type: "button",
|
|
374
|
+
className: `dshpc-panel__close${props.className === void 0 ? "" : ` ${props.className}`}`,
|
|
375
|
+
"aria-label": props.label,
|
|
376
|
+
onClick: () => props.onClick()
|
|
377
|
+
}, props.icon ?? "✕");
|
|
378
|
+
}
|
|
379
|
+
//#endregion
|
|
380
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/overlay.js
|
|
381
|
+
/**
|
|
382
|
+
* 浮层公共件 —— Modal 与 SideSheet 共用,**别各写一份**。
|
|
383
|
+
*
|
|
384
|
+
* 抽出来的判据:这两件在两种浮层里完全同构(遮罩让位分栏、头部四槽、Esc 判定),
|
|
385
|
+
* 差异只在「面板怎么排」(居中 vs 贴边),那部分留在各自的控件里。
|
|
386
|
+
*/
|
|
387
|
+
/**
|
|
388
|
+
* 锁定广播:Modal / SideSheet `locked` 时把 true 传下去。
|
|
389
|
+
* 为什么要有它:面板挂 `inert` 管不到 **portal 到 body** 的那几个浮层(Picker / 日期选择的菜单
|
|
390
|
+
* 不在面板 DOM 里),锁定时它们还浮在屏幕上能点;那几个组件自己订阅这里、锁上就收起。
|
|
391
|
+
*/
|
|
392
|
+
const LockedContext = (0, react$1.createContext)(false);
|
|
393
|
+
/** 外层浮层是否锁死(不在浮层里 = false)。 */
|
|
394
|
+
function useOverlayLocked() {
|
|
395
|
+
return (0, react$1.useContext)(LockedContext);
|
|
396
|
+
}
|
|
397
|
+
const OverlayLockedProvider = LockedContext.Provider;
|
|
398
|
+
/**
|
|
399
|
+
* 锁定期间的两道保险(消费方自绘的控件不是我们的,管不到它们的 `disabled`):
|
|
400
|
+
* ① Tab 整个吃掉 —— 否则能 Tab 进他们的 input 打字;
|
|
401
|
+
* ② 把面板里没被禁用的活动元素 `blur` 掉 —— 否则锁定前已经停在里面的光标还能继续打字。
|
|
402
|
+
* 只认 `.dshpc-locked` 子树里的元素,不碰面板外面的焦点。
|
|
403
|
+
*/
|
|
404
|
+
function useLockGuards(enabled) {
|
|
405
|
+
(0, react$1.useEffect)(() => {
|
|
406
|
+
if (!enabled || typeof document === "undefined") return;
|
|
407
|
+
const active = document.activeElement;
|
|
408
|
+
if (active instanceof Element && active.closest(".dshpc-locked") !== null) active.blur();
|
|
409
|
+
const onKey = (event) => {
|
|
410
|
+
if (event.key === "Tab") event.preventDefault();
|
|
411
|
+
};
|
|
412
|
+
document.addEventListener("keydown", onKey, true);
|
|
413
|
+
return () => document.removeEventListener("keydown", onKey, true);
|
|
414
|
+
}, [enabled]);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* 锁定时的**透明点击层**:盖住整块面板、不遮任何像素,只吃掉指针事件
|
|
418
|
+
* (消费方自绘的元素也跟着点不动)。变灰由各控件自己的 `:disabled` 负责,这里不管外观。
|
|
419
|
+
* 不做焦点接管:核心控件此刻已是真 disabled,Tab 自己就跳过它们。
|
|
420
|
+
*/
|
|
421
|
+
function OverlayLockCatcher() {
|
|
422
|
+
return (0, react$1.createElement)("div", {
|
|
423
|
+
className: "dshpc-lock-catcher",
|
|
424
|
+
onClick: (event) => event.stopPropagation()
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Esc 关闭。不传 `onClose` 或 `enabled=false` 时完全不挂监听
|
|
429
|
+
* (无回调还挂监听,等于让 Esc 被白白吃掉)。
|
|
430
|
+
*/
|
|
431
|
+
function useEscapeClose(enabled, onClose) {
|
|
432
|
+
(0, react$1.useEffect)(() => {
|
|
433
|
+
if (!enabled || onClose === void 0) return;
|
|
434
|
+
const onKey = (event) => {
|
|
435
|
+
if (event.key === "Escape") onClose();
|
|
436
|
+
};
|
|
437
|
+
document.addEventListener("keydown", onKey);
|
|
438
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
439
|
+
}, [enabled, onClose]);
|
|
440
|
+
}
|
|
441
|
+
/** 遮罩 + 承载盒。右边界让位分栏的规则只有这一份。 */
|
|
442
|
+
function OverlayMask(props) {
|
|
443
|
+
ensureComponentStyles("overlay", OVERLAY_CSS);
|
|
444
|
+
return (0, react$1.createElement)("div", {
|
|
445
|
+
...props.attrs,
|
|
446
|
+
className: `dshpc-overlay dshpc-overlay--${props.kind}`,
|
|
447
|
+
onClick: () => {
|
|
448
|
+
if (props.closeOnMask) props.onClose?.();
|
|
449
|
+
}
|
|
450
|
+
}, props.children ?? null);
|
|
451
|
+
}
|
|
452
|
+
/** 头部四槽:icon + 标题组 + 右侧动作 + 关闭钮。 */
|
|
453
|
+
function OverlayHead(props) {
|
|
454
|
+
ensureComponentStyles("overlay", OVERLAY_CSS);
|
|
455
|
+
ensureComponentStyles("panel", PANEL_CSS);
|
|
456
|
+
return (0, react$1.createElement)("div", { className: "dshpc-overlay-head" }, (0, react$1.createElement)("div", { className: "dshpc-overlay-head__heading" }, props.icon === void 0 ? null : (0, react$1.createElement)("span", { className: "dshpc-overlay-head__lead" }, props.icon), (0, react$1.createElement)("div", { className: "dshpc-overlay-head__titlegroup" }, (0, react$1.createElement)("div", { className: "dshpc-overlay-head__titlerow" }, (0, react$1.createElement)("div", { className: "dshpc-overlay-head__title" }, props.title ?? ""), props.extra === void 0 ? null : (0, react$1.createElement)("div", { className: "dshpc-overlay-head__extra" }, props.extra)), props.subtitle === void 0 ? null : (0, react$1.createElement)("div", { className: "dshpc-overlay-head__sid" }, props.subtitle))), (0, react$1.createElement)("div", { className: "dshpc-overlay-head__spacer" }), props.actions === void 0 ? null : (0, react$1.createElement)("div", { className: "dshpc-overlay-head__actions" }, props.actions), props.onClose === void 0 ? null : (0, react$1.createElement)(PanelClose, {
|
|
457
|
+
label: props.closeLabel,
|
|
458
|
+
onClick: props.onClose,
|
|
459
|
+
className: "dshpc-overlay-head__close"
|
|
460
|
+
}));
|
|
461
|
+
}
|
|
462
|
+
//#endregion
|
|
463
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/thenable.js
|
|
340
464
|
/** 返回值是不是 thenable。Button 的自动 loading 与命令式弹窗的收尾共用这一份判定。 */
|
|
341
465
|
function isThenable(value) {
|
|
342
466
|
if (value === null || value === void 0) return false;
|
|
@@ -351,7 +475,7 @@ window.__ModuleLoader__.load({
|
|
|
351
475
|
return value !== false;
|
|
352
476
|
}
|
|
353
477
|
//#endregion
|
|
354
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
478
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/actions/Button.js
|
|
355
479
|
/**
|
|
356
480
|
* 按钮 / 图标钮 —— **全站唯一实现**(L2 组件皮肤,P2)
|
|
357
481
|
*
|
|
@@ -467,6 +591,7 @@ window.__ModuleLoader__.load({
|
|
|
467
591
|
}
|
|
468
592
|
});
|
|
469
593
|
const loading = loadingProp || asyncClick.busy;
|
|
594
|
+
const locked = useOverlayLocked();
|
|
470
595
|
useIsoLayoutEffect(() => {
|
|
471
596
|
const el = btnRef.current;
|
|
472
597
|
if (el === null) return;
|
|
@@ -500,7 +625,7 @@ window.__ModuleLoader__.load({
|
|
|
500
625
|
...rest,
|
|
501
626
|
ref: btnRef,
|
|
502
627
|
type: rest.type ?? "button",
|
|
503
|
-
disabled: rest.disabled === true || loading,
|
|
628
|
+
disabled: rest.disabled === true || loading || locked,
|
|
504
629
|
"aria-busy": loading || void 0,
|
|
505
630
|
...autoLabel !== void 0 && rest["aria-label"] === void 0 ? { "aria-label": autoLabel } : {},
|
|
506
631
|
onClick: asyncClick.click,
|
|
@@ -527,6 +652,7 @@ window.__ModuleLoader__.load({
|
|
|
527
652
|
const { variant = "plain", size = "lg", icon, label, color, background, loading: loadingProp = false, className, style, onClick, onBusyChange, ...rest } = props;
|
|
528
653
|
const asyncClick = useAsyncClick(onClick, onBusyChange);
|
|
529
654
|
const loading = loadingProp || asyncClick.busy;
|
|
655
|
+
const locked = useOverlayLocked();
|
|
530
656
|
const accent = {};
|
|
531
657
|
if (color !== void 0 && color !== "") {
|
|
532
658
|
accent["--icb-fg"] = color;
|
|
@@ -543,7 +669,7 @@ window.__ModuleLoader__.load({
|
|
|
543
669
|
title: rest.title ?? label,
|
|
544
670
|
"aria-label": rest["aria-label"] ?? label,
|
|
545
671
|
"aria-busy": loading || void 0,
|
|
546
|
-
disabled: rest.disabled === true || loading,
|
|
672
|
+
disabled: rest.disabled === true || loading || locked,
|
|
547
673
|
onClick: asyncClick.click,
|
|
548
674
|
className: `dshpc-iconbtn dshpc-iconbtn--${variant} dshpc-iconbtn--${size}${className !== void 0 && className !== "" ? ` ${className}` : ""}`,
|
|
549
675
|
style: {
|
|
@@ -554,7 +680,7 @@ window.__ModuleLoader__.load({
|
|
|
554
680
|
return (0, react$1.createElement)("button", attrs, loading ? (0, react$1.createElement)(Loader$2, { size: "xs" }) : icon);
|
|
555
681
|
}
|
|
556
682
|
//#endregion
|
|
557
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
683
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/utils/i18n.js
|
|
558
684
|
/**
|
|
559
685
|
* utils 自带的最小多语言。
|
|
560
686
|
*
|
|
@@ -1606,97 +1732,13 @@ window.__ModuleLoader__.load({
|
|
|
1606
1732
|
});
|
|
1607
1733
|
}
|
|
1608
1734
|
//#endregion
|
|
1609
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
1610
|
-
const FEEDBACK_CSS = "/* 遮罩与头部在 overlay.css,表面(底色/描边/圆角/阴影)在 panel.css 的 --modal 档,\n 这里只剩**家族布局与尺寸**。三者各管一段,别再把皮肤抄回来。 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n}\n/* body = 唯一滚动容器:内距与滚动都归它(滚动条贴面板右缘,不被内距挤进来);\n 内容按流排,不设 height:100%、不自己开滚动条。\n 透明右边框 = 让滚动条与面板右缘隔 1px(口径见 style.md §滚动条让位)。 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 18px;border-right:1px solid transparent}\n/* 底栏与头部同一口径(2026-11-02 用户):上下内距相等、内容垂直居中、默认带一条分隔线。\n 线可由消费方关掉(Modal 的 footerDivider=false)—— 确认框家族本来就没有线(与头部一致)。 */\n.dshpc-modal .dshpc-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:18px;border-top:1px solid var(--dshpc-border)}\n.dshpc-modal .dshpc-modal__foot--bare{border-top:none}\n/* 底栏左侧的过程提示:吃掉按钮之外的剩余宽,超长交给 FlipText 省略 / hover 跑马灯。 */\n.dshpc-modal .dshpc-modal__notice{flex:1 1 auto;min-width:0;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);color:var(--dshpc-fg-3)}\n/* 自绘 toast 的样式在 2026-11-03 删除:Toast 早已改走宿主 toast()(Toast.ts 的 showNative),\n .dshpc-toast* 这几个类没有任何消费者,留着只是死样式(还带着裸 z-index 与裸阴影)。 */\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* 原生弹窗演示:经宿主 Modal 的 contentClassName 注入,证明宿主内容区尺寸可经类名自定义。 */\n.dshpc-native-demo-content{max-width:520px}\n/* 头部信号图标(AlertModal 按 severity 注入):自含配色,色值在 tokens.css 的 --dshpc-sev-*。 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:var(--dshpc-on-signal);flex:none}\n.dshpc-alert-sev--info{background:var(--dshpc-sev-info)}\n.dshpc-alert-sev--success{background:var(--dshpc-sev-success)}\n.dshpc-alert-sev--warning{background:var(--dshpc-sev-warning)}\n.dshpc-alert-sev--error{background:var(--dshpc-sev-error)}\n/* 小确认框家族(sm):严格抄兄弟项目 renderConfirm 的 dialogStyle(task-list.tsx:456)——\n 360px 宽 / 18px 内距 / 头部无分隔线 / 说明文字 fg-2 / 底部按钮右对齐。 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0;border-top:none}\n";
|
|
1611
|
-
//#endregion
|
|
1612
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.30.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_e4ce166109a1167917471762bc2676ae/node_modules/dsh-plugin-core/dist/ui/overlay-css.generated.js
|
|
1613
|
-
const OVERLAY_CSS = "/* 浮层公共骨架:遮罩 + 头部。Modal(居中)/ SideSheet(侧边)/ 选文件弹窗(锚定)共用这一份,\n 各家各自 registerStyle 同一份(幂等),谁也不许再抄一份遮罩。\n 关闭钮的皮肤在 panel.css(.dshpc-panel__close,旧类名作别名),不在这里再写一份。 */\n\n/* 遮罩 = 宿主遮罩变量 --dsw-alias-bg-mask-1(与官方 Modal / 兄弟项目 --tdt-mask 同一条真值,用户 2026-10-20)。 */\n/* 右边界让位页面级分栏(PanelDock 发布的 --dshpc-page-inset-right,用户 2026-10-22):\n 分栏不被压暗、照常可点;浮层在这块**剩下**的区域里排版,就像整页被推出去一样。 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* 居中档(Modal):z 走 modal 档。 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* 侧边档(SideSheet):面板 absolute 贴边,不需要 flex 居中;z 走 drawer 档(低于 modal)。 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n/* 锚定档(选文件弹窗):遮罩照旧压暗 + 点外部关闭,面板自己 fixed 贴锚点,这里不做布局。 */\n.dshpc-overlay--plain{z-index:var(--dshpc-z-panel)}\n\n/* 头部四槽:左图标 / 标题组 / 弹性间隔 / 右侧动作区 + 关闭钮。\n 上下内距必须相等(18/12 会让标题离面板顶远、离分隔线近,用户 2026-11-02)。 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* 标题组:第一行 = 标题 + 右侧小块(徽标紧跟标题),第二行 = 副标题。 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* 标题下副标题行(兄弟项目 .dsh-tdt-sv-sid:等宽字体、caption 色、可换行)。 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n";
|
|
1614
|
-
//#endregion
|
|
1615
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.30.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_e4ce166109a1167917471762bc2676ae/node_modules/dsh-plugin-core/dist/ui/panel-css.generated.js
|
|
1616
|
-
const PANEL_CSS = "/* 浮层面板皮肤(2026-11-03 用户定:皮肤统一,只改样式不动交互)。\n *\n * 这份文件是**所有「浮起来的框」的皮肤真源**。定位(fixed / absolute、贴谁、怎么翻转、多大的\n * 层序)留在各自控件里,这里只管表面四件:底色 / 描边宽 / 圆角 / 阴影。\n * ⚠️ 组件 CSS 里不许再写这四个字面值 —— 想改外观就改这里,别在消费方另起一套。\n *\n * 三档(差异只在这三段定义,别处分叉):\n * --modal 居中模态(Modal / ConfirmModal / AlertModal 家族)\n * --popover 贴锚点的浮层面板(pickWorkspaceFile 的选文件弹窗)\n * --menu 下拉菜单(文件浏览器 ▾ 选层、Picker 下拉)\n *\n * 不并入三档的:PanelDock 与 SideSheet 是**贴边家族**(side-panel.css 的\n * .dshpc-side-surface,surface-base、无外描边)—— 2026-11-02 拍板「两者皮肤一模一样」,\n * 一个是布局成员、一个是贴边抽屉,都不是浮层。\n */\n.dshpc-panel{\n background:var(--dshpc-panel-bg);color:var(--dshpc-fg);\n border:var(--dshpc-panel-bw) solid var(--dshpc-border);\n border-radius:var(--dshpc-panel-radius);box-shadow:var(--dshpc-panel-shadow);\n}\n.dshpc-panel--modal{\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:3px;\n --dshpc-panel-radius:var(--dshpc-radius-xl);\n --dshpc-panel-shadow:var(--dshpc-shadow-2);\n overflow:hidden;\n}\n.dshpc-panel--popover{\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:1px;\n --dshpc-panel-radius:var(--dshpc-radius-lg);\n --dshpc-panel-shadow:var(--dshpc-shadow-2);\n overflow:hidden;\n}\n.dshpc-panel--menu{\n /* 菜单底与模态同一层(用户 2026-11-03:别用页面底色,暗色下看着全黑)。 */\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:1px;\n --dshpc-panel-radius:var(--dshpc-radius-sm);\n --dshpc-panel-shadow:var(--dshpc-shadow-1);\n}\n\n/* 浮层唯一的关闭钮(20×20 方角图标位)。\n 旧类名 .dshpc-overlay-head__close 保留为别名:消费方写在旧类名上的覆盖仍生效。 */\n.dshpc-panel__close,.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-panel__close:hover,.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-panel__close:focus-visible,.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
|
|
1617
|
-
//#endregion
|
|
1618
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.30.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_e4ce166109a1167917471762bc2676ae/node_modules/dsh-plugin-core/dist/ui/panel.js
|
|
1619
|
-
/**
|
|
1620
|
-
* 浮层面板公共件(2026-11-03):`PanelSurface` = 皮肤载体,`PanelClose` = 唯一那枚关闭钮。
|
|
1621
|
-
*
|
|
1622
|
-
* 分工(用户 2026-11-03 定,目的就是「样式统一但各家用各家自己的逻辑」):
|
|
1623
|
-
* - **定位**留在各自控件:Modal 居中、选文件弹窗贴锚点并翻转、菜单挂在触发器下方;
|
|
1624
|
-
* - **表面**全部来自 `panel.css` 的三档(modal / popover / menu),组件里不许再写
|
|
1625
|
-
* 底色 / 描边 / 圆角 / 阴影。
|
|
1626
|
-
*
|
|
1627
|
-
* 为什么不做成「一个万能 Panel 组件」:那会把定位也吞进来,等于要求所有浮层同一套交互。
|
|
1628
|
-
* 这里只统一皮肤,不统一行为。
|
|
1629
|
-
*/
|
|
1630
|
-
/** 皮肤载体:`dshpc-panel` + 档位类,别的地方不要手拼这两个类。 */
|
|
1631
|
-
function PanelSurface(props) {
|
|
1632
|
-
ensureComponentStyles("panel", PANEL_CSS);
|
|
1633
|
-
const className = `dshpc-panel dshpc-panel--${props.tier}${props.className === void 0 || props.className === "" ? "" : ` ${props.className}`}`;
|
|
1634
|
-
return (0, react$1.createElement)("div", {
|
|
1635
|
-
...props.attrs,
|
|
1636
|
-
className,
|
|
1637
|
-
style: props.style,
|
|
1638
|
-
role: props.role,
|
|
1639
|
-
onClick: props.stopPropagation === true ? (event) => event.stopPropagation() : void 0
|
|
1640
|
-
}, props.children ?? null);
|
|
1641
|
-
}
|
|
1642
|
-
/** 浮层唯一那枚关闭钮(20×20 方角);位置由各自的头部决定,这个件不管定位。 */
|
|
1643
|
-
function PanelClose(props) {
|
|
1644
|
-
ensureComponentStyles("panel", PANEL_CSS);
|
|
1645
|
-
return (0, react$1.createElement)("button", {
|
|
1646
|
-
type: "button",
|
|
1647
|
-
className: `dshpc-panel__close${props.className === void 0 ? "" : ` ${props.className}`}`,
|
|
1648
|
-
"aria-label": props.label,
|
|
1649
|
-
onClick: () => props.onClick()
|
|
1650
|
-
}, props.icon ?? "✕");
|
|
1651
|
-
}
|
|
1652
|
-
//#endregion
|
|
1653
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.30.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_e4ce166109a1167917471762bc2676ae/node_modules/dsh-plugin-core/dist/ui/overlay.js
|
|
1654
|
-
/**
|
|
1655
|
-
* 浮层公共件 —— Modal 与 SideSheet 共用,**别各写一份**。
|
|
1656
|
-
*
|
|
1657
|
-
* 抽出来的判据:这两件在两种浮层里完全同构(遮罩让位分栏、头部四槽、Esc 判定),
|
|
1658
|
-
* 差异只在「面板怎么排」(居中 vs 贴边),那部分留在各自的控件里。
|
|
1659
|
-
*/
|
|
1660
|
-
/**
|
|
1661
|
-
* Esc 关闭。不传 `onClose` 或 `enabled=false` 时完全不挂监听
|
|
1662
|
-
* (无回调还挂监听,等于让 Esc 被白白吃掉)。
|
|
1663
|
-
*/
|
|
1664
|
-
function useEscapeClose(enabled, onClose) {
|
|
1665
|
-
(0, react$1.useEffect)(() => {
|
|
1666
|
-
if (!enabled || onClose === void 0) return;
|
|
1667
|
-
const onKey = (event) => {
|
|
1668
|
-
if (event.key === "Escape") onClose();
|
|
1669
|
-
};
|
|
1670
|
-
document.addEventListener("keydown", onKey);
|
|
1671
|
-
return () => document.removeEventListener("keydown", onKey);
|
|
1672
|
-
}, [enabled, onClose]);
|
|
1673
|
-
}
|
|
1674
|
-
/** 遮罩 + 承载盒。右边界让位分栏的规则只有这一份。 */
|
|
1675
|
-
function OverlayMask(props) {
|
|
1676
|
-
ensureComponentStyles("overlay", OVERLAY_CSS);
|
|
1677
|
-
return (0, react$1.createElement)("div", {
|
|
1678
|
-
...props.attrs,
|
|
1679
|
-
className: `dshpc-overlay dshpc-overlay--${props.kind}`,
|
|
1680
|
-
onClick: () => {
|
|
1681
|
-
if (props.closeOnMask) props.onClose?.();
|
|
1682
|
-
}
|
|
1683
|
-
}, props.children ?? null);
|
|
1684
|
-
}
|
|
1685
|
-
/** 头部四槽:icon + 标题组 + 右侧动作 + 关闭钮。 */
|
|
1686
|
-
function OverlayHead(props) {
|
|
1687
|
-
ensureComponentStyles("overlay", OVERLAY_CSS);
|
|
1688
|
-
ensureComponentStyles("panel", PANEL_CSS);
|
|
1689
|
-
return (0, react$1.createElement)("div", { className: "dshpc-overlay-head" }, (0, react$1.createElement)("div", { className: "dshpc-overlay-head__heading" }, props.icon === void 0 ? null : (0, react$1.createElement)("span", { className: "dshpc-overlay-head__lead" }, props.icon), (0, react$1.createElement)("div", { className: "dshpc-overlay-head__titlegroup" }, (0, react$1.createElement)("div", { className: "dshpc-overlay-head__titlerow" }, (0, react$1.createElement)("div", { className: "dshpc-overlay-head__title" }, props.title ?? ""), props.extra === void 0 ? null : (0, react$1.createElement)("div", { className: "dshpc-overlay-head__extra" }, props.extra)), props.subtitle === void 0 ? null : (0, react$1.createElement)("div", { className: "dshpc-overlay-head__sid" }, props.subtitle))), (0, react$1.createElement)("div", { className: "dshpc-overlay-head__spacer" }), props.actions === void 0 ? null : (0, react$1.createElement)("div", { className: "dshpc-overlay-head__actions" }, props.actions), props.onClose === void 0 ? null : (0, react$1.createElement)(PanelClose, {
|
|
1690
|
-
label: props.closeLabel,
|
|
1691
|
-
onClick: props.onClose,
|
|
1692
|
-
className: "dshpc-overlay-head__close"
|
|
1693
|
-
}));
|
|
1694
|
-
}
|
|
1735
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/feedback/feedback-css.generated.js
|
|
1736
|
+
const FEEDBACK_CSS = "/* 遮罩与头部在 overlay.css,表面(底色/描边/圆角/阴影)在 panel.css 的 --modal 档,\n 这里只剩**家族布局与尺寸**。三者各管一段,别再把皮肤抄回来。 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n}\n/* body = 唯一滚动容器:内距与滚动都归它(滚动条贴面板右缘,不被内距挤进来);\n 内容按流排,不设 height:100%、不自己开滚动条。\n 透明右边框 = 让滚动条与面板右缘隔 1px(口径见 style.md §滚动条让位)。 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 18px;border-right:1px solid transparent}\n/* 底栏与头部同一口径(2026-11-02 用户):上下内距相等、内容垂直居中、默认带一条分隔线。\n 线可由消费方关掉(Modal 的 footerDivider=false)—— 确认框家族本来就没有线(与头部一致)。 */\n.dshpc-modal .dshpc-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:18px;border-top:1px solid var(--dshpc-border)}\n.dshpc-modal .dshpc-modal__foot--bare{border-top:none}\n/* 底栏左侧的过程提示:吃掉按钮之外的剩余宽,超长交给 FlipText 省略 / hover 跑马灯。 */\n.dshpc-modal .dshpc-modal__notice{flex:1 1 auto;min-width:0;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);color:var(--dshpc-fg-3)}\n/* 自绘 toast 的样式在 2026-11-03 删除:Toast 早已改走宿主 toast()(Toast.ts 的 showNative),\n .dshpc-toast* 这几个类没有任何消费者,留着只是死样式(还带着裸 z-index 与裸阴影)。 */\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* 原生弹窗演示:经宿主 Modal 的 contentClassName 注入,证明宿主内容区尺寸可经类名自定义。 */\n.dshpc-native-demo-content{max-width:520px}\n/* 头部信号图标(AlertModal 按 severity 注入):自含配色,色值在 tokens.css 的 --dshpc-sev-*。 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:var(--dshpc-on-signal);flex:none}\n.dshpc-alert-sev--info{background:var(--dshpc-sev-info)}\n.dshpc-alert-sev--success{background:var(--dshpc-sev-success)}\n.dshpc-alert-sev--warning{background:var(--dshpc-sev-warning)}\n.dshpc-alert-sev--error{background:var(--dshpc-sev-error)}\n/* 小确认框家族(sm):严格抄兄弟项目 renderConfirm 的 dialogStyle(task-list.tsx:456)——\n 360px 宽 / 18px 内距 / 头部无分隔线 / 说明文字 fg-2 / 底部按钮右对齐。 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0;border-top:none}\n/* 锁定态(locked):只给透明点击层做定位锚点,**不压任何遮罩** —— 盖灰会让人以为界面坏了;\n 变灰是各控件自己 :disabled 的事(Button / Input / Picker … 本来就有那套样式)。 */\n.dshpc-modal--locked{position:relative}\n";
|
|
1695
1737
|
//#endregion
|
|
1696
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
1738
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/flip-css.generated.js
|
|
1697
1739
|
const FLIP_CSS = "/* 翻牌文本(FlipText):一个单行窗口 + 两层同格叠放,换字时旧的上移出、新的从下进。\n 溢出(三点省略 + hover 跑马灯)不在这里做 —— 交给 MarqueeText,本文件只管裁剪与切换动效。\n 叠放用 grid 同格而不是绝对定位:容器高度天然等于一行,不用测量、也不依赖 lh 单位。 */\n.dshpc-flip{--dshpc-flip-dur:260ms;--dshpc-flip-ease:cubic-bezier(.22,.61,.36,1);display:grid;min-width:0;overflow:hidden}\n.dshpc-flip__item{grid-area:1/1;min-width:0}\n.dshpc-flip__in{animation:dshpc-flip-in var(--dshpc-flip-dur) var(--dshpc-flip-ease) both}\n.dshpc-flip__out{animation:dshpc-flip-out var(--dshpc-flip-dur) var(--dshpc-flip-ease) both}\n@keyframes dshpc-flip-in{from{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}\n@keyframes dshpc-flip-out{from{transform:translateY(0);opacity:1}to{transform:translateY(-100%);opacity:0}}\n/* 前庭敏感 / 低性能设备关掉位移动画:换字仍在,只是不再翻。\n 旧帧没有动画可播,必须自己隐形 —— 两层同格叠放,留着就重影。 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-flip__in,.dshpc-flip__out{animation:none}\n .dshpc-flip__out{opacity:0}\n}\n/* 扫光(sweep):常驻循环,停在原地的提示也看得出在动。开关默认关,弹窗 / 抽屉底栏默认开。\n 光必须只落在字上:盖一层半透明光带的话,notice 是 flex:1 撑开的宽容器,右侧大片空白\n 里会出现一条白光在扫。故把光做成文字自己的 background + background-clip:text 裁到字形;\n 基色取 currentColor ⇒ 调用方换字色也跟着走,不需要知道文字宽度。 */\n.dshpc-flip--sweep .dshpc-mq-in{\n background-image:linear-gradient(105deg,currentColor 0,currentColor 47%,color-mix(in srgb,var(--dshpc-on-signal) 70%,currentColor) 50%,currentColor 53%,currentColor 100%);\n background-size:300% 100%;background-repeat:no-repeat;\n background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;\n animation:dshpc-flip-sweep 1.5s linear infinite;\n}\n/* 1.5s 一轮:前 40% 扫完,其余停在视野外休息 —— 一直扫会晃眼,间歇才像「还在干活」。 */\n@keyframes dshpc-flip-sweep{0%{background-position:100% 0}40%,100%{background-position:0 0}}\n@media (prefers-reduced-motion:reduce){\n .dshpc-flip--sweep .dshpc-mq-in{animation:none;background-image:none;-webkit-text-fill-color:currentColor}\n}\n";
|
|
1698
1740
|
//#endregion
|
|
1699
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
1741
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/FlipText.js
|
|
1700
1742
|
/**
|
|
1701
1743
|
* 翻牌文本 —— 一行文字,换字时旧的上移出、新的从下进(机场翻牌那种)。
|
|
1702
1744
|
*
|
|
@@ -1759,7 +1801,7 @@ window.__ModuleLoader__.load({
|
|
|
1759
1801
|
}, (0, react$1.createElement)(MarqueeText, { text: slot.curr })));
|
|
1760
1802
|
}
|
|
1761
1803
|
//#endregion
|
|
1762
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
1804
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/feedback/Modal.js
|
|
1763
1805
|
/**
|
|
1764
1806
|
* 模态弹窗(自绘 overlay,**不用 react-dom 的 portal**,避免多一个必需依赖)。
|
|
1765
1807
|
*
|
|
@@ -1769,8 +1811,11 @@ window.__ModuleLoader__.load({
|
|
|
1769
1811
|
ensureComponentStyles("feedback", FEEDBACK_CSS);
|
|
1770
1812
|
const tt = props.translate ?? t$2;
|
|
1771
1813
|
const busy = props.busy === true;
|
|
1772
|
-
const
|
|
1773
|
-
|
|
1814
|
+
const locked = props.locked === true;
|
|
1815
|
+
const denyClose = busy || locked;
|
|
1816
|
+
const closeOnMask = !denyClose && props.closeOnMask !== false;
|
|
1817
|
+
useEscapeClose(!denyClose && props.escClose !== false, denyClose ? void 0 : props.onClose);
|
|
1818
|
+
useLockGuards(locked);
|
|
1774
1819
|
const notice = props.notice === "" ? void 0 : props.notice;
|
|
1775
1820
|
const s = {
|
|
1776
1821
|
sm: {
|
|
@@ -1786,15 +1831,16 @@ window.__ModuleLoader__.load({
|
|
|
1786
1831
|
height: "calc(100% - 80px)"
|
|
1787
1832
|
}
|
|
1788
1833
|
}[props.size ?? "md"];
|
|
1789
|
-
const showClose = props.closable !== false && props.onClose !== void 0 && !
|
|
1834
|
+
const showClose = props.closable !== false && props.onClose !== void 0 && !denyClose;
|
|
1790
1835
|
const showHeader = props.hideHeader !== true && (props.icon !== void 0 || props.title !== void 0 || props.subtitle !== void 0 || props.headerExtra !== void 0 || props.headerActions !== void 0 || showClose);
|
|
1791
1836
|
return (0, react$1.createElement)(OverlayMask, {
|
|
1792
1837
|
kind: "center",
|
|
1793
1838
|
closeOnMask,
|
|
1794
|
-
onClose:
|
|
1795
|
-
|
|
1839
|
+
onClose: denyClose ? void 0 : props.onClose,
|
|
1840
|
+
attrs: locked ? { "data-dshpc-locked": "" } : void 0
|
|
1841
|
+
}, (0, react$1.createElement)(OverlayLockedProvider, { value: locked }, (0, react$1.createElement)(PanelSurface, {
|
|
1796
1842
|
tier: "modal",
|
|
1797
|
-
className: `dshpc-modal${props.size ? ` dshpc-modal--${props.size}` : ""}${props.className !== void 0 && props.className !== "" ? ` ${props.className}` : ""}`,
|
|
1843
|
+
className: `dshpc-modal${props.size ? ` dshpc-modal--${props.size}` : ""}${locked ? " dshpc-modal--locked dshpc-locked" : ""}${props.className !== void 0 && props.className !== "" ? ` ${props.className}` : ""}`,
|
|
1798
1844
|
style: {
|
|
1799
1845
|
width: props.width ?? s.width,
|
|
1800
1846
|
maxWidth: props.maxWidth ?? s.maxWidth,
|
|
@@ -1814,10 +1860,10 @@ window.__ModuleLoader__.load({
|
|
|
1814
1860
|
text: notice,
|
|
1815
1861
|
className: "dshpc-modal__notice",
|
|
1816
1862
|
sweep: true
|
|
1817
|
-
}), props.footer)));
|
|
1863
|
+
}), props.footer), locked ? (0, react$1.createElement)(OverlayLockCatcher) : null)));
|
|
1818
1864
|
}
|
|
1819
1865
|
//#endregion
|
|
1820
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
1866
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/feedback/ConfirmModal.js
|
|
1821
1867
|
/**
|
|
1822
1868
|
* 确认框(语义层,基于 Modal):双按钮(取消 outline + 确认语义档)、无 ✕;无标题时整条头部消失。
|
|
1823
1869
|
* 样式封闭:按钮只暴露语义档(tone → variant),不透传任意 className/style。
|
|
@@ -1839,6 +1885,7 @@ window.__ModuleLoader__.load({
|
|
|
1839
1885
|
closable: false,
|
|
1840
1886
|
closeOnMask: props.closeOnMask,
|
|
1841
1887
|
busy,
|
|
1888
|
+
locked: props.locked,
|
|
1842
1889
|
onClose: props.onCancel,
|
|
1843
1890
|
notice: props.notice,
|
|
1844
1891
|
footer: (0, react$1.createElement)("div", { style: {
|
|
@@ -1863,7 +1910,7 @@ window.__ModuleLoader__.load({
|
|
|
1863
1910
|
}, props.message ?? null);
|
|
1864
1911
|
}
|
|
1865
1912
|
//#endregion
|
|
1866
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
1913
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/feedback/modal-host.js
|
|
1867
1914
|
let hostRoot = null;
|
|
1868
1915
|
let hostContainer = null;
|
|
1869
1916
|
let entries = [];
|
|
@@ -1891,7 +1938,7 @@ window.__ModuleLoader__.load({
|
|
|
1891
1938
|
hostContainer = null;
|
|
1892
1939
|
return;
|
|
1893
1940
|
}
|
|
1894
|
-
root.render((0, react$1.createElement)(react$1.Fragment, null, entries.map((e) => e.
|
|
1941
|
+
root.render((0, react$1.createElement)(react$1.Fragment, null, entries.map((e) => (0, react$1.createElement)(react$1.Fragment, { key: e.id }, e.render()))));
|
|
1895
1942
|
}
|
|
1896
1943
|
function dismiss(id) {
|
|
1897
1944
|
entries = entries.filter((e) => e.id !== id);
|
|
@@ -1926,9 +1973,19 @@ window.__ModuleLoader__.load({
|
|
|
1926
1973
|
dismiss(id);
|
|
1927
1974
|
resolve(result);
|
|
1928
1975
|
};
|
|
1976
|
+
const entry = {
|
|
1977
|
+
id,
|
|
1978
|
+
locked: false,
|
|
1979
|
+
render: () => null
|
|
1980
|
+
};
|
|
1981
|
+
const ctl = { setLocked: (next) => {
|
|
1982
|
+
if (closed || entry.locked === next) return;
|
|
1983
|
+
entry.locked = next;
|
|
1984
|
+
flush();
|
|
1985
|
+
} };
|
|
1929
1986
|
const run = (which) => {
|
|
1930
1987
|
if (closed) return void 0;
|
|
1931
|
-
const out = (which === "confirm" ? onConfirm : onCancel)?.();
|
|
1988
|
+
const out = (which === "confirm" ? onConfirm : onCancel)?.(ctl);
|
|
1932
1989
|
const settle = (value) => {
|
|
1933
1990
|
if (isSuccess(value)) close(which === "confirm");
|
|
1934
1991
|
};
|
|
@@ -1939,19 +1996,18 @@ window.__ModuleLoader__.load({
|
|
|
1939
1996
|
out.then(settle, () => {});
|
|
1940
1997
|
return out;
|
|
1941
1998
|
};
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
onCancel: () => run("cancel")
|
|
1948
|
-
})
|
|
1999
|
+
entry.render = () => (0, react$1.createElement)(ConfirmModal, {
|
|
2000
|
+
...core,
|
|
2001
|
+
locked: entry.locked,
|
|
2002
|
+
onConfirm: () => run("confirm"),
|
|
2003
|
+
onCancel: () => run("cancel")
|
|
1949
2004
|
});
|
|
2005
|
+
entries.push(entry);
|
|
1950
2006
|
flush();
|
|
1951
2007
|
});
|
|
1952
2008
|
}
|
|
1953
2009
|
//#endregion
|
|
1954
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
2010
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/official.js
|
|
1955
2011
|
/**
|
|
1956
2012
|
* L1 adapter —— 全仓**唯一** import 官方 primitives 平台模块的文件。
|
|
1957
2013
|
*
|
|
@@ -2062,7 +2118,7 @@ window.__ModuleLoader__.load({
|
|
|
2062
2118
|
alert: hostAlert
|
|
2063
2119
|
});
|
|
2064
2120
|
//#endregion
|
|
2065
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
2121
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/host-data.js
|
|
2066
2122
|
/** 模型目录的 observable store(useSyncExternalStore 直接消费)。 */
|
|
2067
2123
|
var ModelCatalogStore = class {
|
|
2068
2124
|
constructor() {
|
|
@@ -2164,7 +2220,7 @@ window.__ModuleLoader__.load({
|
|
|
2164
2220
|
});
|
|
2165
2221
|
}
|
|
2166
2222
|
//#endregion
|
|
2167
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
2223
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/locale.js
|
|
2168
2224
|
/** 返回当前语言,并在宿主语言切换(`<html lang>` 变化)时触发重渲。 */
|
|
2169
2225
|
function useLocale() {
|
|
2170
2226
|
const [locale, setLocaleState] = (0, react$1.useState)(getLocale);
|
|
@@ -2183,7 +2239,7 @@ window.__ModuleLoader__.load({
|
|
|
2183
2239
|
return locale;
|
|
2184
2240
|
}
|
|
2185
2241
|
//#endregion
|
|
2186
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
2242
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/utils/path.js
|
|
2187
2243
|
/**
|
|
2188
2244
|
* 纯路径方法 —— 只做字符串切分 / 拼接,不碰宿主、不依赖 React / DOM。
|
|
2189
2245
|
*
|
|
@@ -2222,7 +2278,7 @@ window.__ModuleLoader__.load({
|
|
|
2222
2278
|
return dir === "" ? name : `${dir}/${name}`;
|
|
2223
2279
|
}
|
|
2224
2280
|
//#endregion
|
|
2225
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
2281
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/types.js
|
|
2226
2282
|
/** HTML 静态预览的扩展名(与官方 htmlBodyDefinition 同款)。 */
|
|
2227
2283
|
const HTML_KINDS = ["html", "htm"];
|
|
2228
2284
|
/**
|
|
@@ -2524,10 +2580,10 @@ window.__ModuleLoader__.load({
|
|
|
2524
2580
|
return best;
|
|
2525
2581
|
}
|
|
2526
2582
|
//#endregion
|
|
2527
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
2583
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/explorer-css.generated.js
|
|
2528
2584
|
const EXPLORER_CSS = "/* 工作区文件浏览器(dshpc-fb-*)。\n *\n * 度量真源 = 兄弟项目 dsh-task-dispatch-table 的 src/client/archive-session-css.ts\n * (.dsh-tdt-sv-* 全族)。**逐条照抄,不许自己估**:padding / gap / 圆角 / 字号 / 行高 /\n * 边框色 / 悬停色 / 透明度动画 / 溢出策略,一一对应,改这里之前先去那边对原文。\n * 前缀与变量名换成本仓口径(--tdt-* → --dshpc-*),数值不换。\n * **例外**:容器级内距(__bar / __title / __tree / __body)2026-11-03 起改成四周一致\n * 的 token 档(space-2 / space-3)——用户反馈兄弟那套「左右比上下宽」在这两处窗口里不对称。\n * 行级内距(__row / __row-note / __banner)仍是兄弟数值,未动。\n *\n * 控件:能核心就核心(面包屑 = Button ghost、行尾 = Button outline、展开 / 图标 = IconButton、\n * 分段 = Segmented、文字 = MarqueeText)。核心控件自带的 padding / 高度 / 皮肤在本文件里\n * **按兄弟数值覆盖**(选择器带 .dshpc-fb 前缀提高特异性,确保盖得住控件默认值)。\n */\n/* 背景不在这里画:dock 由 .dshpc-side-surface、选文件弹窗由 .dshpc-panel 提供。\n 自己再刷一层 surface-base 会把面板档位(modal 同色的 surface-1)盖掉 —— 弹窗就显得发黑。 */\n.dshpc-fb{\n position:relative;display:flex;flex-direction:column;height:100%;min-height:0;\n background:transparent;color:var(--dshpc-fg);\n}\n\n/* 第一排:▾ 选层 + 面包屑 + 动作(兄弟 .dsh-tdt-sv-crumbbar)\n ⚠️ 不能 overflow:hidden —— 下拉浮层挂在它下面,裁了就看不见。 */\n.dshpc-fb__bar{\n position:relative;flex:none;display:flex;align-items:center;gap:2px;\n /* 四周内距一致(用户 2026-11-03:原来 4/10,左右比上下宽,看着不对称)——下文 __title / __tree / __body 同口径。 */\n padding:var(--dshpc-space-2);border-bottom:1px solid var(--dshpc-border);white-space:nowrap;\n}\n.dshpc-fb__menu-wrap{position:relative;flex:none;display:inline-flex}\n.dshpc-fb__crumbs{position:relative;flex:1;min-width:0;display:flex;align-items:center;gap:2px;overflow:hidden}\n.dshpc-fb__crumbs-measure{\n position:absolute;top:0;left:0;display:inline-flex;align-items:center;gap:2px;\n visibility:hidden;pointer-events:none;white-space:nowrap;\n}\n\n/* 面包屑:核心 ghost 钮,但皮肤与尺寸取兄弟 .dsh-tdt-sv-crumb(高由内容决定,不锁控制高)。 */\n.dshpc-fb .dshpc-fb__crumb{\n appearance:none;background:0 0;border:none;height:auto;\n padding:2px 4px;border-radius:var(--dshpc-radius-sm);\n font:inherit;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);\n color:var(--dshpc-fg-2);cursor:pointer;\n display:inline-flex;align-items:center;min-width:0;overflow:hidden;text-overflow:ellipsis;\n}\n.dshpc-fb .dshpc-fb__crumb:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-fb .dshpc-fb__crumb:disabled{color:var(--dshpc-fg-2);cursor:default}\n.dshpc-fb .dshpc-fb__crumb--current{cursor:default;color:var(--dshpc-fg);font-weight:600;min-width:0}\n.dshpc-fb .dshpc-fb__crumb--current:hover{background:0 0}\n.dshpc-fb__crumb-mq{flex:1 1 auto;min-width:0}\n.dshpc-fb__crumb-sep{flex:none;color:var(--dshpc-fg-3)}\n\n/* 越界(outside-workspace)第一排:只读完整路径(兄弟 .dsh-tdt-sv-crumbbar-plain-inner)。 */\n.dshpc-fb__bar-plain{\n font-family:var(--dshpc-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);\n font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);color:var(--dshpc-fg-2);\n white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:default;user-select:none;\n}\n.dshpc-fb__actions{flex:none;display:flex;align-items:center;gap:4px}\n/* 选择器头部「选当前文件 / 当前文件夹」钮:与 ✕ 并排,不被面包屑挤扁。\n 「选当前目录」= 核心 Button outline(sm 档):尺寸与皮肤全归核心,这里只留布局。\n ⚠️ 别再往这里写 height / padding 覆盖 —— 域按登记顺序拼接,核心 .dshpc-btn--sm 谁先谁后\n 取决于渲染次序,覆盖会时灵时不灵(2026-11-03 前就是这么写的)。 */\n.dshpc-fb__pick{flex:none}\n\n/* ▾ 选层浮层。\n 层序:遮罩必须高于 picker 面板(--dshpc-z-panel),否则菜单开着点面板不算「点外部」;\n 菜单再压在遮罩之上,所以是 popmenu 一档 +1。表皮来自 panel.css 的 menu 档。 */\n.dshpc-fb__crumbs-backdrop{position:fixed;inset:0;z-index:var(--dshpc-z-popmenu);background:transparent}\n.dshpc-fb__crumbs-menu{\n position:absolute;top:calc(100% + 4px);left:0;z-index:calc(var(--dshpc-z-popmenu) + 1);\n min-width:160px;max-height:240px;overflow:auto;padding:4px;display:flex;flex-direction:column;\n}\n.dshpc-fb__menu-item{\n appearance:none;background:0 0;border:none;text-align:left;font:inherit;\n font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-md);\n padding:4px 8px;border-radius:var(--dshpc-radius-sm);color:var(--dshpc-fg);cursor:pointer;\n max-width:280px;display:flex;align-items:center;gap:2px;\n overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\n}\n.dshpc-fb__menu-item:hover{background:var(--dshpc-hover)}\n.dshpc-fb__menu-empty{\n font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-md);padding:4px 8px;color:var(--dshpc-fg-3);\n}\n.dshpc-fb__menu-icon{flex:none;display:inline-flex}\n.dshpc-fb__menu-chev{flex:none;color:var(--dshpc-fg-3);margin-right:1px}\n.dshpc-fb__menu-chev-slot{flex:none;width:11px;height:11px;margin-right:1px}\n.dshpc-fb__menu-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n\n/* 第二排(仅预览态):文件名 + 工具(兄弟 .dsh-tdt-sv-titlebar / -preview-title-inner)。 */\n.dshpc-fb__title{\n flex:none;display:flex;align-items:center;gap:8px;\n padding:var(--dshpc-space-2);border-bottom:1px solid var(--dshpc-border);\n}\n.dshpc-fb__title-inner{\n font-family:var(--dshpc-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);\n font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);color:var(--dshpc-fg);\n white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:default;\n}\n\n/* 主体(兄弟 .dsh-tdt-sv-preview-body / -hint / -preview-err)\n 下面三个滚动容器都带透明右边框 = 滚动条与右缘隔 1px(口径见 style.md §滚动条让位)。 */\n.dshpc-fb__body{flex:1;min-height:0;overflow-x:hidden;overflow-y:auto;padding:var(--dshpc-space-3);border-right:1px solid transparent}\n.dshpc-fb__note{font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);text-align:center;padding:12px 0}\n.dshpc-fb__err{\n display:flex;flex-direction:column;align-items:flex-start;gap:10px;\n font-size:var(--dshpc-font-sm);line-height:1.6;color:var(--dshpc-fg-2);padding:8px 0;\n}\n\n/* 目录树(兄弟 .dsh-tdt-sv-tree*) */\n.dshpc-fb__tree{flex:1;min-height:0;overflow:auto;padding:var(--dshpc-space-2);border-right:1px solid transparent;border-bottom:1px solid transparent}\n.dshpc-fb__row{\n display:flex;align-items:center;gap:8px;padding:6px 8px;\n border-radius:var(--dshpc-radius-sm);cursor:pointer;user-select:none;\n}\n.dshpc-fb__row:hover{background:var(--dshpc-hover)}\n.dshpc-fb__row:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:-2px}\n.dshpc-fb__row-icon{flex:none;display:inline-flex;color:var(--dshpc-fg-2)}\n.dshpc-fb__row-name{\n flex:1;min-width:0;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);color:var(--dshpc-fg);\n overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\n}\n\n/* 展开开关:核心 IconButton,命中位 20×20 + 展开时转 90°(兄弟 .dsh-tdt-sv-tree-toggle{,-open})。 */\n.dshpc-fb .dshpc-fb__row-toggle{\n appearance:none;background:0 0;border:none;flex:none;\n width:20px;height:20px;padding:0;margin:0;border-radius:var(--dshpc-radius-sm);\n color:var(--dshpc-fg-2);cursor:pointer;\n display:inline-flex;align-items:center;justify-content:center;\n transition:transform var(--dshpc-dur-fast) var(--dshpc-ease),background var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-fb .dshpc-fb__row-toggle--open{transform:rotate(90deg)}\n\n/* 行尾「进入 / 选择」:按钮**皮肤完全交给核心 Button**(2026-11-03:原来这里又写了一遍描边/内距/\n 字号,等于自己手搓了一颗,跟别处的按钮长得不一样)。本仓只保留布局与「悬停才现身」:\n 平时隐身但占位(opacity 而非 display)⇒ 出现时不顶动行内布局。 */\n.dshpc-fb .dshpc-fb__row-act{\n flex:none;margin-left:auto;\n opacity:0;pointer-events:none;\n transition:opacity var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-fb__row:hover .dshpc-fb__row-act,.dshpc-fb .dshpc-fb__row-act:focus-visible{opacity:1;pointer-events:auto}\n\n.dshpc-fb__row-children{\n margin-left:9px;padding-left:7px;border-left:1px solid var(--dshpc-border);\n display:flex;flex-direction:column;\n}\n.dshpc-fb__row-note{flex:none;padding:8px 10px;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-3)}\n.dshpc-fb__row-err{padding:4px 8px 4px 36px;font-size:var(--dshpc-font-sm);color:var(--dshpc-danger)}\n\n/* 预览体内部容器(仅本仓预览组件用;兄弟对应 preview-fill / preview-body-code 一类)。\n 必须 border-box:渲染态 inline 加了 padding:12px 14px,content-box 下 width:100%+padding\n 会溢出父层 28px(父 .dshpc-fb 无 overflow 裁切)→ 恒多一条横滚条;border-box 把 padding\n 算进 100%,从根消除该溢出。 */\n.dshpc-fb__text{flex:1;min-height:0;overflow:auto;width:100%;box-sizing:border-box;border-right:1px solid transparent;border-bottom:1px solid transparent}\n.dshpc-fb__banner{padding:6px 10px;background:var(--dshpc-open-bg);color:var(--dshpc-fg-2);font-size:var(--dshpc-font-sm)}\n.dshpc-fb__more{display:flex;justify-content:center;padding:10px}\n.dshpc-fb__image{max-width:100%;border-radius:var(--dshpc-radius-sm);border:1px solid var(--dshpc-border)}\n/* iframe 的外壳(兄弟 .dsh-tdt-sv-preview-fill):iframe 必须包在这一层里才拿得到高度——\n 裸挂 iframe 时替换元素的自动最小尺寸会让高度算不出来(表现为预览区整片空白、像没反应)。 */\n.dshpc-fb__fill{flex:1;min-height:0;display:flex;overflow:hidden;padding:0}\n.dshpc-fb__frame{flex:1;min-height:0;width:100%;height:100%;border:none;background:var(--dshpc-surface-1)}\n";
|
|
2529
2585
|
//#endregion
|
|
2530
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
2586
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/preview/BytesPreview.js
|
|
2531
2587
|
function BytesPreview(props) {
|
|
2532
2588
|
ensureComponentStyles("explorer", EXPLORER_CSS);
|
|
2533
2589
|
const tt = props.translate ?? t$2;
|
|
@@ -47965,7 +48021,7 @@ window.__ModuleLoader__.load({
|
|
|
47965
48021
|
const stex = mkStex(false);
|
|
47966
48022
|
mkStex(true);
|
|
47967
48023
|
//#endregion
|
|
47968
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48024
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/code-viewer-lang.js
|
|
47969
48025
|
/**
|
|
47970
48026
|
* 源码态语法高亮:扩展名 → CodeMirror 语言映射。
|
|
47971
48027
|
*
|
|
@@ -48118,7 +48174,7 @@ window.__ModuleLoader__.load({
|
|
|
48118
48174
|
}
|
|
48119
48175
|
}
|
|
48120
48176
|
//#endregion
|
|
48121
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48177
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/code-viewer-theme.js
|
|
48122
48178
|
/**
|
|
48123
48179
|
* CodeMirror 6 主题(DSH 共享底座版)。
|
|
48124
48180
|
*
|
|
@@ -48522,10 +48578,10 @@ window.__ModuleLoader__.load({
|
|
|
48522
48578
|
];
|
|
48523
48579
|
}
|
|
48524
48580
|
//#endregion
|
|
48525
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48581
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/code-viewer-css.generated.js
|
|
48526
48582
|
const CODE_VIEWER_CSS = "/* CodeViewer(只读 CodeMirror 查看器)样式。类名固定 dshpc-cv*;颜色吃 --dshpc-* token,\n 深色由 design 的 token 深色段自动生效(不写死颜色值)。 */\n/* flex:1 1 auto + min-width:0:调用方常把它放进 display:flex 的容器里(TextPreview),\n 不写会在主轴按内容宽排 —— 短文本时 __copy(absolute 相对本层)落在文字右端而不是面板右缘。 */\n.dshpc-cv{position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-width:0;height:100%;min-height:0;}\n/* 复制钮复用核心 IconButton(variant=outline / size=md):盒型、描边、圆角(已统一 md)、底色、hover 全由核心提供;\n 这里只管「绝对定位 + 默认隐藏、hover/聚焦才显」(overlay 浮在编辑器右上角)。 */\n.dshpc-cv__copy{position:absolute;top:6px;right:6px;z-index:5;opacity:0;}\n.dshpc-cv:hover .dshpc-cv__copy,.dshpc-cv__copy:focus-visible{opacity:1;}\n.dshpc-cv__copy svg{width:16px;height:16px;}\n.dshpc-cv__editor{flex:1 1 auto;min-height:0;overflow:hidden;}\n.dshpc-cv__editor .cm-editor{height:100%;}\n/* 透明右边框 = 滚动条与右缘隔 1px(口径见 style.md §滚动条让位)。\n 只给右边:给底边会改 scroller 高度,CodeMirror 的测量循环会多算一条横滚条。 */\n.dshpc-cv__editor .cm-scroller{overflow:auto;border-right:1px solid transparent}\n";
|
|
48527
48583
|
//#endregion
|
|
48528
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48584
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/CodeViewer.js
|
|
48529
48585
|
/**
|
|
48530
48586
|
* CodeViewer —— 只读源码查看器(替代官方 Shiki CodeBlock),DSH 共享底座版。
|
|
48531
48587
|
*
|
|
@@ -48629,7 +48685,7 @@ window.__ModuleLoader__.load({
|
|
|
48629
48685
|
}));
|
|
48630
48686
|
}
|
|
48631
48687
|
//#endregion
|
|
48632
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48688
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/utils/number.js
|
|
48633
48689
|
/**
|
|
48634
48690
|
* 字节数 → 人话(`12 KB` / `3.4 MB`)。
|
|
48635
48691
|
* 0 与负数 ⇒ `—`(不显示「0 B」这种假精确)。
|
|
@@ -48652,7 +48708,7 @@ window.__ModuleLoader__.load({
|
|
|
48652
48708
|
return `${value >= 10 ? String(Math.round(value)) : value.toFixed(1)} ${units[unit]}`;
|
|
48653
48709
|
}
|
|
48654
48710
|
//#endregion
|
|
48655
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48711
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/preview/md-labels.js
|
|
48656
48712
|
function markdownLabels() {
|
|
48657
48713
|
return {
|
|
48658
48714
|
code: {
|
|
@@ -48668,7 +48724,7 @@ window.__ModuleLoader__.load({
|
|
|
48668
48724
|
};
|
|
48669
48725
|
}
|
|
48670
48726
|
//#endregion
|
|
48671
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48727
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/preview/TextPreview.js
|
|
48672
48728
|
/** 定位到行时最多自动续翻的页数(远处行号不值得为它打一整圈往返;用户仍可手动「加载更多」)。 */
|
|
48673
48729
|
const FOCUS_MAX_PAGES = 10;
|
|
48674
48730
|
function TextPreview(props) {
|
|
@@ -48769,7 +48825,7 @@ window.__ModuleLoader__.load({
|
|
|
48769
48825
|
}, tt("previewLoadMore"))) : null);
|
|
48770
48826
|
}
|
|
48771
48827
|
//#endregion
|
|
48772
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48828
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/preview/HtmlPreview.js
|
|
48773
48829
|
/** 官方 CSP 原文(documentpreview lib/client.js 同款,不多开不少关)。 */
|
|
48774
48830
|
const HTML_CSP = "default-src 'none'; script-src 'none'; style-src 'unsafe-inline'; img-src data:; font-src data:; media-src data:";
|
|
48775
48831
|
/** 禁用标签(官方清单)。 */
|
|
@@ -48874,7 +48930,7 @@ window.__ModuleLoader__.load({
|
|
|
48874
48930
|
}));
|
|
48875
48931
|
}
|
|
48876
48932
|
//#endregion
|
|
48877
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48933
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/preview/OfficePreview.js
|
|
48878
48934
|
function OfficePreview(props) {
|
|
48879
48935
|
ensureComponentStyles("explorer", EXPLORER_CSS);
|
|
48880
48936
|
const tt = props.translate ?? t$2;
|
|
@@ -48925,7 +48981,7 @@ window.__ModuleLoader__.load({
|
|
|
48925
48981
|
});
|
|
48926
48982
|
}
|
|
48927
48983
|
//#endregion
|
|
48928
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
48984
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/preview/index.js
|
|
48929
48985
|
function FilePreview(props) {
|
|
48930
48986
|
ensureControls();
|
|
48931
48987
|
const tt = props.translate ?? t$2;
|
|
@@ -48965,7 +49021,7 @@ window.__ModuleLoader__.load({
|
|
|
48965
49021
|
return null;
|
|
48966
49022
|
}
|
|
48967
49023
|
//#endregion
|
|
48968
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49024
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/crumbs-menu.js
|
|
48969
49025
|
/**
|
|
48970
49026
|
* ▾ 选层下拉的**条目构造**(picker 与 dock 共用同一段代码,差别只在入参 —— 源实现用户 2026-09-29
|
|
48971
49027
|
* 点名提炼,严禁两处各写一份)。
|
|
@@ -49067,7 +49123,7 @@ window.__ModuleLoader__.load({
|
|
|
49067
49123
|
return out;
|
|
49068
49124
|
}
|
|
49069
49125
|
//#endregion
|
|
49070
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49126
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/crumb-nav.js
|
|
49071
49127
|
/**
|
|
49072
49128
|
* 文件浏览器的第一排:▾ 选层 + 面包屑 + 右侧动作(选择 / ✕)。
|
|
49073
49129
|
*
|
|
@@ -49151,7 +49207,7 @@ window.__ModuleLoader__.load({
|
|
|
49151
49207
|
}), actions(pickNow, tt, onClose));
|
|
49152
49208
|
}
|
|
49153
49209
|
//#endregion
|
|
49154
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49210
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/landing.js
|
|
49155
49211
|
/**
|
|
49156
49212
|
* 落地页主体(picker 刚打开、还没进任何目录时的那张表):上面一排根层(「根目录」或盘符),
|
|
49157
49213
|
* 下面全部工作区。行 = 进去,行尾钮 = 直接选这个目录。
|
|
@@ -49183,7 +49239,7 @@ window.__ModuleLoader__.load({
|
|
|
49183
49239
|
return (0, react$1.createElement)("div", { className: "dshpc-fb__tree" }, roots.map((root) => row(`root:${root.path}`, root.label, root.path)), anchors.filter((item) => item.path !== void 0 && item.path !== "").map((item) => row(`ws:${item.title}`, item.title, item.path)));
|
|
49184
49240
|
}
|
|
49185
49241
|
//#endregion
|
|
49186
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49242
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/tooltip.js
|
|
49187
49243
|
let renderer;
|
|
49188
49244
|
/** 注入官方 Tooltip(插件启动时调一次;传 undefined 撤销,回到自绘降级)。 */
|
|
49189
49245
|
function setTooltipRenderer(fn) {
|
|
@@ -49194,7 +49250,7 @@ window.__ModuleLoader__.load({
|
|
|
49194
49250
|
return renderer;
|
|
49195
49251
|
}
|
|
49196
49252
|
//#endregion
|
|
49197
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49253
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/Segmented.js
|
|
49198
49254
|
/**
|
|
49199
49255
|
* 角标 / 计数要不要显示,返回要显示的文本。
|
|
49200
49256
|
* 数字 ≤0 是「没东西可数」的老口径;字符串(`'1K'` / `'99+'`)由调用方决定,原样显示,空串不显示。
|
|
@@ -49215,6 +49271,7 @@ window.__ModuleLoader__.load({
|
|
|
49215
49271
|
ensureComponentStyles("segmented", SEGMENTED_CSS);
|
|
49216
49272
|
const size = props.size ?? "lg";
|
|
49217
49273
|
const multiple = props.multiple === true;
|
|
49274
|
+
const locked = useOverlayLocked();
|
|
49218
49275
|
const value = props.value;
|
|
49219
49276
|
const onChange = props.onChange;
|
|
49220
49277
|
const sliding = !multiple && props.items.length > 1;
|
|
@@ -49283,7 +49340,7 @@ window.__ModuleLoader__.load({
|
|
|
49283
49340
|
}
|
|
49284
49341
|
}) : null, ...props.items.map((item) => {
|
|
49285
49342
|
const on = multiple ? value.includes(item.value) : value === item.value;
|
|
49286
|
-
const disabled = item.disabled === true || props.disabled === true;
|
|
49343
|
+
const disabled = item.disabled === true || props.disabled === true || locked;
|
|
49287
49344
|
const handle = () => {
|
|
49288
49345
|
if (disabled) return;
|
|
49289
49346
|
if (multiple) {
|
|
@@ -49315,7 +49372,7 @@ window.__ModuleLoader__.load({
|
|
|
49315
49372
|
})]);
|
|
49316
49373
|
}
|
|
49317
49374
|
//#endregion
|
|
49318
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49375
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/preview-title-bar.js
|
|
49319
49376
|
/**
|
|
49320
49377
|
* 预览态的第二排:文件名 + 渲染⇄源码切换 / 复制路径 / 刷新。
|
|
49321
49378
|
*
|
|
@@ -49360,7 +49417,7 @@ window.__ModuleLoader__.load({
|
|
|
49360
49417
|
})));
|
|
49361
49418
|
}
|
|
49362
49419
|
//#endregion
|
|
49363
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49420
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/FileBrowser.js
|
|
49364
49421
|
/**
|
|
49365
49422
|
* 「根」在 POSIX 上的落点 `/`。Windows 没有这一个根 —— 根层是盘符清单,由宿主 `op:'roots'` 给出
|
|
49366
49423
|
* (见下面 `roots` 状态),本常量只在 POSIX / 探不到盘符时用。
|
|
@@ -49876,7 +49933,7 @@ window.__ModuleLoader__.load({
|
|
|
49876
49933
|
}, nav, titleBar, body);
|
|
49877
49934
|
}
|
|
49878
49935
|
//#endregion
|
|
49879
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49936
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/layout/resizer.js
|
|
49880
49937
|
/** 开始一次拖拽调宽(监听 window 的 pointermove / pointerup,松手自动清理)。 */
|
|
49881
49938
|
function startResizeLayoutWidth(opts) {
|
|
49882
49939
|
opts.startEvent.preventDefault?.();
|
|
@@ -49915,7 +49972,7 @@ window.__ModuleLoader__.load({
|
|
|
49915
49972
|
window.addEventListener("pointerup", onUp);
|
|
49916
49973
|
}
|
|
49917
49974
|
//#endregion
|
|
49918
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
49975
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/layout/panel-dock-logic.js
|
|
49919
49976
|
/**
|
|
49920
49977
|
* 停靠面板的状态逻辑(纯函数,零 React / 零 DOM)。
|
|
49921
49978
|
*
|
|
@@ -50046,13 +50103,13 @@ window.__ModuleLoader__.load({
|
|
|
50046
50103
|
}, 0);
|
|
50047
50104
|
}
|
|
50048
50105
|
//#endregion
|
|
50049
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
50106
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/layout/panel-dock-css.generated.js
|
|
50050
50107
|
const PANEL_DOCK_CSS = "/* 停靠栏 = **布局成员**,不是浮层:它占宽度、把主区真正挤窄(兄弟项目 2026-09-28:\n 「分栏压过来,不是盖上去」)。所以调用方必须把它放进自己的 flex 根里。\n 皮肤(头部 / 拖拽条 / 关闭钮 / 背景阴影)在 side-panel.css,与 SideSheet 共用。 */\n.dshpc-dock{display:flex;flex:0 0 auto;align-self:stretch;min-width:0}\n/* dock 不再替主区让缝(原 --dshpc-dock-gap 的 1px margin 已删,用户 2026-11-02):\n 滚动条与容器边缘的 1px 统一由滚动容器自己的透明边框提供(见 style.md §滚动条让位),\n 主区容器带了让位,滚动条与这条分隔线之间自然还是 1px。别再往这里加 margin。 */\n\n/* 自动加的宿主行(openFilePreview 加 / 关闭即摘):消费方那行不必自己写 flex。\n 只让「第一个非预览子项」当主区伸展,其余直接子项不动(页脚条、工具条不误伤);\n display 不在这里写死 —— 本来就是 grid 等布局的元素保持原样,由 TS 侧按计算值补 flex。 */\n.dshpc-dock-host{min-width:0;min-height:0}\n.dshpc-dock-host>:not([data-dshpc-file-preview]){min-width:0}\n.dshpc-dock-host>:first-child:not([data-dshpc-file-preview]){flex:1 1 auto}\n\n/* 单栏**占位**:sticky + 视口高让它在页面滚动时保持可见,同时仍然占宽度。\n ⚠️ **本条刻意不设 z-index**:布局成员一旦带正 z-index,就会无条件压过宿主 portal 到 body 的\n 弹窗(兄弟项目 2026-10-05 真机事故「侧边栏盖住宿主设置弹窗」)。层序交给 DOM 顺序裁决。\n 外观来自 .dshpc-side-surface(side-panel.css),这里只管怎么占位与朝哪边描边。 */\n.dshpc-dock__panel{\n position:sticky;top:0;align-self:stretch;\n /* 高度默认视口高(整页场景);嵌在定高容器里时由调用方给 --dshpc-dock-h(如 420px / 100%)。 */\n height:var(--dshpc-dock-h,100vh);max-height:var(--dshpc-dock-h,100vh);\n border-left:1px solid var(--dshpc-border);\n}\n/* 收起的出场:宽度收到 0、透明淡出;落定后组件才真正摘掉这一栏(JS 延时 220ms 配合)。 */\n.dshpc-dock__panel--closing{\n width:0!important;min-width:0!important;opacity:0;border-left-width:0;\n transition:width .2s var(--dshpc-ease),opacity .2s var(--dshpc-ease),border-left-width .2s var(--dshpc-ease);\n}\n\n/* 拖动期:① <iframe>(PDF / HTML 预览)是独立文档,会吞掉父文档的 pointermove,\n 向右拖进 iframe 就卡死 —— 整片让出指针事件;② contain 把重排隔离在栏内,\n 否则每帧改宽度都会牵动整页重排(兄弟项目 2026-10-04 真机「挪很久才动一下」)。 */\n.dshpc-dock.dshpc-dock--resizing iframe{pointer-events:none}\n.dshpc-dock.dshpc-dock--resizing .dshpc-dock__panel{contain:layout paint;will-change:width}\n\n/* 收起钮:**待在面板自己的框里**(用户 2026-10-28 三轮:占面板内部空间,不伸到外面去)。\n left:0 从内侧贴着分隔线 —— 贴线的一边不描边(线是面板自己的 border-left),页签与线不重合。\n 20×44(用户 2026-10-28 四轮定尺寸);实色底(--dshpc-plate,明暗各有实值),hover 亮一档。\n padding-right:2px 是**视觉居中**:右侧是圆角,箭头往直线那边挪 1px(用户 2026-10-28 四轮)。 */\n.dshpc-dock__collapse{\n position:absolute;left:0;top:50%;transform:translateY(-50%);\n z-index:8;display:inline-flex;align-items:center;justify-content:center;\n width:20px;height:44px;padding:0 2px 0 0;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-right:1px solid var(--dshpc-border);\n border-left:none;\n border-radius:0 var(--dshpc-radius-sm) var(--dshpc-radius-sm) 0;\n background:var(--dshpc-plate);color:var(--dshpc-fg-3);\n font-family:inherit;font-size:16px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-dock__collapse:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__collapse:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n\n/* 收起后的浮动耳朵:**fixed 贴右缘、垂直居中、独立于分栏**(用户 2026-10-28 定稿:\n 小页签挂中间、里面放面板图标、不显示文字,箭头与收起钮反向)。多个按收起顺序纵向堆叠。\n z 走 ear 档(高于弹窗遮罩,2026-11-04):面板在弹窗下面时,耳朵仍是唯一能点到的入口。\n DOM 上 portal 到 body(PanelDock.ts),否则会被弹窗的 stacking context 关在里面。 */\n.dshpc-dock__ears{\n position:fixed;top:50%;right:0;transform:translateY(-50%);\n z-index:var(--dshpc-z-ear,1080);\n display:flex;flex-direction:column;gap:8px;align-items:flex-end;\n pointer-events:none;\n}\n.dshpc-dock__ear{\n pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;\n /* 与收起钮**同尺寸**(20×44,用户 2026-10-28 四轮):上/下/左描边,贴右缘的一侧不描。\n 实色底(--dshpc-plate),不用透明色 —— 透明底下透出东西很难看。\n padding-left:2px 是**视觉居中**:左侧是圆角,箭头往直线(右缘)那边挪 1px。 */\n width:20px;height:44px;box-sizing:border-box;padding:0 0 0 2px;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-left:1px solid var(--dshpc-border);\n border-right:none;\n border-radius:var(--dshpc-radius-sm) 0 0 var(--dshpc-radius-sm);\n background:var(--dshpc-plate);color:var(--dshpc-fg-2);\n cursor:pointer;font-family:inherit;line-height:1;\n animation:dshpc-ear-in .2s var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* 入场:从右缘外滑进来,别「突然出现」(用户 2026-10-28)。 */\n@keyframes dshpc-ear-in{from{opacity:0;transform:translateX(14px)}}\n.dshpc-dock__ear:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__ear:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 与收起钮的箭头同一字号(16px):收进去前后箭头一模一样大(用户 2026-10-28)。 */\n.dshpc-dock__ear-arrow{font-size:16px;color:var(--dshpc-fg-3)}\n.dshpc-dock__ear:hover .dshpc-dock__ear-arrow{color:var(--dshpc-fg)}\n/* 动效礼貌:系统声明减少动效时全部关掉,收起退化为瞬时、功能不受影响。 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-dock__panel{animation:none}\n .dshpc-dock__panel--closing{transition:none}\n .dshpc-dock__ear{animation:none}\n}\n";
|
|
50051
50108
|
//#endregion
|
|
50052
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
50109
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/side-panel-css.generated.js
|
|
50053
50110
|
const SIDE_PANEL_CSS = "/* 侧边面板的公共皮肤 —— PanelDock(占宽分栏)与 SideSheet(覆盖抽屉)共用这一份。\n *\n * 分界:**皮肤在这里,定位各自写**。两者唯一的形态差异就是「怎么占位」——\n * PanelDock 用 sticky 占宽挤窄主区(panel-dock.css),SideSheet 用 absolute 盖在页面上(side-sheet.css)。\n *\n * 类名沿用 dshpc-dock__* 前缀:那是既有公开面(文档与消费方都在用),\n * 这里只搬文件不改名;新增的中性类是 .dshpc-side-surface(外观基类)。 */\n\n/* 入场:宽度从 0 长出来(keyframes 只写 from,终点取内联 / 状态宽度)。两边共用。 */\n@keyframes dshpc-side-in{from{width:0;opacity:0;overflow:hidden}}\n\n/* 外观基类:背景 / 文字色 / 阴影 / 纵向 flex。**不含** position、高度、边框方向、动画触发。 */\n.dshpc-side-surface{\n box-sizing:border-box;\n display:flex;flex-direction:column;flex:0 0 auto;min-width:0;\n background:var(--dshpc-surface-base);color:var(--dshpc-fg);\n box-shadow:var(--dshpc-shadow-2);\n transition:border-color var(--dshpc-dur-fast) var(--dshpc-ease);\n animation:dshpc-side-in .22s var(--dshpc-ease);\n}\n\n/* 头部:右侧 34px = 8(边距) + 20(关钮) + 6(呼吸):给绝对定位的关钮留位,标题/extra 不从它底下钻。 */\n.dshpc-dock__head{\n flex:none;display:flex;align-items:center;gap:8px;\n padding:10px 34px 10px 14px;\n border-bottom:1px solid var(--dshpc-border-faint);\n}\n/* 图标位 / 标题右侧的内容位:消费方传 ReactNode,可塞多个;库只负责排布,不抢宽度。 */\n.dshpc-dock__lead{display:inline-flex;align-items:center;gap:6px;flex:none;color:var(--dshpc-fg-2)}\n.dshpc-dock__extra{display:inline-flex;align-items:center;gap:6px;flex:none;margin-left:auto}\n/* 自定义头部:整行归调用方 —— 不加内边距/边框/背景,也不给关钮留内联空间(关钮是绝对定位的)。 */\n.dshpc-dock__head--custom{display:block;padding:0;border-bottom:none}\n.dshpc-dock__title{\n flex:1 1 auto;min-width:0;\n overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\n font-size:var(--dshpc-font-md);font-weight:600;\n}\n/* 关闭钮:20×20 方角图标位(与 Modal 的关闭钮同规格,不借 Picker 触发器皮肤)。 */\n.dshpc-dock__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);\n font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-dock__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-dock__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 头部关钮:绝对定位(top 10 / right 8),锚点是面板本身 —— 正文滚动它不跟滚。 */\n.dshpc-dock__close--abs{position:absolute;top:10px;right:8px;z-index:8}\n/* 浮动关钮:无头部面板用,略收一点边距。 */\n.dshpc-dock__close--floating{\n position:absolute;top:6px;right:6px;z-index:8;\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border-faint);\n}\n\n/* 内容区自己滚(面板高度锁死,内容不设内部滚动就会把页面撑高)。\n 透明右边框 = 滚动条与面板右缘隔 1px(口径见 style.md §滚动条让位)。 */\n.dshpc-dock__body{flex:1 1 auto;min-height:0;overflow:auto;border-right:1px solid transparent}\n\n/* 拖拽条:6px 命中区,**自己不画任何线**(贴在朝内那一侧,镜像由各自的定位文件做)。\n hover / 拖动时把面板自己的边框染成蓝 —— 蓝线只准改原线,不准在旁边再加一条。\n z-index 7 必须高于面板内容里的浮层(复制钮一类),否则命中区会被内容盖住。 */\n.dshpc-dock__resizer{\n position:absolute;left:0;top:0;bottom:0;width:6px;\n z-index:7;cursor:col-resize;background:transparent;\n}\n.dshpc-side-surface:has(> .dshpc-dock__resizer:hover),\n.dshpc-side-surface--resizing{\n /* 原线保留「上下渐隐」工作区指示条质感:把面板自己的那条边框换成同款渐变。\n 面板四边里只有朝内一侧有宽度,所以渐变只落在那一侧。 */\n border-image:linear-gradient(180deg,transparent,var(--dshpc-business) 30% 70%,transparent) 1;\n}\n/* 拖动期:① <iframe>(PDF / HTML 预览)是独立文档,会吞掉父文档的 pointermove ——\n 让出指针事件;② contain 把重排隔离在面板内,否则每帧改宽都会牵动整页重排。 */\n.dshpc-side-surface--resizing{contain:layout paint;will-change:width}\n.dshpc-side-surface--resizing iframe{pointer-events:none}\n\n/* 动效礼貌:系统声明减少动效时退化为瞬时(功能不受影响)。 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-side-surface{animation:none}\n}\n";
|
|
50054
50111
|
//#endregion
|
|
50055
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
50112
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/layout/PanelDock.js
|
|
50056
50113
|
/**
|
|
50057
50114
|
* 停靠面板(PanelDock)—— 可停靠的右侧分栏容器。
|
|
50058
50115
|
*
|
|
@@ -50368,7 +50425,7 @@ window.__ModuleLoader__.load({
|
|
|
50368
50425
|
}, "›"), renderHeader(pane), headerCloseOf(pane), floatingCloseOf(pane), (0, react$1.createElement)("div", { className: "dshpc-dock__body" }, pane.children ?? null))), ears === null || typeof document === "undefined" ? null : (0, react_dom.createPortal)(ears, document.body));
|
|
50369
50426
|
}
|
|
50370
50427
|
//#endregion
|
|
50371
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
50428
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/fs-face.js
|
|
50372
50429
|
/**
|
|
50373
50430
|
* client 侧的**只读文件面**:fetch 宿主 `serveFsRoute` 挂的那条路由(`src/host/fs-route.ts`)。
|
|
50374
50431
|
*
|
|
@@ -50526,7 +50583,7 @@ window.__ModuleLoader__.load({
|
|
|
50526
50583
|
};
|
|
50527
50584
|
}
|
|
50528
50585
|
//#endregion
|
|
50529
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
50586
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/explorer/open.js
|
|
50530
50587
|
/**
|
|
50531
50588
|
* 入参路径解析成**绝对路径**(`''` = 虚拟根)。用户 2026-11-03 定:绝对/相对都收。
|
|
50532
50589
|
*
|
|
@@ -50548,14 +50605,14 @@ window.__ModuleLoader__.load({
|
|
|
50548
50605
|
return workspaceOfPath(path, anchors)?.path ?? (sessionId === void 0 ? void 0 : anchors.find((item) => item.sessionIds?.includes(sessionId) === true)?.path) ?? anchors.find((item) => item.path !== void 0)?.path;
|
|
50549
50606
|
}
|
|
50550
50607
|
function warnNotWired(api, filesMissing) {
|
|
50551
|
-
console.warn(`[dsh-plugin-core/explorer] ${api}: ` + (filesMissing ? "没有文件面(client apply 里没调 connectFs,或宿主没注册 serveFsRoute)" : "相对路径找不到工作区基准(宿主 workspaces 里没有带 path 的工作区)") + " ⇒ 放弃本次操作");
|
|
50608
|
+
console.warn(`[dsh-plugin-core/adv/explorer] ${api}: ` + (filesMissing ? "没有文件面(client apply 里没调 connectFs,或宿主没注册 serveFsRoute)" : "相对路径找不到工作区基准(宿主 workspaces 里没有带 path 的工作区)") + " ⇒ 放弃本次操作");
|
|
50552
50609
|
}
|
|
50553
50610
|
/** 预览侧边栏的挂载容器 id(全站唯一,重复打开先关旧的)。 */
|
|
50554
50611
|
const PREVIEW_HOST_ID = "dshpc-file-preview-host";
|
|
50555
50612
|
/** dock 里的面板 id(本 container 里只有一个)。 */
|
|
50556
50613
|
const PREVIEW_PANEL_ID = "file-preview";
|
|
50557
50614
|
/**
|
|
50558
|
-
* 挂载宿主行自动补的类:主区伸展 / 子项不收溢出的规则挂在它下面(`src/ui/panel-dock.css`)。
|
|
50615
|
+
* 挂载宿主行自动补的类:主区伸展 / 子项不收溢出的规则挂在它下面(`src/ui/layout/panel-dock.css`)。
|
|
50559
50616
|
* 消费方不必自己写 —— 打开时加、关闭时摘。
|
|
50560
50617
|
*/
|
|
50561
50618
|
const DOCK_HOST_CLASS = "dshpc-dock-host";
|
|
@@ -50571,7 +50628,7 @@ window.__ModuleLoader__.load({
|
|
|
50571
50628
|
if (typeof document === "undefined") return null;
|
|
50572
50629
|
const mount = typeof options.mount === "string" ? document.querySelector(options.mount) : options.mount;
|
|
50573
50630
|
if (mount === null) {
|
|
50574
|
-
console.warn(`[dsh-plugin-core/explorer] openFilePreview: mount 选择器解析不到元素(${String(options.mount)}) ⇒ 放弃本次操作`);
|
|
50631
|
+
console.warn(`[dsh-plugin-core/adv/explorer] openFilePreview: mount 选择器解析不到元素(${String(options.mount)}) ⇒ 放弃本次操作`);
|
|
50575
50632
|
return null;
|
|
50576
50633
|
}
|
|
50577
50634
|
const custom = options.content !== void 0;
|
|
@@ -50586,7 +50643,7 @@ window.__ModuleLoader__.load({
|
|
|
50586
50643
|
warnNotWired("openFilePreview", false);
|
|
50587
50644
|
return null;
|
|
50588
50645
|
}
|
|
50589
|
-
if (custom && options.path !== void 0) console.warn("[dsh-plugin-core/explorer] openFilePreview: content 与 path 只能二选一,path 已忽略");
|
|
50646
|
+
if (custom && options.path !== void 0) console.warn("[dsh-plugin-core/adv/explorer] openFilePreview: content 与 path 只能二选一,path 已忽略");
|
|
50590
50647
|
const opts = {
|
|
50591
50648
|
...options,
|
|
50592
50649
|
mount,
|
|
@@ -50618,7 +50675,7 @@ window.__ModuleLoader__.load({
|
|
|
50618
50675
|
const adopt = (next) => {
|
|
50619
50676
|
if (next === hostEl) return;
|
|
50620
50677
|
restoreHost();
|
|
50621
|
-
if (next === document.body) console.warn("[dsh-plugin-core/explorer] openFilePreview: 不要传 document.body —— PanelDock 是布局成员(停靠右侧 + 挤窄主区)。请传你页面里包住主区的那个元素。");
|
|
50678
|
+
if (next === document.body) console.warn("[dsh-plugin-core/adv/explorer] openFilePreview: 不要传 document.body —— PanelDock 是布局成员(停靠右侧 + 挤窄主区)。请传你页面里包住主区的那个元素。");
|
|
50622
50679
|
hostPrevDisplay = next.style.display;
|
|
50623
50680
|
hostHadClass = next.classList.contains(DOCK_HOST_CLASS);
|
|
50624
50681
|
next.classList.add(DOCK_HOST_CLASS);
|
|
@@ -50814,7 +50871,7 @@ window.__ModuleLoader__.load({
|
|
|
50814
50871
|
});
|
|
50815
50872
|
}
|
|
50816
50873
|
//#endregion
|
|
50817
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
50874
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/picker-logic.js
|
|
50818
50875
|
/** 两种输入归一成 groups:给了 `options` 就当成一个无标题的组。 */
|
|
50819
50876
|
function toGroups(groups, options) {
|
|
50820
50877
|
if (groups !== void 0 && groups.length > 0) return groups;
|
|
@@ -53048,7 +53105,7 @@ window.__ModuleLoader__.load({
|
|
|
53048
53105
|
]);
|
|
53049
53106
|
}
|
|
53050
53107
|
//#endregion
|
|
53051
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53108
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/infra/chevron.js
|
|
53052
53109
|
/**
|
|
53053
53110
|
* 全站唯一的箭头:**自绘 chevron**(就是下拉框右侧那颗)。
|
|
53054
53111
|
*
|
|
@@ -53086,7 +53143,7 @@ window.__ModuleLoader__.load({
|
|
|
53086
53143
|
}));
|
|
53087
53144
|
}
|
|
53088
53145
|
//#endregion
|
|
53089
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53146
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/FieldHint.js
|
|
53090
53147
|
/**
|
|
53091
53148
|
* 问号提示 —— **全站唯一实现、独立组件**(L2,P4)
|
|
53092
53149
|
*
|
|
@@ -53120,10 +53177,10 @@ window.__ModuleLoader__.load({
|
|
|
53120
53177
|
});
|
|
53121
53178
|
}
|
|
53122
53179
|
//#endregion
|
|
53123
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53180
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/picker-css.generated.js
|
|
53124
53181
|
const PICKER_CSS = "\n.dshpc-picker{position:relative;display:inline-block;max-width:100%;font-size:13px;line-height:20px}\n.dshpc-picker__trigger{\n display:inline-flex;align-items:center;justify-content:space-between;gap:6px;\n min-width:120px;max-width:100%;height:28px;padding:0 8px;\n color:var(--dshpc-fg);background:var(--dshpc-surface-1);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);cursor:pointer;\n}\n.dshpc-picker__trigger:disabled{color:var(--dshpc-fg-dim);cursor:not-allowed;opacity:.7}\n/* 聚焦(键盘或点击选中)时与全站一致的蓝色描边;菜单打开后焦点会进去,触发器自然失去焦点。 */\n.dshpc-picker__trigger:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 文字默认靠左(吃掉剩余宽度),不给 space-between 把短文案推到中间的机会;\n 确实要居中就显式传 align=\"center\"。 */\n.dshpc-picker__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}\n.dshpc-picker__trigger--center .dshpc-picker__label{text-align:center}\n.dshpc-picker__caret{flex:none;color:var(--dshpc-fg-3)}\n.dshpc-picker__icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n.dshpc-picker__option-icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n/* 下拉面板只留定位 / 滚动 / 字号:底色·描边·圆角·阴影来自 panel.css 的 menu 档。 */\n.dshpc-picker__menu{\n z-index:var(--dshpc-z-popmenu);max-height:280px;overflow:auto;padding:4px;\n /* 菜单经 FloatingPortal 挂到 body,脱离 .dshpc-picker,须显式字号,否则继承 body 的大字号 */\n font-size:13px;line-height:20px;\n}\n/* 尺寸档(与 Field 的 sm/md/lg 对应)。 */\n.dshpc-picker__trigger--sm{height:24px;font-size:12px}\n.dshpc-picker__trigger--lg{height:32px}\n/* 键盘游标所在项(无 hover 也要看得见)。 */\n.dshpc-picker__option[data-active='true']{background:var(--dshpc-surface-sunken);outline:1px solid var(--dshpc-border)}\n.dshpc-picker__option--clear{color:var(--dshpc-fg-3)}\n.dshpc-picker__search{\n width:100%;height:28px;margin-bottom:4px;padding:0 8px;box-sizing:border-box;\n color:var(--dshpc-fg);background:var(--dshpc-surface-sunken);\n border:1px solid var(--dshpc-border-faint);border-radius:var(--dshpc-radius-md);outline:none;\n}\n.dshpc-picker__group-label{\n padding:6px 8px 2px;color:var(--dshpc-fg-3);font-size:11px;\n}\n.dshpc-picker__option{\n display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:var(--dshpc-radius-sm);cursor:pointer;\n color:var(--dshpc-fg);white-space:nowrap;\n}\n.dshpc-picker__option:hover{background:var(--dshpc-surface-sunken)}\n.dshpc-picker__option--active{background:var(--dshpc-open-bg);color:var(--dshpc-business)}\n.dshpc-picker__option--disabled{color:var(--dshpc-fg-dim);cursor:not-allowed}\n/* 选项文字吃掉剩余宽度:超长省略号(配合 MarqueeText hover 跑马灯),不撑宽菜单。 */\n.dshpc-picker__option-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshpc-picker__tick{width:12px;color:var(--dshpc-business)}\n.dshpc-picker__empty{padding:8px;color:var(--dshpc-fg-3);text-align:center}\n.dshpc-picker__degraded{\n padding:6px 8px;margin-bottom:4px;border-radius:var(--dshpc-radius-sm);\n color:var(--dshpc-warning-label);background:color-mix(in srgb,var(--dshpc-warning) 12%,transparent);\n font-size:11px;\n}\n.dshpc-picker__row{display:flex;align-items:center;gap:8px}\n";
|
|
53125
53182
|
//#endregion
|
|
53126
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53183
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/Picker.js
|
|
53127
53184
|
/**
|
|
53128
53185
|
* 通用选择器:单选 / 多选 / 上限 / 搜索 / 分组 / 空态 / 降级。
|
|
53129
53186
|
*
|
|
@@ -53189,6 +53246,11 @@ window.__ModuleLoader__.load({
|
|
|
53189
53246
|
document.addEventListener("mousedown", onDown);
|
|
53190
53247
|
return () => document.removeEventListener("mousedown", onDown);
|
|
53191
53248
|
}, [open]);
|
|
53249
|
+
const overlayLocked = useOverlayLocked();
|
|
53250
|
+
const off = props.disabled === true || overlayLocked;
|
|
53251
|
+
(0, react$1.useEffect)(() => {
|
|
53252
|
+
if (overlayLocked) setOpen(false);
|
|
53253
|
+
}, [overlayLocked]);
|
|
53192
53254
|
(0, react$1.useEffect)(() => {
|
|
53193
53255
|
if (open) return;
|
|
53194
53256
|
setQuery("");
|
|
@@ -53237,9 +53299,9 @@ window.__ModuleLoader__.load({
|
|
|
53237
53299
|
ref: refs.setReference,
|
|
53238
53300
|
className: `dshpc-picker__trigger dshpc-picker__trigger--${size$3}${props.align === "center" ? " dshpc-picker__trigger--center" : ""}`,
|
|
53239
53301
|
style: triggerStyle,
|
|
53240
|
-
disabled:
|
|
53302
|
+
disabled: off,
|
|
53241
53303
|
onClick: () => {
|
|
53242
|
-
if (
|
|
53304
|
+
if (!off) setOpen(!open);
|
|
53243
53305
|
}
|
|
53244
53306
|
}, props.icon !== void 0 && props.icon !== null ? (0, react$1.createElement)("span", { className: "dshpc-picker__icon" }, props.icon) : null, (0, react$1.createElement)(MarqueeText, {
|
|
53245
53307
|
text: summary,
|
|
@@ -53293,19 +53355,19 @@ window.__ModuleLoader__.load({
|
|
|
53293
53355
|
return Array.isArray(v) ? [...v] : [v];
|
|
53294
53356
|
}
|
|
53295
53357
|
//#endregion
|
|
53296
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53358
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/utils/date.js
|
|
53297
53359
|
/** 两位补零:`9` → `09`(数字 / 纯数字字符串都收)。 */
|
|
53298
53360
|
function pad2$1(value) {
|
|
53299
53361
|
return String(value).padStart(2, "0");
|
|
53300
53362
|
}
|
|
53301
53363
|
//#endregion
|
|
53302
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53364
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/card-css.generated.js
|
|
53303
53365
|
const CARD_CSS = "\n/* ── Card / StripCard:Surface 外框 + 头部契约 + 色条 ─────────────────────\n 外框(底 / 边框 / 圆角 / 内距)全部来自 .dshpc-surface(src/ui/surface.css):\n 本文件**不再写 border / border-radius**,圆角契约因此只有一个定义点(容器档 = 12)。\n 这里只管两件 Surface 不该知道的事:色条几何、头部布局。\n\n 色条几何默认值都可被 props 覆盖(Card.ts 写对应的 CSS 变量):\n --card-bar-size 条子粗细\n --card-bar-inset 条子距卡片边缘的距离(= 贴边那一侧的内距)\n --card-bar-gap 条子距内容的距离(= body 的 gap)\n --card-bar-length 上下方位时的条长(100% = 跟内容同宽)\n 这些变量只在本文件消费(3 份文件一起引时,跨文件引用别处的变量会静默失效),\n 所以默认值必须写在这里,而不是令牌或别的皮肤里。 */\n.dshpc-card{\n --card-accent:var(--dshpc-business);\n --card-accent-soft:var(--dshpc-business-soft);\n --card-bar-size:6px;\n --card-bar-inset:12px;\n --card-bar-gap:12px;\n --card-bar-length:100%;\n}\n/* 档位 → token(照 records-timeline 的 tone 模式:一个变量切档,不写 5 套规则;浅底与色条同源)。 */\n.dshpc-card--success{--card-accent:var(--dshpc-success);--card-accent-soft:var(--dshpc-success-soft)}\n.dshpc-card--warning{--card-accent:var(--dshpc-warning);--card-accent-soft:var(--dshpc-warning-soft)}\n.dshpc-card--danger{--card-accent:var(--dshpc-danger);--card-accent-soft:var(--dshpc-danger-soft)}\n/* neutral 浅底借 chip 底(兄弟项目 mute 档同款:明暗都成立)。 */\n.dshpc-card--neutral{--card-accent:var(--dshpc-fg-4);--card-accent-soft:var(--dshpc-chip-bg)}\n/* 扩展八色(2026-10-29):色条 + 浅底同源,软底走各自 -soft。 */\n.dshpc-card--purple{--card-accent:var(--dshpc-purple);--card-accent-soft:var(--dshpc-purple-soft)}\n.dshpc-card--pink{--card-accent:var(--dshpc-pink);--card-accent-soft:var(--dshpc-pink-soft)}\n.dshpc-card--cyan{--card-accent:var(--dshpc-cyan);--card-accent-soft:var(--dshpc-cyan-soft)}\n.dshpc-card--teal{--card-accent:var(--dshpc-teal);--card-accent-soft:var(--dshpc-teal-soft)}\n.dshpc-card--orange{--card-accent:var(--dshpc-orange);--card-accent-soft:var(--dshpc-orange-soft)}\n.dshpc-card--indigo{--card-accent:var(--dshpc-indigo);--card-accent-soft:var(--dshpc-indigo-soft)}\n.dshpc-card--rose{--card-accent:var(--dshpc-rose);--card-accent-soft:var(--dshpc-rose-soft)}\n.dshpc-card--slate{--card-accent:var(--dshpc-slate);--card-accent-soft:var(--dshpc-slate-soft)}\n\n/* body = 色条 + 头部。方向跟着条子贴的边切 ⇒ 四个方位只是「换一个方向的 flex 项」,\n 不用为每个方位各写一套定位。 */\n.dshpc-card__body{display:flex;gap:var(--card-bar-gap);min-width:0}\n.dshpc-card--bar-top .dshpc-card__body,\n.dshpc-card--bar-bottom .dshpc-card__body{flex-direction:column}\n\n/* 头部一行 = 主内容 + 右侧槽,**整体垂直居中**:调用方在 action 里裸放一个元素\n (按钮 / 文字 / 图标)不用自己套容器居中;一行两行、右边怎么放由调用方在框内自定。 */\n.dshpc-card__head{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-card--bar-left .dshpc-card__head,\n.dshpc-card--bar-right .dshpc-card__head{flex:1 1 auto}\n.dshpc-card__main{flex:1;min-width:0}\n.dshpc-card__side{display:flex;align-items:center;gap:6px;flex:none}\n\n/* 色条:左/右 = 竖向条(高度跟内容,最小一行);上/下 = 横向条(长度默认跟内容同宽)。\n 右/下方位靠 order 排到头部之后,DOM 顺序始终不变。 */\n.dshpc-card__bar{flex:none;background:var(--card-accent);border-radius:var(--dshpc-radius-xs)}\n.dshpc-card--bar-left .dshpc-card__bar,\n.dshpc-card--bar-right .dshpc-card__bar{width:var(--card-bar-size);align-self:stretch;min-height:var(--dshpc-line-md)}\n.dshpc-card--bar-top .dshpc-card__bar,\n.dshpc-card--bar-bottom .dshpc-card__bar{width:var(--card-bar-length);height:var(--card-bar-size);align-self:flex-start}\n.dshpc-card--bar-right .dshpc-card__bar,\n.dshpc-card--bar-bottom .dshpc-card__bar{order:1}\n\n/* ── 外观一 · StripCard:同色系浅底 + 1px 不可见占位边框 + 方角 + 4px 通高方角色条贴左缘 ──\n 底色 / 方角 / 占位边框由 Surface 的三条修饰类提供(Card.ts 按 kind 传),此处只管内距与条子。 */\n.dshpc-card.dshpc-card--strip{\n --card-bar-size:4px;--card-bar-inset:0;\n padding:12px 12px 12px 20px;\n background:var(--card-accent-soft,transparent);\n}\n/* 左内边距 20px = 16 留白 + 4 条宽 ⇒ 内容从色条右缘起算;色条绝对定位通高,跟着内容高度自适应。\n 特异性 0,3,0:压过上面 .dshpc-card--bar-left .dshpc-card__bar 的宽度规则,与注入顺序无关。 */\n.dshpc-card.dshpc-card--strip .dshpc-card__bar{position:absolute;left:0;top:0;bottom:0;width:4px;align-self:auto}\n\n/* ── 外观二 · Card:Surface 外框(底 + 1px 实色边框 + 圆角 12)+ 色条贴边那一侧的内距 ──\n 内距用 0,2,0 / 0,3,0 的长写法:高过 .dshpc-surface 的 padding 简写,与两份 CSS 的注入顺序无关。 */\n.dshpc-card.dshpc-card--bordered{padding:14px}\n.dshpc-card.dshpc-card--bordered.dshpc-card--bar-left{padding-left:var(--card-bar-inset)}\n.dshpc-card.dshpc-card--bordered.dshpc-card--bar-right{padding-right:var(--card-bar-inset)}\n.dshpc-card.dshpc-card--bordered.dshpc-card--bar-top{padding-top:var(--card-bar-inset)}\n.dshpc-card.dshpc-card--bordered.dshpc-card--bar-bottom{padding-bottom:var(--card-bar-inset)}\n\n.dshpc-card__toggle{\n display:inline-flex;align-items:center;justify-content:center;\n width:24px;height:24px;padding:0;background:none;border:none;border-radius:var(--dshpc-radius-sm);\n color:var(--dshpc-fg-3);cursor:pointer;\n}\n.dshpc-card__toggle:hover{background:var(--dshpc-surface-sunken);color:var(--dshpc-fg)}\n/* 箭头是 svg(Chevron),不是字形 ⇒ 不要 font-size;inline-flex 免掉 svg 的基线留白。 */\n.dshpc-card__caret{display:inline-flex;transition:transform .15s ease}\n.dshpc-card__caret.is-open{transform:rotate(180deg)}\n.dshpc-card__panel{margin-top:8px;padding-top:8px;border-top:1px solid var(--dshpc-border-faint)}\n";
|
|
53304
53366
|
//#endregion
|
|
53305
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53367
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/surface-css.generated.js
|
|
53306
53368
|
const SURFACE_CSS = "\n/* ── Surface · 纯框容器 ───────────────────────────────────────────────────\n 只回答「一块面长什么样」:底 / 边 / 圆角 / 内距,四根轴,零业务语义。\n 它是**圆角契约的唯一真源**:容器档 = --dshpc-radius-md(12),与 Button / Input 同档,\n 外框永远不小于里面的控件 —— 杜绝「卡片 8 < 按钮 12」这类倒挂(2026-11-01)。\n\n 所有轴都用**变量**表达,修饰类只改这些变量、不改属性:\n 消费方(Card、下游插件)自己写规则时,无论两份 CSS 谁先注入,胜负都不依赖顺序。\n\n tone plain(默认 surface-1) / raised / sunken / subtle\n border 默认 1px 实线;faint 更淡;none 透明(保留 1px 占位,不跳高);\n dashed 虚线(占位框用,线色仍是 border token)\n radius 默认 md;none / sm / lg\n padding 默认由调用方选档;none / sm(8) / md(12) / lg(16)\n 基类不带内距:容器要自己算四边内距时(如 Card 的色条贴边),不传 pad 档即可,不需要覆盖。 */\n.dshpc-surface{\n position:relative;box-sizing:border-box;color:var(--dshpc-fg);font:inherit;text-align:left;\n --surface-bg:var(--dshpc-surface-1);\n --surface-border:var(--dshpc-border);\n --surface-border-style:solid;\n --surface-radius:var(--dshpc-radius-md);\n --surface-pad:0;\n border:1px var(--surface-border-style) var(--surface-border);\n border-radius:var(--surface-radius);\n background:var(--surface-bg);\n padding:var(--surface-pad);\n}\n.dshpc-surface--tone-raised{--surface-bg:var(--dshpc-surface-raised)}\n.dshpc-surface--tone-sunken{--surface-bg:var(--dshpc-surface-sunken)}\n.dshpc-surface--tone-subtle{--surface-bg:var(--dshpc-chip-bg)}\n.dshpc-surface--border-faint{--surface-border:var(--dshpc-border-faint)}\n.dshpc-surface--border-none{--surface-border:transparent}\n.dshpc-surface--border-dashed{--surface-border-style:dashed}\n.dshpc-surface--radius-none{--surface-radius:0}\n.dshpc-surface--radius-sm{--surface-radius:var(--dshpc-radius-sm)}\n.dshpc-surface--radius-lg{--surface-radius:var(--dshpc-radius-lg)}\n.dshpc-surface--pad-none{--surface-pad:0}\n.dshpc-surface--pad-sm{--surface-pad:var(--dshpc-space-2)}\n.dshpc-surface--pad-md{--surface-pad:var(--dshpc-space-3)}\n.dshpc-surface--pad-lg{--surface-pad:var(--dshpc-space-4)}\n";
|
|
53307
53369
|
//#endregion
|
|
53308
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53370
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/Surface.js
|
|
53309
53371
|
/**
|
|
53310
53372
|
* 拼 Surface 的类名。独立导出是给组合类容器(Card)用的:
|
|
53311
53373
|
* 容器要把 Surface 当外框、又不想吃它的内距时,传 `padding: null` 即可。
|
|
@@ -53340,7 +53402,7 @@ window.__ModuleLoader__.load({
|
|
|
53340
53402
|
}, props.children ?? null);
|
|
53341
53403
|
}
|
|
53342
53404
|
//#endregion
|
|
53343
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53405
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/Card.js
|
|
53344
53406
|
/** 色条档位(映射到 design 的 token,不新增 token;也接受任意 CSS 颜色值)。 */
|
|
53345
53407
|
const CARD_ACCENTS = [
|
|
53346
53408
|
"business",
|
|
@@ -53431,10 +53493,10 @@ window.__ModuleLoader__.load({
|
|
|
53431
53493
|
return CardShell("bordered", props);
|
|
53432
53494
|
}
|
|
53433
53495
|
//#endregion
|
|
53434
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53496
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/chip-css.generated.js
|
|
53435
53497
|
const CHIP_CSS = "\n/* 三条局部变量承载配色:neutral 走旧灰面;语义档换底字配对(2026-10-20 用户要多色多尺寸标签)。 */\n.dshpc-chip{--chip-bg:var(--dshpc-chip-bg);--chip-fg:var(--dshpc-fg);--chip-bg-hover:var(--dshpc-chip-bg-hover);\n display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:1px 8px;\n box-sizing:border-box;border-radius:var(--dshpc-radius-pill,999px);border:none;\n background:var(--chip-bg);color:var(--chip-fg);\n font-family:inherit;font-size:11px;line-height:18px;margin:0;\n /* 2026-10-18:chip 是 flex 行里的常用项,禁止被压缩换行(预览站出现过文字竖排、互相叠压的挤压)。 */\n white-space:nowrap;flex:none;\n appearance:none;-webkit-appearance:none;\n}\n/* md 档:卡片元信息行等稍大场景;sm 即旧版默认,逐像素不动。 */\n.dshpc-chip--md{padding:2px 10px;font-size:12px;line-height:20px;}\n/* xs 档:标题后缀等极紧凑场景(2026-10-20 用户要更小标签);16px 高、font 10。 */\n.dshpc-chip--xs{padding:0 6px;font-size:10px;line-height:16px;}\n/* 语义色实心档:底 / 字 / hover 配对与 Button 同源(黄底中高明度 ⇒ 字用 --dshpc-on-warning)。 */\n.dshpc-chip--business{--chip-bg:var(--dshpc-business);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-business-hover);}\n.dshpc-chip--success{--chip-bg:var(--dshpc-success);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-success-hover);}\n.dshpc-chip--warning{--chip-bg:var(--dshpc-warning);--chip-fg:var(--dshpc-on-warning);--chip-bg-hover:var(--dshpc-warning-hover);}\n.dshpc-chip--danger{--chip-bg:var(--dshpc-danger);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-danger-hover);}\n/* 扩展八色(2026-10-29):实心面字色统一白(on-signal),明度均低于黄 / 青柠,白字两主题可读。 */\n.dshpc-chip--purple{--chip-bg:var(--dshpc-purple);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-purple-hover);}\n.dshpc-chip--pink{--chip-bg:var(--dshpc-pink);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-pink-hover);}\n.dshpc-chip--cyan{--chip-bg:var(--dshpc-cyan);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-cyan-hover);}\n.dshpc-chip--teal{--chip-bg:var(--dshpc-teal);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-teal-hover);}\n.dshpc-chip--orange{--chip-bg:var(--dshpc-orange);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-orange-hover);}\n.dshpc-chip--indigo{--chip-bg:var(--dshpc-indigo);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-indigo-hover);}\n.dshpc-chip--rose{--chip-bg:var(--dshpc-rose);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-rose-hover);}\n.dshpc-chip--slate{--chip-bg:var(--dshpc-slate);--chip-fg:var(--dshpc-on-signal);--chip-bg-hover:var(--dshpc-slate-hover);}\n/* 可点态:button 渲染(见 Chip.ts),光标 + hover 加深。 */\n.dshpc-chip--clickable{cursor:pointer;transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease);}\n.dshpc-chip--clickable:hover:not(:disabled){background:var(--chip-bg-hover)}\n.dshpc-chip:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 禁用态字色从 --chip-fg 派生(45% ≈ 旧 fg-3 的弱化观感),不许直接用 --dshpc-fg-3:\n 它跟主题走,暗色下是深灰 ⇒ 语义色实心标签(蓝 / 红底)上几乎看不见(与 Segmented 计数 2026-10-29 同类)。 */\n.dshpc-chip:disabled{cursor:default;color:color-mix(in srgb,var(--chip-fg) 45%,transparent)}\n/* maxWidth 包 MarqueeText 时:标签作为 flex 子项必须能收缩到内容以下,否则省略号 / 跑马灯测不准 */\n.dshpc-chip .dshpc-chip__label{min-width:0;}\n@media (prefers-reduced-motion: reduce){.dshpc-chip{transition:none}}\n";
|
|
53436
53498
|
//#endregion
|
|
53437
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53499
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/Chip.js
|
|
53438
53500
|
/** 小标签(neutral 用现成的 `--dshpc-chip-bg`;传 `onClick` 才是可点的)。 */
|
|
53439
53501
|
function Chip(props) {
|
|
53440
53502
|
ensureComponentStyles("chip", CHIP_CSS);
|
|
@@ -53458,7 +53520,7 @@ window.__ModuleLoader__.load({
|
|
|
53458
53520
|
}) : children ?? null);
|
|
53459
53521
|
}
|
|
53460
53522
|
//#endregion
|
|
53461
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53523
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/navigation/pagination-logic.js
|
|
53462
53524
|
/**
|
|
53463
53525
|
* 分页纯逻辑:总页数、页码夹取、省略号窗口、当前页可见区间。
|
|
53464
53526
|
*
|
|
@@ -53522,7 +53584,7 @@ window.__ModuleLoader__.load({
|
|
|
53522
53584
|
return items;
|
|
53523
53585
|
}
|
|
53524
53586
|
//#endregion
|
|
53525
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53587
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/navigation/Pagination.js
|
|
53526
53588
|
/**
|
|
53527
53589
|
* 分页(`‹ Previous 1 [2] 3 … 36 Next ›`)。
|
|
53528
53590
|
*
|
|
@@ -53537,7 +53599,8 @@ window.__ModuleLoader__.load({
|
|
|
53537
53599
|
const count = pageCountOf(total, pageSize);
|
|
53538
53600
|
const page = clampPage(props.page, count);
|
|
53539
53601
|
if (props.hideOnSinglePage === true && count <= 1) return null;
|
|
53540
|
-
const
|
|
53602
|
+
const locked = useOverlayLocked();
|
|
53603
|
+
const disabled = props.disabled === true || locked;
|
|
53541
53604
|
const [from, to] = pageRange(page, pageSize, total);
|
|
53542
53605
|
const go = (next) => {
|
|
53543
53606
|
if (disabled) return;
|
|
@@ -53623,7 +53686,7 @@ window.__ModuleLoader__.load({
|
|
|
53623
53686
|
}, totalNode === null ? null : (0, react$1.createElement)("span", { className: "dshpc-pagination__total" }, totalNode), (0, react$1.createElement)("div", { className: "dshpc-pagination__pages" }, navButton("prev"), ...middle, navButton("next")), sizeNode);
|
|
53624
53687
|
}
|
|
53625
53688
|
//#endregion
|
|
53626
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53689
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/SectionHead.js
|
|
53627
53690
|
/**
|
|
53628
53691
|
* 模块标题行(UI 基础层):**标签(可选,画出来的短竖线)/ icon(可选)+ 标题 + 右侧控件**。
|
|
53629
53692
|
*
|
|
@@ -53672,7 +53735,7 @@ window.__ModuleLoader__.load({
|
|
|
53672
53735
|
}), props.icon === void 0 ? null : (0, react$1.createElement)("span", { className: "dshpc-section-head__icon" }, props.icon), (0, react$1.createElement)("span", { className: "dshpc-section-head__title" }, props.title), props.right === void 0 ? null : (0, react$1.createElement)("div", { className: "dshpc-section-head__right" }, props.right));
|
|
53673
53736
|
}
|
|
53674
53737
|
//#endregion
|
|
53675
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53738
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/table-logic.js
|
|
53676
53739
|
/**
|
|
53677
53740
|
* 单元格值是不是「对象写法」(跨列 / 跨行 / 对齐)。
|
|
53678
53741
|
*
|
|
@@ -53743,7 +53806,7 @@ window.__ModuleLoader__.load({
|
|
|
53743
53806
|
return rows;
|
|
53744
53807
|
}
|
|
53745
53808
|
//#endregion
|
|
53746
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
53809
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/table-shared.js
|
|
53747
53810
|
function widthOf(width) {
|
|
53748
53811
|
if (width === void 0) return void 0;
|
|
53749
53812
|
return typeof width === "number" ? `${width}px` : width;
|
|
@@ -53962,7 +54025,7 @@ window.__ModuleLoader__.load({
|
|
|
53962
54025
|
}))), groups.length > 0 ? null : (0, react$1.createElement)("thead", { className: "dshpc-table__head" }, ...headRows.map((cells, level) => headRowOf(cells, level))), ...body);
|
|
53963
54026
|
}
|
|
53964
54027
|
//#endregion
|
|
53965
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
54028
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/display/Table.js
|
|
53966
54029
|
/**
|
|
53967
54030
|
* 底部哨兵的滚动监听:哨兵进入视口(提前 200px)就调一次 `onLoadMore`。
|
|
53968
54031
|
* `enabled` 由调用方决定(分页 / 分组模式下关掉);正在加载或已到底时 `blockedRef` 挡住重复触发。
|
|
@@ -55000,7 +55063,7 @@ window.__ModuleLoader__.load({
|
|
|
55000
55063
|
}));
|
|
55001
55064
|
});
|
|
55002
55065
|
//#endregion
|
|
55003
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
55066
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/feedback/toast-host.js
|
|
55004
55067
|
/** 全局注册表键:Symbol.for 跨 bundle 副本天然共享同一个符号。 */
|
|
55005
55068
|
const TOAST_HOST_KEY = Symbol.for("dsh-plugin-core/toast-host");
|
|
55006
55069
|
/** 全局单例:已注册则直接返回(不触发 create),否则建一个并注册。 */
|
|
@@ -55013,7 +55076,7 @@ window.__ModuleLoader__.load({
|
|
|
55013
55076
|
return created;
|
|
55014
55077
|
}
|
|
55015
55078
|
//#endregion
|
|
55016
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
55079
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/feedback/Toast.js
|
|
55017
55080
|
const DEFAULT_MS = 2600;
|
|
55018
55081
|
const ROOT_ID = "dshpc-toast-root";
|
|
55019
55082
|
function currentTheme() {
|
|
@@ -55214,7 +55277,7 @@ window.__ModuleLoader__.load({
|
|
|
55214
55277
|
});
|
|
55215
55278
|
}
|
|
55216
55279
|
//#endregion
|
|
55217
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
55280
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/layout/SplitGroup.js
|
|
55218
55281
|
/**
|
|
55219
55282
|
* 拼接外壳 —— 两个控件在外观上焊成一体(L2 组件皮肤,P1)
|
|
55220
55283
|
*
|
|
@@ -55248,7 +55311,7 @@ window.__ModuleLoader__.load({
|
|
|
55248
55311
|
}, props.children);
|
|
55249
55312
|
}
|
|
55250
55313
|
//#endregion
|
|
55251
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
55314
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/Field.js
|
|
55252
55315
|
/**
|
|
55253
55316
|
* 输入类控件 —— **全站唯一实现**(L2 组件皮肤,P3)
|
|
55254
55317
|
*
|
|
@@ -55274,15 +55337,17 @@ window.__ModuleLoader__.load({
|
|
|
55274
55337
|
function Input(props) {
|
|
55275
55338
|
ensureComponentStyles("field", FIELD_CSS);
|
|
55276
55339
|
const { value, onChange, placeholder, size = "lg", error, disabled, type, icon, className, style } = props;
|
|
55340
|
+
const locked = useOverlayLocked();
|
|
55341
|
+
const off = disabled === true || locked;
|
|
55277
55342
|
const [focused, setFocused] = (0, react$1.useState)(false);
|
|
55278
55343
|
const search = type === "search";
|
|
55279
|
-
const showClear = search && value !== "" && focused &&
|
|
55344
|
+
const showClear = search && value !== "" && focused && !off;
|
|
55280
55345
|
const input = (0, react$1.createElement)("input", {
|
|
55281
55346
|
ref: props.inputRef,
|
|
55282
55347
|
type: type ?? "text",
|
|
55283
55348
|
value,
|
|
55284
55349
|
placeholder,
|
|
55285
|
-
disabled,
|
|
55350
|
+
disabled: off,
|
|
55286
55351
|
"aria-label": props["aria-label"],
|
|
55287
55352
|
title: props.title,
|
|
55288
55353
|
className: `dshpc-input dshpc-input${sizeClass(size)}${error === true ? " dshpc-input--error" : ""}${className !== void 0 && className !== "" ? ` ${className}` : ""}`,
|
|
@@ -55316,7 +55381,7 @@ window.__ModuleLoader__.load({
|
|
|
55316
55381
|
}) : null), props.hint);
|
|
55317
55382
|
}
|
|
55318
55383
|
//#endregion
|
|
55319
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
55384
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/InputGroup.js
|
|
55320
55385
|
/**
|
|
55321
55386
|
* 组合输入框 —— 输入框 + 后置按钮组(+ 可选前置标题)焊成一体(L2 组件皮肤,P3)
|
|
55322
55387
|
*
|
|
@@ -55432,7 +55497,7 @@ window.__ModuleLoader__.load({
|
|
|
55432
55497
|
}, nodes), props.hint);
|
|
55433
55498
|
}
|
|
55434
55499
|
//#endregion
|
|
55435
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
55500
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/inputs/Textarea.js
|
|
55436
55501
|
/**
|
|
55437
55502
|
* 多行文本输入(P3 输入类家族唯一实现;皮肤见 controls-css.ts 的 `.dshpc-textarea`)。
|
|
55438
55503
|
*
|
|
@@ -55443,12 +55508,13 @@ window.__ModuleLoader__.load({
|
|
|
55443
55508
|
function Textarea(props) {
|
|
55444
55509
|
ensureComponentStyles("field", FIELD_CSS);
|
|
55445
55510
|
const { value, onChange, placeholder, error, disabled, id, rows, spellCheck, className, style } = props;
|
|
55511
|
+
const off = disabled === true || useOverlayLocked();
|
|
55446
55512
|
const box = (0, react$1.createElement)("textarea", {
|
|
55447
55513
|
id,
|
|
55448
55514
|
rows,
|
|
55449
55515
|
value,
|
|
55450
55516
|
placeholder,
|
|
55451
|
-
disabled,
|
|
55517
|
+
disabled: off,
|
|
55452
55518
|
spellCheck: spellCheck === true,
|
|
55453
55519
|
"aria-label": props["aria-label"],
|
|
55454
55520
|
className: `dshpc-textarea${error === true ? " dshpc-textarea--error" : ""}${className !== void 0 && className !== "" ? ` ${className}` : ""}`,
|
|
@@ -55492,7 +55558,7 @@ window.__ModuleLoader__.load({
|
|
|
55492
55558
|
return true;
|
|
55493
55559
|
}
|
|
55494
55560
|
//#endregion
|
|
55495
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
55561
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/ui/layout/QuickToolbar.js
|
|
55496
55562
|
/**
|
|
55497
55563
|
* 快捷工具栏(UI 基础层):**右侧悬浮的一列圆钮**,内置「回到顶部」,并可挂自定义按钮。
|
|
55498
55564
|
*
|
|
@@ -55738,64 +55804,709 @@ window.__ModuleLoader__.load({
|
|
|
55738
55804
|
}, ...rendered.map((entry) => renderItem(entry, leavingSet.has(entry.id))));
|
|
55739
55805
|
}
|
|
55740
55806
|
//#endregion
|
|
55741
|
-
//#region src/client/
|
|
55742
|
-
/**
|
|
55743
|
-
const
|
|
55744
|
-
|
|
55745
|
-
|
|
55746
|
-
|
|
55747
|
-
|
|
55748
|
-
|
|
55749
|
-
|
|
55750
|
-
|
|
55751
|
-
|
|
55752
|
-
|
|
55753
|
-
|
|
55754
|
-
|
|
55755
|
-
|
|
55756
|
-
|
|
55757
|
-
|
|
55758
|
-
|
|
55807
|
+
//#region src/client/locales.ts
|
|
55808
|
+
/** 中文(默认档)。 */
|
|
55809
|
+
const zh = {
|
|
55810
|
+
backToConversation: "返回会话",
|
|
55811
|
+
panelTitle: "蓝鲸任务台账",
|
|
55812
|
+
configEntryLabel: "入口位置",
|
|
55813
|
+
configEntryFirst: "一级菜单",
|
|
55814
|
+
configEntryMore: "更多",
|
|
55815
|
+
configEntryHint: "放在左侧栏一级,或收进侧栏底部的「更多」菜单。",
|
|
55816
|
+
configNameLabel: "显示名称",
|
|
55817
|
+
configNameHint: "留空即用默认名「蓝鲸任务台账」;填成与默认名相同则不保存这一项。",
|
|
55818
|
+
configNameInvalid: "这个名称不可用。",
|
|
55819
|
+
configOverridden: "自定义",
|
|
55820
|
+
configReset: "恢复默认",
|
|
55821
|
+
configGithub: "访问 GitHub",
|
|
55822
|
+
configComponents: "蓝鲸组件库",
|
|
55823
|
+
configSave: "保存",
|
|
55824
|
+
configSaving: "保存中…",
|
|
55825
|
+
configSaveFailed: "保存失败,请重试",
|
|
55826
|
+
configReadOnly: "此部署下的设置为只读",
|
|
55827
|
+
configUnavailable: "设置当前不可用",
|
|
55828
|
+
refresh: "刷新",
|
|
55829
|
+
refreshing: "刷新中",
|
|
55830
|
+
loading: "读取中…",
|
|
55831
|
+
retry: "重试",
|
|
55832
|
+
loadFailed: "读取失败",
|
|
55833
|
+
degradedToastTitle: "部分台账读取失败({n} 个)",
|
|
55834
|
+
degradedItem: "{title}:{message}",
|
|
55835
|
+
settingsEntry: "身份与设置",
|
|
55836
|
+
settingsTitle: "身份与设置",
|
|
55837
|
+
settingsBack: "返回看板",
|
|
55838
|
+
settingsSwitchUser: "切换身份",
|
|
55839
|
+
settingsRenameUser: "修改昵称",
|
|
55840
|
+
settingsRenamePartial: "部分台账没改通",
|
|
55841
|
+
settingsRenameFailedTitle: "改昵称失败",
|
|
55842
|
+
settingsGoCreate: "创建身份",
|
|
55843
|
+
settingsUserModalTitle: "台账用户管理",
|
|
55844
|
+
settingsNoIdentityTitle: "未创建身份",
|
|
55845
|
+
settingsNoIdentityHint: "创建后,任务的认领、执行与结案均记入该身份。",
|
|
55846
|
+
settingsNamePlaceholder: "昵称",
|
|
55847
|
+
settingsCreate: "创建身份",
|
|
55848
|
+
settingsCreateUser: "创建新用户",
|
|
55849
|
+
settingsSharedUsers: "通用用户",
|
|
55850
|
+
settingsUserModalConfirm: "确定",
|
|
55851
|
+
settingsColWorkspace: "工作区",
|
|
55852
|
+
settingsColName: "名字",
|
|
55853
|
+
settingsColAction: "使用",
|
|
55854
|
+
settingsDeleteUser: "删除",
|
|
55855
|
+
settingsUseConfirmTitle: "切换台账用户",
|
|
55856
|
+
settingsUseConfirmBody: "确定使用 @{name} 作为你的台账用户吗?切换后,任务的认领、推进与结案都将记录在该用户名下。",
|
|
55857
|
+
settingsUseConfirmOk: "确定使用",
|
|
55858
|
+
settingsDeleteConfirmTitle: "从台账移除用户",
|
|
55859
|
+
settingsDeleteConfirmBody: "确定移除 @{name} 吗?该用户在各台账名册中的登记会一并删除;若某个台账里他名下仍有任务,那本台账不会删。已结案的历史记录不受影响。",
|
|
55860
|
+
settingsDeleteConfirmOk: "移除",
|
|
55861
|
+
settingsForgetKeptRow: "{workspace}:名下尚有 {tasks} 个未结任务,已保留",
|
|
55862
|
+
settingsForgetFailedRow: "{workspace}:{error}",
|
|
55863
|
+
settingsForgetDone: "@{name} 已从全部台账移除",
|
|
55864
|
+
settingsForgetDoneCount: "已移除 {count} 本台账",
|
|
55865
|
+
settingsForgetPartialTitle: "@{name} 移除未完成",
|
|
55866
|
+
settingsForgetFailedTitle: "@{name} 移除失败",
|
|
55867
|
+
settingsForgetStep: "{step}({workspace})",
|
|
55868
|
+
settingsCreateDone: "已创建身份 @{name}",
|
|
55869
|
+
settingsSwitchDone: "已切换到 @{name}",
|
|
55870
|
+
settingsRosterEmpty: "所列台账中暂无已创建的身份。",
|
|
55871
|
+
settingsFailed: "操作未成功:{message}",
|
|
55872
|
+
settingsUseThis: "使用",
|
|
55873
|
+
settingsDirsTitle: "台账目录",
|
|
55874
|
+
settingsDirsHint: "看板仅汇总下列目录中的台账。关闭「显示」后,该目录的数据不再出现在看板的统计与筛选中;台账数据本身不受影响。",
|
|
55875
|
+
settingsDirsEmpty: "尚未登记任何台账目录。",
|
|
55876
|
+
settingsDirsAdd: "添加目录",
|
|
55877
|
+
settingsDirsFilterAll: "所有",
|
|
55878
|
+
settingsDirsFilterShown: "显示",
|
|
55879
|
+
settingsDirsFilterHidden: "隐藏",
|
|
55880
|
+
settingsDirsFilterEmpty: "该筛选下没有台账目录。",
|
|
55881
|
+
settingsDirVisible: "显示",
|
|
55882
|
+
settingsDirRename: "重命名",
|
|
55883
|
+
settingsDirRemove: "移除",
|
|
55884
|
+
settingsDirRemoveConfirmTitle: "从看板移除「{name}」?",
|
|
55885
|
+
settingsDirRemoveConfirmBody: "本次操作仅将该台账从看板的管理与查看列表中移除,不会删除或改动该目录下的任何文件与台账数据;如需重新纳入看板,可通过「添加目录」再次登记。",
|
|
55886
|
+
settingsDirRemoveConfirmOk: "确认移除",
|
|
55887
|
+
settingsDirOpFailed: "台账目录未更新",
|
|
55888
|
+
settingsRenamePlaceholder: "新名称(留空则沿用目录名)",
|
|
55889
|
+
settingsSave: "保存",
|
|
55890
|
+
settingsCancel: "取消",
|
|
55891
|
+
settingsPathCopied: "复制完成",
|
|
55892
|
+
settingsPathCopy: "复制路径",
|
|
55893
|
+
settingsAddInvalid: "所选目录不含台账",
|
|
55894
|
+
settingsAddInvalidBody: "该目录不是台账根目录,其直接下级目录中也未发现台账根。请选择台账根目录,或包含台账的上级目录。",
|
|
55895
|
+
settingsAddExisted: "该目录已在监控清单中",
|
|
55896
|
+
settingsAddExistedBody: "无需重复添加,台账监控范围未发生变化。",
|
|
55897
|
+
settingsAddDone: "已添加台账目录",
|
|
55898
|
+
settingsAddDoneBody: "「{name}」已纳入台账监控。",
|
|
55899
|
+
settingsAddDoneMany: "添加成功",
|
|
55900
|
+
settingsAddDoneManyBody: "已添加 {count} 个台账目录:{names}",
|
|
55901
|
+
settingsListSep: "、",
|
|
55902
|
+
settingsFlow1: "安装 Skill",
|
|
55903
|
+
settingsFlow1Lead: "DeepSeek-harness 无需安装,插件已自带。",
|
|
55904
|
+
settingsFlow1Sub: "在其他 Agent 上安装",
|
|
55905
|
+
settingsFlow2: "工作区操作",
|
|
55906
|
+
settingsFlow2Create: "新建:说「建一个新任务:xxx」。",
|
|
55907
|
+
settingsFlow2Exec: "执行:Agent 进度自动写进台账。",
|
|
55908
|
+
settingsFlow2Close: "结束:说「这个任务结束」,Agent 收尾结案。",
|
|
55909
|
+
settingsFlow3: "面板查询",
|
|
55910
|
+
settingsFlow3Todo: "在办:执行中的任务与待认领项",
|
|
55911
|
+
settingsFlow3History: "历史:本项目已结案的任务数量",
|
|
55912
|
+
settingsFlow3Stats: "设置:多 Agent 安装、台账目录管理",
|
|
55913
|
+
settingsColDir: "台账名",
|
|
55914
|
+
settingsColPath: "路径",
|
|
55915
|
+
settingsColActions: "操作",
|
|
55916
|
+
statMyActive: "我的待办",
|
|
55917
|
+
statMyOverdueHint: "逾期 {n}",
|
|
55918
|
+
statMyStaleHint: "停滞 {n}",
|
|
55919
|
+
statOpen: "待认领",
|
|
55920
|
+
statOpenHint: "最长等待 {n} 天",
|
|
55921
|
+
statDoing: "进行中",
|
|
55922
|
+
statDoingHint: "他人在办 {n}",
|
|
55923
|
+
statDoingAllMine: "均为我负责",
|
|
55924
|
+
statBacklog: "积压",
|
|
55925
|
+
statOverdue: "逾期",
|
|
55926
|
+
statStale: "停滞",
|
|
55927
|
+
statBacklogHint: "占待认领 {n}%",
|
|
55928
|
+
statOverdueHint: "占进行中 {n}%",
|
|
55929
|
+
statStaleHint: "占进行中 {n}%",
|
|
55930
|
+
statStaleTitle: "停滞 = 进行中满 {n} 天没更新",
|
|
55931
|
+
statOverdueTitle: "逾期 = 认领后满 {n} 天还没结案",
|
|
55932
|
+
statBacklogTitle: "积压 = 待认领满 {n} 天没人接",
|
|
55933
|
+
statWeekDone: "本周结案",
|
|
55934
|
+
statLastWeekDone: "上周结案",
|
|
55935
|
+
statWeekSplit: "完成 {done} · 取消 {cancelled}",
|
|
55936
|
+
statDoneOnly: "完成 {n}",
|
|
55937
|
+
statCancelOnly: "取消 {n}",
|
|
55938
|
+
metaDivider: "丨",
|
|
55939
|
+
errTimeout: "请求超时({ms}ms 未响应)",
|
|
55940
|
+
errEmptyBody: "响应没有内容(响应流不可读)",
|
|
55941
|
+
errRenameFailed: "摘人失败",
|
|
55942
|
+
errRenameInterrupted: "摘人没有返回结果(连接中断)",
|
|
55943
|
+
errTaskActionFailed: "任务动作失败",
|
|
55944
|
+
errTaskActionInterrupted: "任务动作没有返回结果(连接中断)",
|
|
55945
|
+
errRemoteRefused: "远端拒绝:{detail}",
|
|
55946
|
+
daysNone: "—",
|
|
55947
|
+
daysValue: "{n} 天",
|
|
55948
|
+
chartDone: "结案",
|
|
55949
|
+
chartClosed: "已结任务",
|
|
55950
|
+
chartFinished: "完成",
|
|
55951
|
+
chartCancelled: "取消",
|
|
55952
|
+
chartOpen: "未结任务",
|
|
55953
|
+
chartCreatedTasks: "新建任务",
|
|
55954
|
+
chartEmpty: "还没有可统计的记录",
|
|
55955
|
+
chartPartial: "{from} 起才有台账数据",
|
|
55956
|
+
chartMine: "只看我的",
|
|
55957
|
+
chartDoing: "进行中",
|
|
55958
|
+
chartWaiting: "待认领",
|
|
55959
|
+
periodRange: "{from} ~ {to}",
|
|
55960
|
+
statusLabel: "状态",
|
|
55961
|
+
statusActive: "进行中",
|
|
55962
|
+
statusOpen: "待认领",
|
|
55963
|
+
statusBacklog: "积压",
|
|
55964
|
+
statusOverdue: "逾期",
|
|
55965
|
+
statusStale: "停滞",
|
|
55966
|
+
tipOpen: "任务创建于 {created}\n尚未有人认领",
|
|
55967
|
+
tipBacklog: "任务创建于 {created}\n无人认领已满 {d}",
|
|
55968
|
+
tipDoing: "{who}\n开始执行:{started}\n最后更新:{updated}",
|
|
55969
|
+
tipOverdue: "{who}\n开始执行:{started}\n最后更新:{updated}\n已逾期 {d}",
|
|
55970
|
+
tipStale: "{who}\n开始执行:{started}\n最后更新:{updated}\n已停滞 {d}",
|
|
55971
|
+
workspaceLabel: "台账",
|
|
55972
|
+
workspaceAll: "全部台账",
|
|
55973
|
+
searchPlaceholder: "搜索",
|
|
55974
|
+
regionMine: "我的待办",
|
|
55975
|
+
regionAll: "全部",
|
|
55976
|
+
ownerLabel: "执行人",
|
|
55977
|
+
ownerAll: "全部执行人",
|
|
55978
|
+
listEmpty: "未找到匹配的任务记录",
|
|
55979
|
+
listEmptyHint: "可切换状态或台账,查看其他记录。",
|
|
55980
|
+
wsLimitHint: "本台账记录较多,此处仅列出前 {n} 条;其余记录未予显示,如需查阅请缩小筛选范围。",
|
|
55981
|
+
ownerUnclaimed: "待认领",
|
|
55982
|
+
timeUnknown: "时间未知",
|
|
55983
|
+
relJustNow: "刚刚",
|
|
55984
|
+
relMinutes: "{n} 分钟前",
|
|
55985
|
+
relHours: "{n} 小时前",
|
|
55986
|
+
relDays: "{n} 天前",
|
|
55987
|
+
relMonths: "{n} 个月前",
|
|
55988
|
+
relYears: "{n} 年前",
|
|
55989
|
+
whenSubmitted: "更新于 {time}",
|
|
55990
|
+
copyTaskId: "点击复制任务 ID",
|
|
55991
|
+
copiedTaskId: "已复制任务 ID",
|
|
55992
|
+
copyFailed: "复制失败",
|
|
55993
|
+
actionClaim: "认领",
|
|
55994
|
+
actionResume: "继续",
|
|
55995
|
+
actionFinish: "完成",
|
|
55996
|
+
actionRelease: "释放",
|
|
55997
|
+
actionCancel: "取消",
|
|
55998
|
+
claimConfirmTitle: "认领任务",
|
|
55999
|
+
claimConfirmBody: "确定认领「{title}」吗?认领后任务归到你名下,状态改为进行中。",
|
|
56000
|
+
claimConfirmOk: "确定认领",
|
|
56001
|
+
releaseConfirmTitle: "释放任务",
|
|
56002
|
+
releaseConfirmBody: "确定释放「{title}」吗?任务会退回公共池,状态回到待认领。",
|
|
56003
|
+
releaseConfirmOk: "确定释放",
|
|
56004
|
+
cancelModalTitle: "取消任务",
|
|
56005
|
+
cancelModalBody: "确定取消「{title}」并归档吗?取消的任务不计入完成,会进历史记录。",
|
|
56006
|
+
cancelModalPlaceholder: "写一句取消的理由(可留空)",
|
|
56007
|
+
cancelModalOk: "确定取消",
|
|
56008
|
+
actionCancelDone: "已取消归档:{title}",
|
|
56009
|
+
deleteModalTitle: "删除任务",
|
|
56010
|
+
deleteModalBody: "确定删除「{title}」吗?删除后所有台账统计都不再计入这条记录,且不能恢复。",
|
|
56011
|
+
deleteModalPlaceholder: "写一句删除留言(可留空)",
|
|
56012
|
+
deleteModalOk: "确定删除",
|
|
56013
|
+
actionDeleteDone: "已删除:{title}",
|
|
56014
|
+
actionDelete: "删除任务",
|
|
56015
|
+
tipDeleteTask: "删除任务",
|
|
56016
|
+
tipDelete: "删除",
|
|
56017
|
+
actionClaimDone: "已认领:{title}",
|
|
56018
|
+
actionReleaseDone: "已释放:{title}",
|
|
56019
|
+
actionFailed: "操作失败:{error}",
|
|
56020
|
+
actionSyncing: "正在同步台账并提交…",
|
|
56021
|
+
actionStepCheck: "正在检查本地台账改动…",
|
|
56022
|
+
actionStepSync: "正在拉取最新台账…",
|
|
56023
|
+
actionStepWrite: "正在写入台账…",
|
|
56024
|
+
actionStepCommit: "正在提交改动…",
|
|
56025
|
+
actionStepPush: "正在推送到远端…",
|
|
56026
|
+
continueNotDshTitle: "此任务不属于 DeepSeek Harness 工作区",
|
|
56027
|
+
continueNotDshBody: "相关提示词已复制,请打开对应的 Agent 粘贴继续任务",
|
|
56028
|
+
continueNotDshCopyFailedBody: "提示词复制失败,请重试或手动复制后到对应的 Agent 继续任务",
|
|
56029
|
+
closeNotDshTitle: "此任务不属于 DeepSeek Harness 工作区",
|
|
56030
|
+
closeNotDshBody: "相关提示词已复制,请打开对应的 Agent 粘贴完成结案,也可以选「直接结案」",
|
|
56031
|
+
closeNotDshCopyFailedBody: "结案提示词复制失败,请重试或手动复制后到对应的 Agent 粘贴完成结案",
|
|
56032
|
+
continueStarted: "已新建会话:{title}",
|
|
56033
|
+
closeModalTitle: "结案任务",
|
|
56034
|
+
closeModalHintAgent: "Agent 会读完当前进度、写出结论与遗留项,然后结案。",
|
|
56035
|
+
closeModalHintManual: "用这句摘要直接结案。",
|
|
56036
|
+
closeModalHintManualOnly: "此台账不在本环境内,无法交给 Agent,请写一句结案摘要。",
|
|
56037
|
+
closeModeManual: "直接结案",
|
|
56038
|
+
closeModeAgent: "交给 Agent 结案",
|
|
56039
|
+
closeModalMode: "结案方式",
|
|
56040
|
+
closeModalNotePlaceholder: "给 Agent 留句话(可留空)",
|
|
56041
|
+
closeModalSummaryPlaceholder: "结案摘要(必填,一句话)",
|
|
56042
|
+
closeModalOkAgent: "交给 Agent",
|
|
56043
|
+
closeModalOkManual: "直接结案",
|
|
56044
|
+
closeViewSession: "Agent 会话中",
|
|
56045
|
+
tipViewSession: "查看会话",
|
|
56046
|
+
closeSessionTitle: "完成:{title}",
|
|
56047
|
+
continueSessionTitle: "继续:{title}",
|
|
56048
|
+
closeStarted: "已交给 Agent 结案:{title}",
|
|
56049
|
+
closeDone: "已结案:{title}",
|
|
56050
|
+
closeNotClosed: "这轮跑完了,但任务没结",
|
|
56051
|
+
closeNotClosedDesc: "去会话里看看它停在哪儿",
|
|
56052
|
+
closeAgentFailed: "Agent 这轮没跑成:{error}",
|
|
56053
|
+
closeNoSessions: "宿主没有提供会话服务,只能手动结案",
|
|
56054
|
+
actionOpenSession: "查看会话",
|
|
56055
|
+
closeInProgress: "Agent 正在结案,完成前不能再点",
|
|
56056
|
+
tipClaim: "将该任务归入本人名下,状态置为进行中",
|
|
56057
|
+
tipResume: "恢复对该任务的推进",
|
|
56058
|
+
tipFinish: "将该任务标记为完成,并归档入历史",
|
|
56059
|
+
tipRelease: "解除本人认领,任务退回公共池",
|
|
56060
|
+
tipCancel: "将该任务标记为取消并归档,不计入完成",
|
|
56061
|
+
viewDetail: "查看详情",
|
|
56062
|
+
fieldCreatorStamp: "创建于 {age}",
|
|
56063
|
+
viewModeLabel: "视图",
|
|
56064
|
+
viewActive: "在办",
|
|
56065
|
+
viewHistory: "历史",
|
|
56066
|
+
backToTop: "回到顶部",
|
|
56067
|
+
quickToolbarAria: "快捷工具栏",
|
|
56068
|
+
historyToday: "今日",
|
|
56069
|
+
historyYesterday: "昨日",
|
|
56070
|
+
historyWeek: "本周",
|
|
56071
|
+
historyLastWeek: "上周",
|
|
56072
|
+
historyMonth: "本月",
|
|
56073
|
+
historyLastMonth: "上月",
|
|
56074
|
+
historyQuarter: "本季度",
|
|
56075
|
+
historyLastQuarter: "上季度",
|
|
56076
|
+
historyEmpty: "所选区间内没有结案记录",
|
|
56077
|
+
historyGranLabel: "粒度",
|
|
56078
|
+
historyGranDay: "日",
|
|
56079
|
+
historyGranWeek: "周",
|
|
56080
|
+
historyGranMonth: "月",
|
|
56081
|
+
historyPrev: "前 {n} {unit}",
|
|
56082
|
+
historyNext: "后 {n} {unit}",
|
|
56083
|
+
historyCancelled: "取消",
|
|
56084
|
+
histColTask: "任务",
|
|
56085
|
+
histColDate: "日期",
|
|
56086
|
+
histColCreator: "创建人",
|
|
56087
|
+
histColOwner: "执行人",
|
|
56088
|
+
histColStart: "开始时间",
|
|
56089
|
+
histColEnd: "结束时间",
|
|
56090
|
+
histColTime: "执行时间",
|
|
56091
|
+
histListLabel: "结案记录",
|
|
56092
|
+
weekdaySun: "星期日",
|
|
56093
|
+
weekdayMon: "星期一",
|
|
56094
|
+
weekdayTue: "星期二",
|
|
56095
|
+
weekdayWed: "星期三",
|
|
56096
|
+
weekdayThu: "星期四",
|
|
56097
|
+
weekdayFri: "星期五",
|
|
56098
|
+
weekdaySat: "星期六",
|
|
56099
|
+
histYearLabel: "年份",
|
|
56100
|
+
histMonthLabel: "月份",
|
|
56101
|
+
month1: "一月",
|
|
56102
|
+
month2: "二月",
|
|
56103
|
+
month3: "三月",
|
|
56104
|
+
month4: "四月",
|
|
56105
|
+
month5: "五月",
|
|
56106
|
+
month6: "六月",
|
|
56107
|
+
month7: "七月",
|
|
56108
|
+
month8: "八月",
|
|
56109
|
+
month9: "九月",
|
|
56110
|
+
month10: "十月",
|
|
56111
|
+
month11: "十一月",
|
|
56112
|
+
month12: "十二月"
|
|
55759
56113
|
};
|
|
56114
|
+
/** English(与 zh 键完全对齐)。 */
|
|
56115
|
+
const en = {
|
|
56116
|
+
backToConversation: "Back to chat",
|
|
56117
|
+
panelTitle: "Whale Ledger",
|
|
56118
|
+
configEntryLabel: "Entry point",
|
|
56119
|
+
configEntryFirst: "Sidebar",
|
|
56120
|
+
configEntryMore: "More menu",
|
|
56121
|
+
configEntryHint: "Show it as a sidebar item, or tuck it into the More menu at the sidebar foot.",
|
|
56122
|
+
configNameLabel: "Display name",
|
|
56123
|
+
configNameHint: "Leave it empty to use the default name (Whale Ledger); saving the default itself stores nothing.",
|
|
56124
|
+
configNameInvalid: "That name is not accepted.",
|
|
56125
|
+
configOverridden: "Custom",
|
|
56126
|
+
configReset: "Restore default",
|
|
56127
|
+
configGithub: "Visit GitHub",
|
|
56128
|
+
configComponents: "dsh-plugin-core",
|
|
56129
|
+
configSave: "Save",
|
|
56130
|
+
configSaving: "Saving…",
|
|
56131
|
+
configSaveFailed: "Save failed, please retry",
|
|
56132
|
+
configReadOnly: "Settings are read-only in this deployment",
|
|
56133
|
+
configUnavailable: "Settings are unavailable right now",
|
|
56134
|
+
refresh: "Refresh",
|
|
56135
|
+
refreshing: "Refreshing",
|
|
56136
|
+
loading: "Loading…",
|
|
56137
|
+
retry: "Retry",
|
|
56138
|
+
loadFailed: "Load failed",
|
|
56139
|
+
degradedToastTitle: "{n} ledger(s) failed to load",
|
|
56140
|
+
degradedItem: "{title}: {message}",
|
|
56141
|
+
settingsEntry: "Identity & settings",
|
|
56142
|
+
settingsTitle: "Identity & settings",
|
|
56143
|
+
settingsBack: "Back to board",
|
|
56144
|
+
settingsSwitchUser: "Switch identity",
|
|
56145
|
+
settingsRenameUser: "Change nickname",
|
|
56146
|
+
settingsRenamePartial: "Some ledgers were not updated",
|
|
56147
|
+
settingsRenameFailedTitle: "Failed to change nickname",
|
|
56148
|
+
settingsGoCreate: "Create identity",
|
|
56149
|
+
settingsUserModalTitle: "Ledger users",
|
|
56150
|
+
settingsNoIdentityTitle: "No identity created",
|
|
56151
|
+
settingsNoIdentityHint: "Once created, claiming, executing and closing a task are recorded under this identity.",
|
|
56152
|
+
settingsNamePlaceholder: "Nickname",
|
|
56153
|
+
settingsCreate: "Create identity",
|
|
56154
|
+
settingsCreateUser: "New user",
|
|
56155
|
+
settingsSharedUsers: "Shared users",
|
|
56156
|
+
settingsUserModalConfirm: "OK",
|
|
56157
|
+
settingsColWorkspace: "Workspace",
|
|
56158
|
+
settingsColName: "Name",
|
|
56159
|
+
settingsColAction: "Use",
|
|
56160
|
+
settingsDeleteUser: "Remove",
|
|
56161
|
+
settingsUseConfirmTitle: "Switch ledger user",
|
|
56162
|
+
settingsUseConfirmBody: "Use @{name} as your ledger user? Claiming, progressing and closing tasks will be recorded under this user.",
|
|
56163
|
+
settingsUseConfirmOk: "Use this user",
|
|
56164
|
+
settingsDeleteConfirmTitle: "Remove user from ledgers",
|
|
56165
|
+
settingsDeleteConfirmBody: "Remove @{name}? The user is dropped from every ledger roster; a ledger where this user still owns tasks is kept. Closed history is untouched.",
|
|
56166
|
+
settingsDeleteConfirmOk: "Remove",
|
|
56167
|
+
settingsForgetKeptRow: "{workspace}: {tasks} open task(s) — entry kept",
|
|
56168
|
+
settingsForgetFailedRow: "{workspace}: {error}",
|
|
56169
|
+
settingsForgetDone: "Identity @{name} removed from all ledgers",
|
|
56170
|
+
settingsForgetDoneCount: "Removed from {count} ledger(s)",
|
|
56171
|
+
settingsForgetPartialTitle: "Identity @{name} partially removed",
|
|
56172
|
+
settingsForgetFailedTitle: "Failed to remove identity @{name}",
|
|
56173
|
+
settingsForgetStep: "{step} ({workspace})",
|
|
56174
|
+
settingsCreateDone: "Created identity @{name}",
|
|
56175
|
+
settingsSwitchDone: "Switched to @{name}",
|
|
56176
|
+
settingsRosterEmpty: "No identity has been created in the listed ledgers.",
|
|
56177
|
+
settingsFailed: "Operation failed: {message}",
|
|
56178
|
+
settingsUseThis: "Use",
|
|
56179
|
+
settingsDirsTitle: "Ledger folders",
|
|
56180
|
+
settingsDirsHint: "Only ledgers in the following folders are summarized. Turning \"Show\" off hides that folder's data from every statistic and filter on the board; the ledger data itself is unaffected.",
|
|
56181
|
+
settingsDirsEmpty: "No ledger folder has been registered.",
|
|
56182
|
+
settingsDirsAdd: "Add folder",
|
|
56183
|
+
settingsDirsFilterAll: "All",
|
|
56184
|
+
settingsDirsFilterShown: "Shown",
|
|
56185
|
+
settingsDirsFilterHidden: "Hidden",
|
|
56186
|
+
settingsDirsFilterEmpty: "No ledger folder matches this filter.",
|
|
56187
|
+
settingsDirVisible: "Show",
|
|
56188
|
+
settingsDirRename: "Rename",
|
|
56189
|
+
settingsDirRemove: "Remove",
|
|
56190
|
+
settingsDirRemoveConfirmTitle: "Remove \"{name}\" from the board?",
|
|
56191
|
+
settingsDirRemoveConfirmBody: "This only takes the ledger out of the board's management and viewing list. No file or ledger data in that folder is deleted or changed; register it again with \"Add folder\" to put it back on the board.",
|
|
56192
|
+
settingsDirRemoveConfirmOk: "Remove",
|
|
56193
|
+
settingsDirOpFailed: "Ledger folders were not updated",
|
|
56194
|
+
settingsRenamePlaceholder: "New name (empty keeps the folder name)",
|
|
56195
|
+
settingsSave: "Save",
|
|
56196
|
+
settingsCancel: "Cancel",
|
|
56197
|
+
settingsPathCopied: "Copied",
|
|
56198
|
+
settingsPathCopy: "Copy path",
|
|
56199
|
+
settingsAddInvalid: "No ledger in this folder",
|
|
56200
|
+
settingsAddInvalidBody: "This folder is not a ledger root, and none of its direct subfolders is one. Choose a ledger root folder, or the folder that contains it.",
|
|
56201
|
+
settingsAddExisted: "Folder already monitored",
|
|
56202
|
+
settingsAddExistedBody: "No need to add it again; the monitored range is unchanged.",
|
|
56203
|
+
settingsAddDone: "Ledger folder added",
|
|
56204
|
+
settingsAddDoneBody: "“{name}” is now monitored.",
|
|
56205
|
+
settingsAddDoneMany: "Ledger folders added",
|
|
56206
|
+
settingsAddDoneManyBody: "{count} ledger folders were added: {names}",
|
|
56207
|
+
settingsListSep: ", ",
|
|
56208
|
+
settingsFlow1: "Install Skill",
|
|
56209
|
+
settingsFlow1Lead: "DeepSeek-harness needs no install — it ships with the plugin.",
|
|
56210
|
+
settingsFlow1Sub: "Install on other agents",
|
|
56211
|
+
settingsFlow2: "Workspace Operations",
|
|
56212
|
+
settingsFlow2Create: "New: say \"create a new task: xxx\".",
|
|
56213
|
+
settingsFlow2Exec: "Run: the agent writes progress to the ledger itself.",
|
|
56214
|
+
settingsFlow2Close: "Finish: say \"this task is done\" and the agent closes it out.",
|
|
56215
|
+
settingsFlow3: "Panel Query",
|
|
56216
|
+
settingsFlow3Todo: "In flight: running tasks and unclaimed items",
|
|
56217
|
+
settingsFlow3History: "History: closed task count for this project",
|
|
56218
|
+
settingsFlow3Stats: "Settings: multi-agent install, ledger folder management",
|
|
56219
|
+
settingsColDir: "Ledger name",
|
|
56220
|
+
settingsColPath: "Path",
|
|
56221
|
+
settingsColActions: "Actions",
|
|
56222
|
+
statMyActive: "My todos",
|
|
56223
|
+
statMyOverdueHint: "overdue {n}",
|
|
56224
|
+
statMyStaleHint: "stale {n}",
|
|
56225
|
+
statOpen: "Unclaimed",
|
|
56226
|
+
statOpenHint: "longest waiting {n} days",
|
|
56227
|
+
statDoing: "In progress",
|
|
56228
|
+
statDoingHint: "others: {n}",
|
|
56229
|
+
statDoingAllMine: "all mine",
|
|
56230
|
+
statBacklog: "Backlog",
|
|
56231
|
+
statOverdue: "Overdue",
|
|
56232
|
+
statStale: "Stale",
|
|
56233
|
+
statBacklogHint: "{n}% of unclaimed",
|
|
56234
|
+
statOverdueHint: "{n}% of active",
|
|
56235
|
+
statStaleHint: "{n}% of active",
|
|
56236
|
+
statStaleTitle: "stale = active with no update for {n}+ days",
|
|
56237
|
+
statOverdueTitle: "overdue = claimed {n}+ days ago and still open",
|
|
56238
|
+
statBacklogTitle: "backlog = unclaimed for {n}+ days",
|
|
56239
|
+
statWeekDone: "Closed this week",
|
|
56240
|
+
statLastWeekDone: "Closed last week",
|
|
56241
|
+
statWeekSplit: "{done}✓ {cancelled}✕",
|
|
56242
|
+
statDoneOnly: "{n}✓",
|
|
56243
|
+
statCancelOnly: "{n}✕",
|
|
56244
|
+
metaDivider: " · ",
|
|
56245
|
+
errTimeout: "Request timed out ({ms}ms without a response)",
|
|
56246
|
+
errEmptyBody: "Empty response body (stream not readable)",
|
|
56247
|
+
errRenameFailed: "Rename failed",
|
|
56248
|
+
errRenameInterrupted: "Rename returned no result (connection dropped)",
|
|
56249
|
+
errTaskActionFailed: "Task action failed",
|
|
56250
|
+
errTaskActionInterrupted: "Task action returned no result (connection dropped)",
|
|
56251
|
+
errRemoteRefused: "Rejected by the remote: {detail}",
|
|
56252
|
+
daysNone: "—",
|
|
56253
|
+
daysValue: "{n}d",
|
|
56254
|
+
chartDone: "Closed",
|
|
56255
|
+
chartClosed: "Closed tasks",
|
|
56256
|
+
chartFinished: "Done",
|
|
56257
|
+
chartCancelled: "Cancelled",
|
|
56258
|
+
chartOpen: "Open tasks",
|
|
56259
|
+
chartCreatedTasks: "Created tasks",
|
|
56260
|
+
chartEmpty: "No records to chart yet",
|
|
56261
|
+
chartPartial: "Ledger data starts {from}",
|
|
56262
|
+
chartMine: "Only mine",
|
|
56263
|
+
chartDoing: "In progress",
|
|
56264
|
+
chartWaiting: "Unclaimed",
|
|
56265
|
+
periodRange: "{from} ~ {to}",
|
|
56266
|
+
statusLabel: "Status",
|
|
56267
|
+
statusActive: "Active",
|
|
56268
|
+
statusOpen: "Unclaimed",
|
|
56269
|
+
statusBacklog: "Backlog",
|
|
56270
|
+
statusOverdue: "Overdue",
|
|
56271
|
+
statusStale: "Stale",
|
|
56272
|
+
tipOpen: "Created on {created}\nNot claimed yet",
|
|
56273
|
+
tipBacklog: "Created on {created}\nUnclaimed for {d}",
|
|
56274
|
+
tipDoing: "{who}\nStarted: {started}\nLast updated: {updated}",
|
|
56275
|
+
tipOverdue: "{who}\nStarted: {started}\nLast updated: {updated}\nOverdue by {d}",
|
|
56276
|
+
tipStale: "{who}\nStarted: {started}\nLast updated: {updated}\nStalled for {d}",
|
|
56277
|
+
workspaceLabel: "Ledger",
|
|
56278
|
+
workspaceAll: "All ledgers",
|
|
56279
|
+
searchPlaceholder: "Search",
|
|
56280
|
+
regionMine: "My todos",
|
|
56281
|
+
regionAll: "All",
|
|
56282
|
+
ownerLabel: "Owner",
|
|
56283
|
+
ownerAll: "Anyone",
|
|
56284
|
+
listEmpty: "No matching task records",
|
|
56285
|
+
listEmptyHint: "Switch status or ledger to see other records.",
|
|
56286
|
+
wsLimitHint: "This ledger has more records than shown; only the first {n} are listed. Narrow the filters to see the rest.",
|
|
56287
|
+
ownerUnclaimed: "unclaimed",
|
|
56288
|
+
timeUnknown: "unknown time",
|
|
56289
|
+
relJustNow: "just now",
|
|
56290
|
+
relMinutes: "{n} min ago",
|
|
56291
|
+
relHours: "{n} h ago",
|
|
56292
|
+
relDays: "{n} d ago",
|
|
56293
|
+
relMonths: "{n} mo ago",
|
|
56294
|
+
relYears: "{n} y ago",
|
|
56295
|
+
whenSubmitted: "updated {time}",
|
|
56296
|
+
copyTaskId: "Click to copy task ID",
|
|
56297
|
+
copiedTaskId: "Task ID copied",
|
|
56298
|
+
copyFailed: "Copy failed",
|
|
56299
|
+
actionClaim: "Claim",
|
|
56300
|
+
actionResume: "Resume",
|
|
56301
|
+
actionFinish: "Finish",
|
|
56302
|
+
actionRelease: "Release",
|
|
56303
|
+
actionCancel: "Cancel",
|
|
56304
|
+
claimConfirmTitle: "Claim task",
|
|
56305
|
+
claimConfirmBody: "Claim “{title}”? It moves the task under your name and sets it to in progress.",
|
|
56306
|
+
claimConfirmOk: "Claim it",
|
|
56307
|
+
releaseConfirmTitle: "Release task",
|
|
56308
|
+
releaseConfirmBody: "Release “{title}”? It goes back to the public pool and returns to unclaimed.",
|
|
56309
|
+
releaseConfirmOk: "Release it",
|
|
56310
|
+
cancelModalTitle: "Cancel task",
|
|
56311
|
+
cancelModalBody: "Cancel “{title}” and archive it? Cancelled tasks don't count as done; they go to history.",
|
|
56312
|
+
cancelModalPlaceholder: "One line on why (optional)",
|
|
56313
|
+
cancelModalOk: "Cancel it",
|
|
56314
|
+
actionCancelDone: "Cancelled: {title}",
|
|
56315
|
+
deleteModalTitle: "Delete task",
|
|
56316
|
+
deleteModalBody: "Delete “{title}”? This record will be excluded from all ledger statistics and cannot be restored.",
|
|
56317
|
+
deleteModalPlaceholder: "One line as a note (optional)",
|
|
56318
|
+
deleteModalOk: "Delete it",
|
|
56319
|
+
actionDeleteDone: "Deleted: {title}",
|
|
56320
|
+
actionDelete: "Delete task",
|
|
56321
|
+
tipDeleteTask: "Delete task",
|
|
56322
|
+
tipDelete: "Delete",
|
|
56323
|
+
actionClaimDone: "Claimed: {title}",
|
|
56324
|
+
actionReleaseDone: "Released: {title}",
|
|
56325
|
+
actionFailed: "Action failed: {error}",
|
|
56326
|
+
actionSyncing: "Syncing the ledger and committing…",
|
|
56327
|
+
actionStepCheck: "Checking local ledger changes…",
|
|
56328
|
+
actionStepSync: "Pulling the latest ledger…",
|
|
56329
|
+
actionStepWrite: "Writing the ledger…",
|
|
56330
|
+
actionStepCommit: "Committing changes…",
|
|
56331
|
+
actionStepPush: "Pushing to the remote…",
|
|
56332
|
+
continueNotDshTitle: "This task does not belong to a DeepSeek Harness workspace",
|
|
56333
|
+
continueNotDshBody: "The prompt has been copied — please open the matching agent and paste it to continue.",
|
|
56334
|
+
continueNotDshCopyFailedBody: "Copying the prompt failed — copy it manually, then paste it into the matching agent.",
|
|
56335
|
+
closeNotDshTitle: "This task does not belong to a DeepSeek Harness workspace",
|
|
56336
|
+
closeNotDshBody: "The prompt has been copied — please open the matching agent and paste it to close the task, or pick “Close now”.",
|
|
56337
|
+
closeNotDshCopyFailedBody: "Copying the closing prompt failed — copy it manually, then paste it into the matching agent to close the task.",
|
|
56338
|
+
continueStarted: "Session started: {title}",
|
|
56339
|
+
closeModalTitle: "Close task",
|
|
56340
|
+
closeModalHintAgent: "An agent reads the current progress, writes the conclusion and leftovers, then closes.",
|
|
56341
|
+
closeModalHintManual: "Close right away with this summary.",
|
|
56342
|
+
closeModalHintManualOnly: "This ledger is outside this environment, so no agent is available — write a one-line summary.",
|
|
56343
|
+
closeModeManual: "Close now",
|
|
56344
|
+
closeModeAgent: "Hand to agent",
|
|
56345
|
+
closeModalMode: "Close mode",
|
|
56346
|
+
closeModalNotePlaceholder: "Leave a note for the agent (optional)",
|
|
56347
|
+
closeModalSummaryPlaceholder: "Closing summary (required, one line)",
|
|
56348
|
+
closeModalOkAgent: "Hand to agent",
|
|
56349
|
+
closeModalOkManual: "Close now",
|
|
56350
|
+
closeViewSession: "Agent running",
|
|
56351
|
+
tipViewSession: "View session",
|
|
56352
|
+
closeSessionTitle: "Close: {title}",
|
|
56353
|
+
continueSessionTitle: "Continue: {title}",
|
|
56354
|
+
closeStarted: "Handed to an agent: {title}",
|
|
56355
|
+
closeDone: "Task closed: {title}",
|
|
56356
|
+
closeNotClosed: "The turn finished, but the task is still open",
|
|
56357
|
+
closeNotClosedDesc: "Open the session to see where it stopped",
|
|
56358
|
+
closeAgentFailed: "The agent turn failed: {error}",
|
|
56359
|
+
closeNoSessions: "This host exposes no session service — close it manually",
|
|
56360
|
+
actionOpenSession: "Open session",
|
|
56361
|
+
closeInProgress: "An agent is closing this task; wait for it to finish",
|
|
56362
|
+
tipClaim: "assign this task to me and set it to in progress",
|
|
56363
|
+
tipResume: "resume work on this task",
|
|
56364
|
+
tipFinish: "mark this task as done and archive it",
|
|
56365
|
+
tipRelease: "drop my claim and return the task to the public pool",
|
|
56366
|
+
tipCancel: "mark this task as cancelled and archive it; not counted as done",
|
|
56367
|
+
viewDetail: "View details",
|
|
56368
|
+
fieldCreatorStamp: "created {age}",
|
|
56369
|
+
viewModeLabel: "View",
|
|
56370
|
+
viewActive: "Active",
|
|
56371
|
+
viewHistory: "History",
|
|
56372
|
+
backToTop: "Back to top",
|
|
56373
|
+
quickToolbarAria: "Quick toolbar",
|
|
56374
|
+
historyToday: "Today",
|
|
56375
|
+
historyYesterday: "Yesterday",
|
|
56376
|
+
historyWeek: "This week",
|
|
56377
|
+
historyLastWeek: "Last week",
|
|
56378
|
+
historyMonth: "This month",
|
|
56379
|
+
historyLastMonth: "Last month",
|
|
56380
|
+
historyQuarter: "This quarter",
|
|
56381
|
+
historyLastQuarter: "Last quarter",
|
|
56382
|
+
historyEmpty: "No closed tasks in the selected range",
|
|
56383
|
+
historyGranLabel: "Granularity",
|
|
56384
|
+
historyGranDay: "Day",
|
|
56385
|
+
historyGranWeek: "Week",
|
|
56386
|
+
historyGranMonth: "Month",
|
|
56387
|
+
historyPrev: "Previous {n} {unit}s",
|
|
56388
|
+
historyNext: "Next {n} {unit}s",
|
|
56389
|
+
historyCancelled: "Cancelled",
|
|
56390
|
+
histColTask: "Task",
|
|
56391
|
+
histColDate: "Date",
|
|
56392
|
+
histColCreator: "Creator",
|
|
56393
|
+
histColOwner: "Owner",
|
|
56394
|
+
histColStart: "Started",
|
|
56395
|
+
histColEnd: "Closed",
|
|
56396
|
+
histColTime: "Execution",
|
|
56397
|
+
histListLabel: "Closed tasks",
|
|
56398
|
+
weekdaySun: "Sunday",
|
|
56399
|
+
weekdayMon: "Monday",
|
|
56400
|
+
weekdayTue: "Tuesday",
|
|
56401
|
+
weekdayWed: "Wednesday",
|
|
56402
|
+
weekdayThu: "Thursday",
|
|
56403
|
+
weekdayFri: "Friday",
|
|
56404
|
+
weekdaySat: "Saturday",
|
|
56405
|
+
histYearLabel: "Year",
|
|
56406
|
+
histMonthLabel: "Month",
|
|
56407
|
+
month1: "Jan",
|
|
56408
|
+
month2: "Feb",
|
|
56409
|
+
month3: "Mar",
|
|
56410
|
+
month4: "Apr",
|
|
56411
|
+
month5: "May",
|
|
56412
|
+
month6: "Jun",
|
|
56413
|
+
month7: "Jul",
|
|
56414
|
+
month8: "Aug",
|
|
56415
|
+
month9: "Sep",
|
|
56416
|
+
month10: "Oct",
|
|
56417
|
+
month11: "Nov",
|
|
56418
|
+
month12: "Dec"
|
|
56419
|
+
};
|
|
56420
|
+
/** 把宿主给的无参 t 包成带占位符替换的 t(模板一律 `{name}`,不依赖宿主是否支持 params)。 */
|
|
56421
|
+
function interpolateTranslate(base) {
|
|
56422
|
+
return (key, params) => {
|
|
56423
|
+
const raw = base(key);
|
|
56424
|
+
if (params === void 0) return raw;
|
|
56425
|
+
return raw.replace(/\{(\w+)\}/g, (match, name) => name in params ? String(params[name]) : match);
|
|
56426
|
+
};
|
|
56427
|
+
}
|
|
56428
|
+
/** 键名兜底:宿主没给 t 席位时用(键名绝不上界面)。 */
|
|
56429
|
+
function fallbackTranslate(key, params) {
|
|
56430
|
+
return interpolateTranslate((name) => zh[name] ?? name)(key, params);
|
|
56431
|
+
}
|
|
56432
|
+
/**
|
|
56433
|
+
* 模块级 t 席位:**非组件代码**(api 的错误消息、会话模块)用 —— 那两处拿不到组件 props
|
|
56434
|
+
* 里的 `t`。入口在 locale 就绪后覆盖;没覆盖就按中文词典兜底(`fallbackTranslate`)。
|
|
56435
|
+
*/
|
|
56436
|
+
let activeTranslate = null;
|
|
56437
|
+
function setActiveTranslate(next) {
|
|
56438
|
+
activeTranslate = next;
|
|
56439
|
+
}
|
|
56440
|
+
const globalT = (key, params) => (activeTranslate ?? fallbackTranslate)(key, params);
|
|
56441
|
+
//#endregion
|
|
56442
|
+
//#region src/client/api.ts
|
|
56443
|
+
/**
|
|
56444
|
+
* 数据面取数**单源**:所有 client → host 的 HTTP 都在这里,页面不许各写一份 fetch。
|
|
56445
|
+
*
|
|
56446
|
+
* 纪律:只做传输与形状校验,不造兜底假值(DSH 插件规则「数据真实」)——
|
|
56447
|
+
* 失败就抛,由调用方显示错误态;返回什么渲染什么。
|
|
56448
|
+
*
|
|
56449
|
+
* ⚠️ 必须带超时且 abort 要带 reason:一次挂起的请求会让面板永久停在「读取中」,
|
|
56450
|
+
* 而不带 reason 时浏览器把 error.message 填成「signal is aborted without reason」,
|
|
56451
|
+
* 看不出是超时(姊妹仓 2026-10-07 真机教训)。
|
|
56452
|
+
*/
|
|
56453
|
+
/** host 路由前缀(全仓唯一;与 host/routes.ts 的 API_PREFIX 对应)。 */
|
|
56454
|
+
const API_PREFIX = "api/task-ledger";
|
|
56455
|
+
/** 核心 explorer 的只读文件路由(`connectFs` 接它;与 host 的 `FS_ROUTE` 是同一个地址)。 */
|
|
56456
|
+
const FS_PATH = `${API_PREFIX}/fs`;
|
|
56457
|
+
const DEFAULT_TIMEOUT_MS = 8e3;
|
|
56458
|
+
/** 这次失败是不是「没有身份」——是的话整个面板要切成身份页,而不是显示错误。 */
|
|
56459
|
+
function isIdentityMissing(error) {
|
|
56460
|
+
return error !== null && typeof error === "object" && "code" in error && error.code === "LEDGER_IDENTITY_MISSING";
|
|
56461
|
+
}
|
|
56462
|
+
/** host 返回的失败响应(带人话 + 机器可读码)。 */
|
|
56463
|
+
var HttpError = class extends Error {
|
|
56464
|
+
code;
|
|
56465
|
+
constructor(message, code) {
|
|
56466
|
+
super(message);
|
|
56467
|
+
this.name = "HttpError";
|
|
56468
|
+
this.code = code;
|
|
56469
|
+
}
|
|
56470
|
+
};
|
|
56471
|
+
/**
|
|
56472
|
+
* 错误响应榨人话:host 路由(routes.ts)发的是 `{ error, code }`,`error` 是**能直接上界面的**
|
|
56473
|
+
* (带工作区名、台账程序起不来之类的原文)。不带它界面上只剩「HTTP 500」,等于没报错。
|
|
56474
|
+
*/
|
|
56475
|
+
function errorOf(status, body) {
|
|
56476
|
+
let message = "";
|
|
56477
|
+
let code = null;
|
|
56478
|
+
try {
|
|
56479
|
+
const parsed = JSON.parse(body);
|
|
56480
|
+
if (typeof parsed.error === "string") message = parsed.error;
|
|
56481
|
+
if (typeof parsed.code === "string") code = parsed.code;
|
|
56482
|
+
} catch {}
|
|
56483
|
+
if (message === "") message = body.trim().slice(0, 200);
|
|
56484
|
+
return new HttpError(message === "" ? `HTTP ${String(status)}` : `HTTP ${status}:${message}`, code);
|
|
56485
|
+
}
|
|
56486
|
+
/** 带超时的 JSON 取数(相对路径,同源)。 */
|
|
56487
|
+
async function fetchJson(path, init = {}, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
56488
|
+
const controller = new AbortController();
|
|
56489
|
+
const timer = setTimeout(() => {
|
|
56490
|
+
controller.abort(new DOMException(globalT("errTimeout", { ms: timeoutMs }), "TimeoutError"));
|
|
56491
|
+
}, timeoutMs);
|
|
56492
|
+
try {
|
|
56493
|
+
const res = await fetch(`${API_PREFIX}${path}`, {
|
|
56494
|
+
...init,
|
|
56495
|
+
signal: controller.signal,
|
|
56496
|
+
cache: "no-store"
|
|
56497
|
+
});
|
|
56498
|
+
if (!res.ok) throw errorOf(res.status, await res.text().catch(() => ""));
|
|
56499
|
+
return await res.json();
|
|
56500
|
+
} finally {
|
|
56501
|
+
clearTimeout(timer);
|
|
56502
|
+
}
|
|
56503
|
+
}
|
|
55760
56504
|
/**
|
|
55761
|
-
* 错误响应榨人话:host 路由(routes.ts)发的是 `{ error, code }`,`error` 是**能直接上界面的**
|
|
55762
|
-
* (带工作区名、台账程序起不来之类的原文)。不带它界面上只剩「HTTP 500」,等于没报错。
|
|
55763
|
-
*/
|
|
55764
|
-
function errorOf(status, body) {
|
|
55765
|
-
let message = "";
|
|
55766
|
-
let code = null;
|
|
55767
|
-
try {
|
|
55768
|
-
const parsed = JSON.parse(body);
|
|
55769
|
-
if (typeof parsed.error === "string") message = parsed.error;
|
|
55770
|
-
if (typeof parsed.code === "string") code = parsed.code;
|
|
55771
|
-
} catch {}
|
|
55772
|
-
if (message === "") message = body.trim().slice(0, 200);
|
|
55773
|
-
return new HttpError(message === "" ? `HTTP ${String(status)}` : `HTTP ${status}:${message}`, code);
|
|
55774
|
-
}
|
|
55775
|
-
/** 带超时的 JSON 取数(相对路径,同源)。 */
|
|
55776
|
-
async function fetchJson(path, init = {}, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
55777
|
-
const controller = new AbortController();
|
|
55778
|
-
const timer = setTimeout(() => {
|
|
55779
|
-
controller.abort(new DOMException(`请求超时(${timeoutMs}ms 未响应)`, "TimeoutError"));
|
|
55780
|
-
}, timeoutMs);
|
|
55781
|
-
try {
|
|
55782
|
-
const res = await fetch(`${API_PREFIX}${path}`, {
|
|
55783
|
-
...init,
|
|
55784
|
-
signal: controller.signal,
|
|
55785
|
-
cache: "no-store"
|
|
55786
|
-
});
|
|
55787
|
-
if (!res.ok) throw errorOf(res.status, await res.text().catch(() => ""));
|
|
55788
|
-
return await res.json();
|
|
55789
|
-
} finally {
|
|
55790
|
-
clearTimeout(timer);
|
|
55791
|
-
}
|
|
55792
|
-
}
|
|
55793
|
-
/**
|
|
55794
56505
|
* 逐行读 NDJSON 流:每拆出一行交给 `handle`,它返回 true = 到此为止。
|
|
55795
56506
|
* 返回值 `true` 表示被 `handle` 收摊、`false` 表示流读完了还没收摊(调用方按「连接中断」处理)。
|
|
55796
56507
|
*/
|
|
55797
56508
|
async function readLines(res, handle) {
|
|
55798
|
-
if (res.body === null) throw new HttpError("
|
|
56509
|
+
if (res.body === null) throw new HttpError(globalT("errEmptyBody"), null);
|
|
55799
56510
|
const reader = res.body.getReader();
|
|
55800
56511
|
const decoder = new TextDecoder();
|
|
55801
56512
|
let buffer = "";
|
|
@@ -55873,7 +56584,7 @@ window.__ModuleLoader__.load({
|
|
|
55873
56584
|
};
|
|
55874
56585
|
if (event.type === "error") return {
|
|
55875
56586
|
type: "error",
|
|
55876
|
-
error: typeof event.error === "string" ? event.error : "
|
|
56587
|
+
error: typeof event.error === "string" ? event.error : globalT("errRenameFailed"),
|
|
55877
56588
|
code: typeof event.code === "string" ? event.code : null
|
|
55878
56589
|
};
|
|
55879
56590
|
return null;
|
|
@@ -55888,7 +56599,7 @@ window.__ModuleLoader__.load({
|
|
|
55888
56599
|
async function postForgetIdentity(uuid, onStep) {
|
|
55889
56600
|
const controller = new AbortController();
|
|
55890
56601
|
const timer = setTimeout(() => {
|
|
55891
|
-
controller.abort(new DOMException(
|
|
56602
|
+
controller.abort(new DOMException(globalT("errTimeout", { ms: RENAME_TIMEOUT_MS }), "TimeoutError"));
|
|
55892
56603
|
}, RENAME_TIMEOUT_MS);
|
|
55893
56604
|
try {
|
|
55894
56605
|
const res = await fetch(`${API_PREFIX}/identity/forget`, {
|
|
@@ -55915,7 +56626,7 @@ window.__ModuleLoader__.load({
|
|
|
55915
56626
|
return true;
|
|
55916
56627
|
});
|
|
55917
56628
|
const report = reports[0];
|
|
55918
|
-
if (report === void 0) throw new HttpError("
|
|
56629
|
+
if (report === void 0) throw new HttpError(globalT("errRenameInterrupted"), null);
|
|
55919
56630
|
return report;
|
|
55920
56631
|
} finally {
|
|
55921
56632
|
clearTimeout(timer);
|
|
@@ -55948,7 +56659,7 @@ window.__ModuleLoader__.load({
|
|
|
55948
56659
|
};
|
|
55949
56660
|
if (event.type === "error") return {
|
|
55950
56661
|
type: "error",
|
|
55951
|
-
error: typeof event.error === "string" ? event.error : "
|
|
56662
|
+
error: typeof event.error === "string" ? event.error : globalT("errTaskActionFailed"),
|
|
55952
56663
|
code: typeof event.code === "string" ? event.code : null
|
|
55953
56664
|
};
|
|
55954
56665
|
return null;
|
|
@@ -55968,7 +56679,7 @@ window.__ModuleLoader__.load({
|
|
|
55968
56679
|
async function postTaskAction(body, onStep) {
|
|
55969
56680
|
const controller = new AbortController();
|
|
55970
56681
|
const timer = setTimeout(() => {
|
|
55971
|
-
controller.abort(new DOMException(
|
|
56682
|
+
controller.abort(new DOMException(globalT("errTimeout", { ms: TASK_WRITE_TIMEOUT_MS }), "TimeoutError"));
|
|
55972
56683
|
}, TASK_WRITE_TIMEOUT_MS);
|
|
55973
56684
|
try {
|
|
55974
56685
|
const res = await fetch(`${API_PREFIX}/task/action`, {
|
|
@@ -55989,7 +56700,7 @@ window.__ModuleLoader__.load({
|
|
|
55989
56700
|
if (event.type === "error") throw new HttpError(event.error, event.code);
|
|
55990
56701
|
return true;
|
|
55991
56702
|
})) return { ok: true };
|
|
55992
|
-
throw new HttpError("
|
|
56703
|
+
throw new HttpError(globalT("errTaskActionInterrupted"), null);
|
|
55993
56704
|
} finally {
|
|
55994
56705
|
clearTimeout(timer);
|
|
55995
56706
|
}
|
|
@@ -56096,7 +56807,7 @@ window.__ModuleLoader__.load({
|
|
|
56096
56807
|
return String(n);
|
|
56097
56808
|
}
|
|
56098
56809
|
//#endregion
|
|
56099
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
56810
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/official-classes.js
|
|
56100
56811
|
/** 官方注入 style 标签的 data-plugin-css 包前缀(chat 主视图 + ui-tool 工具卡 + ui-deliverables)。 */
|
|
56101
56812
|
const CSS_PKG_PREFIXES = [
|
|
56102
56813
|
"@deepseek-ai/dsh-client-ui-chat/",
|
|
@@ -56182,7 +56893,7 @@ window.__ModuleLoader__.load({
|
|
|
56182
56893
|
return discoverOfficialClasses().get(module)?.get(semantic) ?? null;
|
|
56183
56894
|
}
|
|
56184
56895
|
//#endregion
|
|
56185
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
56896
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/ChatNodeSeat.js
|
|
56186
56897
|
/**
|
|
56187
56898
|
* 官方 TURN_PROCESS_INDEPENDENT_KINDS(lib/client.js:1525):这些 kind 永远不进过程折叠区。
|
|
56188
56899
|
*/
|
|
@@ -56271,7 +56982,7 @@ window.__ModuleLoader__.load({
|
|
|
56271
56982
|
}, inner);
|
|
56272
56983
|
}
|
|
56273
56984
|
//#endregion
|
|
56274
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
56985
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/process-groups.js
|
|
56275
56986
|
/** 官方 INDEPENDENT(process-groups.js:10565;注意与 ChatNodeSeat 的清单不同)。 */
|
|
56276
56987
|
const INDEPENDENT = /* @__PURE__ */ new Set([
|
|
56277
56988
|
"user",
|
|
@@ -56289,13 +57000,15 @@ window.__ModuleLoader__.load({
|
|
|
56289
57000
|
}
|
|
56290
57001
|
/** 官方 reasoning(10578):assistant-step 带非空思考块。 */
|
|
56291
57002
|
function hasReasoning(node) {
|
|
56292
|
-
|
|
56293
|
-
|
|
57003
|
+
const blocks = node.data?.blocks;
|
|
57004
|
+
if (node.kind !== "assistant-step" || !Array.isArray(blocks)) return false;
|
|
57005
|
+
return blocks.some((block) => block?.kind === "reasoning" && (block.text ?? "").trim() !== "");
|
|
56294
57006
|
}
|
|
56295
57007
|
/** 官方 reply(10581):assistant-step 带回复内容(reasoning / tool-call 不算,空文本不算)。 */
|
|
56296
57008
|
function hasReply(node) {
|
|
56297
|
-
|
|
56298
|
-
|
|
57009
|
+
const blocks = node.data?.blocks;
|
|
57010
|
+
if (node.kind !== "assistant-step" || !Array.isArray(blocks)) return false;
|
|
57011
|
+
return blocks.some((block) => {
|
|
56299
57012
|
if (block === null || typeof block !== "object") return false;
|
|
56300
57013
|
if (block.kind === "reasoning" || block.kind === "tool-call") return false;
|
|
56301
57014
|
if (block.kind === "text") return (block.text ?? "").trim() !== "";
|
|
@@ -56483,7 +57196,7 @@ window.__ModuleLoader__.load({
|
|
|
56483
57196
|
return summary.counts.length > 3 ? t("stepProcessMore", { title }) : title;
|
|
56484
57197
|
}
|
|
56485
57198
|
//#endregion
|
|
56486
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
57199
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/ChatGroupSeat.js
|
|
56487
57200
|
/** 官方 PROCESS_ICONS(lib/client.js:2187-2201);工具行图标同源(edit/write=铅笔、generic=sparkle)。 */
|
|
56488
57201
|
const PROCESS_ICONS = {
|
|
56489
57202
|
thinking: official_exports.IconThinkOutlineRegular,
|
|
@@ -56609,10 +57322,10 @@ window.__ModuleLoader__.load({
|
|
|
56609
57322
|
})))));
|
|
56610
57323
|
}
|
|
56611
57324
|
//#endregion
|
|
56612
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
57325
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/session-css.generated.js
|
|
56613
57326
|
const SESSION_CSS = "/* 会话预览(SessionViewModal)自绘样式:只装本包自己的组件(暂存输入区 / fork / 探针等)\n + 两个稳定钩子类(dshpc-sv-frame / dshpc-sv-scroll)。\n 已删:ChangedFiles 卡与 FileDiff 的全部自绘规则(2026-10-24)——官方 ChangedFiles /\n FileDiff 模块类由 officialClass() 运行时发现并挂在元素上,本包不再有一行兜底。\n ⚠️ 2026-10-23 起不再有官方类兜底:镜像官方组件的元素一律挂官方 CSS-module 类名\n (officialClass() 运行时发现,取不到 = 空类、裸结构不白屏)——本包只跑 DSH 宿主、官方样式必在场,\n 自绘一一对应是死代码。要改官方观感走 token 覆盖 / 双类名钩子(见 ChatView.ts 头注),别在这加兜底。\n 类名固定 dshpc-sv-*;颜色一律走 --dshpc-* token(明暗自适应)。\n 外壳(遮罩 / 面板 / 头部 / 关闭钮)= 核心 Modal(size lg)。 */\n/* 会话区 = 普通纵向流:不设高度、不自己滚(滚动与内距归核心 Modal body,用户 2026-10-22 口径)。 */\n.dshpc-sv{display:flex;flex-direction:column;min-width:0;gap:10px}\n\n/* 官方样式未命中时的可见探针(挂在头部副标题行,不占正文)。 */\n.dshpc-sv-probe{font-size:var(--dshpc-font-xs);color:var(--dshpc-warning)}\n\n/* 头部归档标识(官方归档图标 + 「已归档」)。 */\n.dshpc-sv-archived{display:inline-flex;align-items:center;gap:4px;font-size:var(--dshpc-font-xs);font-weight:400;color:var(--dshpc-fg-3)}\n\n/* 内距与滚动全部让给核心 Modal body ⇒ 这里把官方 ChatView.frame / scroll 的内距、\n overflow、高度一律归零(双类名 0,2,0 压过 CSS module,不靠注入顺序)。\n ⚠️ 必须同时把 flex 收掉:官方 scroll 是 flex:1(basis=0),在**自动高**的容器里会把\n 会话区压成 0 高 —— 这正是「内容自管高度」的老毛病,别再放回来。 */\n.dshpc-sv-frame.dshpc-sv-frame{padding-top:0;padding-bottom:0;}\n\n/* 官方组件拿 --dsw-alias-bg-base 做 sticky 遮挡底(思考行展开头等),取值是宿主 app\n 全局基底色,与弹窗面板底不同层 ⇒ 会话区内改指向弹窗面板底(背景保留、颜色贴合)。 */\n.dshpc-sv-frame.dshpc-sv-frame{--dsw-alias-bg-base:var(--dshpc-surface-1);}\n\n.dshpc-sv-scroll.dshpc-sv-scroll{padding:0;overflow:visible;height:auto;max-height:none;flex:none;}\n\n/* 会话区保底:高度由内容决定(撑开由 Modal body 滚)。 */\n.dshpc-sv-chat{flex:none;min-height:0;}\n\n\n.dshpc-sv-assistant{align-self:stretch;font-size:var(--dshpc-font-lg);line-height:1.7;word-break:break-word;}\n\n.dshpc-sv-image{align-self:flex-start;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-3);border:1px dashed var(--dshpc-border);border-radius:var(--dshpc-radius-sm);padding:4px 10px;}\n\n/* 工具卡根(SessionViewModal legacy 兜底渲染直接用;正常 keyed 路径一律挂官方 ToolRow 类)。 */\n.dshpc-sv-tool{flex-direction:column;display:flex;}\n\n.dshpc-sv-notice{align-self:center;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-3);padding:2px 8px;}\n\n\n.dshpc-sv-forkerr{margin:0;font-size:var(--dshpc-font-lg);line-height:var(--dshpc-line-lg);color:var(--dshpc-danger);word-break:break-word;}\n\n.dshpc-sv-forktext{margin:0;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);color:var(--dshpc-fg-2);}\n\n/* ── 暂存输入区(期4:打字 → 确定 → fork 带话跳官方视图)── */\n.dshpc-sv-composer{flex:1;display:flex;align-items:flex-end;gap:8px;flex-wrap:wrap;}\n\n.dshpc-sv-composer textarea{flex:1;min-width:0;resize:none;font:inherit;font-size:var(--dshpc-font-lg);line-height:var(--dshpc-line-lg);color:var(--dshpc-fg);background:var(--dshpc-surface-2);border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);padding:8px 12px;min-height:40px;max-height:120px;}\n\n.dshpc-sv-composer textarea:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:-1px;}\n\n.dshpc-sv-composer-hint{flex:none;font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);padding-bottom:10px;white-space:nowrap;}";
|
|
56614
57327
|
//#endregion
|
|
56615
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
57328
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/ChatView.js
|
|
56616
57329
|
/** 会话区骨架:frame > root > scroll > column(类名一律取官方 ChatView.module.css,取不到 = 空类)。
|
|
56617
57330
|
*
|
|
56618
57331
|
* `dshpc-sv-frame` / `dshpc-sv-scroll` = 本包**稳定钩子类**(不走 officialClass 发现,官方类命中时也照样挂):
|
|
@@ -56731,7 +57444,7 @@ window.__ModuleLoader__.load({
|
|
|
56731
57444
|
}, props.label));
|
|
56732
57445
|
}
|
|
56733
57446
|
//#endregion
|
|
56734
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
57447
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/AskCard.js
|
|
56735
57448
|
const isRecord$3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
56736
57449
|
function parseJson(text) {
|
|
56737
57450
|
try {
|
|
@@ -56861,7 +57574,7 @@ window.__ModuleLoader__.load({
|
|
|
56861
57574
|
}));
|
|
56862
57575
|
}
|
|
56863
57576
|
//#endregion
|
|
56864
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
57577
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/detail-i18n.js
|
|
56865
57578
|
const DETAIL_KEYS = {
|
|
56866
57579
|
"detail.agent.reply": "detailAgentReply",
|
|
56867
57580
|
"detail.agents.count": "detailAgentsCount",
|
|
@@ -57015,7 +57728,7 @@ window.__ModuleLoader__.load({
|
|
|
57015
57728
|
return mapped === void 0 ? key : params === void 0 ? t(mapped) : t(mapped, params);
|
|
57016
57729
|
}
|
|
57017
57730
|
//#endregion
|
|
57018
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
57731
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/control-details.js
|
|
57019
57732
|
const isRecord$2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
57020
57733
|
const arg = (args, key) => typeof args[key] === "string" ? args[key] : "";
|
|
57021
57734
|
function detailJson$1(text) {
|
|
@@ -57770,7 +58483,7 @@ window.__ModuleLoader__.load({
|
|
|
57770
58483
|
}
|
|
57771
58484
|
}
|
|
57772
58485
|
//#endregion
|
|
57773
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
58486
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/ToolDetails.js
|
|
57774
58487
|
const isRecord$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
57775
58488
|
const nonempty = (value) => typeof value === "string" && value.trim() !== "";
|
|
57776
58489
|
const count = (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
@@ -58049,7 +58762,7 @@ window.__ModuleLoader__.load({
|
|
|
58049
58762
|
})))) : null);
|
|
58050
58763
|
}
|
|
58051
58764
|
//#endregion
|
|
58052
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
58765
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/GenericCommandCard.js
|
|
58053
58766
|
/** 官方 TOOL_VARIANTS(tool client.js:83-100,cordis_* 一并保留)。 */
|
|
58054
58767
|
const TOOL_VARIANTS = {
|
|
58055
58768
|
bash: "bash",
|
|
@@ -59000,7 +59713,7 @@ window.__ModuleLoader__.load({
|
|
|
59000
59713
|
}));
|
|
59001
59714
|
}
|
|
59002
59715
|
//#endregion
|
|
59003
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
59716
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/CommandCard.js
|
|
59004
59717
|
/** 官方 GenericCommandCard 模块类(宿主必注入;缺席 = 空串,裸结构不白屏,不写自绘兜底)。 */
|
|
59005
59718
|
const gcc = (semantic) => officialClass("GenericCommandCard", semantic) ?? "";
|
|
59006
59719
|
/** 官方 stateOf:未决 = running;outcome.kind==='error' = error;否则 ok。 */
|
|
@@ -59018,7 +59731,7 @@ window.__ModuleLoader__.load({
|
|
|
59018
59731
|
const title = node.name ?? t("commandTitle");
|
|
59019
59732
|
const state = stateOf(outcome);
|
|
59020
59733
|
const running = state === "running";
|
|
59021
|
-
const body = text
|
|
59734
|
+
const body = text?.includes("\n") === true ? text : null;
|
|
59022
59735
|
const open = expanded && body !== null;
|
|
59023
59736
|
const toggle = (0, react$1.useCallback)(() => {
|
|
59024
59737
|
setExpanded((value) => !value);
|
|
@@ -59052,7 +59765,7 @@ window.__ModuleLoader__.load({
|
|
|
59052
59765
|
}));
|
|
59053
59766
|
}
|
|
59054
59767
|
//#endregion
|
|
59055
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
59768
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/message-chrome.js
|
|
59056
59769
|
/**
|
|
59057
59770
|
* 官方 formatRunDuration(0.2.x,lib/client.js:5067-5095):整秒;≥1 分带分;≥1 小时带小时。
|
|
59058
59771
|
* 单位是独立片段(`duration.hourUnit` / `minuteUnit` / `secondUnit`),不是一条带占位的模板。
|
|
@@ -59180,7 +59893,7 @@ window.__ModuleLoader__.load({
|
|
|
59180
59893
|
return `99.${"9".repeat(distinguishingPlaces - 1)}${10 - roundedLoss}`;
|
|
59181
59894
|
}
|
|
59182
59895
|
//#endregion
|
|
59183
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
59896
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/MessageIconActions.js
|
|
59184
59897
|
/** 官方「已复制」复位时间。 */
|
|
59185
59898
|
const COPIED_RESET_MS = 1e3;
|
|
59186
59899
|
/** 消息操作行(复制 / 分支 / 用量 / 时钟)。 */
|
|
@@ -59239,7 +59952,7 @@ window.__ModuleLoader__.load({
|
|
|
59239
59952
|
}, t("branchUnavailableLabel")), clock === "end" ? (0, react$1.createElement)("span", { className: officialClass("MessageIconActions", "endInfo") ?? "" }, usageAction, clockEl) : usageAction);
|
|
59240
59953
|
}
|
|
59241
59954
|
//#endregion
|
|
59242
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
59955
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/MessageItem.js
|
|
59243
59956
|
/** 助手正文:官方 MarkdownText 渲染 + 官方 AssistantMarkdown.root 类(fallback 自绘)。
|
|
59244
59957
|
* U11:fileMentions 词表就位时行内 code 文件引用渲成可点链接(官方语义:resolve 不出保持惰性 code)。 */
|
|
59245
59958
|
function AssistantMarkdown(props) {
|
|
@@ -59412,7 +60125,7 @@ window.__ModuleLoader__.load({
|
|
|
59412
60125
|
}), (0, react$1.createElement)("div", { className: officialClass("MessageItem", "turnErrorCopy") ?? "" }, (0, react$1.createElement)("span", { className: officialClass("MessageItem", "maxTokensTitle") ?? "" }, t("maxTokensTitle")), (0, react$1.createElement)("span", { className: officialClass("MessageItem", "turnErrorMessage") ?? "" }, t("maxTokensHint"))));
|
|
59413
60126
|
}
|
|
59414
60127
|
//#endregion
|
|
59415
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60128
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/BashRow.js
|
|
59416
60129
|
/** 官方 BASH_ICON(tool client.js:2469):终端图标 14px。 */
|
|
59417
60130
|
const BASH_ICON = (0, react$1.createElement)(official_exports.IconApiOutlineRegular, { size: 14 });
|
|
59418
60131
|
const firstLine$2 = (text) => {
|
|
@@ -59516,7 +60229,7 @@ window.__ModuleLoader__.load({
|
|
|
59516
60229
|
}, outputText)) : null)) : void 0);
|
|
59517
60230
|
}
|
|
59518
60231
|
//#endregion
|
|
59519
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60232
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/TurnTriggerNodeView.js
|
|
59520
60233
|
/** 官方 TRIGGER_ICONS(lib/client.js:7122-7131)。 */
|
|
59521
60234
|
const TRIGGER_ICONS = {
|
|
59522
60235
|
request: official_exports.IconContextInjectionOutlineRegular,
|
|
@@ -59629,7 +60342,7 @@ window.__ModuleLoader__.load({
|
|
|
59629
60342
|
return runs.length === 0 ? [t("sessionEmpty")] : runs;
|
|
59630
60343
|
}
|
|
59631
60344
|
//#endregion
|
|
59632
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60345
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/ContextInjectionRow.js
|
|
59633
60346
|
/** 系统注入上下文行(官方 ContextInjectionRow 的 opaque 版)。 */
|
|
59634
60347
|
function ContextInjectionRowMirror(props) {
|
|
59635
60348
|
const { node, t } = props;
|
|
@@ -59672,7 +60385,7 @@ window.__ModuleLoader__.load({
|
|
|
59672
60385
|
});
|
|
59673
60386
|
}
|
|
59674
60387
|
//#endregion
|
|
59675
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60388
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/ReasoningRow.js
|
|
59676
60389
|
/** 官方 firstLine(lib/client.js:6140 区):首行。 */
|
|
59677
60390
|
function firstLine$1(text) {
|
|
59678
60391
|
const newline = text.indexOf("\n");
|
|
@@ -59753,7 +60466,7 @@ window.__ModuleLoader__.load({
|
|
|
59753
60466
|
}));
|
|
59754
60467
|
}
|
|
59755
60468
|
//#endregion
|
|
59756
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60469
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/RunningStatus.js
|
|
59757
60470
|
/** 官方 LIVE_RUN_CLOCK_INTERVAL_MS(lib/client.js:979)。 */
|
|
59758
60471
|
const LIVE_RUN_CLOCK_INTERVAL_MS = 1e3;
|
|
59759
60472
|
/** 官方静态兜底 SVG 的鲸尾路径(lib/client.js:6340 REST_PATH,16×16)。 */
|
|
@@ -59811,7 +60524,7 @@ window.__ModuleLoader__.load({
|
|
|
59811
60524
|
}, label)));
|
|
59812
60525
|
}
|
|
59813
60526
|
//#endregion
|
|
59814
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60527
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/TurnProcessNodeView.js
|
|
59815
60528
|
/** Turn 过程行:折叠时只有 label + 箭头;点开由外层 seat 把过程节点放出来。 */
|
|
59816
60529
|
function TurnProcessNodeViewMirror(props) {
|
|
59817
60530
|
const { turn, turnProcess, t } = props;
|
|
@@ -59849,7 +60562,7 @@ window.__ModuleLoader__.load({
|
|
|
59849
60562
|
}, part.text))), canCollapse ? (0, react$1.createElement)(official_exports.IconChevronDownOutlineRegular, { className: officialClass("TurnProcessNodeView", "chevron") ?? "" }) : null));
|
|
59850
60563
|
}
|
|
59851
60564
|
//#endregion
|
|
59852
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60565
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/StatDialog.js
|
|
59853
60566
|
const PANEL_MARGIN = 12;
|
|
59854
60567
|
const PANEL_GAP = 8;
|
|
59855
60568
|
/**
|
|
@@ -59905,7 +60618,7 @@ window.__ModuleLoader__.load({
|
|
|
59905
60618
|
};
|
|
59906
60619
|
}
|
|
59907
60620
|
//#endregion
|
|
59908
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60621
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/TurnUsagePanel.js
|
|
59909
60622
|
/** 本轮用量 pill + 明细弹层。 */
|
|
59910
60623
|
function TurnUsagePanelMirror(props) {
|
|
59911
60624
|
const { usage, t } = props;
|
|
@@ -59939,7 +60652,7 @@ window.__ModuleLoader__.load({
|
|
|
59939
60652
|
}, routes === "" ? null : (0, react$1.createElement)(react$1.Fragment, null, (0, react$1.createElement)("dt", null, t("turnUsageModel")), (0, react$1.createElement)("dd", { className: officialClass("stat-dialog", "route") ?? "" }, routes)), cacheHit === null ? null : (0, react$1.createElement)(react$1.Fragment, null, (0, react$1.createElement)("dt", null, t("turnUsageCacheHit")), (0, react$1.createElement)("dd", null, `${cacheHit}%`)), (0, react$1.createElement)("dt", null, t("turnUsageInput")), (0, react$1.createElement)("dd", null, formatExactCount(usage.uncachedInputTokens, t)), usage.cacheReadTokens === void 0 ? null : (0, react$1.createElement)(react$1.Fragment, null, (0, react$1.createElement)("dt", null, t("turnUsageCacheRead")), (0, react$1.createElement)("dd", null, formatExactCount(usage.cacheReadTokens, t))), usage.cacheWriteTokens === void 0 ? null : (0, react$1.createElement)(react$1.Fragment, null, (0, react$1.createElement)("dt", null, t("turnUsageCacheWrite")), (0, react$1.createElement)("dd", null, formatExactCount(usage.cacheWriteTokens, t))), (0, react$1.createElement)("dt", null, t("turnUsageOutput")), (0, react$1.createElement)("dd", null, formatExactCount(usage.outputTokens, t), usage.reasoningTokens === void 0 ? null : (0, react$1.createElement)("span", { className: officialClass("stat-dialog", "reasoning") ?? "" }, t("turnUsageReasoning", { tokens: formatExactCount(usage.reasoningTokens, t) }))))), document.body) : null);
|
|
59940
60653
|
}
|
|
59941
60654
|
//#endregion
|
|
59942
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60655
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/TurnTailNodeView.js
|
|
59943
60656
|
/** 官方 hasAssistantReplyContent。 */
|
|
59944
60657
|
function hasAssistantReplyContent(blocks) {
|
|
59945
60658
|
return blocks.some((block) => {
|
|
@@ -60023,7 +60736,7 @@ window.__ModuleLoader__.load({
|
|
|
60023
60736
|
}));
|
|
60024
60737
|
}
|
|
60025
60738
|
//#endregion
|
|
60026
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60739
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/Deliverables.js
|
|
60027
60740
|
const basename = (path) => path.slice(Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\")) + 1);
|
|
60028
60741
|
/** 交付路径的所在目录;无分隔符(纯文件名)⇒ undefined,不出「在文件夹中显示」。 */
|
|
60029
60742
|
function parentOf(path) {
|
|
@@ -60178,7 +60891,7 @@ window.__ModuleLoader__.load({
|
|
|
60178
60891
|
}, (0, react$1.createElement)("span", null, t(expanded ? "deliverCollapse" : "deliverAll", { count: files.length })), expanded ? (0, react$1.createElement)(official_exports.IconChevronUpOutlineRegular, {}) : (0, react$1.createElement)(official_exports.IconChevronDownOutlineRegular, {})) : null);
|
|
60179
60892
|
}
|
|
60180
60893
|
//#endregion
|
|
60181
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60894
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/utils/string.js
|
|
60182
60895
|
/**
|
|
60183
60896
|
* 路径取末段(文件名显示用)。`/` 与 `\` 都认。
|
|
60184
60897
|
*
|
|
@@ -60192,7 +60905,7 @@ window.__ModuleLoader__.load({
|
|
|
60192
60905
|
return cut < 0 ? trimmed : trimmed.slice(cut + 1);
|
|
60193
60906
|
}
|
|
60194
60907
|
//#endregion
|
|
60195
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
60908
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/changes.js
|
|
60196
60909
|
/** 官方 changesSummaryUrl(client.js:90-96):文档相对路由。 */
|
|
60197
60910
|
function changesSummaryUrl(sessionId, seq) {
|
|
60198
60911
|
return `api/changes.summary?${new URLSearchParams({
|
|
@@ -60334,7 +61047,7 @@ window.__ModuleLoader__.load({
|
|
|
60334
61047
|
return isInt(seq) ? seq : null;
|
|
60335
61048
|
}
|
|
60336
61049
|
//#endregion
|
|
60337
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
61050
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/ChangedFileDiff.js
|
|
60338
61051
|
/** 官方 ChangedFiles / FileDiff 模块类(ui-deliverables;取不到 = 空类,不白屏)。 */
|
|
60339
61052
|
const C$1 = (semantic) => officialClass("ChangedFiles", semantic) ?? "";
|
|
60340
61053
|
const D = (semantic) => officialClass("FileDiff", semantic) ?? "";
|
|
@@ -60514,7 +61227,7 @@ window.__ModuleLoader__.load({
|
|
|
60514
61227
|
})), body);
|
|
60515
61228
|
}
|
|
60516
61229
|
//#endregion
|
|
60517
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
61230
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/mirror/ChangedFilesCard.js
|
|
60518
61231
|
/** 官方 ChangedFiles 模块类(ui-deliverables;取不到 = 空类,不白屏)。 */
|
|
60519
61232
|
const C = (semantic) => officialClass("ChangedFiles", semantic) ?? "";
|
|
60520
61233
|
/** 会话级缓存:同一 (sessionId, seq) 只拉一次(官方 ChangesSummaryStore 同语义)。 */
|
|
@@ -60658,7 +61371,7 @@ window.__ModuleLoader__.load({
|
|
|
60658
61371
|
}, header, list, toggle);
|
|
60659
61372
|
}
|
|
60660
61373
|
//#endregion
|
|
60661
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
61374
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/pending-inputs.js
|
|
60662
61375
|
/** 官方 observedInputs:durable user 节点 source.rpcId(本地回显被持久节点取代的判据)。 */
|
|
60663
61376
|
function observedRpcIds(order, readNode) {
|
|
60664
61377
|
const ids = /* @__PURE__ */ new Set();
|
|
@@ -60858,7 +61571,7 @@ window.__ModuleLoader__.load({
|
|
|
60858
61571
|
};
|
|
60859
61572
|
}
|
|
60860
61573
|
//#endregion
|
|
60861
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
61574
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/SessionViewModal.js
|
|
60862
61575
|
/** 稳定的空序列(避免默认值每次新建数组)。 */
|
|
60863
61576
|
const EMPTY_ORDER = [];
|
|
60864
61577
|
/** SSR / 数据面未接线时的归档态:如实按未归档,不编造。 */
|
|
@@ -61895,7 +62608,7 @@ window.__ModuleLoader__.load({
|
|
|
61895
62608
|
}, (0, react$1.createElement)("p", { className: "dshpc-sv-forktext" }, tt("forkConfirmText")), canFork ? null : (0, react$1.createElement)("p", { className: "dshpc-sv-forkerr" }, tt("forkUnavailable")), forkErr !== null ? (0, react$1.createElement)("p", { className: "dshpc-sv-forkerr" }, tt("forkFailed", { error: forkErr })) : null));
|
|
61896
62609
|
}
|
|
61897
62610
|
//#endregion
|
|
61898
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
62611
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/open-review.js
|
|
61899
62612
|
/**
|
|
61900
62613
|
* 在右侧分栏打开某次改动的 diff(`ChangedFilesCard` → `onOpenReview` 的落点)。
|
|
61901
62614
|
*
|
|
@@ -61922,7 +62635,7 @@ window.__ModuleLoader__.load({
|
|
|
61922
62635
|
return handle;
|
|
61923
62636
|
}
|
|
61924
62637
|
//#endregion
|
|
61925
|
-
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.
|
|
62638
|
+
//#region ../../node_modules/.pnpm/dsh-plugin-core@0.33.2_@babel+runtime@8.0.8_@codemirror+autocomplete@6.20.4_@codemirror_06af0a7a90e6f93163de419523831900/node_modules/dsh-plugin-core/dist/adv/session/open-session-view.js
|
|
61926
62639
|
/** 默认 retain source(写进宿主 retainedBy;调用方可覆盖成自己的插件名)。 */
|
|
61927
62640
|
const DEFAULT_RETAIN_SOURCE = "dsh-plugin-core";
|
|
61928
62641
|
/** 投影面缺席时的稳定空快照:能力缺席按 undefined 呈现,不编造数据。 */
|
|
@@ -62061,7 +62774,7 @@ window.__ModuleLoader__.load({
|
|
|
62061
62774
|
if (result === null || typeof result !== "object") return null;
|
|
62062
62775
|
const record = result;
|
|
62063
62776
|
if (record.ok !== false) return null;
|
|
62064
|
-
return
|
|
62777
|
+
return new Error(globalT("errRemoteRefused", { detail: JSON.stringify(record.error ?? "unknown") }));
|
|
62065
62778
|
}
|
|
62066
62779
|
/**
|
|
62067
62780
|
* 起一个「结案会话」并注入提示词。
|
|
@@ -63269,6 +63982,24 @@ body[data-ds-dark-theme]{
|
|
|
63269
63982
|
虚拟窗口算歪),放不下的裁掉不显示 */
|
|
63270
63983
|
.dtl-histlist__tags{display:flex;flex-wrap:nowrap;gap:var(--dtl-space-2);margin-top:6px;min-width:0;
|
|
63271
63984
|
overflow:hidden;}
|
|
63985
|
+
|
|
63986
|
+
/* ── 插件详情页配置区(config-panel.ts):两个字段一行左右各半,保存与链接一排。
|
|
63987
|
+
形态与尺寸照兄弟仓 dsh-session-title-pattern 的 .stp-pairField 一套(同源抄自官方字段),
|
|
63988
|
+
颜色仍只吃 --dtl-*。 ── */
|
|
63989
|
+
.dtl-config__pair{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start;
|
|
63990
|
+
border-top:1px solid var(--dtl-border);}
|
|
63991
|
+
.dtl-config__field{display:flex;flex-direction:column;gap:6px;padding:24px 0 12px;}
|
|
63992
|
+
.dtl-config__head{display:flex;align-items:center;gap:8px;}
|
|
63993
|
+
.dtl-config__label{flex:1;min-width:0;font-size:var(--dtl-font-md);font-weight:500;
|
|
63994
|
+
line-height:var(--dtl-line-md);color:var(--dtl-fg);}
|
|
63995
|
+
.dtl-config__hint{margin:0;font-size:var(--dtl-font-sm);line-height:var(--dtl-line-sm);
|
|
63996
|
+
color:var(--dtl-fg-3);}
|
|
63997
|
+
.dtl-config__row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
|
|
63998
|
+
margin-top:24px;padding:0 0 32px;border-bottom:1px solid var(--dtl-border);}
|
|
63999
|
+
.dtl-config__failed{margin:0;font-size:var(--dtl-font-sm);line-height:var(--dtl-line-sm);
|
|
64000
|
+
color:var(--dtl-danger);}
|
|
64001
|
+
.dtl-config__note{margin:0;font-size:var(--dtl-font-sm);line-height:var(--dtl-line-sm);
|
|
64002
|
+
color:var(--dtl-fg-3);}
|
|
63272
64003
|
`;
|
|
63273
64004
|
const STYLE_ID = "dtl-ui-base";
|
|
63274
64005
|
/** 幂等注入 token 层 + 控件皮肤 + 基础层(面板与浮标谁先挂载都只注入一次)。
|
|
@@ -63478,31 +64209,21 @@ body[data-ds-dark-theme]{
|
|
|
63478
64209
|
color: "var(--dtl-fg-2)"
|
|
63479
64210
|
} }, props.hint));
|
|
63480
64211
|
}
|
|
63481
|
-
/**
|
|
64212
|
+
/** 台账图标(与插件页彩色图标同源,纯填充 currentColor ⇒ 随主题 / 选中态反色)。
|
|
63482
64213
|
* 侧栏条目与右上浮标共用这一份(图标只画一次,别处不许再画第二个)。 */
|
|
63483
64214
|
function LedgerIcon(props) {
|
|
63484
64215
|
const size = props.size ?? 18;
|
|
63485
|
-
const stroke = {
|
|
63486
|
-
fill: "none",
|
|
63487
|
-
stroke: "currentColor",
|
|
63488
|
-
strokeWidth: 7,
|
|
63489
|
-
strokeLinecap: "round",
|
|
63490
|
-
strokeLinejoin: "round"
|
|
63491
|
-
};
|
|
63492
64216
|
return (0, react$1.createElement)("svg", {
|
|
63493
64217
|
width: size,
|
|
63494
64218
|
height: size,
|
|
63495
|
-
viewBox: "
|
|
64219
|
+
viewBox: "153 153 718 696",
|
|
63496
64220
|
"aria-hidden": true
|
|
63497
64221
|
}, (0, react$1.createElement)("path", {
|
|
63498
|
-
d: "
|
|
63499
|
-
|
|
63500
|
-
}), (0, react$1.createElement)("path", {
|
|
63501
|
-
d: "M50 22 V46 M78 22 V46",
|
|
63502
|
-
...stroke
|
|
64222
|
+
d: "M725.333333 181.333333A117.333333 117.333333 0 0 1 842.666667 298.666667v298.666666A117.333333 117.333333 0 0 1 725.333333 714.666667h-181.333333v42.666666h74.666667a32 32 0 0 1 0 64h-213.333334a32 32 0 0 1 0-64h74.666667v-42.666666H298.666667A117.333333 117.333333 0 0 1 181.333333 597.333333V298.666667A117.333333 117.333333 0 0 1 298.666667 181.333333h426.666666zM298.666667 245.333333c-29.44 0-53.333333 23.893333-53.333334 53.333334v298.666666c0 29.44 23.893333 53.333333 53.333334 53.333334h426.666666c29.44 0 53.333333-23.893333 53.333334-53.333334V298.666667c0-29.44-23.893333-53.333333-53.333334-53.333334H298.666667z",
|
|
64223
|
+
fill: "currentColor"
|
|
63503
64224
|
}), (0, react$1.createElement)("path", {
|
|
63504
|
-
d: "
|
|
63505
|
-
|
|
64225
|
+
d: "M384 480a32 32 0 0 1 32 32v42.666667a32 32 0 0 1-64 0v-42.666667a32 32 0 0 1 32-32z m128-85.333333a32 32 0 0 1 32 32v128a32 32 0 0 1-64 0v-128a32 32 0 0 1 32-32z m128-85.333334a32 32 0 0 1 32 32v213.333334a32 32 0 0 1-64 0V341.333333a32 32 0 0 1 32-32z",
|
|
64226
|
+
fill: "currentColor"
|
|
63506
64227
|
}));
|
|
63507
64228
|
}
|
|
63508
64229
|
//#endregion
|
|
@@ -63599,15 +64320,18 @@ body[data-ds-dark-theme]{
|
|
|
63599
64320
|
const dash = "—";
|
|
63600
64321
|
const totalOf = (period) => period === void 0 ? dash : compactTick(period.done + period.cancelled);
|
|
63601
64322
|
/** 本期小字:只补取消数(总数已是大数字,不再重复写「完成」)。 */
|
|
63602
|
-
const cancelOf = (period) => period.cancelled > 0 ?
|
|
64323
|
+
const cancelOf = (period) => period.cancelled > 0 ? t("statCancelOnly", { n: compactTick(period.cancelled) }) : null;
|
|
63603
64324
|
/** 上一期写法:`完成 X · 取消 Y`;没取消就只留 `完成 X`。 */
|
|
63604
|
-
const splitOf = (period) => period.cancelled > 0 ?
|
|
64325
|
+
const splitOf = (period) => period.cancelled > 0 ? t("statWeekSplit", {
|
|
64326
|
+
done: compactTick(period.done),
|
|
64327
|
+
cancelled: compactTick(period.cancelled)
|
|
64328
|
+
}) : t("statDoneOnly", { n: compactTick(period.done) });
|
|
63605
64329
|
const cell = (pick, label, period, prevLabel, prev) => {
|
|
63606
64330
|
const sub = period === void 0 ? null : cancelOf(period);
|
|
63607
64331
|
return (0, react$1.createElement)(StatCard, {
|
|
63608
64332
|
label: `${label}${t("chartDone")}`,
|
|
63609
64333
|
value: (0, react$1.createElement)("span", { className: "dtl-stat__main" }, (0, react$1.createElement)("span", null, totalOf(period)), sub === null ? null : (0, react$1.createElement)("span", { className: "dtl-stat__sub" }, sub)),
|
|
63610
|
-
hint: prev === void 0 ? `${prevLabel}
|
|
64334
|
+
hint: prev === void 0 ? `${prevLabel}${t("metaDivider")}${dash}` : `${prevLabel}${t("metaDivider")}${splitOf(prev)}`,
|
|
63611
64335
|
showZero: true,
|
|
63612
64336
|
onClick: () => {
|
|
63613
64337
|
props.onPick(pick);
|
|
@@ -64880,580 +65604,6 @@ body[data-ds-dark-theme]{
|
|
|
64880
65604
|
} }, props.error)));
|
|
64881
65605
|
}
|
|
64882
65606
|
//#endregion
|
|
64883
|
-
//#region src/client/locales.ts
|
|
64884
|
-
/** 中文(默认档)。 */
|
|
64885
|
-
const zh = {
|
|
64886
|
-
backToConversation: "返回会话",
|
|
64887
|
-
panelTitle: "任务台账",
|
|
64888
|
-
refresh: "刷新",
|
|
64889
|
-
refreshing: "刷新中",
|
|
64890
|
-
loading: "读取中…",
|
|
64891
|
-
retry: "重试",
|
|
64892
|
-
loadFailed: "读取失败",
|
|
64893
|
-
degradedToastTitle: "部分台账读取失败({n} 个)",
|
|
64894
|
-
degradedItem: "{title}:{message}",
|
|
64895
|
-
settingsEntry: "身份与设置",
|
|
64896
|
-
settingsTitle: "身份与设置",
|
|
64897
|
-
settingsBack: "返回看板",
|
|
64898
|
-
settingsSwitchUser: "切换身份",
|
|
64899
|
-
settingsRenameUser: "修改昵称",
|
|
64900
|
-
settingsRenamePartial: "部分台账没改通",
|
|
64901
|
-
settingsRenameFailedTitle: "改昵称失败",
|
|
64902
|
-
settingsGoCreate: "创建身份",
|
|
64903
|
-
settingsUserModalTitle: "台账用户管理",
|
|
64904
|
-
settingsNoIdentityTitle: "未创建身份",
|
|
64905
|
-
settingsNoIdentityHint: "创建后,任务的认领、执行与结案均记入该身份。",
|
|
64906
|
-
settingsNamePlaceholder: "昵称",
|
|
64907
|
-
settingsCreate: "创建身份",
|
|
64908
|
-
settingsCreateUser: "创建新用户",
|
|
64909
|
-
settingsSharedUsers: "通用用户",
|
|
64910
|
-
settingsUserModalConfirm: "确定",
|
|
64911
|
-
settingsColWorkspace: "工作区",
|
|
64912
|
-
settingsColName: "名字",
|
|
64913
|
-
settingsColAction: "使用",
|
|
64914
|
-
settingsDeleteUser: "删除",
|
|
64915
|
-
settingsUseConfirmTitle: "切换台账用户",
|
|
64916
|
-
settingsUseConfirmBody: "确定使用 @{name} 作为你的台账用户吗?切换后,任务的认领、推进与结案都将记录在该用户名下。",
|
|
64917
|
-
settingsUseConfirmOk: "确定使用",
|
|
64918
|
-
settingsDeleteConfirmTitle: "从台账移除用户",
|
|
64919
|
-
settingsDeleteConfirmBody: "确定移除 @{name} 吗?该用户在各台账名册中的登记会一并删除;若某个台账里他名下仍有任务,那本台账不会删。已结案的历史记录不受影响。",
|
|
64920
|
-
settingsDeleteConfirmOk: "移除",
|
|
64921
|
-
settingsForgetKeptRow: "{workspace}:名下尚有 {tasks} 个未结任务,已保留",
|
|
64922
|
-
settingsForgetFailedRow: "{workspace}:{error}",
|
|
64923
|
-
settingsForgetDone: "@{name} 已从全部台账移除",
|
|
64924
|
-
settingsForgetDoneCount: "已移除 {count} 本台账",
|
|
64925
|
-
settingsForgetPartialTitle: "@{name} 移除未完成",
|
|
64926
|
-
settingsForgetFailedTitle: "@{name} 移除失败",
|
|
64927
|
-
settingsForgetStep: "{step}({workspace})",
|
|
64928
|
-
settingsCreateDone: "已创建身份 @{name}",
|
|
64929
|
-
settingsSwitchDone: "已切换到 @{name}",
|
|
64930
|
-
settingsRosterEmpty: "所列台账中暂无已创建的身份。",
|
|
64931
|
-
settingsFailed: "操作未成功:{message}",
|
|
64932
|
-
settingsUseThis: "使用",
|
|
64933
|
-
settingsDirsTitle: "台账目录",
|
|
64934
|
-
settingsDirsHint: "看板仅汇总下列目录中的台账。关闭「显示」后,该目录的数据不再出现在看板的统计与筛选中;台账数据本身不受影响。",
|
|
64935
|
-
settingsDirsEmpty: "尚未登记任何台账目录。",
|
|
64936
|
-
settingsDirsAdd: "添加目录",
|
|
64937
|
-
settingsDirsFilterAll: "所有",
|
|
64938
|
-
settingsDirsFilterShown: "显示",
|
|
64939
|
-
settingsDirsFilterHidden: "隐藏",
|
|
64940
|
-
settingsDirsFilterEmpty: "该筛选下没有台账目录。",
|
|
64941
|
-
settingsDirVisible: "显示",
|
|
64942
|
-
settingsDirRename: "重命名",
|
|
64943
|
-
settingsDirRemove: "移除",
|
|
64944
|
-
settingsDirRemoveConfirmTitle: "从看板移除「{name}」?",
|
|
64945
|
-
settingsDirRemoveConfirmBody: "本次操作仅将该台账从看板的管理与查看列表中移除,不会删除或改动该目录下的任何文件与台账数据;如需重新纳入看板,可通过「添加目录」再次登记。",
|
|
64946
|
-
settingsDirRemoveConfirmOk: "确认移除",
|
|
64947
|
-
settingsDirOpFailed: "台账目录未更新",
|
|
64948
|
-
settingsRenamePlaceholder: "新名称(留空则沿用目录名)",
|
|
64949
|
-
settingsSave: "保存",
|
|
64950
|
-
settingsCancel: "取消",
|
|
64951
|
-
settingsPathCopied: "复制完成",
|
|
64952
|
-
settingsPathCopy: "复制路径",
|
|
64953
|
-
settingsAddInvalid: "所选目录不含台账",
|
|
64954
|
-
settingsAddInvalidBody: "该目录不是台账根目录,其直接下级目录中也未发现台账根。请选择台账根目录,或包含台账的上级目录。",
|
|
64955
|
-
settingsAddExisted: "该目录已在监控清单中",
|
|
64956
|
-
settingsAddExistedBody: "无需重复添加,台账监控范围未发生变化。",
|
|
64957
|
-
settingsAddDone: "已添加台账目录",
|
|
64958
|
-
settingsAddDoneBody: "「{name}」已纳入台账监控。",
|
|
64959
|
-
settingsAddDoneMany: "添加成功",
|
|
64960
|
-
settingsAddDoneManyBody: "已添加 {count} 个台账目录:{names}",
|
|
64961
|
-
settingsListSep: "、",
|
|
64962
|
-
settingsFlow1: "安装 Skill",
|
|
64963
|
-
settingsFlow1Lead: "DeepSeek-harness 无需安装,插件已自带。",
|
|
64964
|
-
settingsFlow1Sub: "在其他 Agent 上安装",
|
|
64965
|
-
settingsFlow2: "工作区操作",
|
|
64966
|
-
settingsFlow2Create: "新建:说「建一个新任务:xxx」。",
|
|
64967
|
-
settingsFlow2Exec: "执行:Agent 进度自动写进台账。",
|
|
64968
|
-
settingsFlow2Close: "结束:说「这个任务结束」,Agent 收尾结案。",
|
|
64969
|
-
settingsFlow3: "面板查询",
|
|
64970
|
-
settingsFlow3Todo: "在办:执行中的任务与待认领项",
|
|
64971
|
-
settingsFlow3History: "历史:本项目已结案的任务数量",
|
|
64972
|
-
settingsFlow3Stats: "设置:多 Agent 安装、台账目录管理",
|
|
64973
|
-
settingsColDir: "台账名",
|
|
64974
|
-
settingsColPath: "路径",
|
|
64975
|
-
settingsColActions: "操作",
|
|
64976
|
-
statMyActive: "我的待办",
|
|
64977
|
-
statMyOverdueHint: "逾期 {n}",
|
|
64978
|
-
statMyStaleHint: "停滞 {n}",
|
|
64979
|
-
statOpen: "待认领",
|
|
64980
|
-
statOpenHint: "最长等待 {n} 天",
|
|
64981
|
-
statDoing: "进行中",
|
|
64982
|
-
statDoingHint: "他人在办 {n}",
|
|
64983
|
-
statDoingAllMine: "均为我负责",
|
|
64984
|
-
statBacklog: "积压",
|
|
64985
|
-
statOverdue: "逾期",
|
|
64986
|
-
statStale: "停滞",
|
|
64987
|
-
statBacklogHint: "占待认领 {n}%",
|
|
64988
|
-
statOverdueHint: "占进行中 {n}%",
|
|
64989
|
-
statStaleHint: "占进行中 {n}%",
|
|
64990
|
-
statStaleTitle: "停滞 = 进行中满 {n} 天没更新",
|
|
64991
|
-
statOverdueTitle: "逾期 = 认领后满 {n} 天还没结案",
|
|
64992
|
-
statBacklogTitle: "积压 = 待认领满 {n} 天没人接",
|
|
64993
|
-
statWeekDone: "本周结案",
|
|
64994
|
-
statLastWeekDone: "上周结案",
|
|
64995
|
-
statWeekSplit: "完成 {done} · 取消 {cancelled}",
|
|
64996
|
-
daysNone: "—",
|
|
64997
|
-
daysValue: "{n} 天",
|
|
64998
|
-
chartDone: "结案",
|
|
64999
|
-
chartClosed: "已结任务",
|
|
65000
|
-
chartFinished: "完成",
|
|
65001
|
-
chartCancelled: "取消",
|
|
65002
|
-
chartOpen: "未结任务",
|
|
65003
|
-
chartCreatedTasks: "新建任务",
|
|
65004
|
-
chartEmpty: "还没有可统计的记录",
|
|
65005
|
-
chartPartial: "{from} 起才有台账数据",
|
|
65006
|
-
chartMine: "只看我的",
|
|
65007
|
-
chartDoing: "进行中",
|
|
65008
|
-
chartWaiting: "待认领",
|
|
65009
|
-
periodRange: "{from} ~ {to}",
|
|
65010
|
-
statusLabel: "状态",
|
|
65011
|
-
statusActive: "进行中",
|
|
65012
|
-
statusOpen: "待认领",
|
|
65013
|
-
statusBacklog: "积压",
|
|
65014
|
-
statusOverdue: "逾期",
|
|
65015
|
-
statusStale: "停滞",
|
|
65016
|
-
tipOpen: "任务创建于 {created}\n尚未有人认领",
|
|
65017
|
-
tipBacklog: "任务创建于 {created}\n无人认领已满 {d}",
|
|
65018
|
-
tipDoing: "{who}\n开始执行:{started}\n最后更新:{updated}",
|
|
65019
|
-
tipOverdue: "{who}\n开始执行:{started}\n最后更新:{updated}\n已逾期 {d}",
|
|
65020
|
-
tipStale: "{who}\n开始执行:{started}\n最后更新:{updated}\n已停滞 {d}",
|
|
65021
|
-
workspaceLabel: "台账",
|
|
65022
|
-
workspaceAll: "全部台账",
|
|
65023
|
-
searchPlaceholder: "搜索",
|
|
65024
|
-
regionMine: "我的待办",
|
|
65025
|
-
regionAll: "全部",
|
|
65026
|
-
ownerLabel: "执行人",
|
|
65027
|
-
ownerAll: "全部执行人",
|
|
65028
|
-
listEmpty: "未找到匹配的任务记录",
|
|
65029
|
-
listEmptyHint: "可切换状态或台账,查看其他记录。",
|
|
65030
|
-
wsLimitHint: "本台账记录较多,此处仅列出前 {n} 条;其余记录未予显示,如需查阅请缩小筛选范围。",
|
|
65031
|
-
ownerUnclaimed: "待认领",
|
|
65032
|
-
timeUnknown: "时间未知",
|
|
65033
|
-
relJustNow: "刚刚",
|
|
65034
|
-
relMinutes: "{n} 分钟前",
|
|
65035
|
-
relHours: "{n} 小时前",
|
|
65036
|
-
relDays: "{n} 天前",
|
|
65037
|
-
relMonths: "{n} 个月前",
|
|
65038
|
-
relYears: "{n} 年前",
|
|
65039
|
-
whenSubmitted: "更新于 {time}",
|
|
65040
|
-
copyTaskId: "点击复制任务 ID",
|
|
65041
|
-
copiedTaskId: "已复制任务 ID",
|
|
65042
|
-
copyFailed: "复制失败",
|
|
65043
|
-
actionClaim: "认领",
|
|
65044
|
-
actionResume: "继续",
|
|
65045
|
-
actionFinish: "完成",
|
|
65046
|
-
actionRelease: "释放",
|
|
65047
|
-
actionCancel: "取消",
|
|
65048
|
-
claimConfirmTitle: "认领任务",
|
|
65049
|
-
claimConfirmBody: "确定认领「{title}」吗?认领后任务归到你名下,状态改为进行中。",
|
|
65050
|
-
claimConfirmOk: "确定认领",
|
|
65051
|
-
releaseConfirmTitle: "释放任务",
|
|
65052
|
-
releaseConfirmBody: "确定释放「{title}」吗?任务会退回公共池,状态回到待认领。",
|
|
65053
|
-
releaseConfirmOk: "确定释放",
|
|
65054
|
-
cancelModalTitle: "取消任务",
|
|
65055
|
-
cancelModalBody: "确定取消「{title}」并归档吗?取消的任务不计入完成,会进历史记录。",
|
|
65056
|
-
cancelModalPlaceholder: "写一句取消的理由(可留空)",
|
|
65057
|
-
cancelModalOk: "确定取消",
|
|
65058
|
-
actionCancelDone: "已取消归档:{title}",
|
|
65059
|
-
deleteModalTitle: "删除任务",
|
|
65060
|
-
deleteModalBody: "确定删除「{title}」吗?删除后所有台账统计都不再计入这条记录,且不能恢复。",
|
|
65061
|
-
deleteModalPlaceholder: "写一句删除留言(可留空)",
|
|
65062
|
-
deleteModalOk: "确定删除",
|
|
65063
|
-
actionDeleteDone: "已删除:{title}",
|
|
65064
|
-
actionDelete: "删除任务",
|
|
65065
|
-
tipDeleteTask: "删除任务",
|
|
65066
|
-
tipDelete: "删除",
|
|
65067
|
-
actionClaimDone: "已认领:{title}",
|
|
65068
|
-
actionReleaseDone: "已释放:{title}",
|
|
65069
|
-
actionFailed: "操作失败:{error}",
|
|
65070
|
-
actionSyncing: "正在同步台账并提交…",
|
|
65071
|
-
actionStepCheck: "正在检查本地台账改动…",
|
|
65072
|
-
actionStepSync: "正在拉取最新台账…",
|
|
65073
|
-
actionStepWrite: "正在写入台账…",
|
|
65074
|
-
actionStepCommit: "正在提交改动…",
|
|
65075
|
-
actionStepPush: "正在推送到远端…",
|
|
65076
|
-
continueNotDshTitle: "此任务不属于 DeepSeek Harness 工作区",
|
|
65077
|
-
continueNotDshBody: "相关提示词已复制,请打开对应的 Agent 粘贴继续任务",
|
|
65078
|
-
continueNotDshCopyFailedBody: "提示词复制失败,请重试或手动复制后到对应的 Agent 继续任务",
|
|
65079
|
-
closeNotDshTitle: "此任务不属于 DeepSeek Harness 工作区",
|
|
65080
|
-
closeNotDshBody: "相关提示词已复制,请打开对应的 Agent 粘贴完成结案,也可以选「直接结案」",
|
|
65081
|
-
closeNotDshCopyFailedBody: "结案提示词复制失败,请重试或手动复制后到对应的 Agent 粘贴完成结案",
|
|
65082
|
-
continueStarted: "已新建会话:{title}",
|
|
65083
|
-
closeModalTitle: "结案任务",
|
|
65084
|
-
closeModalHintAgent: "Agent 会读完当前进度、写出结论与遗留项,然后结案。",
|
|
65085
|
-
closeModalHintManual: "用这句摘要直接结案。",
|
|
65086
|
-
closeModalHintManualOnly: "此台账不在本环境内,无法交给 Agent,请写一句结案摘要。",
|
|
65087
|
-
closeModeManual: "直接结案",
|
|
65088
|
-
closeModeAgent: "交给 Agent 结案",
|
|
65089
|
-
closeModalMode: "结案方式",
|
|
65090
|
-
closeModalNotePlaceholder: "给 Agent 留句话(可留空)",
|
|
65091
|
-
closeModalSummaryPlaceholder: "结案摘要(必填,一句话)",
|
|
65092
|
-
closeModalOkAgent: "交给 Agent",
|
|
65093
|
-
closeModalOkManual: "直接结案",
|
|
65094
|
-
closeViewSession: "Agent 会话中",
|
|
65095
|
-
tipViewSession: "查看会话",
|
|
65096
|
-
closeSessionTitle: "完成:{title}",
|
|
65097
|
-
continueSessionTitle: "继续:{title}",
|
|
65098
|
-
closeStarted: "已交给 Agent 结案:{title}",
|
|
65099
|
-
closeDone: "已结案:{title}",
|
|
65100
|
-
closeNotClosed: "这轮跑完了,但任务没结",
|
|
65101
|
-
closeNotClosedDesc: "去会话里看看它停在哪儿",
|
|
65102
|
-
closeAgentFailed: "Agent 这轮没跑成:{error}",
|
|
65103
|
-
closeNoSessions: "宿主没有提供会话服务,只能手动结案",
|
|
65104
|
-
actionOpenSession: "查看会话",
|
|
65105
|
-
closeInProgress: "Agent 正在结案,完成前不能再点",
|
|
65106
|
-
tipClaim: "将该任务归入本人名下,状态置为进行中",
|
|
65107
|
-
tipResume: "恢复对该任务的推进",
|
|
65108
|
-
tipFinish: "将该任务标记为完成,并归档入历史",
|
|
65109
|
-
tipRelease: "解除本人认领,任务退回公共池",
|
|
65110
|
-
tipCancel: "将该任务标记为取消并归档,不计入完成",
|
|
65111
|
-
viewDetail: "查看详情",
|
|
65112
|
-
fieldCreatorStamp: "创建于 {age}",
|
|
65113
|
-
viewModeLabel: "视图",
|
|
65114
|
-
viewActive: "在办",
|
|
65115
|
-
viewHistory: "历史",
|
|
65116
|
-
backToTop: "回到顶部",
|
|
65117
|
-
quickToolbarAria: "快捷工具栏",
|
|
65118
|
-
historyToday: "今日",
|
|
65119
|
-
historyYesterday: "昨日",
|
|
65120
|
-
historyWeek: "本周",
|
|
65121
|
-
historyLastWeek: "上周",
|
|
65122
|
-
historyMonth: "本月",
|
|
65123
|
-
historyLastMonth: "上月",
|
|
65124
|
-
historyQuarter: "本季度",
|
|
65125
|
-
historyLastQuarter: "上季度",
|
|
65126
|
-
historyEmpty: "所选区间内没有结案记录",
|
|
65127
|
-
historyGranLabel: "粒度",
|
|
65128
|
-
historyGranDay: "日",
|
|
65129
|
-
historyGranWeek: "周",
|
|
65130
|
-
historyGranMonth: "月",
|
|
65131
|
-
historyPrev: "前 {n} {unit}",
|
|
65132
|
-
historyNext: "后 {n} {unit}",
|
|
65133
|
-
historyCancelled: "取消",
|
|
65134
|
-
histColTask: "任务",
|
|
65135
|
-
histColDate: "日期",
|
|
65136
|
-
histColCreator: "创建人",
|
|
65137
|
-
histColOwner: "执行人",
|
|
65138
|
-
histColStart: "开始时间",
|
|
65139
|
-
histColEnd: "结束时间",
|
|
65140
|
-
histColTime: "执行时间",
|
|
65141
|
-
histListLabel: "结案记录",
|
|
65142
|
-
weekdaySun: "星期日",
|
|
65143
|
-
weekdayMon: "星期一",
|
|
65144
|
-
weekdayTue: "星期二",
|
|
65145
|
-
weekdayWed: "星期三",
|
|
65146
|
-
weekdayThu: "星期四",
|
|
65147
|
-
weekdayFri: "星期五",
|
|
65148
|
-
weekdaySat: "星期六",
|
|
65149
|
-
histYearLabel: "年份",
|
|
65150
|
-
histMonthLabel: "月份",
|
|
65151
|
-
month1: "一月",
|
|
65152
|
-
month2: "二月",
|
|
65153
|
-
month3: "三月",
|
|
65154
|
-
month4: "四月",
|
|
65155
|
-
month5: "五月",
|
|
65156
|
-
month6: "六月",
|
|
65157
|
-
month7: "七月",
|
|
65158
|
-
month8: "八月",
|
|
65159
|
-
month9: "九月",
|
|
65160
|
-
month10: "十月",
|
|
65161
|
-
month11: "十一月",
|
|
65162
|
-
month12: "十二月"
|
|
65163
|
-
};
|
|
65164
|
-
/** English(与 zh 键完全对齐)。 */
|
|
65165
|
-
const en = {
|
|
65166
|
-
backToConversation: "Back to chat",
|
|
65167
|
-
panelTitle: "Task ledger",
|
|
65168
|
-
refresh: "Refresh",
|
|
65169
|
-
refreshing: "Refreshing",
|
|
65170
|
-
loading: "Loading…",
|
|
65171
|
-
retry: "Retry",
|
|
65172
|
-
loadFailed: "Load failed",
|
|
65173
|
-
degradedToastTitle: "{n} ledger(s) failed to load",
|
|
65174
|
-
degradedItem: "{title}: {message}",
|
|
65175
|
-
settingsEntry: "Identity & settings",
|
|
65176
|
-
settingsTitle: "Identity & settings",
|
|
65177
|
-
settingsBack: "Back to board",
|
|
65178
|
-
settingsSwitchUser: "Switch identity",
|
|
65179
|
-
settingsRenameUser: "Change nickname",
|
|
65180
|
-
settingsRenamePartial: "Some ledgers were not updated",
|
|
65181
|
-
settingsRenameFailedTitle: "Failed to change nickname",
|
|
65182
|
-
settingsGoCreate: "Create identity",
|
|
65183
|
-
settingsUserModalTitle: "Ledger users",
|
|
65184
|
-
settingsNoIdentityTitle: "No identity created",
|
|
65185
|
-
settingsNoIdentityHint: "Once created, claiming, executing and closing a task are recorded under this identity.",
|
|
65186
|
-
settingsNamePlaceholder: "Nickname",
|
|
65187
|
-
settingsCreate: "Create identity",
|
|
65188
|
-
settingsCreateUser: "New user",
|
|
65189
|
-
settingsSharedUsers: "Shared users",
|
|
65190
|
-
settingsUserModalConfirm: "OK",
|
|
65191
|
-
settingsColWorkspace: "Workspace",
|
|
65192
|
-
settingsColName: "Name",
|
|
65193
|
-
settingsColAction: "Use",
|
|
65194
|
-
settingsDeleteUser: "Remove",
|
|
65195
|
-
settingsUseConfirmTitle: "Switch ledger user",
|
|
65196
|
-
settingsUseConfirmBody: "Use @{name} as your ledger user? Claiming, progressing and closing tasks will be recorded under this user.",
|
|
65197
|
-
settingsUseConfirmOk: "Use this user",
|
|
65198
|
-
settingsDeleteConfirmTitle: "Remove user from ledgers",
|
|
65199
|
-
settingsDeleteConfirmBody: "Remove @{name}? The user is dropped from every ledger roster; a ledger where this user still owns tasks is kept. Closed history is untouched.",
|
|
65200
|
-
settingsDeleteConfirmOk: "Remove",
|
|
65201
|
-
settingsForgetKeptRow: "{workspace}: {tasks} open task(s) — entry kept",
|
|
65202
|
-
settingsForgetFailedRow: "{workspace}: {error}",
|
|
65203
|
-
settingsForgetDone: "Identity @{name} removed from all ledgers",
|
|
65204
|
-
settingsForgetDoneCount: "Removed from {count} ledger(s)",
|
|
65205
|
-
settingsForgetPartialTitle: "Identity @{name} partially removed",
|
|
65206
|
-
settingsForgetFailedTitle: "Failed to remove identity @{name}",
|
|
65207
|
-
settingsForgetStep: "{step} ({workspace})",
|
|
65208
|
-
settingsCreateDone: "Created identity @{name}",
|
|
65209
|
-
settingsSwitchDone: "Switched to @{name}",
|
|
65210
|
-
settingsRosterEmpty: "No identity has been created in the listed ledgers.",
|
|
65211
|
-
settingsFailed: "Operation failed: {message}",
|
|
65212
|
-
settingsUseThis: "Use",
|
|
65213
|
-
settingsDirsTitle: "Ledger folders",
|
|
65214
|
-
settingsDirsHint: "Only ledgers in the following folders are summarized. Turning \"Show\" off hides that folder's data from every statistic and filter on the board; the ledger data itself is unaffected.",
|
|
65215
|
-
settingsDirsEmpty: "No ledger folder has been registered.",
|
|
65216
|
-
settingsDirsAdd: "Add folder",
|
|
65217
|
-
settingsDirsFilterAll: "All",
|
|
65218
|
-
settingsDirsFilterShown: "Shown",
|
|
65219
|
-
settingsDirsFilterHidden: "Hidden",
|
|
65220
|
-
settingsDirsFilterEmpty: "No ledger folder matches this filter.",
|
|
65221
|
-
settingsDirVisible: "Show",
|
|
65222
|
-
settingsDirRename: "Rename",
|
|
65223
|
-
settingsDirRemove: "Remove",
|
|
65224
|
-
settingsDirRemoveConfirmTitle: "Remove \"{name}\" from the board?",
|
|
65225
|
-
settingsDirRemoveConfirmBody: "This only takes the ledger out of the board's management and viewing list. No file or ledger data in that folder is deleted or changed; register it again with \"Add folder\" to put it back on the board.",
|
|
65226
|
-
settingsDirRemoveConfirmOk: "Remove",
|
|
65227
|
-
settingsDirOpFailed: "Ledger folders were not updated",
|
|
65228
|
-
settingsRenamePlaceholder: "New name (empty keeps the folder name)",
|
|
65229
|
-
settingsSave: "Save",
|
|
65230
|
-
settingsCancel: "Cancel",
|
|
65231
|
-
settingsPathCopied: "Copied",
|
|
65232
|
-
settingsPathCopy: "Copy path",
|
|
65233
|
-
settingsAddInvalid: "No ledger in this folder",
|
|
65234
|
-
settingsAddInvalidBody: "This folder is not a ledger root, and none of its direct subfolders is one. Choose a ledger root folder, or the folder that contains it.",
|
|
65235
|
-
settingsAddExisted: "Folder already monitored",
|
|
65236
|
-
settingsAddExistedBody: "No need to add it again; the monitored range is unchanged.",
|
|
65237
|
-
settingsAddDone: "Ledger folder added",
|
|
65238
|
-
settingsAddDoneBody: "“{name}” is now monitored.",
|
|
65239
|
-
settingsAddDoneMany: "Ledger folders added",
|
|
65240
|
-
settingsAddDoneManyBody: "{count} ledger folders were added: {names}",
|
|
65241
|
-
settingsListSep: ", ",
|
|
65242
|
-
settingsFlow1: "Install Skill",
|
|
65243
|
-
settingsFlow1Lead: "DeepSeek-harness needs no install — it ships with the plugin.",
|
|
65244
|
-
settingsFlow1Sub: "Install on other agents",
|
|
65245
|
-
settingsFlow2: "Workspace Operations",
|
|
65246
|
-
settingsFlow2Create: "New: say \"create a new task: xxx\".",
|
|
65247
|
-
settingsFlow2Exec: "Run: the agent writes progress to the ledger itself.",
|
|
65248
|
-
settingsFlow2Close: "Finish: say \"this task is done\" and the agent closes it out.",
|
|
65249
|
-
settingsFlow3: "Panel Query",
|
|
65250
|
-
settingsFlow3Todo: "In flight: running tasks and unclaimed items",
|
|
65251
|
-
settingsFlow3History: "History: closed task count for this project",
|
|
65252
|
-
settingsFlow3Stats: "Settings: multi-agent install, ledger folder management",
|
|
65253
|
-
settingsColDir: "Ledger name",
|
|
65254
|
-
settingsColPath: "Path",
|
|
65255
|
-
settingsColActions: "Actions",
|
|
65256
|
-
statMyActive: "My todos",
|
|
65257
|
-
statMyOverdueHint: "overdue {n}",
|
|
65258
|
-
statMyStaleHint: "stale {n}",
|
|
65259
|
-
statOpen: "Unclaimed",
|
|
65260
|
-
statOpenHint: "longest waiting {n} days",
|
|
65261
|
-
statDoing: "In progress",
|
|
65262
|
-
statDoingHint: "others: {n}",
|
|
65263
|
-
statDoingAllMine: "all mine",
|
|
65264
|
-
statBacklog: "Backlog",
|
|
65265
|
-
statOverdue: "Overdue",
|
|
65266
|
-
statStale: "Stale",
|
|
65267
|
-
statBacklogHint: "{n}% of unclaimed",
|
|
65268
|
-
statOverdueHint: "{n}% of active",
|
|
65269
|
-
statStaleHint: "{n}% of active",
|
|
65270
|
-
statStaleTitle: "stale = active with no update for {n}+ days",
|
|
65271
|
-
statOverdueTitle: "overdue = claimed {n}+ days ago and still open",
|
|
65272
|
-
statBacklogTitle: "backlog = unclaimed for {n}+ days",
|
|
65273
|
-
statWeekDone: "Closed this week",
|
|
65274
|
-
statLastWeekDone: "Closed last week",
|
|
65275
|
-
statWeekSplit: "Done {done} · Cancelled {cancelled}",
|
|
65276
|
-
daysNone: "—",
|
|
65277
|
-
daysValue: "{n}d",
|
|
65278
|
-
chartDone: "Closed",
|
|
65279
|
-
chartClosed: "Closed tasks",
|
|
65280
|
-
chartFinished: "Done",
|
|
65281
|
-
chartCancelled: "Cancelled",
|
|
65282
|
-
chartOpen: "Open tasks",
|
|
65283
|
-
chartCreatedTasks: "Created tasks",
|
|
65284
|
-
chartEmpty: "No records to chart yet",
|
|
65285
|
-
chartPartial: "Ledger data starts {from}",
|
|
65286
|
-
chartMine: "Only mine",
|
|
65287
|
-
chartDoing: "In progress",
|
|
65288
|
-
chartWaiting: "Unclaimed",
|
|
65289
|
-
periodRange: "{from} ~ {to}",
|
|
65290
|
-
statusLabel: "Status",
|
|
65291
|
-
statusActive: "Active",
|
|
65292
|
-
statusOpen: "Unclaimed",
|
|
65293
|
-
statusBacklog: "Backlog",
|
|
65294
|
-
statusOverdue: "Overdue",
|
|
65295
|
-
statusStale: "Stale",
|
|
65296
|
-
tipOpen: "Created on {created}\nNot claimed yet",
|
|
65297
|
-
tipBacklog: "Created on {created}\nUnclaimed for {d}",
|
|
65298
|
-
tipDoing: "{who}\nStarted: {started}\nLast updated: {updated}",
|
|
65299
|
-
tipOverdue: "{who}\nStarted: {started}\nLast updated: {updated}\nOverdue by {d}",
|
|
65300
|
-
tipStale: "{who}\nStarted: {started}\nLast updated: {updated}\nStalled for {d}",
|
|
65301
|
-
workspaceLabel: "Ledger",
|
|
65302
|
-
workspaceAll: "All ledgers",
|
|
65303
|
-
searchPlaceholder: "Search",
|
|
65304
|
-
regionMine: "My todos",
|
|
65305
|
-
regionAll: "All",
|
|
65306
|
-
ownerLabel: "Owner",
|
|
65307
|
-
ownerAll: "Anyone",
|
|
65308
|
-
listEmpty: "No matching task records",
|
|
65309
|
-
listEmptyHint: "Switch status or ledger to see other records.",
|
|
65310
|
-
wsLimitHint: "This ledger has more records than shown; only the first {n} are listed. Narrow the filters to see the rest.",
|
|
65311
|
-
ownerUnclaimed: "unclaimed",
|
|
65312
|
-
timeUnknown: "unknown time",
|
|
65313
|
-
relJustNow: "just now",
|
|
65314
|
-
relMinutes: "{n} min ago",
|
|
65315
|
-
relHours: "{n} h ago",
|
|
65316
|
-
relDays: "{n} d ago",
|
|
65317
|
-
relMonths: "{n} mo ago",
|
|
65318
|
-
relYears: "{n} y ago",
|
|
65319
|
-
whenSubmitted: "updated {time}",
|
|
65320
|
-
copyTaskId: "Click to copy task ID",
|
|
65321
|
-
copiedTaskId: "Task ID copied",
|
|
65322
|
-
copyFailed: "Copy failed",
|
|
65323
|
-
actionClaim: "Claim",
|
|
65324
|
-
actionResume: "Resume",
|
|
65325
|
-
actionFinish: "Finish",
|
|
65326
|
-
actionRelease: "Release",
|
|
65327
|
-
actionCancel: "Cancel",
|
|
65328
|
-
claimConfirmTitle: "Claim task",
|
|
65329
|
-
claimConfirmBody: "Claim “{title}”? It moves the task under your name and sets it to in progress.",
|
|
65330
|
-
claimConfirmOk: "Claim it",
|
|
65331
|
-
releaseConfirmTitle: "Release task",
|
|
65332
|
-
releaseConfirmBody: "Release “{title}”? It goes back to the public pool and returns to unclaimed.",
|
|
65333
|
-
releaseConfirmOk: "Release it",
|
|
65334
|
-
cancelModalTitle: "Cancel task",
|
|
65335
|
-
cancelModalBody: "Cancel “{title}” and archive it? Cancelled tasks don't count as done; they go to history.",
|
|
65336
|
-
cancelModalPlaceholder: "One line on why (optional)",
|
|
65337
|
-
cancelModalOk: "Cancel it",
|
|
65338
|
-
actionCancelDone: "Cancelled: {title}",
|
|
65339
|
-
deleteModalTitle: "Delete task",
|
|
65340
|
-
deleteModalBody: "Delete “{title}”? This record will be excluded from all ledger statistics and cannot be restored.",
|
|
65341
|
-
deleteModalPlaceholder: "One line as a note (optional)",
|
|
65342
|
-
deleteModalOk: "Delete it",
|
|
65343
|
-
actionDeleteDone: "Deleted: {title}",
|
|
65344
|
-
actionDelete: "Delete task",
|
|
65345
|
-
tipDeleteTask: "Delete task",
|
|
65346
|
-
tipDelete: "Delete",
|
|
65347
|
-
actionClaimDone: "Claimed: {title}",
|
|
65348
|
-
actionReleaseDone: "Released: {title}",
|
|
65349
|
-
actionFailed: "Action failed: {error}",
|
|
65350
|
-
actionSyncing: "Syncing the ledger and committing…",
|
|
65351
|
-
actionStepCheck: "Checking local ledger changes…",
|
|
65352
|
-
actionStepSync: "Pulling the latest ledger…",
|
|
65353
|
-
actionStepWrite: "Writing the ledger…",
|
|
65354
|
-
actionStepCommit: "Committing changes…",
|
|
65355
|
-
actionStepPush: "Pushing to the remote…",
|
|
65356
|
-
continueNotDshTitle: "This task does not belong to a DeepSeek Harness workspace",
|
|
65357
|
-
continueNotDshBody: "The prompt has been copied — please open the matching agent and paste it to continue.",
|
|
65358
|
-
continueNotDshCopyFailedBody: "Copying the prompt failed — copy it manually, then paste it into the matching agent.",
|
|
65359
|
-
closeNotDshTitle: "This task does not belong to a DeepSeek Harness workspace",
|
|
65360
|
-
closeNotDshBody: "The prompt has been copied — please open the matching agent and paste it to close the task, or pick “Close now”.",
|
|
65361
|
-
closeNotDshCopyFailedBody: "Copying the closing prompt failed — copy it manually, then paste it into the matching agent to close the task.",
|
|
65362
|
-
continueStarted: "Session started: {title}",
|
|
65363
|
-
closeModalTitle: "Close task",
|
|
65364
|
-
closeModalHintAgent: "An agent reads the current progress, writes the conclusion and leftovers, then closes.",
|
|
65365
|
-
closeModalHintManual: "Close right away with this summary.",
|
|
65366
|
-
closeModalHintManualOnly: "This ledger is outside this environment, so no agent is available — write a one-line summary.",
|
|
65367
|
-
closeModeManual: "Close now",
|
|
65368
|
-
closeModeAgent: "Hand to agent",
|
|
65369
|
-
closeModalMode: "Close mode",
|
|
65370
|
-
closeModalNotePlaceholder: "Leave a note for the agent (optional)",
|
|
65371
|
-
closeModalSummaryPlaceholder: "Closing summary (required, one line)",
|
|
65372
|
-
closeModalOkAgent: "Hand to agent",
|
|
65373
|
-
closeModalOkManual: "Close now",
|
|
65374
|
-
closeViewSession: "Agent running",
|
|
65375
|
-
tipViewSession: "View session",
|
|
65376
|
-
closeSessionTitle: "Close: {title}",
|
|
65377
|
-
continueSessionTitle: "Continue: {title}",
|
|
65378
|
-
closeStarted: "Handed to an agent: {title}",
|
|
65379
|
-
closeDone: "Task closed: {title}",
|
|
65380
|
-
closeNotClosed: "The turn finished, but the task is still open",
|
|
65381
|
-
closeNotClosedDesc: "Open the session to see where it stopped",
|
|
65382
|
-
closeAgentFailed: "The agent turn failed: {error}",
|
|
65383
|
-
closeNoSessions: "This host exposes no session service — close it manually",
|
|
65384
|
-
actionOpenSession: "Open session",
|
|
65385
|
-
closeInProgress: "An agent is closing this task; wait for it to finish",
|
|
65386
|
-
tipClaim: "assign this task to me and set it to in progress",
|
|
65387
|
-
tipResume: "resume work on this task",
|
|
65388
|
-
tipFinish: "mark this task as done and archive it",
|
|
65389
|
-
tipRelease: "drop my claim and return the task to the public pool",
|
|
65390
|
-
tipCancel: "mark this task as cancelled and archive it; not counted as done",
|
|
65391
|
-
viewDetail: "View details",
|
|
65392
|
-
fieldCreatorStamp: "created {age}",
|
|
65393
|
-
viewModeLabel: "View",
|
|
65394
|
-
viewActive: "Active",
|
|
65395
|
-
viewHistory: "History",
|
|
65396
|
-
backToTop: "Back to top",
|
|
65397
|
-
quickToolbarAria: "Quick toolbar",
|
|
65398
|
-
historyToday: "Today",
|
|
65399
|
-
historyYesterday: "Yesterday",
|
|
65400
|
-
historyWeek: "This week",
|
|
65401
|
-
historyLastWeek: "Last week",
|
|
65402
|
-
historyMonth: "This month",
|
|
65403
|
-
historyLastMonth: "Last month",
|
|
65404
|
-
historyQuarter: "This quarter",
|
|
65405
|
-
historyLastQuarter: "Last quarter",
|
|
65406
|
-
historyEmpty: "No closed tasks in the selected range",
|
|
65407
|
-
historyGranLabel: "Granularity",
|
|
65408
|
-
historyGranDay: "Day",
|
|
65409
|
-
historyGranWeek: "Week",
|
|
65410
|
-
historyGranMonth: "Month",
|
|
65411
|
-
historyPrev: "Previous {n} {unit}s",
|
|
65412
|
-
historyNext: "Next {n} {unit}s",
|
|
65413
|
-
historyCancelled: "Cancelled",
|
|
65414
|
-
histColTask: "Task",
|
|
65415
|
-
histColDate: "Date",
|
|
65416
|
-
histColCreator: "Creator",
|
|
65417
|
-
histColOwner: "Owner",
|
|
65418
|
-
histColStart: "Started",
|
|
65419
|
-
histColEnd: "Closed",
|
|
65420
|
-
histColTime: "Execution",
|
|
65421
|
-
histListLabel: "Closed tasks",
|
|
65422
|
-
weekdaySun: "Sunday",
|
|
65423
|
-
weekdayMon: "Monday",
|
|
65424
|
-
weekdayTue: "Tuesday",
|
|
65425
|
-
weekdayWed: "Wednesday",
|
|
65426
|
-
weekdayThu: "Thursday",
|
|
65427
|
-
weekdayFri: "Friday",
|
|
65428
|
-
weekdaySat: "Saturday",
|
|
65429
|
-
histYearLabel: "Year",
|
|
65430
|
-
histMonthLabel: "Month",
|
|
65431
|
-
month1: "Jan",
|
|
65432
|
-
month2: "Feb",
|
|
65433
|
-
month3: "Mar",
|
|
65434
|
-
month4: "Apr",
|
|
65435
|
-
month5: "May",
|
|
65436
|
-
month6: "Jun",
|
|
65437
|
-
month7: "Jul",
|
|
65438
|
-
month8: "Aug",
|
|
65439
|
-
month9: "Sep",
|
|
65440
|
-
month10: "Oct",
|
|
65441
|
-
month11: "Nov",
|
|
65442
|
-
month12: "Dec"
|
|
65443
|
-
};
|
|
65444
|
-
/** 把宿主给的无参 t 包成带占位符替换的 t(模板一律 `{name}`,不依赖宿主是否支持 params)。 */
|
|
65445
|
-
function interpolateTranslate(base) {
|
|
65446
|
-
return (key, params) => {
|
|
65447
|
-
const raw = base(key);
|
|
65448
|
-
if (params === void 0) return raw;
|
|
65449
|
-
return raw.replace(/\{(\w+)\}/g, (match, name) => name in params ? String(params[name]) : match);
|
|
65450
|
-
};
|
|
65451
|
-
}
|
|
65452
|
-
/** 键名兜底:宿主没给 t 席位时用(键名绝不上界面)。 */
|
|
65453
|
-
function fallbackTranslate(key, params) {
|
|
65454
|
-
return interpolateTranslate((name) => zh[name] ?? name)(key, params);
|
|
65455
|
-
}
|
|
65456
|
-
//#endregion
|
|
65457
65607
|
//#region src/client/prompts.ts
|
|
65458
65608
|
/**
|
|
65459
65609
|
* 注入到会话里的提示词(「继续」与「完成」两条),中英各一份。
|
|
@@ -66082,7 +66232,7 @@ body[data-ds-dark-theme]{
|
|
|
66082
66232
|
});
|
|
66083
66233
|
const titleLine = (0, react$1.createElement)("div", { className: "dtl-taskrow__l1" }, (0, react$1.createElement)("span", { className: "dtl-taskrow__title dtl-ellipsis" }, titleOf(row)), creatorAge === null || creatorName === "" ? null : (0, react$1.createElement)("span", { className: "dtl-taskrow__stamp" }, solo ? `[${t("fieldCreatorStamp", { age: creatorAge })}]` : `[@${creatorName} ${t("fieldCreatorStamp", { age: creatorAge })}]`));
|
|
66084
66234
|
const whenRaw = row.task.updated ?? row.task.started ?? row.task.created;
|
|
66085
|
-
const metaText = `${t("whenSubmitted", { time: whenRaw === null || whenRaw === void 0 || Number.isNaN(Date.parse(whenRaw)) ? t("timeUnknown") : formatDateTime(whenRaw).slice(5) })}
|
|
66235
|
+
const metaText = `${t("whenSubmitted", { time: whenRaw === null || whenRaw === void 0 || Number.isNaN(Date.parse(whenRaw)) ? t("timeUnknown") : formatDateTime(whenRaw).slice(5) })}${t("metaDivider")}${whenRaw === null || whenRaw === void 0 ? t("timeUnknown") : formatRelative(whenRaw, t)}`;
|
|
66086
66236
|
const ownerName = displayName(row.task.owner_name, row.task.owner);
|
|
66087
66237
|
const ownerUuid = (row.task.owner ?? "").trim();
|
|
66088
66238
|
const whoNode = solo || row.task.status === "open" || ownerUuid === "" ? null : (0, react$1.createElement)(Button, {
|
|
@@ -66122,6 +66272,7 @@ body[data-ds-dark-theme]{
|
|
|
66122
66272
|
cancelText: t("settingsCancel"),
|
|
66123
66273
|
loadingText: false,
|
|
66124
66274
|
notice: busy ? progressNotice() : void 0,
|
|
66275
|
+
locked: busy,
|
|
66125
66276
|
onCancel: () => setConfirmAct(null),
|
|
66126
66277
|
onConfirm: async () => {
|
|
66127
66278
|
setBusy(true);
|
|
@@ -67225,19 +67376,24 @@ body[data-ds-dark-theme]{
|
|
|
67225
67376
|
}
|
|
67226
67377
|
}))
|
|
67227
67378
|
}))) : null;
|
|
67228
|
-
/**
|
|
67379
|
+
/**
|
|
67380
|
+
* 移除确认框:底栏左侧那行跟着 skill 的阶段翻(还没收到第一个阶段就先说「正在同步」)。
|
|
67381
|
+
* ⚠️ `notice` 只在**真的在跑**时给:它一给就占位显示 —— 刚打开、还没点就冒出「正在同步」是 bug
|
|
67382
|
+
* (用户 2026-11-05 当场撞到)。
|
|
67383
|
+
*/
|
|
67229
67384
|
const forgetDialog = forgetRow === null ? null : (0, react$1.createElement)(ConfirmModal, {
|
|
67230
67385
|
title: t("settingsDeleteConfirmTitle"),
|
|
67231
67386
|
message: t("settingsDeleteConfirmBody", { name: forgetRow.name }),
|
|
67232
67387
|
confirmText: t("settingsDeleteConfirmOk"),
|
|
67233
67388
|
cancelText: t("settingsCancel"),
|
|
67234
67389
|
tone: "danger",
|
|
67235
|
-
notice: forgetStep === null ? t("actionSyncing") : t("settingsForgetStep", {
|
|
67390
|
+
...pending === null ? {} : { notice: forgetStep === null ? t("actionSyncing") : t("settingsForgetStep", {
|
|
67236
67391
|
step: t(STEP_LABEL[forgetStep.step]),
|
|
67237
67392
|
workspace: forgetStep.workspace
|
|
67238
|
-
}),
|
|
67393
|
+
}) },
|
|
67394
|
+
locked: pending !== null,
|
|
67239
67395
|
onCancel: () => {
|
|
67240
|
-
|
|
67396
|
+
setForgetRow(null);
|
|
67241
67397
|
},
|
|
67242
67398
|
onConfirm: removeUser
|
|
67243
67399
|
});
|
|
@@ -67773,7 +67929,7 @@ body[data-ds-dark-theme]{
|
|
|
67773
67929
|
variant: "outline",
|
|
67774
67930
|
size: "md",
|
|
67775
67931
|
onClick: onBack
|
|
67776
|
-
}, `← ${t("backToConversation")}`), (0, react$1.createElement)("div", { style: titleStyle }, t("panelTitle"), (0, react$1.createElement)("span", { style: buildTagStyle }, `v0.0.
|
|
67932
|
+
}, `← ${t("backToConversation")}`), (0, react$1.createElement)("div", { style: titleStyle }, t("panelTitle"), (0, react$1.createElement)("span", { style: buildTagStyle }, `v0.0.133 261105-173822-799`))), (0, react$1.createElement)("div", { style: {
|
|
67777
67933
|
display: "flex",
|
|
67778
67934
|
alignItems: "center",
|
|
67779
67935
|
gap: "var(--dtl-space-3)"
|
|
@@ -67926,27 +68082,240 @@ body[data-ds-dark-theme]{
|
|
|
67926
68082
|
})));
|
|
67927
68083
|
}
|
|
67928
68084
|
//#endregion
|
|
68085
|
+
//#region src/client/config-panel.ts
|
|
68086
|
+
/**
|
|
68087
|
+
* 插件详情页的配置区(官方 `plugins.bundle.config` 槽位,key = 包名)。
|
|
68088
|
+
*
|
|
68089
|
+
* 版式照兄弟仓 `dsh-session-title-pattern` 的配置表单(用户 2026-11-05:「去抄」):
|
|
68090
|
+
*
|
|
68091
|
+
* · **两个设置项一行左右各半**:左「显示名称」、右「入口位置」。
|
|
68092
|
+
* · **保存与两个链接同一排,保存最前**。
|
|
68093
|
+
* · 「是否改过」的提示:改过的字段出「自定义」标签 +「恢复默认」,没改过两者都不出现。
|
|
68094
|
+
*
|
|
68095
|
+
* 控件一律走核心控件库(用户 2026-11-05:「不要自己手搓…用核心空间里面的」):
|
|
68096
|
+
* `Input` / `Picker`(下拉单选)/ `Chip`(标签)/ `Button`。本文件只排 label、hint 与两列
|
|
68097
|
+
* 的容器(`.dtl-config__*` 一组类,颜色只吃 `--dtl-*`),不写控件皮肤。
|
|
68098
|
+
*
|
|
68099
|
+
* 两个字段 = host 侧 `Config` 的两个 volatile 字段(`src/index.ts`):`entryMode` /
|
|
68100
|
+
* `displayName`。显示名为空串时用词典默认名(`panelTitle`);**填成与默认名相同则不落盘**
|
|
68101
|
+
* ——保存前把它折成「清空」,用户层不留这一项。
|
|
68102
|
+
*/
|
|
68103
|
+
/** 本仓库地址(设置区的第一个链接)。 */
|
|
68104
|
+
const PROJECT_URL = "https://github.com/cq-guojia/dsh-task-ledger";
|
|
68105
|
+
/** 友情链接:蓝鲸组件库(UI 基础控件包)。 */
|
|
68106
|
+
const COMPONENTS_URL = "https://github.com/cq-guojia/dsh-plugin-core";
|
|
68107
|
+
/** 字段名:与 host 侧 `Config` 的键逐字一致。 */
|
|
68108
|
+
const ENTRY_MODE_FIELD = "entryMode";
|
|
68109
|
+
const DISPLAY_NAME_FIELD = "displayName";
|
|
68110
|
+
/** 一个字段:标签行(标签 + 改过徽标 + 恢复默认)→ 控件 → 说明。 */
|
|
68111
|
+
function configField(props) {
|
|
68112
|
+
return (0, react$1.createElement)("div", { className: "dtl-config__field" }, (0, react$1.createElement)("div", { className: "dtl-config__head" }, (0, react$1.createElement)("span", {
|
|
68113
|
+
className: "dtl-config__label",
|
|
68114
|
+
id: props.id
|
|
68115
|
+
}, props.label), props.overridden ? (0, react$1.createElement)(Chip, {
|
|
68116
|
+
tone: "neutral",
|
|
68117
|
+
size: "xs"
|
|
68118
|
+
}, props.overriddenLabel) : null, props.overridden ? (0, react$1.createElement)(Button$2, {
|
|
68119
|
+
variant: "link",
|
|
68120
|
+
size: "sm",
|
|
68121
|
+
disabled: props.disabled,
|
|
68122
|
+
onClick: props.onReset
|
|
68123
|
+
}, props.resetLabel) : null), props.control, (0, react$1.createElement)("p", { className: "dtl-config__hint" }, props.hint));
|
|
68124
|
+
}
|
|
68125
|
+
/** 一个小外链按钮(图标 + 文案,核心 Button)。 */
|
|
68126
|
+
const linkButton = (label, url) => (0, react$1.createElement)(Button$2, {
|
|
68127
|
+
size: "lg",
|
|
68128
|
+
variant: "outline",
|
|
68129
|
+
icon: (0, react$1.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconLinkOutlineRegular, { size: 16 }),
|
|
68130
|
+
onClick: () => {
|
|
68131
|
+
window.open(url, "_blank", "noopener");
|
|
68132
|
+
}
|
|
68133
|
+
}, label);
|
|
68134
|
+
function ConfigPanel(props) {
|
|
68135
|
+
ensureUiBase();
|
|
68136
|
+
const { t, store } = props;
|
|
68137
|
+
const [, bump] = (0, react$1.useState)(0);
|
|
68138
|
+
(0, react$1.useEffect)(() => store.subscribe(() => bump((n) => n + 1)), [store]);
|
|
68139
|
+
const discard = (0, react$1.useRef)(props.discard);
|
|
68140
|
+
discard.current = props.discard;
|
|
68141
|
+
(0, react$1.useEffect)(() => () => discard.current(), []);
|
|
68142
|
+
if (props.view !== "page") return null;
|
|
68143
|
+
const state = store.getSnapshot();
|
|
68144
|
+
if (!state.available) return (0, react$1.createElement)("p", {
|
|
68145
|
+
className: "dtl-config__note",
|
|
68146
|
+
role: "status"
|
|
68147
|
+
}, t("configUnavailable"));
|
|
68148
|
+
const mode = state.entryMode.text === "more" ? "more" : "first";
|
|
68149
|
+
const handleSave = () => {
|
|
68150
|
+
if (state.entryMode.overridden && mode === "first") props.resetField(ENTRY_MODE_FIELD);
|
|
68151
|
+
if (state.displayName.overridden && state.displayName.text.trim() === props.defaultName) props.resetField(DISPLAY_NAME_FIELD);
|
|
68152
|
+
props.save();
|
|
68153
|
+
};
|
|
68154
|
+
return (0, react$1.createElement)("div", null, (0, react$1.createElement)("div", { className: "dtl-config__pair" }, configField({
|
|
68155
|
+
id: "dtl-config-name",
|
|
68156
|
+
label: t("configNameLabel"),
|
|
68157
|
+
hint: t("configNameHint"),
|
|
68158
|
+
overridden: state.displayName.overridden,
|
|
68159
|
+
resetLabel: t("configReset"),
|
|
68160
|
+
overriddenLabel: t("configOverridden"),
|
|
68161
|
+
disabled: !state.writable,
|
|
68162
|
+
onReset: () => props.resetField(DISPLAY_NAME_FIELD),
|
|
68163
|
+
control: (0, react$1.createElement)(Input, {
|
|
68164
|
+
value: state.displayName.text,
|
|
68165
|
+
onChange: (text) => props.edit(DISPLAY_NAME_FIELD, text),
|
|
68166
|
+
placeholder: props.defaultName,
|
|
68167
|
+
size: "lg",
|
|
68168
|
+
error: state.displayName.invalid,
|
|
68169
|
+
disabled: !state.writable,
|
|
68170
|
+
"aria-label": t("configNameLabel")
|
|
68171
|
+
})
|
|
68172
|
+
}), configField({
|
|
68173
|
+
id: "dtl-config-entry",
|
|
68174
|
+
label: t("configEntryLabel"),
|
|
68175
|
+
hint: t("configEntryHint"),
|
|
68176
|
+
overridden: state.entryMode.overridden,
|
|
68177
|
+
resetLabel: t("configReset"),
|
|
68178
|
+
overriddenLabel: t("configOverridden"),
|
|
68179
|
+
disabled: !state.writable,
|
|
68180
|
+
onReset: () => props.resetField(ENTRY_MODE_FIELD),
|
|
68181
|
+
control: (0, react$1.createElement)(Picker, {
|
|
68182
|
+
value: mode,
|
|
68183
|
+
options: [{
|
|
68184
|
+
value: "first",
|
|
68185
|
+
label: t("configEntryFirst")
|
|
68186
|
+
}, {
|
|
68187
|
+
value: "more",
|
|
68188
|
+
label: t("configEntryMore")
|
|
68189
|
+
}],
|
|
68190
|
+
mode: "single",
|
|
68191
|
+
size: "lg",
|
|
68192
|
+
width: "100%",
|
|
68193
|
+
disabled: !state.writable,
|
|
68194
|
+
ariaLabel: t("configEntryLabel"),
|
|
68195
|
+
onChange: (next) => {
|
|
68196
|
+
const picked = String(next);
|
|
68197
|
+
if (picked !== mode) props.edit(ENTRY_MODE_FIELD, picked);
|
|
68198
|
+
}
|
|
68199
|
+
})
|
|
68200
|
+
})), (0, react$1.createElement)("div", { className: "dtl-config__row" }, (0, react$1.createElement)(Button$2, {
|
|
68201
|
+
variant: "primary",
|
|
68202
|
+
size: "lg",
|
|
68203
|
+
disabled: !state.dirty || state.invalid || state.saving,
|
|
68204
|
+
onClick: handleSave
|
|
68205
|
+
}, state.saving ? t("configSaving") : t("configSave")), linkButton(t("configGithub"), PROJECT_URL), linkButton(t("configComponents"), COMPONENTS_URL), state.failed ? (0, react$1.createElement)("p", {
|
|
68206
|
+
className: "dtl-config__failed",
|
|
68207
|
+
role: "status"
|
|
68208
|
+
}, t("configSaveFailed")) : null, !state.writable ? (0, react$1.createElement)("p", {
|
|
68209
|
+
className: "dtl-config__note",
|
|
68210
|
+
role: "status"
|
|
68211
|
+
}, t("configReadOnly")) : null));
|
|
68212
|
+
}
|
|
68213
|
+
//#endregion
|
|
67929
68214
|
//#region src/client/index.ts
|
|
67930
68215
|
/**
|
|
67931
68216
|
* 浏览器半入口(client bundle,产物 dist/client.js):装配层,不写业务逻辑。
|
|
67932
68217
|
*
|
|
67933
|
-
*
|
|
68218
|
+
* 四处注册各自挂进「服务就位才触发」的 slots 注入(参考插件真机教训:顶层 inject 声明
|
|
67934
68219
|
* 组合满足不了的依赖会让 entry 一直 pending、卡死整个 dsh 启动):
|
|
67935
68220
|
* · locale 字典(zh / en)——界面语言跟随宿主,插件不自备开关;
|
|
67936
|
-
* · `main` keyed
|
|
68221
|
+
* · `main` keyed 槽整页(看板首页);
|
|
68222
|
+
* · 侧栏入口(`sidebar.panellist` 一级 / `sidebar.panellist.actions`「更多」)——
|
|
68223
|
+
* 位置与显示名由插件设置决定(见 `config-panel.ts`);
|
|
68224
|
+
* · `plugins.bundle.config` keyed 槽(插件详情页的配置区)。
|
|
67937
68225
|
*
|
|
67938
68226
|
* 宿主能力一律**本地结构化声明**,不 import 官方包(rc 接口会无声变);
|
|
67939
68227
|
* `t` 席位由宿主渲染器按注册项的 `locale:` 声明合成进组件 props。
|
|
67940
68228
|
*/
|
|
67941
68229
|
setStyleKit(createStyleKit({ id: "dsh-task-ledger" }));
|
|
67942
|
-
/** 命名空间(settings / locale / 面板 id 同名,便于对应)。 */
|
|
68230
|
+
/** 命名空间(settings / locale / 面板 id / 详情页配置槽 key 同名,便于对应)。 */
|
|
67943
68231
|
/** 模块级 t 席位(侧栏 label 渲染期求值用;绑不上就回落键名,绝不上界面)。 */
|
|
67944
68232
|
let runtimeT = (key) => key;
|
|
67945
68233
|
const NS = "dsh-task-ledger";
|
|
68234
|
+
/** 控制台前缀(与宿主日志区分)。 */
|
|
68235
|
+
const LOG = "[task-ledger]";
|
|
67946
68236
|
/** `main` 槽的 key(非 `conversation` ⇒ 不绑 Session)。 */
|
|
67947
68237
|
const PANEL_ID = NS;
|
|
68238
|
+
/** 插件详情页配置区的槽位(keyed,key 必须与包名逐字相同)。 */
|
|
68239
|
+
const BUNDLE_CONFIG_SLOT = "plugins.bundle.config";
|
|
68240
|
+
/** 入口位置:`first` = 左侧第一级(默认)/ `more` = 「更多」菜单。 */
|
|
68241
|
+
let entryMode = "first";
|
|
68242
|
+
/** 自定义显示名;空串 = 用词典默认名(`panelTitle`)。 */
|
|
68243
|
+
let customName = "";
|
|
67948
68244
|
/** 宿主没给 t 席位时的兜底(键名绝不上界面)。 */
|
|
67949
68245
|
const t = interpolateTranslate((key, params) => fallbackTranslate(key, params));
|
|
68246
|
+
/** 侧栏 / 「更多」菜单里那一行的文案:设了名字用自己的,否则用词典默认名。 */
|
|
68247
|
+
const entryLabel = () => customName === "" ? runtimeT("panelTitle") : customName;
|
|
68248
|
+
/**
|
|
68249
|
+
* 取宿主实际登记的本插件设置命名空间。
|
|
68250
|
+
*
|
|
68251
|
+
* `cordis.patch.yml` 的 entry id 是 `dsh-task-ledger`,但宿主内部命名空间不保证逐字相同
|
|
68252
|
+
* (兄弟项目 demo 的 `resolveServedEntryId` 同款顾虑);问不到就按包名兜底。
|
|
68253
|
+
*/
|
|
68254
|
+
function resolveSettingsNamespace(forms) {
|
|
68255
|
+
try {
|
|
68256
|
+
const served = forms.describe?.().getSnapshot().view?.namespaces?.map((item) => item.ns) ?? [];
|
|
68257
|
+
return served.find((ns) => ns === NS) ?? served.find((ns) => ns.includes(NS)) ?? NS;
|
|
68258
|
+
} catch {
|
|
68259
|
+
return NS;
|
|
68260
|
+
}
|
|
68261
|
+
}
|
|
68262
|
+
/** 「更多」菜单里的一行:点开跳整页,并收起菜单(收起由宿主给的 onDismiss 负责)。 */
|
|
68263
|
+
function MoreEntry(props) {
|
|
68264
|
+
return (0, react$1.createElement)(_deepseek_ai_dsh_client_ui_primitives.MenuItemButton, {
|
|
68265
|
+
icon: (0, react$1.createElement)(LedgerIcon, { size: 16 }),
|
|
68266
|
+
onSelect: () => {
|
|
68267
|
+
props.onDismiss();
|
|
68268
|
+
selectPanel(PANEL_ID);
|
|
68269
|
+
},
|
|
68270
|
+
children: entryLabel()
|
|
68271
|
+
});
|
|
68272
|
+
}
|
|
68273
|
+
/** slots 服务引用(apply 时赋值)。 */
|
|
68274
|
+
let slotsRef = null;
|
|
68275
|
+
/** 当前入口的注册 disposer;切换位置时先摘旧的再挂新的。 */
|
|
68276
|
+
let entryDisposer = null;
|
|
68277
|
+
/** 当前 `slots.inject` 的 disposer(反复切换不能让 factory 越积越多)。 */
|
|
68278
|
+
let entryInjected = null;
|
|
68279
|
+
/**
|
|
68280
|
+
* 把入口注册成 `entryMode` 说的样子。
|
|
68281
|
+
*
|
|
68282
|
+
* 两个 slot 的 owner 到达顺序、以及设置与 slots 两个注入块谁先到都没有保证 ⇒ 每次都用
|
|
68283
|
+
* **模块级当前值**重挂一遍:先摘旧 factory 与旧条目,再按现值注册。重复调用是无害的。
|
|
68284
|
+
*/
|
|
68285
|
+
function applySidebarEntry() {
|
|
68286
|
+
const slots = slotsRef;
|
|
68287
|
+
if (slots === null) return;
|
|
68288
|
+
entryInjected?.();
|
|
68289
|
+
entryDisposer?.();
|
|
68290
|
+
entryInjected = null;
|
|
68291
|
+
entryDisposer = null;
|
|
68292
|
+
if (entryMode === "more") {
|
|
68293
|
+
entryInjected = slots.inject("sidebar.panellist.actions", () => {
|
|
68294
|
+
console.info(`${LOG} 入口已挂到 sidebar.panellist.actions(「更多」菜单)`);
|
|
68295
|
+
entryDisposer = slots.register({
|
|
68296
|
+
name: "sidebar.panellist.actions",
|
|
68297
|
+
id: `${PANEL_ID}-more`,
|
|
68298
|
+
order: 30,
|
|
68299
|
+
locale: NS
|
|
68300
|
+
}, (props) => (0, react$1.createElement)(MoreEntry, { onDismiss: props.onDismiss }));
|
|
68301
|
+
return entryDisposer;
|
|
68302
|
+
});
|
|
68303
|
+
return;
|
|
68304
|
+
}
|
|
68305
|
+
entryInjected = slots.inject("sidebar.panellist", () => {
|
|
68306
|
+
console.info(`${LOG} 入口已挂到 sidebar.panellist(一级菜单)`);
|
|
68307
|
+
entryDisposer = slots.register({
|
|
68308
|
+
name: "sidebar.panellist",
|
|
68309
|
+
id: PANEL_ID,
|
|
68310
|
+
order: 30,
|
|
68311
|
+
label: entryLabel,
|
|
68312
|
+
locale: NS
|
|
68313
|
+
}, (props) => (0, react$1.createElement)(LedgerIcon, { size: props.size ?? 18 }));
|
|
68314
|
+
return entryDisposer;
|
|
68315
|
+
});
|
|
68316
|
+
}
|
|
68317
|
+
/** 布局服务:浮标点开整页 / 整页返回会话 / 「更多」那一行跳整页。 */
|
|
68318
|
+
let selectPanel = () => {};
|
|
67950
68319
|
function apply(ctx) {
|
|
67951
68320
|
connectHost(ctx);
|
|
67952
68321
|
connectFs({ path: FS_PATH });
|
|
@@ -67956,10 +68325,13 @@ body[data-ds-dark-theme]{
|
|
|
67956
68325
|
en
|
|
67957
68326
|
}));
|
|
67958
68327
|
try {
|
|
67959
|
-
|
|
68328
|
+
const bound = localeCtx.locale?.bind(NS);
|
|
68329
|
+
if (bound !== void 0) {
|
|
68330
|
+
runtimeT = bound;
|
|
68331
|
+
setActiveTranslate(interpolateTranslate(bound));
|
|
68332
|
+
}
|
|
67960
68333
|
} catch {}
|
|
67961
68334
|
});
|
|
67962
|
-
let selectPanel = () => {};
|
|
67963
68335
|
ctx.inject(["layout"], (sub) => {
|
|
67964
68336
|
const layout = sub.layout;
|
|
67965
68337
|
if (layout !== void 0) selectPanel = (id) => {
|
|
@@ -67983,13 +68355,8 @@ body[data-ds-dark-theme]{
|
|
|
67983
68355
|
if (sub.uiConversation !== void 0) setUiConversation(sub.uiConversation);
|
|
67984
68356
|
});
|
|
67985
68357
|
ctx.inject(["slots"], (sub) => {
|
|
67986
|
-
|
|
67987
|
-
|
|
67988
|
-
id: PANEL_ID,
|
|
67989
|
-
order: 30,
|
|
67990
|
-
label: () => runtimeT("panelTitle"),
|
|
67991
|
-
locale: NS
|
|
67992
|
-
}, (props) => (0, react$1.createElement)(LedgerIcon, { size: props.size ?? 18 })));
|
|
68358
|
+
slotsRef = sub.slots;
|
|
68359
|
+
applySidebarEntry();
|
|
67993
68360
|
sub.slots.inject("main", () => sub.slots.register({
|
|
67994
68361
|
name: "main",
|
|
67995
68362
|
key: PANEL_ID,
|
|
@@ -68001,6 +68368,60 @@ body[data-ds-dark-theme]{
|
|
|
68001
68368
|
}
|
|
68002
68369
|
})));
|
|
68003
68370
|
});
|
|
68371
|
+
ctx.inject([
|
|
68372
|
+
"slots",
|
|
68373
|
+
"locale",
|
|
68374
|
+
"configForms"
|
|
68375
|
+
], (sub) => {
|
|
68376
|
+
const forms = sub.configForms;
|
|
68377
|
+
if (forms === void 0) {
|
|
68378
|
+
console.warn(`${LOG} configForms 服务未就位,插件详情页配置区不注册`);
|
|
68379
|
+
return;
|
|
68380
|
+
}
|
|
68381
|
+
const ns = resolveSettingsNamespace(forms);
|
|
68382
|
+
if (ns !== NS) console.info(`${LOG} 设置命名空间取宿主登记的 ${ns}(包名 ${NS})`);
|
|
68383
|
+
const scope = forms.get(ns);
|
|
68384
|
+
const model = new _deepseek_ai_dsh_client_ui_primitives.SettingsFormModel(scope, [(0, _deepseek_ai_dsh_client_ui_primitives.settingsTextField)(ENTRY_MODE_FIELD), (0, _deepseek_ai_dsh_client_ui_primitives.settingsTextField)(DISPLAY_NAME_FIELD)]);
|
|
68385
|
+
const store = model.bind(() => ({
|
|
68386
|
+
...model.shell(),
|
|
68387
|
+
entryMode: model.field(ENTRY_MODE_FIELD),
|
|
68388
|
+
displayName: model.field(DISPLAY_NAME_FIELD)
|
|
68389
|
+
}));
|
|
68390
|
+
const actions = model.actions();
|
|
68391
|
+
ctx.effect(() => () => model.dispose());
|
|
68392
|
+
const sync = () => {
|
|
68393
|
+
const snapshot = scope.getSnapshot();
|
|
68394
|
+
const value = snapshot.value;
|
|
68395
|
+
entryMode = value?.entryMode === "more" ? "more" : "first";
|
|
68396
|
+
customName = (value?.displayName ?? "").trim();
|
|
68397
|
+
if (snapshot.status === "unavailable") console.warn(`${LOG} 设置命名空间 ${ns} 未被宿主登记(host 侧 Config schema 没生效?),配置区会显示「不可用」`);
|
|
68398
|
+
applySidebarEntry();
|
|
68399
|
+
};
|
|
68400
|
+
sync();
|
|
68401
|
+
ctx.effect(() => scope.subscribe(sync));
|
|
68402
|
+
ctx.effect(() => sub.slots.inject(BUNDLE_CONFIG_SLOT, () => {
|
|
68403
|
+
console.info(`${LOG} 已注册插件详情页配置区到 ${BUNDLE_CONFIG_SLOT}(${NS})`);
|
|
68404
|
+
return sub.slots.register({
|
|
68405
|
+
name: BUNDLE_CONFIG_SLOT,
|
|
68406
|
+
key: NS,
|
|
68407
|
+
locale: NS
|
|
68408
|
+
}, (props) => {
|
|
68409
|
+
const translate = props.t ?? t;
|
|
68410
|
+
return (0, react$1.createElement)(ConfigPanel, {
|
|
68411
|
+
view: props.view ?? "page",
|
|
68412
|
+
store,
|
|
68413
|
+
t: translate,
|
|
68414
|
+
defaultName: translate("panelTitle"),
|
|
68415
|
+
save: () => {
|
|
68416
|
+
model.save();
|
|
68417
|
+
},
|
|
68418
|
+
edit: actions.edit,
|
|
68419
|
+
resetField: actions.resetField,
|
|
68420
|
+
discard: actions.discard
|
|
68421
|
+
});
|
|
68422
|
+
});
|
|
68423
|
+
}));
|
|
68424
|
+
});
|
|
68004
68425
|
}
|
|
68005
68426
|
//#endregion
|
|
68006
68427
|
exports.apply = apply;
|