@dsh-plus/image-studio 0.1.1 → 0.1.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/lib/client.js CHANGED
@@ -1718,19 +1718,17 @@ ${extra}
1718
1718
  });
1719
1719
  };
1720
1720
  const paramRows = Object.entries(item.params);
1721
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1722
- className: "ims-detailBackdrop",
1723
- role: "presentation",
1724
- onClick: onClose,
1721
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
1722
+ open: true,
1723
+ onClose,
1724
+ title: item.prompt.slice(0, 40),
1725
+ headless: true,
1726
+ className: "ims-detailModal",
1725
1727
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1726
- className: "ims-detail",
1727
- role: "dialog",
1728
- "aria-modal": "true",
1729
- "aria-label": item.prompt.slice(0, 40),
1730
- onClick: (event) => event.stopPropagation(),
1728
+ className: "ims-sub",
1731
1729
  children: [
1732
1730
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1733
- className: "ims-detailHead",
1731
+ className: "ims-subHead",
1734
1732
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1735
1733
  className: "ims-detailMeta",
1736
1734
  children: [
@@ -1823,7 +1821,7 @@ ${extra}
1823
1821
  })]
1824
1822
  }),
1825
1823
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1826
- className: "ims-detailFoot",
1824
+ className: "ims-subFoot",
1827
1825
  children: [
1828
1826
  error !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1829
1827
  className: "ims-status ims-statusError",
@@ -2189,21 +2187,19 @@ ${extra}
2189
2187
  }
2190
2188
  setSelected((current) => current.includes(imageId) ? [] : [imageId]);
2191
2189
  };
2192
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2193
- className: "ims-pickerBackdrop",
2194
- role: "presentation",
2195
- onClick: onClose,
2190
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
2191
+ open: true,
2192
+ onClose,
2193
+ title,
2194
+ headless: true,
2195
+ className: "ims-pickerModal",
2196
2196
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2197
- className: "ims-picker",
2198
- role: "dialog",
2199
- "aria-modal": "true",
2200
- "aria-label": title,
2201
- onClick: (event) => event.stopPropagation(),
2197
+ className: "ims-sub",
2202
2198
  children: [
2203
2199
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2204
- className: "ims-pickerHead",
2200
+ className: "ims-subHead",
2205
2201
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
2206
- className: "ims-pickerTitle",
2202
+ className: "ims-subTitle",
2207
2203
  children: title
2208
2204
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2209
2205
  type: "button",
@@ -2240,7 +2236,7 @@ ${extra}
2240
2236
  })
2241
2237
  }),
2242
2238
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2243
- className: "ims-pickerFoot",
2239
+ className: "ims-subFoot",
2244
2240
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2245
2241
  type: "button",
2246
2242
  className: "ims-btn ims-btnPrimary",
@@ -2829,6 +2825,15 @@ ${extra}
2829
2825
  }
2830
2826
  //#endregion
2831
2827
  //#region src/client/panel/panel.tsx
2828
+ /**
2829
+ * 图像工作室面板根组件:侧栏 footer 入口打开的 overlay 工作台。
2830
+ * 三个标签(文生图/图生图/画廊)+ 底部任务条;两个生图表单常驻挂载
2831
+ * (hidden 切换,保留各自表单态)。数据归口:providers 一次性加载,
2832
+ * presets/gallery/tasks 面板打开时加载,任务 2s 轮询并侦测成功转移
2833
+ * 自动刷画廊。
2834
+ * 响应式:桌面居中模态(≤1100px),≤767px 全屏抽屉(见 styles.ts)。
2835
+ * @module image-studio/client/panel/panel
2836
+ */
2832
2837
  const EMPTY_PRESETS = {
2833
2838
  promptPresets: [],
2834
2839
  paramPresets: [],
@@ -2887,7 +2892,6 @@ ${extra}
2887
2892
  reloadGallery,
2888
2893
  reloadTasks
2889
2894
  ]);
2890
- if (!open) return null;
2891
2895
  const catalog = providers?.params ?? [];
2892
2896
  const protocols = providers?.protocols ?? [];
2893
2897
  const tabs = [
@@ -2907,16 +2911,14 @@ ${extra}
2907
2911
  icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconImage, { size: 15 })
2908
2912
  }
2909
2913
  ];
2910
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2911
- className: "ims-backdrop",
2912
- role: "presentation",
2913
- onClick: () => studio.setOpen(false),
2914
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
2915
+ open,
2916
+ onClose: () => studio.setOpen(false),
2917
+ title: t("panel.title"),
2918
+ headless: true,
2919
+ className: "ims-modal",
2914
2920
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2915
2921
  className: "ims-panel",
2916
- role: "dialog",
2917
- "aria-modal": "true",
2918
- "aria-label": t("panel.title"),
2919
- onClick: (event) => event.stopPropagation(),
2920
2922
  children: [
2921
2923
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
2922
2924
  className: "ims-head",
@@ -3007,10 +3009,11 @@ ${extra}
3007
3009
  //#endregion
3008
3010
  //#region src/client/styles.ts
3009
3011
  /**
3010
- * 图像工作室前端样式:侧栏入口 + overlay 工作台 + 配置卡片附加件。
3011
- * 全部颜色引用 --dsw-* 设计令牌(跟随原生深浅色主题);响应式断点 767px
3012
- * 与 @dsh-plus/ui-mobile-fit 对齐(移动端面板全屏、生图表单单列、画廊两列)。
3013
- * 注入沿用 <style data-plugin data-plugin-css> 约定(HMR 可卸载)。
3012
+ * 图像工作室前端样式:侧栏入口 + 工作台(官方 Modal 承载)+ 配置卡片附加件。
3013
+ * 设计令牌仅用 dsh-client-ui-theme 实测存在的 --dsw-alias-*(深浅色自适应);
3014
+ * 模态骨架(遮罩/Escape/portal 层叠)由官方 Modal 原语承载,本表只覆写尺寸
3015
+ * 与内部布局(.ims-modal 等,模式同 web-files/web-terminal 的 wf-/wt-modal)。
3016
+ * 响应式断点 767px 与 @dsh-plus/ui-mobile-fit 对齐(移动端全屏、单列、44px 热区)。
3014
3017
  * @module image-studio/client/styles
3015
3018
  */
3016
3019
  const PKG = "@dsh-plus/image-studio";
@@ -3031,14 +3034,14 @@ ${extra}
3031
3034
  border: none;
3032
3035
  border-radius: 12px;
3033
3036
  background: transparent;
3034
- color: var(--dsw-alias-label-primary, #1f2328);
3037
+ color: var(--dsw-alias-label-primary);
3035
3038
  font-family: inherit;
3036
3039
  font-size: 14px;
3037
3040
  line-height: 22px;
3038
3041
  cursor: pointer;
3039
3042
  overflow: hidden;
3040
3043
  }
3041
- .ims-entry:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(0,0,0,.06)); }
3044
+ .ims-entry:hover { background: var(--dsw-alias-interactive-bg-hover); }
3042
3045
  .ims-entry-rail {
3043
3046
  flex: none;
3044
3047
  width: 36px;
@@ -3051,26 +3054,26 @@ ${extra}
3051
3054
  }
3052
3055
  .ims-entry-label { white-space: nowrap; overflow: hidden; }
3053
3056
 
3054
- /* ── 面板骨架 ── */
3055
- .ims-backdrop {
3056
- position: fixed;
3057
- inset: 0;
3058
- z-index: 60;
3057
+ /* ── 工作台模态尺寸覆写(官方 Modal headless 卡片)── */
3058
+ .ims-modal {
3059
+ width: min(1100px, 94vw) !important;
3060
+ max-width: none !important;
3061
+ height: min(780px, 88vh);
3062
+ padding: 0 !important;
3063
+ gap: 0 !important;
3059
3064
  display: flex;
3060
- align-items: center;
3061
- justify-content: center;
3062
- background: var(--dsw-alias-overlay-bg, rgba(0,0,0,.4));
3065
+ flex-direction: column;
3066
+ overflow: hidden;
3063
3067
  }
3068
+
3069
+ /* ── 面板骨架 ── */
3064
3070
  .ims-panel {
3065
3071
  display: flex;
3066
3072
  flex-direction: column;
3067
- width: min(1100px, 94vw);
3068
- height: min(780px, 88vh);
3069
- border-radius: 16px;
3070
- background: var(--dsw-alias-bg-primary, #fff);
3071
- color: var(--dsw-alias-label-primary, #1f2328);
3072
- box-shadow: 0 16px 48px rgba(0,0,0,.24);
3073
- overflow: hidden;
3073
+ height: 100%;
3074
+ min-height: 0;
3075
+ position: relative;
3076
+ color: var(--dsw-alias-label-primary);
3074
3077
  }
3075
3078
  .ims-head {
3076
3079
  display: flex;
@@ -3078,7 +3081,7 @@ ${extra}
3078
3081
  align-items: center;
3079
3082
  gap: 8px;
3080
3083
  padding: 10px 12px;
3081
- border-bottom: .5px solid var(--dsw-alias-border-l3, rgba(0,0,0,.08));
3084
+ border-bottom: 1px solid var(--dsw-alias-border-l3);
3082
3085
  }
3083
3086
  .ims-tabs { display: flex; flex: 1; gap: 4px; min-width: 0; }
3084
3087
  .ims-tab {
@@ -3090,16 +3093,16 @@ ${extra}
3090
3093
  border: none;
3091
3094
  border-radius: 10px;
3092
3095
  background: transparent;
3093
- color: var(--dsw-alias-label-secondary, #57606a);
3096
+ color: var(--dsw-alias-label-secondary);
3094
3097
  font-family: inherit;
3095
3098
  font-size: 14px;
3096
3099
  cursor: pointer;
3097
3100
  white-space: nowrap;
3098
3101
  }
3099
- .ims-tab:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(0,0,0,.06)); }
3102
+ .ims-tab:hover { background: var(--dsw-alias-interactive-bg-hover); }
3100
3103
  .ims-tabActive {
3101
- background: var(--dsw-alias-button-elevated-fill, rgba(0,0,0,.06));
3102
- color: var(--dsw-alias-label-primary, #1f2328);
3104
+ background: var(--dsw-alias-button-elevated-fill);
3105
+ color: var(--dsw-alias-label-primary);
3103
3106
  font-weight: 500;
3104
3107
  }
3105
3108
  .ims-iconBtn {
@@ -3112,10 +3115,10 @@ ${extra}
3112
3115
  border: none;
3113
3116
  border-radius: 8px;
3114
3117
  background: transparent;
3115
- color: var(--dsw-alias-label-primary, #1f2328);
3118
+ color: var(--dsw-alias-label-primary);
3116
3119
  cursor: pointer;
3117
3120
  }
3118
- .ims-iconBtn:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(0,0,0,.06)); }
3121
+ .ims-iconBtn:hover { background: var(--dsw-alias-interactive-bg-hover); }
3119
3122
  .ims-body { flex: 1; min-height: 0; overflow-y: auto; }
3120
3123
 
3121
3124
  /* ── 通用件 ── */
@@ -3124,15 +3127,15 @@ ${extra}
3124
3127
  width: 100%;
3125
3128
  min-height: 34px;
3126
3129
  padding: 6px 10px;
3127
- border: .5px solid var(--dsw-alias-border-l2, rgba(0,0,0,.16));
3130
+ border: 1px solid var(--dsw-alias-border-l2);
3128
3131
  border-radius: 8px;
3129
- background: var(--dsw-alias-bg-primary, #fff);
3130
- color: var(--dsw-alias-label-primary, #1f2328);
3132
+ background: var(--dsw-alias-bg-layer-3);
3133
+ color: var(--dsw-alias-label-primary);
3131
3134
  font-family: inherit;
3132
3135
  font-size: 13px;
3133
3136
  line-height: 20px;
3134
3137
  }
3135
- .ims-input:focus { outline: 2px solid var(--dsw-alias-focus-ring, #4d9fff); outline-offset: 0; }
3138
+ .ims-input:focus { outline: 2px solid var(--dsw-alias-brand-primary); outline-offset: 0; }
3136
3139
  .ims-btn {
3137
3140
  display: inline-flex;
3138
3141
  align-items: center;
@@ -3150,23 +3153,24 @@ ${extra}
3150
3153
  }
3151
3154
  .ims-btn:disabled { opacity: .5; cursor: not-allowed; }
3152
3155
  .ims-btnPrimary {
3153
- background: var(--dsw-alias-button-primary-fill, #1f2328);
3154
- color: var(--dsw-alias-button-primary-label, #fff);
3156
+ background: var(--dsw-alias-button-primary-fill);
3157
+ color: var(--dsw-alias-label-primary-inverted);
3155
3158
  }
3159
+ .ims-btnPrimary:hover:not(:disabled) { background: var(--dsw-alias-button-primary-hover); }
3156
3160
  .ims-btnGhost {
3157
3161
  background: transparent;
3158
- color: var(--dsw-alias-label-primary, #1f2328);
3159
- border: .5px solid var(--dsw-alias-border-l2, rgba(0,0,0,.16));
3162
+ color: var(--dsw-alias-label-primary);
3163
+ border: 1px solid var(--dsw-alias-border-l2);
3160
3164
  }
3161
- .ims-btnGhost:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover, rgba(0,0,0,.06)); }
3162
- .ims-btnDanger { background: var(--dsw-alias-status-error, #d1242f); color: #fff; }
3165
+ .ims-btnGhost:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); }
3166
+ .ims-btnDanger { background: var(--dsw-alias-state-error-primary); color: var(--dsw-alias-label-primary-inverted); }
3163
3167
  .ims-btnSmall { min-height: 28px; padding: 3px 10px; font-size: 12px; }
3164
- .ims-hint { margin: 4px 0 0; font-size: 12px; color: var(--dsw-alias-label-secondary, #57606a); }
3168
+ .ims-hint { margin: 4px 0 0; font-size: 12px; color: var(--dsw-alias-label-tertiary); }
3165
3169
  .ims-empty {
3166
3170
  padding: 32px 16px;
3167
3171
  text-align: center;
3168
3172
  font-size: 13px;
3169
- color: var(--dsw-alias-label-secondary, #57606a);
3173
+ color: var(--dsw-alias-label-tertiary);
3170
3174
  }
3171
3175
  .ims-badge {
3172
3176
  flex: none;
@@ -3175,10 +3179,10 @@ ${extra}
3175
3179
  font-size: 11px;
3176
3180
  line-height: 16px;
3177
3181
  }
3178
- .ims-badgeOn { background: var(--dsw-alias-status-success-subtle, rgba(35,134,54,.15)); color: var(--dsw-alias-status-success, #1a7f37); }
3179
- .ims-badgeOff { background: var(--dsw-alias-status-error-subtle, rgba(209,36,47,.12)); color: var(--dsw-alias-status-error, #d1242f); }
3180
- .ims-status { margin: 8px 0 0; font-size: 12px; color: var(--dsw-alias-status-success, #1a7f37); }
3181
- .ims-statusError { color: var(--dsw-alias-status-error, #d1242f); }
3182
+ .ims-badgeOn { background: var(--dsw-alias-state-success-secondary); color: var(--dsw-alias-state-success-primary); }
3183
+ .ims-badgeOff { background: var(--dsw-alias-state-error-secondary); color: var(--dsw-alias-state-error-primary); }
3184
+ .ims-status { margin: 8px 0 0; font-size: 12px; color: var(--dsw-alias-state-success-primary); }
3185
+ .ims-statusError { color: var(--dsw-alias-state-error-primary); }
3182
3186
  .ims-spin { animation: ims-rotate 1s linear infinite; }
3183
3187
  @keyframes ims-rotate { to { transform: rotate(360deg); } }
3184
3188
 
@@ -3205,7 +3209,7 @@ ${extra}
3205
3209
  cursor: pointer;
3206
3210
  }
3207
3211
  .ims-inlineGrid { display: grid; gap: 8px; margin-top: 8px; }
3208
- .ims-mini { display: grid; gap: 4px; font-size: 12px; color: var(--dsw-alias-label-secondary, #57606a); }
3212
+ .ims-mini { display: grid; gap: 4px; font-size: 12px; color: var(--dsw-alias-label-secondary); }
3209
3213
  .ims-prompt { resize: vertical; min-height: 96px; }
3210
3214
  .ims-rowActions { display: flex; gap: 8px; margin-top: 8px; align-items: center; }
3211
3215
  .ims-rowGrow { flex: 1; min-width: 0; }
@@ -3219,20 +3223,21 @@ ${extra}
3219
3223
  padding: 6px 8px;
3220
3224
  border-radius: 8px;
3221
3225
  }
3222
- .ims-paramRowOn { background: var(--dsw-alias-bg-secondary, rgba(0,0,0,.04)); }
3226
+ .ims-paramRowOn { background: var(--dsw-alias-bg-layer-1); }
3223
3227
  .ims-paramText { flex: 1; min-width: 0; display: grid; }
3224
- .ims-paramKey { font-size: 12px; font-weight: 600; font-family: var(--ds-font-family-code, monospace); }
3228
+ .ims-paramKey { font-size: 12px; font-weight: 600; font-family: var(--ds-font-family-code); }
3225
3229
  .ims-paramGen {
3226
3230
  margin-left: 6px;
3227
3231
  padding: 0 5px;
3228
3232
  border-radius: 4px;
3229
- background: var(--dsw-alias-bg-tertiary, rgba(0,0,0,.08));
3233
+ background: var(--dsw-alias-bg-module-platform);
3234
+ color: var(--dsw-alias-label-secondary);
3230
3235
  font-size: 10px;
3231
3236
  font-weight: 400;
3232
3237
  }
3233
3238
  .ims-paramDesc {
3234
3239
  font-size: 11px;
3235
- color: var(--dsw-alias-label-secondary, #57606a);
3240
+ color: var(--dsw-alias-label-tertiary);
3236
3241
  overflow: hidden;
3237
3242
  text-overflow: ellipsis;
3238
3243
  white-space: nowrap;
@@ -3244,15 +3249,15 @@ ${extra}
3244
3249
  font-size: 12px;
3245
3250
  font-weight: 600;
3246
3251
  padding: 6px 0;
3247
- color: var(--dsw-alias-label-secondary, #57606a);
3252
+ color: var(--dsw-alias-label-secondary);
3248
3253
  user-select: none;
3249
3254
  }
3250
3255
  .ims-advCount {
3251
3256
  margin-left: 6px;
3252
3257
  padding: 0 6px;
3253
3258
  border-radius: 999px;
3254
- background: var(--dsw-alias-button-primary-fill, #1f2328);
3255
- color: var(--dsw-alias-button-primary-label, #fff);
3259
+ background: var(--dsw-alias-button-primary-fill);
3260
+ color: var(--dsw-alias-label-primary-inverted);
3256
3261
  font-size: 10px;
3257
3262
  }
3258
3263
 
@@ -3263,7 +3268,7 @@ ${extra}
3263
3268
  position: absolute;
3264
3269
  inset: 0;
3265
3270
  border-radius: 999px;
3266
- background: var(--dsw-alias-border-l1, rgba(0,0,0,.24));
3271
+ background: var(--dsw-alias-bg-module-platform);
3267
3272
  transition: background .15s;
3268
3273
  pointer-events: none;
3269
3274
  }
@@ -3275,10 +3280,10 @@ ${extra}
3275
3280
  width: 14px;
3276
3281
  height: 14px;
3277
3282
  border-radius: 50%;
3278
- background: #fff;
3283
+ background: var(--dsw-alias-label-primary);
3279
3284
  transition: transform .15s;
3280
3285
  }
3281
- .ims-switch input:checked + .ims-switchTrack { background: var(--dsw-alias-status-success, #1a7f37); }
3286
+ .ims-switch input:checked + .ims-switchTrack { background: var(--dsw-alias-brand-primary); }
3282
3287
  .ims-switch input:checked + .ims-switchTrack::after { transform: translateX(12px); }
3283
3288
 
3284
3289
  /* 源图/遮罩缩略 */
@@ -3307,49 +3312,64 @@ ${extra}
3307
3312
  gap: 4px;
3308
3313
  width: 64px;
3309
3314
  height: 64px;
3310
- border: 1px dashed var(--dsw-alias-border-l1, rgba(0,0,0,.24));
3315
+ border: 1px dashed var(--dsw-alias-border-l1);
3311
3316
  border-radius: 8px;
3312
3317
  background: transparent;
3313
- color: var(--dsw-alias-label-secondary, #57606a);
3318
+ color: var(--dsw-alias-label-secondary);
3314
3319
  font-size: 11px;
3315
3320
  cursor: pointer;
3316
3321
  }
3317
- .ims-thumbAdd:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(0,0,0,.06)); }
3322
+ .ims-thumbAdd:hover { background: var(--dsw-alias-interactive-bg-hover); }
3318
3323
 
3319
3324
  /* 提交区 */
3320
- .ims-genFoot { grid-column: 1 / -1; border-top: .5px solid var(--dsw-alias-border-l3, rgba(0,0,0,.08)); padding-top: 12px; }
3325
+ .ims-genFoot { grid-column: 1 / -1; border-top: 1px solid var(--dsw-alias-border-l3); padding-top: 12px; }
3321
3326
  .ims-naming { display: flex; gap: 8px; margin-bottom: 8px; }
3322
3327
  .ims-submit { width: 100%; min-height: 40px; font-size: 14px; margin-top: 8px; }
3323
3328
 
3324
- /* ── 图片选择器 ── */
3325
- .ims-pickerBackdrop, .ims-detailBackdrop {
3326
- position: absolute;
3327
- inset: 0;
3328
- z-index: 5;
3329
- display: flex;
3330
- align-items: center;
3331
- justify-content: center;
3332
- background: var(--dsw-alias-overlay-bg, rgba(0,0,0,.4));
3329
+ /* ── 子模态(图片选择器 / 画廊详情,官方 Modal 承载)── */
3330
+ .ims-pickerModal {
3331
+ width: min(760px, 92vw) !important;
3332
+ max-width: none !important;
3333
+ max-height: 86vh;
3334
+ padding: 0 !important;
3335
+ gap: 0 !important;
3333
3336
  }
3334
- .ims-picker, .ims-detail {
3337
+ .ims-detailModal {
3338
+ width: min(920px, 94vw) !important;
3339
+ max-width: none !important;
3340
+ max-height: 88vh;
3341
+ padding: 0 !important;
3342
+ gap: 0 !important;
3343
+ }
3344
+ .ims-sub {
3335
3345
  display: flex;
3336
3346
  flex-direction: column;
3337
- width: min(760px, 92%);
3338
- max-height: 86%;
3339
- border-radius: 14px;
3340
- background: var(--dsw-alias-bg-primary, #fff);
3341
- overflow: hidden;
3347
+ min-height: 0;
3348
+ max-height: inherit;
3349
+ color: var(--dsw-alias-label-primary);
3342
3350
  }
3343
- .ims-pickerHead, .ims-detailHead {
3351
+ .ims-subHead {
3344
3352
  display: flex;
3345
3353
  flex: none;
3346
3354
  align-items: center;
3347
3355
  justify-content: space-between;
3348
3356
  gap: 8px;
3357
+ padding: 12px 14px;
3358
+ border-bottom: 1px solid var(--dsw-alias-border-l3);
3359
+ }
3360
+ .ims-subTitle { margin: 0; font-size: 14px; }
3361
+ .ims-subFoot {
3362
+ display: flex;
3363
+ flex: none;
3364
+ align-items: center;
3365
+ justify-content: flex-end;
3366
+ gap: 8px;
3349
3367
  padding: 10px 14px;
3350
- border-bottom: .5px solid var(--dsw-alias-border-l3, rgba(0,0,0,.08));
3368
+ border-top: 1px solid var(--dsw-alias-border-l3);
3351
3369
  }
3352
- .ims-pickerTitle { margin: 0; font-size: 14px; }
3370
+ .ims-subFoot .ims-status { margin: 0 auto 0 0; }
3371
+
3372
+ /* 选择器网格 */
3353
3373
  .ims-pickerGrid {
3354
3374
  flex: 1;
3355
3375
  min-height: 0;
@@ -3370,7 +3390,7 @@ ${extra}
3370
3390
  overflow: hidden;
3371
3391
  }
3372
3392
  .ims-pickerCell img { width: 100%; height: 100%; object-fit: cover; display: block; }
3373
- .ims-pickerCellOn { border-color: var(--dsw-alias-focus-ring, #4d9fff); }
3393
+ .ims-pickerCellOn { border-color: var(--dsw-alias-brand-primary); }
3374
3394
  .ims-pickerMark {
3375
3395
  position: absolute;
3376
3396
  top: 4px;
@@ -3378,20 +3398,12 @@ ${extra}
3378
3398
  min-width: 18px;
3379
3399
  height: 18px;
3380
3400
  border-radius: 999px;
3381
- background: var(--dsw-alias-button-primary-fill, #1f2328);
3382
- color: var(--dsw-alias-button-primary-label, #fff);
3401
+ background: var(--dsw-alias-button-primary-fill);
3402
+ color: var(--dsw-alias-label-primary-inverted);
3383
3403
  font-size: 11px;
3384
3404
  line-height: 18px;
3385
3405
  text-align: center;
3386
3406
  }
3387
- .ims-pickerFoot {
3388
- display: flex;
3389
- flex: none;
3390
- justify-content: flex-end;
3391
- gap: 8px;
3392
- padding: 10px 14px;
3393
- border-top: .5px solid var(--dsw-alias-border-l3, rgba(0,0,0,.08));
3394
- }
3395
3407
 
3396
3408
  /* ── 画廊 ── */
3397
3409
  .ims-gallery { padding: 12px 16px; }
@@ -3408,7 +3420,7 @@ ${extra}
3408
3420
  border: none;
3409
3421
  border-radius: 10px;
3410
3422
  padding: 0;
3411
- background: var(--dsw-alias-bg-secondary, rgba(0,0,0,.04));
3423
+ background: var(--dsw-alias-bg-layer-1);
3412
3424
  cursor: pointer;
3413
3425
  overflow: hidden;
3414
3426
  }
@@ -3431,9 +3443,8 @@ ${extra}
3431
3443
  }
3432
3444
  .ims-cell:hover .ims-cellPrompt, .ims-cell:focus-visible .ims-cellPrompt { opacity: 1; }
3433
3445
 
3434
- /* 详情模态 */
3435
- .ims-detail { width: min(920px, 94%); }
3436
- .ims-detailMeta { font-size: 12px; color: var(--dsw-alias-label-secondary, #57606a); }
3446
+ /* 详情 */
3447
+ .ims-detailMeta { font-size: 12px; color: var(--dsw-alias-label-tertiary); }
3437
3448
  .ims-detailBody {
3438
3449
  flex: 1;
3439
3450
  min-height: 0;
@@ -3448,13 +3459,13 @@ ${extra}
3448
3459
  .ims-detailFigure img {
3449
3460
  width: 100%;
3450
3461
  border-radius: 10px;
3451
- background: var(--dsw-alias-bg-secondary, rgba(0,0,0,.04));
3462
+ background: var(--dsw-alias-bg-layer-1);
3452
3463
  display: block;
3453
3464
  }
3454
3465
  .ims-detailFigure figcaption { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
3455
3466
  .ims-revised {
3456
3467
  font-size: 11px;
3457
- color: var(--dsw-alias-label-secondary, #57606a);
3468
+ color: var(--dsw-alias-label-tertiary);
3458
3469
  overflow: hidden;
3459
3470
  text-overflow: ellipsis;
3460
3471
  white-space: nowrap;
@@ -3464,18 +3475,8 @@ ${extra}
3464
3475
  .ims-detailLabel:first-child { margin-top: 0; }
3465
3476
  .ims-detailPrompt { margin: 0; font-size: 13px; white-space: pre-wrap; word-break: break-word; }
3466
3477
  .ims-paramTable { width: 100%; border-collapse: collapse; font-size: 12px; }
3467
- .ims-paramTable td { padding: 4px 6px; border-top: .5px solid var(--dsw-alias-border-l3, rgba(0,0,0,.08)); word-break: break-all; }
3468
- .ims-paramTableKey { font-family: var(--ds-font-family-code, monospace); font-weight: 600; white-space: nowrap; }
3469
- .ims-detailFoot {
3470
- display: flex;
3471
- flex: none;
3472
- align-items: center;
3473
- justify-content: flex-end;
3474
- gap: 8px;
3475
- padding: 10px 14px;
3476
- border-top: .5px solid var(--dsw-alias-border-l3, rgba(0,0,0,.08));
3477
- }
3478
- .ims-detailFoot .ims-status { margin: 0 auto 0 0; }
3478
+ .ims-paramTable td { padding: 4px 6px; border-top: 1px solid var(--dsw-alias-border-l3); word-break: break-all; }
3479
+ .ims-paramTableKey { font-family: var(--ds-font-family-code); font-weight: 600; white-space: nowrap; }
3479
3480
 
3480
3481
  /* ── 任务条 ── */
3481
3482
  .ims-tasks {
@@ -3483,8 +3484,9 @@ ${extra}
3483
3484
  flex: none;
3484
3485
  gap: 8px;
3485
3486
  padding: 8px 12px;
3487
+ margin: 0;
3486
3488
  overflow-x: auto;
3487
- border-top: .5px solid var(--dsw-alias-border-l3, rgba(0,0,0,.08));
3489
+ border-top: 1px solid var(--dsw-alias-border-l3);
3488
3490
  }
3489
3491
  .ims-task {
3490
3492
  display: inline-flex;
@@ -3494,30 +3496,30 @@ ${extra}
3494
3496
  max-width: 340px;
3495
3497
  padding: 4px 10px;
3496
3498
  border-radius: 999px;
3497
- background: var(--dsw-alias-bg-secondary, rgba(0,0,0,.04));
3499
+ background: var(--dsw-alias-bg-layer-1);
3498
3500
  font-size: 12px;
3499
3501
  }
3500
3502
  .ims-taskState { font-weight: 600; flex: none; }
3501
- .ims-taskState-running { color: var(--dsw-alias-status-info, #0969da); }
3502
- .ims-taskState-queued { color: var(--dsw-alias-label-secondary, #57606a); }
3503
- .ims-taskState-succeeded { color: var(--dsw-alias-status-success, #1a7f37); }
3504
- .ims-taskState-failed { color: var(--dsw-alias-status-error, #d1242f); }
3505
- .ims-taskState-cancelled { color: var(--dsw-alias-label-secondary, #57606a); }
3503
+ .ims-taskState-running { color: var(--dsw-alias-brand-primary); }
3504
+ .ims-taskState-queued { color: var(--dsw-alias-label-tertiary); }
3505
+ .ims-taskState-succeeded { color: var(--dsw-alias-state-success-primary); }
3506
+ .ims-taskState-failed { color: var(--dsw-alias-state-error-primary); }
3507
+ .ims-taskState-cancelled { color: var(--dsw-alias-label-tertiary); }
3506
3508
  .ims-taskPrompt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
3507
- .ims-taskModel { flex: none; color: var(--dsw-alias-label-secondary, #57606a); font-size: 11px; }
3509
+ .ims-taskModel { flex: none; color: var(--dsw-alias-label-tertiary); font-size: 11px; }
3508
3510
  .ims-taskError {
3509
3511
  max-width: 140px;
3510
3512
  overflow: hidden;
3511
3513
  text-overflow: ellipsis;
3512
3514
  white-space: nowrap;
3513
- color: var(--dsw-alias-status-error, #d1242f);
3515
+ color: var(--dsw-alias-state-error-primary);
3514
3516
  }
3515
3517
 
3516
3518
  /* ── 配置卡片附加件(imsc- 基础类由 cardCss('imsc') 生成)── */
3517
3519
  .imsc-loading{padding:14px 16px;margin:0;font-size:13px;color:var(--dsw-alias-label-tertiary)}
3518
3520
  .imsc-groupTitle { margin: 14px 0 6px; font-size: 13px; font-weight: 600; }
3519
3521
  .imsc-presetBox {
3520
- border: .5px solid var(--dsw-alias-border-l3, rgba(0,0,0,.08));
3522
+ border: 1px solid var(--dsw-alias-border-l3);
3521
3523
  border-radius: 10px;
3522
3524
  padding: 10px;
3523
3525
  margin-bottom: 10px;
@@ -3532,11 +3534,11 @@ ${extra}
3532
3534
  width: 100%;
3533
3535
  min-height: 64px;
3534
3536
  padding: 6px 10px;
3535
- border: .5px solid var(--dsw-alias-border-l2, rgba(0,0,0,.16));
3537
+ border: 1px solid var(--dsw-alias-border-l2);
3536
3538
  border-radius: 8px;
3537
- background: var(--dsw-alias-bg-primary, #fff);
3538
- color: var(--dsw-alias-label-primary, #1f2328);
3539
- font-family: var(--ds-font-family-code, monospace);
3539
+ background: var(--dsw-alias-bg-layer-3);
3540
+ color: var(--dsw-alias-label-primary);
3541
+ font-family: var(--ds-font-family-code);
3540
3542
  font-size: 12px;
3541
3543
  resize: vertical;
3542
3544
  }
@@ -3545,15 +3547,32 @@ ${extra}
3545
3547
 
3546
3548
  /* ── 移动端(≤767px,与 ui-mobile-fit 同断点)── */
3547
3549
  @media (max-width: 767px) {
3548
- .ims-backdrop { align-items: stretch; justify-content: stretch; }
3549
- .ims-panel { width: 100%; height: 100%; border-radius: 0; }
3550
+ .ims-modal {
3551
+ position: fixed;
3552
+ inset: 0;
3553
+ margin: 0;
3554
+ width: 100% !important;
3555
+ max-width: none !important;
3556
+ height: 100%;
3557
+ max-height: none;
3558
+ border: none;
3559
+ border-radius: 0 !important;
3560
+ }
3550
3561
  .ims-gen { grid-template-columns: minmax(0, 1fr); }
3551
3562
  .ims-genSide { margin-top: 4px; }
3552
3563
  .ims-tab { padding: 0 10px; }
3553
3564
  .ims-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
3554
3565
  .ims-detailBody { grid-template-columns: minmax(0, 1fr); }
3555
- .ims-picker, .ims-detail { width: 100%; max-height: 100%; height: 100%; border-radius: 0; }
3556
- .ims-pickerBackdrop, .ims-detailBackdrop { align-items: stretch; justify-content: stretch; }
3566
+ .ims-pickerModal, .ims-detailModal {
3567
+ position: fixed;
3568
+ inset: 0;
3569
+ width: 100% !important;
3570
+ max-width: none !important;
3571
+ max-height: none;
3572
+ height: 100%;
3573
+ border: none;
3574
+ border-radius: 0 !important;
3575
+ }
3557
3576
  .ims-paramControl { width: 108px; }
3558
3577
  .ims-btn { min-height: 40px; }
3559
3578
  .ims-btnSmall { min-height: 32px; }
package/lib/index.d.ts CHANGED
@@ -161,7 +161,7 @@ interface PresetsWire {
161
161
  //#endregion
162
162
  //#region src/service.d.ts
163
163
  declare class ImageStudioService extends Service {
164
- static [Context.inject]: string[];
164
+ static inject: string[];
165
165
  private current;
166
166
  private readonly runner;
167
167
  private readonly log;