dsh-calendar 0.14.3 → 0.14.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # 更新记录
2
2
 
3
+ ## 0.14.5 (2026-11-04)
4
+
5
+ - 同步共享界面:嵌入设置时继承宿主底色,输入框跟随主题,空状态保持可读宽度;新版 DSH 可显示插件设置图标。
6
+ - Align embedded surfaces, themed inputs, readable empty states and optional native settings icons.
7
+ - 修复中文及 Unicode CalDAV 账号的 UTF-8 Basic 认证。
8
+ - Fix UTF-8 Basic authentication for Chinese and Unicode CalDAV credentials.
9
+
10
+
11
+ ## 0.14.4 (2026-11-03)
12
+
13
+ - 未配置首屏复用 Empty;月历 42 格补可及名与 aria-current;空范围/失败区分;未连接按钮打开连接设置;浮层补齐共享样式。
14
+ - Unconfigured states reuse Empty, calendar cells gain accessible names and aria-current, empty ranges are distinguished from failures, disconnected actions open connection settings, and floating panels share the workbench styles.
15
+ - 同步共享 workbench-ui v1.1:Page 外的 Empty / Dialog / Status 自带样式与 `.dshw` 主题作用域,Status 新增 warn 色调。
16
+ - Sync workbench-ui v1.1: Empty / Dialog / Status now carry their own styles and `.dshw` theme scope outside Page, and Status gains a warn tone.
17
+
3
18
  ## 0.14.3 (2026-10-30)
4
19
 
5
20
  - 重整中英文首页:用途、三步流程图、安装入口与操作示例;详细配置与边界集中到完整说明。
package/docs/WORKBENCH.md CHANGED
@@ -27,3 +27,9 @@ Edit the template sources and run pnpm run build. Commit generated lib/client.js
27
27
  邮件使用受控 AgentMail HTTP 服务,日历使用受控 CalDAV 协议传输;插件处理器、存储、校验和原生宿主均实际运行。未使用真实邮箱、真实日历账号或付费模型。RSS 访问 Node.js 官方公开来源。PPT 实际生成并渲染 PPTX、下载 ZIP;两个视频插件实际运行官方引擎并播放 MP4。
28
28
 
29
29
  这些是 Web 共用界面的验收结果,不代表已验收 Electron 专属菜单、系统权限、真实账号、全部外部来源或所有可选模型/引擎。Docker、Slack、钉钉继续按用户约定搁置。
30
+
31
+ ## 中文账号 / Unicode accounts
32
+
33
+ Basic 认证现以 UTF-8 编码账号和密码,中文账号不再被本地 Latin-1 编码器拒绝。服务端仍须支持该账号及 UTF-8 凭据。OAuth 路径保持独立;遇到 401 请核对服务商要求的账号格式与授权。
34
+
35
+ Basic credentials use UTF-8, avoiding local Latin-1 encoding failures for Unicode names. The server must still accept the account and encoding. OAuth is unaffected.
package/lib/caldav.js CHANGED
@@ -68,10 +68,14 @@ export class CalendarService {
68
68
  const oauth = this.config.oauth;
69
69
  this.clientPromise = createDAVClient({
70
70
  serverUrl: this.config.caldavUrl,
71
- credentials: oauth === undefined ? { username: this.config.username, password: this.config.password } : {},
71
+ credentials: {},
72
72
  // createDAVClient 的 Oauth 分支只在初始化时取头;改由 fetch 在每次请求时检查过期。
73
- authMethod: oauth === undefined ? 'Basic' : 'Custom',
74
- ...(oauth === undefined ? {} : { authFunction: async () => ({}) }),
73
+ // tsdav's Basic encoder only accepts Latin-1. Encode our explicit
74
+ // credentials as UTF-8 so Chinese CalDAV account names work too.
75
+ authMethod: 'Custom',
76
+ authFunction: async () => oauth === undefined
77
+ ? { authorization: 'Basic ' + Buffer.from(this.config.username + ':' + this.config.password, 'utf8').toString('base64') }
78
+ : {},
75
79
  fetch: oauth === undefined ? transport : createOAuthFetch(oauth, transport, this.config.caldavUrl),
76
80
  });
77
81
  }
package/lib/client.js CHANGED
@@ -55,7 +55,7 @@ function createWorkbenchUI(React) {
55
55
  }
56
56
  function Page({ title, subtitle, actions, children, workbench = false, className, rootRef, ...props }) {
57
57
  return h('section', { ...props, ref: rootRef, className: cx('dshw', 'w-page', className), 'data-main': workbench ? 'true' : 'false' },
58
- h('style', null, styles),
58
+ h(Styles, { key: 'styles' }),
59
59
  h('header', { className: 'w-page-header' }, h('div', { className: 'w-heading' }, h('h1', null, title), subtitle ? h('p', { className: 'w-subtitle' }, subtitle) : null), actions ? h('div', { className: 'w-header-actions' }, actions) : null),
60
60
  h('div', { className: 'w-body' }, children));
61
61
  }
@@ -78,10 +78,10 @@ function createWorkbenchUI(React) {
78
78
  }
79
79
  function Status({ children, tone = 'info', className }) {
80
80
  if (!children) return null;
81
- return h('div', { className: cx('w-status', 'w-status-' + tone, className), role: tone === 'error' ? 'alert' : 'status', 'aria-live': tone === 'error' ? 'assertive' : 'polite' }, h(Icon, { name: tone === 'success' ? 'check' : 'info', size: 18 }), h('div', null, children));
81
+ return h('div', { className: cx('dshw', 'w-status', 'w-status-' + tone, className), role: tone === 'error' ? 'alert' : 'status', 'aria-live': tone === 'error' ? 'assertive' : 'polite' }, h(Icon, { name: tone === 'success' ? 'check' : 'info', size: 18 }), h('div', null, children));
82
82
  }
83
83
  function Empty({ title, children, action, icon = 'file' }) {
84
- return h('div', { className: 'w-empty' }, h(Icon, { name: icon, size: 32 }), h('h2', null, title), children ? h('div', { className: 'w-muted' }, children) : null, action ? h('div', { className: 'w-toolbar' }, action) : null);
84
+ return h('div', { className: 'dshw w-empty' }, h(Styles, { key: 'styles' }), h(Icon, { name: icon, size: 32 }), h('h2', null, title), children ? h('div', { className: 'w-muted' }, children) : null, action ? h('div', { className: 'w-toolbar' }, action) : null);
85
85
  }
86
86
  function Split({ list, detail, selected, onBack, backLabel, className, listWidth = 360 }) {
87
87
  const ref = useRef(null);
@@ -125,7 +125,8 @@ function createWorkbenchUI(React) {
125
125
  else if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); }
126
126
  else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); }
127
127
  }
128
- return h('div', { className: 'w-overlay', onClick: event => { if (!busy && event.target === event.currentTarget) onClose(); } },
128
+ return h('div', { className: 'dshw w-overlay', onClick: event => { if (!busy && event.target === event.currentTarget) onClose(); } },
129
+ h(Styles, { key: 'styles' }),
129
130
  h('section', { ref: panel, className: cx('w-dialog', className), role: 'dialog', 'aria-modal': true, 'aria-labelledby': id, tabIndex: -1, onKeyDown: keydown },
130
131
  h('header', { className: 'w-dialog-header' }, h('h2', { id }, title), h(IconButton, { icon: 'close', label: closeLabel, disabled: busy, onClick: onClose })), h('div', { className: 'w-dialog-body' }, children)));
131
132
  }
@@ -136,10 +137,10 @@ function createWorkbenchUI(React) {
136
137
  ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({ name: 'sidebar.panellist', id, order, label }, function WorkbenchIcon({ size }) { return h(Icon, { name: icon, size }); }));
137
138
  }
138
139
  const styles = `
139
- .dshw{--w-bg:var(--dsw-alias-bg-layer-1,#fff);--w-soft:var(--dsw-alias-bg-layer-2,#f7f8fa);--w-text:var(--dsw-alias-label-primary,#18202c);--w-muted:var(--dsw-alias-label-secondary,#667085);--w-border:var(--dsw-alias-border-l3,#e7e9ef);--w-accent:var(--dsh-plugin-workbench-accent,#4f6bdb);--w-selected:color-mix(in srgb,var(--w-accent) 10%,var(--w-bg));--w-primary:var(--w-text);--w-on-primary:var(--w-bg);container-type:inline-size;container-name:dsh-workbench;color:var(--w-text);background:var(--w-bg);font:14px/1.65 var(--dsh-font-family-content,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif);min-width:0;max-width:100%;box-sizing:border-box;text-align:start;color-scheme:inherit}
140
- .dshw *,.dshw *:before,.dshw *:after{box-sizing:border-box}.dshw h1,.dshw h2,.dshw h3,.dshw h4,.dshw p{margin:0}.dshw h1{font-size:30px;line-height:1.25;letter-spacing:-.025em;font-weight:650}.dshw h2{font-size:24px;line-height:1.35;font-weight:650;letter-spacing:-.015em;overflow-wrap:anywhere}.dshw h3,.dshw h4{font-size:16px;line-height:1.4;font-weight:600}.dshw a{color:var(--w-accent);text-underline-offset:3px;overflow-wrap:anywhere}.dshw button,.dshw input,.dshw select,.dshw textarea{font:inherit;color:inherit;max-width:100%}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select,.dshw textarea{background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 11px;min-width:0;line-height:1.5}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select{min-height:38px}.dshw textarea{resize:vertical}.dshw input[type=checkbox],.dshw input[type=radio]{width:16px;height:16px;flex-shrink:0;accent-color:var(--w-accent)}.dshw :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}.dshw button:disabled,.dshw input:disabled,.dshw select:disabled,.dshw textarea:disabled{opacity:.5;cursor:not-allowed}.dshw label{font-size:13px}.dshw fieldset{min-width:0;border:1px solid var(--w-border);border-radius:8px}.dshw summary{cursor:pointer;font-weight:550;list-style:none;display:flex;align-items:center;gap:8px}.dshw summary::-webkit-details-marker{display:none}.dshw summary:after{content:'';display:block;margin-inline-start:auto;width:7px;height:7px;border-inline-end:1.75px solid currentColor;border-bottom:1.75px solid currentColor;transform:rotate(45deg);flex-shrink:0}.dshw details[open]>summary:after{transform:rotate(225deg)}.dshw details>summary+*{margin-top:12px}.dshw pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace;max-width:100%;background:var(--w-soft);border-radius:6px;padding:14px}.dshw img,.dshw video,.dshw iframe{max-width:100%}
141
- .w-page{display:flex;flex-direction:column;position:relative;padding:0;min-height:540px;gap:0}.w-page[data-main=true]{height:100%;min-height:0;padding:calc(24px + var(--dsh-frame-top-clearance,0px)) 28px 0 max(28px,var(--dsh-frame-leading-clearance,0px));overflow:auto}.w-page-header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:22px;flex-shrink:0}.w-heading{min-width:0}.w-subtitle{margin-top:8px!important;font-size:14px;color:var(--w-muted);line-height:1.6}.w-header-actions,.w-toolbar,.w-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}.w-header-actions{justify-content:flex-end}.w-body,.w-tabs-layout{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}.w-body{overflow:auto}.w-tab-panel{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:auto}.w-tabs{display:flex;align-items:stretch;gap:20px;border-bottom:1px solid var(--w-border);flex-shrink:0;overflow-x:auto;scrollbar-width:thin}.dshw .w-tabs>button{border:0;border-bottom:2px solid transparent;background:transparent;padding:11px 8px 13px;white-space:nowrap;font-size:14px;font-weight:550;cursor:pointer;color:var(--w-muted);display:flex;align-items:center;gap:7px}.dshw .w-tabs>button[aria-selected=true]{border-bottom-color:var(--w-accent);color:var(--w-accent)}.w-count,.w-tag{font-size:12px;line-height:1.5;display:inline-flex;align-items:center;flex-shrink:0;background:var(--w-soft);border-radius:5px;padding:1px 6px;color:var(--w-muted)}.w-tabs [aria-selected=true] .w-count,.w-selected .w-tag{color:var(--w-accent);background:var(--w-selected)}
142
- .dshw .w-button{display:inline-flex;justify-content:center;align-items:center;gap:7px;background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 12px;min-height:36px;line-height:1.4;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;white-space:normal}.dshw .w-button:not(:disabled):hover{background:var(--w-soft)}.dshw .w-primary{background:var(--w-primary);border-color:var(--w-primary);color:var(--w-on-primary)}.dshw .w-primary:not(:disabled):hover{background:var(--w-primary);opacity:.9}.dshw .w-ghost{background:transparent;border-color:transparent}.dshw .w-danger{color:var(--dsw-alias-state-error-primary,#b43c3c)}.dshw .w-icon-button{width:36px;min-width:36px;padding:8px}.dshw .w-button svg{flex-shrink:0}.w-muted{color:var(--w-muted);font-size:12px;line-height:1.6}.w-section{padding:24px 0;border-bottom:1px solid var(--w-border);min-width:0}.w-section>h3{margin-bottom:12px}.w-section>p+p{margin-top:8px}.w-fields{display:grid;gap:16px;min-width:0}.w-field{display:grid;gap:6px;min-width:0}.w-field>input,.w-field>select,.w-field>textarea{width:100%}.w-status{display:flex;align-items:flex-start;gap:8px;padding:11px 13px;margin:12px 0;border:1px solid var(--w-border);border-radius:8px;background:var(--w-soft);font-size:13px;overflow-wrap:anywhere;flex-shrink:0}.w-status>svg{flex-shrink:0;margin-top:2px}.w-status-error{color:var(--dsw-alias-state-error-primary,#ad3636)}.w-status-success{color:var(--dsw-alias-state-success-primary,#24794a)}.w-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;max-width:580px;padding:48px 24px;margin:auto;min-height:280px;overflow-wrap:anywhere}.w-empty>svg{color:var(--w-muted)}.w-empty h2{font-size:20px}.w-empty .w-muted{font-size:14px}.w-empty .w-toolbar{justify-content:center}
140
+ .dshw{--w-bg:var(--dsw-alias-bg-layer-1,#fff);--w-soft:var(--dsw-alias-bg-layer-2,#f7f8fa);--w-text:var(--dsw-alias-label-primary,#18202c);--w-muted:var(--dsw-alias-label-secondary,#667085);--w-border:var(--dsw-alias-border-l3,#e7e9ef);--w-accent:var(--dsh-plugin-workbench-accent,#4f6bdb);--w-selected:color-mix(in srgb,var(--w-accent) 10%,var(--w-bg));--w-primary:var(--w-text);--w-on-primary:var(--w-bg);container-type:inline-size;container-name:dsh-workbench;color:var(--w-text);font:14px/1.65 var(--dsh-font-family-content,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif);min-width:0;max-width:100%;box-sizing:border-box;text-align:start;color-scheme:inherit}
141
+ .dshw *,.dshw *:before,.dshw *:after{box-sizing:border-box}.dshw h1,.dshw h2,.dshw h3,.dshw h4,.dshw p{margin:0}.dshw h1{font-size:30px;line-height:1.25;letter-spacing:-.025em;font-weight:650}.dshw h2{font-size:24px;line-height:1.35;font-weight:650;letter-spacing:-.015em;overflow-wrap:anywhere}.dshw h3,.dshw h4{font-size:16px;line-height:1.4;font-weight:600}.dshw a{color:var(--w-accent);text-underline-offset:3px;overflow-wrap:anywhere}.dshw button,.dshw input,.dshw select,.dshw textarea{font:inherit;color:inherit;max-width:100%}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select,.dshw textarea{background:var(--dsw-specific-input-major,var(--w-bg));border:1px solid var(--w-border);border-radius:8px;padding:8px 11px;min-width:0;line-height:1.5}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select{min-height:38px}.dshw textarea{resize:vertical}.dshw input[type=checkbox],.dshw input[type=radio]{width:16px;height:16px;flex-shrink:0;accent-color:var(--w-accent)}.dshw :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}.dshw button:disabled,.dshw input:disabled,.dshw select:disabled,.dshw textarea:disabled{opacity:.5;cursor:not-allowed}.dshw label{font-size:13px}.dshw fieldset{min-width:0;border:1px solid var(--w-border);border-radius:8px}.dshw summary{cursor:pointer;font-weight:550;list-style:none;display:flex;align-items:center;gap:8px}.dshw summary::-webkit-details-marker{display:none}.dshw summary:after{content:'';display:block;margin-inline-start:auto;width:7px;height:7px;border-inline-end:1.75px solid currentColor;border-bottom:1.75px solid currentColor;transform:rotate(45deg);flex-shrink:0}.dshw details[open]>summary:after{transform:rotate(225deg)}.dshw details>summary+*{margin-top:12px}.dshw pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace;max-width:100%;background:var(--w-soft);border-radius:6px;padding:14px}.dshw img,.dshw video,.dshw iframe{max-width:100%}
142
+ .w-page{display:flex;flex-direction:column;position:relative;padding:0;min-height:540px;gap:0}.w-page[data-main=true]{height:100%;min-height:0;padding:calc(24px + var(--dsh-frame-top-clearance,0px)) 28px 0 max(28px,var(--dsh-frame-leading-clearance,0px));overflow:auto}.dshw[data-main=true]{background:var(--w-bg)}.dshw.w-page,.dshw .w-body,.dshw .w-tab-panel{overflow-x:clip}.w-page-header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:22px;flex-shrink:0}.w-heading{min-width:0}.w-subtitle{margin-top:8px!important;font-size:14px;color:var(--w-muted);line-height:1.6}.w-header-actions,.w-toolbar,.w-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}.w-header-actions{justify-content:flex-end}.w-body,.w-tabs-layout{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}.w-body{overflow:auto}.w-tab-panel{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:auto}.w-tabs{display:flex;align-items:stretch;gap:20px;border-bottom:1px solid var(--w-border);flex-shrink:0;overflow-x:auto;scrollbar-width:thin}.dshw .w-tabs>button{border:0;border-bottom:2px solid transparent;background:transparent;padding:11px 8px 13px;white-space:nowrap;font-size:14px;font-weight:550;cursor:pointer;color:var(--w-muted);display:flex;align-items:center;gap:7px}.dshw .w-tabs>button[aria-selected=true]{border-bottom-color:var(--w-accent);color:var(--w-accent)}.w-count,.w-tag{font-size:12px;line-height:1.5;display:inline-flex;align-items:center;flex-shrink:0;background:var(--w-soft);border-radius:5px;padding:1px 6px;color:var(--w-muted)}.w-tabs [aria-selected=true] .w-count,.w-selected .w-tag{color:var(--w-accent);background:var(--w-selected)}
143
+ .dshw .w-button{display:inline-flex;justify-content:center;align-items:center;gap:7px;background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 12px;min-height:36px;line-height:1.4;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;white-space:normal}.dshw .w-button:not(:disabled):hover{background:var(--w-soft)}.dshw .w-primary{background:var(--w-primary);border-color:var(--w-primary);color:var(--w-on-primary)}.dshw .w-primary:not(:disabled):hover{background:var(--w-primary);opacity:.9}.dshw .w-ghost{background:transparent;border-color:transparent}.dshw .w-danger{color:var(--dsw-alias-state-error-primary,#b43c3c)}.dshw .w-icon-button{width:36px;min-width:36px;padding:8px}.dshw .w-button svg{flex-shrink:0}.w-muted{color:var(--w-muted);font-size:12px;line-height:1.6}.w-section{padding:24px 0;border-bottom:1px solid var(--w-border);min-width:0}.w-section>h3{margin-bottom:12px}.w-section>p+p{margin-top:8px}.w-fields{display:grid;gap:16px;min-width:0}.w-field{display:grid;gap:6px;min-width:0}.w-field>input,.w-field>select,.w-field>textarea{width:100%}.w-status{display:flex;align-items:flex-start;gap:8px;padding:11px 13px;margin:12px 0;border:1px solid var(--w-border);border-radius:8px;background:var(--w-soft);font-size:13px;overflow-wrap:anywhere;flex-shrink:0}.w-status>svg{flex-shrink:0;margin-top:2px}.w-status-error{color:var(--dsw-alias-state-error-primary,#ad3636)}.w-status-success{color:var(--dsw-alias-state-success-primary,#24794a)}.w-status-warn{color:var(--dsw-alias-state-warning-primary,#8a5a00)}.w-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;width:100%;max-width:580px;padding:48px 24px;margin:auto;min-height:280px;overflow-wrap:anywhere}.w-empty>svg{color:var(--w-muted)}.w-empty h2{font-size:20px}.w-empty .w-muted{font-size:14px}.w-empty .w-toolbar{justify-content:center}
143
144
  .w-split{display:grid;grid-template-columns:minmax(240px,var(--w-list-width)) minmax(0,1fr);min-height:460px;flex:1;min-width:0}.w-master{min-width:0;border-inline-end:1px solid var(--w-border);overflow:auto;padding-bottom:24px}.w-detail{min-width:0;padding:26px 28px;overflow:auto;overflow-wrap:anywhere;display:flex;flex-direction:column}.w-master-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:20px 16px}.w-search{display:flex;align-items:center;gap:8px;border:1px solid var(--w-border);border-radius:8px;padding:0 10px;min-width:0;flex:1;background:var(--w-bg)}.w-search>svg{color:var(--w-muted);flex-shrink:0}.dshw .w-search>input{border:0!important;background:transparent!important;padding:8px 0!important;width:100%;outline-offset:0}.w-row{display:flex;gap:0;min-width:0;position:relative;border-bottom:1px solid var(--w-border);border-inline-start:3px solid transparent}.w-row-select{display:flex;align-items:flex-start;padding:21px 0 0 14px}.dshw .w-row-button{display:flex;flex-direction:column;align-items:stretch;gap:7px;text-align:start;width:100%;padding:18px 18px 18px 16px;border:0;background:transparent;color:inherit;min-width:0;cursor:pointer;line-height:1.5}.dshw .w-row-button:hover{background:var(--w-soft)}.w-row-head{display:flex;align-items:flex-start;gap:10px;justify-content:space-between;min-width:0}.w-row-head>strong{font-size:14px;line-height:1.5;font-weight:600;overflow-wrap:anywhere}.w-row-meta,.w-row-description{color:var(--w-muted);font-size:12px;line-height:1.6;overflow-wrap:anywhere}.w-row-description{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.w-selected{background:var(--w-selected);border-inline-start-color:var(--w-accent)}.w-back{display:none!important}.w-detail-title{margin-bottom:12px!important}.w-detail-meta{color:var(--w-muted);font-size:13px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.w-detail-footer{padding:24px 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:auto;border-top:1px solid var(--w-border)}.w-detail-footer .w-muted{flex:1;min-width:160px}.w-definition{display:grid;grid-template-columns:minmax(80px,120px) minmax(0,1fr);gap:8px 16px;font-size:14px;margin:20px 0}.w-definition dt{color:var(--w-muted)}.w-definition dd{margin:0;min-width:0;overflow-wrap:anywhere}
144
145
  .w-switch-label{display:inline-flex;align-items:center;gap:8px;font-size:13px;position:relative;cursor:pointer}.w-switch-label>input{position:absolute;opacity:0;inset-inline-end:0;width:36px!important;height:22px!important;margin:0;cursor:pointer}.w-switch-track{width:36px;height:22px;border-radius:12px;display:block;background:var(--w-border);border:1px solid var(--w-border);pointer-events:none;padding:2px;transition:background .15s}.w-switch-track:before{content:'';display:block;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0002;transition:transform .15s}.w-switch-label>input:checked+.w-switch-track{background:var(--w-accent);border-color:var(--w-accent)}.w-switch-label>input:checked+.w-switch-track:before{transform:translateX(14px)}.w-switch-label>input:focus-visible+.w-switch-track{outline:2px solid var(--w-accent);outline-offset:3px}.w-switch-label:has(>input:disabled){opacity:.5;cursor:not-allowed}
145
146
  .w-overlay{position:fixed;inset:0;background:#0005;display:flex;justify-content:flex-end;z-index:1000;padding:12px;overflow:auto}.w-dialog{width:min(620px,100%);max-height:100%;display:flex;flex-direction:column;min-height:0;background:var(--w-bg);color:var(--w-text);border:1px solid var(--w-border);border-radius:12px;box-shadow:0 18px 70px #0003}.w-dialog-header{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:20px 24px;border-bottom:1px solid var(--w-border);flex-shrink:0}.w-dialog-header>h2{font-size:20px}.w-dialog-body{overflow:auto;padding:20px 24px;min-height:0}.w-editor-grid{display:grid;grid-template-columns:210px minmax(0,1fr) 300px;min-height:500px;flex:1}.w-editor-list{padding:20px 12px;border-inline-end:1px solid var(--w-border);min-width:0}.w-editor-canvas{background:var(--w-soft);padding:20px;min-width:0;display:flex;flex-direction:column;gap:14px}.w-editor-inspector{padding:24px;border-inline-start:1px solid var(--w-border);min-width:0;overflow:auto}.w-editor-inspector h3{margin-bottom:18px}.w-preview-empty{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:12px;aspect-ratio:16/9;min-height:180px;background:var(--w-soft);border:1px solid var(--w-border);border-radius:8px;padding:24px;color:var(--w-muted)}.w-content-pad{padding:24px 0}.w-stack{display:flex;flex-direction:column;gap:16px;min-width:0}.w-scroll-x{overflow:auto;max-width:100%}
@@ -148,7 +149,8 @@ function createWorkbenchUI(React) {
148
149
  @media(max-width:700px){.w-page[data-main=true]{padding:calc(16px + var(--dsh-frame-top-clearance,0px)) 16px 0 max(16px,var(--dsh-frame-leading-clearance,0px))}.w-overlay{padding:8px}.w-dialog{width:100%}}
149
150
  @media(prefers-reduced-motion:reduce){.dshw *,.dshw *:before{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
150
151
  `;
151
- return { Icon, Button, IconButton, Page, Tabs, Status, Empty, Split, Row, Search, Switch, Dialog, register, styles };
152
+ function Styles() { return h('style', null, styles); }
153
+ return { Icon, Button, IconButton, Page, Tabs, Status, Empty, Split, Row, Search, Switch, Dialog, Styles, register, styles };
152
154
  }
153
155
 
154
156
  /* One update control per plugin. Only transport, idle guards and installation
@@ -228,6 +230,13 @@ function __stardustUpdatesWrap(definition, participant) {
228
230
  const React = require('react');
229
231
  return { ...original, apply(ctx, ...args) {
230
232
  const result = original.apply?.call(this, ctx, ...args);
233
+ // The optional alpha.3 slot stays dormant in older hosts; its scoped
234
+ // injection unregisters naturally when the plugin is unloaded.
235
+ if (participant.iconData && participant.sectionIds?.length && typeof ctx.inject === 'function') ctx.inject(['slots'], host => {
236
+ for (const id of new Set(participant.sectionIds)) host.slots.inject('settings.section.icon', () => host.slots.register({ name: 'settings.section.icon', id }, function PluginSettingsIcon({ size = 20 }) {
237
+ return React.createElement('img', { src: participant.iconData, alt: '', 'aria-hidden': true, width: size, height: size, style: { objectFit: 'contain', display: 'block', flexShrink: 0 } });
238
+ }));
239
+ });
231
240
  if (typeof ctx.inject === 'function') ctx.inject(['slots', 'locale', 'remote', 'remote.pluginManager'], host => __stardustUpdatesJoin(host, React, require, participant));
232
241
  return result;
233
242
  } };
@@ -333,6 +342,16 @@ function __stardustUpdatesClient(ctx, React, require, shared) {
333
342
  'owner-required': t('只有 profile 拥有者能管理更新。', 'Only the profile owner can manage updates.'),
334
343
  })[code] || t('操作未完成,请刷新后重试。DSH 不会因此自动重启。', 'The operation could not be completed. Refresh and retry. DSH will not restart automatically.');
335
344
  }
345
+ // releaseOf() keeps the failing engine/peer range check as a stable code; say which
346
+ // environment has to change instead of only reporting that the release is incompatible.
347
+ function requirement(release) {
348
+ return ({
349
+ 'dsh-version': t('需要换成与该版本匹配的 DSH 本体', 'it needs a different DSH version'),
350
+ 'node-version': t('需要换成与该版本匹配的 Node.js', 'it needs a different Node.js version'),
351
+ deprecated: t('作者已把这个版本标记为弃用', 'the author marked this release as deprecated'),
352
+ 'not-bundle': t('这个版本不是可加载的 DSH 插件包', 'this release is not a loadable DSH plugin bundle'),
353
+ })[release?.reason] || t('发布元数据的兼容范围与当前环境不符', 'its published compatibility range does not match this environment');
354
+ }
336
355
  function jobLabel(job) {
337
356
  return ({ verifying: t('正在核对版本', 'Verifying release'), installing: t('正在安装', 'Installing'), cancelling: t('正在请求取消', 'Requesting cancellation'), complete: t('已更新', 'Updated'), 'restart-required': t('已安装,等待你手动重启', 'Installed; manual restart needed'), restored: t('更新未成功,已恢复原版本', 'Update failed; previous version restored'), 'restore-failed': t('恢复未成功,请检查官方插件管理', 'Recovery failed; check native plugin management'), unknown: t('结果未确认,请检查官方插件管理', 'Result unconfirmed; check native plugin management'), cancelled: t('已取消', 'Cancelled'), failed: t('更新未成功', 'Update failed') })[job.state] || job.state;
338
357
  }
@@ -371,7 +390,7 @@ function __stardustUpdatesClient(ctx, React, require, shared) {
371
390
  const title = language() === 'en' ? original.labelEn : original.label;
372
391
  const ownPage = pageState(true), unconfirmed = ['unknown', 'restore-failed'].includes(snapshot.job?.state), pageBusy = ownPage.busy || (snapshot.pages.clients || []).some(client => client.id !== id && client.busy), installLocked = working || activeJob() || unconfirmed || snapshot.updaterRestart || snapshot.preferenceError || !snapshot.activity.known || snapshot.activity.busy || snapshot.pages.dirty || ownPage.dirty || pageBusy || !snapshot.pages.known;
373
392
  const checkingThis = checking || snapshot.checkingNames?.includes(target);
374
- const status = row.sourceKind !== 'registry' ? t('本地 / 外部来源,保留原安装方式', 'Local / external source; keep original install method') : row.loadError ? t('加载异常,请先检查官方插件管理', 'Loading error; check native plugin management') : row.error ? t('检查失败,可以重试', 'Check failed; retry available') : row.release && !row.release.compatible ? t('新版本暂不兼容当前环境', 'Latest release is incompatible with this environment') : row.available ? (prefs.ignoredVersion === row.release.version ? t('已忽略提醒,仍可手动更新', 'Reminder ignored; manual update available') : t('有新版本', 'Update available')) : row.checkedAt ? t('当前已是最新稳定版', 'Latest stable version') : t('尚未检查', 'Not checked yet');
393
+ const status = row.sourceKind !== 'registry' ? t('本地 / 外部来源,保留原安装方式', 'Local / external source; keep original install method') : row.loadError ? t('加载异常,请先检查官方插件管理', 'Loading error; check native plugin management') : row.error ? t('检查失败,可以重试', 'Check failed; retry available') : row.release && !row.release.compatible ? t('新版本暂不兼容当前环境:', 'Latest release is incompatible with this environment: ') + requirement(row.release) : row.available ? (prefs.ignoredVersion === row.release.version ? t('已忽略提醒,仍可手动更新', 'Reminder ignored; manual update available') : t('有新版本', 'Update available')) : row.checkedAt ? t('当前已是最新稳定版', 'Latest stable version') : t('尚未检查', 'Not checked yet');
375
394
  return h(FooterFrame, { name, label: title, subtitle: original.name + ' · ' + original.version, actions: h(W.Button, { icon: 'refresh', disabled: checkingThis || row.sourceKind !== 'registry', onClick: check }, checkingThis ? t('正在检查…', 'Checking…') : target === '@stardustlc/dsh-suite' ? t('检查整包更新', 'Check Suite updates') : t('检查更新', 'Check for updates')) },
376
395
  original.bundledBy && h(W.Status, null, t('此插件随 Suite 安装。以下设置与安装作用于 Suite 整包,以保持组件版本一致。单独安装的插件可以独立更新。', 'This plugin was installed through Suite. These controls update Suite as a package so its components stay consistent. Independently installed plugins update individually.')),
377
396
  h('section', { className: 'w-section' }, (original.bundledBy || row.available) && h('p', { className: 'updates-version' }, target + ' · ' + row.version, row.release?.version && row.release.version !== row.version ? ' → ' + row.release.version : ''), h('p', { className: 'w-muted updates-note' }, status), !row.enabled && h('p', { className: 'w-muted' }, t('当前已停用,更新后仍保持停用。', 'Currently disabled; it will remain disabled after updating.')), row.checkedAt && h('p', { className: 'w-muted updates-note' }, t('上次检查:', 'Last checked: ') + new Date(row.checkedAt).toLocaleString(language() === 'en' ? 'en-US' : 'zh-CN')),
@@ -494,7 +513,7 @@ function createWorkbenchUI(React) {
494
513
  }
495
514
  function Page({ title, subtitle, actions, children, workbench = false, className, rootRef, ...props }) {
496
515
  return h('section', { ...props, ref: rootRef, className: cx('dshw', 'w-page', className), 'data-main': workbench ? 'true' : 'false' },
497
- h('style', null, styles),
516
+ h(Styles, { key: 'styles' }),
498
517
  h('header', { className: 'w-page-header' }, h('div', { className: 'w-heading' }, h('h1', null, title), subtitle ? h('p', { className: 'w-subtitle' }, subtitle) : null), actions ? h('div', { className: 'w-header-actions' }, actions) : null),
499
518
  h('div', { className: 'w-body' }, children));
500
519
  }
@@ -517,10 +536,10 @@ function createWorkbenchUI(React) {
517
536
  }
518
537
  function Status({ children, tone = 'info', className }) {
519
538
  if (!children) return null;
520
- return h('div', { className: cx('w-status', 'w-status-' + tone, className), role: tone === 'error' ? 'alert' : 'status', 'aria-live': tone === 'error' ? 'assertive' : 'polite' }, h(Icon, { name: tone === 'success' ? 'check' : 'info', size: 18 }), h('div', null, children));
539
+ return h('div', { className: cx('dshw', 'w-status', 'w-status-' + tone, className), role: tone === 'error' ? 'alert' : 'status', 'aria-live': tone === 'error' ? 'assertive' : 'polite' }, h(Icon, { name: tone === 'success' ? 'check' : 'info', size: 18 }), h('div', null, children));
521
540
  }
522
541
  function Empty({ title, children, action, icon = 'file' }) {
523
- return h('div', { className: 'w-empty' }, h(Icon, { name: icon, size: 32 }), h('h2', null, title), children ? h('div', { className: 'w-muted' }, children) : null, action ? h('div', { className: 'w-toolbar' }, action) : null);
542
+ return h('div', { className: 'dshw w-empty' }, h(Styles, { key: 'styles' }), h(Icon, { name: icon, size: 32 }), h('h2', null, title), children ? h('div', { className: 'w-muted' }, children) : null, action ? h('div', { className: 'w-toolbar' }, action) : null);
524
543
  }
525
544
  function Split({ list, detail, selected, onBack, backLabel, className, listWidth = 360 }) {
526
545
  const ref = useRef(null);
@@ -564,7 +583,8 @@ function createWorkbenchUI(React) {
564
583
  else if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); }
565
584
  else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); }
566
585
  }
567
- return h('div', { className: 'w-overlay', onClick: event => { if (!busy && event.target === event.currentTarget) onClose(); } },
586
+ return h('div', { className: 'dshw w-overlay', onClick: event => { if (!busy && event.target === event.currentTarget) onClose(); } },
587
+ h(Styles, { key: 'styles' }),
568
588
  h('section', { ref: panel, className: cx('w-dialog', className), role: 'dialog', 'aria-modal': true, 'aria-labelledby': id, tabIndex: -1, onKeyDown: keydown },
569
589
  h('header', { className: 'w-dialog-header' }, h('h2', { id }, title), h(IconButton, { icon: 'close', label: closeLabel, disabled: busy, onClick: onClose })), h('div', { className: 'w-dialog-body' }, children)));
570
590
  }
@@ -575,10 +595,10 @@ function createWorkbenchUI(React) {
575
595
  ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({ name: 'sidebar.panellist', id, order, label }, function WorkbenchIcon({ size }) { return h(Icon, { name: icon, size }); }));
576
596
  }
577
597
  const styles = `
578
- .dshw{--w-bg:var(--dsw-alias-bg-layer-1,#fff);--w-soft:var(--dsw-alias-bg-layer-2,#f7f8fa);--w-text:var(--dsw-alias-label-primary,#18202c);--w-muted:var(--dsw-alias-label-secondary,#667085);--w-border:var(--dsw-alias-border-l3,#e7e9ef);--w-accent:var(--dsh-plugin-workbench-accent,#4f6bdb);--w-selected:color-mix(in srgb,var(--w-accent) 10%,var(--w-bg));--w-primary:var(--w-text);--w-on-primary:var(--w-bg);container-type:inline-size;container-name:dsh-workbench;color:var(--w-text);background:var(--w-bg);font:14px/1.65 var(--dsh-font-family-content,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif);min-width:0;max-width:100%;box-sizing:border-box;text-align:start;color-scheme:inherit}
579
- .dshw *,.dshw *:before,.dshw *:after{box-sizing:border-box}.dshw h1,.dshw h2,.dshw h3,.dshw h4,.dshw p{margin:0}.dshw h1{font-size:30px;line-height:1.25;letter-spacing:-.025em;font-weight:650}.dshw h2{font-size:24px;line-height:1.35;font-weight:650;letter-spacing:-.015em;overflow-wrap:anywhere}.dshw h3,.dshw h4{font-size:16px;line-height:1.4;font-weight:600}.dshw a{color:var(--w-accent);text-underline-offset:3px;overflow-wrap:anywhere}.dshw button,.dshw input,.dshw select,.dshw textarea{font:inherit;color:inherit;max-width:100%}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select,.dshw textarea{background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 11px;min-width:0;line-height:1.5}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select{min-height:38px}.dshw textarea{resize:vertical}.dshw input[type=checkbox],.dshw input[type=radio]{width:16px;height:16px;flex-shrink:0;accent-color:var(--w-accent)}.dshw :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}.dshw button:disabled,.dshw input:disabled,.dshw select:disabled,.dshw textarea:disabled{opacity:.5;cursor:not-allowed}.dshw label{font-size:13px}.dshw fieldset{min-width:0;border:1px solid var(--w-border);border-radius:8px}.dshw summary{cursor:pointer;font-weight:550;list-style:none;display:flex;align-items:center;gap:8px}.dshw summary::-webkit-details-marker{display:none}.dshw summary:after{content:'';display:block;margin-inline-start:auto;width:7px;height:7px;border-inline-end:1.75px solid currentColor;border-bottom:1.75px solid currentColor;transform:rotate(45deg);flex-shrink:0}.dshw details[open]>summary:after{transform:rotate(225deg)}.dshw details>summary+*{margin-top:12px}.dshw pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace;max-width:100%;background:var(--w-soft);border-radius:6px;padding:14px}.dshw img,.dshw video,.dshw iframe{max-width:100%}
580
- .w-page{display:flex;flex-direction:column;position:relative;padding:0;min-height:540px;gap:0}.w-page[data-main=true]{height:100%;min-height:0;padding:calc(24px + var(--dsh-frame-top-clearance,0px)) 28px 0 max(28px,var(--dsh-frame-leading-clearance,0px));overflow:auto}.w-page-header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:22px;flex-shrink:0}.w-heading{min-width:0}.w-subtitle{margin-top:8px!important;font-size:14px;color:var(--w-muted);line-height:1.6}.w-header-actions,.w-toolbar,.w-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}.w-header-actions{justify-content:flex-end}.w-body,.w-tabs-layout{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}.w-body{overflow:auto}.w-tab-panel{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:auto}.w-tabs{display:flex;align-items:stretch;gap:20px;border-bottom:1px solid var(--w-border);flex-shrink:0;overflow-x:auto;scrollbar-width:thin}.dshw .w-tabs>button{border:0;border-bottom:2px solid transparent;background:transparent;padding:11px 8px 13px;white-space:nowrap;font-size:14px;font-weight:550;cursor:pointer;color:var(--w-muted);display:flex;align-items:center;gap:7px}.dshw .w-tabs>button[aria-selected=true]{border-bottom-color:var(--w-accent);color:var(--w-accent)}.w-count,.w-tag{font-size:12px;line-height:1.5;display:inline-flex;align-items:center;flex-shrink:0;background:var(--w-soft);border-radius:5px;padding:1px 6px;color:var(--w-muted)}.w-tabs [aria-selected=true] .w-count,.w-selected .w-tag{color:var(--w-accent);background:var(--w-selected)}
581
- .dshw .w-button{display:inline-flex;justify-content:center;align-items:center;gap:7px;background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 12px;min-height:36px;line-height:1.4;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;white-space:normal}.dshw .w-button:not(:disabled):hover{background:var(--w-soft)}.dshw .w-primary{background:var(--w-primary);border-color:var(--w-primary);color:var(--w-on-primary)}.dshw .w-primary:not(:disabled):hover{background:var(--w-primary);opacity:.9}.dshw .w-ghost{background:transparent;border-color:transparent}.dshw .w-danger{color:var(--dsw-alias-state-error-primary,#b43c3c)}.dshw .w-icon-button{width:36px;min-width:36px;padding:8px}.dshw .w-button svg{flex-shrink:0}.w-muted{color:var(--w-muted);font-size:12px;line-height:1.6}.w-section{padding:24px 0;border-bottom:1px solid var(--w-border);min-width:0}.w-section>h3{margin-bottom:12px}.w-section>p+p{margin-top:8px}.w-fields{display:grid;gap:16px;min-width:0}.w-field{display:grid;gap:6px;min-width:0}.w-field>input,.w-field>select,.w-field>textarea{width:100%}.w-status{display:flex;align-items:flex-start;gap:8px;padding:11px 13px;margin:12px 0;border:1px solid var(--w-border);border-radius:8px;background:var(--w-soft);font-size:13px;overflow-wrap:anywhere;flex-shrink:0}.w-status>svg{flex-shrink:0;margin-top:2px}.w-status-error{color:var(--dsw-alias-state-error-primary,#ad3636)}.w-status-success{color:var(--dsw-alias-state-success-primary,#24794a)}.w-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;max-width:580px;padding:48px 24px;margin:auto;min-height:280px;overflow-wrap:anywhere}.w-empty>svg{color:var(--w-muted)}.w-empty h2{font-size:20px}.w-empty .w-muted{font-size:14px}.w-empty .w-toolbar{justify-content:center}
598
+ .dshw{--w-bg:var(--dsw-alias-bg-layer-1,#fff);--w-soft:var(--dsw-alias-bg-layer-2,#f7f8fa);--w-text:var(--dsw-alias-label-primary,#18202c);--w-muted:var(--dsw-alias-label-secondary,#667085);--w-border:var(--dsw-alias-border-l3,#e7e9ef);--w-accent:var(--dsh-plugin-workbench-accent,#4f6bdb);--w-selected:color-mix(in srgb,var(--w-accent) 10%,var(--w-bg));--w-primary:var(--w-text);--w-on-primary:var(--w-bg);container-type:inline-size;container-name:dsh-workbench;color:var(--w-text);font:14px/1.65 var(--dsh-font-family-content,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif);min-width:0;max-width:100%;box-sizing:border-box;text-align:start;color-scheme:inherit}
599
+ .dshw *,.dshw *:before,.dshw *:after{box-sizing:border-box}.dshw h1,.dshw h2,.dshw h3,.dshw h4,.dshw p{margin:0}.dshw h1{font-size:30px;line-height:1.25;letter-spacing:-.025em;font-weight:650}.dshw h2{font-size:24px;line-height:1.35;font-weight:650;letter-spacing:-.015em;overflow-wrap:anywhere}.dshw h3,.dshw h4{font-size:16px;line-height:1.4;font-weight:600}.dshw a{color:var(--w-accent);text-underline-offset:3px;overflow-wrap:anywhere}.dshw button,.dshw input,.dshw select,.dshw textarea{font:inherit;color:inherit;max-width:100%}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select,.dshw textarea{background:var(--dsw-specific-input-major,var(--w-bg));border:1px solid var(--w-border);border-radius:8px;padding:8px 11px;min-width:0;line-height:1.5}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select{min-height:38px}.dshw textarea{resize:vertical}.dshw input[type=checkbox],.dshw input[type=radio]{width:16px;height:16px;flex-shrink:0;accent-color:var(--w-accent)}.dshw :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}.dshw button:disabled,.dshw input:disabled,.dshw select:disabled,.dshw textarea:disabled{opacity:.5;cursor:not-allowed}.dshw label{font-size:13px}.dshw fieldset{min-width:0;border:1px solid var(--w-border);border-radius:8px}.dshw summary{cursor:pointer;font-weight:550;list-style:none;display:flex;align-items:center;gap:8px}.dshw summary::-webkit-details-marker{display:none}.dshw summary:after{content:'';display:block;margin-inline-start:auto;width:7px;height:7px;border-inline-end:1.75px solid currentColor;border-bottom:1.75px solid currentColor;transform:rotate(45deg);flex-shrink:0}.dshw details[open]>summary:after{transform:rotate(225deg)}.dshw details>summary+*{margin-top:12px}.dshw pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace;max-width:100%;background:var(--w-soft);border-radius:6px;padding:14px}.dshw img,.dshw video,.dshw iframe{max-width:100%}
600
+ .w-page{display:flex;flex-direction:column;position:relative;padding:0;min-height:540px;gap:0}.w-page[data-main=true]{height:100%;min-height:0;padding:calc(24px + var(--dsh-frame-top-clearance,0px)) 28px 0 max(28px,var(--dsh-frame-leading-clearance,0px));overflow:auto}.dshw[data-main=true]{background:var(--w-bg)}.dshw.w-page,.dshw .w-body,.dshw .w-tab-panel{overflow-x:clip}.w-page-header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:22px;flex-shrink:0}.w-heading{min-width:0}.w-subtitle{margin-top:8px!important;font-size:14px;color:var(--w-muted);line-height:1.6}.w-header-actions,.w-toolbar,.w-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}.w-header-actions{justify-content:flex-end}.w-body,.w-tabs-layout{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}.w-body{overflow:auto}.w-tab-panel{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:auto}.w-tabs{display:flex;align-items:stretch;gap:20px;border-bottom:1px solid var(--w-border);flex-shrink:0;overflow-x:auto;scrollbar-width:thin}.dshw .w-tabs>button{border:0;border-bottom:2px solid transparent;background:transparent;padding:11px 8px 13px;white-space:nowrap;font-size:14px;font-weight:550;cursor:pointer;color:var(--w-muted);display:flex;align-items:center;gap:7px}.dshw .w-tabs>button[aria-selected=true]{border-bottom-color:var(--w-accent);color:var(--w-accent)}.w-count,.w-tag{font-size:12px;line-height:1.5;display:inline-flex;align-items:center;flex-shrink:0;background:var(--w-soft);border-radius:5px;padding:1px 6px;color:var(--w-muted)}.w-tabs [aria-selected=true] .w-count,.w-selected .w-tag{color:var(--w-accent);background:var(--w-selected)}
601
+ .dshw .w-button{display:inline-flex;justify-content:center;align-items:center;gap:7px;background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 12px;min-height:36px;line-height:1.4;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;white-space:normal}.dshw .w-button:not(:disabled):hover{background:var(--w-soft)}.dshw .w-primary{background:var(--w-primary);border-color:var(--w-primary);color:var(--w-on-primary)}.dshw .w-primary:not(:disabled):hover{background:var(--w-primary);opacity:.9}.dshw .w-ghost{background:transparent;border-color:transparent}.dshw .w-danger{color:var(--dsw-alias-state-error-primary,#b43c3c)}.dshw .w-icon-button{width:36px;min-width:36px;padding:8px}.dshw .w-button svg{flex-shrink:0}.w-muted{color:var(--w-muted);font-size:12px;line-height:1.6}.w-section{padding:24px 0;border-bottom:1px solid var(--w-border);min-width:0}.w-section>h3{margin-bottom:12px}.w-section>p+p{margin-top:8px}.w-fields{display:grid;gap:16px;min-width:0}.w-field{display:grid;gap:6px;min-width:0}.w-field>input,.w-field>select,.w-field>textarea{width:100%}.w-status{display:flex;align-items:flex-start;gap:8px;padding:11px 13px;margin:12px 0;border:1px solid var(--w-border);border-radius:8px;background:var(--w-soft);font-size:13px;overflow-wrap:anywhere;flex-shrink:0}.w-status>svg{flex-shrink:0;margin-top:2px}.w-status-error{color:var(--dsw-alias-state-error-primary,#ad3636)}.w-status-success{color:var(--dsw-alias-state-success-primary,#24794a)}.w-status-warn{color:var(--dsw-alias-state-warning-primary,#8a5a00)}.w-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;width:100%;max-width:580px;padding:48px 24px;margin:auto;min-height:280px;overflow-wrap:anywhere}.w-empty>svg{color:var(--w-muted)}.w-empty h2{font-size:20px}.w-empty .w-muted{font-size:14px}.w-empty .w-toolbar{justify-content:center}
582
602
  .w-split{display:grid;grid-template-columns:minmax(240px,var(--w-list-width)) minmax(0,1fr);min-height:460px;flex:1;min-width:0}.w-master{min-width:0;border-inline-end:1px solid var(--w-border);overflow:auto;padding-bottom:24px}.w-detail{min-width:0;padding:26px 28px;overflow:auto;overflow-wrap:anywhere;display:flex;flex-direction:column}.w-master-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:20px 16px}.w-search{display:flex;align-items:center;gap:8px;border:1px solid var(--w-border);border-radius:8px;padding:0 10px;min-width:0;flex:1;background:var(--w-bg)}.w-search>svg{color:var(--w-muted);flex-shrink:0}.dshw .w-search>input{border:0!important;background:transparent!important;padding:8px 0!important;width:100%;outline-offset:0}.w-row{display:flex;gap:0;min-width:0;position:relative;border-bottom:1px solid var(--w-border);border-inline-start:3px solid transparent}.w-row-select{display:flex;align-items:flex-start;padding:21px 0 0 14px}.dshw .w-row-button{display:flex;flex-direction:column;align-items:stretch;gap:7px;text-align:start;width:100%;padding:18px 18px 18px 16px;border:0;background:transparent;color:inherit;min-width:0;cursor:pointer;line-height:1.5}.dshw .w-row-button:hover{background:var(--w-soft)}.w-row-head{display:flex;align-items:flex-start;gap:10px;justify-content:space-between;min-width:0}.w-row-head>strong{font-size:14px;line-height:1.5;font-weight:600;overflow-wrap:anywhere}.w-row-meta,.w-row-description{color:var(--w-muted);font-size:12px;line-height:1.6;overflow-wrap:anywhere}.w-row-description{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.w-selected{background:var(--w-selected);border-inline-start-color:var(--w-accent)}.w-back{display:none!important}.w-detail-title{margin-bottom:12px!important}.w-detail-meta{color:var(--w-muted);font-size:13px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.w-detail-footer{padding:24px 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:auto;border-top:1px solid var(--w-border)}.w-detail-footer .w-muted{flex:1;min-width:160px}.w-definition{display:grid;grid-template-columns:minmax(80px,120px) minmax(0,1fr);gap:8px 16px;font-size:14px;margin:20px 0}.w-definition dt{color:var(--w-muted)}.w-definition dd{margin:0;min-width:0;overflow-wrap:anywhere}
583
603
  .w-switch-label{display:inline-flex;align-items:center;gap:8px;font-size:13px;position:relative;cursor:pointer}.w-switch-label>input{position:absolute;opacity:0;inset-inline-end:0;width:36px!important;height:22px!important;margin:0;cursor:pointer}.w-switch-track{width:36px;height:22px;border-radius:12px;display:block;background:var(--w-border);border:1px solid var(--w-border);pointer-events:none;padding:2px;transition:background .15s}.w-switch-track:before{content:'';display:block;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0002;transition:transform .15s}.w-switch-label>input:checked+.w-switch-track{background:var(--w-accent);border-color:var(--w-accent)}.w-switch-label>input:checked+.w-switch-track:before{transform:translateX(14px)}.w-switch-label>input:focus-visible+.w-switch-track{outline:2px solid var(--w-accent);outline-offset:3px}.w-switch-label:has(>input:disabled){opacity:.5;cursor:not-allowed}
584
604
  .w-overlay{position:fixed;inset:0;background:#0005;display:flex;justify-content:flex-end;z-index:1000;padding:12px;overflow:auto}.w-dialog{width:min(620px,100%);max-height:100%;display:flex;flex-direction:column;min-height:0;background:var(--w-bg);color:var(--w-text);border:1px solid var(--w-border);border-radius:12px;box-shadow:0 18px 70px #0003}.w-dialog-header{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:20px 24px;border-bottom:1px solid var(--w-border);flex-shrink:0}.w-dialog-header>h2{font-size:20px}.w-dialog-body{overflow:auto;padding:20px 24px;min-height:0}.w-editor-grid{display:grid;grid-template-columns:210px minmax(0,1fr) 300px;min-height:500px;flex:1}.w-editor-list{padding:20px 12px;border-inline-end:1px solid var(--w-border);min-width:0}.w-editor-canvas{background:var(--w-soft);padding:20px;min-width:0;display:flex;flex-direction:column;gap:14px}.w-editor-inspector{padding:24px;border-inline-start:1px solid var(--w-border);min-width:0;overflow:auto}.w-editor-inspector h3{margin-bottom:18px}.w-preview-empty{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:12px;aspect-ratio:16/9;min-height:180px;background:var(--w-soft);border:1px solid var(--w-border);border-radius:8px;padding:24px;color:var(--w-muted)}.w-content-pad{padding:24px 0}.w-stack{display:flex;flex-direction:column;gap:16px;min-width:0}.w-scroll-x{overflow:auto;max-width:100%}
@@ -587,7 +607,8 @@ function createWorkbenchUI(React) {
587
607
  @media(max-width:700px){.w-page[data-main=true]{padding:calc(16px + var(--dsh-frame-top-clearance,0px)) 16px 0 max(16px,var(--dsh-frame-leading-clearance,0px))}.w-overlay{padding:8px}.w-dialog{width:100%}}
588
608
  @media(prefers-reduced-motion:reduce){.dshw *,.dshw *:before{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
589
609
  `;
590
- return { Icon, Button, IconButton, Page, Tabs, Status, Empty, Split, Row, Search, Switch, Dialog, register, styles };
610
+ function Styles() { return h('style', null, styles); }
611
+ return { Icon, Button, IconButton, Page, Tabs, Status, Empty, Split, Row, Search, Switch, Dialog, Styles, register, styles };
591
612
  }
592
613
 
593
614
  // Editable browser entry. Build with node scripts/build-client.mjs.
@@ -750,6 +771,7 @@ let calendarHostContext;
750
771
  ".dshc-meta{color:var(--dsw-alias-label-tertiary,#6b7280);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}",
751
772
  ".dshc-tag{display:inline-block;font-size:11px;padding:1px 6px;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-label-primary,#111) 7%,transparent);color:var(--dsw-alias-label-tertiary,#6b7280);margin-left:6px}",
752
773
  ".dshc-empty{padding:26px 18px;text-align:center;color:var(--dsw-alias-label-tertiary,#6b7280)}",
774
+ ".dshc-emptyhint{margin:0 0 6px;font-size:12px;line-height:1.6;color:var(--dsw-alias-label-tertiary,#6b7280)}",
753
775
  ".dshc-empty h3{color:var(--dsw-alias-label-primary,#111);margin:0 0 6px;font-size:14px}",
754
776
  ".dshc-empty code{background:var(--dsw-alias-bg-layer-2,rgba(0,0,0,.05));padding:1px 5px;border-radius:5px;font-size:12px}",
755
777
  ".dshc-alert{display:flex;gap:8px;align-items:flex-start;border-radius:10px;padding:8px 10px;font-size:12px;margin-bottom:10px;background:color-mix(in srgb,var(--dsw-alias-label-primary,#111) 5%,transparent)}",
@@ -1329,7 +1351,8 @@ let calendarHostContext;
1329
1351
  return null;
1330
1352
  return h("div", { className: "dshc-modalwrap", onMouseDown: (e) => { if (e.target === e.currentTarget)
1331
1353
  props.onClose(); } }, [
1332
- h("div", { className: "dshc-modal" }, [
1354
+ // 宿主没有官方 Modal 时的兜底:至少给出与官方版相同的对话框语义(标题就是可及名)。
1355
+ h("div", { className: "dshc-modal", role: "dialog", "aria-modal": "true", "aria-label": props.title }, [
1333
1356
  h("div", { style: { position: "relative" } }, [
1334
1357
  h("div", { className: "dshc-drawertitle" }, props.title),
1335
1358
  h("button", { type: "button", className: "dshc-btn ghost dshc-close", onClick: props.onClose, "aria-label": props.closeLabel || props.title }, "\u2715")
@@ -1504,6 +1527,9 @@ let calendarHostContext;
1504
1527
  role: "button",
1505
1528
  tabIndex: 0,
1506
1529
  className: "dshc-cell" + (day.getMonth() !== anchor.getMonth() ? " out" : "") + (key === today ? " today" : ""),
1530
+ // 读屏只会念出格子里的日期数字,不说这一格是干什么的;补上「哪天 + 新建」的完整名字。
1531
+ "aria-label": formatDay(day, { withYear: true }) + " · " + t("action.new"),
1532
+ "aria-current": key === today ? "date" : undefined,
1507
1533
  onClick: () => onCreateAt(day),
1508
1534
  onKeyDown: (e) => { if (e.key === "Enter" || e.key === " ") {
1509
1535
  e.preventDefault();
@@ -1860,7 +1886,7 @@ let calendarHostContext;
1860
1886
  groups[index[key]].items.push(event);
1861
1887
  }
1862
1888
  if (groups.length === 0)
1863
- return h("div", { className: "dshc-empty" }, t("state.empty"));
1889
+ return h(W.Empty, { icon: "calendar", title: t("state.empty"), action: h(W.Button, { icon: "plus", variant: "primary", onClick: () => onCreateAt(new Date()) }, t("action.new")) });
1864
1890
  return h("div", { className: "dshc-agenda" }, groups.map((group) => h("div", { className: "dshc-daygroup", key: group.key }, [
1865
1891
  h("div", { className: "dshc-daylabel" }, [
1866
1892
  h("b", null, formatDay(group.day)),
@@ -2816,6 +2842,11 @@ __stardustUpdatesGuard(React, "dsh-calendar", { busy: busy || importBusy || laye
2816
2842
  notify(t("move.failed", { message: error !== null && error !== undefined && error.message ? error.message : String(error) }));
2817
2843
  }
2818
2844
  };
2845
+ /** 未连接日历时的点法:别让按钮「点了没反应」,直接打开连接设置并说明原因。 */
2846
+ const connectFirst = () => {
2847
+ setConnOpen(true);
2848
+ notify(calendarText('请先连接日历,再新建日程或查找空闲时段。', 'Connect a calendar before creating events or finding available time.'));
2849
+ };
2819
2850
  const notify = (text) => { setBanner(text); setTimeout(() => setBanner((current) => (current === text ? null : current)), 2200); };
2820
2851
  const title = view === "week" ? formatWeekTitle(anchor) : view === "agenda" ? t("view.agenda") : formatMonthTitle(anchor);
2821
2852
  const step = (delta) => setAnchor((current) => (view === "week" ? addDays(current, delta * 7) : addMonthShift(current, delta)));
@@ -2887,25 +2918,31 @@ __stardustUpdatesGuard(React, "dsh-calendar", { busy: busy || importBusy || laye
2887
2918
  h('div',{className:'calendar-view-controls',role:'group','aria-label':calendarText('日历视图','Calendar view')},VIEWS.map(name=>h(W.Button,{key:name,'aria-pressed':view === name,onClick:()=>{setView(name);storeView(name);}},t('view.'+name))),demo?h(W.Button,{onClick:()=>setDemo(false)},t('action.exitDemo')):h(W.IconButton,{icon:'refresh',label:t('action.refresh'),onClick:reload})));;
2888
2919
  const body = () => {
2889
2920
  if (demo === false && configured === false) {
2890
- return h("div", { className: "dshc-empty" }, [
2891
- h("h3", null, t("state.notConfigured")),
2892
- h("p", null, t("state.notConfiguredHint")),
2893
- h("div", { style: { marginTop: "12px", display: "flex", gap: "8px", justifyContent: "center" } }, [
2921
+ return h(W.Empty, {
2922
+ icon: "calendar",
2923
+ title: t("state.notConfigured"),
2924
+ action: h(React.Fragment, null, [
2894
2925
  h(Btn, { key: "cfg", variant: "primary", onClick: () => setConnOpen(true) }, t("conn.button")),
2895
2926
  h(Btn, { key: "demo", onClick: () => setDemo(true) }, t("action.demo"))
2896
2927
  ])
2897
- ]);
2928
+ }, h("p", null, t("state.notConfiguredHint")));
2898
2929
  }
2899
2930
  if (configured === null)
2900
2931
  return h("div", { className: "dshc-grid" }, Array.from({ length: 7 }, (_, i) => h("div", { className: "dshc-skel", key: i })));
2901
2932
  if (data.loading === true && data.events.length === 0) {
2902
2933
  return h("div", { className: "dshc-grid" }, Array.from({ length: 14 }, (_, i) => h("div", { className: "dshc-skel", key: i })));
2903
2934
  }
2904
- if (view === "week")
2905
- return h(WeekView, { anchor, events: visibleEvents, onPick: openEvent, onCreateAt: createAt, onReschedule: demo === true ? undefined : reschedule });
2906
- if (view === "agenda")
2907
- return h(AgendaView, { events: visibleEvents, onPick: openEvent, onCreateAt: createAt });
2908
- return h(MonthView, { anchor, events: visibleEvents, onPick: openEvent, onCreateAt: createAt });
2935
+ const viewNode = view === "week"
2936
+ ? h(WeekView, { anchor, events: visibleEvents, onPick: openEvent, onCreateAt: createAt, onReschedule: demo === true ? undefined : reschedule })
2937
+ : view === "agenda"
2938
+ ? h(AgendaView, { events: visibleEvents, onPick: openEvent, onCreateAt: createAt })
2939
+ : h(MonthView, { anchor, events: visibleEvents, onPick: openEvent, onCreateAt: createAt });
2940
+ // 空范围只给一行说明 + 下一步;出错时不冒充「没有日程」,把解释权留给错误条。
2941
+ const emptyHint = demo === false && view !== "agenda" && data.loading !== true && data.events.length === 0
2942
+ && (data.error === null || data.error === undefined);
2943
+ return emptyHint
2944
+ ? h(React.Fragment, null, h("p", { className: "dshc-emptyhint", role: "status" }, calendarText("这段时间没有日程。点日期格或「新建日程」开始。", "Nothing scheduled in this range. Click a date or use New event.")), viewNode)
2945
+ : viewNode;
2909
2946
  };
2910
2947
  const openEvent = (event) => { setConfirmDelete(false); setSelected(event); };
2911
2948
  const createAt = (day, hour) => {
@@ -2915,7 +2952,10 @@ __stardustUpdatesGuard(React, "dsh-calendar", { busy: busy || importBusy || laye
2915
2952
  }
2916
2953
  setDraft(draftAt(day, hour));
2917
2954
  };
2918
- const content = h("div", { ref: rootRef, className: "dshc-root" }, [
2955
+ // 浮层面板不是 W.Page,拿不到 ui/workbench-ui 的样式表;W.Button 之类会变成裸控件。
2956
+ // 这里补一份 kit 自己的 stylesheet(唯一规范源),不再另画一套按钮。
2957
+ const content = h("div", { ref: rootRef, className: "dshc-root" + (compact === true ? " dshw" : "") }, [
2958
+ compact === true ? h("style", { key: "kit-styles" }, W.styles) : null,
2919
2959
  h("div", { className: "dshc-shell" }, [
2920
2960
  banner !== null ? h("div", { className: "dshc-alert demo", role: "status", "aria-live": "polite" }, banner) : null,
2921
2961
  undo !== null
@@ -2994,8 +3034,8 @@ if(compact) return content;
2994
3034
  return __stardustUpdatesInlinePage(React,h(W.Page,{workbench:props.workbench===true,title:t('section.title'),subtitle:calendarText('查看日程、安排时间和管理导入。','View events, plan time and manage imports.'),className:'calendar-workbench',actions:h(React.Fragment,null,
2995
3035
  h(W.Button,{icon:'link',disabled:configured===null,onClick:()=>setConnOpen(true)},calendarText('日历连接','Calendar connection')),
2996
3036
  h(W.Button,{icon:'upload',disabled:demo || importBusy,onClick:()=>setImportOpen(value=>!value)},t('import.open')),
2997
- h(W.Button,{disabled:demo || configured!==true,onClick:()=>setAvailabilityOpen(v=>!v)},calendarText('找空闲时段','Find available time')),
2998
- h(W.Button,{variant:'primary',disabled:demo || configured!==true,title:configured!==true?calendarText('请先连接日历','Connect a calendar first'):undefined,onClick:()=>setDraft(draftAt(anchor))},t('action.new')))},h('style',null,CALENDAR_WORKBENCH_CSS),content),"dsh-calendar");
3037
+ h(W.Button,{disabled:demo || configured===null,onClick:()=>configured===true?setAvailabilityOpen(v=>!v):connectFirst()},calendarText('找空闲时段','Find available time')),
3038
+ h(W.Button,{variant:'primary',disabled:demo || configured===null,title:configured===true?undefined:calendarText('请先连接日历','Connect a calendar first'),onClick:()=>configured===true?setDraft(draftAt(anchor)):connectFirst()},t('action.new')))},h('style',null,CALENDAR_WORKBENCH_CSS),content),"dsh-calendar");
2999
3039
  }
3000
3040
  /** 月份平移:先跳到本月 1 号再加月,避免 1 月 31 日 +1 个月变成 3 月 3 日。 */
3001
3041
  function addMonthShift(date, delta) {
@@ -3125,7 +3165,7 @@ calendarHostContext=ctx;W.register(ctx,{id:'dsh-calendar.workbench',label:()=>t(
3125
3165
  exports.apply = apply;
3126
3166
  exports.inject = inject;
3127
3167
  return module.exports;
3128
- } },{"name":"dsh-calendar","version":"0.1.0","hasWorkbench":true,"packageVersion":"0.14.3","label":"日历","labelEn":"Calendar","suiteComponent":true}));
3168
+ } },{"name":"dsh-calendar","version":"0.1.0","hasWorkbench":true,"packageVersion":"0.14.5","label":"日历","labelEn":"Calendar","suiteComponent":true,"sectionIds":["dsh-calendar"],"iconData":"data:image/webp;base64,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"}));
3129
3169
 
3130
3170
  })();
3131
3171
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-calendar",
3
- "version": "0.14.3",
4
- "description": "看清日程,找到当前日历里合适的空闲时间。 需要自己的 CalDAV 账号。空闲查询只覆盖当前连接的日历。 欢迎提交 issues 和 PR。",
3
+ "version": "0.14.5",
4
+ "description": "DSH 日历工作台:CalDAV 日程、月 / 周 / 议程视图、空闲时段建议与 ICS 预览导入。欢迎提交 issues 和 PR。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -27,8 +27,8 @@
27
27
  "scripts": {
28
28
  "build": "tsc -p tsconfig.json && node scripts/build-client.mjs && node scripts/build-updates.mjs",
29
29
  "typecheck": "tsc -p tsconfig.json --noEmit",
30
- "test": "pnpm run build && node --test \"test/*.test.mjs\"",
31
- "prepublishOnly": "pnpm run build"
30
+ "test": "npm run build && node --test \"test/*.test.mjs\"",
31
+ "prepublishOnly": "npm run build"
32
32
  },
33
33
  "dsh": {
34
34
  "bundle": {
@@ -66,7 +66,7 @@
66
66
  "tsdav": "^2.3.1",
67
67
  "undici": "^8.11.2",
68
68
  "yaml": "^2.9.1",
69
- "@stardustlc/dsh-updates": "0.1.3"
69
+ "@stardustlc/dsh-updates": "0.1.4"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@types/node": "^24.0.0",