@linxin666/dsh-client-ui-skin-center 0.3.21 → 0.3.23

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.
@@ -70,6 +70,12 @@ family / 插件区域:
70
70
  | `column` | task-board | 状态列;`section[data-status]` |
71
71
  | `card` | task-board | 任务卡;列内 `[data-status]` 条目 |
72
72
  | `detail` | task-board | 任务详情面板 |
73
+ | `tag-filter` | task-board | 标签筛选条;`[data-dsh-taskboard-board] [data-dsh-part="tag-filter"]` |
74
+ | `tag-chip` | task-board | 筛选条内的标签胶囊;`[data-dsh-part="tag-chip"]`,`data-tag-tone` 为 0-5 调色板槽 |
75
+ | `tag-badge` | task-board | 卡片上的标签徽章;`[data-dsh-part="tag-badge"]`,`data-tag-tone` 同上 |
76
+ | `project-filter` | task-board | 项目分区下拉;`[data-dsh-part="project-filter"]`,筛选项为工作区 id,空值为「全部项目」 |
77
+ | `project-dialog` | task-board | 看板内新建项目表单;`[data-dsh-part="project-dialog"]`,含一个绝对路径输入与创建/取消按钮 |
78
+ | `ai-parse` | task-board | 新建任务弹窗内的「粘贴内容 → AI 解析」区块;`[data-dsh-part="ai-parse"]`,含文本框、模型下拉与解析按钮 |
73
79
  | `tab-bar` / `tab` | ssh | 页签条/页签;`[role="tablist"]` / `[role="tab"]` |
74
80
  | `host-table` / `host-row` | ssh | 主机表/行;`[data-dsh-ssh-view]` 内 table/tr |
75
81
  | `terminal` | ssh | xterm 终端;面板内 termContainer(.xterm 辅锚) |
package/lib/client.js CHANGED
@@ -2347,11 +2347,13 @@ window.__ModuleLoader__.load({
2347
2347
  const blurContent = (0, react.useSyncExternalStore)(background.subscribe, background.blurContent);
2348
2348
  const inputCardBlur = (0, react.useSyncExternalStore)(background.subscribe, background.inputCardBlur);
2349
2349
  const bubbleOpacity = (0, react.useSyncExternalStore)(background.subscribe, background.bubbleOpacity);
2350
+ const bubbleBlur = (0, react.useSyncExternalStore)(background.subscribe, background.bubbleBlur);
2350
2351
  const [shownOpacity, setShownOpacity] = useLiveValue(opacity);
2351
2352
  const [shownBlurEmpty, setShownBlurEmpty] = useLiveValue(blurEmpty);
2352
2353
  const [shownBlurContent, setShownBlurContent] = useLiveValue(blurContent);
2353
2354
  const [shownInputCardBlur, setShownInputCardBlur] = useLiveValue(inputCardBlur);
2354
2355
  const [shownBubbleOpacity, setShownBubbleOpacity] = useLiveValue(bubbleOpacity);
2356
+ const [shownBubbleBlur, setShownBubbleBlur] = useLiveValue(bubbleBlur);
2355
2357
  const catalog = (0, react.useSyncExternalStore)(runtime.subscribe, runtime.catalog);
2356
2358
  const state = (0, react.useSyncExternalStore)(runtime.subscribe, runtime.controller.getState);
2357
2359
  const customThemeState = (0, react.useSyncExternalStore)(customTheme.subscribe, customTheme.getState);
@@ -2843,6 +2845,40 @@ window.__ModuleLoader__.load({
2843
2845
  })
2844
2846
  ]
2845
2847
  }),
2848
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2849
+ className: skin_center_module_css_default.backgroundRow,
2850
+ children: [
2851
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2852
+ className: skin_center_module_css_default.backgroundHead,
2853
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2854
+ className: skin_center_module_css_default.backgroundLabel,
2855
+ children: t("bubbleBlur")
2856
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2857
+ className: skin_center_module_css_default.backgroundValue,
2858
+ "aria-hidden": "true",
2859
+ children: [shownBubbleBlur, "px"]
2860
+ })]
2861
+ }),
2862
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SliderControl, {
2863
+ id: "skin-center-bubble-blur",
2864
+ className: skin_center_module_css_default.backgroundRange,
2865
+ min: 0,
2866
+ max: 20,
2867
+ step: 1,
2868
+ value: bubbleBlur,
2869
+ ariaValuetext: shownBubbleBlur + "px",
2870
+ ariaLabel: t("bubbleBlur"),
2871
+ onChanging: setShownBubbleBlur,
2872
+ onChange: (value) => {
2873
+ background.setBubbleBlur(value);
2874
+ }
2875
+ }),
2876
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
2877
+ className: skin_center_module_css_default.backgroundHint,
2878
+ children: t("bubbleBlurHint")
2879
+ })
2880
+ ]
2881
+ }),
2846
2882
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WallpaperPanel, {
2847
2883
  t,
2848
2884
  wallpaper
@@ -3000,7 +3036,8 @@ window.__ModuleLoader__.load({
3000
3036
  backgroundBlurEmpty: 0,
3001
3037
  backgroundBlurContent: 0,
3002
3038
  inputCardBlur: 10,
3003
- bubbleOpacity: 50
3039
+ bubbleOpacity: 50,
3040
+ bubbleBlur: 10
3004
3041
  };
3005
3042
  /** The fields normalize/sanitize know about; unknown keys are dropped. */
3006
3043
  const SKIN_BACKGROUND_FIELDS = Object.keys(SKIN_BACKGROUND_DEFAULTS);
@@ -3012,7 +3049,8 @@ window.__ModuleLoader__.load({
3012
3049
  backgroundBlurEmpty: [0, 20],
3013
3050
  backgroundBlurContent: [0, 20],
3014
3051
  inputCardBlur: [0, 20],
3015
- bubbleOpacity: [0, 100]
3052
+ bubbleOpacity: [0, 100],
3053
+ bubbleBlur: [0, 20]
3016
3054
  };
3017
3055
  function isRecord$1(value) {
3018
3056
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -3080,10 +3118,13 @@ window.__ModuleLoader__.load({
3080
3118
  const SCRIM_VAR = "--dsw-skin-scrim";
3081
3119
  /** CSS custom property consumed by skins that expose translucent bubbles. */
3082
3120
  const BUBBLE_ALPHA_VAR = "--dsh-skin-bubble-alpha";
3121
+ /** CSS custom property consumed by skins that expose a bubble backdrop blur. */
3122
+ const BUBBLE_BLUR_VAR = "--dsh-skin-bubble-blur";
3083
3123
  /** CSS custom property consumed by the shared composer neutralizer. */
3084
3124
  const INPUT_CARD_BLUR_VAR = "--dsh-input-card-blur";
3085
3125
  SKIN_BACKGROUND_DEFAULTS.backgroundOpacity;
3086
3126
  SKIN_BACKGROUND_DEFAULTS.bubbleOpacity;
3127
+ SKIN_BACKGROUND_DEFAULTS.bubbleBlur;
3087
3128
  SKIN_BACKGROUND_DEFAULTS.backgroundBlurEmpty;
3088
3129
  /**
3089
3130
  * Selector for a conversation message row inside the shell's center column.
@@ -3111,6 +3152,7 @@ window.__ModuleLoader__.load({
3111
3152
  blurContentValue = SKIN_BACKGROUND_DEFAULTS.backgroundBlurContent;
3112
3153
  inputCardBlurValue = SKIN_BACKGROUND_DEFAULTS.inputCardBlur;
3113
3154
  bubbleOpacityValue = SKIN_BACKGROUND_DEFAULTS.bubbleOpacity;
3155
+ bubbleBlurValue = SKIN_BACKGROUND_DEFAULTS.bubbleBlur;
3114
3156
  listeners = /* @__PURE__ */ new Set();
3115
3157
  persist;
3116
3158
  /** The fixed backdrop-filter element, present only while active blur > 0. */
@@ -3132,6 +3174,7 @@ window.__ModuleLoader__.load({
3132
3174
  this.applyOcclusion();
3133
3175
  this.applyInputCardBlur();
3134
3176
  this.applyBubbleOpacity();
3177
+ this.applyBubbleBlur();
3135
3178
  this.syncBlur();
3136
3179
  }
3137
3180
  /**
@@ -3146,6 +3189,7 @@ window.__ModuleLoader__.load({
3146
3189
  this.applyOcclusion();
3147
3190
  this.applyInputCardBlur();
3148
3191
  this.applyBubbleOpacity();
3192
+ this.applyBubbleBlur();
3149
3193
  this.syncBlur();
3150
3194
  this.publish();
3151
3195
  }
@@ -3157,7 +3201,8 @@ window.__ModuleLoader__.load({
3157
3201
  backgroundBlurEmpty: this.blurEmptyValue,
3158
3202
  backgroundBlurContent: this.blurContentValue,
3159
3203
  inputCardBlur: this.inputCardBlurValue,
3160
- bubbleOpacity: this.bubbleOpacityValue
3204
+ bubbleOpacity: this.bubbleOpacityValue,
3205
+ bubbleBlur: this.bubbleBlurValue
3161
3206
  };
3162
3207
  }
3163
3208
  enabled = () => this.enabledValue;
@@ -3166,6 +3211,7 @@ window.__ModuleLoader__.load({
3166
3211
  this.applyOcclusion();
3167
3212
  this.applyInputCardBlur();
3168
3213
  this.applyBubbleOpacity();
3214
+ this.applyBubbleBlur();
3169
3215
  this.syncBlur();
3170
3216
  this.publish();
3171
3217
  this.persist(this.snapshot());
@@ -3175,6 +3221,7 @@ window.__ModuleLoader__.load({
3175
3221
  blurContent = () => this.blurContentValue;
3176
3222
  inputCardBlur = () => this.inputCardBlurValue;
3177
3223
  bubbleOpacity = () => this.bubbleOpacityValue;
3224
+ bubbleBlur = () => this.bubbleBlurValue;
3178
3225
  subscribe = (listener) => {
3179
3226
  this.listeners.add(listener);
3180
3227
  return () => {
@@ -3213,6 +3260,12 @@ window.__ModuleLoader__.load({
3213
3260
  this.publish();
3214
3261
  this.persist(this.snapshot());
3215
3262
  }
3263
+ setBubbleBlur(value) {
3264
+ this.bubbleBlurValue = this.clampBlur(value);
3265
+ this.applyBubbleBlur();
3266
+ this.publish();
3267
+ this.persist(this.snapshot());
3268
+ }
3216
3269
  dispose() {
3217
3270
  this.disposed = true;
3218
3271
  if (this.rafId !== null) {
@@ -3222,6 +3275,7 @@ window.__ModuleLoader__.load({
3222
3275
  this.removeBlurElement();
3223
3276
  document.body.style.removeProperty(INPUT_CARD_BLUR_VAR);
3224
3277
  document.body.style.removeProperty(BUBBLE_ALPHA_VAR);
3278
+ document.body.style.removeProperty(BUBBLE_BLUR_VAR);
3225
3279
  if (this.observer !== null) {
3226
3280
  this.observer.disconnect();
3227
3281
  this.observer = null;
@@ -3236,6 +3290,7 @@ window.__ModuleLoader__.load({
3236
3290
  this.blurContentValue = resolved.backgroundBlurContent;
3237
3291
  this.inputCardBlurValue = resolved.inputCardBlur;
3238
3292
  this.bubbleOpacityValue = resolved.bubbleOpacity;
3293
+ this.bubbleBlurValue = resolved.bubbleBlur;
3239
3294
  }
3240
3295
  clampBlur(value) {
3241
3296
  return Math.max(0, Math.min(20, Math.round(value)));
@@ -3257,6 +3312,13 @@ window.__ModuleLoader__.load({
3257
3312
  }
3258
3313
  document.body.style.setProperty(BUBBLE_ALPHA_VAR, String(this.bubbleOpacityValue / 100));
3259
3314
  }
3315
+ applyBubbleBlur() {
3316
+ if (!this.enabledValue) {
3317
+ document.body.style.removeProperty(BUBBLE_BLUR_VAR);
3318
+ return;
3319
+ }
3320
+ document.body.style.setProperty(BUBBLE_BLUR_VAR, this.bubbleBlurValue + "px");
3321
+ }
3260
3322
  /** Write the current occlusion onto the body CSS variable (0..1 alpha). */
3261
3323
  applyOcclusion() {
3262
3324
  if (!this.enabledValue) {
@@ -3489,6 +3551,8 @@ window.__ModuleLoader__.load({
3489
3551
  inputCardBlurHint: "Blurs only the area behind the input card while backdrop art is visible; it does not blur the entire wallpaper.",
3490
3552
  bubbleOpacity: "Bubble opacity",
3491
3553
  bubbleOpacityHint: "Controls translucent message bubbles for skins that expose bubble alpha, such as Whale Mom.",
3554
+ bubbleBlur: "Bubble blur",
3555
+ bubbleBlurHint: "Blurs the backdrop behind translucent message bubbles; independent of bubble opacity, 0 disables.",
3492
3556
  backgroundBlurHint: "Applies a separate Gaussian blur to the backdrop for the empty conversation and the conversation with content; 0 disables.",
3493
3557
  backgroundBlurInert: "Visible only with skins that paint a backdrop; the official default has none.",
3494
3558
  backgroundHint: "Instantly veils the backdrop behind the panels — higher values obscure the art to help you focus.",
@@ -3609,6 +3673,8 @@ window.__ModuleLoader__.load({
3609
3673
  inputCardBlurHint: "仅模糊输入卡背后的区域,不会让整张壁纸变糊。",
3610
3674
  bubbleOpacity: "气泡不透明度",
3611
3675
  bubbleOpacityHint: "调节支持气泡 alpha 的皮肤消息气泡,例如鲸鱼妈妈。",
3676
+ bubbleBlur: "气泡模糊程度",
3677
+ bubbleBlurHint: "模糊半透明消息气泡背后的区域,与「气泡不透明度」相互独立,0 为关闭。",
3612
3678
  backgroundBlurHint: "对话为空与有内容时分别应用不同的背景高斯模糊强度,0 为关闭。",
3613
3679
  backgroundBlurInert: "仅对带背景图插画的皮肤可见;官方默认无背景图。",
3614
3680
  backgroundHint: "即时为面板背后的背景加遮罩——数值越高越能弱化插画,帮你集中注意力。",
@@ -4059,6 +4125,22 @@ window.__ModuleLoader__.load({
4059
4125
  backdrop-filter: none !important;
4060
4126
  -webkit-backdrop-filter: none !important;
4061
4127
  }
4128
+ ${scoped("[data-phase=\"active\"] [data-slot=\"conversation.input.dock\"] > [data-queue-dock]")} {
4129
+ /* The native queue dock stacks two boxes inside the input dock: a root
4130
+ wrapper that only supplies the shared dock inset, and the panel inside
4131
+ it that paints its own --dsw-specific-tip fill. Painting the wrapper as
4132
+ an accessory adds a second opaque plate one dock inset (8px) wider than
4133
+ the panel on each side, which reads as an extra sheet of paper under
4134
+ the queue (issue #1572). Reset the accessory surface so the panel stays
4135
+ the single layer; the wrapper keeps its inset, so the panel remains
4136
+ aligned with the composer card. */
4137
+ background: transparent !important;
4138
+ border: 0 !important;
4139
+ border-radius: 0 !important;
4140
+ box-shadow: none !important;
4141
+ backdrop-filter: none !important;
4142
+ -webkit-backdrop-filter: none !important;
4143
+ }
4062
4144
  ${scoped("[data-conversation-scroll]")},
4063
4145
  ${scoped("[data-dsh-part=\"scrollport\"]")} {
4064
4146
  /* The composer is the scrollport's final in-flow child. Reserving physical
@@ -5075,7 +5157,7 @@ window.__ModuleLoader__.load({
5075
5157
  /** The building package's version, when the bundle carries it. */
5076
5158
  function bakedVersion() {
5077
5159
  try {
5078
- return "0.3.21";
5160
+ return "0.3.23";
5079
5161
  } catch {
5080
5162
  return;
5081
5163
  }
@@ -5288,12 +5370,14 @@ window.__ModuleLoader__.load({
5288
5370
  blurContent: () => background.blurContent(),
5289
5371
  inputCardBlur: () => background.inputCardBlur(),
5290
5372
  bubbleOpacity: () => background.bubbleOpacity(),
5373
+ bubbleBlur: () => background.bubbleBlur(),
5291
5374
  subscribe: (listener) => background.subscribe(listener),
5292
5375
  set: (opacity) => background.set(opacity),
5293
5376
  setBlurEmpty: (value) => background.setBlurEmpty(value),
5294
5377
  setBlurContent: (value) => background.setBlurContent(value),
5295
5378
  setInputCardBlur: (value) => background.setInputCardBlur(value),
5296
5379
  setBubbleOpacity: (value) => background.setBubbleOpacity(value),
5380
+ setBubbleBlur: (value) => background.setBubbleBlur(value),
5297
5381
  dispose: () => background.dispose()
5298
5382
  },
5299
5383
  wallpaper: {