dsh-session-manager 0.6.2 → 0.6.3
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 +58 -0
- package/README.md +6 -2
- package/README.zh.md +6 -2
- package/lib/client.js +298 -76
- package/lib/index.js +1 -1
- package/package.json +2 -2
- package/README.local-workflow.md +0 -52
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,62 @@
|
|
|
1
1
|
|
|
2
|
+
## 0.6.3 — 2026-10-03
|
|
3
|
+
|
|
4
|
+
- **feat(settings)**: 新增「弹窗透明度 / Dialog opacity」偏好设置(Issue #23),为第三方主题下的插件弹窗提供通用、不依赖任何主题插件的调节手段:
|
|
5
|
+
- 位置:设置卡片「偏好设置」区域;滑块范围 50%–100%,步长 5%,默认 100%,实时显示当前百分比,并提供「恢复默认」按钮。
|
|
6
|
+
- 通过 `localStorage`(`dsh-session-manager-dialog-opacity`)持久化,复用现有偏好存储,未新建存储系统;拖动滑块立即生效,无需重启 DSH。
|
|
7
|
+
- 透明度只作用于弹窗**背景填充**:新增插件自有变量 `--sm-dialog-opacity`,配合 `color-mix()` 施加到 DSH 的抬升表面 token(`--dsw-alias-bg-layer-1`)上。文字、按钮、输入框、标签、badge、边框、hover 与危险按钮颜色保持完全不透明,并继续跟随 DSH 主题变量。未使用整元素 `opacity`。
|
|
8
|
+
- **不破坏 token 自带 alpha**:默认 100% 时 `color-mix(in srgb, <token> 100%, transparent)` 会**原样**还原 token(含其自身 alpha),因此插件绝不会把 DSH(或主题重新发布的)半透明表面强行变为不透明;只有用户主动下调滑块时才会额外增加透明。输入框、textarea、select、按钮、菜单、filter、卡片等内部控件读取各自的 DSH token,不继承该透明度设置(「统一主题来源,不统一透明度」)。
|
|
9
|
+
- 未检测任何主题插件、未枚举主题名称、未读取第三方插件私有变量;第三方主题只需发布 `--dsw-alias-*` token 即可被继承。
|
|
10
|
+
- **fix(css)**: 修复第三方主题被硬编码背景阻断的问题(Issue #23):
|
|
11
|
+
- 原代码使用的 `--dsw-alias-surface-l1` 在 DSH 中并不存在,所有 `var(--dsw-alias-surface-l1, #fff)` 实际总是回退为硬编码 `#fff`;已改为真实的 DSH token(弹窗 `--dsw-alias-bg-layer-1`,对话框内输入/下拉与菜单 `--dsw-alias-bg-layer-2`)。
|
|
12
|
+
- 移除 `background:#fff!important` / `background-color:#fff!important` / `background:#1f1f23!important` / `background-color:#1f1f23!important` 强制锁色,以及弹窗根节点上多余的 `opacity:1` 与 `.sm-migrateDialog` 上的 `backdrop-filter:none`。
|
|
13
|
+
- 删除 `smApplyInlineTheme()`:它向弹窗根节点写入内联 `!important` 背景/文字/边框颜色,会无条件覆盖包括第三方主题在内的任何主题;浅色/深色适配改由 `html[data-sm-theme]` 作用域 CSS 与 token 回退值承担。
|
|
14
|
+
- 弹窗头部/主体/底部不再各自绘制不透明底色(迁移弹窗原本重绘 `#fff`),透明度因此只叠加一次,50% 设置不会被内部不透明层抵消。
|
|
15
|
+
- **fix(plugin-css)**: 插件样式表按 `data-plugin-css` 去重时只创建不更新,导致客户端插件热重载后页面沿用旧版本 CSS(表现为「设置项已出现但样式不生效」);现在每次加载都会重写样式表内容。
|
|
16
|
+
- **feat(opacity)**: 统一接入透明度的弹窗:会话管理主面板 / 标记(annotation)面板(`.sm-panelDialog`、`.sm-annotationSurface`)、删除/移动/迁移确认弹窗(`.sm-confirmDialog .sm-nativeDialog`)、迁移预设弹窗(`.sm-migrateDialog`)、更新弹窗(`.sm-updateDialogLayer .sm-nativeDialog`)、批量操作弹窗(`.sm-bulkDialog .sm-nativeDialog`,含预览/进度/结果/标签/预设迁移)。
|
|
17
|
+
- **test**: 新增 `test/client-dialog-opacity.test.mjs`(18 项)覆盖默认 100%、持久化与恢复、范围/步长归一化、设置卡片交互、样式表实际注入内容、热重载重写回归、「文字/按钮/输入/边框不随透明度变化」、「100% 原样保留 DSH token 自带 alpha(不做无意义的覆盖)」、「input / textarea / select / 菜单 / 卡片等内部控件不继承弹窗透明度且各自读取 DSH token」,以及「不得引用特定主题插件或第三方私有变量」的守卫;`test/helpers/client-harness.mjs` 增加 `rootStyleValues` / `styleTags` / `initialStorage` 观测点。
|
|
18
|
+
- **refactor(theme)**: 插件不再自建一套独立的浅色/深色配色,改为直接消费 DSH 主题 token(Issue #23 后续):
|
|
19
|
+
- **删除所有局部 `--dsw-alias-*` 重定义**。原 `[data-sm-theme=light]` / `[data-sm-theme=dark]` 规则曾把 `label-primary`、`label-secondary`、`label-tertiary`、`border-l1`、`border-l2`、`fill-l1`、`fill-l2`、`interactive-bg-hover`、`state-error-primary`、`accent-primary`、`accent-primary-bg`、`state-warning-primary` 全部改写为固定 hex,这会无条件覆盖任何主题(含第三方主题)对这些 token 的修改。现在 DSH 的 `--dsw-alias-*` 只被读取,从不赋值。
|
|
20
|
+
- **修正一批 DSH 中并不存在的 token**(它们的 `var()` 一直静默回退到硬编码字面量,是主题失效的真正原因):`--dsw-alias-surface-l1` → `--dsw-alias-bg-layer-1`;`--dsw-alias-fill-l1` → `--dsw-alias-bg-layer-2`;`--dsw-alias-fill-l2` 按语义拆分 → `--dsw-alias-bg-layer-2`(内嵌面板)/ `--dsw-alias-markdown-tag`(标签、badge、chip)/ `--dsw-alias-bg-module-platform`(选中行、开关态)/ `--dsw-alias-interactive-bg-hover`(hover)/ `--dsw-alias-bg-skeleton`(进度槽);`--dsw-alias-fill-l3` → `--dsw-alias-button-ghost-active-fill`;`--dsw-alias-accent-primary` → `--dsw-alias-state-business-primary`;`--dsw-alias-accent-primary-bg` → `--dsw-alias-state-business-tertiary`;`--dsw-alias-accent-primary-hover` → `--dsw-alias-button-info-hover`;`--dsw-alias-state-warning-primary` → `--dsw-alias-state-warn-primary`。
|
|
21
|
+
- **补齐语义化 token**:warn 提示框改用 `state-warn-tertiary` / `state-warn-label`,success 改用 `state-success-tertiary` / `state-success-primary`,error 与危险边框由 `state-error-primary` 经 `color-mix()` 派生(DSH 无 error tertiary),危险 hover 用 `interactive-bg-hover-danger`;填充式按钮的文字色改用 `--dsw-alias-label-primary-foreground`(浅色白字 / 深色深字,深色下蓝、红按钮对比度更好)。
|
|
22
|
+
- **删除被后续声明完全覆盖的固定颜色“旧浏览器双声明”**(如 `color:#111;color:var(…)`、`background-color:#356ae6;background-color:var(…)`、`border:1px solid #d4d4d8;border:1px solid var(…)`);迁移弹窗不再残留 `#fff`/`#356ae6`/`#4576f0`/`#e8e8e8` 等固定色。
|
|
23
|
+
- **移除大量 `!important`**:`[data-sm-theme=dark]` 下所有 `background` / `background-color` / `color` / `border-color` 强制覆盖全部删除(settingsTag、settingsBadgeLink、updateVersionGrid、bulkSessionList、bulkProgressBar、settingsSelect、header/footer border 等),`.sm-headerBtnDanger:hover` 的三处也不再需要(选择器权重已足够)。保留的 8 条规则中:1 条颜色相关(`.sm-markIcon.sm-markOn`)取值是 `var(--dsw-alias-*)` token,因此不阻断主题,仅用于压过插件自身的同类颜色规则(原 `.sm-danger` / `.sm-dangerText` 两条颜色 `!important` 属死代码,见下方 fix(ui) 已删除);`.sm-tooltip` 用于覆盖 DSH Tooltip primitive 的内联样式(Issue #21 回归守卫,边框同样使用 token);其余 6 条为纯布局(overlay portal 提层、`.sm-updateDialogLayer` 居中、`@container` 隐藏、DSH 行 primitives 的文本对齐)。
|
|
24
|
+
- **保留的唯一浅/深色分支**:`--sm-dialog-surface-fallback`(透明度设置在 token 缺失时的回退底色)与 `.sm-priority-1/2`(优先级是插件自有语义,DSH 无对应 token)。
|
|
25
|
+
- 浅色/深色现值与改动前基本一致:`--dsw-alias-border-l2` 浅色等价于原 `#e5e5e5`、深色等价于原 `#3a3a40`,`--dsw-alias-interactive-bg-hover` 亦与原 `#eee` / `rgba(255,255,255,.06)` 基本等价。
|
|
26
|
+
- **fix(ui)**: 修复「删除会话」按钮(标题栏 / 面板行 / 批量栏)在主题把表面 token 设为半透明或大面积色时看不清的问题:
|
|
27
|
+
- 根因:这些按钮的底片用的是**表面 token** `--dsw-alias-bg-layer-1`,而表面 token 可能带 alpha 或为大片区域选择的色相;按钮的文字用 `--dsw-alias-state-error-primary`,两者叠加后对比度不再可控(实测注入「洋红半透明表面 + 橙色错误色」时,橙字压在洋红底片上几乎不可读)。
|
|
28
|
+
- 修复:按钮底片改用 DSH 的**按钮**填充 token `--dsw-alias-button-floating-fill`(浅色 `#fff` / 深色 `#2c2c2e`,均不透明),语义上也是 §三 要求的「按钮 → 按钮 token」;涉及 `.sm-headerBtn`、`.sm-headerBtnDanger`、`.sm-bulkBar .sm-bulkBtn`。这样无论主题给表面 token 什么 alpha/色相,危险按钮的文字与图标都落在稳定的不透明按键底上。
|
|
29
|
+
- 面板行内危险按钮(透明底)新增专用 hover:`.sm-rowBtnDanger:hover` 使用 `--dsw-alias-interactive-bg-hover-danger`(与菜单里的危险项一致),不再复用普通 hover。
|
|
30
|
+
- 顺带删除**死代码** `.sm-danger` / `.sm-dangerText`(没有任何元素带这两个 class),它们是仅剩的两条颜色类 `!important`,删除后颜色类 `!important` 只剩 `.sm-markIcon.sm-markOn` 一条。
|
|
31
|
+
- **fix(ui)**: 统一「会话标记」窗口里复制 Prompt / 导入区域的格式,使其与上方字段一致:
|
|
32
|
+
- 去掉该区域自带的表面底色(`--dsw-alias-bg-layer-2` 横条,在带色主题下会形成一条与弹窗主体不同色的色带),改为继承弹窗表面,仅保留与其它分区一致的上边框。
|
|
33
|
+
- 补齐与上方字段相同的「标签 + 字段」结构:新增 `AI 返回结果`(复用已有 `marks.import.paste.label` 文案)标签行,两个操作按钮改为靠右排列在同一行;粘贴框仍复用 `.sm-noteInput` / `.sm-fieldWithClear`。
|
|
34
|
+
- 修正内边距叠层:`.sm-importGroup` 改为 `padding:12px 16px`(与弹窗主体 16px 对齐),`.sm-importStatus` 的 `margin:0 16px` 改为 `margin:0`(原本在分组内边距之上又叠加 16px,导致状态框比其它内容缩进更多)。
|
|
35
|
+
- 导入/复制按钮由「表面色填充」改为与弹窗内其它按钮一致的描边样式(透明底 + `border-l2` + `label-primary`)。
|
|
36
|
+
- **fix(ui)**: 统一全部弹窗的按钮设计(上一轮把迁移预设弹窗的按钮底色换成 `button-floating-fill` 后,它成了唯一「白色/深灰实底」的取消按钮):
|
|
37
|
+
- **全部弹窗的次要/取消按钮统一为同一套规格**:`background:transparent` · `border:1px solid var(--dsw-alias-border-l2)` · `border-radius:8px` · `padding:3px 14px` · `min-height:28px` · `font-size:12px` · `line-height:20px`。迁移预设弹窗的实底取消按钮已改回透明;会话管理主窗口与标记窗口原先的 `6px` 圆角 / `3px 12px` / `18px` 行高也统一到同一规格。
|
|
38
|
+
- **hover 统一**:原先只有确认弹窗的 Cancel、迁移/更新弹窗的基类有 hover,批量弹窗、会话管理主窗口与标记窗口的取消按钮**完全没有 hover 反馈**;现合并为一条覆盖五个弹窗的 `.sm-nativeDialogCancel:hover` 规则(`--dsw-alias-interactive-bg-hover`)。标记窗口的取消按钮原先漏了 `sm-nativeDialogCancel` class,已补上以纳入统一规则。
|
|
39
|
+
- **填充态保持一致**:确认按钮一律 `state-business-primary` + `label-primary-foreground`,危险按钮一律 `state-error-primary` + `label-primary-foreground`(五个弹窗完全一致)。
|
|
40
|
+
- **标记窗口的导入/复制按钮**对齐到同一套对话框按钮规格(`min-height:28px` / `3px 14px` / `20px` 行高)。
|
|
41
|
+
- **批量工具栏按钮** `.sm-bulkBar .sm-bulkBtn` 由实底改为透明描边:其填充色与所在容器(`bg-layer-2`)在 DSH 默认浅/深色下取值相同(`#fff` / `#2c2c2e`),实底等同于无效,改为透明后与面板内其它按钮(`.sm-rowBtn`、`.sm-filterBtn`、`.sm-settingsCheckBtn`)一致。
|
|
42
|
+
- **删除死代码**:`.sm-nativeDialogGhost`、`.sm-panelHeaderSelect`(含 `:hover` / `:disabled` / `.sm-on`)从未被任何元素使用(有测试专门断言 JSX 不再使用 `sm-panelHeaderSelect`)。
|
|
43
|
+
- 设计约定(本次确立):**弹窗动作按钮 = 28px 规格**(透明描边 + 单一 hover);**面板内的密集控件**(行内操作 `.sm-rowBtn` 22px、筛选开关 `.sm-filterBtn` 24px、批量网格 `.sm-bulkBtn`)保持紧凑尺寸,但共用同一套「透明底 + `border-l2` + hover token」语言与填充态 token。
|
|
44
|
+
- **fix(ui)**: 修复深色模式下插件下拉框(`<select>`)的弹出列表仍是白底、与全局主题不一致的问题:
|
|
45
|
+
- 根因:`<select>` 的弹出列表属于**浏览器原生 UA 控件**,它**不读取任何 `--dsw-*` token**。DSH 的机制是把解析后的配色投影给原生控件——ui-layout 的 `ThemePresenter` 订阅官方 `theme/change` 事件后执行 `documentElement.style.colorScheme = snapshot.active.colorScheme`(官方文档:`html { color-scheme }` for native UA chrome)。插件此前没有给 `<option>` 任何样式,于是列表项使用平台默认底色(白)。
|
|
46
|
+
- **插件不再声明 `color-scheme`**:曾有一版把插件镜像的浅/深色状态写成 `html[data-sm-theme=dark] …{color-scheme:dark}`。原生控件是 DSH 的职责——ui-layout 的 presenter 会在 `theme/change` 时写入 `documentElement.style.colorScheme`;插件一旦与 DSH 的投影不一致(镜像判错或过期),就会把原生控件锁在相反的配色上,表现为「切到浅色模式后下拉列表仍然是深色」。现已删除:DSH 是原生控件的唯一权威,插件只负责列表项本身的颜色。
|
|
47
|
+
- 修复(列表项本身):给插件自有表面内的 `<option>` 显式指定 DSH token——`background-color:var(--dsw-alias-bg-layer-3)` + `color:var(--dsw-alias-label-primary)`,选中项用 accent 文字色标记(`--dsw-alias-state-business-primary`),禁用项 `--dsw-alias-label-tertiary`。
|
|
48
|
+
- **为什么是 layer-3 而不是控件自身的 layer-2**:浮动列表必须保持不透明。主题可能给 `bg-layer-2` 加上 alpha,半透明填色叠在原生弹出列表自身的底上仍然呈现为白/浅色(第一版修复看起来「没生效」即由此而来)。`--dsw-alias-bg-layer-3` 在 DSH 调色板中是不透明的(浅色 `#fff` / 深色 `#353638`),且语义上是位于弹窗(layer-1)与控件(layer-2)之上的一层。选中行改用文字色而非填充色,同样避免任何半透明 token 把它冲淡。
|
|
49
|
+
- 作用范围只限插件自有表面内的 `option`,不会影响 DSH 自己的下拉框;插件全部 7 个 `<select>`(面板的工作区/排序/标签/优先级筛选、弹窗内的选择器、设置卡片的安装源)都位于这四个表面之内,无需逐个枚举 class。
|
|
50
|
+
- 已知平台边界:若宿主把 `<select>` 弹出列表交给**操作系统**绘制(Windows 下 Electron/浏览器在某些版本上如此),该列表将忽略页面 CSS,包括 `option` 样式;DSH 桌面端通过把主题同步到 Electron `nativeTheme.themeSource` 规避了这一点,浏览器端没有该通道。这种情况下唯一的通用解法是不使用原生 `<select>`,改为用 DSH 的 `Menu` primitive 渲染 HTML 下拉层(DSH 自身产品界面即如此,其 primitive 包中并没有 `Select`,只有 `Menu`)。
|
|
51
|
+
- **fix(theme)**: 主题镜像改用 DSH 官方事件,不再只靠 DOM 属性观察:`ctx.on("theme/change", () => smApplyTheme())`(ui-layout 的 presenter 在同一事件上投影配色)。原先只靠 MutationObserver 观察 `class` / `data-ds-dark-theme` / `style` 等属性,若某个主题只改 token 值而不触碰这些属性,`data-sm-theme` 镜像就会过期。该镜像现在只影响两处装饰性分支(token 缺失时的透明度回退底色、优先级颜色),并被测试锁定为**不得**声明 `color-scheme`、不得重定义任何 `--dsw-*` token。
|
|
52
|
+
- **test(theme)**: 新增 `test/client-theme-tokens.test.mjs`(6 项):逐个校验插件引用的每个 `--dsw-*` token 都存在于按 DSH 0.2.0-rc.2 主题 token 表固化的白名单中(杜绝再次凭空发明 token)、插件从不重定义 DSH token、浅/深色分支被限制在允许的两处、不存在任何主题插件检测/枚举/私有变量读取、15 类 UI 语义各自引用对应 token、以及弹窗透明度设置(名称/默认值/范围/存储键/color-mix 结构)未被改动。同步更新 6 个原有 static guard,使它们校验新的等价实现而非旧的硬编码字符串。
|
|
53
|
+
- **fix(ui)**: 修复弹窗内 tooltip 被弹窗自身遮住的问题(会话管理窗口标题栏的 GitHub / npm / 关闭图标,以及面板内所有带提示的按钮):
|
|
54
|
+
- 根因:插件通过 DSH 的 `Tooltip` primitive(`renderTip`)渲染提示,而该气泡的 z-index 是**写死的**(内联 100、portal 到 body 时 1100),且不转发 `className`,插件无法单独抬高它;同时插件把面板设为 `z-index:9999`、portal 根节点设为 `99999`,因此任何插件界面都会盖住 1100 档的提示气泡。
|
|
55
|
+
- 修复:把插件的两个文档级图层收进 DSH 自己的层级区间——面板 `9999 → 1020`,`#dsh-session-manager-overlay-root` `99999 → 1050`(CSS 与运行时内联值同步)。DSH 的层级为 `1000`(模态遮罩/全屏遮罩)与 `1100`(浮层:菜单、popover、对话框、tooltip),插件保持在 `1000..1100` 之间,因此提示与 DSH 浮层都能正常压在插件界面之上,而插件界面仍在 DSH 页面内容与遮罩之上。
|
|
56
|
+
- portal 根节点内部各对话框的静态 z-index(确认 10000 / 迁移 10001 / 批量 10002 / 更新 10010 / 标记 100002+)与 `nextDialogZ()` 计数器都在该 stacking context 内部解析,取值本身不参与与 DSH 的层级竞争,故未改动,仅在代码与注释中固化层级契约。
|
|
57
|
+
- **test(ui)**: 新增层级回归守卫:断言 overlay root 与面板的 z-index 严格位于 DSH `1000..1100` 区间、面板低于 overlay root、内联值与 CSS 一致、提示仍走 DSH primitive + body portal;并在代码注释中固化「不要把插件图层抬到 1100 以上」的契约(测试总数 364)。
|
|
58
|
+
- **docs**: 明确验证范围——自 0.6.3 起本插件**仅在官方 DSH Desktop 客户端上进行验证**,Web UI 与本插件共用同一套 Host / 客户端代码但不再纳入验证范围。中英文 README 的「简介」与「兼容性」章节均已注明。
|
|
59
|
+
|
|
2
60
|
## 0.6.2 — 2026-10-02
|
|
3
61
|
|
|
4
62
|
- **fix(ui)**: 修复删除当前打开的会话后未自动跳转的问题:删除当前会话时显式调用 `ctx.uiWorkspace.clearMain()` 并回退触发新建会话,使界面正确跳转到新建会话欢迎视图,与会话归档行为保持一致。
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ English | [中文](README.zh.md)
|
|
|
11
11
|
|
|
12
12
|
DeepSeek Harness session manager: delete, archive, move sessions across workspaces, migrate presets, favorites, review-later, search, filter, sort, prioritize, add tags and notes, and batch-manage sessions.
|
|
13
13
|
|
|
14
|
-
Verified with the
|
|
14
|
+
Verified with the official DSH Desktop client; see [5 Compatibility](#5-compatibility) for the current verification scope. Both environments use the same plugin Host/client functionality; environment-specific installation notes are documented below.
|
|
15
15
|
|
|
16
16
|
## 1 Features
|
|
17
17
|
|
|
@@ -47,6 +47,8 @@ Verified with the current official DSH Web UI and Desktop app. Both environments
|
|
|
47
47
|
- **Self-update check**: A 🐋 (Whale) icon button in the session manager panel header checks for updates and displays a notification dot when a new version is available. Click to open the update dialog with current and latest versions, and one-click update via the DSH Plugin Manager.
|
|
48
48
|
- **Settings Card**: Registered under DSH Settings (`settings.plugin.item`). Displays current version, latest version, inline check/update buttons, an auto-check toggle, and GitHub repository link.
|
|
49
49
|
- **Install Source (Registry)**: Select between **npm official registry** (`registry.npmjs.org`, default) and **China mainland mirror** (`registry.npmmirror.com`) in the Settings Card. Check for updates and download packages directly from the selected registry.
|
|
50
|
+
- **Dialog opacity**: A 50%–100% slider (5% steps, default 100%) in the Settings Card's preferences section, with a "Reset to default" button. It tunes the plugin dialog **background fill only** — text, buttons, inputs, tags, badges, borders, hover and danger colours stay fully opaque and keep following the active DSH theme. Implemented with the plugin's own `--sm-dialog-opacity` variable mixed into DSH's raised-surface token via `color-mix()`, so any theme that publishes `--dsw-alias-*` tokens is honoured without the plugin detecting, naming or reading private variables of a theme plugin. Persisted in `localStorage` (`dsh-session-manager-dialog-opacity`) and applied live.
|
|
51
|
+
- **Theme**: The whole UI (dialogs, settings card, title-bar buttons, dropdown menus, inputs, selects, badges, tooltips, row hover/selected states) reads DSH's own `--dsw-alias-*` tokens directly. The plugin never redefines a DSH token and keeps no private light/dark palette, so any theme — including a theme plugin — that modifies or republishes those tokens is picked up automatically. The only light/dark branches left are the token-less fallback colour for the dialog-opacity fill and the plugin-specific priority colours. Every `--dsw-*` reference is locked to the token set DSH actually declares, because a non-existent token would silently degrade to its hard-coded fallback and block theming.
|
|
50
52
|
|
|
51
53
|
## 2 UI entry points
|
|
52
54
|
|
|
@@ -128,9 +130,11 @@ After changing plugin dependencies, `package.json`, bundle configuration, or oth
|
|
|
128
130
|
|
|
129
131
|
DSH versions are shown above plugin versions; each column represents a tested version combination.
|
|
130
132
|
|
|
133
|
+
> Verification note: from 0.6.3 on, this plugin is verified with the official DSH Desktop client only (the Web UI shares the same Host/client code but is no longer covered by the verification matrix).
|
|
134
|
+
|
|
131
135
|
| v0.2.0-rc.2 | v0.1.7-rc.2 | v0.1.7-rc.1 |
|
|
132
136
|
| --- | --- | --- |
|
|
133
|
-
| 0.6.2, 0.5.4 | 0.5.3 | 0.5.2 |
|
|
137
|
+
| 0.6.3, 0.6.2, 0.5.4 | 0.5.3 | 0.5.2 |
|
|
134
138
|
|
|
135
139
|
| v0.1.6-alpha.2 | v0.1.5-rc.2 | v0.1.5-rc.1 |
|
|
136
140
|
| --- | --- | --- |
|
package/README.zh.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
DeepSeek Harness 会话管理插件:支持删除、归档、跨工作区移动、预设迁移、收藏、待回看、搜索、筛选、排序、优先级、标签、备注及批量操作。
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
已在官方 DSH Desktop 客户端完成实际测试,当前验证范围见「5 兼容性」;两种环境共用本插件的 Host 与客户端功能,具体安装方式见下文。
|
|
15
15
|
|
|
16
16
|
## 1 功能
|
|
17
17
|
|
|
@@ -45,6 +45,8 @@ DeepSeek Harness 会话管理插件:支持删除、归档、跨工作区移动
|
|
|
45
45
|
- **检查更新**:会话管理窗口顶部增加 🐋(鲸鱼)图标按钮,点击可检查新版本并在有更新时展示小红点提示;点击弹出更新窗口,展示当前版本与最新版本,支持一键调用插件管理器安装更新。
|
|
46
46
|
- **设置卡片**:注册在 DSH 设置的插件配置页(`settings.plugin.item`)。展示当前安装版本、最新版本状态、卡片内检查更新与更新按钮、自动检查偏好开关以及 GitHub 仓库链接。
|
|
47
47
|
- **安装源选择**:在设置卡片中可随时切换安装源,可选 **npm 官方源**(`registry.npmjs.org`,默认)与 **中国大陆镜像源**(`registry.npmmirror.com`);检查更新与版本下载将直接请求所选源。
|
|
48
|
+
- **弹窗透明度**:设置卡片「偏好设置」区域提供 50%–100% 滑块(步长 5%,默认 100%),并提供「恢复默认」按钮。该设置只调整插件弹窗的**背景填充**:文字、按钮、输入框、标签、badge、边框、hover 与危险按钮颜色保持完全不透明,并继续跟随 DSH 当前主题。实现方式为插件自有变量 `--sm-dialog-opacity` 通过 `color-mix()` 作用于 DSH 的抬升表面 token,因此任何发布 `--dsw-alias-*` token 的主题都能被继承——插件不会检测主题插件、枚举主题名称,也不会读取第三方插件的私有变量。设置保存在 `localStorage`(`dsh-session-manager-dialog-opacity`)并即时生效。
|
|
49
|
+
- **主题**:整个界面(弹窗、设置卡片、标题栏按钮、下拉菜单、输入框、下拉选择、badge、tooltip、行 hover / 选中态)直接读取 DSH 自己的 `--dsw-alias-*` token。插件从不重新定义 DSH token,也不再维护私有的浅色/深色配色,因此任何修改或重新发布这些 token 的主题(含第三方主题插件)都会自动生效。仅剩的浅/深色分支只有两处:透明度设置在 token 缺失时的回退底色,以及插件自有的优先级颜色。所有 `--dsw-*` 引用都被锁定在 DSH 实际声明的 token 集合内——引用不存在的 token 会静默回退到硬编码颜色,从而阻断主题。
|
|
48
50
|
|
|
49
51
|
## 2 UI入口
|
|
50
52
|
|
|
@@ -126,9 +128,11 @@ dsh plugin --profile web add <本仓库路径>
|
|
|
126
128
|
|
|
127
129
|
DSH 版本在上,插件版本在下;每列表示一组已测试的版本组合。
|
|
128
130
|
|
|
131
|
+
> 版本验证说明:自 0.6.3 起,本插件仅在官方 DSH Desktop 客户端上进行验证(Web UI 与本插件共用同一套 Host / 客户端代码,但不再纳入验证范围)。
|
|
132
|
+
|
|
129
133
|
| v0.2.0-rc.2 | v0.1.7-rc.2 | v0.1.7-rc.1 |
|
|
130
134
|
| --- | --- | --- |
|
|
131
|
-
| 0.6.2, 0.5.4 | 0.5.3 | 0.5.2 |
|
|
135
|
+
| 0.6.3, 0.6.2, 0.5.4 | 0.5.3 | 0.5.2 |
|
|
132
136
|
|
|
133
137
|
| v0.1.6-alpha.2 | v0.1.5-rc.2 | v0.1.5-rc.1 |
|
|
134
138
|
| --- | --- | --- |
|
package/lib/client.js
CHANGED
|
@@ -51,16 +51,29 @@ window.__ModuleLoader__.load({
|
|
|
51
51
|
}
|
|
52
52
|
// Monotonically-increasing z-index for popup dialogs so the most-recently
|
|
53
53
|
// opened popup always sits on top of any previously opened popup. The
|
|
54
|
-
// CSS-defined z-index values (
|
|
54
|
+
// CSS-defined z-index values (confirm 10000 / migrate 10001 / annotation +
|
|
55
55
|
// bulk 10002) are static; without a counter the user can open an
|
|
56
56
|
// annotation popup (10002) after a confirm popup (10000) and the older
|
|
57
57
|
// confirm stays below. Each dialog component claims a fresh slot from
|
|
58
58
|
// this counter on mount, writes it to inline style.zIndex, and never
|
|
59
59
|
// recycles within a session, so the most-recently opened popup is
|
|
60
60
|
// always the topmost one.
|
|
61
|
+
// These values are all resolved INSIDE the #dsh-session-manager-overlay-root
|
|
62
|
+
// stacking context (see the layering contract in the stylesheet): the root
|
|
63
|
+
// itself sits at 1050, below DSH's 1100 floating tier, so the absolute size of
|
|
64
|
+
// the numbers here never competes with DSH's own tooltips and menus.
|
|
61
65
|
let dialogZStackCounter = 100000;
|
|
62
66
|
function nextDialogZ() { return ++dialogZStackCounter; }
|
|
63
67
|
|
|
68
|
+
// Wrap an anchor in DSH's own Tooltip primitive (falls back to the bare
|
|
69
|
+
// node when the primitive is unavailable).
|
|
70
|
+
//
|
|
71
|
+
// `portal: true` renders the bubble under document.body, which escapes the
|
|
72
|
+
// plugin dialog's own overflow clipping -- but DSH's bubble paints at a
|
|
73
|
+
// hard-coded z-index 1100 and exposes no class hook, so it can only stay
|
|
74
|
+
// visible while every plugin surface stays BELOW 1100. Keep the panel
|
|
75
|
+
// (1020) and the overlay root (1050) inside that gap; see the layering
|
|
76
|
+
// contract in the stylesheet.
|
|
64
77
|
function renderTip(label, node, side = "bottom", portal = true) {
|
|
65
78
|
if (!label || !node) return node;
|
|
66
79
|
if (P && typeof P.Tooltip === "function") {
|
|
@@ -175,6 +188,10 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
175
188
|
"settings.pluginName": "dsh-session-manager",
|
|
176
189
|
"settings.versionSection": "插件版本",
|
|
177
190
|
"settings.prefSection": "偏好设置",
|
|
191
|
+
"settings.dialogOpacity": "弹窗透明度",
|
|
192
|
+
"settings.dialogOpacity.hint": "仅调整插件弹窗的背景透明度;文字、按钮、输入框和边框保持不透明。",
|
|
193
|
+
"settings.dialogOpacity.value": "{value}%",
|
|
194
|
+
"settings.dialogOpacity.reset": "恢复默认",
|
|
178
195
|
"settings.projectSection": "项目",
|
|
179
196
|
"settings.github": "GitHub 仓库",
|
|
180
197
|
"settings.star": "感谢Star",
|
|
@@ -392,6 +409,10 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
392
409
|
"settings.pluginName": "dsh-session-manager",
|
|
393
410
|
"settings.versionSection": "Plugin Version",
|
|
394
411
|
"settings.prefSection": "Preferences",
|
|
412
|
+
"settings.dialogOpacity": "Dialog opacity",
|
|
413
|
+
"settings.dialogOpacity.hint": "Adjusts the plugin dialog background only; text, buttons, inputs and borders stay opaque.",
|
|
414
|
+
"settings.dialogOpacity.value": "{value}%",
|
|
415
|
+
"settings.dialogOpacity.reset": "Reset to default",
|
|
395
416
|
"settings.projectSection": "Project",
|
|
396
417
|
"settings.github": "GitHub Repository",
|
|
397
418
|
"settings.star": "Star on GitHub",
|
|
@@ -523,23 +544,26 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
523
544
|
".sm-filter{display:flex;gap:4px;flex-wrap:wrap}",
|
|
524
545
|
".sm-filterBtn{cursor:pointer;display:inline-flex;align-items:center;color:var(--dsw-alias-label-secondary);background:0 0;border:1px solid var(--dsw-alias-border-l2);border-radius:999px;height:28px;padding:3px 10px;font-size:12px;line-height:18px;white-space:nowrap;box-sizing:border-box}",
|
|
525
546
|
".sm-filterBtn:hover{background:var(--dsw-alias-interactive-bg-hover)}",
|
|
526
|
-
".sm-filterBtn.sm-on{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-
|
|
547
|
+
".sm-filterBtn.sm-on{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform);border-color:transparent}",
|
|
527
548
|
".sm-list{display:flex;flex-direction:column;gap:4px;min-height:0;overflow:auto;flex:1}",
|
|
528
549
|
".sm-row{box-sizing:border-box;display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:10px}",
|
|
529
550
|
".sm-row:hover{background:var(--dsw-alias-interactive-bg-hover)}",
|
|
530
|
-
".sm-rowCurrent{border-color:var(--dsw-alias-
|
|
551
|
+
".sm-rowCurrent{border-color:var(--dsw-alias-state-business-primary,var(--dsw-alias-label-secondary))}",
|
|
531
552
|
".sm-rowMain{min-width:0;display:flex;flex-direction:column;gap:2px;flex:1 1 280px}",
|
|
532
553
|
".sm-rowTitle{color:var(--dsw-alias-label-primary);font-size:13px;line-height:20px;display:flex;align-items:center;gap:6px;min-width:0}",
|
|
533
554
|
".sm-rowTitle>span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}",
|
|
534
555
|
".sm-rowMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}",
|
|
535
556
|
".sm-rowActions{display:flex;gap:4px;flex:none;flex-wrap:wrap;justify-content:flex-end}",
|
|
536
557
|
".sm-badge{flex:none;border-radius:999px;padding:0 6px;font-size:10px;line-height:16px}",
|
|
537
|
-
".sm-badgeArchived{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-
|
|
538
|
-
".sm-badgeRunning{color:var(--dsw-alias-state-
|
|
539
|
-
".sm-badgeCurrent{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
558
|
+
".sm-badgeArchived{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-markdown-tag)}",
|
|
559
|
+
".sm-badgeRunning{color:var(--dsw-alias-state-warn-label,#dd8629);background:var(--dsw-alias-state-warn-tertiary,#fef5e7)}",
|
|
560
|
+
".sm-badgeCurrent{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-markdown-tag)}",
|
|
561
|
+
// The former .sm-danger / .sm-dangerText rules were removed: no element
|
|
562
|
+
// ever carried those classes (dead CSS) and they were the only colour
|
|
563
|
+
// !important declarations that could have fought a theme. Danger-coloured
|
|
564
|
+
// affordances use .sm-headerBtnDanger / .sm-rowBtnDanger /
|
|
565
|
+
// .sm-nativeDialogDanger / .sm-bulkBtnDanger, all plain DSH tokens.
|
|
566
|
+
".sm-warn{display:flex;align-items:flex-start;gap:8px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-state-warn-tertiary,#fef5e7);border:1px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary,#f59e0b) 30%,transparent);border-radius:8px;padding:8px 10px;margin-top:4px}",
|
|
543
567
|
".sm-warn svg{flex:none;margin-top:1px}",
|
|
544
568
|
".sm-error{color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:18px;min-height:0;margin-top:4px}",
|
|
545
569
|
".sm-foot{display:flex;justify-content:flex-end;align-items:center;gap:8px;width:100%}",
|
|
@@ -550,57 +574,136 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
550
574
|
".sm-moveList{display:flex;flex-direction:column;gap:4px;max-height:200px;overflow:auto}",
|
|
551
575
|
".sm-moveItem{box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;cursor:pointer;transition:all .15s}",
|
|
552
576
|
".sm-moveItem:hover{background:var(--dsw-alias-interactive-bg-hover)}",
|
|
553
|
-
".sm-moveItemSelected{border-color:var(--dsw-alias-
|
|
577
|
+
".sm-moveItemSelected{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-tertiary)}",
|
|
554
578
|
".sm-moveItemName{color:var(--dsw-alias-label-primary);font-size:13px;line-height:18px}",
|
|
555
|
-
".sm-moveItemMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.sm-panelModal{width:760px;max-width:92vw}.sm-panelModal .sm-rowActions{flex-wrap:wrap;justify-content:flex-end}.sm-headerMenu{position:absolute;right:0;top:100%;margin-top:4px;z-index:50;display:flex;flex-direction:column;min-width:140px;padding:4px;background:var(--dsw-alias-
|
|
556
|
-
".sm-panelDialog{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);width:600px;max-width:calc(100vw - 32px);max-height:560px;height:auto;box-sizing:border-box;display:flex;flex-direction:column;gap:0;background:var(--dsw-alias-surface-l1,#fff);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.25);overflow:hidden;z-index:9999;opacity:1}.sm-panelDialog .sm-nativeDialogHeader{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 16px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);flex:none;position:relative;min-height:46px;box-sizing:border-box}.sm-panelDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:14px;line-height:20px;font-weight:600;min-width:0;max-width:calc(100% - 140px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center;pointer-events:auto;z-index:0}.sm-panelDialog .sm-nativeDialogHeaderActions{display:flex;align-items:center;gap:6px;flex:none;position:relative;z-index:1;margin-left:auto}.sm-nativeDialogFooter,.sm-bulkDialog .sm-nativeDialogFooter,.sm-confirmDialog .sm-nativeDialogFooter,.sm-migrateDialog .sm-nativeDialogFooter{display:flex;padding:10px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee);flex:none;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-top:0}.sm-panelDialog .sm-panel{display:flex;flex-direction:column;gap:6px;min-height:0;flex:1 1 auto;overflow:auto;padding:8px 12px}.sm-panelDialog .sm-list{display:flex;flex-direction:column;gap:2px;flex:1 1 auto;min-height:0;overflow:auto}.sm-panelDialog .sm-row{display:flex;align-items:center;gap:8px;padding:6px 10px;min-height:36px;border:1px solid transparent;border-radius:8px;background:transparent;flex-shrink:0}.sm-panelDialog .sm-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.sm-panelDialog .sm-rowCurrent{background:var(--dsw-alias-fill-l2);border-color:var(--dsw-alias-accent-primary,#356ae6)}.sm-panelDialog .sm-rowMain{display:flex;align-items:stretch!important;gap:8px;min-width:0;flex:1 1 auto;overflow:visible;text-align:left!important}.sm-panelDialog .sm-rowTitle{min-width:0;flex:1 1 0%;width:100%;align-self:stretch;display:flex;align-items:center;justify-content:flex-start;gap:6px;font-size:12px;line-height:16px;overflow:hidden;text-align:left!important;direction:ltr!important}.sm-confirmDialog{z-index:10000}.sm-confirmDialog.sm-nativeDialogLayer{position:fixed;left:calc(50vw + 184px);top:calc(50vh - 90px);width:360px;max-width:calc(100vw - 32px);max-height:none;display:block;align-items:initial;justify-content:initial;box-sizing:border-box;background:transparent;border:0;box-shadow:none;padding:0;inset:calc(50vh - 90px) auto auto calc(50vw + 308px)}.sm-confirmDialog.sm-nativeDialogLayer .sm-nativeDialogBackdrop{display:none}.sm-confirmDialog.sm-nativeDialogLayer .sm-nativeDialog{position:relative;left:auto;top:auto;transform:none;width:auto;box-sizing:border-box;background:var(--dsw-alias-surface-l1,#fff);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.25);padding:0;overflow:hidden;animation:sm-confirmPop .14s ease-out}.sm-confirmDialog .sm-nativeDialogHeader{position:relative;padding:12px 16px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);display:flex;align-items:center;justify-content:center;min-height:44px;box-sizing:border-box}.sm-confirmDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:14px;line-height:20px;font-weight:600;text-align:center;width:auto;max-width:calc(100% - 32px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm-confirmDialog .sm-nativeDialogBody{padding:10px 16px;display:flex;flex-direction:column;gap:8px;min-height:0}.sm-confirmDialog .sm-nativeDialogDescription{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary);white-space:pre-wrap}.sm-confirmDialog .sm-warn{padding:6px 10px;font-size:12px;line-height:16px;margin-top:0}.sm-confirmDialog .sm-nativeDialogFooter{padding:10px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee);flex-wrap:wrap;justify-content:space-between;gap:6px;margin-top:0}.sm-confirmDialog .sm-nativeDialogButton{min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;cursor:pointer;background:transparent;color:var(--dsw-alias-label-primary);text-align:center}.sm-confirmDialog .sm-nativeDialogCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.sm-confirmDialog .sm-nativeDialogConfirm{background:var(--dsw-alias-accent-primary,#356ae6);color:#fff;border-color:var(--dsw-alias-accent-primary,#356ae6)}.sm-confirmDialog .sm-nativeDialogConfirm:hover:not(:disabled){filter:brightness(.94)}@keyframes sm-confirmPop{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.sm-confirmDialog.sm-nativeDialog{padding:0;width:auto;max-width:none}.sm-panelDialog .sm-rowTitle>span:first-child{display:block;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:auto;text-align:left!important;direction:ltr!important;unicode-bidi:plaintext}.sm-panelDialog .sm-rowMeta{display:none}.sm-panelDialog .sm-rowActions{display:flex;gap:2px;flex:none;justify-content:flex-end}.sm-panelDialog .sm-rowActions .sm-rowBtn{min-height:22px;padding:0 7px;font-size:11px;line-height:18px;border-radius:6px;border:1px solid transparent;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap}.sm-rowBtn.sm-markIcon{padding:0 6px;font-size:13px;line-height:18px}.sm-panelDialog .sm-rowActions .sm-rowBtn:hover{background:var(--dsw-alias-fill-l2);color:var(--dsw-alias-label-primary)}.sm-panelDialog .sm-rowActions .sm-rowBtnDanger{color:var(--dsw-alias-state-error-primary)}.sm-panelDialog .sm-filter{flex:none;padding:6px 12px 4px;gap:4px;display:flex;flex-wrap:wrap}.sm-panelDialog .sm-filterBtn{min-height:24px;padding:2px 10px;font-size:11px;line-height:16px;border-radius:4px;border:1px solid var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer}.sm-panelDialog .sm-filterBtn.sm-on{background:var(--dsw-alias-fill-l2);color:var(--dsw-alias-label-primary)}.sm-panelDialog .sm-badge{font-size:10px;line-height:14px;padding:0 5px;border-radius:6px;flex:none}.sm-panelDialog .sm-error{padding:6px 10px;margin:0;font-size:12px;line-height:16px}.sm-panelDialog .sm-nativeDialogButton{min-height:28px;padding:3px 12px;font-size:12px;line-height:18px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:transparent;color:var(--dsw-alias-label-primary);cursor:pointer}.sm-panelDialog .sm-nativeDialogCancel{background:transparent}.sm-panelDialog .sm-nativeDialogGhost{background:transparent;border-color:var(--dsw-alias-border-l2)}.sm-panelDialog .sm-nativeDialogConfirm{background:var(--dsw-alias-accent-primary,#356ae6);color:#fff;border-color:var(--dsw-alias-accent-primary,#356ae6)}.sm-nativeDialogDanger{background:var(--dsw-alias-state-error-primary,#d92d20);color:#fff;border-color:var(--dsw-alias-state-error-primary,#d92d20)}.sm-nativeDialogDanger:hover:not(:disabled){filter:brightness(.92)}.sm-confirmDialog .sm-nativeDialogDanger,.sm-migrateDialog .sm-nativeDialogDanger,.sm-bulkDialog .sm-nativeDialogDanger{background:var(--dsw-alias-state-error-primary,#d92d20);color:#fff;border-color:var(--dsw-alias-state-error-primary,#d92d20)}.sm-confirmDialog .sm-nativeDialogDanger:hover:not(:disabled),.sm-migrateDialog .sm-nativeDialogDanger:hover:not(:disabled),.sm-bulkDialog .sm-nativeDialogDanger:hover:not(:disabled){filter:brightness(.92)}.sm-panelDialog .sm-empty{padding:18px 0;font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:center}.sm-panelDialog .sm-footError{font-size:11px;color:var(--dsw-alias-state-error-primary);margin-right:auto;line-height:20px}.sm-panelDialog .sm-moveLabel{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary)}.sm-migrateDialog .sm-nativeDialogFooter{flex-wrap:wrap;justify-content:space-between;gap:6px;margin-top:0}.sm-migrateDialog .sm-migrateChip{cursor:pointer;pointer-events:auto;position:relative;z-index:1}.sm-migrateDialog .sm-migrateChip[disabled]{opacity:.5;cursor:not-allowed}.sm-migrateDialog.sm-nativeDialogLayer{position:fixed;left:50vw;top:auto;bottom:48px;transform:translateX(-50%);width:min(560px,calc(100vw - 32px));max-height:none;display:block;align-items:initial;justify-content:initial;box-sizing:border-box;background:transparent;border:0;box-shadow:none;padding:0;inset:auto;z-index:10001}.sm-migrateDialog.sm-nativeDialogLayer .sm-nativeDialogBackdrop{display:none}.sm-migrateDialog.sm-nativeDialogLayer .sm-nativeDialog{position:relative;left:auto;top:auto;transform:none;width:360px;max-width:calc(100vw - 32px);max-height:min(70vh,520px);box-sizing:border-box;background-color:#ffffff;background-color:var(--dsw-alias-surface-l1,#fff);color:var(--dsw-alias-label-primary,#111);border:1px solid #d4d4d8;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.45);overflow:hidden;padding:0;display:flex;flex-direction:column;gap:0;opacity:1}.sm-migrateDialog{position:fixed;left:50vw;top:auto;bottom:48px;transform:translateX(-50%);width:min(560px,calc(100vw - 32px));max-height:min(70vh,520px);box-sizing:border-box;display:flex;flex-direction:column;gap:0;background-color:#ffffff;background-color:var(--dsw-alias-surface-l1,#fff);color:var(--dsw-alias-label-primary,#111);border:1px solid #d4d4d8;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.45);overflow:hidden;opacity:1;z-index:10001;backdrop-filter:none;-webkit-backdrop-filter:none}.sm-migrateDialog .sm-nativeDialogHeader{padding:12px 18px;border-bottom:1px solid #eee;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);flex:none;background-color:#fff;background-color:var(--dsw-alias-surface-l1,#fff);position:relative;display:flex;align-items:center;justify-content:center;min-height:44px;box-sizing:border-box}.sm-migrateDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:14px;line-height:20px;font-weight:600;color:#111;color:var(--dsw-alias-label-primary,#111);text-align:center;width:auto;max-width:calc(100% - 36px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm-migrateDialog .sm-migratePanel{padding:12px 18px;display:flex;flex-direction:column;gap:14px;background-color:#fff;background-color:var(--dsw-alias-surface-l1,#fff)}.sm-migrateDialog .sm-nativeDialogBody{padding:0;background-color:#fff;background-color:var(--dsw-alias-surface-l1,#fff)}.sm-migrateDialog .sm-nativeDialogFooter{padding:10px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee);flex:none;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-top:0;gap:8px;background-color:#fff;background-color:var(--dsw-alias-surface-l1,#fff)}.sm-migrateDialog .sm-migrateRow>label{color:#444;color:var(--dsw-alias-label-secondary,#444)}.sm-migrateDialog .sm-migrateChip{padding:6px 12px;border-radius:999px;border:1px solid #d4d4d8;border:1px solid var(--dsw-alias-border-l2,#ddd);background-color:#f5f5f5;background-color:var(--dsw-alias-fill-l2,#f5f5f5);color:#111;color:var(--dsw-alias-label-primary,#111);font-size:13px;line-height:18px;cursor:pointer;pointer-events:auto;position:relative;z-index:1;white-space:nowrap}.sm-migrateDialog .sm-migrateChip:hover:not(:disabled){background-color:#e8e8e8;background-color:var(--dsw-alias-interactive-bg-hover,#e8e8e8)}.sm-migrateDialog .sm-migrateChipOn{background-color:#356ae6;background-color:var(--dsw-alias-accent-primary,#356ae6);color:#fff;border-color:#356ae6;border-color:var(--dsw-alias-accent-primary,#356ae6)}.sm-migrateDialog .sm-migrateChip.sm-migrateChipOn:hover:not(:disabled){background-color:#4576f0;background-color:var(--dsw-alias-accent-primary-hover,#4576f0);color:#fff;border-color:#4576f0;border-color:var(--dsw-alias-accent-primary-hover,#4576f0);filter:none}.sm-migrateDialog .sm-migrateChipOn:hover:not(:disabled){filter:brightness(.92)}.sm-migrateDialog .sm-migrateChip[disabled]{opacity:.5;cursor:not-allowed}.sm-migrateDialog .sm-migrateEmpty{color:#888;color:var(--dsw-alias-label-tertiary,#888)}.sm-migrateDialog .sm-migratePreview{padding:10px 12px;border:1px solid #d4d4d8;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;background-color:#f5f5f5;background-color:var(--dsw-alias-fill-l2,#f5f5f5);color:#111;color:var(--dsw-alias-label-primary,#111);font-size:13px;line-height:18px}.sm-migrateDialog .sm-migrateWarn{padding:10px 12px;border:1px solid rgba(217,119,6,.25);border-radius:8px;background-color:rgba(217,119,6,.08);color:#444;color:var(--dsw-alias-label-secondary,#444);font-size:13px;line-height:18px}.sm-migrateDialog .sm-nativeDialogButton{min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;border:1px solid #d4d4d8;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;cursor:pointer;background-color:#fff;background-color:var(--dsw-alias-fill-l2,#fff);color:#111;color:var(--dsw-alias-label-primary,#111);text-align:center}.sm-migrateDialog .sm-nativeDialogButton:hover:not(:disabled){background-color:#e8e8e8;background-color:var(--dsw-alias-interactive-bg-hover,#e8e8e8)}.sm-migrateDialog .sm-nativeDialogConfirm{background-color:#356ae6;background-color:var(--dsw-alias-accent-primary,#356ae6);color:#fff;border-color:#356ae6;border-color:var(--dsw-alias-accent-primary,#356ae6)}.sm-migrateDialog .sm-nativeDialogConfirm:hover:not(:disabled){filter:brightness(.94)}",
|
|
557
|
-
".sm-panelHeaderClose{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;min-height:26px;padding:0;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:7px;background:transparent;color:var(--dsw-alias-label-secondary,#555);cursor:pointer;flex:none;box-sizing:border-box;outline:none}.sm-panelHeaderClose:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderClose svg{display:block;width:14px;height:14px;margin:auto}.sm-panelHeaderGithub{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:6px;color:var(--dsw-alias-label-secondary,#555);text-decoration:none;flex:none;transition:background .15s,color .15s;cursor:pointer}.sm-panelHeaderGithub:hover{background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderGithub svg{display:block;width:16px;height:16px;fill:currentColor}.sm-panelHeaderLeft{display:flex;align-items:center;gap:4px;flex:none;position:relative;z-index:1}.sm-panelHeaderWhale{display:inline-flex;align-items:center;justify-content:center;position:relative;width:26px;height:26px;border-radius:6px;color:var(--dsw-alias-label-secondary,#555);text-decoration:none;flex:none;transition:background .15s,color .15s;cursor:pointer}.sm-panelHeaderWhale:hover{background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderWhale svg{display:block;width:16px;height:16px;margin:auto}.sm-panelHeaderWhale .sm-updateDot{position:absolute;top:2px;right:2px;width:7px;height:7px;border-radius:50%;background:#e53e3e;border:1.5px solid var(--dsw-alias-surface-l1,#fff)}.sm-panelHeaderWhale .sm-updateSpinner{position:absolute;inset:2px;border:2px solid transparent;border-top-color:var(--dsw-alias-accent-primary,#356ae6);border-radius:50%;animation:sm-spin .8s linear infinite}@keyframes sm-spin{to{transform:rotate(360deg)}}.sm-updateDialogLayer{display:flex!important;align-items:center!important;justify-content:center!important;position:fixed;inset:0;padding:16px;box-sizing:border-box;background:transparent;border:0;box-shadow:none;z-index:10010;pointer-events:none}.sm-updateDialogLayer .sm-nativeDialog{position:relative;width:380px;max-width:calc(100vw - 32px);box-sizing:border-box;background:var(--dsw-alias-surface-l1,#fff);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.25);overflow:hidden;animation:sm-confirmPop .14s ease-out;pointer-events:auto}.sm-updateDialog .sm-nativeDialogHeader{position:relative;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 16px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);flex:none;min-height:46px;box-sizing:border-box}.sm-updateDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:15px;line-height:20px;font-weight:600;text-align:center;width:auto;max-width:calc(100% - 80px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;z-index:0}.sm-updateDialog .sm-nativeDialogHeader .sm-panelHeaderClose{position:relative;z-index:1;margin-left:auto}.sm-updateDialog .sm-nativeDialogBody{padding:14px 16px;display:flex;flex-direction:column;gap:10px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#111)}.sm-updateDialog .sm-nativeDialogFooter{display:flex;padding:10px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee);flex:none;flex-wrap:wrap;justify-content:space-between;gap:8px;margin-top:0}.sm-updateDialog .sm-nativeDialogFooter .sm-nativeDialogConfirm:only-child{margin-left:auto}.sm-updateDialog .sm-nativeDialogButton{min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;cursor:pointer;background:transparent;color:var(--dsw-alias-label-primary,#111);text-align:center}.sm-updateDialog .sm-nativeDialogButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.sm-updateDialog .sm-nativeDialogConfirm{background:var(--dsw-alias-accent-primary,#356ae6);color:#fff;border-color:var(--dsw-alias-accent-primary,#356ae6)}.sm-updateDialog .sm-nativeDialogConfirm:hover:not(:disabled){filter:brightness(.94)}.sm-updateVersionGrid{display:grid;grid-template-columns:auto 1fr;gap:6px 12px;padding:12px;background:var(--dsw-alias-fill-l2,#f5f5f5);border:1px solid var(--dsw-alias-border-l2,#eee);border-radius:8px;font-size:13px;line-height:20px}.sm-updateVersionLabel{color:var(--dsw-alias-label-secondary,#666);font-weight:500}.sm-updateVersionValue{color:var(--dsw-alias-label-primary,#111);font-family:monospace;font-size:13px}.sm-updateStatusBox{margin-top:10px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#111)}.sm-updateStatusBox.sm-warn{color:#d97706;background:rgba(217,119,6,.08);padding:8px 10px;border-radius:6px;border:1px solid rgba(217,119,6,.2)}.sm-updateStatusBox.sm-error{color:#dc2626;background:rgba(220,38,38,.08);padding:8px 10px;border-radius:6px;border:1px solid rgba(220,38,38,.2)}.sm-updateStatusBox.sm-success{color:#16a34a;background:rgba(22,163,74,.08);padding:8px 10px;border-radius:6px;border:1px solid rgba(22,163,74,.2)}.sm-settingsCard{background:var(--dsw-alias-surface-l1,#fff);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;padding:16px 20px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#111);box-sizing:border-box;width:100%}.sm-settingsHeader{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;padding-bottom:10px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee)}.sm-settingsTitle{margin:0;font-size:16px;line-height:22px;font-weight:600;display:flex;align-items:center;gap:8px}.sm-settingsTag{font-size:12px;padding:2px 8px;border-radius:999px;background:var(--dsw-alias-fill-l2,#f0f0f0);color:var(--dsw-alias-label-secondary,#666);font-family:monospace}.sm-settingsSection{margin-top:14px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}.sm-settingsSectionTitle{font-size:13px;font-weight:600;color:var(--dsw-alias-label-secondary,#666);margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.sm-settingsRow{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:32px}.sm-settingsActions{display:flex;align-items:center;gap:8px;margin-top:10px}.sm-settingsLink{color:var(--dsw-alias-accent-primary,#356ae6);text-decoration:none}.sm-settingsLink:hover{text-decoration:underline}.sm-settingsCheckbox{display:inline-flex;align-items:center;gap:6px;cursor:pointer}.sm-settingsSelect{min-height:28px;padding:3px 8px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:6px;background:var(--dsw-alias-surface-l1,#fff);color:var(--dsw-alias-label-primary,#111);cursor:pointer;outline:none}.sm-panelHeaderClose:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderClose:disabled{opacity:.5;cursor:not-allowed}.sm-panelHeaderSelect{min-height:26px;padding:2px 9px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:7px;background:transparent;color:var(--dsw-alias-label-secondary,#555);cursor:pointer;font-size:12px;line-height:18px;display:inline-flex;align-items:center;gap:4px}.sm-panelHeaderSelect:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderSelect:disabled{opacity:.5;cursor:not-allowed}.sm-panelHeaderSelect.sm-on{background:var(--dsw-alias-accent-primary-bg,rgba(53,106,230,.12));border-color:var(--dsw-alias-accent-primary,#356ae6);color:var(--dsw-alias-accent-primary,#356ae6)}.sm-migrateCurrent{padding:8px 10px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;background:var(--dsw-alias-fill-l2,#f5f5f5);font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary,#111)}.sm-migrateConfirmLayer.sm-confirmDialog.sm-nativeDialogLayer{width:360px;inset:calc(50vh - 90px) auto auto calc(50vw + 308px)}.sm-migrateConfirmLayer.sm-confirmDialog.sm-nativeDialogLayer .sm-migrateDialog{position:relative;left:auto;top:auto;bottom:auto;transform:none;width:100%;max-width:none;max-height:min(70vh,520px);z-index:auto}.sm-migrateConfirmLayer .sm-migratePanel{min-width:0}.sm-migrateConfirmLayer .sm-nativeDialogButton.sm-nativeDialogConfirm:hover:not(:disabled){background-color:#4576f0;background-color:var(--dsw-alias-accent-primary-hover,#4576f0);color:#fff;border-color:#4576f0;border-color:var(--dsw-alias-accent-primary-hover,#4576f0);filter:none}.sm-settingsSectionHeader{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.sm-settingsSectionHeader .sm-settingsSectionTitle{margin-bottom:0}.sm-settingsVersionActions{display:flex;align-items:center;gap:8px}.sm-settingsCheckBtn{min-height:26px;padding:2px 12px;font-size:12px;line-height:18px;border-radius:6px;border:1px solid var(--dsw-alias-border-l2,#ddd);background:transparent;color:var(--dsw-alias-label-primary,#111);cursor:pointer;white-space:nowrap}.sm-settingsCheckBtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.sm-settingsRowInline{justify-content:flex-start;flex-wrap:wrap;gap:8px;align-items:center}.sm-settingsBadgeLink{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:6px;border:1px solid var(--dsw-alias-border-l2,#ddd);background:var(--dsw-alias-fill-l2,#f5f5f5);color:var(--dsw-alias-label-secondary,#555);font-size:12px;line-height:18px;text-decoration:none;cursor:pointer;transition:all .15s}.sm-settingsBadgeLink:hover{background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-accent-primary,#356ae6);border-color:var(--dsw-alias-accent-primary,#356ae6)}.sm-settingsBadgeLink svg{flex:none}[data-sm-theme=dark] .sm-settingsBadgeLink{background:#2a2a30!important;color:#b3b3b3!important;border-color:#3a3a40!important}[data-sm-theme=dark] .sm-settingsBadgeLink:hover{background:rgba(255,255,255,.06)!important;color:#5d8aff!important;border-color:#5d8aff!important}.sm-tooltip{z-index:1100!important;box-shadow:none!important;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.15))!important;filter:none!important}",
|
|
579
|
+
".sm-moveItemMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.sm-panelModal{width:760px;max-width:92vw}.sm-panelModal .sm-rowActions{flex-wrap:wrap;justify-content:flex-end}.sm-headerMenu{position:absolute;right:0;top:100%;margin-top:4px;z-index:50;display:flex;flex-direction:column;min-width:140px;padding:4px;background:var(--dsw-alias-bg-layer-2,#fff);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;box-shadow:0 4px 16px rgba(0,0,0,.15)}.sm-headerMenuItem{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:0 0;border:0;border-radius:6px;color:var(--dsw-alias-label-primary,#111);cursor:pointer;padding:6px 10px;font-size:13px;line-height:18px;white-space:nowrap}.sm-headerMenuItem:hover{background:var(--dsw-alias-interactive-bg-hover)}.sm-headerMenuItem .sm-headerBtnIcon{width:20px;min-width:20px;text-align:center;flex-shrink:0}.sm-headerMenuItemDanger{color:var(--dsw-alias-state-error-primary,#d92d20)}.sm-headerMenuItemDanger:hover{background:var(--dsw-alias-interactive-bg-hover-danger)}.sm-headerBtn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:32px;height:32px;box-sizing:border-box;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-button-floating-fill,#fff);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;cursor:pointer;padding:0 10px;font-size:13px;line-height:1;white-space:nowrap;transition:background .15s,color .15s,border-color .15s;flex-shrink:0}.sm-headerBtn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l1)}.sm-headerBtn:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.sm-headerBtn svg{width:16px;height:16px;display:block;margin:auto;flex-shrink:0}.sm-migratePanel{display:flex;flex-direction:column;gap:14px;min-width:480px}.sm-migrateRow{display:flex;flex-direction:column;gap:8px}.sm-migrateRow>label{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:16px;font-weight:500}.sm-migrateChips{display:flex;flex-wrap:wrap;gap:6px}.sm-migrateChip{padding:6px 12px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);background:transparent;cursor:pointer;font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary);white-space:nowrap}.sm-migrateChip:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.sm-migrateChip:disabled{opacity:.5;cursor:not-allowed}.sm-migrateChipOn{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-business-primary)}.sm-migrateEmpty{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.sm-migratePreview{padding:10px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-size:13px;line-height:18px}.sm-migrateWarn{padding:10px 12px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary,#f59e0b) 30%,transparent);border-radius:8px;background:var(--dsw-alias-state-warn-tertiary,#fef5e7);color:var(--dsw-alias-label-secondary);font-size:13px;line-height:18px}.sm-migrateList{max-height:200px;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:8px}.sm-headerBtnDanger{background:var(--dsw-alias-button-floating-fill,#fff);color:var(--dsw-alias-state-error-primary,#d92d20);border-color:var(--dsw-alias-state-error-primary,#d92d20);font-weight:500}.sm-headerBtnDanger:hover:not(:disabled){background:var(--dsw-alias-state-error-primary,#d92d20);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-error-primary,#d92d20)}.sm-header{display:inline-flex;align-items:center;gap:6px;flex-wrap:nowrap}.sm-headerSecondaryActions{display:inline-flex;align-items:center;gap:6px;flex-wrap:nowrap}.sm-headerCompactMenu{display:none;position:relative}.sm-headerCompactMenuBtn{width:32px;min-width:32px;height:32px;padding:0;justify-content:center;font-size:16px;line-height:1}.sm-headerBtnIcon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:14px;line-height:1;vertical-align:middle;flex-shrink:0}.sm-headerBtn.sm-markIcon{width:32px;min-width:32px;height:32px;padding:0;justify-content:center}.sm-headerBtn.sm-markIcon .sm-headerBtnIcon{width:16px;height:16px;font-size:15px;line-height:1}.sm-headerCompactMenuBtn .sm-headerBtnIcon{width:16px;height:16px;font-size:16px;line-height:1}.sm-annotationToggleOpen{position:relative;z-index:100004}.sm-headerBtnActive{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}@container (max-width:720px){.sm-headerBtn{width:32px;min-width:32px;height:32px;padding:0;justify-content:center}.sm-headerBtnLabel,.sm-priorityText,.sm-priorityBadge{display:none}.sm-headerBtn.sm-headerBtn-withBadge{width:auto;min-width:32px;padding:0 6px}}@container (max-width:520px){.sm-headerSecondaryActions,.sm-headerSecondaryAction{display:none!important}.sm-headerCompactMenu{display:inline-flex}}",
|
|
580
|
+
".sm-panelDialog{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);width:600px;max-width:calc(100vw - 32px);max-height:560px;height:auto;box-sizing:border-box;display:flex;flex-direction:column;gap:0;background:var(--sm-dialog-fill);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.25);overflow:hidden;z-index:1020}.sm-panelDialog .sm-nativeDialogHeader{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 16px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);flex:none;position:relative;min-height:46px;box-sizing:border-box}.sm-panelDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:14px;line-height:20px;font-weight:600;min-width:0;max-width:calc(100% - 140px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center;pointer-events:auto;z-index:0}.sm-panelDialog .sm-nativeDialogHeaderActions{display:flex;align-items:center;gap:6px;flex:none;position:relative;z-index:1;margin-left:auto}.sm-nativeDialogFooter,.sm-bulkDialog .sm-nativeDialogFooter,.sm-confirmDialog .sm-nativeDialogFooter,.sm-migrateDialog .sm-nativeDialogFooter{display:flex;padding:10px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee);flex:none;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-top:0}.sm-panelDialog .sm-panel{display:flex;flex-direction:column;gap:6px;min-height:0;flex:1 1 auto;overflow:auto;padding:8px 12px}.sm-panelDialog .sm-list{display:flex;flex-direction:column;gap:2px;flex:1 1 auto;min-height:0;overflow:auto}.sm-panelDialog .sm-row{display:flex;align-items:center;gap:8px;padding:6px 10px;min-height:36px;border:1px solid transparent;border-radius:8px;background:transparent;flex-shrink:0}.sm-panelDialog .sm-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.sm-panelDialog .sm-rowCurrent{background:var(--dsw-alias-bg-module-platform);border-color:var(--dsw-alias-state-business-primary,#356ae6)}.sm-panelDialog .sm-rowMain{display:flex;align-items:stretch!important;gap:8px;min-width:0;flex:1 1 auto;overflow:visible;text-align:left!important}.sm-panelDialog .sm-rowTitle{min-width:0;flex:1 1 0%;width:100%;align-self:stretch;display:flex;align-items:center;justify-content:flex-start;gap:6px;font-size:12px;line-height:16px;overflow:hidden;text-align:left!important;direction:ltr!important}.sm-confirmDialog{z-index:10000}.sm-confirmDialog.sm-nativeDialogLayer{position:fixed;left:calc(50vw + 184px);top:calc(50vh - 90px);width:360px;max-width:calc(100vw - 32px);max-height:none;display:block;align-items:initial;justify-content:initial;box-sizing:border-box;background:transparent;border:0;box-shadow:none;padding:0;inset:calc(50vh - 90px) auto auto calc(50vw + 308px)}.sm-confirmDialog.sm-nativeDialogLayer .sm-nativeDialogBackdrop{display:none}.sm-confirmDialog.sm-nativeDialogLayer .sm-nativeDialog{position:relative;left:auto;top:auto;transform:none;width:auto;box-sizing:border-box;background:var(--sm-dialog-fill);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.25);padding:0;overflow:hidden;animation:sm-confirmPop .14s ease-out}.sm-confirmDialog .sm-nativeDialogHeader{position:relative;padding:12px 16px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);display:flex;align-items:center;justify-content:center;min-height:44px;box-sizing:border-box}.sm-confirmDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:14px;line-height:20px;font-weight:600;text-align:center;width:auto;max-width:calc(100% - 32px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm-confirmDialog .sm-nativeDialogBody{padding:10px 16px;display:flex;flex-direction:column;gap:8px;min-height:0}.sm-confirmDialog .sm-nativeDialogDescription{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary);white-space:pre-wrap}.sm-confirmDialog .sm-warn{padding:6px 10px;font-size:12px;line-height:16px;margin-top:0}.sm-confirmDialog .sm-nativeDialogFooter{padding:10px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee);flex-wrap:wrap;justify-content:space-between;gap:6px;margin-top:0}.sm-confirmDialog .sm-nativeDialogButton{min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;cursor:pointer;background:transparent;color:var(--dsw-alias-label-primary);text-align:center}.sm-confirmDialog .sm-nativeDialogCancel:hover:not(:disabled),.sm-migrateDialog .sm-nativeDialogCancel:hover:not(:disabled),.sm-updateDialog .sm-nativeDialogCancel:hover:not(:disabled),.sm-bulkDialog .sm-nativeDialogCancel:hover:not(:disabled),.sm-panelDialog .sm-nativeDialogCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.sm-confirmDialog .sm-nativeDialogConfirm{background:var(--dsw-alias-state-business-primary,#356ae6);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-business-primary,#356ae6)}.sm-confirmDialog .sm-nativeDialogConfirm:hover:not(:disabled){filter:brightness(.94)}@keyframes sm-confirmPop{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.sm-confirmDialog.sm-nativeDialog{padding:0;width:auto;max-width:none}.sm-panelDialog .sm-rowTitle>span:first-child{display:block;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:auto;text-align:left!important;direction:ltr!important;unicode-bidi:plaintext}.sm-panelDialog .sm-rowMeta{display:none}.sm-panelDialog .sm-rowActions{display:flex;gap:2px;flex:none;justify-content:flex-end}.sm-panelDialog .sm-rowActions .sm-rowBtn{min-height:22px;padding:0 7px;font-size:11px;line-height:18px;border-radius:6px;border:1px solid transparent;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap}.sm-rowBtn.sm-markIcon{padding:0 6px;font-size:13px;line-height:18px}.sm-panelDialog .sm-rowActions .sm-rowBtn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.sm-panelDialog .sm-rowActions .sm-rowBtnDanger{color:var(--dsw-alias-state-error-primary)}.sm-panelDialog .sm-rowActions .sm-rowBtnDanger:hover{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary)}.sm-panelDialog .sm-filter{flex:none;padding:6px 12px 4px;gap:4px;display:flex;flex-wrap:wrap}.sm-panelDialog .sm-filterBtn{min-height:24px;padding:2px 10px;font-size:11px;line-height:16px;border-radius:4px;border:1px solid var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer}.sm-panelDialog .sm-filterBtn.sm-on{background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-primary)}.sm-panelDialog .sm-badge{font-size:10px;line-height:14px;padding:0 5px;border-radius:6px;flex:none}.sm-panelDialog .sm-error{padding:6px 10px;margin:0;font-size:12px;line-height:16px}.sm-panelDialog .sm-nativeDialogButton{min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:transparent;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:center}.sm-panelDialog .sm-nativeDialogCancel{background:transparent}.sm-panelDialog .sm-panelDialog .sm-nativeDialogConfirm{background:var(--dsw-alias-state-business-primary,#356ae6);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-business-primary,#356ae6)}.sm-nativeDialogDanger{background:var(--dsw-alias-state-error-primary,#d92d20);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-error-primary,#d92d20)}.sm-nativeDialogDanger:hover:not(:disabled){filter:brightness(.92)}.sm-confirmDialog .sm-nativeDialogDanger,.sm-migrateDialog .sm-nativeDialogDanger,.sm-bulkDialog .sm-nativeDialogDanger{background:var(--dsw-alias-state-error-primary,#d92d20);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-error-primary,#d92d20)}.sm-confirmDialog .sm-nativeDialogDanger:hover:not(:disabled),.sm-migrateDialog .sm-nativeDialogDanger:hover:not(:disabled),.sm-bulkDialog .sm-nativeDialogDanger:hover:not(:disabled){filter:brightness(.92)}.sm-panelDialog .sm-empty{padding:18px 0;font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:center}.sm-panelDialog .sm-footError{font-size:11px;color:var(--dsw-alias-state-error-primary);margin-right:auto;line-height:20px}.sm-panelDialog .sm-moveLabel{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary)}.sm-migrateDialog .sm-nativeDialogFooter{flex-wrap:wrap;justify-content:space-between;gap:6px;margin-top:0}.sm-migrateDialog .sm-migrateChip{cursor:pointer;pointer-events:auto;position:relative;z-index:1}.sm-migrateDialog .sm-migrateChip[disabled]{opacity:.5;cursor:not-allowed}.sm-migrateDialog.sm-nativeDialogLayer{position:fixed;left:50vw;top:auto;bottom:48px;transform:translateX(-50%);width:min(560px,calc(100vw - 32px));max-height:none;display:block;align-items:initial;justify-content:initial;box-sizing:border-box;background:transparent;border:0;box-shadow:none;padding:0;inset:auto;z-index:10001}.sm-migrateDialog.sm-nativeDialogLayer .sm-nativeDialogBackdrop{display:none}.sm-migrateDialog.sm-nativeDialogLayer .sm-nativeDialog{position:relative;left:auto;top:auto;transform:none;width:360px;max-width:calc(100vw - 32px);max-height:min(70vh,520px);box-sizing:border-box;background-color:var(--sm-dialog-fill);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.45);overflow:hidden;padding:0;display:flex;flex-direction:column;gap:0}.sm-migrateDialog{position:fixed;left:50vw;top:auto;bottom:48px;transform:translateX(-50%);width:min(560px,calc(100vw - 32px));max-height:min(70vh,520px);box-sizing:border-box;display:flex;flex-direction:column;gap:0;background-color:var(--sm-dialog-fill);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.45);overflow:hidden;z-index:10001}.sm-migrateDialog .sm-nativeDialogHeader{padding:12px 18px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);flex:none;position:relative;display:flex;align-items:center;justify-content:center;min-height:44px;box-sizing:border-box}.sm-migrateDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:14px;line-height:20px;font-weight:600;color:var(--dsw-alias-label-primary,#111);text-align:center;width:auto;max-width:calc(100% - 36px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm-migrateDialog .sm-migratePanel{padding:12px 18px;display:flex;flex-direction:column;gap:14px}.sm-migrateDialog .sm-nativeDialogBody{padding:0}.sm-migrateDialog .sm-nativeDialogFooter{padding:10px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee);flex:none;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-top:0;gap:8px}.sm-migrateDialog .sm-migrateRow>label{color:var(--dsw-alias-label-secondary,#444)}.sm-migrateDialog .sm-migrateChip{padding:6px 12px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2,#ddd);background-color:var(--dsw-alias-markdown-tag,#f1f3f5);color:var(--dsw-alias-label-primary,#111);font-size:13px;line-height:18px;cursor:pointer;pointer-events:auto;position:relative;z-index:1;white-space:nowrap}.sm-migrateDialog .sm-migrateChip:hover:not(:disabled){background-color:var(--dsw-alias-interactive-bg-hover,#e8e8e8)}.sm-migrateDialog .sm-migrateChipOn{background-color:var(--dsw-alias-state-business-primary,#356ae6);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-business-primary,#356ae6)}.sm-migrateDialog .sm-migrateChip.sm-migrateChipOn:hover:not(:disabled){background-color:var(--dsw-alias-button-info-hover,#4576f0);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-button-info-hover,#4576f0);filter:none}.sm-migrateDialog .sm-migrateChipOn:hover:not(:disabled){filter:brightness(.92)}.sm-migrateDialog .sm-migrateChip[disabled]{opacity:.5;cursor:not-allowed}.sm-migrateDialog .sm-migrateEmpty{color:var(--dsw-alias-label-tertiary,#888)}.sm-migrateDialog .sm-migratePreview{padding:10px 12px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;background-color:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-primary,#111);font-size:13px;line-height:18px}.sm-migrateDialog .sm-migrateWarn{padding:10px 12px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary,#f59e0b) 30%,transparent);border-radius:8px;background-color:var(--dsw-alias-state-warn-tertiary,#fef5e7);color:var(--dsw-alias-label-secondary,#444);font-size:13px;line-height:18px}.sm-migrateDialog .sm-nativeDialogButton{min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;cursor:pointer;background-color:transparent;color:var(--dsw-alias-label-primary,#111);text-align:center}.sm-migrateDialog .sm-nativeDialogButton:hover:not(:disabled){background-color:var(--dsw-alias-interactive-bg-hover,#e8e8e8)}.sm-migrateDialog .sm-nativeDialogConfirm{background-color:var(--dsw-alias-state-business-primary,#356ae6);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-business-primary,#356ae6)}.sm-migrateDialog .sm-nativeDialogConfirm:hover:not(:disabled){filter:brightness(.94)}",
|
|
581
|
+
// The .sm-tooltip rule below deliberately keeps !important: it targets
|
|
582
|
+
// DSH's Tooltip primitive (used through renderTip), which ships its own
|
|
583
|
+
// inline styles, so a plugin rule cannot win on specificity alone
|
|
584
|
+
// (Issue #21 regression guard). It overrides DSH's primitive rather than
|
|
585
|
+
// DSH's theme tokens -- and it only sets a token-based border plus
|
|
586
|
+
// z-index/shadow -- so it does not block theming.
|
|
587
|
+
// NOTE: DSH's bubble uses a hard-coded hashed class and forwards no
|
|
588
|
+
// className, so this rule matches nothing today (the class is never
|
|
589
|
+
// applied). Tooltip visibility is governed by the layering contract
|
|
590
|
+
// above, not by this rule; it is kept as the scoped replacement for the
|
|
591
|
+
// unscoped selector Issue #21 removed.
|
|
592
|
+
".sm-panelHeaderClose{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;min-height:26px;padding:0;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:7px;background:transparent;color:var(--dsw-alias-label-secondary,#555);cursor:pointer;flex:none;box-sizing:border-box;outline:none}.sm-panelHeaderClose:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderClose svg{display:block;width:14px;height:14px;margin:auto}.sm-panelHeaderGithub{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:6px;color:var(--dsw-alias-label-secondary,#555);text-decoration:none;flex:none;transition:background .15s,color .15s;cursor:pointer}.sm-panelHeaderGithub:hover{background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderGithub svg{display:block;width:16px;height:16px;fill:currentColor}.sm-panelHeaderLeft{display:flex;align-items:center;gap:4px;flex:none;position:relative;z-index:1}.sm-panelHeaderWhale{display:inline-flex;align-items:center;justify-content:center;position:relative;width:26px;height:26px;border-radius:6px;color:var(--dsw-alias-label-secondary,#555);text-decoration:none;flex:none;transition:background .15s,color .15s;cursor:pointer}.sm-panelHeaderWhale:hover{background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderWhale svg{display:block;width:16px;height:16px;margin:auto}.sm-panelHeaderWhale .sm-updateDot{position:absolute;top:2px;right:2px;width:7px;height:7px;border-radius:50%;background:var(--dsw-alias-state-error-primary,#e53e3e);border:1.5px solid var(--dsw-alias-bg-layer-1,#fff)}.sm-panelHeaderWhale .sm-updateSpinner{position:absolute;inset:2px;border:2px solid transparent;border-top-color:var(--dsw-alias-state-business-primary,#356ae6);border-radius:50%;animation:sm-spin .8s linear infinite}@keyframes sm-spin{to{transform:rotate(360deg)}}.sm-updateDialogLayer{display:flex!important;align-items:center!important;justify-content:center!important;position:fixed;inset:0;padding:16px;box-sizing:border-box;background:transparent;border:0;box-shadow:none;z-index:10010;pointer-events:none}.sm-updateDialogLayer .sm-nativeDialog{position:relative;width:380px;max-width:calc(100vw - 32px);box-sizing:border-box;background:var(--sm-dialog-fill);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.25);overflow:hidden;animation:sm-confirmPop .14s ease-out;pointer-events:auto}.sm-updateDialog .sm-nativeDialogHeader{position:relative;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 16px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);flex:none;min-height:46px;box-sizing:border-box}.sm-updateDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:15px;line-height:20px;font-weight:600;text-align:center;width:auto;max-width:calc(100% - 80px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;z-index:0}.sm-updateDialog .sm-nativeDialogHeader .sm-panelHeaderClose{position:relative;z-index:1;margin-left:auto}.sm-updateDialog .sm-nativeDialogBody{padding:14px 16px;display:flex;flex-direction:column;gap:10px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#111)}.sm-updateDialog .sm-nativeDialogFooter{display:flex;padding:10px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee);flex:none;flex-wrap:wrap;justify-content:space-between;gap:8px;margin-top:0}.sm-updateDialog .sm-nativeDialogFooter .sm-nativeDialogConfirm:only-child{margin-left:auto}.sm-updateDialog .sm-nativeDialogButton{min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;cursor:pointer;background:transparent;color:var(--dsw-alias-label-primary,#111);text-align:center}.sm-updateDialog .sm-nativeDialogButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.sm-updateDialog .sm-nativeDialogConfirm{background:var(--dsw-alias-state-business-primary,#356ae6);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-business-primary,#356ae6)}.sm-updateDialog .sm-nativeDialogConfirm:hover:not(:disabled){filter:brightness(.94)}.sm-updateVersionGrid{display:grid;grid-template-columns:auto 1fr;gap:6px 12px;padding:12px;background:var(--dsw-alias-bg-layer-2,#fff);border:1px solid var(--dsw-alias-border-l2,#eee);border-radius:8px;font-size:13px;line-height:20px}.sm-updateVersionLabel{color:var(--dsw-alias-label-secondary,#666);font-weight:500}.sm-updateVersionValue{color:var(--dsw-alias-label-primary,#111);font-family:monospace;font-size:13px}.sm-updateStatusBox{margin-top:10px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#111)}.sm-updateStatusBox.sm-warn{color:var(--dsw-alias-state-warn-label,#dd8629);background:var(--dsw-alias-state-warn-tertiary,#fef5e7);padding:8px 10px;border-radius:6px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary,#f59e0b) 25%,transparent)}.sm-updateStatusBox.sm-error{color:var(--dsw-alias-state-error-primary,#ec1313);background:color-mix(in srgb,var(--dsw-alias-state-error-primary,#ec1313) 8%,transparent);padding:8px 10px;border-radius:6px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-error-primary,#ec1313) 22%,transparent)}.sm-updateStatusBox.sm-success{color:var(--dsw-alias-state-success-primary,#22c55e);background:var(--dsw-alias-state-success-tertiary,#e6faed);padding:8px 10px;border-radius:6px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-success-primary,#22c55e) 25%,transparent)}.sm-settingsCard{background:var(--sm-dialog-surface);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;padding:16px 20px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#111);box-sizing:border-box;width:100%}.sm-settingsHeader{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;padding-bottom:10px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee)}.sm-settingsTitle{margin:0;font-size:16px;line-height:22px;font-weight:600;display:flex;align-items:center;gap:8px}.sm-settingsTag{font-size:12px;padding:2px 8px;border-radius:999px;background:var(--dsw-alias-markdown-tag,#f1f3f5);color:var(--dsw-alias-label-secondary,#666);font-family:monospace}.sm-settingsSection{margin-top:14px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}.sm-settingsSectionTitle{font-size:13px;font-weight:600;color:var(--dsw-alias-label-secondary,#666);margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.sm-settingsRow{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:32px}.sm-settingsActions{display:flex;align-items:center;gap:8px;margin-top:10px}.sm-settingsLink{color:var(--dsw-alias-state-business-primary,#356ae6);text-decoration:none}.sm-settingsLink:hover{text-decoration:underline}.sm-settingsCheckbox{display:inline-flex;align-items:center;gap:6px;cursor:pointer}.sm-settingsSelect{min-height:28px;padding:3px 8px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:6px;background:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-primary,#111);cursor:pointer;outline:none}.sm-panelHeaderClose:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-primary,#111)}.sm-panelHeaderClose:disabled{opacity:.5;cursor:not-allowed}.sm-migrateCurrent{padding:8px 10px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary,#111)}.sm-migrateConfirmLayer.sm-confirmDialog.sm-nativeDialogLayer{width:360px;inset:calc(50vh - 90px) auto auto calc(50vw + 308px)}.sm-migrateConfirmLayer.sm-confirmDialog.sm-nativeDialogLayer .sm-migrateDialog{position:relative;left:auto;top:auto;bottom:auto;transform:none;width:100%;max-width:none;max-height:min(70vh,520px);z-index:auto}.sm-migrateConfirmLayer .sm-migratePanel{min-width:0}.sm-migrateConfirmLayer .sm-nativeDialogButton.sm-nativeDialogConfirm:hover:not(:disabled){background-color:var(--dsw-alias-button-info-hover,#4576f0);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-button-info-hover,#4576f0);filter:none}.sm-settingsSectionHeader{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.sm-settingsSectionHeader .sm-settingsSectionTitle{margin-bottom:0}.sm-settingsVersionActions{display:flex;align-items:center;gap:8px}.sm-settingsCheckBtn{min-height:26px;padding:2px 12px;font-size:12px;line-height:18px;border-radius:6px;border:1px solid var(--dsw-alias-border-l2,#ddd);background:transparent;color:var(--dsw-alias-label-primary,#111);cursor:pointer;white-space:nowrap}.sm-settingsCheckBtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.sm-settingsRowInline{justify-content:flex-start;flex-wrap:wrap;gap:8px;align-items:center}.sm-settingsBadgeLink{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:6px;border:1px solid var(--dsw-alias-border-l2,#ddd);background:var(--dsw-alias-markdown-tag,#f1f3f5);color:var(--dsw-alias-label-secondary,#555);font-size:12px;line-height:18px;text-decoration:none;cursor:pointer;transition:all .15s}.sm-settingsBadgeLink:hover{background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-state-business-primary,#356ae6);border-color:var(--dsw-alias-state-business-primary,#356ae6)}.sm-settingsBadgeLink svg{flex:none}.sm-tooltip{z-index:1100!important;box-shadow:none!important;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.15))!important;filter:none!important}",
|
|
558
593
|
|
|
559
|
-
//
|
|
560
|
-
//
|
|
561
|
-
//
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
594
|
+
// Issue #23 — dialog opacity.
|
|
595
|
+
//
|
|
596
|
+
// The fill is the DSH surface token itself, with the user's opacity used
|
|
597
|
+
// only as that token's weight inside color-mix(). At the default 100%
|
|
598
|
+
// the mix is `color-mix(in srgb, <token> 100%, transparent)`, which
|
|
599
|
+
// reproduces the token VERBATIM -- including whatever alpha the token (or
|
|
600
|
+
// a theme that republished it) already carries. The plugin therefore
|
|
601
|
+
// never forces an originally translucent DSH surface opaque, and only
|
|
602
|
+
// adds translucency when the user lowers the slider.
|
|
603
|
+
//
|
|
604
|
+
// Only the dialog *fill* is affected, so text, buttons, icons, borders
|
|
605
|
+
// and hover states stay fully opaque, and inside controls read their own
|
|
606
|
+
// DSH tokens rather than inheriting this setting. The static --sm-dialog-
|
|
607
|
+
// surface-fallback below is used only when the DSH token is missing; the
|
|
608
|
+
// plugin detects and names no theme plugin at all.
|
|
609
|
+
":root{--sm-dialog-opacity:100%}",
|
|
610
|
+
"html[data-sm-theme=light]{--sm-dialog-surface-fallback:#fff}",
|
|
611
|
+
"html[data-sm-theme=dark]{--sm-dialog-surface-fallback:#1f1f23}",
|
|
612
|
+
// Native UA chrome (a <select> dropdown list, scrollbars, checkbox
|
|
613
|
+
// internals) is painted by the browser, not by DSH tokens. DSH owns the
|
|
614
|
+
// palette for it: ui-layout's ThemePresenter subscribes to the official
|
|
615
|
+
// `theme/change` event and writes `documentElement.style.colorScheme`
|
|
616
|
+
// ("html { color-scheme } for native UA chrome"), which every plugin
|
|
617
|
+
// surface inherits. The plugin must NOT override it -- an earlier revision
|
|
618
|
+
// forced `color-scheme` from this plugin's own theme mirror and could then
|
|
619
|
+
// pin the native chrome to the opposite scheme (dark dropdown lists in
|
|
620
|
+
// light mode) while the tokens had already moved on. DSH stays the single
|
|
621
|
+
// authority; the plugin only themes the list *items*, which is something
|
|
622
|
+
// color-scheme alone does not cover.
|
|
623
|
+
// The items use the *layer-3* surface, not the control's layer-2: a
|
|
624
|
+
// floating list must stay opaque, and a theme may give layer-2 an alpha,
|
|
625
|
+
// which composites over the UA's default popup backdrop and still reads as
|
|
626
|
+
// white. layer-3 is opaque in DSH's palette (#fff light / #353638 dark)
|
|
627
|
+
// and sits above the dialog (layer-1) and the control (layer-2). The
|
|
628
|
+
// checked row is marked with the accent text colour instead of a fill so
|
|
629
|
+
// no translucent token can wash it out either.
|
|
630
|
+
".sm-panelDialog option,.sm-nativeDialog option,.sm-settingsCard option,.sm-headerMenu option{background-color:var(--dsw-alias-bg-layer-3,#fff);color:var(--dsw-alias-label-primary,#111)}",
|
|
631
|
+
".sm-panelDialog option:checked,.sm-nativeDialog option:checked,.sm-settingsCard option:checked,.sm-headerMenu option:checked{background-color:var(--dsw-alias-bg-layer-3,#fff);color:var(--dsw-alias-state-business-primary,#356ae6)}",
|
|
632
|
+
".sm-panelDialog option:disabled,.sm-nativeDialog option:disabled,.sm-settingsCard option:disabled,.sm-headerMenu option:disabled{color:var(--dsw-alias-label-tertiary,#888)}",
|
|
633
|
+
".sm-nativeDialog,.sm-panelDialog,.sm-migrateDialog,.sm-settingsCard{--sm-dialog-surface:var(--dsw-alias-bg-layer-1,var(--sm-dialog-surface-fallback,#fff));--sm-dialog-fill:color-mix(in srgb,var(--sm-dialog-surface) var(--sm-dialog-opacity,100%),transparent)}",
|
|
634
|
+
".sm-settingsSlider{display:flex;align-items:center;gap:8px;flex:1 1 auto;justify-content:flex-end;min-width:0}",
|
|
635
|
+
".sm-settingsRange{flex:1 1 120px;min-width:96px;max-width:220px;margin:0;cursor:pointer;accent-color:var(--dsw-alias-state-business-primary,#356ae6)}",
|
|
636
|
+
".sm-settingsRange:disabled{cursor:not-allowed}",
|
|
637
|
+
".sm-settingsRangeValue{min-width:38px;text-align:right;font-size:12px;line-height:18px;font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-secondary,#666)}",
|
|
638
|
+
".sm-settingsResetBtn{min-height:26px;padding:2px 10px;font-size:12px;line-height:18px;border-radius:6px;border:1px solid var(--dsw-alias-border-l2,#ddd);background:transparent;color:var(--dsw-alias-label-secondary,#666);cursor:pointer;white-space:nowrap}",
|
|
639
|
+
".sm-settingsResetBtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary,#111)}",
|
|
640
|
+
".sm-settingsResetBtn:disabled{opacity:.5;cursor:not-allowed}",
|
|
641
|
+
".sm-settingsHint{margin-top:4px;font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888)}",
|
|
642
|
+
|
|
643
|
+
// DSH's own theme is the single source of colour. Every rule above reads
|
|
644
|
+
// --dsw-alias-* tokens directly and none of them is redefined here: the
|
|
645
|
+
// plugin only *reads* DSH's theme, so a theme (or a third-party theme
|
|
646
|
+
// plugin) that republishes those tokens is picked up automatically.
|
|
647
|
+
// The only thing these two rules still provide is the token-less
|
|
648
|
+
// fallback surface colour required by the dialog-opacity fill. The
|
|
649
|
+
// light/dark state itself is mirrored onto <html data-sm-theme> by
|
|
650
|
+
// smApplyTheme(), which reads body[data-ds-dark-theme].
|
|
651
|
+
"[data-sm-theme=light] .sm-nativeDialog,[data-sm-theme=light] .sm-panelDialog,[data-sm-theme=light] .sm-migrateDialog,[data-sm-theme=light] .sm-settingsCard{--sm-dialog-surface-fallback:#fff}",
|
|
652
|
+
"[data-sm-theme=dark] .sm-nativeDialog,[data-sm-theme=dark] .sm-panelDialog,[data-sm-theme=dark] .sm-migrateDialog,[data-sm-theme=dark] .sm-settingsCard{--sm-dialog-surface-fallback:#1f1f23}",
|
|
566
653
|
".sm-panelDialog{max-height:min(640px,calc(100vh - 32px))}.sm-panelDialog .sm-panel{min-width:0;overflow:hidden}",
|
|
567
654
|
".sm-panelTools{display:flex;flex-direction:column;gap:8px;flex:none;padding:2px 0 6px}",
|
|
568
|
-
".sm-queryInput,.sm-viewSelect{box-sizing:border-box;width:100%;min-width:0;height:32px;padding:5px 9px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:7px;background:var(--dsw-alias-
|
|
569
|
-
".sm-queryInput::placeholder{color:var(--dsw-alias-label-tertiary,#888)}.sm-queryInput:focus-visible,.sm-viewSelect:focus-visible,.sm-resetFilters:focus-visible{outline:2px solid var(--dsw-alias-
|
|
655
|
+
".sm-queryInput,.sm-viewSelect{box-sizing:border-box;width:100%;min-width:0;height:32px;padding:5px 9px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:7px;background:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-primary,#111);font:inherit;font-size:12px;line-height:20px}",
|
|
656
|
+
".sm-queryInput::placeholder{color:var(--dsw-alias-label-tertiary,#888)}.sm-queryInput:focus-visible,.sm-viewSelect:focus-visible,.sm-resetFilters:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#356ae6);outline-offset:2px}.sm-viewSelect:disabled{opacity:.6;cursor:wait}",
|
|
570
657
|
".sm-panelSelects{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.sm-panelSelects .sm-viewField>span{display:none}.sm-panelSelects .sm-viewField .sm-viewSelect{font-size:11px;padding:4px 7px;height:28px;line-height:18px}.sm-viewField{display:flex;flex-direction:column;gap:3px;min-width:0;color:var(--dsw-alias-label-secondary,#666);font-size:11px;line-height:16px}",
|
|
571
|
-
".sm-filterBar{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap}.sm-resultSummary{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:11px;color:var(--dsw-alias-label-tertiary,#888)}.sm-resetFilters{padding:2px 0;border:0;background:none;color:var(--dsw-alias-
|
|
658
|
+
".sm-filterBar{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap}.sm-resultSummary{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:11px;color:var(--dsw-alias-label-tertiary,#888)}.sm-resetFilters{padding:2px 0;border:0;background:none;color:var(--dsw-alias-state-business-primary,#356ae6);font:inherit;cursor:pointer}.sm-resetFilters:hover{text-decoration:underline}.sm-workspaceNotice{display:flex;gap:8px;align-items:center;font-size:12px;color:var(--dsw-alias-label-secondary,#666)}",
|
|
572
659
|
"@media(max-width:540px){.sm-panelSelects{grid-template-columns:minmax(0,1fr)}.sm-panelDialog .sm-row{height:auto;min-height:36px;flex-shrink:0;flex-wrap:wrap;padding:6px 8px}.sm-panelDialog .sm-rowMain{flex-basis:100%}.sm-panelDialog .sm-rowActions{width:100%;min-width:0;flex:1 1 100%;justify-content:flex-start}}",
|
|
573
660
|
".sm-panelDialog:not(.sm-annotationSurface){width:680px}.sm-panelDialog .sm-row{flex-shrink:0;padding:5px 8px}.sm-panelDialog .sm-rowMain{flex:1 1 200px;flex-direction:column;gap:4px}.sm-panelDialog .sm-rowActions{max-width:100%}.sm-rowSecondary{display:flex;flex-wrap:nowrap;align-items:center;gap:6px;min-width:0;line-height:18px}.sm-rowBadges{display:flex;align-items:center;gap:5px;min-width:0;flex:1 1 auto;flex-wrap:wrap;font-size:11px;line-height:18px}.sm-rowMeta{color:var(--dsw-alias-label-tertiary,#888);font-size:11px;line-height:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex:none}.sm-rowAnnotations{display:flex;align-items:center;gap:5px;min-width:0;font-size:10px;line-height:16px}",
|
|
574
|
-
|
|
661
|
+
// .sm-markIcon.sm-markOn keeps !important because the generic
|
|
662
|
+
// `.sm-panelDialog .sm-rowActions .sm-rowBtn` colour rule (3 classes)
|
|
663
|
+
// outranks this 2-class selector; it overrides the plugin's own rule,
|
|
664
|
+
// not DSH's theme. The .sm-priority-1/2 colours below are plugin
|
|
665
|
+
// semantics (priority levels have no DSH token); they and their dark
|
|
666
|
+
// branch are the only intentional data-driven theme branch left.
|
|
667
|
+
".sm-markIcon{min-width:25px;padding-left:5px;padding-right:5px;font-size:15px}.sm-markIcon.sm-markOn{color:var(--dsw-alias-state-business-primary,#356ae6)!important;background:var(--dsw-alias-bg-module-platform,#f5f6f7)}.sm-priorityBadge{padding:0 5px;border-radius:4px;background:var(--dsw-alias-markdown-tag,#f1f3f5);color:var(--dsw-alias-label-secondary,#666)}.sm-priority-1{color:#c2410c;background:rgba(234,88,12,.12)}.sm-priority-2{color:#a16207;background:rgba(202,138,4,.12)}",
|
|
575
668
|
"[data-sm-theme=dark] .sm-priority-1{color:#fdba74}[data-sm-theme=dark] .sm-priority-2{color:#fde68a}",
|
|
576
|
-
".sm-tagChip,.sm-noteBadge{max-width:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:0;border-radius:4px;background:var(--dsw-alias-
|
|
669
|
+
".sm-tagChip,.sm-noteBadge{max-width:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:0;border-radius:4px;background:var(--dsw-alias-markdown-tag,#f1f3f5);color:var(--dsw-alias-label-secondary,#666);font:inherit;line-height:16px;padding:0 5px;cursor:pointer}.sm-noteBadge{background:transparent}.sm-tagChip:hover,.sm-noteBadge:hover{color:var(--dsw-alias-state-business-primary,#356ae6)}",
|
|
577
670
|
".sm-markFilters{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.sm-markFiltersGroup{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.sm-markFiltersSpacer{flex:1 1 auto;min-width:12px}.sm-markFilterToggle{height:28px;padding:3px 10px;white-space:nowrap}.sm-markFilterToggle:disabled{opacity:.5;cursor:not-allowed}.sm-bulkSelectBtn{height:28px;padding:3px 10px;white-space:nowrap}.sm-bulkSelectBtn:disabled{opacity:.5;cursor:not-allowed}",
|
|
578
|
-
|
|
671
|
+
// Layering contract (do not raise these above 1100).
|
|
672
|
+
// DSH's own scale is: 1000 = modal backdrop / full-viewport overlay,
|
|
673
|
+
// 1100 = floating tier shared by menus, popovers, dialogs AND the
|
|
674
|
+
// Tooltip bubble this plugin renders through renderTip(). DSH's Tooltip
|
|
675
|
+
// bubble has a hard-coded z-index (100 inline, 1100 when portaled) and
|
|
676
|
+
// exposes no class hook, so a plugin surface stacked above 1100 always
|
|
677
|
+
// hides its own tooltips.
|
|
678
|
+
// The plugin therefore keeps its two document-level layers inside the
|
|
679
|
+
// 1000..1100 gap -- the panel at 1020 and this overlay root at 1050 --
|
|
680
|
+
// and everything portaled into this root is relative to its context.
|
|
681
|
+
"#dsh-session-manager-overlay-root{position:fixed!important;inset:0!important;width:100%!important;height:100%!important;z-index:1050!important;pointer-events:none!important;overflow:visible!important}.sm-annotationDialog.sm-nativeDialogLayer{position:fixed;display:block;pointer-events:none;z-index:100002;background:transparent}.sm-annotationDialog .sm-nativeDialogBackdrop{display:none}.sm-annotationDialog.sm-annotationDialog-anchored.sm-nativeDialogLayer,.sm-confirmDialog.sm-confirmDialog-anchored.sm-nativeDialogLayer{inset:auto;background:transparent}.sm-annotationDialog.sm-confirmDialog.sm-nativeDialogLayer:not(.sm-annotationDialog-anchored){inset:50% auto auto calc(50vw + 308px);transform:translateY(-50%);max-height:calc(100vh - 32px)}.sm-panelDialog.sm-annotationSurface{position:absolute;width:360px;max-height:min(680px,calc(100vh - 32px));pointer-events:auto;z-index:100003;box-shadow:0 16px 48px rgba(0,0,0,.25)}.sm-panelDialog.sm-annotationSurface.sm-annotationSurface-anchored{position:relative;transform:none;left:auto;top:auto;margin:0}.sm-annotationCloseHint{margin:0 16px 8px;font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary)}",
|
|
579
682
|
".sm-annotationBody{padding:14px 16px;display:flex;flex-direction:column;gap:12px;min-height:0;overflow:auto;flex:1 1 auto}.sm-annotationTarget{font-size:12px;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary,#666)}.sm-annotationChecks{display:grid;grid-template-columns:auto 1fr;column-gap:14px;row-gap:4px;align-items:center;font-size:13px}.sm-annotationChecks>label{display:flex;gap:6px;align-items:center;cursor:pointer}.sm-annotationChecks .sm-annotationPriority{display:inline-flex;align-items:center;gap:6px;font-size:13px;line-height:18px;color:inherit}.sm-annotationChecks .sm-prioritySelectInline{height:24px;padding:2px 6px;font-size:12px;line-height:18px;min-width:104px;width:auto;border-radius:6px;color:var(--dsw-alias-label-primary,#111)}.sm-annotationChecks>small{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);justify-self:start}.sm-annotationHint,.sm-annotationBody small{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888)}",
|
|
580
|
-
".sm-noteInput{box-sizing:border-box;width:100%;min-height:60px;resize:vertical;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:7px;padding:8px;background:var(--dsw-alias-
|
|
581
|
-
".sm-bulkBar{box-sizing:border-box;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));align-items:stretch;gap:6px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:10px;background:var(--dsw-alias-
|
|
683
|
+
".sm-noteInput{box-sizing:border-box;width:100%;min-height:60px;resize:vertical;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:7px;padding:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-primary,#111);font:inherit;font-size:13px;line-height:19px}.sm-noteInput:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#356ae6);outline-offset:2px}.sm-markConflict{display:flex;flex-direction:column;gap:5px;font-size:12px;padding:8px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:6px}.sm-fieldWithClear .sm-fieldRow{position:relative;display:flex;align-items:flex-start;gap:4px}.sm-fieldRow .sm-queryInput{flex:1 1 auto;min-width:0}.sm-fieldRowNote{align-items:stretch}.sm-fieldClear{position:absolute;top:5px;right:6px;width:22px;height:22px;border:0;background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer;border-radius:4px;font-size:14px;line-height:18px;display:inline-flex;align-items:center;justify-content:center;padding:0}.sm-fieldClear:hover,.sm-fieldClear:focus-visible{color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover);outline:none}.sm-fieldClearNote{top:6px}.sm-importGroup{display:flex;flex-direction:column;gap:8px;padding:12px 16px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}.sm-importGroupHeader{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:20px}.sm-importLabel{color:var(--dsw-alias-label-secondary,#666);font-size:11px;line-height:16px}.sm-importGroupButtons{display:flex;align-items:center;gap:6px;flex:none}.sm-importBtn{cursor:pointer;color:var(--dsw-alias-label-primary,#111);background:transparent;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;text-align:center}.sm-importBtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.sm-importBtn:disabled{opacity:.5;cursor:not-allowed}.sm-importStatus{margin:0;padding:8px 10px;font-size:12px;line-height:18px;background:var(--dsw-alias-state-business-tertiary,rgba(53,106,230,.08));color:var(--dsw-alias-label-secondary);border-radius:6px;white-space:pre-wrap;word-break:break-word}",
|
|
684
|
+
".sm-bulkBar{box-sizing:border-box;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));align-items:stretch;gap:6px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:10px;background:var(--dsw-alias-bg-layer-2,#fff)}.sm-bulkBar .sm-bulkSummary{grid-column:1/-1;color:var(--dsw-alias-label-primary,#111);font-size:12px;line-height:18px;font-weight:500;margin:0 0 2px}",
|
|
582
685
|
".sm-bulkSummary{color:var(--dsw-alias-label-primary,#111);font-size:12px;line-height:18px;font-weight:500}",
|
|
583
686
|
"",
|
|
584
687
|
".sm-panelDialog button,.sm-panelDialog a,.sm-panelHeaderGithub,.sm-panelHeaderWhale,.sm-panelHeaderClose,.sm-headerBtn,.sm-headerMenuItem,.sm-updateDialog button,.sm-settingsCard button,.sm-settingsCard a,.sm-rowBtn,.sm-bulkBtn{outline:none;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sm-panelDialog button:hover,.sm-panelDialog a:hover,.sm-panelHeaderGithub:hover,.sm-panelHeaderWhale:hover,.sm-panelHeaderClose:hover,.sm-headerBtn:hover,.sm-headerMenuItem:hover,.sm-updateDialog button:hover,.sm-settingsCard button:hover,.sm-rowBtn:hover,.sm-bulkBtn:hover{outline:none;box-shadow:none}",
|
|
585
|
-
".sm-bulkBar .sm-bulkBtn{cursor:pointer;color:var(--dsw-alias-label-secondary,#666);background:
|
|
688
|
+
".sm-bulkBar .sm-bulkBtn{cursor:pointer;color:var(--dsw-alias-label-secondary,#666);background:transparent;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;padding:4px 10px;font-size:12px;line-height:18px;display:inline-flex;align-items:center;justify-content:center;gap:4px;white-space:nowrap;text-align:center}",
|
|
586
689
|
".sm-bulkBar .sm-bulkBtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary,#111)}",
|
|
587
690
|
".sm-bulkBar .sm-bulkBtn:disabled{opacity:.5;cursor:not-allowed}",
|
|
588
|
-
".sm-bulkBar .sm-bulkBtnDanger{color:var(--dsw-alias-state-error-primary);border-color:
|
|
589
|
-
".sm-bulkBar .sm-bulkBtnDanger:hover:not(:disabled){color
|
|
691
|
+
".sm-bulkBar .sm-bulkBtnDanger{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary,#ec1313) 45%,transparent)}",
|
|
692
|
+
".sm-bulkBar .sm-bulkBtnDanger:hover:not(:disabled){color:var(--dsw-alias-label-primary-foreground,#fff);background:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}",
|
|
590
693
|
"",
|
|
591
694
|
".sm-bulkRowCheckbox{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;flex:none}",
|
|
592
695
|
".sm-bulkRowCheckbox input{width:14px;height:14px;cursor:pointer;margin:0}",
|
|
593
696
|
".sm-bulkRowCheckbox input:disabled{cursor:not-allowed}",
|
|
594
|
-
".sm-rowBulkSelected{border-color:var(--dsw-alias-
|
|
595
|
-
".sm-bulkDialog.sm-nativeDialogLayer{position:fixed;left:calc(50vw + 184px);top:calc(50vh - 90px);width:360px;max-width:calc(100vw - 32px);max-height:none;display:block;align-items:initial;justify-content:initial;box-sizing:border-box;background:transparent;border:0;box-shadow:none;padding:0;inset:calc(50vh - 90px) auto auto calc(50vw + 308px);z-index:10002}.sm-bulkDialog.sm-nativeDialogLayer .sm-nativeDialogBackdrop{display:none}.sm-bulkDialog.sm-nativeDialogLayer .sm-nativeDialog{position:relative;left:auto;top:auto;transform:none;width:auto;box-sizing:border-box;background:var(--
|
|
697
|
+
".sm-rowBulkSelected{border-color:var(--dsw-alias-state-business-primary,#356ae6);background:var(--dsw-alias-state-business-tertiary,rgba(53,106,230,.06))}",
|
|
698
|
+
".sm-bulkDialog.sm-nativeDialogLayer{position:fixed;left:calc(50vw + 184px);top:calc(50vh - 90px);width:360px;max-width:calc(100vw - 32px);max-height:none;display:block;align-items:initial;justify-content:initial;box-sizing:border-box;background:transparent;border:0;box-shadow:none;padding:0;inset:calc(50vh - 90px) auto auto calc(50vw + 308px);z-index:10002}.sm-bulkDialog.sm-nativeDialogLayer .sm-nativeDialogBackdrop{display:none}.sm-bulkDialog.sm-nativeDialogLayer .sm-nativeDialog{position:relative;left:auto;top:auto;transform:none;width:auto;box-sizing:border-box;background:var(--sm-dialog-fill);color:var(--dsw-alias-label-primary,#111);border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.25);padding:0;overflow:hidden;animation:sm-confirmPop .14s ease-out}.sm-bulkDialog .sm-nativeDialogHeader{padding:10px 16px;border-bottom:1px solid var(--dsw-alias-border-l2,#eee);flex:none;position:relative;display:flex;align-items:center;justify-content:center;min-height:44px;box-sizing:border-box}.sm-bulkDialog .sm-nativeDialogTitle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;font-size:14px;line-height:20px;font-weight:600;text-align:center;width:auto;max-width:calc(100% - 32px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm-bulkDialog .sm-nativeDialogBody{padding:12px 16px;display:flex;flex-direction:column;gap:10px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#111)}.sm-bulkDialog .sm-nativeDialogFooter{padding:10px 16px;display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px}.sm-bulkDialog .sm-nativeDialogButton{min-height:28px;padding:3px 14px;font-size:12px;line-height:20px;border:1px solid var(--dsw-alias-border-l2,#ddd);border-radius:8px;cursor:pointer;background:transparent;color:var(--dsw-alias-label-primary,#111);text-align:center}.sm-bulkDialog .sm-nativeDialogConfirm{background:var(--dsw-alias-state-business-primary,#356ae6);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-business-primary,#356ae6)}.sm-bulkDialog .sm-nativeDialogConfirm:hover:not(:disabled){filter:brightness(.94)}.sm-bulkDialog .sm-nativeDialogDanger{background:var(--dsw-alias-state-error-primary,#d92d20);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:var(--dsw-alias-state-error-primary,#d92d20)}.sm-bulkDialog .sm-nativeDialogDanger:hover:not(:disabled){filter:brightness(.92)}.sm-bulkDialog .sm-nativeDialog select.sm-viewSelect{font-size:13px;line-height:20px;height:32px;padding:5px 9px}",
|
|
596
699
|
".sm-bulkDialog .sm-nativeDialog{width:100%;max-height:min(640px,calc(100vh - 32px))}",
|
|
597
700
|
".sm-bulkDialogBody{display:flex;flex-direction:column;gap:12px;min-height:0}",
|
|
598
701
|
".sm-bulkDialogSummary{font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#111)}",
|
|
599
|
-
".sm-bulkDialogWarn{display:flex;align-items:flex-start;gap:8px;color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:18px;background:
|
|
702
|
+
".sm-bulkDialogWarn{display:flex;align-items:flex-start;gap:8px;color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:18px;background:color-mix(in srgb,var(--dsw-alias-state-error-primary,#ec1313) 8%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-state-error-primary,#ec1313) 25%,transparent);border-radius:8px;padding:8px 10px}",
|
|
600
703
|
".sm-bulkSessionList{display:flex;flex-direction:column;gap:4px;max-height:200px;overflow:auto;border:1px solid var(--dsw-alias-border-l2,#eee);border-radius:8px;padding:6px}",
|
|
601
704
|
".sm-bulkSessionItem{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#666);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}",
|
|
602
|
-
".sm-bulkProgressBar{position:relative;height:8px;background:var(--dsw-alias-
|
|
603
|
-
".sm-bulkProgressFill{position:absolute;top:0;left:0;bottom:0;background:var(--dsw-alias-
|
|
705
|
+
".sm-bulkProgressBar{position:relative;height:8px;background:var(--dsw-alias-bg-skeleton,#0000000a);border-radius:4px;overflow:hidden}",
|
|
706
|
+
".sm-bulkProgressFill{position:absolute;top:0;left:0;bottom:0;background:var(--dsw-alias-state-business-primary,#356ae6);transition:width .2s ease}",
|
|
604
707
|
".sm-bulkResultGroup{display:flex;flex-direction:column;gap:6px}",
|
|
605
708
|
".sm-bulkResultHeader{font-size:12px;line-height:18px;font-weight:500;color:var(--dsw-alias-label-secondary,#666)}",
|
|
606
709
|
".sm-bulkResultList{display:flex;flex-direction:column;gap:2px;max-height:160px;overflow:auto;border:1px solid var(--dsw-alias-border-l2,#eee);border-radius:8px;padding:6px}",
|
|
@@ -622,11 +725,13 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
622
725
|
].join("");
|
|
623
726
|
|
|
624
727
|
// Auto-follow DSH's theme. We detect DSH's current theme from
|
|
625
|
-
// body[data-ds-dark-theme] / color-scheme / data-theme / class tokens
|
|
626
|
-
// mirror it onto <html data-sm-theme
|
|
627
|
-
//
|
|
628
|
-
// inline
|
|
629
|
-
//
|
|
728
|
+
// body[data-ds-dark-theme] / color-scheme / data-theme / class tokens and
|
|
729
|
+
// mirror it onto <html data-sm-theme>. The scoped CSS rules above consume
|
|
730
|
+
// that attribute (light/dark fallback surface colour, local alias tokens).
|
|
731
|
+
// Deliberately no inline colour is written onto the dialogs any more:
|
|
732
|
+
// inline `!important` backgrounds/colors used to hard-code white / #1f1f23
|
|
733
|
+
// onto the dialog roots, which overrode any theme — including third-party
|
|
734
|
+
// themes that only publish --dsw-alias-* tokens.
|
|
630
735
|
const SM_THEME_ATTR = "data-sm-theme";
|
|
631
736
|
function smReadDshTheme() {
|
|
632
737
|
try {
|
|
@@ -657,29 +762,10 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
657
762
|
} catch (_) { /* ignore */ }
|
|
658
763
|
return "light";
|
|
659
764
|
}
|
|
660
|
-
function smApplyInlineTheme(theme) {
|
|
661
|
-
try {
|
|
662
|
-
const values = theme === "dark"
|
|
663
|
-
? { background: "#1f1f23", color: "#ececec", border: "#3a3a40" }
|
|
664
|
-
: { background: "#fff", color: "#1f1f1f", border: "#e5e5e5" };
|
|
665
|
-
const roots = document.querySelectorAll(
|
|
666
|
-
".sm-panelDialog," +
|
|
667
|
-
".sm-confirmDialog.sm-nativeDialogLayer .sm-nativeDialog," +
|
|
668
|
-
".sm-migrateDialog.sm-nativeDialogLayer .sm-nativeDialog"
|
|
669
|
-
);
|
|
670
|
-
for (const el of roots) {
|
|
671
|
-
el.style.setProperty("background", values.background, "important");
|
|
672
|
-
el.style.setProperty("background-color", values.background, "important");
|
|
673
|
-
el.style.setProperty("color", values.color, "important");
|
|
674
|
-
el.style.setProperty("border-color", values.border, "important");
|
|
675
|
-
}
|
|
676
|
-
} catch (_) { /* ignore */ }
|
|
677
|
-
}
|
|
678
765
|
function smApplyTheme() {
|
|
679
766
|
try {
|
|
680
767
|
const theme = smReadDshTheme();
|
|
681
768
|
document.documentElement.setAttribute(SM_THEME_ATTR, theme);
|
|
682
|
-
smApplyInlineTheme(theme);
|
|
683
769
|
} catch (_) { /* ignore */ }
|
|
684
770
|
}
|
|
685
771
|
smApplyTheme();
|
|
@@ -693,13 +779,66 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
693
779
|
} catch (_) { /* ignore */ }
|
|
694
780
|
}
|
|
695
781
|
|
|
782
|
+
// "Dialog opacity" preference (Issue #23).
|
|
783
|
+
//
|
|
784
|
+
// Generic, theme-agnostic escape hatch for third-party themes whose
|
|
785
|
+
// dialog surface does not match the plugin's own fill: the user tunes how
|
|
786
|
+
// much of *this plugin's* dialog background is painted, and whatever sits
|
|
787
|
+
// behind it (the theme's own surface) shows through. No theme plugin is
|
|
788
|
+
// detected or named, and no third-party CSS variable is read.
|
|
789
|
+
//
|
|
790
|
+
// The value is stored as a percentage in the plugin's own CSS variable on
|
|
791
|
+
// <html>; the CSS rules above turn it into the alpha channel of the dialog
|
|
792
|
+
// fill only, leaving text, buttons, inputs, borders and hover states
|
|
793
|
+
// opaque.
|
|
794
|
+
const SM_DIALOG_OPACITY = { min: 50, max: 100, step: 5, default: 100 };
|
|
795
|
+
const SM_DIALOG_OPACITY_KEY = "dsh-session-manager-dialog-opacity";
|
|
796
|
+
const SM_DIALOG_OPACITY_VAR = "--sm-dialog-opacity";
|
|
797
|
+
function smNormalizeDialogOpacity(value) {
|
|
798
|
+
const numeric = Number(value);
|
|
799
|
+
if (!Number.isFinite(numeric)) return SM_DIALOG_OPACITY.default;
|
|
800
|
+
const { min, max, step } = SM_DIALOG_OPACITY;
|
|
801
|
+
if (numeric <= min) return min;
|
|
802
|
+
if (numeric >= max) return max;
|
|
803
|
+
const snapped = min + Math.round((numeric - min) / step) * step;
|
|
804
|
+
return Math.min(max, Math.max(min, snapped));
|
|
805
|
+
}
|
|
806
|
+
function smReadDialogOpacity() {
|
|
807
|
+
try {
|
|
808
|
+
if (typeof localStorage !== "undefined") {
|
|
809
|
+
const raw = localStorage.getItem(SM_DIALOG_OPACITY_KEY);
|
|
810
|
+
if (raw !== null && raw !== "") return smNormalizeDialogOpacity(raw);
|
|
811
|
+
}
|
|
812
|
+
} catch (_) { /* storage unavailable: fall back to the default */ }
|
|
813
|
+
return SM_DIALOG_OPACITY.default;
|
|
814
|
+
}
|
|
815
|
+
function applyDialogOpacity(value) {
|
|
816
|
+
const percent = smNormalizeDialogOpacity(value);
|
|
817
|
+
try {
|
|
818
|
+
if (typeof document !== "undefined" && document.documentElement && document.documentElement.style) {
|
|
819
|
+
document.documentElement.style.setProperty(SM_DIALOG_OPACITY_VAR, percent + "%");
|
|
820
|
+
}
|
|
821
|
+
} catch (_) { /* ignore */ }
|
|
822
|
+
return percent;
|
|
823
|
+
}
|
|
824
|
+
applyDialogOpacity(smReadDialogOpacity());
|
|
825
|
+
|
|
696
826
|
const CSS_ID = "dsh-session-manager/session-manager";
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
827
|
+
const SM_CSS_SELECTOR = "style[data-plugin-css=" + JSON.stringify(CSS_ID) + "]";
|
|
828
|
+
if (typeof document !== "undefined" && typeof document.createElement === "function") {
|
|
829
|
+
let styleTag = typeof document.querySelector === "function" ? document.querySelector(SM_CSS_SELECTOR) : null;
|
|
830
|
+
if (!styleTag) {
|
|
831
|
+
styleTag = document.createElement("style");
|
|
832
|
+
styleTag.dataset.plugin = "dsh-session-manager";
|
|
833
|
+
styleTag.dataset.pluginCss = CSS_ID;
|
|
834
|
+
if (document.head && typeof document.head.appendChild === "function") document.head.appendChild(styleTag);
|
|
835
|
+
}
|
|
836
|
+
// Always rewrite the contents. A client-plugin hot reload re-executes the
|
|
837
|
+
// bundle inside the same page but leaves the <style> tag it created
|
|
838
|
+
// earlier in place; skipping the write there would silently keep the
|
|
839
|
+
// previous version's rules while the new JS (e.g. a new setting) is
|
|
840
|
+
// already live -- exactly the "setting present but has no effect" bug.
|
|
841
|
+
styleTag.textContent = css;
|
|
703
842
|
}
|
|
704
843
|
|
|
705
844
|
|
|
@@ -759,13 +898,20 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
759
898
|
el.style.left = "0";
|
|
760
899
|
el.style.width = "100%";
|
|
761
900
|
el.style.height = "100%";
|
|
762
|
-
el.style.zIndex = "
|
|
901
|
+
el.style.zIndex = "1050";
|
|
763
902
|
el.style.overflow = "visible";
|
|
764
903
|
el.style.pointerEvents = "none";
|
|
765
904
|
if (typeof document.body.appendChild === "function") {
|
|
766
905
|
document.body.appendChild(el);
|
|
767
906
|
}
|
|
768
907
|
}
|
|
908
|
+
// Re-assert the z-index on an element created by an earlier version
|
|
909
|
+
// (a client-plugin hot reload re-executes this module in the same page
|
|
910
|
+
// and reuses the existing node, whose inline style would otherwise keep
|
|
911
|
+
// the old value). Must stay below DSH's 1100 floating/tooltip tier and
|
|
912
|
+
// above its 1000 backdrop tier -- see the layering contract in the
|
|
913
|
+
// stylesheet.
|
|
914
|
+
if (el.style && el.style.zIndex !== "1050") el.style.zIndex = "1050";
|
|
769
915
|
overlayRootElement = el;
|
|
770
916
|
}
|
|
771
917
|
try {
|
|
@@ -1638,16 +1784,18 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
1638
1784
|
error ? h("div", { className: "sm-error", role: "alert" }, error) : null
|
|
1639
1785
|
),
|
|
1640
1786
|
h("div", { className: "sm-importGroup" },
|
|
1641
|
-
h("div", { className: "sm-
|
|
1642
|
-
h("
|
|
1643
|
-
h("
|
|
1787
|
+
h("div", { className: "sm-importGroupHeader" },
|
|
1788
|
+
h("span", { className: "sm-importLabel" }, t("marks.import.paste.label")),
|
|
1789
|
+
h("div", { className: "sm-importGroupButtons" },
|
|
1790
|
+
h("button", { type: "button", className: "sm-importBtn", disabled: busy || !importText.trim(), onClick: pasteFromInput }, t("marks.import.paste")),
|
|
1791
|
+
h("button", { type: "button", className: "sm-importBtn", disabled: busy, onClick: copyPrompt }, t("marks.import.copy")))),
|
|
1644
1792
|
h("div", { className: "sm-fieldWithClear" },
|
|
1645
1793
|
h("div", { className: "sm-fieldRow sm-fieldRowNote" },
|
|
1646
1794
|
h("textarea", { className: "sm-noteInput", "aria-label": t("marks.import.paste.aria"), value: importText, placeholder: t("marks.import.paste.placeholder"), disabled: busy, rows: 3, onChange: e => setImportText(e.target.value) }),
|
|
1647
1795
|
importText && !busy ? h("button", { type: "button", className: "sm-fieldClear sm-fieldClearNote", "aria-label": t("marks.import.paste.clear"), title: t("marks.import.paste.clear"), onClick: () => setImportText("") }, String.fromCharCode(10005)) : null))),
|
|
1648
1796
|
importStatus ? h("div", { className: "sm-importStatus", role: "status" }, importStatus) : null,
|
|
1649
1797
|
h("div", { className: "sm-nativeDialogFooter" },
|
|
1650
|
-
h("button", { type: "button", className: "sm-nativeDialogButton", disabled: busy, onClick: cancel }, t("marks.cancel")),
|
|
1798
|
+
h("button", { type: "button", className: "sm-nativeDialogButton sm-nativeDialogCancel", disabled: busy, onClick: cancel }, t("marks.cancel")),
|
|
1651
1799
|
h("button", { type: "button", className: "sm-nativeDialogButton sm-nativeDialogConfirm", disabled: busy || !annotations.loaded || !!annotations.error || latest.revision !== base.revision, onClick: save }, t(busy ? "marks.saving" : "marks.save"))
|
|
1652
1800
|
)
|
|
1653
1801
|
)
|
|
@@ -2026,7 +2174,7 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
2026
2174
|
));
|
|
2027
2175
|
}
|
|
2028
2176
|
|
|
2029
|
-
const CURRENT_VERSION = "0.6.
|
|
2177
|
+
const CURRENT_VERSION = "0.6.3";
|
|
2030
2178
|
|
|
2031
2179
|
function compareSemver(v1, v2) {
|
|
2032
2180
|
if (typeof v1 !== "string" || typeof v2 !== "string") return 0;
|
|
@@ -2124,6 +2272,27 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
2124
2272
|
} catch (_) {}
|
|
2125
2273
|
this._notify();
|
|
2126
2274
|
},
|
|
2275
|
+
// Dialog opacity preference (Issue #23). Reuses the same localStorage
|
|
2276
|
+
// backed preference store as autoCheck / registry instead of adding a
|
|
2277
|
+
// second storage mechanism.
|
|
2278
|
+
DIALOG_OPACITY: SM_DIALOG_OPACITY,
|
|
2279
|
+
DIALOG_OPACITY_KEY: SM_DIALOG_OPACITY_KEY,
|
|
2280
|
+
getDialogOpacity() {
|
|
2281
|
+
return smReadDialogOpacity();
|
|
2282
|
+
},
|
|
2283
|
+
setDialogOpacity(value) {
|
|
2284
|
+
const next = applyDialogOpacity(value);
|
|
2285
|
+
try {
|
|
2286
|
+
if (typeof localStorage !== "undefined") {
|
|
2287
|
+
localStorage.setItem(SM_DIALOG_OPACITY_KEY, String(next));
|
|
2288
|
+
}
|
|
2289
|
+
} catch (_) {}
|
|
2290
|
+
this._notify();
|
|
2291
|
+
return next;
|
|
2292
|
+
},
|
|
2293
|
+
resetDialogOpacity() {
|
|
2294
|
+
return this.setDialogOpacity(SM_DIALOG_OPACITY.default);
|
|
2295
|
+
},
|
|
2127
2296
|
REGISTRY_OPTIONS: {
|
|
2128
2297
|
"registry.npmjs.org": "https://registry.npmjs.org",
|
|
2129
2298
|
"registry.npmmirror.com": "https://registry.npmmirror.com",
|
|
@@ -3043,8 +3212,9 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
3043
3212
|
// Render the panel AND the inner dialog as siblings so React keeps
|
|
3044
3213
|
// both mounted. CSS z-index keeps the right ordering: the inner
|
|
3045
3214
|
// dialog (.sm-confirmDialog / .sm-moveDialog / .sm-migrateDialog)
|
|
3046
|
-
//
|
|
3047
|
-
//
|
|
3215
|
+
// lives in the #dsh-session-manager-overlay-root context (1050) and
|
|
3216
|
+
// therefore sits ON TOP OF the panel (1020, in DSH's own document
|
|
3217
|
+
// context). Clicking inside the panel that the inner dialog
|
|
3048
3218
|
// blocks is not possible because the inner backdrop covers the
|
|
3049
3219
|
// panel area entirely (the inner modal is centered).
|
|
3050
3220
|
const annotationDialog = annotationFor ? h(AnnotationDialog, { key: annotationFor.id, sessionId: annotationFor.id, displayTitle: annotationFor.displayTitle || annotationFor.id, t, anchor: annotationAnchor, onClose: () => { setAnnotationFor(null); setAnnotationAnchor(null); } }) : null;
|
|
@@ -3131,7 +3301,9 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
3131
3301
|
onCancel: () => setBulkPresetDraft(null),
|
|
3132
3302
|
onApply: onBulkPresetApply
|
|
3133
3303
|
}) : null;
|
|
3134
|
-
// Bulk dialogs
|
|
3304
|
+
// Bulk dialogs are portaled into the overlay root like every other
|
|
3305
|
+
// dialog, so their static z-index (10002) only orders them inside that
|
|
3306
|
+
// context; the root's own 1050 keeps them below DSH's 1100 tooltip tier.
|
|
3135
3307
|
return h(React.Fragment, null, panelModal, annotationDialog, moveDialog, deleteDialog, migrateDialog, bulkPreviewDialog, bulkProgressDialog, bulkResultDialog, bulkTagDialog, bulkPriorityDialog, bulkMoveDialog, bulkPresetDialog);
|
|
3136
3308
|
}
|
|
3137
3309
|
|
|
@@ -3782,6 +3954,12 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
3782
3954
|
const onRegistryChange = (e) => {
|
|
3783
3955
|
updateStore.setRegistry(e.target.value);
|
|
3784
3956
|
};
|
|
3957
|
+
// Dialog opacity reads straight from the shared preference store, so
|
|
3958
|
+
// moving the slider updates every plugin dialog immediately.
|
|
3959
|
+
const dialogOpacity = updateStore.getDialogOpacity();
|
|
3960
|
+
const onDialogOpacityChange = (e) => {
|
|
3961
|
+
updateStore.setDialogOpacity(e.target.value);
|
|
3962
|
+
};
|
|
3785
3963
|
|
|
3786
3964
|
return h("div", { className: "sm-settingsCard" },
|
|
3787
3965
|
h("div", { className: "sm-settingsHeader" },
|
|
@@ -3857,7 +4035,34 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
3857
4035
|
}),
|
|
3858
4036
|
h("span", null, t("update.autoCheck.enable"))
|
|
3859
4037
|
)
|
|
3860
|
-
)
|
|
4038
|
+
),
|
|
4039
|
+
h("div", { className: "sm-settingsRow" },
|
|
4040
|
+
h("span", null, t("settings.dialogOpacity")),
|
|
4041
|
+
h("div", { className: "sm-settingsSlider" },
|
|
4042
|
+
h("input", {
|
|
4043
|
+
type: "range",
|
|
4044
|
+
className: "sm-settingsRange",
|
|
4045
|
+
min: updateStore.DIALOG_OPACITY.min,
|
|
4046
|
+
max: updateStore.DIALOG_OPACITY.max,
|
|
4047
|
+
step: updateStore.DIALOG_OPACITY.step,
|
|
4048
|
+
value: dialogOpacity,
|
|
4049
|
+
"aria-label": t("settings.dialogOpacity"),
|
|
4050
|
+
"aria-valuemin": updateStore.DIALOG_OPACITY.min,
|
|
4051
|
+
"aria-valuemax": updateStore.DIALOG_OPACITY.max,
|
|
4052
|
+
"aria-valuenow": dialogOpacity,
|
|
4053
|
+
"aria-valuetext": t("settings.dialogOpacity.value", { value: dialogOpacity }),
|
|
4054
|
+
onChange: onDialogOpacityChange
|
|
4055
|
+
}),
|
|
4056
|
+
h("span", { className: "sm-settingsRangeValue" }, t("settings.dialogOpacity.value", { value: dialogOpacity })),
|
|
4057
|
+
h("button", {
|
|
4058
|
+
type: "button",
|
|
4059
|
+
className: "sm-settingsResetBtn",
|
|
4060
|
+
disabled: dialogOpacity === updateStore.DIALOG_OPACITY.default,
|
|
4061
|
+
onClick: () => updateStore.resetDialogOpacity()
|
|
4062
|
+
}, t("settings.dialogOpacity.reset"))
|
|
4063
|
+
)
|
|
4064
|
+
),
|
|
4065
|
+
h("div", { className: "sm-settingsHint" }, t("settings.dialogOpacity.hint"))
|
|
3861
4066
|
),
|
|
3862
4067
|
h("div", { className: "sm-settingsSection" },
|
|
3863
4068
|
h("div", { className: "sm-settingsSectionTitle" }, t("settings.projectSection")),
|
|
@@ -4106,6 +4311,23 @@ function nextDialogZ() { return ++dialogZStackCounter; }
|
|
|
4106
4311
|
} catch (_) {}
|
|
4107
4312
|
};
|
|
4108
4313
|
}, "session-manager: auto update check");
|
|
4314
|
+
|
|
4315
|
+
// Keep <html data-sm-theme> in step with DSH through the official theme
|
|
4316
|
+
// event. ui-layout's ThemePresenter subscribes to the same event and
|
|
4317
|
+
// writes documentElement.colorScheme plus body[data-ds-dark-theme], so
|
|
4318
|
+
// this is the authoritative change signal; the DOM observer above still
|
|
4319
|
+
// covers plain attribute flips, and a theme whose tokens change without
|
|
4320
|
+
// touching an observed attribute would otherwise leave the mirror stale.
|
|
4321
|
+
// The mirror only feeds two cosmetic branches (the token-less opacity
|
|
4322
|
+
// fallback and the priority colours) -- native UA chrome is DSH's job.
|
|
4323
|
+
try {
|
|
4324
|
+
if (typeof ctx.on === "function") {
|
|
4325
|
+
ctx.effect(() => {
|
|
4326
|
+
const off = ctx.on("theme/change", () => smApplyTheme());
|
|
4327
|
+
return () => { try { if (typeof off === "function") off(); } catch (_) {} };
|
|
4328
|
+
}, "session-manager: theme mirror");
|
|
4329
|
+
}
|
|
4330
|
+
} catch (_) { /* theme service absent: the DOM observer is enough */ }
|
|
4109
4331
|
}
|
|
4110
4332
|
|
|
4111
4333
|
const inject = ["slots", "sessions", "workspaces", "locale", "uiWorkspace"];
|
package/lib/index.js
CHANGED
|
@@ -1241,7 +1241,7 @@ ${rest}`, "utf8");
|
|
|
1241
1241
|
return send(res, 200, { ok: true, result });
|
|
1242
1242
|
}
|
|
1243
1243
|
if (req.method === "GET" && path === "/update/check") {
|
|
1244
|
-
const currentVersion = adapter.pluginVersion() || "0.6.
|
|
1244
|
+
const currentVersion = adapter.pluginVersion() || "0.6.3";
|
|
1245
1245
|
let latestVersion = currentVersion;
|
|
1246
1246
|
let hasUpdate = false;
|
|
1247
1247
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-session-manager",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "DeepSeek Harness session manager: delete, archive, move across workspaces, migrate presets, favorites, review-later, search, filter, sort, priority, tags, notes, and batch actions. | DSH 会话管理:删除、归档、跨工作区移动、预设迁移、收藏、待回看、搜索、筛选、排序、优先级、标签、备注及批量操作。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
}
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"cordis": ">=4.0.0-rc <5"
|
|
59
|
+
"@deepseek-ai/cordis": ">=4.0.0-rc <5"
|
|
60
60
|
},
|
|
61
61
|
"engines": {
|
|
62
62
|
"node": "^22.15.0 || >=24.0.0"
|
package/README.local-workflow.md
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# AI Dev Workflow Template
|
|
2
|
-
|
|
3
|
-
核心关系:
|
|
4
|
-
```text
|
|
5
|
-
AGENTS.md = Agent 统一入口
|
|
6
|
-
.ai/ = 工作流和项目知识的唯一事实来源
|
|
7
|
-
.codex/ = 由脚本从 .ai/skills 生成的 Codex Skill 转发层(不要手改)
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
## 新项目第一次使用
|
|
11
|
-
复制到项目根目录后,先让 AI 初始化:
|
|
12
|
-
- `.ai/architecture.md`
|
|
13
|
-
- `.ai/safety.md`
|
|
14
|
-
- `.ai/project-commands.md`
|
|
15
|
-
|
|
16
|
-
推荐启动指令:
|
|
17
|
-
```text
|
|
18
|
-
先不要开始开发。
|
|
19
|
-
请读取 AGENTS.md 和当前项目,帮我初始化 .ai 下的项目知识和验证规则。
|
|
20
|
-
重点完善:
|
|
21
|
-
- .ai/architecture.md
|
|
22
|
-
- .ai/safety.md
|
|
23
|
-
- .ai/project-commands.md
|
|
24
|
-
只写能够从当前项目确认的事实;不确定的地方标记“待确认”,不要猜。
|
|
25
|
-
填写完成后把每个文件头部的「最后核对日期」改成今天。
|
|
26
|
-
暂时不要修改业务代码。
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
## 常用 Skill
|
|
31
|
-
- requirements-grill
|
|
32
|
-
- regression-fix
|
|
33
|
-
- code-review
|
|
34
|
-
- high-risk-review
|
|
35
|
-
- release-check
|
|
36
|
-
|
|
37
|
-
## 维护 Skill
|
|
38
|
-
只改 `.ai/skills/<name>/SKILL.md`,然后重新生成转发层(PowerShell 7):
|
|
39
|
-
```powershell
|
|
40
|
-
.\sync-codex-skills.ps1 # 生成 / 更新 .codex/skills,删除已不存在的 skill
|
|
41
|
-
.\sync-codex-skills.ps1 -Check # 只比对不写入,有漂移则报错
|
|
42
|
-
```
|
|
43
|
-
生成文件带日期标记;内容未变时不会重写,可重复运行。
|
|
44
|
-
|
|
45
|
-
## 本地忽略(仅 Git 仓库需要)
|
|
46
|
-
PowerShell 7,在主仓库根目录运行:
|
|
47
|
-
```powershell
|
|
48
|
-
.\setup-local-workflow.ps1
|
|
49
|
-
```
|
|
50
|
-
脚本会校验 `.git` 是真实的仓库根目录(不是 worktree / submodule 的 `.git` 文件),写入 `.git/info/exclude`,然后自动执行一次 `sync-codex-skills.ps1`。非 Git 仓库不需要运行;运行了会直接报错退出,不会写任何东西。
|
|
51
|
-
|
|
52
|
-
然后运行 `git status` 确认本地 AI 文件未进入待提交列表。
|