@dickpy/dsh-imagegen 1.4.0 → 1.5.1

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.
Files changed (54) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +270 -124
  3. package/cordis.patch.yml +8 -8
  4. package/docs/images/ecommerce-mode.png +0 -0
  5. package/docs/images/image-generation-studio-three-column.png +0 -0
  6. package/docs/images/imagegen-overview.png +0 -0
  7. package/docs/videos/agent-chat-edit.gif +0 -0
  8. package/docs/videos/agent-chat-edit.mp4 +0 -0
  9. package/lib/client.js +1873 -431
  10. package/lib/client.js.map +1 -1
  11. package/lib/index.js +355 -116
  12. package/package.json +77 -70
  13. package/src/agent-image-tools.ts +447 -418
  14. package/src/client/ImageGenPanel.tsx +1243 -348
  15. package/src/client/SettingsCard.tsx +936 -936
  16. package/src/client/TemplateLibrary.tsx +336 -336
  17. package/src/client/api.ts +203 -193
  18. package/src/client/channels-form.ts +263 -263
  19. package/src/client/controller.ts +46 -46
  20. package/src/client/conversation-sync.ts +14 -14
  21. package/src/client/css-modules.d.ts +5 -5
  22. package/src/client/helpers.ts +33 -33
  23. package/src/client/image-toolview.module.css +73 -73
  24. package/src/client/image-toolview.tsx +34 -28
  25. package/src/client/index.ts +25 -24
  26. package/src/client/locales.ts +156 -28
  27. package/src/client/mount.tsx +117 -117
  28. package/src/client/panel.module.css +1243 -455
  29. package/src/client/settings-card.module.css +1023 -1023
  30. package/src/client/settings-form.ts +337 -336
  31. package/src/client/settings-scope.ts +302 -298
  32. package/src/client/sidebar-entry.ts +190 -190
  33. package/src/client/templates.module.css +453 -453
  34. package/src/edit-image-command.ts +110 -0
  35. package/src/engine.ts +520 -520
  36. package/src/gallery-store.ts +306 -286
  37. package/src/generation-runtime.ts +84 -79
  38. package/src/history-store.ts +270 -250
  39. package/src/image-format.ts +11 -11
  40. package/src/image-models.ts +19 -19
  41. package/src/index.ts +337 -318
  42. package/src/model-catalog.ts +115 -115
  43. package/src/presets.ts +71 -71
  44. package/src/prompt-enhancer.ts +137 -137
  45. package/src/protocol.ts +380 -338
  46. package/src/routes.ts +966 -916
  47. package/src/settings-compat.ts +60 -0
  48. package/src/task-queue.ts +113 -113
  49. package/src/templates/cases.json +10196 -10196
  50. package/src/templates-store.ts +278 -278
  51. package/src/updater.ts +117 -117
  52. package/docs/images/agent-chat-edit.png +0 -0
  53. package/docs/images/agent-chat-generate.png +0 -0
  54. package/docs/images/agent-chat-poster-workflow.png +0 -0
package/lib/client.js CHANGED
@@ -9,7 +9,7 @@ window.__ModuleLoader__.load({
9
9
  let react_dom = require("react-dom");
10
10
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
11
11
  let react_jsx_runtime = require("react/jsx-runtime");
12
- let _deepseek_ai_dsh_client_runtime_client = require("@deepseek-ai/dsh-client-runtime/client");
12
+ let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
13
13
  //#region src/protocol.ts
14
14
  /** Same-origin route family (loopback-only, mirroring the dsh-ssh fence). */
15
15
  const SETTINGS_API = {
@@ -29,6 +29,8 @@ window.__ModuleLoader__.load({
29
29
  const PRESETS_API = "/api/dsh-imagegen/presets";
30
30
  /** Loopback-only image reader for Agent tool-result previews. */
31
31
  const AGENT_IMAGE_API = "/api/dsh-imagegen/agent-image";
32
+ /** Store the current composer image for the direct edit_image command. */
33
+ const CONVERSATION_IMAGE_API = "/api/dsh-imagegen/conversation-image";
32
34
  /**
33
35
  * Host-computed per-channel usage counters (generation-count badges in the
34
36
  * settings card): entries are tallied from the persisted history and gallery
@@ -152,6 +154,18 @@ window.__ModuleLoader__.load({
152
154
  body: JSON.stringify({ prompt })
153
155
  }))).prompt;
154
156
  }
157
+ /** Stage a generated image as a durable reference for `/edit_image`. */
158
+ async attachConversationImage(sessionId, dataUrl, name) {
159
+ await readEnvelope(await fetch(CONVERSATION_IMAGE_API, {
160
+ method: "POST",
161
+ headers: { "content-type": "application/json" },
162
+ body: JSON.stringify({
163
+ sessionId,
164
+ dataUrl,
165
+ name
166
+ })
167
+ }));
168
+ }
155
169
  async taskSubmit(request) {
156
170
  return (await readEnvelope(await fetch(TASK_API.submit, {
157
171
  method: "POST",
@@ -300,11 +314,69 @@ window.__ModuleLoader__.load({
300
314
  "conversation.add": "加入对话",
301
315
  "conversation.adding": "加入中…",
302
316
  "conversation.added": "图片已加入当前对话",
317
+ "conversation.addHint": "加入对话后可使用 /edit_image 修改;命令使用插件图片模型",
303
318
  "conversation.noSession": "请先打开一个会话,再加入图片",
304
319
  "conversation.unavailable": "当前会话暂不可用",
305
320
  "conversation.busy": "当前对话正在发送,请稍后再试",
306
321
  "mode.text": "文生图",
307
322
  "mode.edit": "图生图",
323
+ "workspace.label": "创作模式",
324
+ "workspace.normal": "普通生图",
325
+ "workspace.ecommerce": "电商模式",
326
+ "chat.expand": "展开右侧对话",
327
+ "chat.collapse": "收起右侧对话",
328
+ "chat.toggle": "对话",
329
+ "config.resizeHint": "拖拽调整参数栏宽度",
330
+ "ecommerce.generation": "生成设置",
331
+ "ecommerce.title": "电商模式",
332
+ "ecommerce.badge": "预览",
333
+ "ecommerce.short": "电商",
334
+ "ecommerce.anchorPending": "已生成主图,其余图片正在自动参考主图生成,保证整套同款…",
335
+ "ecommerce.anchorFailed": "主图生成失败,其余图片已暂停。请重试主图(或整组重新生成)后再继续。",
336
+ "ecommerce.anchorNote": "锚定生成:先出主图,其余图片自动参考主图,保证整套同款",
337
+ "ecommerce.noAssetWarn": "未上传商品图:主图将按文字描述生成并作为锚定基准,建议先上传商品主图获得更高一致性",
338
+ "ecommerce.product": "商品信息",
339
+ "ecommerce.productName": "商品名称(必填)",
340
+ "ecommerce.projectName": "项目名称(可选)",
341
+ "ecommerce.constraints": "卖点与约束",
342
+ "ecommerce.sellingPoints": "商品卖点,例如:防水防污 / 大容量 / 便携",
343
+ "ecommerce.protectedFeatures": "必须保留的特征,例如:颜色、Logo、包装文字、结构",
344
+ "ecommerce.styleHint": "风格补充,例如:高级感 / 写实 / 自然光",
345
+ "ecommerce.setStructure": "套图结构",
346
+ "ecommerce.preview": "生成套图预览",
347
+ "ecommerce.planTitle": "预计生成 {count} 张图片",
348
+ "ecommerce.planSlot": "{count} 张 · {description}",
349
+ "ecommerce.confirm": "确认生成整套图片",
350
+ "ecommerce.uploadRef": "上传商品素材(可选,最多 4 张:主体 / 包装 / 细节 / 风格)",
351
+ "ecommerce.uploadShort": "上传素材",
352
+ "ecommerce.sellingTitle": "商品卖点",
353
+ "ecommerce.advanced": "高级选项(项目 / 平台 / 约束)",
354
+ "ecommerce.params": "参数选择",
355
+ "ecommerce.platformLabel": "平台",
356
+ "ecommerce.languageLabel": "文案语言",
357
+ "ecommerce.ratioLabel": "比例",
358
+ "ecommerce.categoryLabel": "类目",
359
+ "ecommerce.multiSelect": "可多选",
360
+ "ecommerce.countHint": "点击调整数量(1-4)",
361
+ "ecommerce.refSettings": "参考图设置(可选)",
362
+ "ecommerce.styleTitle": "风格 / 补充提示",
363
+ "ecommerce.protectedLabel": "必须保留的特征(可选)",
364
+ "ecommerce.assetsFull": "最多上传 4 张素材",
365
+ "ecommerce.refSelect": "该用途使用的参考图",
366
+ "ecommerce.refNone": "不使用参考图",
367
+ "ecommerce.role.product": "商品主体",
368
+ "ecommerce.role.packaging": "包装",
369
+ "ecommerce.role.detail": "细节/角度",
370
+ "ecommerce.role.style": "风格参考",
371
+ "ecommerce.footerReady": "将生成 {count} 张套图",
372
+ "ecommerce.footerEmpty": "请选择套图结构",
373
+ "ecommerce.results.title": "套图结果",
374
+ "ecommerce.results.progress": "{done}/{total} 已完成",
375
+ "ecommerce.results.failed": "{count} 张失败",
376
+ "ecommerce.results.empty": "确认生成后,每张图片的任务状态和结果会按用途显示在这里",
377
+ "ecommerce.results.regenerate": "重新生成",
378
+ "ecommerce.results.export": "导出清单",
379
+ "ecommerce.results.newProduct": "新商品",
308
380
  "prompt.placeholder": "描述你想要的画面,例如:一只戴着宇航员头盔的橘猫,在月球上举起望远镜,水彩风格,柔和光线…",
309
381
  "prompt.required": "请输入提示词",
310
382
  "prompt.count": "{count}",
@@ -362,6 +434,8 @@ window.__ModuleLoader__.load({
362
434
  "edit.required": "请先上传参考图片",
363
435
  "canvas.emptyTitle": "开始你的创作",
364
436
  "canvas.emptyHint": "在左侧输入提示词并点击「开始生成」,结果将显示在这里",
437
+ "canvas.new": "新建作图",
438
+ "canvas.newHint": "开始新的作图并清空预览",
365
439
  "canvas.error": "生成失败:{error}",
366
440
  "canvas.submitting": "正在加入生成队列…",
367
441
  "canvas.queued": "已加入生成队列",
@@ -374,6 +448,7 @@ window.__ModuleLoader__.load({
374
448
  "history.title": "历史记录",
375
449
  "history.empty": "暂无历史记录,生成图片后会保存在这里",
376
450
  "history.clear": "清空",
451
+ "history.clearConfirm": "确定要清空全部历史记录吗?此操作不可撤销。",
377
452
  "history.restore": "恢复",
378
453
  "history.delete": "删除",
379
454
  "history.images": "张",
@@ -417,6 +492,7 @@ window.__ModuleLoader__.load({
417
492
  "gallery.already": "已在画廊中",
418
493
  "gallery.delete": "移出画廊",
419
494
  "gallery.clear": "清空画廊",
495
+ "gallery.clearConfirm": "确定要清空整个画廊吗?此操作不可撤销。",
420
496
  "gallery.empty": "画廊还是空的,把喜欢的图片加入进来吧",
421
497
  "gallery.viewing": "画廊 · {time}",
422
498
  "preview.title": "图片预览",
@@ -444,6 +520,8 @@ window.__ModuleLoader__.load({
444
520
  "config.disabled": "插件已停用,请在设置中重新启用。",
445
521
  "connection.connected": "已连接",
446
522
  "connection.disconnected": "未连接",
523
+ "panel.collapseConfig": "收起参数栏",
524
+ "panel.expandConfig": "展开参数栏",
447
525
  "update.available": "检测到新版本:{version}",
448
526
  "update.install": "在线更新",
449
527
  "update.installing": "更新中…",
@@ -597,11 +675,69 @@ window.__ModuleLoader__.load({
597
675
  "conversation.add": "Add to chat",
598
676
  "conversation.adding": "Adding…",
599
677
  "conversation.added": "Image added to the current chat",
678
+ "conversation.addHint": "After adding to chat, use /edit_image to modify it; the command uses the plugin image model",
600
679
  "conversation.noSession": "Open a session before adding an image",
601
680
  "conversation.unavailable": "The current session is unavailable",
602
681
  "conversation.busy": "The chat is sending a message; try again shortly",
603
682
  "mode.text": "Text to Image",
604
683
  "mode.edit": "Image to Image",
684
+ "workspace.label": "Workspace",
685
+ "workspace.normal": "Standard",
686
+ "workspace.ecommerce": "E-commerce",
687
+ "chat.expand": "Expand the conversation pane",
688
+ "chat.collapse": "Collapse the conversation pane",
689
+ "chat.toggle": "Chat",
690
+ "config.resizeHint": "Drag to resize the parameter panel",
691
+ "ecommerce.generation": "Generation settings",
692
+ "ecommerce.title": "E-commerce Mode",
693
+ "ecommerce.badge": "Beta",
694
+ "ecommerce.short": "Store",
695
+ "ecommerce.anchorPending": "Main image generated — remaining images are being generated with the main image as reference to keep the set consistent…",
696
+ "ecommerce.anchorFailed": "Main image failed; remaining images are paused. Retry the main image or regenerate the set.",
697
+ "ecommerce.anchorNote": "Anchored: main image first, remaining images reference it automatically for a consistent set",
698
+ "ecommerce.noAssetWarn": "No product image uploaded: the main image will be generated from text as the anchor. Upload one for higher consistency.",
699
+ "ecommerce.product": "Product details",
700
+ "ecommerce.productName": "Product name (required)",
701
+ "ecommerce.projectName": "Project name (optional)",
702
+ "ecommerce.constraints": "Selling points & constraints",
703
+ "ecommerce.sellingPoints": "Selling points, e.g. waterproof / large capacity / portable",
704
+ "ecommerce.protectedFeatures": "Features to preserve: color, logo, packaging text, structure",
705
+ "ecommerce.styleHint": "Style hint, e.g. premium / realistic / natural light",
706
+ "ecommerce.setStructure": "Image set structure",
707
+ "ecommerce.preview": "Preview product set",
708
+ "ecommerce.planTitle": "Plan to generate {count} images",
709
+ "ecommerce.planSlot": "{count} images · {description}",
710
+ "ecommerce.confirm": "Confirm and generate set",
711
+ "ecommerce.uploadRef": "Upload product assets (optional, up to 4: product / packaging / detail / style)",
712
+ "ecommerce.uploadShort": "Upload",
713
+ "ecommerce.sellingTitle": "Selling points",
714
+ "ecommerce.advanced": "Advanced (project / platform / constraints)",
715
+ "ecommerce.params": "Parameters",
716
+ "ecommerce.platformLabel": "Platform",
717
+ "ecommerce.languageLabel": "Copy language",
718
+ "ecommerce.ratioLabel": "Aspect ratio",
719
+ "ecommerce.categoryLabel": "Category",
720
+ "ecommerce.multiSelect": "multi-select",
721
+ "ecommerce.countHint": "Click to adjust count (1-4)",
722
+ "ecommerce.refSettings": "Reference images (optional)",
723
+ "ecommerce.styleTitle": "Style / extra hints",
724
+ "ecommerce.protectedLabel": "Features to preserve (optional)",
725
+ "ecommerce.assetsFull": "Up to 4 assets",
726
+ "ecommerce.refSelect": "Reference image for this slot",
727
+ "ecommerce.refNone": "No reference",
728
+ "ecommerce.role.product": "Product",
729
+ "ecommerce.role.packaging": "Packaging",
730
+ "ecommerce.role.detail": "Detail / angle",
731
+ "ecommerce.role.style": "Style",
732
+ "ecommerce.footerReady": "{count} images in this set",
733
+ "ecommerce.footerEmpty": "Select the image set structure",
734
+ "ecommerce.results.title": "Product set results",
735
+ "ecommerce.results.progress": "{done}/{total} completed",
736
+ "ecommerce.results.failed": "{count} failed",
737
+ "ecommerce.results.empty": "After confirming, each image task and result will show here grouped by purpose",
738
+ "ecommerce.results.regenerate": "Regenerate",
739
+ "ecommerce.results.export": "Export manifest",
740
+ "ecommerce.results.newProduct": "New product",
605
741
  "prompt.placeholder": "Describe the picture you want, e.g. an orange cat in an astronaut helmet raising a telescope on the moon, watercolor style, soft light…",
606
742
  "prompt.required": "Enter a prompt first",
607
743
  "prompt.count": "{count}",
@@ -659,6 +795,8 @@ window.__ModuleLoader__.load({
659
795
  "edit.required": "Upload a reference image first",
660
796
  "canvas.emptyTitle": "Start creating",
661
797
  "canvas.emptyHint": "Enter a prompt on the left and click \"Generate\"; results appear here",
798
+ "canvas.new": "New creation",
799
+ "canvas.newHint": "Start a new creation and clear the preview",
662
800
  "canvas.error": "Generation failed: {error}",
663
801
  "canvas.submitting": "Adding to the generation queue…",
664
802
  "canvas.queued": "Added to the generation queue",
@@ -671,6 +809,7 @@ window.__ModuleLoader__.load({
671
809
  "history.title": "History",
672
810
  "history.empty": "No history yet — generations will be saved here",
673
811
  "history.clear": "Clear",
812
+ "history.clearConfirm": "Clear all history? This action cannot be undone.",
674
813
  "history.restore": "Restore",
675
814
  "history.delete": "Delete",
676
815
  "history.images": "images",
@@ -714,6 +853,7 @@ window.__ModuleLoader__.load({
714
853
  "gallery.already": "Already in gallery",
715
854
  "gallery.delete": "Remove",
716
855
  "gallery.clear": "Clear gallery",
856
+ "gallery.clearConfirm": "Clear the entire gallery? This action cannot be undone.",
717
857
  "gallery.empty": "The gallery is empty — add images you like here",
718
858
  "gallery.viewing": "Gallery · {time}",
719
859
  "preview.title": "Image preview",
@@ -741,6 +881,8 @@ window.__ModuleLoader__.load({
741
881
  "config.disabled": "The plugin is disabled — re-enable it in Settings.",
742
882
  "connection.connected": "Connected",
743
883
  "connection.disconnected": "Disconnected",
884
+ "panel.collapseConfig": "Collapse settings panel",
885
+ "panel.expandConfig": "Expand settings panel",
744
886
  "update.available": "A new version is available: {version}",
745
887
  "update.install": "Update online",
746
888
  "update.installing": "Updating…",
@@ -908,8 +1050,8 @@ window.__ModuleLoader__.load({
908
1050
  return String(error);
909
1051
  }
910
1052
  //#endregion
911
- //#region \0dsh-css:D:\learn\dsh\dsh-imagegen\src\client\templates.module.css.mjs
912
- const css$3 = ".APm5zW_overlay,.APm5zW_overlay *,.APm5zW_overlay :before,.APm5zW_overlay :after{box-sizing:border-box}.APm5zW_overlay{z-index:130;background:var(--dsw-alias-bg-mask-1);color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);justify-content:center;align-items:center;padding:28px;display:flex;position:fixed;inset:0}.APm5zW_shell{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:14px;flex-direction:column;width:min(1180px,100%);height:100%;max-height:100%;display:flex;overflow:hidden;box-shadow:0 18px 60px #00000047}.APm5zW_header{flex:none;justify-content:space-between;align-items:center;gap:12px;padding:14px 18px 10px;display:flex}.APm5zW_heading{align-items:baseline;gap:10px;min-width:0;display:flex}.APm5zW_title{margin:0;font-size:15px;font-weight:650}.APm5zW_meta{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px}.APm5zW_headerActions{flex:none;align-items:center;gap:8px;display:inline-flex}.APm5zW_close{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;display:inline-flex}.APm5zW_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.APm5zW_toolbar{flex-direction:column;flex:none;gap:10px;padding:0 18px 12px;display:flex}.APm5zW_search{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);width:100%;height:34px;color:var(--dsw-alias-label-primary);border-radius:9px;outline:none;padding:0 12px;font-family:inherit;font-size:13px}.APm5zW_search:focus{border-color:var(--dsw-alias-brand-primary)}.APm5zW_search::placeholder{color:var(--dsw-alias-label-dimmed)}.APm5zW_categoryRow{flex-wrap:wrap;gap:6px;max-height:64px;display:flex;overflow-y:auto}.APm5zW_categoryPill{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;border-radius:999px;padding:0 11px;font-family:inherit;font-size:12px}.APm5zW_categoryPill:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.APm5zW_categoryPill[data-active]{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-bg-base)}.APm5zW_notice{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);border-radius:9px;flex:none;margin:0 18px 10px;padding:8px 12px;font-size:12px}.APm5zW_body{flex:1;min-height:0;padding:2px 18px 14px;overflow-y:auto}.APm5zW_state{height:100%;min-height:220px;color:var(--dsw-alias-label-tertiary);flex-direction:column;justify-content:center;align-items:center;gap:12px;font-size:13px;display:flex}.APm5zW_spinner{border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-brand-primary);border-radius:50%;width:26px;height:26px;animation:.9s linear infinite APm5zW_dsh-imagegen-templates-spin}@keyframes APm5zW_dsh-imagegen-templates-spin{to{transform:rotate(360deg)}}.APm5zW_grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px;display:grid}.APm5zW_card{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);cursor:pointer;text-align:left;color:var(--dsw-alias-label-primary);border-radius:11px;flex-direction:column;gap:0;padding:0;font-family:inherit;transition:border-color .15s,transform .15s;display:flex;overflow:hidden}.APm5zW_card:hover{border-color:var(--dsw-alias-brand-primary);transform:translateY(-1px)}.APm5zW_thumbWrap{aspect-ratio:1;background:var(--dsw-alias-bg-layer-2);width:100%;display:block;position:relative}.APm5zW_thumb{object-fit:cover;width:100%;height:100%;display:block}.APm5zW_thumbPlaceholder{width:100%;height:100%;color:var(--dsw-alias-label-dimmed);justify-content:center;align-items:center;display:flex}.APm5zW_featuredBadge{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-bg-base);border-radius:999px;padding:2px 8px;font-size:11px;font-weight:600;position:absolute;top:8px;left:8px}.APm5zW_cardBody{flex-direction:column;gap:4px;min-width:0;padding:9px 11px 10px;display:flex}.APm5zW_cardTitle{-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12.5px;font-weight:600;line-height:1.35;display:-webkit-box;overflow:hidden}.APm5zW_cardMeta{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;font-size:11px;display:flex}.APm5zW_cardCategory{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 7px}.APm5zW_cardSource{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.APm5zW_footer{border-top:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:space-between;align-items:center;gap:10px;padding:9px 18px;display:flex}.APm5zW_attribution{color:var(--dsw-alias-label-dimmed);min-width:0;font-size:11.5px}.APm5zW_sourceLink{color:var(--dsw-alias-brand-primary);white-space:nowrap;flex:none;font-size:11.5px;font-weight:600;text-decoration:none}.APm5zW_sourceLink:hover{text-decoration:underline}.APm5zW_detailOverlay{background:var(--dsw-alias-bg-mask-1);justify-content:center;align-items:center;padding:34px;display:flex;position:absolute;inset:0}.APm5zW_detail{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:14px;grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(0,5fr) minmax(0,4fr);gap:0;width:min(980px,100%);max-height:100%;display:grid;overflow:hidden;box-shadow:0 18px 60px #00000052}.APm5zW_detailMedia{background:var(--dsw-alias-bg-layer-2);justify-content:center;align-items:center;min-height:0;display:flex;overflow:hidden}.APm5zW_detailImage{object-fit:contain;width:100%;height:100%;display:block}.APm5zW_detailInfo{flex-direction:column;gap:10px;min-height:0;padding:18px;display:flex;overflow-y:auto}.APm5zW_detailTitle{margin:0;font-size:15px;font-weight:650;line-height:1.4}.APm5zW_detailMeta{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:center;gap:8px;font-size:12px;display:flex}.APm5zW_detailLink{color:var(--dsw-alias-brand-primary);text-overflow:ellipsis;white-space:nowrap;text-decoration:none;overflow:hidden}.APm5zW_detailLink:hover{text-decoration:underline}.APm5zW_detailPrompt{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-height:0;color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;user-select:text;border-radius:10px;flex:1;margin:0;padding:12px;font-family:inherit;font-size:12.5px;line-height:1.6;overflow-y:auto}.APm5zW_detailActions{background:var(--dsw-alias-bg-base);border-top:1px solid var(--dsw-alias-border-l1);flex:none;gap:8px;margin:0 -18px -18px;padding:12px 18px;display:flex;position:sticky;bottom:0}@media (width<=760px){.APm5zW_detail{grid-template-rows:minmax(0,3fr) minmax(0,4fr);grid-template-columns:1fr}}";
1053
+ //#region \0dsh-css:E:\dsh-plugin\src\client\templates.module.css.mjs
1054
+ const css$3 = ".o0mAxG_overlay,.o0mAxG_overlay *,.o0mAxG_overlay :before,.o0mAxG_overlay :after{box-sizing:border-box}.o0mAxG_overlay{z-index:130;background:var(--dsw-alias-bg-mask-1);color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);justify-content:center;align-items:center;padding:28px;display:flex;position:fixed;inset:0}.o0mAxG_shell{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:14px;flex-direction:column;width:min(1180px,100%);height:100%;max-height:100%;display:flex;overflow:hidden;box-shadow:0 18px 60px #00000047}.o0mAxG_header{flex:none;justify-content:space-between;align-items:center;gap:12px;padding:14px 18px 10px;display:flex}.o0mAxG_heading{align-items:baseline;gap:10px;min-width:0;display:flex}.o0mAxG_title{margin:0;font-size:15px;font-weight:650}.o0mAxG_meta{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px}.o0mAxG_headerActions{flex:none;align-items:center;gap:8px;display:inline-flex}.o0mAxG_close{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;display:inline-flex}.o0mAxG_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.o0mAxG_toolbar{flex-direction:column;flex:none;gap:10px;padding:0 18px 12px;display:flex}.o0mAxG_search{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);width:100%;height:34px;color:var(--dsw-alias-label-primary);border-radius:9px;outline:none;padding:0 12px;font-family:inherit;font-size:13px}.o0mAxG_search:focus{border-color:var(--dsw-alias-brand-primary)}.o0mAxG_search::placeholder{color:var(--dsw-alias-label-dimmed)}.o0mAxG_categoryRow{flex-wrap:wrap;gap:6px;max-height:64px;display:flex;overflow-y:auto}.o0mAxG_categoryPill{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;border-radius:999px;padding:0 11px;font-family:inherit;font-size:12px}.o0mAxG_categoryPill:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.o0mAxG_categoryPill[data-active]{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-bg-base)}.o0mAxG_notice{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);border-radius:9px;flex:none;margin:0 18px 10px;padding:8px 12px;font-size:12px}.o0mAxG_body{flex:1;min-height:0;padding:2px 18px 14px;overflow-y:auto}.o0mAxG_state{height:100%;min-height:220px;color:var(--dsw-alias-label-tertiary);flex-direction:column;justify-content:center;align-items:center;gap:12px;font-size:13px;display:flex}.o0mAxG_spinner{border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-brand-primary);border-radius:50%;width:26px;height:26px;animation:.9s linear infinite o0mAxG_dsh-imagegen-templates-spin}@keyframes o0mAxG_dsh-imagegen-templates-spin{to{transform:rotate(360deg)}}.o0mAxG_grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px;display:grid}.o0mAxG_card{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);cursor:pointer;text-align:left;color:var(--dsw-alias-label-primary);border-radius:11px;flex-direction:column;gap:0;padding:0;font-family:inherit;transition:border-color .15s,transform .15s;display:flex;overflow:hidden}.o0mAxG_card:hover{border-color:var(--dsw-alias-brand-primary);transform:translateY(-1px)}.o0mAxG_thumbWrap{aspect-ratio:1;background:var(--dsw-alias-bg-layer-2);width:100%;display:block;position:relative}.o0mAxG_thumb{object-fit:cover;width:100%;height:100%;display:block}.o0mAxG_thumbPlaceholder{width:100%;height:100%;color:var(--dsw-alias-label-dimmed);justify-content:center;align-items:center;display:flex}.o0mAxG_featuredBadge{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-bg-base);border-radius:999px;padding:2px 8px;font-size:11px;font-weight:600;position:absolute;top:8px;left:8px}.o0mAxG_cardBody{flex-direction:column;gap:4px;min-width:0;padding:9px 11px 10px;display:flex}.o0mAxG_cardTitle{-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12.5px;font-weight:600;line-height:1.35;display:-webkit-box;overflow:hidden}.o0mAxG_cardMeta{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;font-size:11px;display:flex}.o0mAxG_cardCategory{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 7px}.o0mAxG_cardSource{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.o0mAxG_footer{border-top:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:space-between;align-items:center;gap:10px;padding:9px 18px;display:flex}.o0mAxG_attribution{color:var(--dsw-alias-label-dimmed);min-width:0;font-size:11.5px}.o0mAxG_sourceLink{color:var(--dsw-alias-brand-primary);white-space:nowrap;flex:none;font-size:11.5px;font-weight:600;text-decoration:none}.o0mAxG_sourceLink:hover{text-decoration:underline}.o0mAxG_detailOverlay{background:var(--dsw-alias-bg-mask-1);justify-content:center;align-items:center;padding:34px;display:flex;position:absolute;inset:0}.o0mAxG_detail{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:14px;grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(0,5fr) minmax(0,4fr);gap:0;width:min(980px,100%);max-height:100%;display:grid;overflow:hidden;box-shadow:0 18px 60px #00000052}.o0mAxG_detailMedia{background:var(--dsw-alias-bg-layer-2);justify-content:center;align-items:center;min-height:0;display:flex;overflow:hidden}.o0mAxG_detailImage{object-fit:contain;width:100%;height:100%;display:block}.o0mAxG_detailInfo{flex-direction:column;gap:10px;min-height:0;padding:18px;display:flex;overflow-y:auto}.o0mAxG_detailTitle{margin:0;font-size:15px;font-weight:650;line-height:1.4}.o0mAxG_detailMeta{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:center;gap:8px;font-size:12px;display:flex}.o0mAxG_detailLink{color:var(--dsw-alias-brand-primary);text-overflow:ellipsis;white-space:nowrap;text-decoration:none;overflow:hidden}.o0mAxG_detailLink:hover{text-decoration:underline}.o0mAxG_detailPrompt{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-height:0;color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;user-select:text;border-radius:10px;flex:1;margin:0;padding:12px;font-family:inherit;font-size:12.5px;line-height:1.6;overflow-y:auto}.o0mAxG_detailActions{background:var(--dsw-alias-bg-base);border-top:1px solid var(--dsw-alias-border-l1);flex:none;gap:8px;margin:0 -18px -18px;padding:12px 18px;display:flex;position:sticky;bottom:0}@media (width<=760px){.o0mAxG_detail{grid-template-rows:minmax(0,3fr) minmax(0,4fr);grid-template-columns:1fr}}";
913
1055
  const tagId$3 = "@dickpy/dsh-imagegen/templates.module.css";
914
1056
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
915
1057
  const tag = document.createElement("style");
@@ -919,47 +1061,47 @@ window.__ModuleLoader__.load({
919
1061
  document.head.appendChild(tag);
920
1062
  }
921
1063
  var templates_module_css_default = {
922
- "cardTitle": "APm5zW_cardTitle",
923
- "categoryPill": "APm5zW_categoryPill",
924
- "spinner": "APm5zW_spinner",
925
- "categoryRow": "APm5zW_categoryRow",
926
- "cardSource": "APm5zW_cardSource",
927
- "detailMedia": "APm5zW_detailMedia",
928
- "thumbWrap": "APm5zW_thumbWrap",
929
- "heading": "APm5zW_heading",
930
- "dsh-imagegen-templates-spin": "APm5zW_dsh-imagegen-templates-spin",
931
- "attribution": "APm5zW_attribution",
932
- "grid": "APm5zW_grid",
933
- "meta": "APm5zW_meta",
934
- "body": "APm5zW_body",
935
- "detailTitle": "APm5zW_detailTitle",
936
- "state": "APm5zW_state",
937
- "sourceLink": "APm5zW_sourceLink",
938
- "cardCategory": "APm5zW_cardCategory",
939
- "thumbPlaceholder": "APm5zW_thumbPlaceholder",
940
- "cardMeta": "APm5zW_cardMeta",
941
- "search": "APm5zW_search",
942
- "detailOverlay": "APm5zW_detailOverlay",
943
- "detailImage": "APm5zW_detailImage",
944
- "detailMeta": "APm5zW_detailMeta",
945
- "detailPrompt": "APm5zW_detailPrompt",
946
- "headerActions": "APm5zW_headerActions",
947
- "shell": "APm5zW_shell",
948
- "detailLink": "APm5zW_detailLink",
949
- "detailActions": "APm5zW_detailActions",
950
- "cardBody": "APm5zW_cardBody",
951
- "header": "APm5zW_header",
952
- "overlay": "APm5zW_overlay",
953
- "notice": "APm5zW_notice",
954
- "title": "APm5zW_title",
955
- "toolbar": "APm5zW_toolbar",
956
- "detailInfo": "APm5zW_detailInfo",
957
- "detail": "APm5zW_detail",
958
- "card": "APm5zW_card",
959
- "footer": "APm5zW_footer",
960
- "close": "APm5zW_close",
961
- "thumb": "APm5zW_thumb",
962
- "featuredBadge": "APm5zW_featuredBadge"
1064
+ "categoryRow": "o0mAxG_categoryRow",
1065
+ "headerActions": "o0mAxG_headerActions",
1066
+ "state": "o0mAxG_state",
1067
+ "detailLink": "o0mAxG_detailLink",
1068
+ "toolbar": "o0mAxG_toolbar",
1069
+ "card": "o0mAxG_card",
1070
+ "cardCategory": "o0mAxG_cardCategory",
1071
+ "categoryPill": "o0mAxG_categoryPill",
1072
+ "thumbPlaceholder": "o0mAxG_thumbPlaceholder",
1073
+ "spinner": "o0mAxG_spinner",
1074
+ "thumbWrap": "o0mAxG_thumbWrap",
1075
+ "sourceLink": "o0mAxG_sourceLink",
1076
+ "featuredBadge": "o0mAxG_featuredBadge",
1077
+ "footer": "o0mAxG_footer",
1078
+ "search": "o0mAxG_search",
1079
+ "cardBody": "o0mAxG_cardBody",
1080
+ "cardSource": "o0mAxG_cardSource",
1081
+ "detailOverlay": "o0mAxG_detailOverlay",
1082
+ "detailInfo": "o0mAxG_detailInfo",
1083
+ "detailTitle": "o0mAxG_detailTitle",
1084
+ "detailActions": "o0mAxG_detailActions",
1085
+ "body": "o0mAxG_body",
1086
+ "attribution": "o0mAxG_attribution",
1087
+ "cardMeta": "o0mAxG_cardMeta",
1088
+ "heading": "o0mAxG_heading",
1089
+ "thumb": "o0mAxG_thumb",
1090
+ "detailPrompt": "o0mAxG_detailPrompt",
1091
+ "grid": "o0mAxG_grid",
1092
+ "shell": "o0mAxG_shell",
1093
+ "overlay": "o0mAxG_overlay",
1094
+ "header": "o0mAxG_header",
1095
+ "meta": "o0mAxG_meta",
1096
+ "close": "o0mAxG_close",
1097
+ "cardTitle": "o0mAxG_cardTitle",
1098
+ "notice": "o0mAxG_notice",
1099
+ "detailImage": "o0mAxG_detailImage",
1100
+ "title": "o0mAxG_title",
1101
+ "dsh-imagegen-templates-spin": "o0mAxG_dsh-imagegen-templates-spin",
1102
+ "detailMedia": "o0mAxG_detailMedia",
1103
+ "detail": "o0mAxG_detail",
1104
+ "detailMeta": "o0mAxG_detailMeta"
963
1105
  };
964
1106
  //#endregion
965
1107
  //#region src/client/TemplateLibrary.tsx
@@ -1492,7 +1634,7 @@ window.__ModuleLoader__.load({
1492
1634
  constructor(api, spec) {
1493
1635
  this.api = api;
1494
1636
  this.spec = spec;
1495
- this.store = (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)({
1637
+ this.store = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)({
1496
1638
  status: "loading",
1497
1639
  value: void 0,
1498
1640
  base: void 0,
@@ -1501,8 +1643,8 @@ window.__ModuleLoader__.load({
1501
1643
  writable: false,
1502
1644
  mode: "host"
1503
1645
  });
1504
- this.keySet = (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)(false);
1505
- this.secretSets = (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)({});
1646
+ this.keySet = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(false);
1647
+ this.secretSets = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)({});
1506
1648
  }
1507
1649
  getSnapshot() {
1508
1650
  return this.store.getSnapshot();
@@ -1543,6 +1685,9 @@ window.__ModuleLoader__.load({
1543
1685
  path: [field]
1544
1686
  }]));
1545
1687
  }
1688
+ mutate(ops, expectedRevision) {
1689
+ return this.enqueue(() => this.writeOps([...ops], expectedRevision));
1690
+ }
1546
1691
  /** Apply several path ops in one revision-fenced mutate call (atomic save).
1547
1692
  * Path ops may address plain-object fields (e.g. `channelSecrets.<id>`),
1548
1693
  * but never navigate *inside* arrays — write array fields wholesale. */
@@ -1591,8 +1736,8 @@ window.__ModuleLoader__.load({
1591
1736
  }
1592
1737
  this.accept(view, writable);
1593
1738
  }
1594
- async writeOps(ops) {
1595
- const revision = this.getSnapshot().revision;
1739
+ async writeOps(ops, expectedRevision) {
1740
+ const revision = expectedRevision ?? this.getSnapshot().revision;
1596
1741
  let response;
1597
1742
  try {
1598
1743
  response = await this.api.mutate({
@@ -1797,8 +1942,8 @@ window.__ModuleLoader__.load({
1797
1942
  /** Document event used to bridge chat tool results into the image workspace. */
1798
1943
  const CHAT_IMAGE_EVENT = "dsh-imagegen:chat-images";
1799
1944
  //#endregion
1800
- //#region \0dsh-css:D:\learn\dsh\dsh-imagegen\src\client\panel.module.css.mjs
1801
- const css$2 = "[data-pane=conversation],[class*=centerCol]{min-width:0;min-height:0;position:relative}[data-dsh-imagegen-view]{z-index:60;background:var(--dsw-alias-bg-base);grid-area:1/1;min-width:0;min-height:0;display:none;position:relative}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane=conversation],html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*=centerCol]{grid-template-columns:minmax(0, 1fr) 8px minmax(320px, clamp(320px, var(--dsh-imagegen-chat-width,36%), 70%));background:var(--dsw-alias-border-l1);grid-template-rows:minmax(0,1fr);gap:1px;overflow:hidden;display:grid!important}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-dsh-imagegen-view]{display:block}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-slot=conversation]{background:var(--dsw-alias-bg-base);grid-area:1/3;align-items:stretch;width:auto;min-width:0;min-height:0;overflow:hidden;display:flex!important}html[data-dsh-imagegen-active] [data-slot=conversation]>[data-phase]{flex:auto;align-self:stretch;width:100%;min-width:0;max-width:none}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-dsh-imagegen-chat-resizer]{grid-area:1/2}.kUIMeq_chatResizer{z-index:70;width:8px;min-width:8px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-border-l1);cursor:col-resize;touch-action:none;justify-content:center;align-items:center;display:none;position:relative}.kUIMeq_chatResizer:before{content:\"\";opacity:.55;background:currentColor;border-radius:3px;width:3px;height:36px}.kUIMeq_chatResizer:hover,.kUIMeq_chatResizer:focus-visible{color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);outline:none}html[data-dsh-imagegen-active] [data-dsh-imagegen-chat-resizer]{display:flex!important}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane=conversation]>:not([data-dsh-imagegen-view]):not([data-slot=conversation]):not([data-dsh-imagegen-chat-resizer]),html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*=centerCol]>:not([data-dsh-imagegen-view]):not([data-slot=conversation]):not([data-dsh-imagegen-chat-resizer]),html[data-dsh-imagegen-active] [data-dsh-imagegen-sidebar-root]>:not([data-dsh-imagegen-session-tabs]):not([class*=logoRow]):not([class*=regionArea]):not([class*=footArea]){display:none!important}@media (width<=760px){html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane=conversation],html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*=centerCol]{grid-template-rows:minmax(0,1fr) minmax(340px,.9fr);grid-template-columns:minmax(0,1fr);overflow-y:auto}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-slot=conversation]{grid-area:2/1}html[data-dsh-imagegen-active] [data-dsh-imagegen-chat-resizer]{display:none!important}}.kUIMeq_entry{width:100%;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:0 12px;font-size:13px;display:flex}.kUIMeq_entry:hover{background:var(--dsw-specific-sidebar-nav-item-hover);color:var(--dsw-alias-label-primary)}.kUIMeq_entry[data-active]{background:var(--dsw-specific-sidebar-nav-item-active);color:var(--dsw-alias-label-primary);font-weight:600}.kUIMeq_entryIcon{flex:none;justify-content:center;align-items:center;display:inline-flex}.kUIMeq_entryLabel{text-overflow:ellipsis;overflow:hidden}.kUIMeq_sessionTabs{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:9px;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:2px;width:100%;min-width:0;padding:3px;display:grid}.kUIMeq_sessionTab{min-width:0;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;white-space:nowrap;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;gap:6px;padding:0 8px;font-size:12px;display:inline-flex}.kUIMeq_sessionTab:hover,.kUIMeq_sessionTab[data-active]{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-sidebar-nav-item-active)}.kUIMeq_sessionTabIcon{flex:none;justify-content:center;align-items:center;display:inline-flex}.kUIMeq_sessionTabLabel{text-overflow:ellipsis;min-width:0;overflow:hidden}[class*=regionArea]{min-height:0;position:relative}.kUIMeq_sidebarHistoryHost{z-index:30;background:var(--dsw-alias-bg-base);min-width:0;min-height:0;padding:6px 4px;display:none;position:absolute;inset:0;overflow:hidden}html[data-dsh-imagegen-active] .kUIMeq_sidebarHistoryHost{display:flex}.kUIMeq_sidebarHistoryHost .kUIMeq_history{background:0 0;border:0;border-radius:8px;width:100%;height:100%}[data-dsh-frame][data-sidebar-collapsed] .kUIMeq_sidebarHistoryHost{display:none}[data-dsh-frame][data-sidebar-collapsed] .kUIMeq_entry{justify-content:center;width:100%;padding:0}[data-dsh-frame][data-sidebar-collapsed] .kUIMeq_entryLabel{display:none}.kUIMeq_view{width:100%;min-width:0;min-height:0;overflow:hidden}.kUIMeq_panel,.kUIMeq_panel *,.kUIMeq_panel :before,.kUIMeq_panel :after{box-sizing:border-box}.kUIMeq_panel{background:var(--dsw-alias-bg-base);min-width:0;height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:10px;padding:14px 16px 16px;display:flex;position:relative;overflow:hidden}.kUIMeq_panelHeader{flex:none;justify-content:space-between;align-items:center;gap:12px;display:flex}.kUIMeq_panelHeading{align-items:baseline;gap:10px;min-width:0;display:flex}.kUIMeq_panelTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;margin:0;font-size:16px;font-weight:700}.kUIMeq_githubLink{width:22px;height:22px;color:var(--dsw-alias-label-secondary);border-radius:6px;flex:none;justify-content:center;align-items:center;text-decoration:none;transition:color .12s,background .12s;display:inline-flex}.kUIMeq_githubLink:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.kUIMeq_connectionStatus{border:1px solid var(--dsw-alias-label-error);height:28px;color:var(--dsw-alias-label-error);font:inherit;white-space:nowrap;background:0 0;border-radius:8px;flex:none;align-items:center;gap:6px;padding:0 10px;font-size:12px;line-height:1;display:inline-flex}.kUIMeq_connectionStatus[data-connected=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.kUIMeq_connectionDot{background:currentColor;border-radius:50%;width:6px;height:6px}.kUIMeq_updateBanner{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);overflow-wrap:anywhere;border-radius:10px;flex:none;justify-content:space-between;align-items:center;gap:12px;padding:7px 10px 7px 12px;font-size:12px;line-height:1.5;display:flex}.kUIMeq_updateBanner[data-kind=ok]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}.kUIMeq_updateText{min-width:0}.kUIMeq_updateActions{flex:none;align-items:center;gap:10px;display:inline-flex}.kUIMeq_updateRelease{color:inherit;text-underline-offset:2px;white-space:nowrap;text-decoration:underline}@media (width<=700px){.kUIMeq_panelHeader{align-items:flex-start}.kUIMeq_panelHeading{flex-direction:column;align-items:flex-start;gap:2px}.kUIMeq_updateBanner{flex-direction:column;align-items:flex-start}.kUIMeq_updateActions{justify-content:space-between;width:100%}}.kUIMeq_studio{flex:1;min-width:0;min-height:0;display:flex}.kUIMeq_generation{gap:14px;width:100%;min-width:0;min-height:0;display:flex}.kUIMeq_config{flex-direction:column;flex:none;gap:12px;width:min(300px,42%);min-width:220px;max-width:300px;height:100%;min-height:0;display:flex;overflow:hidden}.kUIMeq_configScroll{scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l2) transparent;flex-direction:column;flex:1;gap:12px;min-height:0;padding-right:2px;display:flex;overflow-y:auto}.kUIMeq_configScroll::-webkit-scrollbar{width:8px}.kUIMeq_configScroll::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:999px}.kUIMeq_canvas{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.kUIMeq_taskTray{z-index:6;border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 92%, transparent);backdrop-filter:blur(10px);border-radius:9px;flex-direction:column;width:min(360px,100% - 24px);max-height:calc(100% - 24px);display:flex;position:absolute;top:12px;right:12px;overflow:hidden;box-shadow:0 8px 24px #0000001f}.kUIMeq_taskTray[data-open=false]{width:auto;max-width:calc(100% - 24px)}.kUIMeq_taskTrayHeader{min-height:34px;color:var(--dsw-alias-label-primary);border-bottom:1px solid var(--dsw-alias-border-l1);align-items:stretch;font-size:12px;font-weight:600;display:flex}.kUIMeq_taskTray[data-open=false] .kUIMeq_taskTrayHeader{border-bottom:0}.kUIMeq_taskTrayToggle{min-width:0;color:inherit;cursor:pointer;font:inherit;font-size:inherit;font-weight:inherit;text-align:left;background:0 0;border:0;flex:1;align-items:center;gap:8px;padding:8px 10px;display:flex}.kUIMeq_taskTrayToggle:hover{background:var(--dsw-alias-bg-layer-2)}.kUIMeq_taskTrayCount{min-width:18px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);text-align:center;border-radius:999px;padding:1px 5px;font-size:11px;font-weight:500}.kUIMeq_taskTrayChevron{color:var(--dsw-alias-label-tertiary);margin-left:auto;font-size:12px;font-weight:400}.kUIMeq_taskTrayClose{border:0;border-left:1px solid var(--dsw-alias-border-l1);width:32px;color:var(--dsw-alias-label-tertiary);cursor:pointer;font:inherit;background:0 0;font-size:17px}.kUIMeq_taskTrayClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.kUIMeq_taskTray[data-open=false] .kUIMeq_taskTrayToggle{min-height:34px}.kUIMeq_taskRows{min-height:0;overflow-y:auto}.kUIMeq_taskTray[data-open=false] .kUIMeq_taskRows{display:none}.kUIMeq_taskRow{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:7px;padding:7px 10px;display:grid}.kUIMeq_taskRow:first-of-type{border-top:0}.kUIMeq_taskStatus{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px}.kUIMeq_taskRow[data-status=running] .kUIMeq_taskStatus{color:var(--dsw-alias-brand-primary)}.kUIMeq_taskRow[data-status=failed] .kUIMeq_taskStatus{color:var(--dsw-alias-label-error)}.kUIMeq_taskPrompt{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.kUIMeq_taskRow button{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;font:inherit;border:0;border-radius:5px;padding:2px 7px;font-size:11px}.kUIMeq_taskRow button:hover{color:var(--dsw-alias-brand-primary)}.kUIMeq_configGuide{z-index:1100;background:#00000059;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.kUIMeq_configGuideBody{border:1px solid var(--dsw-alias-border-l2);width:min(360px,100%);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border-radius:10px;flex-direction:column;gap:12px;padding:18px;display:flex;box-shadow:0 14px 40px #0003}.kUIMeq_configGuideBody span{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55}.kUIMeq_configGuideBody button{min-height:30px;color:var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-brand-primary);cursor:pointer;font:inherit;border:0;border-radius:7px;align-self:flex-end;padding:0 12px;font-size:12px}.kUIMeq_history{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;flex-direction:column;width:auto;min-width:0;max-width:none;min-height:0;display:flex;overflow:hidden}.kUIMeq_historyHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:space-between;align-items:center;gap:8px;padding:10px 12px;display:flex}.kUIMeq_historyFilters{border-bottom:1px solid var(--dsw-alias-border-l1);grid-template-columns:1fr 1fr;gap:6px;padding:8px 10px;display:grid}.kUIMeq_historySearch,.kUIMeq_historyFilters select,.kUIMeq_gallerySearch{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);min-width:0;min-height:29px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:7px;padding:0 8px;font-size:11px}.kUIMeq_historySearch{grid-column:1/-1}.kUIMeq_gallerySearch{width:156px}.kUIMeq_galleryTagInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:130px;min-height:29px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:7px;padding:0 8px;font-size:11px}.kUIMeq_galleryBulkButton{border:1px solid var(--dsw-alias-border-l2);min-height:29px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;font:inherit;border-radius:7px;padding:0 8px;font-size:11px}.kUIMeq_galleryBulkButton:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.kUIMeq_galleryBulkButton:disabled{opacity:.45;cursor:default}.kUIMeq_historyTitle{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.kUIMeq_historyClear{font:inherit;color:var(--dsw-alias-label-tertiary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:999px;padding:2px 8px;font-size:11.5px}.kUIMeq_historyClear:hover{color:var(--dsw-alias-label-error);border-color:var(--dsw-alias-label-error)}.kUIMeq_historyList{scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l2) transparent;flex-direction:column;flex:1;gap:8px;min-height:0;padding:10px;display:flex;overflow-y:auto}.kUIMeq_historyList::-webkit-scrollbar{width:8px}.kUIMeq_historyList::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:999px}.kUIMeq_historyEmpty{text-align:center;color:var(--dsw-alias-label-tertiary);flex:1;justify-content:center;align-items:center;padding:20px;font-size:12px;line-height:1.6;display:flex}.kUIMeq_historyItem{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:10px;flex-direction:column;flex:none;gap:6px;padding:8px;display:flex}.kUIMeq_historyItem:hover{border-color:var(--dsw-alias-border-l2)}.kUIMeq_historyItem[data-active]{border-color:var(--dsw-alias-brand-primary)}.kUIMeq_historyMain{font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:flex-start;gap:8px;min-width:0;padding:0;display:flex}.kUIMeq_historyThumb{object-fit:cover;background:var(--dsw-alias-bg-base);border-radius:8px;flex:none;width:52px;height:52px}.kUIMeq_historyThumbPlaceholder{background:var(--dsw-alias-bg-layer-3);border-radius:8px;flex:none;width:52px;height:52px}.kUIMeq_historyInfo{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.kUIMeq_historyPrompt{color:var(--dsw-alias-label-primary);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:1.4;display:-webkit-box;overflow:hidden}.kUIMeq_historyMeta{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.kUIMeq_historyActions{justify-content:flex-end;gap:6px;display:flex}.kUIMeq_historyAction{font:inherit;color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:999px;padding:2px 8px;font-size:11.5px}.kUIMeq_historyAction:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed)}.kUIMeq_historyAction[data-danger]:hover{color:var(--dsw-alias-label-error);border-color:var(--dsw-alias-label-error)}.kUIMeq_card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;flex-direction:column;flex:none;gap:10px;padding:12px;display:flex}.kUIMeq_modeRow{align-items:center;gap:8px;display:flex}.kUIMeq_modePill{flex:1;justify-content:center;height:28px;font-size:13px}.kUIMeq_uploadBox{min-height:128px;color:var(--dsw-alias-label-secondary);border:1.5px dashed var(--dsw-alias-border-l2);cursor:pointer;font:inherit;text-align:center;background:0 0;border-radius:12px;flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:16px;font-size:12.5px;display:flex}.kUIMeq_uploadBox:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed);background:var(--dsw-alias-interactive-bg-hover)}.kUIMeq_uploadBox:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.kUIMeq_uploadIcon{color:var(--dsw-alias-label-tertiary);display:inline-flex}.kUIMeq_uploadHint{color:var(--dsw-alias-label-tertiary);font-size:11px}.kUIMeq_reference{flex-direction:column;gap:8px;display:flex}.kUIMeq_referenceImage{object-fit:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;width:100%;max-height:176px}.kUIMeq_referenceActions{gap:8px;display:flex}.kUIMeq_hiddenFile{display:none}.kUIMeq_prompt{width:100%;min-height:120px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);resize:vertical;box-sizing:border-box;border-radius:10px;outline:none;padding:10px 12px;font-family:inherit;font-size:13px;line-height:1.6}.kUIMeq_prompt:focus-visible{border-color:var(--dsw-alias-brand-primary)}.kUIMeq_prompt::placeholder{color:var(--dsw-alias-label-tertiary)}.kUIMeq_promptFooter{justify-content:space-between;align-items:center;gap:8px;margin-top:-6px;display:flex}.kUIMeq_templatesButton{border:1px solid var(--dsw-alias-brand-primary);background:linear-gradient(135deg, color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent), color-mix(in srgb, var(--dsw-alias-brand-primary) 5%, transparent));height:26px;color:var(--dsw-alias-brand-primary);cursor:pointer;box-shadow:0 1px 0 color-mix(in srgb, var(--dsw-alias-brand-primary) 22%, transparent);border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-family:inherit;font-size:12px;font-weight:600;transition:transform .12s,box-shadow .12s,background .12s;display:inline-flex}.kUIMeq_templatesButton svg{flex:none}.kUIMeq_templatesButton:hover{background:linear-gradient(135deg, color-mix(in srgb, var(--dsw-alias-brand-primary) 24%, transparent), color-mix(in srgb, var(--dsw-alias-brand-primary) 8%, transparent));color:var(--dsw-alias-brand-primary);box-shadow:0 2px 6px color-mix(in srgb, var(--dsw-alias-brand-primary) 30%, transparent);transform:translateY(-1px)}.kUIMeq_templatesButton:active{transform:translateY(0)}.kUIMeq_enhanceButton{border:1px solid var(--dsw-alias-border-l2);height:26px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:999px;margin-left:auto;padding:0 11px;font-size:12px}.kUIMeq_enhanceButton:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.kUIMeq_enhanceButton:disabled{opacity:.5;cursor:default}.kUIMeq_promptCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:11px}.kUIMeq_paramGroup{flex-direction:column;gap:8px;display:flex}.kUIMeq_paramLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}.kUIMeq_optionRow{flex-wrap:wrap;gap:6px;display:flex}.kUIMeq_optionGrid{grid-template-columns:repeat(3,1fr);gap:6px;display:grid}.kUIMeq_optionPill{justify-content:center}.kUIMeq_paramHint{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45}.kUIMeq_footer{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;flex:none;align-items:stretch;gap:8px;padding:10px 2px 0 0;display:flex}.kUIMeq_modelWrap{flex-direction:column;gap:5px;min-width:0;display:flex}.kUIMeq_modelLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}.kUIMeq_modelSelect{width:100%;height:36px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;text-align:left;border-radius:18px;outline:none;justify-content:space-between;align-items:center;gap:8px;padding:0 12px;font-family:inherit;font-size:13px;display:flex}.kUIMeq_modelSelect:focus-visible{border-color:var(--dsw-alias-brand-primary)}.kUIMeq_modelSelect:disabled{opacity:.55;cursor:default}.kUIMeq_modelMenu{min-width:0;display:block;position:relative}.kUIMeq_modelMenuList{z-index:40;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;flex-direction:column;padding:4px;display:flex;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow:hidden;box-shadow:0 -8px 24px #0000002e}.kUIMeq_modelMenuItem{width:100%;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;white-space:nowrap;text-overflow:ellipsis;background:0 0;border:none;border-radius:8px;padding:7px 10px;font-size:13px;display:block;overflow:hidden}.kUIMeq_modelMenuItem:hover{background:var(--dsw-alias-bg-hover)}.kUIMeq_modelMenuItem[data-selected]{color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-1);font-weight:600}.kUIMeq_generateButton{width:100%}.kUIMeq_generateInner{align-items:center;gap:7px;display:inline-flex}.kUIMeq_canvasState{text-align:center;color:var(--dsw-alias-label-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;display:flex}.kUIMeq_canvasStateTitle{color:var(--dsw-alias-label-secondary);font-size:14px;font-weight:600}.kUIMeq_canvasStateHint{max-width:380px;font-size:12px;line-height:1.6}.kUIMeq_canvasEmptyIcon{color:var(--dsw-alias-label-tertiary);margin-bottom:4px;display:inline-flex}.kUIMeq_canvasError{color:var(--dsw-alias-label-error);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-label-error);overflow-wrap:anywhere;border-radius:10px;flex:none;margin:14px;padding:10px 14px;font-size:12.5px;line-height:1.6}.kUIMeq_canvasBody{scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l2) transparent;flex-direction:column;flex:1;gap:10px;min-height:0;padding:14px;display:flex;overflow-y:auto}.kUIMeq_canvasBody::-webkit-scrollbar{width:8px}.kUIMeq_canvasBody::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:999px}.kUIMeq_canvasMeta{color:var(--dsw-alias-label-tertiary);flex:none;align-items:center;gap:8px;font-size:12px;display:flex}.kUIMeq_canvasHistoryTag{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px}.kUIMeq_grid{flex:1;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;min-height:0;display:grid}.kUIMeq_grid[data-count=\"1\"] .kUIMeq_imageCard{grid-area:1/1/3/3}.kUIMeq_imageCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);cursor:zoom-in;border-radius:12px;flex-direction:column;min-height:0;margin:0;display:flex;position:relative;overflow:hidden}.kUIMeq_imageCard:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.kUIMeq_image{object-fit:cover;background:var(--dsw-alias-bg-base);flex:1;width:100%;min-height:0;display:block}.kUIMeq_imageCaption{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;border-top:1px solid var(--dsw-alias-border-l1);padding:7px 10px;font-size:11px;line-height:1.5;overflow:hidden}.kUIMeq_download{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);border:1px solid var(--dsw-alias-border-l2);opacity:0;backdrop-filter:blur(4px);border-radius:999px;padding:2px 10px;font-size:12px;font-weight:500;line-height:20px;text-decoration:none;transition:opacity .12s;position:absolute;top:8px;right:8px}.kUIMeq_imageCard:hover .kUIMeq_download{opacity:1}.kUIMeq_download:hover{background:var(--dsw-alias-bg-base)}.kUIMeq_galleryAdd{font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;opacity:0;backdrop-filter:blur(4px);border-radius:999px;align-items:center;gap:5px;padding:2px 10px;font-size:12px;font-weight:500;line-height:20px;transition:opacity .12s;display:inline-flex;position:absolute;top:8px;left:8px}.kUIMeq_imageCard:hover .kUIMeq_galleryAdd{opacity:1}.kUIMeq_galleryAdd:hover{background:var(--dsw-alias-bg-base)}.kUIMeq_galleryAdd:disabled{opacity:.4;cursor:default}.kUIMeq_conversationAdd{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);cursor:pointer;font:inherit;opacity:0;backdrop-filter:blur(4px);border-radius:999px;align-items:center;gap:5px;padding:2px 10px;font-size:12px;font-weight:500;line-height:20px;transition:opacity .12s;display:inline-flex;position:absolute;top:38px;left:8px}.kUIMeq_imageCard:hover .kUIMeq_conversationAdd,.kUIMeq_conversationAdd:focus-visible{opacity:1}.kUIMeq_conversationAdd:hover{background:var(--dsw-alias-bg-base)}.kUIMeq_conversationAdd:disabled{opacity:.4;cursor:default}.kUIMeq_zoomHint{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);border:1px solid var(--dsw-alias-border-l2);opacity:0;backdrop-filter:blur(4px);pointer-events:none;border-radius:999px;align-items:center;gap:5px;padding:2px 10px;font-size:12px;font-weight:500;line-height:20px;transition:opacity .12s;display:inline-flex;position:absolute;bottom:8px;left:8px}.kUIMeq_imageCard:hover .kUIMeq_zoomHint{opacity:1}.kUIMeq_spinner,.kUIMeq_bigSpinner{border:2px solid;border-top-color:#0000;border-radius:50%;flex:none;animation:.8s linear infinite kUIMeq_dshImageGenSpin;display:inline-block}.kUIMeq_spinner{width:11px;height:11px}.kUIMeq_bigSpinner{width:30px;height:30px;color:var(--dsw-alias-state-business-primary);border-width:3px;margin-bottom:6px}.kUIMeq_lightbox{z-index:1000;backdrop-filter:blur(6px);background:#000000b8;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.kUIMeq_lightboxClose{color:#fff;cursor:pointer;background:#ffffff24;border:1px solid #ffffff47;border-radius:50%;justify-content:center;align-items:center;width:38px;height:38px;display:inline-flex;position:absolute;top:16px;right:16px}.kUIMeq_lightboxClose:hover{background:#ffffff42}.kUIMeq_lightboxNav{color:#fff;cursor:pointer;background:#ffffff24;border:1px solid #ffffff47;border-radius:50%;justify-content:center;align-items:center;width:42px;height:42px;display:inline-flex;position:absolute;top:50%;transform:translateY(-50%)}.kUIMeq_lightboxNav:hover{background:#ffffff42}.kUIMeq_lightboxNav[data-dir=prev]{left:max(20px,50% - 640px)}.kUIMeq_lightboxNav[data-dir=next]{right:max(20px,50% - 640px)}.kUIMeq_lightboxFigure{flex-direction:column;gap:10px;width:min(1100px,100vw - 160px);max-width:min(1100px,100vw - 160px);height:min(820px,100vh - 48px);min-height:0;margin:0;display:flex}.kUIMeq_lightboxStage{background:#ffffff0a;border-radius:10px;flex:1;min-height:0;position:relative;overflow:auto}.kUIMeq_lightboxScaleFrame{justify-content:center;align-items:center;min-width:100%;min-height:100%;display:flex}.kUIMeq_lightboxImage{object-fit:contain;border-radius:10px;max-width:100%;max-height:100%;display:block;box-shadow:0 24px 80px #00000080}.kUIMeq_lightboxTools{justify-content:center;align-items:center;gap:6px;display:flex}.kUIMeq_lightboxTool,.kUIMeq_lightboxZoomLevel,.kUIMeq_lightboxCopy{color:#fff;cursor:pointer;background:#ffffff24;border:1px solid #ffffff47;justify-content:center;align-items:center;display:inline-flex}.kUIMeq_lightboxTool,.kUIMeq_lightboxZoomLevel{height:32px}.kUIMeq_lightboxTool{border-radius:50%;width:32px}.kUIMeq_lightboxZoomLevel{min-width:58px;font:inherit;font-variant-numeric:tabular-nums;border-radius:999px;padding:0 9px;font-size:12px}.kUIMeq_lightboxTool:hover,.kUIMeq_lightboxZoomLevel:hover,.kUIMeq_lightboxCopy:hover{background:#ffffff42}.kUIMeq_lightboxCaptionRow{align-items:flex-start;gap:8px;min-width:0;display:flex}.kUIMeq_lightboxCaption{color:#ffffffe6;-webkit-line-clamp:3;-webkit-box-orient:vertical;flex:1;min-width:0;font-size:12px;line-height:1.6;display:-webkit-box;overflow:hidden}.kUIMeq_lightboxCopy{min-height:28px;font:inherit;white-space:nowrap;border-radius:999px;flex:none;gap:5px;padding:4px 9px;font-size:12px}.kUIMeq_lightboxMeta{justify-content:space-between;align-items:center;gap:12px;display:flex}.kUIMeq_lightboxIndex{color:#fffc;font-variant-numeric:tabular-nums;font-size:12px}.kUIMeq_lightboxActions{align-items:center;gap:8px;display:inline-flex}.kUIMeq_lightboxDownload,.kUIMeq_lightboxEdit{font:inherit;color:#fff;cursor:pointer;background:#ffffff24;border:1px solid #ffffff47;border-radius:999px;padding:4px 14px;font-size:12.5px;font-weight:500;text-decoration:none}.kUIMeq_lightboxDownload:hover,.kUIMeq_lightboxEdit:hover{background:#ffffff42}.kUIMeq_lightboxEdit{color:#fff;background:#ffffff24;border:1px solid #ffffff47;border-radius:999px}@media (width<=720px){.kUIMeq_lightbox{padding:16px}.kUIMeq_lightboxFigure{width:calc(100vw - 32px);max-width:none}.kUIMeq_lightboxNav[data-dir=prev]{left:20px}.kUIMeq_lightboxNav[data-dir=next]{right:20px}.kUIMeq_lightboxCaptionRow,.kUIMeq_lightboxMeta{flex-direction:column;align-items:stretch}.kUIMeq_lightboxCopy,.kUIMeq_lightboxActions{align-self:flex-end}}@keyframes kUIMeq_dshImageGenSpin{to{transform:rotate(360deg)}}.kUIMeq_galleryToast{z-index:30;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);border:1px solid var(--dsw-alias-border-l2);backdrop-filter:blur(6px);pointer-events:none;border-radius:999px;align-items:center;gap:7px;padding:6px 16px;font-size:13px;font-weight:500;animation:.16s ease-out kUIMeq_dshImageGenToastIn;display:inline-flex;position:absolute;bottom:24px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #00000038}@keyframes kUIMeq_dshImageGenToastIn{0%{opacity:0;transform:translate(-50%,6px)}to{opacity:1;transform:translate(-50%)}}.kUIMeq_conversationToast{z-index:30;border:1px solid var(--dsw-alias-border-l2);max-width:calc(100% - 32px);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);pointer-events:none;backdrop-filter:blur(6px);border-radius:999px;align-items:center;gap:7px;padding:6px 16px;font-size:13px;font-weight:500;animation:.16s ease-out kUIMeq_dshImageGenToastIn;display:inline-flex;position:absolute;bottom:24px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #00000038}@media (prefers-reduced-motion:reduce){.kUIMeq_download,.kUIMeq_spinner,.kUIMeq_bigSpinner{transition:none;animation-duration:1.5s}}.kUIMeq_config[data-gallery=true] .kUIMeq_configScroll>:not(:first-child),.kUIMeq_config[data-gallery=true] .kUIMeq_footer,.kUIMeq_canvas[data-gallery=true]>.kUIMeq_canvasState,.kUIMeq_canvas[data-gallery=true]>.kUIMeq_canvasError,.kUIMeq_canvas[data-gallery=true]>.kUIMeq_canvasBody,.kUIMeq_studio:has(.kUIMeq_config[data-gallery=true])>.kUIMeq_history{display:none}.kUIMeq_config[data-gallery=true] .kUIMeq_configScroll{flex:none;order:1;display:flex;overflow:visible}.kUIMeq_config[data-gallery=true] .kUIMeq_galleryFilters{flex:1;order:2;min-height:0}.kUIMeq_galleryFilters{padding:18px 14px;overflow:hidden auto}.kUIMeq_galleryFilterHeading{color:var(--dsw-alias-label-tertiary);margin:0 4px 10px;font-size:12px;font-weight:600}.kUIMeq_galleryFilter{width:100%;min-height:34px;color:var(--dsw-alias-label-secondary);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:9px;justify-content:space-between;align-items:center;padding:0 10px;display:flex}.kUIMeq_galleryFilter:hover,.kUIMeq_galleryFilter[data-active]{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent)}.kUIMeq_galleryFilterCount{min-width:20px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);text-align:center;border-radius:999px;padding:1px 6px;font-size:11px}.kUIMeq_galleryFilterDivider{background:var(--dsw-alias-border-l1);height:1px;margin:18px 4px}.kUIMeq_galleryRatioList{flex-wrap:wrap;gap:6px;display:flex}.kUIMeq_galleryRatio{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;border:0;border-radius:999px;padding:6px 10px;font-size:12px}.kUIMeq_galleryRatio[data-active]{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 13%, transparent)}.kUIMeq_galleryTagFilterList{flex-wrap:wrap;gap:6px;display:flex}.kUIMeq_galleryTagFilter{border:1px solid var(--dsw-alias-border-l1);min-width:0;max-width:100%;min-height:27px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;font:inherit;border-radius:6px;align-items:center;gap:5px;padding:0 8px;font-size:11px;display:inline-flex}.kUIMeq_galleryTagFilter span:first-child{text-overflow:ellipsis;white-space:nowrap;max-width:112px;overflow:hidden}.kUIMeq_galleryTagFilter span:last-child{color:var(--dsw-alias-label-tertiary);font-size:10px}.kUIMeq_galleryTagFilter:hover,.kUIMeq_galleryTagFilter[data-active]{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent)}.kUIMeq_galleryFilterNote{color:var(--dsw-alias-label-quaternary);margin:20px 4px 0;font-size:11px;line-height:1.5}.kUIMeq_galleryWorkspace{box-sizing:border-box;flex-direction:column;width:100%;min-width:0;height:100%;min-height:0;padding:22px 24px 26px;display:flex;position:absolute;inset:0;overflow:hidden}.kUIMeq_galleryToolbar{flex:none;justify-content:space-between;align-items:center;gap:16px;min-width:0;margin-bottom:18px;display:flex}.kUIMeq_galleryHeading{color:var(--dsw-alias-label-primary);margin:0;font-size:20px;font-weight:700;display:inline}.kUIMeq_galleryCount{color:var(--dsw-alias-label-tertiary);margin-left:8px;font-size:13px}.kUIMeq_galleryToolbarActions{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.kUIMeq_gallerySelectMode,.kUIMeq_galleryBulkButton,.kUIMeq_gallerySelectionClear{border:1px solid var(--dsw-alias-border-l1);min-height:30px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;font:inherit;border-radius:7px;padding:0 10px;font-size:12px}.kUIMeq_gallerySelectMode:hover,.kUIMeq_gallerySelectMode[data-active],.kUIMeq_galleryBulkButton:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 38%, var(--dsw-alias-border-l1));background:color-mix(in srgb, var(--dsw-alias-brand-primary) 11%, transparent)}.kUIMeq_galleryBulkButton:disabled{cursor:not-allowed;opacity:.45}.kUIMeq_gallerySelectionBar{border:1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 35%, var(--dsw-alias-border-l1));background:color-mix(in srgb, var(--dsw-alias-brand-primary) 7%, var(--dsw-alias-bg-layer-1));border-radius:9px;flex:none;align-items:center;gap:10px;min-width:0;margin:-4px 0 16px;padding:10px 12px;display:flex}.kUIMeq_gallerySelectionBar strong{color:var(--dsw-alias-brand-primary);flex:none;font-size:12px}.kUIMeq_gallerySelectionClear{margin-left:auto}.kUIMeq_gallerySelectionClear:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.kUIMeq_galleryTagInput,.kUIMeq_gallerySearch{border:1px solid var(--dsw-alias-border-l1);min-width:0;height:30px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);font:inherit;border-radius:7px;outline:none;padding:0 10px;font-size:12px}.kUIMeq_galleryTagInput{flex:190px}.kUIMeq_galleryTagInput:focus,.kUIMeq_gallerySearch:focus{border-color:var(--dsw-alias-brand-primary)}.kUIMeq_galleryViewToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:9px;padding:3px;display:flex}.kUIMeq_galleryViewToggle button,.kUIMeq_gallerySort,.kUIMeq_galleryClear{min-height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:7px;padding:0 10px;font-size:12px}.kUIMeq_galleryViewToggle button[data-active],.kUIMeq_galleryViewToggle button:hover,.kUIMeq_gallerySort:hover,.kUIMeq_galleryClear:hover{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 11%, transparent)}.kUIMeq_gallerySort{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1)}.kUIMeq_galleryClear{border:1px solid var(--dsw-alias-border-l1)}.kUIMeq_compareControl{flex-direction:column;gap:6px;margin:0 0 10px;display:flex}.kUIMeq_compareToggle,.kUIMeq_compareModelChoices label{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.kUIMeq_compareToggle input,.kUIMeq_compareModelChoices input{accent-color:var(--dsw-alias-brand-primary)}.kUIMeq_compareModelChoices{flex-wrap:wrap;gap:6px;display:flex}.kUIMeq_compareModelChoices label{border:1px solid var(--dsw-alias-border-l1);border-radius:5px;padding:4px 6px;font-size:10px}.kUIMeq_comparisonBoard{z-index:4;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:8px;flex-direction:column;display:flex;position:absolute;inset:14px;overflow:hidden;box-shadow:0 8px 24px #0000001f}.kUIMeq_comparisonBoard>header{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:center;padding:10px 12px;display:flex}.kUIMeq_comparisonBoard>header div{align-items:baseline;gap:7px;display:flex}.kUIMeq_comparisonBoard>header strong{color:var(--dsw-alias-label-primary);font-size:13px}.kUIMeq_comparisonBoard>header span{color:var(--dsw-alias-label-tertiary);font-size:11px}.kUIMeq_comparisonBoard>header button{border:1px solid var(--dsw-alias-border-l1);min-height:28px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;font:inherit;border-radius:5px;padding:0 9px;font-size:11px}.kUIMeq_comparisonGrid{flex:1;grid-template-rows:minmax(0,1fr);grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;min-height:0;padding:12px;display:grid;overflow:auto}.kUIMeq_comparisonGrid article{flex-direction:column;gap:7px;min-width:0;height:100%;min-height:0;display:flex}.kUIMeq_comparisonGrid article>strong{color:var(--dsw-alias-label-primary);font-size:12px}.kUIMeq_comparisonImageButton{cursor:zoom-in;background:var(--dsw-alias-bg-base);border:0;flex:1;width:100%;min-height:0;padding:0;display:flex;overflow:hidden}.kUIMeq_comparisonImageButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}.kUIMeq_comparisonGrid article>span{min-height:0;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);flex:1;place-items:center;font-size:12px;display:grid}.kUIMeq_comparisonGrid img{object-fit:contain;background:var(--dsw-alias-bg-base);flex:1;width:100%;height:100%;min-height:0;max-height:none;display:block}.kUIMeq_comparisonFullscreen{z-index:1200;background:#000000eb;padding:54px 24px 24px;position:fixed;inset:0;overflow:auto}.kUIMeq_comparisonFullscreenGrid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:18px;min-height:100%;display:grid}.kUIMeq_comparisonFullscreen figure{min-width:0;margin:0}.kUIMeq_comparisonFullscreen figcaption{color:#fff;margin-bottom:8px;font-size:13px;font-weight:600}.kUIMeq_comparisonFullscreen img{background:#111;width:100%;margin-bottom:10px;display:block}.kUIMeq_historyItem[data-comparison]{border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 55%, var(--dsw-alias-border-l1))}.kUIMeq_galleryMasonry{box-sizing:border-box;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l2) transparent;flex:auto;grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:max-content;align-content:start;gap:16px;width:100%;min-width:0;max-width:100%;height:0;min-height:0;padding:2px 8px 16px 2px;display:grid;overflow:hidden scroll}.kUIMeq_galleryMasonry::-webkit-scrollbar{width:8px}.kUIMeq_galleryMasonry::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:999px}.kUIMeq_galleryCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;width:100%;margin:0;display:block;position:relative;overflow:hidden;box-shadow:0 5px 18px #18203612}.kUIMeq_galleryCard[data-selected]{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-brand-primary) 26%, transparent), 0 5px 18px #18203612}.kUIMeq_gallerySelect{z-index:2;cursor:pointer;background:#00000094;border:1px solid #ffffffbf;border-radius:7px;place-items:center;width:26px;height:26px;display:grid;position:absolute;top:9px;right:9px}.kUIMeq_gallerySelect input{width:16px;height:16px;accent-color:var(--dsw-alias-brand-primary);cursor:pointer;margin:0}.kUIMeq_galleryImageButton{background:var(--dsw-alias-bg-base);cursor:zoom-in;border:0;width:100%;padding:0;display:block;position:relative}.kUIMeq_galleryImageButton[data-selecting]{cursor:pointer}.kUIMeq_galleryImage{aspect-ratio:4/3;object-fit:cover;width:100%;display:block}.kUIMeq_galleryMasonry[data-view=masonry] .kUIMeq_galleryCard:nth-child(3n+1) .kUIMeq_galleryImage{aspect-ratio:4/5}.kUIMeq_galleryMasonry[data-view=masonry] .kUIMeq_galleryCard:nth-child(3n+2) .kUIMeq_galleryImage{aspect-ratio:4/3}.kUIMeq_galleryMasonry[data-view=masonry] .kUIMeq_galleryCard:nth-child(3n) .kUIMeq_galleryImage{aspect-ratio:3/4}.kUIMeq_galleryBadge{color:#fff;backdrop-filter:blur(4px);background:#121724c2;border-radius:999px;padding:4px 9px;font-size:11px;position:absolute;top:10px;left:10px}.kUIMeq_galleryCardFooter{align-items:center;gap:9px;min-width:0;padding:10px 12px;display:flex}.kUIMeq_galleryAvatar{color:#fff;background:var(--dsw-alias-brand-primary);border-radius:50%;flex:none;place-items:center;width:27px;height:27px;font-size:12px;font-weight:700;display:grid}.kUIMeq_galleryCardInfo{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.kUIMeq_galleryCardInfo strong,.kUIMeq_galleryCardInfo small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.kUIMeq_galleryCardInfo strong{color:var(--dsw-alias-label-primary);font-size:12px}.kUIMeq_galleryCardInfo small{color:var(--dsw-alias-label-tertiary);font-size:10px}.kUIMeq_galleryTags{flex-wrap:wrap;gap:4px;margin-top:4px;display:flex}.kUIMeq_galleryTags button{max-width:96px;min-height:19px;color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent);cursor:pointer;font:inherit;text-overflow:ellipsis;white-space:nowrap;border:0;border-radius:4px;padding:1px 6px;font-size:10px;line-height:1.35;overflow:hidden}.kUIMeq_galleryTags button:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 17%, transparent)}.kUIMeq_galleryTags .kUIMeq_galleryTagEdit{color:var(--dsw-alias-label-tertiary);background:0 0;flex:none}.kUIMeq_galleryTagEditor{align-items:center;gap:6px;padding:0 12px 10px 48px;display:flex}.kUIMeq_galleryTagEditor input{border:1px solid var(--dsw-alias-border-l2);min-width:0;height:27px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:6px;outline:none;flex:1;padding:0 8px;font-size:11px}.kUIMeq_galleryTagEditor input:focus{border-color:var(--dsw-alias-brand-primary)}.kUIMeq_galleryTagEditor button{border:1px solid var(--dsw-alias-border-l2);height:27px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;font:inherit;border-radius:6px;padding:0 8px;font-size:11px}.kUIMeq_galleryTagEditor button[type=submit]{color:var(--dsw-alias-brand-primary)}.kUIMeq_galleryRemove{width:24px;height:24px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:50%;flex:none;padding:0;font-size:18px}.kUIMeq_galleryRemove:hover{color:var(--dsw-alias-state-error);background:var(--dsw-alias-bg-layer-2)}@media (width<=1100px){.kUIMeq_galleryMasonry{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=760px){.kUIMeq_studio{grid-template-rows:minmax(220px,36%) minmax(0,1fr);grid-template-columns:minmax(0,1fr);overflow-y:auto}.kUIMeq_history{grid-area:1/1;min-height:220px}.kUIMeq_generation{flex-direction:column;grid-area:2/1;min-height:0}.kUIMeq_config{width:auto;max-width:none;height:auto;min-height:0}.kUIMeq_config[data-gallery=true]{flex:none}.kUIMeq_canvas{min-height:560px}.kUIMeq_galleryToolbar{flex-direction:column;align-items:flex-start}.kUIMeq_galleryToolbarActions{flex-wrap:wrap;width:100%}.kUIMeq_galleryMasonry{grid-template-columns:1fr}}";
1945
+ //#region \0dsh-css:E:\dsh-plugin\src\client\panel.module.css.mjs
1946
+ const css$2 = "[data-pane=conversation],[class*=centerCol]{min-width:0;min-height:0;position:relative}[data-dsh-imagegen-view]{z-index:60;background:var(--dsw-alias-bg-base);grid-area:1/1;min-width:0;min-height:0;display:none;position:relative}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane=conversation],html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*=centerCol]{grid-template-columns:minmax(0, 1fr) 8px minmax(320px, clamp(320px, var(--dsh-imagegen-chat-width,36%), 70%));background:var(--dsw-alias-border-l1);grid-template-rows:minmax(0,1fr);gap:1px;overflow:hidden;display:grid!important}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-dsh-imagegen-view]{display:block}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-slot=conversation]{background:var(--dsw-alias-bg-base);grid-area:1/3;align-items:stretch;width:auto;min-width:0;min-height:0;overflow:hidden;display:flex!important}html[data-dsh-imagegen-active] [data-slot=conversation]>[data-phase]{flex:auto;align-self:stretch;width:100%;min-width:0;max-width:none}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-dsh-imagegen-chat-resizer]{grid-area:1/2}.Yvqh9W_chatResizer{z-index:70;width:8px;min-width:8px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-border-l1);cursor:col-resize;touch-action:none;justify-content:center;align-items:center;display:none;position:relative}.Yvqh9W_chatResizer:before{content:\"\";opacity:.55;background:currentColor;border-radius:3px;width:3px;height:36px}.Yvqh9W_chatResizer:hover,.Yvqh9W_chatResizer:focus-visible{color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);outline:none}html[data-dsh-imagegen-active] [data-dsh-imagegen-chat-resizer]{display:flex!important}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane=conversation]>:not([data-dsh-imagegen-view]):not([data-slot=conversation]):not([data-dsh-imagegen-chat-resizer]),html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*=centerCol]>:not([data-dsh-imagegen-view]):not([data-slot=conversation]):not([data-dsh-imagegen-chat-resizer]),html[data-dsh-imagegen-active] [data-dsh-imagegen-sidebar-root]>:not([data-dsh-imagegen-session-tabs]):not([class*=logoRow]):not([class*=regionArea]):not([class*=footArea]){display:none!important}@media (width<=760px){html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane=conversation],html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*=centerCol]{grid-template-rows:minmax(0,1fr) minmax(340px,.9fr);grid-template-columns:minmax(0,1fr);overflow-y:auto}html[data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-slot=conversation]{grid-area:2/1}html[data-dsh-imagegen-active] [data-dsh-imagegen-chat-resizer]{display:none!important}}.Yvqh9W_entry{width:100%;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:0 12px;font-size:13px;display:flex}.Yvqh9W_entry:hover{background:var(--dsw-specific-sidebar-nav-item-hover);color:var(--dsw-alias-label-primary)}.Yvqh9W_entry[data-active]{background:var(--dsw-specific-sidebar-nav-item-active);color:var(--dsw-alias-label-primary);font-weight:600}.Yvqh9W_entryIcon{flex:none;justify-content:center;align-items:center;display:inline-flex}.Yvqh9W_entryLabel{text-overflow:ellipsis;overflow:hidden}.Yvqh9W_sessionTabs{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:9px;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:2px;width:100%;min-width:0;padding:3px;display:grid}.Yvqh9W_sessionTab{min-width:0;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;white-space:nowrap;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;gap:6px;padding:0 8px;font-size:12px;display:inline-flex}[data-sidebar-collapsed] .Yvqh9W_sessionTabs{background:0 0;border:none;border-radius:0;flex-direction:column;gap:6px;width:auto;padding:0;display:flex}[data-sidebar-collapsed] .Yvqh9W_sessionTab{border-radius:9px;width:34px;height:34px;padding:0;font-size:0}[data-sidebar-collapsed] .Yvqh9W_sessionTabLabel{display:none}.Yvqh9W_sessionTab:hover,.Yvqh9W_sessionTab[data-active]{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-sidebar-nav-item-active)}.Yvqh9W_sessionTabIcon{flex:none;justify-content:center;align-items:center;display:inline-flex}.Yvqh9W_sessionTabLabel{text-overflow:ellipsis;min-width:0;overflow:hidden}[class*=regionArea]{min-height:0;position:relative}.Yvqh9W_sidebarHistoryHost{z-index:30;background:var(--dsw-alias-bg-base);min-width:0;min-height:0;padding:6px 4px;display:none;position:absolute;inset:0;overflow:hidden}html[data-dsh-imagegen-active] .Yvqh9W_sidebarHistoryHost{display:flex}.Yvqh9W_sidebarHistoryHost .Yvqh9W_history{background:0 0;border:0;border-radius:8px;width:100%;height:100%}[data-dsh-frame][data-sidebar-collapsed] .Yvqh9W_sidebarHistoryHost{display:none}[data-dsh-frame][data-sidebar-collapsed] .Yvqh9W_entry{justify-content:center;width:100%;padding:0}[data-dsh-frame][data-sidebar-collapsed] .Yvqh9W_entryLabel{display:none}.Yvqh9W_view{width:100%;min-width:0;min-height:0;overflow:hidden}.Yvqh9W_panel,.Yvqh9W_panel *,.Yvqh9W_panel :before,.Yvqh9W_panel :after{box-sizing:border-box}.Yvqh9W_panel{background:var(--dsw-alias-bg-base);min-width:0;height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:10px;padding:14px 16px 16px;display:flex;position:relative;overflow:hidden}.Yvqh9W_panelHeader{flex:none;justify-content:space-between;align-items:center;gap:12px;display:flex;position:relative}.Yvqh9W_panelHeading{align-items:baseline;gap:10px;min-width:0;display:flex}.Yvqh9W_panelTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;margin:0;font-size:16px;font-weight:700}.Yvqh9W_githubLink{width:22px;height:22px;color:var(--dsw-alias-label-secondary);border-radius:6px;flex:none;justify-content:center;align-items:center;text-decoration:none;transition:color .12s,background .12s;display:inline-flex}.Yvqh9W_githubLink:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.Yvqh9W_connectionStatus{border:1px solid var(--dsw-alias-label-error);height:28px;color:var(--dsw-alias-label-error);font:inherit;white-space:nowrap;background:0 0;border-radius:8px;flex:none;align-items:center;gap:6px;padding:0 10px;font-size:12px;line-height:1;display:inline-flex}.Yvqh9W_connectionStatus[data-connected=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.Yvqh9W_connectionDot{background:currentColor;border-radius:50%;width:6px;height:6px}.Yvqh9W_updateBanner{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);overflow-wrap:anywhere;border-radius:10px;flex:none;justify-content:space-between;align-items:center;gap:12px;padding:7px 10px 7px 12px;font-size:12px;line-height:1.5;display:flex}.Yvqh9W_updateBanner[data-kind=ok]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}.Yvqh9W_updateText{min-width:0}.Yvqh9W_updateActions{flex:none;align-items:center;gap:10px;display:inline-flex}.Yvqh9W_updateRelease{color:inherit;text-underline-offset:2px;white-space:nowrap;text-decoration:underline}@media (width<=700px){.Yvqh9W_panelHeader{align-items:flex-start}.Yvqh9W_panelHeading{flex-direction:column;align-items:flex-start;gap:2px}.Yvqh9W_updateBanner{flex-direction:column;align-items:flex-start}.Yvqh9W_updateActions{justify-content:space-between;width:100%}}.Yvqh9W_studio{flex:1;min-width:0;min-height:0;display:flex}.Yvqh9W_generation{gap:14px;width:100%;min-width:0;min-height:0;display:flex}.Yvqh9W_config{width:clamp(240px, var(--dsh-imagegen-config-width,300px), 480px);flex-direction:column;flex:none;gap:12px;min-width:240px;max-width:480px;height:100%;min-height:0;display:flex;position:relative;overflow:hidden}.Yvqh9W_configHeader{flex:none;justify-content:flex-end;min-height:28px;display:flex}.Yvqh9W_configToggle{border:1px solid var(--dsw-alias-border-l1);width:28px;height:28px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;padding:0;display:inline-flex}.Yvqh9W_configToggle:hover,.Yvqh9W_configToggle:focus-visible{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary);outline:none}.Yvqh9W_config[data-collapsed=true]{gap:0;width:38px;min-width:38px;max-width:38px}.Yvqh9W_config[data-collapsed=true] .Yvqh9W_configHeader{justify-content:center}.Yvqh9W_config[data-collapsed=true]>:not(.Yvqh9W_configHeader){display:none}.Yvqh9W_configScroll{scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l2) transparent;flex-direction:column;flex:1;gap:12px;min-height:0;padding-right:2px;display:flex;overflow-y:auto}.Yvqh9W_configScroll::-webkit-scrollbar{width:8px}.Yvqh9W_configScroll::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:999px}.Yvqh9W_canvas{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.Yvqh9W_taskTray{z-index:6;border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 92%, transparent);backdrop-filter:blur(10px);border-radius:9px;flex-direction:column;width:min(360px,100% - 24px);max-height:calc(100% - 24px);display:flex;position:absolute;top:12px;right:12px;overflow:hidden;box-shadow:0 8px 24px #0000001f}.Yvqh9W_taskTray[data-open=false]{width:auto;max-width:calc(100% - 24px)}.Yvqh9W_taskTrayHeader{min-height:34px;color:var(--dsw-alias-label-primary);border-bottom:1px solid var(--dsw-alias-border-l1);align-items:stretch;font-size:12px;font-weight:600;display:flex}.Yvqh9W_taskTray[data-open=false] .Yvqh9W_taskTrayHeader{border-bottom:0}.Yvqh9W_taskTrayToggle{min-width:0;color:inherit;cursor:pointer;font:inherit;font-size:inherit;font-weight:inherit;text-align:left;background:0 0;border:0;flex:1;align-items:center;gap:8px;padding:8px 10px;display:flex}.Yvqh9W_taskTrayToggle:hover{background:var(--dsw-alias-bg-layer-2)}.Yvqh9W_taskTrayCount{min-width:18px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);text-align:center;border-radius:999px;padding:1px 5px;font-size:11px;font-weight:500}.Yvqh9W_taskTrayChevron{color:var(--dsw-alias-label-tertiary);margin-left:auto;font-size:12px;font-weight:400}.Yvqh9W_taskTrayClose{border:0;border-left:1px solid var(--dsw-alias-border-l1);width:32px;color:var(--dsw-alias-label-tertiary);cursor:pointer;font:inherit;background:0 0;font-size:17px}.Yvqh9W_taskTrayClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.Yvqh9W_taskTray[data-open=false] .Yvqh9W_taskTrayToggle{min-height:34px}.Yvqh9W_taskRows{min-height:0;overflow-y:auto}.Yvqh9W_taskTray[data-open=false] .Yvqh9W_taskRows{display:none}.Yvqh9W_taskRow{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:7px;padding:7px 10px;display:grid}.Yvqh9W_taskRow:first-of-type{border-top:0}.Yvqh9W_taskStatus{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px}.Yvqh9W_taskRow[data-status=running] .Yvqh9W_taskStatus{color:var(--dsw-alias-brand-primary)}.Yvqh9W_taskRow[data-status=failed] .Yvqh9W_taskStatus{color:var(--dsw-alias-label-error)}.Yvqh9W_taskPrompt{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.Yvqh9W_taskRow button{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;font:inherit;border:0;border-radius:5px;padding:2px 7px;font-size:11px}.Yvqh9W_taskRow button:hover{color:var(--dsw-alias-brand-primary)}.Yvqh9W_configGuide{z-index:1100;background:#00000059;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.Yvqh9W_configGuideBody{border:1px solid var(--dsw-alias-border-l2);width:min(360px,100%);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border-radius:10px;flex-direction:column;gap:12px;padding:18px;display:flex;box-shadow:0 14px 40px #0003}.Yvqh9W_configGuideBody span{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55}.Yvqh9W_configGuideBody button{min-height:30px;color:var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-brand-primary);cursor:pointer;font:inherit;border:0;border-radius:7px;align-self:flex-end;padding:0 12px;font-size:12px}.Yvqh9W_history{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;flex-direction:column;width:auto;min-width:0;max-width:none;min-height:0;display:flex;overflow:hidden}.Yvqh9W_historyHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:space-between;align-items:center;gap:8px;padding:10px 12px;display:flex}.Yvqh9W_historyHeaderActions{flex:none;align-items:center;gap:6px;display:flex}.Yvqh9W_historyFilters{border-bottom:1px solid var(--dsw-alias-border-l1);grid-template-columns:1fr 1fr;gap:6px;padding:8px 10px;display:grid}.Yvqh9W_historySearch,.Yvqh9W_historyFilters select,.Yvqh9W_gallerySearch{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);min-width:0;min-height:29px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:7px;padding:0 8px;font-size:11px}.Yvqh9W_historySearch{grid-column:1/-1}.Yvqh9W_gallerySearch{width:156px}.Yvqh9W_galleryTagInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:130px;min-height:29px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:7px;padding:0 8px;font-size:11px}.Yvqh9W_galleryBulkButton{border:1px solid var(--dsw-alias-border-l2);min-height:29px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;font:inherit;border-radius:7px;padding:0 8px;font-size:11px}.Yvqh9W_galleryBulkButton:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.Yvqh9W_galleryBulkButton:disabled{opacity:.45;cursor:default}.Yvqh9W_historyTitle{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.Yvqh9W_historyNew{width:26px;height:26px;color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:7px;justify-content:center;align-items:center;padding:0;display:inline-flex}.Yvqh9W_historyNew:hover{color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.Yvqh9W_historyClear{font:inherit;color:var(--dsw-alias-label-tertiary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:999px;padding:2px 8px;font-size:11.5px}.Yvqh9W_historyClear:hover{color:var(--dsw-alias-label-error);border-color:var(--dsw-alias-label-error)}.Yvqh9W_historyList{scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l2) transparent;flex-direction:column;flex:1;gap:8px;min-height:0;padding:10px;display:flex;overflow-y:auto}.Yvqh9W_historyList::-webkit-scrollbar{width:8px}.Yvqh9W_historyList::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:999px}.Yvqh9W_historyEmpty{text-align:center;color:var(--dsw-alias-label-tertiary);flex:1;justify-content:center;align-items:center;padding:20px;font-size:12px;line-height:1.6;display:flex}.Yvqh9W_historyItem{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:10px;flex-direction:column;flex:none;gap:6px;padding:8px;display:flex}.Yvqh9W_historyItem:hover{border-color:var(--dsw-alias-border-l2)}.Yvqh9W_historyItem[data-active]{border-color:var(--dsw-alias-brand-primary)}.Yvqh9W_historyMain{font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:flex-start;gap:8px;min-width:0;padding:0;display:flex}.Yvqh9W_historyThumb{object-fit:cover;background:var(--dsw-alias-bg-base);border-radius:8px;flex:none;width:52px;height:52px}.Yvqh9W_historyThumbPlaceholder{background:var(--dsw-alias-bg-layer-3);border-radius:8px;flex:none;width:52px;height:52px}.Yvqh9W_historyInfo{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.Yvqh9W_historyPrompt{color:var(--dsw-alias-label-primary);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:1.4;display:-webkit-box;overflow:hidden}.Yvqh9W_historyMeta{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.Yvqh9W_historyActions{justify-content:flex-end;gap:6px;display:flex}.Yvqh9W_historyAction{font:inherit;color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:999px;padding:2px 8px;font-size:11.5px}.Yvqh9W_historyAction:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed)}.Yvqh9W_historyAction[data-danger]:hover{color:var(--dsw-alias-label-error);border-color:var(--dsw-alias-label-error)}.Yvqh9W_card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;flex-direction:column;flex:none;gap:10px;padding:12px;display:flex}.Yvqh9W_ecommerceWorkspace{flex-direction:column;gap:16px;max-width:720px;margin:0 auto;padding:6px 2px 12px;display:flex}.Yvqh9W_ecommerceSection{background:0 0;border:none;border-radius:0;flex-direction:column;gap:8px;padding:0;display:flex}.Yvqh9W_ecommerceSection h3{align-items:baseline;gap:6px;margin:0;font-size:13.5px;font-weight:600;display:flex}.Yvqh9W_ecommerceSectionHint{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:400}.Yvqh9W_ecommerceSection input:not([type=checkbox]),.Yvqh9W_ecommerceSection select,.Yvqh9W_ecommerceSection textarea{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);font:inherit;border-radius:8px;padding:8px 10px}.Yvqh9W_ecommerceSection textarea{resize:vertical;min-height:60px}.Yvqh9W_ecommerceField{flex-direction:column;gap:4px;min-width:0;display:flex}.Yvqh9W_ecommerceFieldLabel{color:var(--dsw-alias-label-secondary);font-size:11.5px}.Yvqh9W_ecommerceParamGrid{grid-template-columns:1fr 1fr;gap:10px 8px;display:grid}.Yvqh9W_ecommerceUploadHero{border:1.5px dashed var(--dsw-alias-border-l2);min-height:78px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;text-align:center;background:0 0;border-radius:10px;flex-direction:column;justify-content:center;align-items:center;gap:4px;padding:12px;display:flex}.Yvqh9W_ecommerceUploadHero:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed);background:var(--dsw-alias-interactive-bg-hover)}.Yvqh9W_ecommerceUploadHero span{font-size:12px}.Yvqh9W_ecommerceUploadHero small{color:var(--dsw-alias-label-tertiary);font-size:10.5px}.Yvqh9W_ecommerceStructureGrid{grid-template-columns:repeat(3,1fr);gap:6px;display:grid}.Yvqh9W_ecommerceSlotCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);height:34px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;white-space:nowrap;border-radius:8px;justify-content:center;align-items:center;font-size:12px;display:flex;position:relative}.Yvqh9W_ecommerceSlotCard:hover{border-color:var(--dsw-alias-label-dimmed)}.Yvqh9W_ecommerceSlotCard[data-active]{background:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-base);font-weight:600}.Yvqh9W_ecommerceSlotCount{background:var(--dsw-alias-brand-primary);color:#fff;text-align:center;border-radius:8px;min-width:16px;height:16px;padding:0 4px;font-size:10px;font-weight:600;line-height:16px;position:absolute;top:-6px;right:-6px}.Yvqh9W_ecommerceRefRow{grid-template-columns:64px 1fr;align-items:center;gap:8px;display:grid}.Yvqh9W_ecommerceRefRow>span{color:var(--dsw-alias-label-secondary);font-size:12px}.Yvqh9W_ecommercePrimaryAction{border-radius:999px;width:100%;height:38px;font-size:13.5px}.Yvqh9W_previewBadge{background:var(--dsw-alias-brand-primary);color:#fff;letter-spacing:.02em;border-radius:4px;margin-left:5px;padding:0 4px;font-size:9px;font-weight:700;line-height:13px}.Yvqh9W_ecommercePlanNote{color:var(--dsw-alias-label-secondary);font-size:11.5px;line-height:1.5}.Yvqh9W_ecommercePlanWarn{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);border-radius:6px;padding:6px 8px;font-size:11.5px;line-height:1.5}.Yvqh9W_ecommerceAssets{grid-template-columns:repeat(3,1fr);gap:6px;display:grid}.Yvqh9W_ecommerceAsset{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3);border-radius:8px;flex-direction:column;gap:3px;padding:4px;display:flex;position:relative}.Yvqh9W_ecommerceAsset img{object-fit:cover;border-radius:5px;width:100%;height:44px}.Yvqh9W_ecommerceAsset select{width:100%;min-width:0;padding:2px;font-size:10px}.Yvqh9W_ecommerceAsset button{color:#fff;cursor:pointer;text-align:center;background:#0000008c;border:none;border-radius:50%;width:16px;height:16px;padding:0;font-size:11px;line-height:15px;position:absolute;top:7px;right:7px}.Yvqh9W_ecommerceAsset button:hover{background:#000c}.Yvqh9W_ecommerceAssetAdd{border:1.5px dashed var(--dsw-alias-border-l2);min-height:78px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border-radius:8px;flex-direction:column;justify-content:center;align-items:center;gap:2px;display:flex}.Yvqh9W_ecommerceAssetAdd:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed)}.Yvqh9W_ecommerceAssetAdd span{font-size:16px;line-height:1}.Yvqh9W_ecommerceAssetAdd small{font-size:10px}.Yvqh9W_ecommerceAdvancedToggle{width:100%;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border:none;justify-content:space-between;align-items:center;padding:0;font-size:12.5px;display:flex}.Yvqh9W_ecommerceAdvancedToggle:hover{color:var(--dsw-alias-label-primary)}.Yvqh9W_ecommerceAdvancedChevron{font-size:11px}.Yvqh9W_ecommerceAdvancedBody{flex-direction:column;gap:8px;margin-top:8px;display:flex}.Yvqh9W_ecommerceFooterBody{flex-direction:column;gap:8px;display:flex}.Yvqh9W_ecommercePlanMini{border:1px solid var(--dsw-alias-brand-primary);border-radius:10px;flex-direction:column;gap:6px;padding:10px;display:flex}.Yvqh9W_ecommercePlanMini>strong{font-size:12.5px}.Yvqh9W_ecommercePlanList{flex-direction:column;gap:3px;max-height:116px;display:flex;overflow-y:auto}.Yvqh9W_ecommercePlanList>div{color:var(--dsw-alias-label-secondary);justify-content:space-between;gap:12px;font-size:11.5px;display:flex}.Yvqh9W_ecommercePlanBack{color:var(--dsw-alias-label-tertiary);cursor:pointer;font:inherit;background:0 0;border:none;padding:0;font-size:12px}.Yvqh9W_ecommercePlanBack:hover{color:var(--dsw-alias-label-primary)}.Yvqh9W_ecommerceFooterHint{color:var(--dsw-alias-label-secondary);font-size:12px}.Yvqh9W_ecommerceResults{flex-direction:column;gap:14px;width:100%;margin:0 auto;padding:16px 18px;display:flex;overflow-y:auto}.Yvqh9W_ecommerceResultsHeader{justify-content:space-between;align-items:center;gap:12px;display:flex}.Yvqh9W_ecommerceResultsHeader h3{margin:0;font-size:15px}.Yvqh9W_ecommerceResultsHeader>div:first-child{align-items:baseline;gap:10px;display:flex}.Yvqh9W_ecommerceResultsHeader span{color:var(--dsw-alias-label-secondary);font-size:12px}.Yvqh9W_ecommerceResultsActions{gap:8px;display:flex}.Yvqh9W_ecommerceResultsEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;border:1.5px dashed var(--dsw-alias-border-l2);border-radius:12px;padding:32px 16px;font-size:13px}.Yvqh9W_ecommerceGroups{flex-direction:column;gap:16px;display:flex}.Yvqh9W_ecommerceGroup{background:0 0;border:none;border-radius:0;flex-direction:column;gap:8px;padding:0;display:flex}.Yvqh9W_ecommerceGroup>header{align-items:center;gap:10px;font-size:13px;display:flex}.Yvqh9W_ecommerceGroup>header strong{font-size:13px}.Yvqh9W_ecommerceGroup>header span{color:var(--dsw-alias-label-secondary);font-size:12px}.Yvqh9W_ecommerceGroup>header button{margin-left:auto}.Yvqh9W_ecommerceGroupGrid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;display:grid}.Yvqh9W_ecommerceTaskCard{aspect-ratio:1;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3);border-radius:10px;justify-content:center;align-items:center;width:100%;min-height:0;padding:0;display:flex;position:relative;overflow:hidden}.Yvqh9W_ecommerceTaskCard[data-status=failed],.Yvqh9W_ecommerceTaskCard[data-status=cancelled]{color:var(--dsw-alias-label-tertiary);font-size:12px}.Yvqh9W_ecommerceTaskCard .Yvqh9W_imageCard{border:none;border-radius:0;width:100%;height:100%;margin:0}.Yvqh9W_ecommerceTaskCard .Yvqh9W_image{object-fit:cover;width:100%;height:100%}.Yvqh9W_ecommerceResultBadge{color:#fff;pointer-events:none;background:#0000008c;border-radius:999px;padding:0 7px;font-size:10px;line-height:16px;position:absolute;top:6px;left:6px}.Yvqh9W_ecommerceTaskActions{opacity:0;background:linear-gradient(#0000,#0000008c);justify-content:center;gap:4px;padding:10px 4px 5px;transition:opacity .12s;display:flex;position:absolute;bottom:0;left:0;right:0}.Yvqh9W_ecommerceTaskCard:hover .Yvqh9W_ecommerceTaskActions{opacity:1}.Yvqh9W_ecommerceActionChip{color:#111;cursor:pointer;white-space:nowrap;background:#ffffffeb;border:none;border-radius:6px;padding:0 6px;font-size:10px;font-weight:500;line-height:18px;text-decoration:none}.Yvqh9W_ecommerceActionChip:hover{background:#fff}.Yvqh9W_ecommerceActionChip:disabled{opacity:.5;cursor:default}.Yvqh9W_ecommerceTaskState{color:var(--dsw-alias-label-secondary);text-align:center;word-break:break-all;flex-direction:column;gap:3px;padding:10px 8px;font-size:11px;display:flex}.Yvqh9W_ecommerceTaskState b{color:var(--dsw-alias-label-primary);font-size:12px}.Yvqh9W_topNav{flex:none;justify-content:center;align-items:center;gap:2px;display:flex;position:absolute;left:50%;transform:translate(-50%)}.Yvqh9W_topNavItem{height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border:none;border-radius:999px;align-items:center;gap:4px;padding:0 14px;font-size:13px;display:inline-flex}.Yvqh9W_topNavItem,.Yvqh9W_topNavItem span{white-space:nowrap}.Yvqh9W_topNavItem:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.Yvqh9W_topNavItem[data-active]{background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-base);font-weight:600}.Yvqh9W_topNavDivider{background:var(--dsw-alias-border-l2);width:1px;height:16px;margin:0 8px}.Yvqh9W_panelHeaderActions{align-items:center;gap:10px;display:inline-flex}.Yvqh9W_chatToggle{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;border-radius:999px;align-items:center;gap:5px;padding:0 10px;font-size:12px;display:inline-flex}.Yvqh9W_chatToggle:hover{color:var(--dsw-alias-label-primary)}.Yvqh9W_chatToggle[data-open=true]{color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}html[data-dsh-imagegen-chat-collapsed][data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane=conversation],html[data-dsh-imagegen-chat-collapsed][data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*=centerCol]{grid-template-columns:minmax(0,1fr)}html[data-dsh-imagegen-chat-collapsed][data-dsh-imagegen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-slot=conversation],html[data-dsh-imagegen-chat-collapsed] [data-dsh-imagegen-chat-resizer]{display:none!important}.Yvqh9W_configResizer{cursor:col-resize;z-index:6;width:6px;height:100%;position:absolute;top:0;right:0}.Yvqh9W_configResizer:hover{background:linear-gradient(90deg, transparent, var(--dsw-alias-border-l2))}.Yvqh9W_config[data-collapsed=true] .Yvqh9W_configResizer{display:none}.Yvqh9W_modeRow{align-items:center;gap:8px;display:flex}.Yvqh9W_modePill{flex:1;justify-content:center;height:28px;font-size:12.5px}.Yvqh9W_modePill,.Yvqh9W_modePill span,.Yvqh9W_modePill div{white-space:nowrap;min-width:0}.Yvqh9W_uploadBox{min-height:128px;color:var(--dsw-alias-label-secondary);border:1.5px dashed var(--dsw-alias-border-l2);cursor:pointer;font:inherit;text-align:center;background:0 0;border-radius:12px;flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:16px;font-size:12.5px;display:flex}.Yvqh9W_uploadBox:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed);background:var(--dsw-alias-interactive-bg-hover)}.Yvqh9W_uploadBox:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.Yvqh9W_uploadIcon{color:var(--dsw-alias-label-tertiary);display:inline-flex}.Yvqh9W_uploadHint{color:var(--dsw-alias-label-tertiary);font-size:11px}.Yvqh9W_reference{flex-direction:column;gap:8px;display:flex}.Yvqh9W_referenceImage{object-fit:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;width:100%;max-height:176px}.Yvqh9W_referenceActions{gap:8px;display:flex}.Yvqh9W_hiddenFile{display:none}.Yvqh9W_prompt{width:100%;min-height:120px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);resize:vertical;box-sizing:border-box;border-radius:10px;outline:none;padding:10px 12px;font-family:inherit;font-size:13px;line-height:1.6}.Yvqh9W_prompt:focus-visible{border-color:var(--dsw-alias-brand-primary)}.Yvqh9W_prompt::placeholder{color:var(--dsw-alias-label-tertiary)}.Yvqh9W_promptFooter{justify-content:space-between;align-items:center;gap:8px;margin-top:-6px;display:flex}.Yvqh9W_templatesButton{border:1px solid var(--dsw-alias-brand-primary);background:linear-gradient(135deg, color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent), color-mix(in srgb, var(--dsw-alias-brand-primary) 5%, transparent));height:26px;color:var(--dsw-alias-brand-primary);cursor:pointer;box-shadow:0 1px 0 color-mix(in srgb, var(--dsw-alias-brand-primary) 22%, transparent);border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-family:inherit;font-size:12px;font-weight:600;transition:transform .12s,box-shadow .12s,background .12s;display:inline-flex}.Yvqh9W_templatesButton svg{flex:none}.Yvqh9W_templatesButton:hover{background:linear-gradient(135deg, color-mix(in srgb, var(--dsw-alias-brand-primary) 24%, transparent), color-mix(in srgb, var(--dsw-alias-brand-primary) 8%, transparent));color:var(--dsw-alias-brand-primary);box-shadow:0 2px 6px color-mix(in srgb, var(--dsw-alias-brand-primary) 30%, transparent);transform:translateY(-1px)}.Yvqh9W_templatesButton:active{transform:translateY(0)}.Yvqh9W_enhanceButton{border:1px solid var(--dsw-alias-border-l2);height:26px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:999px;margin-left:auto;padding:0 11px;font-size:12px}.Yvqh9W_enhanceButton:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.Yvqh9W_enhanceButton:disabled{opacity:.5;cursor:default}.Yvqh9W_promptCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:11px}.Yvqh9W_paramGroup{flex-direction:column;gap:8px;display:flex}.Yvqh9W_paramLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}.Yvqh9W_optionRow{flex-wrap:wrap;gap:6px;display:flex}.Yvqh9W_optionGrid{grid-template-columns:repeat(3,1fr);gap:6px;display:grid}.Yvqh9W_optionPill{justify-content:center}.Yvqh9W_paramHint{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45}.Yvqh9W_footer{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;flex:none;align-items:stretch;gap:8px;padding:10px 2px 0 0;display:flex}.Yvqh9W_modelWrap{flex-direction:column;gap:5px;min-width:0;display:flex}.Yvqh9W_modelLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}.Yvqh9W_modelSelect{width:100%;height:36px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;text-align:left;border-radius:18px;outline:none;justify-content:space-between;align-items:center;gap:8px;padding:0 12px;font-family:inherit;font-size:13px;display:flex}.Yvqh9W_modelSelect:focus-visible{border-color:var(--dsw-alias-brand-primary)}.Yvqh9W_modelSelect:disabled{opacity:.55;cursor:default}.Yvqh9W_modelMenu{min-width:0;display:block;position:relative}.Yvqh9W_modelMenuList{z-index:40;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;flex-direction:column;padding:4px;display:flex;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow:hidden;box-shadow:0 -8px 24px #0000002e}.Yvqh9W_modelMenuItem{width:100%;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;white-space:nowrap;text-overflow:ellipsis;background:0 0;border:none;border-radius:8px;padding:7px 10px;font-size:13px;display:block;overflow:hidden}.Yvqh9W_modelMenuItem:hover{background:var(--dsw-alias-bg-hover)}.Yvqh9W_modelMenuItem[data-selected]{color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-1);font-weight:600}.Yvqh9W_generateButton{width:100%}.Yvqh9W_generateInner{align-items:center;gap:7px;display:inline-flex}.Yvqh9W_canvasState{text-align:center;color:var(--dsw-alias-label-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;display:flex}.Yvqh9W_canvasStateTitle{color:var(--dsw-alias-label-secondary);font-size:14px;font-weight:600}.Yvqh9W_canvasStateHint{max-width:380px;font-size:12px;line-height:1.6}.Yvqh9W_canvasEmptyIcon{color:var(--dsw-alias-label-tertiary);margin-bottom:4px;display:inline-flex}.Yvqh9W_canvasError{color:var(--dsw-alias-label-error);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-label-error);overflow-wrap:anywhere;border-radius:10px;flex:none;margin:14px;padding:10px 14px;font-size:12.5px;line-height:1.6}.Yvqh9W_canvasBody{scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l2) transparent;flex-direction:column;flex:1;gap:10px;min-height:0;padding:14px;display:flex;overflow-y:auto}.Yvqh9W_canvasBody::-webkit-scrollbar{width:8px}.Yvqh9W_canvasBody::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:999px}.Yvqh9W_canvasMeta{color:var(--dsw-alias-label-tertiary);flex:none;align-items:center;gap:8px;font-size:12px;display:flex}.Yvqh9W_canvasHistoryTag{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px}.Yvqh9W_grid{flex:1;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;min-height:0;display:grid}.Yvqh9W_grid[data-count=\"1\"] .Yvqh9W_imageCard{grid-area:1/1/3/3}.Yvqh9W_imageCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);cursor:zoom-in;border-radius:12px;flex-direction:column;min-height:0;margin:0;display:flex;position:relative;overflow:hidden}.Yvqh9W_imageCard:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.Yvqh9W_image{object-fit:cover;background:var(--dsw-alias-bg-base);flex:1;width:100%;min-height:0;display:block}.Yvqh9W_imageCaption{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;border-top:1px solid var(--dsw-alias-border-l1);padding:7px 10px;font-size:11px;line-height:1.5;overflow:hidden}.Yvqh9W_download{color:#fff;opacity:0;backdrop-filter:blur(4px);background:#0f1218d1;border:1px solid #ffffff9e;border-radius:999px;padding:2px 10px;font-size:12px;font-weight:500;line-height:20px;text-decoration:none;transition:opacity .12s;position:absolute;top:8px;right:8px;box-shadow:0 2px 8px #00000047}.Yvqh9W_imageCard:hover .Yvqh9W_download{opacity:1}.Yvqh9W_download:hover{background:#0f1218f0}.Yvqh9W_download:focus-visible{opacity:1;outline-offset:2px;outline:2px solid #fff}.Yvqh9W_galleryAdd{font:inherit;color:#fff;cursor:pointer;opacity:0;backdrop-filter:blur(4px);background:#0f1218d1;border:1px solid #ffffff9e;border-radius:999px;align-items:center;gap:5px;padding:2px 10px;font-size:12px;font-weight:500;line-height:20px;transition:opacity .12s;display:inline-flex;position:absolute;top:8px;left:8px;box-shadow:0 2px 8px #00000047}.Yvqh9W_imageCard:hover .Yvqh9W_galleryAdd{opacity:1}.Yvqh9W_galleryAdd:hover{background:#0f1218f0}.Yvqh9W_galleryAdd:focus-visible{opacity:1;outline-offset:2px;outline:2px solid #fff}.Yvqh9W_galleryAdd:disabled{opacity:.4;cursor:default}.Yvqh9W_conversationAdd{color:#fff;cursor:pointer;font:inherit;opacity:0;backdrop-filter:blur(4px);background:#0f1218d1;border:1px solid #ffffff9e;border-radius:999px;align-items:center;gap:5px;padding:2px 10px;font-size:12px;font-weight:500;line-height:20px;transition:opacity .12s;display:inline-flex;position:absolute;top:38px;left:8px;box-shadow:0 2px 8px #00000047}.Yvqh9W_imageCard:hover .Yvqh9W_conversationAdd,.Yvqh9W_conversationAdd:focus-visible{opacity:1}.Yvqh9W_conversationAdd:hover{background:#0f1218f0}.Yvqh9W_conversationAdd:focus-visible{opacity:1;outline-offset:2px;outline:2px solid #fff}.Yvqh9W_conversationAdd:disabled{opacity:.4;cursor:default}.Yvqh9W_zoomHint{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);border:1px solid var(--dsw-alias-border-l2);opacity:0;backdrop-filter:blur(4px);pointer-events:none;border-radius:999px;align-items:center;gap:5px;padding:2px 10px;font-size:12px;font-weight:500;line-height:20px;transition:opacity .12s;display:inline-flex;position:absolute;bottom:8px;left:8px}.Yvqh9W_imageCard:hover .Yvqh9W_zoomHint{opacity:1}.Yvqh9W_spinner,.Yvqh9W_bigSpinner{border:2px solid;border-top-color:#0000;border-radius:50%;flex:none;animation:.8s linear infinite Yvqh9W_dshImageGenSpin;display:inline-block}.Yvqh9W_spinner{width:11px;height:11px}.Yvqh9W_bigSpinner{width:30px;height:30px;color:var(--dsw-alias-state-business-primary);border-width:3px;margin-bottom:6px}.Yvqh9W_lightbox{z-index:1000;backdrop-filter:blur(6px);background:#000000b8;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.Yvqh9W_lightboxClose{color:#fff;cursor:pointer;background:#ffffff24;border:1px solid #ffffff47;border-radius:50%;justify-content:center;align-items:center;width:38px;height:38px;display:inline-flex;position:absolute;top:16px;right:16px}.Yvqh9W_lightboxClose:hover{background:#ffffff42}.Yvqh9W_lightboxNav{color:#fff;cursor:pointer;background:#ffffff24;border:1px solid #ffffff47;border-radius:50%;justify-content:center;align-items:center;width:42px;height:42px;display:inline-flex;position:absolute;top:50%;transform:translateY(-50%)}.Yvqh9W_lightboxNav:hover{background:#ffffff42}.Yvqh9W_lightboxNav[data-dir=prev]{left:max(20px,50% - 640px)}.Yvqh9W_lightboxNav[data-dir=next]{right:max(20px,50% - 640px)}.Yvqh9W_lightboxFigure{flex-direction:column;gap:10px;width:min(1100px,100vw - 160px);max-width:min(1100px,100vw - 160px);height:min(820px,100vh - 48px);min-height:0;margin:0;display:flex}.Yvqh9W_lightboxStage{background:#ffffff0a;border-radius:10px;flex:1;min-height:0;position:relative;overflow:auto}.Yvqh9W_lightboxScaleFrame{justify-content:center;align-items:center;min-width:100%;min-height:100%;display:flex}.Yvqh9W_lightboxImage{object-fit:contain;border-radius:10px;max-width:100%;max-height:100%;display:block;box-shadow:0 24px 80px #00000080}.Yvqh9W_lightboxTools{justify-content:center;align-items:center;gap:6px;display:flex}.Yvqh9W_lightboxTool,.Yvqh9W_lightboxZoomLevel,.Yvqh9W_lightboxCopy{color:#fff;cursor:pointer;background:#ffffff24;border:1px solid #ffffff47;justify-content:center;align-items:center;display:inline-flex}.Yvqh9W_lightboxTool,.Yvqh9W_lightboxZoomLevel{height:32px}.Yvqh9W_lightboxTool{border-radius:50%;width:32px}.Yvqh9W_lightboxZoomLevel{min-width:58px;font:inherit;font-variant-numeric:tabular-nums;border-radius:999px;padding:0 9px;font-size:12px}.Yvqh9W_lightboxTool:hover,.Yvqh9W_lightboxZoomLevel:hover,.Yvqh9W_lightboxCopy:hover{background:#ffffff42}.Yvqh9W_lightboxCaptionRow{align-items:flex-start;gap:8px;min-width:0;display:flex}.Yvqh9W_lightboxCaption{color:#ffffffe6;-webkit-line-clamp:3;-webkit-box-orient:vertical;flex:1;min-width:0;font-size:12px;line-height:1.6;display:-webkit-box;overflow:hidden}.Yvqh9W_lightboxCopy{min-height:28px;font:inherit;white-space:nowrap;border-radius:999px;flex:none;gap:5px;padding:4px 9px;font-size:12px}.Yvqh9W_lightboxMeta{justify-content:space-between;align-items:center;gap:12px;display:flex}.Yvqh9W_lightboxIndex{color:#fffc;font-variant-numeric:tabular-nums;font-size:12px}.Yvqh9W_lightboxActions{align-items:center;gap:8px;display:inline-flex}.Yvqh9W_lightboxDownload,.Yvqh9W_lightboxEdit{font:inherit;color:#fff;cursor:pointer;background:#ffffff24;border:1px solid #ffffff47;border-radius:999px;padding:4px 14px;font-size:12.5px;font-weight:500;text-decoration:none}.Yvqh9W_lightboxDownload:hover,.Yvqh9W_lightboxEdit:hover{background:#ffffff42}.Yvqh9W_lightboxEdit{color:#fff;background:#ffffff24;border:1px solid #ffffff47;border-radius:999px}@media (width<=720px){.Yvqh9W_lightbox{padding:16px}.Yvqh9W_lightboxFigure{width:calc(100vw - 32px);max-width:none}.Yvqh9W_lightboxNav[data-dir=prev]{left:20px}.Yvqh9W_lightboxNav[data-dir=next]{right:20px}.Yvqh9W_lightboxCaptionRow,.Yvqh9W_lightboxMeta{flex-direction:column;align-items:stretch}.Yvqh9W_lightboxCopy,.Yvqh9W_lightboxActions{align-self:flex-end}}@keyframes Yvqh9W_dshImageGenSpin{to{transform:rotate(360deg)}}.Yvqh9W_galleryToast{z-index:30;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);border:1px solid var(--dsw-alias-border-l2);backdrop-filter:blur(6px);pointer-events:none;border-radius:999px;align-items:center;gap:7px;padding:6px 16px;font-size:13px;font-weight:500;animation:.16s ease-out Yvqh9W_dshImageGenToastIn;display:inline-flex;position:absolute;bottom:24px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #00000038}@keyframes Yvqh9W_dshImageGenToastIn{0%{opacity:0;transform:translate(-50%,6px)}to{opacity:1;transform:translate(-50%)}}.Yvqh9W_conversationToast{z-index:30;border:1px solid var(--dsw-alias-border-l2);max-width:calc(100% - 32px);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-mask-1);pointer-events:none;backdrop-filter:blur(6px);border-radius:999px;align-items:center;gap:7px;padding:6px 16px;font-size:13px;font-weight:500;animation:.16s ease-out Yvqh9W_dshImageGenToastIn;display:inline-flex;position:absolute;bottom:24px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #00000038}@media (prefers-reduced-motion:reduce){.Yvqh9W_download,.Yvqh9W_spinner,.Yvqh9W_bigSpinner{transition:none;animation-duration:1.5s}}.Yvqh9W_config[data-gallery=true] .Yvqh9W_configScroll>:not(:first-child),.Yvqh9W_config[data-gallery=true] .Yvqh9W_footer,.Yvqh9W_canvas[data-gallery=true]>.Yvqh9W_canvasState,.Yvqh9W_canvas[data-gallery=true]>.Yvqh9W_canvasError,.Yvqh9W_canvas[data-gallery=true]>.Yvqh9W_canvasBody,.Yvqh9W_studio:has(.Yvqh9W_config[data-gallery=true])>.Yvqh9W_history{display:none}.Yvqh9W_config[data-gallery=true] .Yvqh9W_configScroll{flex:none;order:1;display:flex;overflow:visible}.Yvqh9W_config[data-gallery=true] .Yvqh9W_galleryFilters{flex:1;order:2;min-height:0}.Yvqh9W_galleryFilters{padding:18px 14px;overflow:hidden auto}.Yvqh9W_galleryFilterHeading{color:var(--dsw-alias-label-tertiary);margin:0 4px 10px;font-size:12px;font-weight:600}.Yvqh9W_galleryFilter{width:100%;min-height:34px;color:var(--dsw-alias-label-secondary);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:9px;justify-content:space-between;align-items:center;padding:0 10px;display:flex}.Yvqh9W_galleryFilter:hover,.Yvqh9W_galleryFilter[data-active]{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent)}.Yvqh9W_galleryFilterCount{min-width:20px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);text-align:center;border-radius:999px;padding:1px 6px;font-size:11px}.Yvqh9W_galleryFilterDivider{background:var(--dsw-alias-border-l1);height:1px;margin:18px 4px}.Yvqh9W_galleryRatioList{flex-wrap:wrap;gap:6px;display:flex}.Yvqh9W_galleryRatio{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;border:0;border-radius:999px;padding:6px 10px;font-size:12px}.Yvqh9W_galleryRatio[data-active]{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 13%, transparent)}.Yvqh9W_galleryTagFilterList{flex-wrap:wrap;gap:6px;display:flex}.Yvqh9W_galleryTagFilter{border:1px solid var(--dsw-alias-border-l1);min-width:0;max-width:100%;min-height:27px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;font:inherit;border-radius:6px;align-items:center;gap:5px;padding:0 8px;font-size:11px;display:inline-flex}.Yvqh9W_galleryTagFilter span:first-child{text-overflow:ellipsis;white-space:nowrap;max-width:112px;overflow:hidden}.Yvqh9W_galleryTagFilter span:last-child{color:var(--dsw-alias-label-tertiary);font-size:10px}.Yvqh9W_galleryTagFilter:hover,.Yvqh9W_galleryTagFilter[data-active]{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent)}.Yvqh9W_galleryFilterNote{color:var(--dsw-alias-label-quaternary);margin:20px 4px 0;font-size:11px;line-height:1.5}.Yvqh9W_galleryWorkspace{box-sizing:border-box;flex-direction:column;width:100%;min-width:0;height:100%;min-height:0;padding:22px 24px 26px;display:flex;position:absolute;inset:0;overflow:hidden}.Yvqh9W_galleryToolbar{flex:none;justify-content:space-between;align-items:center;gap:16px;min-width:0;margin-bottom:18px;display:flex}.Yvqh9W_galleryHeading{color:var(--dsw-alias-label-primary);margin:0;font-size:20px;font-weight:700;display:inline}.Yvqh9W_galleryCount{color:var(--dsw-alias-label-tertiary);margin-left:8px;font-size:13px}.Yvqh9W_galleryToolbarActions{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.Yvqh9W_gallerySelectMode,.Yvqh9W_galleryBulkButton,.Yvqh9W_gallerySelectionClear{border:1px solid var(--dsw-alias-border-l1);min-height:30px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;font:inherit;border-radius:7px;padding:0 10px;font-size:12px}.Yvqh9W_gallerySelectMode:hover,.Yvqh9W_gallerySelectMode[data-active],.Yvqh9W_galleryBulkButton:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 38%, var(--dsw-alias-border-l1));background:color-mix(in srgb, var(--dsw-alias-brand-primary) 11%, transparent)}.Yvqh9W_galleryBulkButton:disabled{cursor:not-allowed;opacity:.45}.Yvqh9W_gallerySelectionBar{border:1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 35%, var(--dsw-alias-border-l1));background:color-mix(in srgb, var(--dsw-alias-brand-primary) 7%, var(--dsw-alias-bg-layer-1));border-radius:9px;flex:none;align-items:center;gap:10px;min-width:0;margin:-4px 0 16px;padding:10px 12px;display:flex}.Yvqh9W_gallerySelectionBar strong{color:var(--dsw-alias-brand-primary);flex:none;font-size:12px}.Yvqh9W_gallerySelectionClear{margin-left:auto}.Yvqh9W_gallerySelectionClear:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.Yvqh9W_galleryTagInput,.Yvqh9W_gallerySearch{border:1px solid var(--dsw-alias-border-l1);min-width:0;height:30px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);font:inherit;border-radius:7px;outline:none;padding:0 10px;font-size:12px}.Yvqh9W_galleryTagInput{flex:190px}.Yvqh9W_galleryTagInput:focus,.Yvqh9W_gallerySearch:focus{border-color:var(--dsw-alias-brand-primary)}.Yvqh9W_galleryViewToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:9px;padding:3px;display:flex}.Yvqh9W_galleryViewToggle button,.Yvqh9W_gallerySort,.Yvqh9W_galleryClear{min-height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:7px;padding:0 10px;font-size:12px}.Yvqh9W_galleryViewToggle button[data-active],.Yvqh9W_galleryViewToggle button:hover,.Yvqh9W_gallerySort:hover,.Yvqh9W_galleryClear:hover{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 11%, transparent)}.Yvqh9W_gallerySort{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1)}.Yvqh9W_galleryClear{border:1px solid var(--dsw-alias-border-l1)}.Yvqh9W_compareControl{flex-direction:column;gap:6px;margin:0 0 10px;display:flex}.Yvqh9W_compareToggle,.Yvqh9W_compareModelChoices label{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.Yvqh9W_compareToggle input,.Yvqh9W_compareModelChoices input{accent-color:var(--dsw-alias-brand-primary)}.Yvqh9W_compareModelChoices{flex-wrap:wrap;gap:6px;display:flex}.Yvqh9W_compareModelChoices label{border:1px solid var(--dsw-alias-border-l1);border-radius:5px;padding:4px 6px;font-size:10px}.Yvqh9W_comparisonBoard{z-index:4;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:8px;flex-direction:column;display:flex;position:absolute;inset:14px;overflow:hidden;box-shadow:0 8px 24px #0000001f}.Yvqh9W_comparisonBoard>header{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:center;padding:10px 12px;display:flex}.Yvqh9W_comparisonBoard>header div{align-items:baseline;gap:7px;display:flex}.Yvqh9W_comparisonBoard>header strong{color:var(--dsw-alias-label-primary);font-size:13px}.Yvqh9W_comparisonBoard>header span{color:var(--dsw-alias-label-tertiary);font-size:11px}.Yvqh9W_comparisonBoard>header button{border:1px solid var(--dsw-alias-border-l1);min-height:28px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;font:inherit;border-radius:5px;padding:0 9px;font-size:11px}.Yvqh9W_comparisonGrid{flex:1;grid-template-rows:minmax(0,1fr);grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;min-height:0;padding:12px;display:grid;overflow:auto}.Yvqh9W_comparisonGrid article{flex-direction:column;gap:7px;min-width:0;height:100%;min-height:0;display:flex}.Yvqh9W_comparisonGrid article>strong{color:var(--dsw-alias-label-primary);font-size:12px}.Yvqh9W_comparisonImageButton{cursor:zoom-in;background:var(--dsw-alias-bg-base);border:0;flex:1;width:100%;min-height:0;padding:0;display:flex;overflow:hidden}.Yvqh9W_comparisonImageButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}.Yvqh9W_comparisonGrid article>span{min-height:0;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);flex:1;place-items:center;font-size:12px;display:grid}.Yvqh9W_comparisonGrid img{object-fit:contain;background:var(--dsw-alias-bg-base);flex:1;width:100%;height:100%;min-height:0;max-height:none;display:block}.Yvqh9W_comparisonFullscreen{z-index:1200;background:#000000eb;padding:54px 24px 24px;position:fixed;inset:0;overflow:auto}.Yvqh9W_comparisonFullscreenGrid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:18px;min-height:100%;display:grid}.Yvqh9W_comparisonFullscreen figure{min-width:0;margin:0}.Yvqh9W_comparisonFullscreen figcaption{color:#fff;margin-bottom:8px;font-size:13px;font-weight:600}.Yvqh9W_comparisonFullscreen img{background:#111;width:100%;margin-bottom:10px;display:block}.Yvqh9W_historyItem[data-comparison]{border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 55%, var(--dsw-alias-border-l1))}.Yvqh9W_galleryMasonry{box-sizing:border-box;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l2) transparent;flex:auto;grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:max-content;align-content:start;gap:16px;width:100%;min-width:0;max-width:100%;height:0;min-height:0;padding:2px 8px 16px 2px;display:grid;overflow:hidden scroll}.Yvqh9W_galleryMasonry::-webkit-scrollbar{width:8px}.Yvqh9W_galleryMasonry::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:999px}.Yvqh9W_galleryCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;width:100%;margin:0;display:block;position:relative;overflow:hidden;box-shadow:0 5px 18px #18203612}.Yvqh9W_galleryCard[data-selected]{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-brand-primary) 26%, transparent), 0 5px 18px #18203612}.Yvqh9W_gallerySelect{z-index:2;cursor:pointer;background:#00000094;border:1px solid #ffffffbf;border-radius:7px;place-items:center;width:26px;height:26px;display:grid;position:absolute;top:9px;right:9px}.Yvqh9W_gallerySelect input{width:16px;height:16px;accent-color:var(--dsw-alias-brand-primary);cursor:pointer;margin:0}.Yvqh9W_galleryImageButton{background:var(--dsw-alias-bg-base);cursor:zoom-in;border:0;width:100%;padding:0;display:block;position:relative}.Yvqh9W_galleryImageButton[data-selecting]{cursor:pointer}.Yvqh9W_galleryImage{aspect-ratio:4/3;object-fit:cover;width:100%;display:block}.Yvqh9W_galleryMasonry[data-view=masonry] .Yvqh9W_galleryCard:nth-child(3n+1) .Yvqh9W_galleryImage{aspect-ratio:4/5}.Yvqh9W_galleryMasonry[data-view=masonry] .Yvqh9W_galleryCard:nth-child(3n+2) .Yvqh9W_galleryImage{aspect-ratio:4/3}.Yvqh9W_galleryMasonry[data-view=masonry] .Yvqh9W_galleryCard:nth-child(3n) .Yvqh9W_galleryImage{aspect-ratio:3/4}.Yvqh9W_galleryBadge{color:#fff;backdrop-filter:blur(4px);background:#121724c2;border-radius:999px;padding:4px 9px;font-size:11px;position:absolute;top:10px;left:10px}.Yvqh9W_galleryCardActions{padding:8px 12px 0;display:flex}.Yvqh9W_galleryCardAction{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;min-height:28px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);cursor:pointer;font:inherit;white-space:nowrap;border-radius:7px;justify-content:center;align-items:center;gap:4px;padding:0 4px;font-size:10px;font-weight:500;display:inline-flex}.Yvqh9W_galleryCardAction:hover,.Yvqh9W_galleryCardAction:focus-visible{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary);outline:none}.Yvqh9W_galleryCardAction:disabled{cursor:wait;opacity:.55}.Yvqh9W_galleryCardFooter{align-items:center;gap:9px;min-width:0;padding:10px 12px;display:flex}.Yvqh9W_galleryAvatar{color:#fff;background:var(--dsw-alias-brand-primary);border-radius:50%;flex:none;place-items:center;width:27px;height:27px;font-size:12px;font-weight:700;display:grid}.Yvqh9W_galleryCardInfo{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.Yvqh9W_galleryCardInfo strong,.Yvqh9W_galleryCardInfo small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.Yvqh9W_galleryCardInfo strong{color:var(--dsw-alias-label-primary);font-size:12px}.Yvqh9W_galleryCardInfo small{color:var(--dsw-alias-label-tertiary);font-size:10px}.Yvqh9W_galleryTags{flex-wrap:wrap;gap:4px;margin-top:4px;display:flex}.Yvqh9W_galleryTags button{max-width:96px;min-height:19px;color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent);cursor:pointer;font:inherit;text-overflow:ellipsis;white-space:nowrap;border:0;border-radius:4px;padding:1px 6px;font-size:10px;line-height:1.35;overflow:hidden}.Yvqh9W_galleryTags button:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 17%, transparent)}.Yvqh9W_galleryTags .Yvqh9W_galleryTagEdit{color:var(--dsw-alias-label-tertiary);background:0 0;flex:none}.Yvqh9W_galleryTagEditor{align-items:center;gap:6px;padding:0 12px 10px 48px;display:flex}.Yvqh9W_galleryTagEditor input{border:1px solid var(--dsw-alias-border-l2);min-width:0;height:27px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:6px;outline:none;flex:1;padding:0 8px;font-size:11px}.Yvqh9W_galleryTagEditor input:focus{border-color:var(--dsw-alias-brand-primary)}.Yvqh9W_galleryTagEditor button{border:1px solid var(--dsw-alias-border-l2);height:27px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;font:inherit;border-radius:6px;padding:0 8px;font-size:11px}.Yvqh9W_galleryTagEditor button[type=submit]{color:var(--dsw-alias-brand-primary)}.Yvqh9W_galleryRemove{width:24px;height:24px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:50%;flex:none;padding:0;font-size:18px}.Yvqh9W_galleryRemove:hover{color:var(--dsw-alias-state-error);background:var(--dsw-alias-bg-layer-2)}@media (width<=1100px){.Yvqh9W_galleryMasonry{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=760px){.Yvqh9W_studio{grid-template-rows:minmax(220px,36%) minmax(0,1fr);grid-template-columns:minmax(0,1fr);overflow-y:auto}.Yvqh9W_history{grid-area:1/1;min-height:220px}.Yvqh9W_generation{flex-direction:column;grid-area:2/1;min-height:0}.Yvqh9W_config{width:auto;max-width:none;height:auto;min-height:0}.Yvqh9W_config[data-gallery=true]{flex:none}.Yvqh9W_canvas{min-height:560px}.Yvqh9W_galleryToolbar{flex-direction:column;align-items:flex-start}.Yvqh9W_galleryToolbarActions{flex-wrap:wrap;width:100%}.Yvqh9W_galleryMasonry{grid-template-columns:1fr}}";
1802
1947
  const tagId$2 = "@dickpy/dsh-imagegen/panel.module.css";
1803
1948
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
1804
1949
  const tag = document.createElement("style");
@@ -1808,176 +1953,226 @@ window.__ModuleLoader__.load({
1808
1953
  document.head.appendChild(tag);
1809
1954
  }
1810
1955
  var panel_module_css_default = {
1811
- "image": "kUIMeq_image",
1812
- "historyMeta": "kUIMeq_historyMeta",
1813
- "connectionStatus": "kUIMeq_connectionStatus",
1814
- "historyActions": "kUIMeq_historyActions",
1815
- "uploadBox": "kUIMeq_uploadBox",
1816
- "lightboxTool": "kUIMeq_lightboxTool",
1817
- "galleryFilterNote": "kUIMeq_galleryFilterNote",
1818
- "lightboxTools": "kUIMeq_lightboxTools",
1819
- "canvasError": "kUIMeq_canvasError",
1820
- "galleryFilter": "kUIMeq_galleryFilter",
1821
- "galleryRatioList": "kUIMeq_galleryRatioList",
1822
- "card": "kUIMeq_card",
1823
- "historyPrompt": "kUIMeq_historyPrompt",
1824
- "galleryRatio": "kUIMeq_galleryRatio",
1825
- "comparisonBoard": "kUIMeq_comparisonBoard",
1826
- "paramHint": "kUIMeq_paramHint",
1827
- "entryIcon": "kUIMeq_entryIcon",
1828
- "panelTitle": "kUIMeq_panelTitle",
1829
- "referenceImage": "kUIMeq_referenceImage",
1830
- "canvasStateTitle": "kUIMeq_canvasStateTitle",
1831
- "historyFilters": "kUIMeq_historyFilters",
1832
- "canvas": "kUIMeq_canvas",
1833
- "uploadIcon": "kUIMeq_uploadIcon",
1834
- "grid": "kUIMeq_grid",
1835
- "lightboxScaleFrame": "kUIMeq_lightboxScaleFrame",
1836
- "panel": "kUIMeq_panel",
1837
- "sessionTabLabel": "kUIMeq_sessionTabLabel",
1838
- "entry": "kUIMeq_entry",
1839
- "dshImageGenToastIn": "kUIMeq_dshImageGenToastIn",
1840
- "galleryFilterCount": "kUIMeq_galleryFilterCount",
1841
- "taskTrayCount": "kUIMeq_taskTrayCount",
1842
- "comparisonImageButton": "kUIMeq_comparisonImageButton",
1843
- "configGuideBody": "kUIMeq_configGuideBody",
1844
- "optionPill": "kUIMeq_optionPill",
1845
- "conversationAdd": "kUIMeq_conversationAdd",
1846
- "galleryFilters": "kUIMeq_galleryFilters",
1847
- "galleryTagFilter": "kUIMeq_galleryTagFilter",
1848
- "footer": "kUIMeq_footer",
1849
- "gallerySelectionBar": "kUIMeq_gallerySelectionBar",
1850
- "gallerySelect": "kUIMeq_gallerySelect",
1851
- "galleryTags": "kUIMeq_galleryTags",
1852
- "lightboxClose": "kUIMeq_lightboxClose",
1853
- "canvasEmptyIcon": "kUIMeq_canvasEmptyIcon",
1854
- "githubLink": "kUIMeq_githubLink",
1855
- "historyClear": "kUIMeq_historyClear",
1856
- "optionGrid": "kUIMeq_optionGrid",
1857
- "lightboxActions": "kUIMeq_lightboxActions",
1858
- "sessionTabs": "kUIMeq_sessionTabs",
1859
- "lightboxCopy": "kUIMeq_lightboxCopy",
1860
- "referenceActions": "kUIMeq_referenceActions",
1861
- "compareModelChoices": "kUIMeq_compareModelChoices",
1862
- "reference": "kUIMeq_reference",
1863
- "promptCount": "kUIMeq_promptCount",
1864
- "imageCard": "kUIMeq_imageCard",
1865
- "taskTrayClose": "kUIMeq_taskTrayClose",
1866
- "canvasState": "kUIMeq_canvasState",
1867
- "historyAction": "kUIMeq_historyAction",
1868
- "modelMenu": "kUIMeq_modelMenu",
1869
- "lightboxFigure": "kUIMeq_lightboxFigure",
1870
- "lightboxEdit": "kUIMeq_lightboxEdit",
1871
- "historyHeader": "kUIMeq_historyHeader",
1872
- "chatResizer": "kUIMeq_chatResizer",
1873
- "galleryMasonry": "kUIMeq_galleryMasonry",
1874
- "modeRow": "kUIMeq_modeRow",
1875
- "download": "kUIMeq_download",
1876
- "generation": "kUIMeq_generation",
1877
- "comparisonFullscreen": "kUIMeq_comparisonFullscreen",
1878
- "galleryHeading": "kUIMeq_galleryHeading",
1879
- "prompt": "kUIMeq_prompt",
1880
- "spinner": "kUIMeq_spinner",
1881
- "gallerySort": "kUIMeq_gallerySort",
1882
- "historyThumbPlaceholder": "kUIMeq_historyThumbPlaceholder",
1883
- "templatesButton": "kUIMeq_templatesButton",
1884
- "optionRow": "kUIMeq_optionRow",
1885
- "galleryAdd": "kUIMeq_galleryAdd",
1886
- "lightboxMeta": "kUIMeq_lightboxMeta",
1887
- "compareToggle": "kUIMeq_compareToggle",
1888
- "taskPrompt": "kUIMeq_taskPrompt",
1889
- "enhanceButton": "kUIMeq_enhanceButton",
1890
- "galleryBadge": "kUIMeq_galleryBadge",
1891
- "gallerySelectionClear": "kUIMeq_gallerySelectionClear",
1892
- "gallerySearch": "kUIMeq_gallerySearch",
1893
- "paramGroup": "kUIMeq_paramGroup",
1894
- "canvasMeta": "kUIMeq_canvasMeta",
1895
- "lightboxImage": "kUIMeq_lightboxImage",
1896
- "generateInner": "kUIMeq_generateInner",
1897
- "galleryWorkspace": "kUIMeq_galleryWorkspace",
1898
- "galleryBulkButton": "kUIMeq_galleryBulkButton",
1899
- "updateBanner": "kUIMeq_updateBanner",
1900
- "updateText": "kUIMeq_updateText",
1901
- "taskTrayToggle": "kUIMeq_taskTrayToggle",
1902
- "galleryCard": "kUIMeq_galleryCard",
1903
- "taskRows": "kUIMeq_taskRows",
1904
- "bigSpinner": "kUIMeq_bigSpinner",
1905
- "view": "kUIMeq_view",
1906
- "zoomHint": "kUIMeq_zoomHint",
1907
- "sidebarHistoryHost": "kUIMeq_sidebarHistoryHost",
1908
- "panelHeader": "kUIMeq_panelHeader",
1909
- "studio": "kUIMeq_studio",
1910
- "historyEmpty": "kUIMeq_historyEmpty",
1911
- "historyItem": "kUIMeq_historyItem",
1912
- "history": "kUIMeq_history",
1913
- "dshImageGenSpin": "kUIMeq_dshImageGenSpin",
1914
- "galleryCount": "kUIMeq_galleryCount",
1915
- "taskTrayHeader": "kUIMeq_taskTrayHeader",
1916
- "galleryRemove": "kUIMeq_galleryRemove",
1917
- "sessionTabIcon": "kUIMeq_sessionTabIcon",
1918
- "galleryToolbarActions": "kUIMeq_galleryToolbarActions",
1919
- "canvasHistoryTag": "kUIMeq_canvasHistoryTag",
1920
- "galleryImageButton": "kUIMeq_galleryImageButton",
1921
- "lightboxDownload": "kUIMeq_lightboxDownload",
1922
- "galleryClear": "kUIMeq_galleryClear",
1923
- "sessionTab": "kUIMeq_sessionTab",
1924
- "galleryImage": "kUIMeq_galleryImage",
1925
- "config": "kUIMeq_config",
1926
- "historySearch": "kUIMeq_historySearch",
1927
- "historyMain": "kUIMeq_historyMain",
1928
- "updateActions": "kUIMeq_updateActions",
1929
- "galleryTagInput": "kUIMeq_galleryTagInput",
1930
- "galleryToast": "kUIMeq_galleryToast",
1931
- "entryLabel": "kUIMeq_entryLabel",
1932
- "gallerySelectMode": "kUIMeq_gallerySelectMode",
1933
- "modelWrap": "kUIMeq_modelWrap",
1934
- "canvasStateHint": "kUIMeq_canvasStateHint",
1935
- "taskTray": "kUIMeq_taskTray",
1936
- "galleryTagEdit": "kUIMeq_galleryTagEdit",
1937
- "taskTrayChevron": "kUIMeq_taskTrayChevron",
1938
- "galleryFilterHeading": "kUIMeq_galleryFilterHeading",
1939
- "galleryFilterDivider": "kUIMeq_galleryFilterDivider",
1940
- "galleryToolbar": "kUIMeq_galleryToolbar",
1941
- "hiddenFile": "kUIMeq_hiddenFile",
1942
- "paramLabel": "kUIMeq_paramLabel",
1943
- "galleryViewToggle": "kUIMeq_galleryViewToggle",
1944
- "lightboxNav": "kUIMeq_lightboxNav",
1945
- "canvasBody": "kUIMeq_canvasBody",
1946
- "galleryTagEditor": "kUIMeq_galleryTagEditor",
1947
- "taskRow": "kUIMeq_taskRow",
1948
- "lightboxStage": "kUIMeq_lightboxStage",
1949
- "historyThumb": "kUIMeq_historyThumb",
1950
- "modePill": "kUIMeq_modePill",
1951
- "promptFooter": "kUIMeq_promptFooter",
1952
- "comparisonFullscreenGrid": "kUIMeq_comparisonFullscreenGrid",
1953
- "generateButton": "kUIMeq_generateButton",
1954
- "imageCaption": "kUIMeq_imageCaption",
1955
- "historyList": "kUIMeq_historyList",
1956
- "modelSelect": "kUIMeq_modelSelect",
1957
- "updateRelease": "kUIMeq_updateRelease",
1958
- "modelLabel": "kUIMeq_modelLabel",
1959
- "configGuide": "kUIMeq_configGuide",
1960
- "uploadHint": "kUIMeq_uploadHint",
1961
- "modelMenuList": "kUIMeq_modelMenuList",
1962
- "connectionDot": "kUIMeq_connectionDot",
1963
- "modelMenuItem": "kUIMeq_modelMenuItem",
1964
- "comparisonGrid": "kUIMeq_comparisonGrid",
1965
- "lightboxCaptionRow": "kUIMeq_lightboxCaptionRow",
1966
- "galleryCardFooter": "kUIMeq_galleryCardFooter",
1967
- "lightboxCaption": "kUIMeq_lightboxCaption",
1968
- "galleryCardInfo": "kUIMeq_galleryCardInfo",
1969
- "historyInfo": "kUIMeq_historyInfo",
1970
- "lightboxZoomLevel": "kUIMeq_lightboxZoomLevel",
1971
- "lightboxIndex": "kUIMeq_lightboxIndex",
1972
- "taskStatus": "kUIMeq_taskStatus",
1973
- "compareControl": "kUIMeq_compareControl",
1974
- "configScroll": "kUIMeq_configScroll",
1975
- "historyTitle": "kUIMeq_historyTitle",
1976
- "lightbox": "kUIMeq_lightbox",
1977
- "galleryAvatar": "kUIMeq_galleryAvatar",
1978
- "panelHeading": "kUIMeq_panelHeading",
1979
- "conversationToast": "kUIMeq_conversationToast",
1980
- "galleryTagFilterList": "kUIMeq_galleryTagFilterList"
1956
+ "galleryAdd": "Yvqh9W_galleryAdd",
1957
+ "ecommerceResultsHeader": "Yvqh9W_ecommerceResultsHeader",
1958
+ "lightboxCopy": "Yvqh9W_lightboxCopy",
1959
+ "galleryToolbar": "Yvqh9W_galleryToolbar",
1960
+ "ecommerceAdvancedChevron": "Yvqh9W_ecommerceAdvancedChevron",
1961
+ "bigSpinner": "Yvqh9W_bigSpinner",
1962
+ "lightboxScaleFrame": "Yvqh9W_lightboxScaleFrame",
1963
+ "galleryViewToggle": "Yvqh9W_galleryViewToggle",
1964
+ "compareControl": "Yvqh9W_compareControl",
1965
+ "galleryCardInfo": "Yvqh9W_galleryCardInfo",
1966
+ "studio": "Yvqh9W_studio",
1967
+ "ecommerceFooterHint": "Yvqh9W_ecommerceFooterHint",
1968
+ "download": "Yvqh9W_download",
1969
+ "galleryFilterHeading": "Yvqh9W_galleryFilterHeading",
1970
+ "dshImageGenSpin": "Yvqh9W_dshImageGenSpin",
1971
+ "galleryRatioList": "Yvqh9W_galleryRatioList",
1972
+ "configHeader": "Yvqh9W_configHeader",
1973
+ "configGuideBody": "Yvqh9W_configGuideBody",
1974
+ "view": "Yvqh9W_view",
1975
+ "historyPrompt": "Yvqh9W_historyPrompt",
1976
+ "ecommerceGroups": "Yvqh9W_ecommerceGroups",
1977
+ "galleryTags": "Yvqh9W_galleryTags",
1978
+ "modelMenuList": "Yvqh9W_modelMenuList",
1979
+ "topNav": "Yvqh9W_topNav",
1980
+ "galleryWorkspace": "Yvqh9W_galleryWorkspace",
1981
+ "gallerySelectMode": "Yvqh9W_gallerySelectMode",
1982
+ "referenceImage": "Yvqh9W_referenceImage",
1983
+ "ecommerceSlotCard": "Yvqh9W_ecommerceSlotCard",
1984
+ "configScroll": "Yvqh9W_configScroll",
1985
+ "galleryTagInput": "Yvqh9W_galleryTagInput",
1986
+ "ecommercePlanBack": "Yvqh9W_ecommercePlanBack",
1987
+ "modelMenu": "Yvqh9W_modelMenu",
1988
+ "ecommerceTaskCard": "Yvqh9W_ecommerceTaskCard",
1989
+ "chatResizer": "Yvqh9W_chatResizer",
1990
+ "canvasMeta": "Yvqh9W_canvasMeta",
1991
+ "card": "Yvqh9W_card",
1992
+ "ecommerceAdvancedToggle": "Yvqh9W_ecommerceAdvancedToggle",
1993
+ "optionPill": "Yvqh9W_optionPill",
1994
+ "lightbox": "Yvqh9W_lightbox",
1995
+ "galleryFilter": "Yvqh9W_galleryFilter",
1996
+ "spinner": "Yvqh9W_spinner",
1997
+ "historyMeta": "Yvqh9W_historyMeta",
1998
+ "canvasError": "Yvqh9W_canvasError",
1999
+ "ecommerceUploadHero": "Yvqh9W_ecommerceUploadHero",
2000
+ "canvasHistoryTag": "Yvqh9W_canvasHistoryTag",
2001
+ "lightboxClose": "Yvqh9W_lightboxClose",
2002
+ "galleryFilterDivider": "Yvqh9W_galleryFilterDivider",
2003
+ "galleryHeading": "Yvqh9W_galleryHeading",
2004
+ "galleryAvatar": "Yvqh9W_galleryAvatar",
2005
+ "taskStatus": "Yvqh9W_taskStatus",
2006
+ "taskTrayToggle": "Yvqh9W_taskTrayToggle",
2007
+ "taskRows": "Yvqh9W_taskRows",
2008
+ "panelHeaderActions": "Yvqh9W_panelHeaderActions",
2009
+ "sessionTabLabel": "Yvqh9W_sessionTabLabel",
2010
+ "ecommerceFooterBody": "Yvqh9W_ecommerceFooterBody",
2011
+ "panelHeading": "Yvqh9W_panelHeading",
2012
+ "entryIcon": "Yvqh9W_entryIcon",
2013
+ "configToggle": "Yvqh9W_configToggle",
2014
+ "historyEmpty": "Yvqh9W_historyEmpty",
2015
+ "ecommercePlanWarn": "Yvqh9W_ecommercePlanWarn",
2016
+ "ecommerceResultBadge": "Yvqh9W_ecommerceResultBadge",
2017
+ "chatToggle": "Yvqh9W_chatToggle",
2018
+ "promptFooter": "Yvqh9W_promptFooter",
2019
+ "ecommerceFieldLabel": "Yvqh9W_ecommerceFieldLabel",
2020
+ "enhanceButton": "Yvqh9W_enhanceButton",
2021
+ "footer": "Yvqh9W_footer",
2022
+ "taskTrayChevron": "Yvqh9W_taskTrayChevron",
2023
+ "lightboxCaptionRow": "Yvqh9W_lightboxCaptionRow",
2024
+ "lightboxCaption": "Yvqh9W_lightboxCaption",
2025
+ "taskTrayClose": "Yvqh9W_taskTrayClose",
2026
+ "lightboxDownload": "Yvqh9W_lightboxDownload",
2027
+ "reference": "Yvqh9W_reference",
2028
+ "taskTray": "Yvqh9W_taskTray",
2029
+ "ecommerceGroup": "Yvqh9W_ecommerceGroup",
2030
+ "ecommerceAssets": "Yvqh9W_ecommerceAssets",
2031
+ "lightboxEdit": "Yvqh9W_lightboxEdit",
2032
+ "ecommerceAssetAdd": "Yvqh9W_ecommerceAssetAdd",
2033
+ "historyHeader": "Yvqh9W_historyHeader",
2034
+ "ecommerceResultsEmpty": "Yvqh9W_ecommerceResultsEmpty",
2035
+ "sessionTab": "Yvqh9W_sessionTab",
2036
+ "generateInner": "Yvqh9W_generateInner",
2037
+ "dshImageGenToastIn": "Yvqh9W_dshImageGenToastIn",
2038
+ "galleryTagFilterList": "Yvqh9W_galleryTagFilterList",
2039
+ "generateButton": "Yvqh9W_generateButton",
2040
+ "imageCaption": "Yvqh9W_imageCaption",
2041
+ "ecommerceAdvancedBody": "Yvqh9W_ecommerceAdvancedBody",
2042
+ "ecommerceWorkspace": "Yvqh9W_ecommerceWorkspace",
2043
+ "ecommerceTaskActions": "Yvqh9W_ecommerceTaskActions",
2044
+ "gallerySelect": "Yvqh9W_gallerySelect",
2045
+ "galleryTagEdit": "Yvqh9W_galleryTagEdit",
2046
+ "ecommerceGroupGrid": "Yvqh9W_ecommerceGroupGrid",
2047
+ "historyClear": "Yvqh9W_historyClear",
2048
+ "galleryTagEditor": "Yvqh9W_galleryTagEditor",
2049
+ "uploadHint": "Yvqh9W_uploadHint",
2050
+ "referenceActions": "Yvqh9W_referenceActions",
2051
+ "gallerySort": "Yvqh9W_gallerySort",
2052
+ "compareToggle": "Yvqh9W_compareToggle",
2053
+ "sidebarHistoryHost": "Yvqh9W_sidebarHistoryHost",
2054
+ "ecommercePlanList": "Yvqh9W_ecommercePlanList",
2055
+ "ecommercePrimaryAction": "Yvqh9W_ecommercePrimaryAction",
2056
+ "updateActions": "Yvqh9W_updateActions",
2057
+ "configGuide": "Yvqh9W_configGuide",
2058
+ "galleryFilterCount": "Yvqh9W_galleryFilterCount",
2059
+ "ecommerceField": "Yvqh9W_ecommerceField",
2060
+ "lightboxFigure": "Yvqh9W_lightboxFigure",
2061
+ "gallerySelectionClear": "Yvqh9W_gallerySelectionClear",
2062
+ "modeRow": "Yvqh9W_modeRow",
2063
+ "galleryCardFooter": "Yvqh9W_galleryCardFooter",
2064
+ "topNavDivider": "Yvqh9W_topNavDivider",
2065
+ "comparisonFullscreen": "Yvqh9W_comparisonFullscreen",
2066
+ "galleryRatio": "Yvqh9W_galleryRatio",
2067
+ "ecommercePlanMini": "Yvqh9W_ecommercePlanMini",
2068
+ "ecommerceResults": "Yvqh9W_ecommerceResults",
2069
+ "paramLabel": "Yvqh9W_paramLabel",
2070
+ "lightboxMeta": "Yvqh9W_lightboxMeta",
2071
+ "comparisonImageButton": "Yvqh9W_comparisonImageButton",
2072
+ "taskPrompt": "Yvqh9W_taskPrompt",
2073
+ "gallerySearch": "Yvqh9W_gallerySearch",
2074
+ "ecommerceActionChip": "Yvqh9W_ecommerceActionChip",
2075
+ "historyFilters": "Yvqh9W_historyFilters",
2076
+ "canvasBody": "Yvqh9W_canvasBody",
2077
+ "lightboxNav": "Yvqh9W_lightboxNav",
2078
+ "historyNew": "Yvqh9W_historyNew",
2079
+ "imageCard": "Yvqh9W_imageCard",
2080
+ "updateBanner": "Yvqh9W_updateBanner",
2081
+ "updateText": "Yvqh9W_updateText",
2082
+ "ecommerceParamGrid": "Yvqh9W_ecommerceParamGrid",
2083
+ "historyThumbPlaceholder": "Yvqh9W_historyThumbPlaceholder",
2084
+ "modelMenuItem": "Yvqh9W_modelMenuItem",
2085
+ "connectionDot": "Yvqh9W_connectionDot",
2086
+ "lightboxImage": "Yvqh9W_lightboxImage",
2087
+ "galleryClear": "Yvqh9W_galleryClear",
2088
+ "updateRelease": "Yvqh9W_updateRelease",
2089
+ "historyItem": "Yvqh9W_historyItem",
2090
+ "uploadIcon": "Yvqh9W_uploadIcon",
2091
+ "modelWrap": "Yvqh9W_modelWrap",
2092
+ "galleryToast": "Yvqh9W_galleryToast",
2093
+ "grid": "Yvqh9W_grid",
2094
+ "lightboxStage": "Yvqh9W_lightboxStage",
2095
+ "galleryImageButton": "Yvqh9W_galleryImageButton",
2096
+ "galleryRemove": "Yvqh9W_galleryRemove",
2097
+ "galleryBadge": "Yvqh9W_galleryBadge",
2098
+ "optionRow": "Yvqh9W_optionRow",
2099
+ "modePill": "Yvqh9W_modePill",
2100
+ "historySearch": "Yvqh9W_historySearch",
2101
+ "compareModelChoices": "Yvqh9W_compareModelChoices",
2102
+ "topNavItem": "Yvqh9W_topNavItem",
2103
+ "sessionTabIcon": "Yvqh9W_sessionTabIcon",
2104
+ "ecommercePlanNote": "Yvqh9W_ecommercePlanNote",
2105
+ "galleryCardAction": "Yvqh9W_galleryCardAction",
2106
+ "prompt": "Yvqh9W_prompt",
2107
+ "ecommerceSection": "Yvqh9W_ecommerceSection",
2108
+ "historyMain": "Yvqh9W_historyMain",
2109
+ "optionGrid": "Yvqh9W_optionGrid",
2110
+ "conversationToast": "Yvqh9W_conversationToast",
2111
+ "galleryCard": "Yvqh9W_galleryCard",
2112
+ "conversationAdd": "Yvqh9W_conversationAdd",
2113
+ "ecommerceSectionHint": "Yvqh9W_ecommerceSectionHint",
2114
+ "entryLabel": "Yvqh9W_entryLabel",
2115
+ "taskTrayCount": "Yvqh9W_taskTrayCount",
2116
+ "connectionStatus": "Yvqh9W_connectionStatus",
2117
+ "historyThumb": "Yvqh9W_historyThumb",
2118
+ "ecommerceRefRow": "Yvqh9W_ecommerceRefRow",
2119
+ "lightboxTool": "Yvqh9W_lightboxTool",
2120
+ "galleryToolbarActions": "Yvqh9W_galleryToolbarActions",
2121
+ "comparisonGrid": "Yvqh9W_comparisonGrid",
2122
+ "hiddenFile": "Yvqh9W_hiddenFile",
2123
+ "canvasState": "Yvqh9W_canvasState",
2124
+ "previewBadge": "Yvqh9W_previewBadge",
2125
+ "ecommerceTaskState": "Yvqh9W_ecommerceTaskState",
2126
+ "canvasStateTitle": "Yvqh9W_canvasStateTitle",
2127
+ "canvasStateHint": "Yvqh9W_canvasStateHint",
2128
+ "githubLink": "Yvqh9W_githubLink",
2129
+ "lightboxTools": "Yvqh9W_lightboxTools",
2130
+ "galleryTagFilter": "Yvqh9W_galleryTagFilter",
2131
+ "galleryFilterNote": "Yvqh9W_galleryFilterNote",
2132
+ "galleryImage": "Yvqh9W_galleryImage",
2133
+ "taskTrayHeader": "Yvqh9W_taskTrayHeader",
2134
+ "galleryCount": "Yvqh9W_galleryCount",
2135
+ "galleryCardActions": "Yvqh9W_galleryCardActions",
2136
+ "historyActions": "Yvqh9W_historyActions",
2137
+ "sessionTabs": "Yvqh9W_sessionTabs",
2138
+ "entry": "Yvqh9W_entry",
2139
+ "lightboxIndex": "Yvqh9W_lightboxIndex",
2140
+ "lightboxActions": "Yvqh9W_lightboxActions",
2141
+ "history": "Yvqh9W_history",
2142
+ "comparisonBoard": "Yvqh9W_comparisonBoard",
2143
+ "galleryBulkButton": "Yvqh9W_galleryBulkButton",
2144
+ "historyList": "Yvqh9W_historyList",
2145
+ "config": "Yvqh9W_config",
2146
+ "ecommerceStructureGrid": "Yvqh9W_ecommerceStructureGrid",
2147
+ "ecommerceSlotCount": "Yvqh9W_ecommerceSlotCount",
2148
+ "ecommerceAsset": "Yvqh9W_ecommerceAsset",
2149
+ "historyInfo": "Yvqh9W_historyInfo",
2150
+ "promptCount": "Yvqh9W_promptCount",
2151
+ "templatesButton": "Yvqh9W_templatesButton",
2152
+ "paramHint": "Yvqh9W_paramHint",
2153
+ "configResizer": "Yvqh9W_configResizer",
2154
+ "paramGroup": "Yvqh9W_paramGroup",
2155
+ "modelLabel": "Yvqh9W_modelLabel",
2156
+ "canvasEmptyIcon": "Yvqh9W_canvasEmptyIcon",
2157
+ "lightboxZoomLevel": "Yvqh9W_lightboxZoomLevel",
2158
+ "comparisonFullscreenGrid": "Yvqh9W_comparisonFullscreenGrid",
2159
+ "gallerySelectionBar": "Yvqh9W_gallerySelectionBar",
2160
+ "canvas": "Yvqh9W_canvas",
2161
+ "galleryMasonry": "Yvqh9W_galleryMasonry",
2162
+ "taskRow": "Yvqh9W_taskRow",
2163
+ "image": "Yvqh9W_image",
2164
+ "uploadBox": "Yvqh9W_uploadBox",
2165
+ "panelHeader": "Yvqh9W_panelHeader",
2166
+ "panelTitle": "Yvqh9W_panelTitle",
2167
+ "historyAction": "Yvqh9W_historyAction",
2168
+ "zoomHint": "Yvqh9W_zoomHint",
2169
+ "galleryFilters": "Yvqh9W_galleryFilters",
2170
+ "generation": "Yvqh9W_generation",
2171
+ "panel": "Yvqh9W_panel",
2172
+ "historyTitle": "Yvqh9W_historyTitle",
2173
+ "historyHeaderActions": "Yvqh9W_historyHeaderActions",
2174
+ "ecommerceResultsActions": "Yvqh9W_ecommerceResultsActions",
2175
+ "modelSelect": "Yvqh9W_modelSelect"
1981
2176
  };
1982
2177
  //#endregion
1983
2178
  //#region src/client/ImageGenPanel.tsx
@@ -2032,9 +2227,78 @@ window.__ModuleLoader__.load({
2032
2227
  "high"
2033
2228
  ];
2034
2229
  const REF_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
2230
+ const CONVERSATION_IMAGE_MAX_DIMENSION = 2e3;
2231
+ const CONVERSATION_IMAGE_JPEG_QUALITY = .9;
2035
2232
  const PREVIEW_SCALE_MIN = .5;
2036
2233
  const PREVIEW_SCALE_MAX = 3;
2037
2234
  const PREVIEW_SCALE_STEP = .25;
2235
+ const CONFIG_COLLAPSED_STORAGE_KEY = "dsh-imagegen-config-collapsed";
2236
+ const ECOMMERCE_DRAFT_STORAGE_KEY = "dsh-imagegen-ecommerce-draft";
2237
+ /** Reference roles an uploaded product asset can play (slot selections can
2238
+ * also pick 'none'). */
2239
+ const ECOMMERCE_ASSET_ROLES = [
2240
+ "product",
2241
+ "packaging",
2242
+ "detail",
2243
+ "style"
2244
+ ];
2245
+ const MAX_ECOMMERCE_ASSETS = 4;
2246
+ const ECOMMERCE_ROLE_PROMPT_LABELS = {
2247
+ product: "商品主体",
2248
+ packaging: "包装",
2249
+ detail: "细节/角度",
2250
+ style: "风格参考"
2251
+ };
2252
+ const PRODUCT_SET_SLOTS = [
2253
+ {
2254
+ key: "main",
2255
+ label: "主图",
2256
+ description: "干净背景,突出商品主体",
2257
+ count: 1,
2258
+ enabled: true,
2259
+ refRole: "product"
2260
+ },
2261
+ {
2262
+ key: "selling-point",
2263
+ label: "卖点图",
2264
+ description: "用画面展示商品核心卖点",
2265
+ count: 2,
2266
+ enabled: true,
2267
+ refRole: "product"
2268
+ },
2269
+ {
2270
+ key: "scene",
2271
+ label: "场景图",
2272
+ description: "真实生活或使用场景",
2273
+ count: 2,
2274
+ enabled: true,
2275
+ refRole: "product"
2276
+ },
2277
+ {
2278
+ key: "detail",
2279
+ label: "细节图",
2280
+ description: "材质、结构或工艺特写",
2281
+ count: 1,
2282
+ enabled: true,
2283
+ refRole: "detail"
2284
+ },
2285
+ {
2286
+ key: "spec",
2287
+ label: "规格图",
2288
+ description: "尺寸、容量或参数展示",
2289
+ count: 1,
2290
+ enabled: false,
2291
+ refRole: "product"
2292
+ },
2293
+ {
2294
+ key: "model",
2295
+ label: "使用图",
2296
+ description: "人物上手或穿戴效果",
2297
+ count: 1,
2298
+ enabled: false,
2299
+ refRole: "product"
2300
+ }
2301
+ ];
2038
2302
  /** Legacy pixel sizes saved by older versions, mapped onto the current
2039
2303
  * aspect-ratio vocabulary so restoring old history entries still works. */
2040
2304
  const LEGACY_SIZE_TO_RATIO = {
@@ -2064,6 +2328,37 @@ window.__ModuleLoader__.load({
2064
2328
  function clampPreviewScale(scale) {
2065
2329
  return Math.min(PREVIEW_SCALE_MAX, Math.max(PREVIEW_SCALE_MIN, scale));
2066
2330
  }
2331
+ /** Keep the image canvas preference across panel remounts without making it
2332
+ * part of the host settings document. */
2333
+ function readConfigCollapsed() {
2334
+ try {
2335
+ return window.localStorage.getItem(CONFIG_COLLAPSED_STORAGE_KEY) === "true";
2336
+ } catch {
2337
+ return false;
2338
+ }
2339
+ }
2340
+ const CHAT_COLLAPSED_STORAGE_KEY = "dsh-imagegen:chat-collapsed";
2341
+ const CONFIG_WIDTH_STORAGE_KEY = "dsh-imagegen:config-width";
2342
+ const CONFIG_WIDTH_MIN = 260;
2343
+ const CONFIG_WIDTH_MAX = 480;
2344
+ const CONFIG_WIDTH_DEFAULT = 300;
2345
+ /** The chat pane starts collapsed unless the user explicitly opened it. */
2346
+ function readChatOpen() {
2347
+ try {
2348
+ return window.localStorage.getItem(CHAT_COLLAPSED_STORAGE_KEY) === "open";
2349
+ } catch {
2350
+ return false;
2351
+ }
2352
+ }
2353
+ function readConfigWidth() {
2354
+ try {
2355
+ const raw = window.localStorage.getItem(CONFIG_WIDTH_STORAGE_KEY);
2356
+ if (raw === null) return CONFIG_WIDTH_DEFAULT;
2357
+ const value = Number(raw);
2358
+ if (Number.isFinite(value) && value > 0) return Math.min(CONFIG_WIDTH_MAX, Math.max(CONFIG_WIDTH_MIN, Math.round(value)));
2359
+ } catch {}
2360
+ return CONFIG_WIDTH_DEFAULT;
2361
+ }
2067
2362
  /** Read the current config from the settings scope snapshot. */
2068
2363
  function useConfig(scope) {
2069
2364
  const [value, setValue] = (0, react.useState)(scope.getSnapshot().value);
@@ -2133,6 +2428,62 @@ window.__ModuleLoader__.load({
2133
2428
  for (let offset = 0; offset < binary.length; offset += 1) bytes[offset] = binary.charCodeAt(offset);
2134
2429
  return new File([bytes], `dsh-image-${index + 1}.${extensionOf(image.mime)}`, { type: image.mime });
2135
2430
  }
2431
+ /** Decode a data URL into a browser File for the native composer. */
2432
+ function dataUrlToFile(dataUrl, name) {
2433
+ const match = /^data:(image\/(?:png|jpeg|webp|gif));base64,(.*)$/su.exec(dataUrl);
2434
+ if (match === null || match[1] === void 0 || match[2] === void 0) throw new Error("image processing returned an invalid data URL");
2435
+ const binary = atob(match[2]);
2436
+ const bytes = new Uint8Array(binary.length);
2437
+ for (let offset = 0; offset < binary.length; offset += 1) bytes[offset] = binary.charCodeAt(offset);
2438
+ return new File([bytes], name, { type: match[1] });
2439
+ }
2440
+ /** Read intrinsic dimensions without changing the original preview. */
2441
+ function imageDimensions(dataUrl) {
2442
+ return new Promise((resolve, reject) => {
2443
+ const image = new Image();
2444
+ image.onload = () => {
2445
+ const width = image.naturalWidth || image.width;
2446
+ const height = image.naturalHeight || image.height;
2447
+ if (width < 1 || height < 1) reject(/* @__PURE__ */ new Error("image dimensions are unavailable"));
2448
+ else resolve({
2449
+ width,
2450
+ height
2451
+ });
2452
+ };
2453
+ image.onerror = () => reject(/* @__PURE__ */ new Error("image decode failed"));
2454
+ image.src = dataUrl;
2455
+ });
2456
+ }
2457
+ /** Prepare the smaller conversation copy required by the host attachment policy. */
2458
+ async function prepareConversationImage(image, index) {
2459
+ const dataUrl = srcOf(image);
2460
+ const { width, height } = await imageDimensions(dataUrl);
2461
+ const longestSide = Math.max(width, height);
2462
+ if (longestSide <= CONVERSATION_IMAGE_MAX_DIMENSION) return {
2463
+ file: generatedImageToFile(image, index),
2464
+ dataUrl
2465
+ };
2466
+ const scale = CONVERSATION_IMAGE_MAX_DIMENSION / longestSide;
2467
+ const targetWidth = Math.max(1, Math.round(width * scale));
2468
+ const targetHeight = Math.max(1, Math.round(height * scale));
2469
+ const canvas = document.createElement("canvas");
2470
+ canvas.width = targetWidth;
2471
+ canvas.height = targetHeight;
2472
+ const context = canvas.getContext("2d");
2473
+ if (context === null) throw new Error("image resize is unavailable in this browser");
2474
+ const source = await new Promise((resolve, reject) => {
2475
+ const sourceImage = new Image();
2476
+ sourceImage.onload = () => resolve(sourceImage);
2477
+ sourceImage.onerror = () => reject(/* @__PURE__ */ new Error("image decode failed"));
2478
+ sourceImage.src = dataUrl;
2479
+ });
2480
+ context.drawImage(source, 0, 0, targetWidth, targetHeight);
2481
+ const resizedDataUrl = canvas.toDataURL("image/jpeg", CONVERSATION_IMAGE_JPEG_QUALITY);
2482
+ return {
2483
+ dataUrl: resizedDataUrl,
2484
+ file: dataUrlToFile(resizedDataUrl, `dsh-image-${index + 1}.jpg`)
2485
+ };
2486
+ }
2136
2487
  /** Follow the native session selection while the image panel stays mounted. */
2137
2488
  function useCurrentSessionId(sessions) {
2138
2489
  const [sessionId, setSessionId] = (0, react.useState)(() => sessions?.list.getSnapshot().current);
@@ -2194,14 +2545,45 @@ window.__ModuleLoader__.load({
2194
2545
  const pad = (n) => String(n).padStart(2, "0");
2195
2546
  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
2196
2547
  }
2548
+ function defaultEcommerceDraft() {
2549
+ return {
2550
+ projectId: "",
2551
+ projectName: "",
2552
+ category: "通用商品",
2553
+ platform: "通用",
2554
+ language: "中文",
2555
+ size: "1:1",
2556
+ productName: "",
2557
+ sellingPoints: "",
2558
+ protectedFeatures: "",
2559
+ styleHint: "",
2560
+ slots: PRODUCT_SET_SLOTS.map((slot) => ({ ...slot }))
2561
+ };
2562
+ }
2563
+ function ecommercePrompt(draft, slot) {
2564
+ const points = draft.sellingPoints.trim() || "突出商品真实材质、结构和核心价值";
2565
+ const protectedFeatures = draft.protectedFeatures.trim() || "保持商品颜色、形状、Logo、包装文字和结构真实,不添加不存在的配件";
2566
+ const refClause = slot.refRole !== void 0 && slot.refRole !== "none" ? `本图以上传的${ECOMMERCE_ROLE_PROMPT_LABELS[slot.refRole]}图片为参考,商品与风格必须与参考图保持一致;` : "";
2567
+ return `电商${slot.label}:为${draft.productName.trim() || "该商品"}制作${slot.description}。商品品类:${draft.category};平台:${draft.platform};语言:${draft.language}。商品卖点:${points}。必须遵守:${protectedFeatures}。${refClause}整体要求:商品主体清晰、比例真实、光线自然、画面干净、适合电商发布;${draft.styleHint.trim()}`;
2568
+ }
2569
+ /** Consistency prefix for slots generated after the main image exists. */
2570
+ function withAnchorNote(prompt) {
2571
+ return "商品套图一致性约束:附件是本套商品的主图,图中商品(外形、颜色、材质、Logo、包装文字)必须与附件完全一致,不得重新发明商品。" + prompt;
2572
+ }
2197
2573
  function modelsOfHistoryEntry(entry) {
2198
2574
  return entry.comparisonModels?.length !== void 0 && entry.comparisonModels.length > 1 ? entry.comparisonModels : [entry.model];
2199
2575
  }
2576
+ /** Comparison runs collapse by comparisonId, product sets by projectId. */
2577
+ function historyGroupKey(entry) {
2578
+ if (entry.comparisonId !== void 0) return entry.comparisonId;
2579
+ if (entry.workflow === "ecommerce" && entry.projectId !== void 0) return `project:${entry.projectId}`;
2580
+ return entry.id;
2581
+ }
2200
2582
  /** Collapse the per-model history rows that belong to one comparison run. */
2201
2583
  function groupHistoryEntries(entries) {
2202
2584
  const groups = /* @__PURE__ */ new Map();
2203
2585
  for (const entry of entries) {
2204
- const key = entry.comparisonId ?? entry.id;
2586
+ const key = historyGroupKey(entry);
2205
2587
  const existing = groups.get(key);
2206
2588
  if (existing === void 0) groups.set(key, {
2207
2589
  key,
@@ -2235,6 +2617,12 @@ window.__ModuleLoader__.load({
2235
2617
  const apiKeySet = (config?.channels ?? []).length > 0 ? channelKeySet : legacyKeySet;
2236
2618
  const connected = enabled && configured && apiKeySet;
2237
2619
  const [tab, setTab] = (0, react.useState)("text");
2620
+ const [workspace, setWorkspace] = (0, react.useState)("normal");
2621
+ /** Switch to a normal-generation tab, leaving any task workspace. */
2622
+ const openTab = (next) => {
2623
+ setWorkspace("normal");
2624
+ setTab(next);
2625
+ };
2238
2626
  const [prompt, setPrompt] = (0, react.useState)("");
2239
2627
  const [size, setSize] = (0, react.useState)("auto");
2240
2628
  const [quality, setQuality] = (0, react.useState)("auto");
@@ -2247,6 +2635,7 @@ window.__ModuleLoader__.load({
2247
2635
  const [refImage, setRefImage] = (0, react.useState)(null);
2248
2636
  const [images, setImages] = (0, react.useState)([]);
2249
2637
  const [addingToConversation, setAddingToConversation] = (0, react.useState)(null);
2638
+ const [galleryConversationAddingId, setGalleryConversationAddingId] = (0, react.useState)(null);
2250
2639
  const [conversationMessage, setConversationMessage] = (0, react.useState)(null);
2251
2640
  const [error, setError] = (0, react.useState)(null);
2252
2641
  const [submitting, setSubmitting] = (0, react.useState)(false);
@@ -2285,6 +2674,38 @@ window.__ModuleLoader__.load({
2285
2674
  const [taskTrayOpen, setTaskTrayOpen] = (0, react.useState)(false);
2286
2675
  const [comparison, setComparison] = (0, react.useState)(null);
2287
2676
  const [comparisonFullscreen, setComparisonFullscreen] = (0, react.useState)(false);
2677
+ const [ecommerce, setEcommerce] = (0, react.useState)(() => {
2678
+ try {
2679
+ const saved = window.localStorage.getItem(ECOMMERCE_DRAFT_STORAGE_KEY);
2680
+ if (saved !== null) {
2681
+ const merged = {
2682
+ ...defaultEcommerceDraft(),
2683
+ ...JSON.parse(saved)
2684
+ };
2685
+ if (Array.isArray(merged.slots)) merged.slots = merged.slots.map((slot) => ({
2686
+ ...slot,
2687
+ refRole: slot.refRole ?? "product"
2688
+ }));
2689
+ return merged;
2690
+ }
2691
+ } catch {}
2692
+ return defaultEcommerceDraft();
2693
+ });
2694
+ const [ecommercePreview, setEcommercePreview] = (0, react.useState)(false);
2695
+ const [ecommerceGenerating, setEcommerceGenerating] = (0, react.useState)(false);
2696
+ const [ecommerceProjectId, setEcommerceProjectId] = (0, react.useState)(null);
2697
+ const [ecommerceAssets, setEcommerceAssets] = (0, react.useState)([]);
2698
+ /** History-restored product set currently shown in the results canvas. */
2699
+ const [ecommerceRestored, setEcommerceRestored] = (0, react.useState)(null);
2700
+ /** Pending main-image anchor: the main image task is in flight; once it
2701
+ * completes, the remaining slots are resubmitted with it as their shared
2702
+ * reference so every image in the set shows the same product. */
2703
+ const [ecommerceAnchor, setEcommerceAnchor] = (0, react.useState)(null);
2704
+ const [ecommerceRefOpen, setEcommerceRefOpen] = (0, react.useState)(false);
2705
+ const [configCollapsed, setConfigCollapsed] = (0, react.useState)(readConfigCollapsed);
2706
+ const [chatOpen, setChatOpen] = (0, react.useState)(readChatOpen);
2707
+ const [configWidth, setConfigWidth] = (0, react.useState)(readConfigWidth);
2708
+ const configAsideRef = (0, react.useRef)(null);
2288
2709
  const currentSessionId = useCurrentSessionId(sessions);
2289
2710
  const sidebarHistoryHost = useSidebarHistoryHost();
2290
2711
  const modeModels = tab === "edit" ? imageModels.filter((candidate) => describeModel(candidate).supportsEdit) : imageModels;
@@ -2294,6 +2715,57 @@ window.__ModuleLoader__.load({
2294
2715
  const activeTask = activeTasks.find((task) => task.status === "running") ?? activeTasks[0];
2295
2716
  const generating = submitting || activeTasks.length > 0;
2296
2717
  const elapsed = useElapsed(generating, activeTask?.startedAt ?? activeTask?.createdAt ?? null);
2718
+ (0, react.useEffect)(() => {
2719
+ try {
2720
+ window.localStorage.setItem(ECOMMERCE_DRAFT_STORAGE_KEY, JSON.stringify(ecommerce));
2721
+ } catch {}
2722
+ }, [ecommerce]);
2723
+ (0, react.useEffect)(() => {
2724
+ try {
2725
+ window.localStorage.setItem(CONFIG_COLLAPSED_STORAGE_KEY, String(configCollapsed));
2726
+ } catch {}
2727
+ }, [configCollapsed]);
2728
+ (0, react.useEffect)(() => {
2729
+ if (chatOpen) delete document.documentElement.dataset.dshImagegenChatCollapsed;
2730
+ else document.documentElement.dataset.dshImagegenChatCollapsed = "1";
2731
+ try {
2732
+ window.localStorage.setItem(CHAT_COLLAPSED_STORAGE_KEY, chatOpen ? "open" : "collapsed");
2733
+ } catch {}
2734
+ }, [chatOpen]);
2735
+ (0, react.useEffect)(() => () => {
2736
+ delete document.documentElement.dataset.dshImagegenChatCollapsed;
2737
+ }, []);
2738
+ (0, react.useEffect)(() => {
2739
+ if (ecommerceAnchor === null) return;
2740
+ const anchor = ecommerceAnchor;
2741
+ const mains = tasks.filter((task) => anchor.mainTaskIds.includes(task.id));
2742
+ if (mains.length === 0) return;
2743
+ if (mains.every((task) => task.status === "failed" || task.status === "cancelled")) {
2744
+ setEcommerceAnchor(null);
2745
+ setError(tt("ecommerce.anchorFailed"));
2746
+ return;
2747
+ }
2748
+ const done = mains.find((task) => task.status === "completed" && task.result !== void 0 && task.result.images.length > 0);
2749
+ if (done === void 0) return;
2750
+ setEcommerceAnchor(null);
2751
+ const dataUrl = srcOf(done.result.images[0]);
2752
+ const requests = anchor.remaining.map((request) => ({
2753
+ ...request,
2754
+ mode: "edit",
2755
+ image: dataUrl,
2756
+ refName: "set-main-anchor",
2757
+ prompt: withAnchorNote(request.prompt)
2758
+ }));
2759
+ Promise.all(requests.map((request) => api.taskSubmit(request))).then((submitted) => {
2760
+ setTasks((previous) => [...submitted, ...previous]);
2761
+ }).catch((caught) => {
2762
+ setError(errorMessage(caught));
2763
+ });
2764
+ }, [
2765
+ api,
2766
+ tasks,
2767
+ ecommerceAnchor
2768
+ ]);
2297
2769
  (0, react.useEffect)(() => {
2298
2770
  setModel((previous) => modeModels.includes(previous) ? previous : modeModels[0] ?? "");
2299
2771
  setCompareModels((previous) => {
@@ -2330,7 +2802,7 @@ window.__ModuleLoader__.load({
2330
2802
  const detail = event.detail;
2331
2803
  if (detail === void 0 || currentSessionId === void 0 || detail.sessionId !== currentSessionId) return;
2332
2804
  Promise.all(detail.refs.map(attachmentToGenerated)).then((next) => {
2333
- setTab("text");
2805
+ openTab("text");
2334
2806
  setImages(next);
2335
2807
  setComparison(null);
2336
2808
  setViewingHistoryId(null);
@@ -2464,6 +2936,39 @@ window.__ModuleLoader__.load({
2464
2936
  };
2465
2937
  reader.readAsDataURL(file);
2466
2938
  };
2939
+ /** Read uploaded product assets into session-only data-URL chips, capped at
2940
+ * MAX_ECOMMERCE_ASSETS. Each starts as the product-role reference. */
2941
+ const acceptEcommerceFiles = (files) => {
2942
+ if (files === void 0) return;
2943
+ const incoming = Array.from(files).filter((file) => file.type.startsWith("image/") && file.size <= REF_IMAGE_MAX_BYTES);
2944
+ if (incoming.length === 0) {
2945
+ setError(tt("edit.uploadHint"));
2946
+ return;
2947
+ }
2948
+ for (const file of incoming) {
2949
+ const reader = new FileReader();
2950
+ reader.onload = () => {
2951
+ if (typeof reader.result !== "string") return;
2952
+ const dataUrl = reader.result;
2953
+ setEcommerceAssets((previous) => {
2954
+ if (previous.length >= MAX_ECOMMERCE_ASSETS) {
2955
+ setError(tt("ecommerce.assetsFull"));
2956
+ return previous;
2957
+ }
2958
+ return [...previous, {
2959
+ id: newComparisonId(),
2960
+ dataUrl,
2961
+ name: file.name,
2962
+ role: "product"
2963
+ }];
2964
+ });
2965
+ };
2966
+ reader.onerror = () => {
2967
+ setError(tt("edit.uploadHint"));
2968
+ };
2969
+ reader.readAsDataURL(file);
2970
+ }
2971
+ };
2467
2972
  /** Run one generation. */
2468
2973
  const handleGenerate = async () => {
2469
2974
  if (submitting) return;
@@ -2485,7 +2990,7 @@ window.__ModuleLoader__.load({
2485
2990
  return;
2486
2991
  }
2487
2992
  const request = {
2488
- mode: tab === "gallery" ? "text" : tab,
2993
+ mode: tab === "edit" ? "edit" : "text",
2489
2994
  model: modeModels.includes(model) ? model : modeModels[0] ?? "",
2490
2995
  prompt: promptText,
2491
2996
  size,
@@ -2526,7 +3031,173 @@ window.__ModuleLoader__.load({
2526
3031
  setSubmitting(false);
2527
3032
  }
2528
3033
  };
2529
- /** Open the full-screen image preview at a given index. */
3034
+ const handleEcommerceGenerate = async () => {
3035
+ if (ecommerceGenerateDisabled) return;
3036
+ if (!enabled || !configured || !apiKeySet) {
3037
+ openSettingsGuide("generation");
3038
+ return;
3039
+ }
3040
+ const projectId = ecommerce.projectId || newComparisonId();
3041
+ const buildRequest = (slot, index) => {
3042
+ const refRole = slot.refRole ?? "product";
3043
+ const asset = refRole === "none" ? void 0 : ecommerceAssets.find((item) => item.role === refRole);
3044
+ return {
3045
+ mode: asset !== void 0 ? "edit" : "text",
3046
+ model: modeModels.includes(model) ? model : modeModels[0] ?? "",
3047
+ prompt: ecommercePrompt(ecommerce, slot),
3048
+ size: ecommerce.size,
3049
+ quality,
3050
+ n: 1,
3051
+ detail,
3052
+ ...defaultChannelId !== void 0 ? { channelId: defaultChannelId } : {},
3053
+ ...asset !== void 0 ? {
3054
+ image: asset.dataUrl,
3055
+ refName: asset.name
3056
+ } : {},
3057
+ workflow: "ecommerce",
3058
+ projectId,
3059
+ projectName: ecommerce.projectName.trim() || ecommerce.productName.trim(),
3060
+ slotKey: `${slot.key}-${index + 1}`,
3061
+ slotLabel: slot.label
3062
+ };
3063
+ };
3064
+ const mainSlots = ecommerceSlots.filter((slot) => slot.key === "main");
3065
+ const otherSlots = ecommerceSlots.filter((slot) => slot.key !== "main");
3066
+ const anchorChain = mainSlots.length > 0 && otherSlots.length > 0;
3067
+ const requests = (anchorChain ? mainSlots : ecommerceSlots).flatMap((slot) => Array.from({ length: slot.count }, (_, index) => buildRequest(slot, index)));
3068
+ const remaining = anchorChain ? otherSlots.flatMap((slot) => Array.from({ length: slot.count }, (_, index) => {
3069
+ const { image: _image, refName: _refName, ...rest } = buildRequest(slot, index);
3070
+ return rest;
3071
+ })) : [];
3072
+ setEcommerceGenerating(true);
3073
+ setSubmitting(true);
3074
+ setError(null);
3075
+ setEcommerceProjectId(projectId);
3076
+ setEcommerceRestored(null);
3077
+ setEcommerceAnchor(null);
3078
+ try {
3079
+ const submitted = await Promise.all(requests.map((request) => api.taskSubmit(request)));
3080
+ setTasks((previous) => [...submitted, ...previous]);
3081
+ setEcommercePreview(false);
3082
+ if (anchorChain) setEcommerceAnchor({
3083
+ projectId,
3084
+ mainTaskIds: submitted.map((task) => task.id),
3085
+ remaining
3086
+ });
3087
+ } catch (caught) {
3088
+ setError(errorMessage(caught));
3089
+ } finally {
3090
+ setSubmitting(false);
3091
+ setEcommerceGenerating(false);
3092
+ }
3093
+ };
3094
+ /** Start over with a fresh product draft (the old results stay in history). */
3095
+ const newEcommerceProduct = () => {
3096
+ setEcommerce(defaultEcommerceDraft());
3097
+ setEcommercePreview(false);
3098
+ setEcommerceProjectId(null);
3099
+ setEcommerceRestored(null);
3100
+ setEcommerceAnchor(null);
3101
+ setEcommerceAssets([]);
3102
+ setRefImage(null);
3103
+ setError(null);
3104
+ };
3105
+ /** Re-run every image of one slot with its original request. */
3106
+ const regenerateEcommerceSlot = async (label) => {
3107
+ if (ecommerceGenerating) return;
3108
+ const group = ecommerceMergedItems.filter((item) => item.label === label);
3109
+ if (group.length === 0) return;
3110
+ setEcommerceGenerating(true);
3111
+ setError(null);
3112
+ try {
3113
+ const submitted = await Promise.all(group.map((item) => api.taskSubmit({ ...item.source })));
3114
+ setTasks((previous) => [...submitted, ...previous]);
3115
+ } catch (caught) {
3116
+ setError(errorMessage(caught));
3117
+ } finally {
3118
+ setEcommerceGenerating(false);
3119
+ }
3120
+ };
3121
+ /** Open one persisted product set from history: rebuild the grouped results
3122
+ * canvas from its entries. Reference images are not persisted, so restored
3123
+ * edit-mode slots regenerate as text-to-image. */
3124
+ const viewEcommerceProject = async (group) => {
3125
+ const entry = group.entries[0];
3126
+ if (entry === void 0 || entry.projectId === void 0) return;
3127
+ try {
3128
+ const items = await Promise.all(group.entries.map(async (item) => ({
3129
+ id: item.id,
3130
+ label: item.slotLabel ?? "",
3131
+ slotKey: item.slotKey ?? "",
3132
+ status: "completed",
3133
+ model: item.model,
3134
+ prompt: item.prompt,
3135
+ images: await historyImagesToGenerated(item.images),
3136
+ source: {
3137
+ mode: item.mode === "edit" ? "text" : item.mode,
3138
+ model: item.model,
3139
+ prompt: item.prompt,
3140
+ size: item.size,
3141
+ quality: item.quality,
3142
+ detail: item.detail,
3143
+ n: 1,
3144
+ ...item.channelId !== void 0 ? { channelId: item.channelId } : {},
3145
+ workflow: "ecommerce",
3146
+ projectId: entry.projectId,
3147
+ projectName: entry.projectName ?? "",
3148
+ slotKey: item.slotKey ?? "",
3149
+ slotLabel: item.slotLabel ?? ""
3150
+ }
3151
+ })));
3152
+ setWorkspace("ecommerce");
3153
+ setEcommerceRestored({
3154
+ projectId: entry.projectId,
3155
+ projectName: entry.projectName ?? "",
3156
+ items
3157
+ });
3158
+ setEcommerceProjectId(entry.projectId);
3159
+ setEcommercePreview(false);
3160
+ setError(null);
3161
+ setViewingHistoryId(entry.id);
3162
+ setGalleryViewingId(null);
3163
+ } catch (caught) {
3164
+ setError(errorMessage(caught));
3165
+ }
3166
+ };
3167
+ /** Download a JSON manifest describing the whole product set (prompts,
3168
+ * slots and task outcomes) so results stay reproducible outside the panel. */
3169
+ const exportEcommerceManifest = () => {
3170
+ const manifest = {
3171
+ project: {
3172
+ id: ecommerceProjectId,
3173
+ name: ecommerce.projectName || ecommerce.productName,
3174
+ productName: ecommerce.productName,
3175
+ category: ecommerce.category,
3176
+ platform: ecommerce.platform,
3177
+ language: ecommerce.language,
3178
+ size: ecommerce.size,
3179
+ sellingPoints: ecommerce.sellingPoints,
3180
+ protectedFeatures: ecommerce.protectedFeatures,
3181
+ styleHint: ecommerce.styleHint
3182
+ },
3183
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
3184
+ images: ecommerceMergedItems.map((item) => ({
3185
+ slotKey: item.slotKey,
3186
+ slotLabel: item.label,
3187
+ status: item.status,
3188
+ model: item.model,
3189
+ prompt: item.prompt,
3190
+ error: item.error
3191
+ }))
3192
+ };
3193
+ const blob = new Blob([JSON.stringify(manifest, null, 2)], { type: "application/json" });
3194
+ const url = URL.createObjectURL(blob);
3195
+ const anchor = document.createElement("a");
3196
+ anchor.href = url;
3197
+ anchor.download = `dsh-product-set-${(ecommerce.projectName || ecommerce.productName || "set").replace(/[^\w-]+/g, "-")}.json`;
3198
+ anchor.click();
3199
+ URL.revokeObjectURL(url);
3200
+ };
2530
3201
  const openPreview = (previewImages, index) => {
2531
3202
  setPreview({
2532
3203
  images: previewImages,
@@ -2583,7 +3254,11 @@ window.__ModuleLoader__.load({
2583
3254
  const viewHistoryGroup = async (group) => {
2584
3255
  const entry = group.entries[0];
2585
3256
  if (entry === void 0) return;
2586
- setTab("text");
3257
+ if (entry.workflow === "ecommerce" && entry.projectId !== void 0) {
3258
+ await viewEcommerceProject(group);
3259
+ return;
3260
+ }
3261
+ openTab("text");
2587
3262
  try {
2588
3263
  setImages(await loadHistoryGroup(group));
2589
3264
  setComparison(null);
@@ -2598,9 +3273,13 @@ window.__ModuleLoader__.load({
2598
3273
  const restoreHistoryGroup = async (group) => {
2599
3274
  const entry = group.entries[0];
2600
3275
  if (entry === void 0) return;
3276
+ if (entry.workflow === "ecommerce" && entry.projectId !== void 0) {
3277
+ await viewEcommerceProject(group);
3278
+ return;
3279
+ }
2601
3280
  try {
2602
3281
  const restored = await loadHistoryGroup(group);
2603
- setTab(entry.mode);
3282
+ openTab(entry.mode);
2604
3283
  setPrompt(entry.prompt);
2605
3284
  setSize(normalizeSize(entry.size));
2606
3285
  setQuality(normalizeQuality(entry.quality));
@@ -2624,14 +3303,40 @@ window.__ModuleLoader__.load({
2624
3303
  const ids = new Set(group.entries.map((entry) => entry.id));
2625
3304
  setHistory((previous) => previous.filter((entry) => !ids.has(entry.id)));
2626
3305
  if (viewingHistoryId !== null && ids.has(viewingHistoryId)) setViewingHistoryId(null);
3306
+ if (ecommerceRestored !== null && group.entries.some((entry) => entry.projectId === ecommerceRestored.projectId)) {
3307
+ setEcommerceRestored(null);
3308
+ setEcommerceProjectId(null);
3309
+ setEcommerceAnchor(null);
3310
+ }
2627
3311
  try {
2628
3312
  let next = history;
2629
3313
  for (const id of ids) next = await api.historyRemove(id);
2630
3314
  setHistory(next);
2631
3315
  } catch {}
2632
3316
  };
3317
+ /** Reset the workspace for a fresh image-generation run. */
3318
+ const startNewCreation = () => {
3319
+ openTab("text");
3320
+ setPrompt("");
3321
+ setRefImage(null);
3322
+ setImages([]);
3323
+ setPreview(null);
3324
+ setPreviewScale(1);
3325
+ setPromptCopied(false);
3326
+ setViewingHistoryId(null);
3327
+ setGalleryViewingId(null);
3328
+ setGallerySelecting(false);
3329
+ setSelectedGalleryIds(/* @__PURE__ */ new Set());
3330
+ setComparison(null);
3331
+ setComparisonFullscreen(false);
3332
+ setEcommerceRestored(null);
3333
+ setError(null);
3334
+ setConversationMessage(null);
3335
+ setGalleryMessage(null);
3336
+ };
2633
3337
  /** Remove all history entries. */
2634
3338
  const clearHistory = async () => {
3339
+ if (!window.confirm(tt("history.clearConfirm"))) return;
2635
3340
  setHistory([]);
2636
3341
  setViewingHistoryId(null);
2637
3342
  try {
@@ -2643,7 +3348,7 @@ window.__ModuleLoader__.load({
2643
3348
  * metadata + first image are saved); otherwise the current form state is
2644
3349
  * used. */
2645
3350
  const addToGallery = async (image, entry) => {
2646
- if (galleryAdding || tab === "gallery") return;
3351
+ if (galleryAdding || workspace === "normal" && tab === "gallery") return;
2647
3352
  const source = entry ?? viewingEntry ?? {
2648
3353
  mode: tab === "edit" ? "edit" : "text",
2649
3354
  model,
@@ -2680,7 +3385,7 @@ window.__ModuleLoader__.load({
2680
3385
  }
2681
3386
  };
2682
3387
  /** Put a generated image into the native conversation composer. */
2683
- const addImageToConversation = async (image, index) => {
3388
+ const addImageToConversation = async (image, index, actionKey = index) => {
2684
3389
  if (addingToConversation !== null) return;
2685
3390
  if (conversation === void 0 || sessions === void 0 || currentSessionId === void 0) {
2686
3391
  setError(tt("conversation.noSession"));
@@ -2691,15 +3396,23 @@ window.__ModuleLoader__.load({
2691
3396
  setError(tt("conversation.unavailable"));
2692
3397
  return;
2693
3398
  }
2694
- setAddingToConversation(index);
3399
+ setAddingToConversation(actionKey);
2695
3400
  let attachments = [];
2696
3401
  let added = false;
2697
3402
  try {
2698
- const file = generatedImageToFile(image, index);
3403
+ const prepared = await prepareConversationImage(image, index);
3404
+ const file = prepared.file;
2699
3405
  attachments = conversation.createDraftImages([file]);
2700
3406
  const input = conversation.input.for(sessionScope);
2701
3407
  if (!input.addImages(attachments.map((attachment) => attachment.id))) throw new Error(tt("conversation.busy"));
2702
3408
  added = true;
3409
+ try {
3410
+ await api.attachConversationImage(String(currentSessionId), prepared.dataUrl, file.name);
3411
+ } catch (caught) {
3412
+ for (const attachment of attachments) input.removeImage(attachment.id);
3413
+ added = false;
3414
+ throw caught;
3415
+ }
2703
3416
  if (input.state.getSnapshot().draft.trim() === "" && prompt.trim() !== "") input.setDraft(prompt.trim());
2704
3417
  setConversationMessage(tt("conversation.added"));
2705
3418
  window.setTimeout(() => {
@@ -2724,6 +3437,20 @@ window.__ModuleLoader__.load({
2724
3437
  setError(errorMessage(caught));
2725
3438
  }
2726
3439
  };
3440
+ /** Load a persisted gallery image and add it to the current chat draft. */
3441
+ const addGalleryEntryToConversation = async (entry) => {
3442
+ if (galleryConversationAddingId !== null || addingToConversation !== null || entry.images.length === 0) return;
3443
+ setGalleryConversationAddingId(entry.id);
3444
+ try {
3445
+ const [image] = await historyImagesToGenerated(entry.images.slice(0, 1));
3446
+ if (image === void 0) return;
3447
+ await addImageToConversation(image, 0, `gallery:${entry.id}`);
3448
+ } catch (caught) {
3449
+ setError(errorMessage(caught));
3450
+ } finally {
3451
+ setGalleryConversationAddingId(null);
3452
+ }
3453
+ };
2727
3454
  /** View a gallery image in the canvas. */
2728
3455
  const viewGalleryEntry = async (entry) => {
2729
3456
  try {
@@ -2747,6 +3474,7 @@ window.__ModuleLoader__.load({
2747
3474
  };
2748
3475
  /** Remove every gallery entry. */
2749
3476
  const clearGalleryAll = async () => {
3477
+ if (!window.confirm(tt("gallery.clearConfirm"))) return;
2750
3478
  setGallery([]);
2751
3479
  setGalleryViewingId(null);
2752
3480
  try {
@@ -2815,6 +3543,30 @@ window.__ModuleLoader__.load({
2815
3543
  });
2816
3544
  };
2817
3545
  const generateDisabled = submitting || modeModels.length === 0;
3546
+ const ecommerceSlots = ecommerce.slots.filter((slot) => slot.enabled && slot.count > 0);
3547
+ const ecommerceTotal = ecommerceSlots.reduce((total, slot) => total + slot.count, 0);
3548
+ const ecommerceGenerateDisabled = submitting || ecommerceGenerating || ecommerceSlots.length === 0 || ecommerce.productName.trim() === "";
3549
+ const ecommerceFileInput = (0, react.useRef)(null);
3550
+ const ecommerceProjectTasks = ecommerceProjectId === null ? [] : tasks.filter((task) => task.request.workflow === "ecommerce" && task.request.projectId === ecommerceProjectId);
3551
+ const liveSlotKeys = new Set(ecommerceProjectTasks.map((task) => task.request.slotKey ?? task.id));
3552
+ const ecommerceMergedItems = [...ecommerceProjectTasks.map((task) => ({
3553
+ id: task.id,
3554
+ label: task.request.slotLabel ?? "",
3555
+ slotKey: task.request.slotKey ?? "",
3556
+ status: task.status,
3557
+ model: task.request.model,
3558
+ prompt: task.request.prompt,
3559
+ ...task.error !== void 0 ? { error: task.error } : {},
3560
+ images: task.result?.images ?? [],
3561
+ source: task.request
3562
+ })), ...ecommerceRestored !== null && ecommerceRestored.projectId === ecommerceProjectId ? ecommerceRestored.items.filter((item) => !liveSlotKeys.has(item.slotKey)) : []];
3563
+ const ecommerceDoneCount = ecommerceMergedItems.filter((item) => item.status === "completed").length;
3564
+ const ecommerceFailedCount = ecommerceMergedItems.filter((item) => item.status === "failed" || item.status === "cancelled").length;
3565
+ const ecommerceResultGroups = [...new Set(ecommerceMergedItems.map((item) => item.label))].filter((label) => label !== "").map((label) => ({
3566
+ label,
3567
+ items: ecommerceMergedItems.filter((item) => item.label === label)
3568
+ }));
3569
+ const conversationBusy = addingToConversation !== null || galleryConversationAddingId !== null;
2818
3570
  const viewingEntry = viewingHistoryId === null ? null : history.find((entry) => entry.id === viewingHistoryId) ?? null;
2819
3571
  const viewingGalleryEntry = galleryViewingId === null ? null : gallery.find((entry) => entry.id === galleryViewingId) ?? null;
2820
3572
  const previewImage = preview === null ? null : preview.images[preview.index] ?? null;
@@ -2822,6 +3574,30 @@ window.__ModuleLoader__.load({
2822
3574
  const comparisonResults = comparisonTasks.filter((task) => task.status === "completed" && task.result !== void 0);
2823
3575
  const previewFrameScale = Math.max(1, previewScale);
2824
3576
  const previewImageScale = previewScale / previewFrameScale;
3577
+ /** Drag the config panel's right edge to resize it (persisted per browser). */
3578
+ const onConfigResizeStart = (event) => {
3579
+ if (event.button !== 0) return;
3580
+ event.preventDefault();
3581
+ const aside = configAsideRef.current;
3582
+ if (aside === null) return;
3583
+ const left = aside.getBoundingClientRect().left;
3584
+ const onMove = (move) => {
3585
+ const width = Math.round(Math.min(CONFIG_WIDTH_MAX, Math.max(CONFIG_WIDTH_MIN, move.clientX - left)));
3586
+ setConfigWidth(width);
3587
+ try {
3588
+ window.localStorage.setItem(CONFIG_WIDTH_STORAGE_KEY, String(width));
3589
+ } catch {}
3590
+ };
3591
+ const onUp = () => {
3592
+ window.removeEventListener("pointermove", onMove);
3593
+ document.documentElement.style.removeProperty("cursor");
3594
+ document.documentElement.style.removeProperty("user-select");
3595
+ };
3596
+ window.addEventListener("pointermove", onMove);
3597
+ window.addEventListener("pointerup", onUp, { once: true });
3598
+ document.documentElement.style.setProperty("cursor", "col-resize");
3599
+ document.documentElement.style.setProperty("user-select", "none");
3600
+ };
2825
3601
  const copyPreviewPrompt = async (text) => {
2826
3602
  try {
2827
3603
  if (navigator.clipboard?.writeText !== void 0) await navigator.clipboard.writeText(text);
@@ -2846,7 +3622,7 @@ window.__ModuleLoader__.load({
2846
3622
  };
2847
3623
  const addPreviewToEdit = () => {
2848
3624
  if (previewImage === null || preview === null) return;
2849
- setTab("edit");
3625
+ openTab("edit");
2850
3626
  setRefImage({
2851
3627
  dataUrl: srcOf(previewImage),
2852
3628
  name: `dsh-image-${preview.index + 1}.${extensionOf(previewImage.mime)}`
@@ -2864,14 +3640,36 @@ window.__ModuleLoader__.load({
2864
3640
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2865
3641
  className: panel_module_css_default.historyTitle,
2866
3642
  children: tt("history.title")
2867
- }), history.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2868
- type: "button",
2869
- className: panel_module_css_default.historyClear,
2870
- onClick: () => {
2871
- clearHistory();
2872
- },
2873
- children: tt("history.clear")
2874
- }) : null]
3643
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3644
+ className: panel_module_css_default.historyHeaderActions,
3645
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3646
+ type: "button",
3647
+ className: panel_module_css_default.historyNew,
3648
+ "data-history-new": "",
3649
+ "aria-label": tt("canvas.new"),
3650
+ title: tt("canvas.newHint"),
3651
+ onClick: startNewCreation,
3652
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3653
+ viewBox: "0 0 16 16",
3654
+ width: "15",
3655
+ height: "15",
3656
+ fill: "none",
3657
+ stroke: "currentColor",
3658
+ strokeWidth: "1.7",
3659
+ strokeLinecap: "round",
3660
+ "aria-hidden": "true",
3661
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8 3v10M3 8h10" })
3662
+ })
3663
+ }), history.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3664
+ type: "button",
3665
+ className: panel_module_css_default.historyClear,
3666
+ "data-history-clear": "",
3667
+ onClick: () => {
3668
+ clearHistory();
3669
+ },
3670
+ children: tt("history.clear")
3671
+ }) : null]
3672
+ })]
2875
3673
  }),
2876
3674
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2877
3675
  className: panel_module_css_default.historyFilters,
@@ -2947,7 +3745,7 @@ window.__ModuleLoader__.load({
2947
3745
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2948
3746
  className: panel_module_css_default.historyMeta,
2949
3747
  children: [
2950
- isComparison ? tt("compare.title") : tt(`mode.${entry.mode === "edit" ? "edit" : "text"}`),
3748
+ isComparison ? tt("compare.title") : entry.workflow === "ecommerce" ? `${tt("ecommerce.short")}${entry.projectName !== void 0 && entry.projectName !== "" ? ` · ${entry.projectName}` : ""}` : tt(`mode.${entry.mode === "edit" ? "edit" : "text"}`),
2951
3749
  " · ",
2952
3750
  isComparison ? group.models.join(" · ") : entry.model,
2953
3751
  " · ",
@@ -3001,37 +3799,105 @@ window.__ModuleLoader__.load({
3001
3799
  children: [
3002
3800
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
3003
3801
  className: panel_module_css_default.panelHeader,
3004
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3005
- className: panel_module_css_default.panelHeading,
3006
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
3007
- className: panel_module_css_default.panelTitle,
3008
- children: tt("panel.title")
3009
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
3010
- className: panel_module_css_default.githubLink,
3011
- href: "https://github.com/dickpy/dsh-imagegen",
3012
- target: "_blank",
3013
- rel: "noreferrer",
3014
- title: tt("panel.githubTip"),
3015
- "aria-label": tt("panel.githubTip"),
3016
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3017
- viewBox: "0 0 16 16",
3018
- width: "15",
3019
- height: "15",
3020
- fill: "currentColor",
3021
- "aria-hidden": "true",
3022
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8z" })
3023
- })
3024
- })]
3025
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3026
- type: "button",
3027
- className: panel_module_css_default.connectionStatus,
3028
- "data-connected": connected ? "true" : "false",
3029
- "aria-label": tt(connected ? "connection.connected" : "connection.disconnected"),
3030
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3031
- className: panel_module_css_default.connectionDot,
3032
- "aria-hidden": "true"
3033
- }), tt(connected ? "connection.connected" : "connection.disconnected")]
3034
- })]
3802
+ children: [
3803
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3804
+ className: panel_module_css_default.panelHeading,
3805
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
3806
+ className: panel_module_css_default.panelTitle,
3807
+ children: tt("panel.title")
3808
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
3809
+ className: panel_module_css_default.githubLink,
3810
+ href: "https://github.com/dickpy/dsh-imagegen",
3811
+ target: "_blank",
3812
+ rel: "noreferrer",
3813
+ title: tt("panel.githubTip"),
3814
+ "aria-label": tt("panel.githubTip"),
3815
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3816
+ viewBox: "0 0 16 16",
3817
+ width: "15",
3818
+ height: "15",
3819
+ fill: "currentColor",
3820
+ "aria-hidden": "true",
3821
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8z" })
3822
+ })
3823
+ })]
3824
+ }),
3825
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("nav", {
3826
+ className: panel_module_css_default.topNav,
3827
+ role: "tablist",
3828
+ "aria-label": tt("workspace.label"),
3829
+ children: [
3830
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3831
+ type: "button",
3832
+ className: panel_module_css_default.topNavItem,
3833
+ "data-active": workspace === "normal" && tab !== "gallery" ? "" : void 0,
3834
+ onClick: () => {
3835
+ if (workspace !== "normal" || tab === "gallery") openTab("text");
3836
+ },
3837
+ children: tt("workspace.normal")
3838
+ }),
3839
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3840
+ type: "button",
3841
+ className: panel_module_css_default.topNavItem,
3842
+ "data-active": workspace === "normal" && tab === "gallery" ? "" : void 0,
3843
+ onClick: () => {
3844
+ openTab("gallery");
3845
+ },
3846
+ children: tt("gallery.title")
3847
+ }),
3848
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3849
+ className: panel_module_css_default.topNavDivider,
3850
+ "aria-hidden": "true"
3851
+ }),
3852
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3853
+ type: "button",
3854
+ className: panel_module_css_default.topNavItem,
3855
+ "data-active": workspace === "ecommerce" ? "" : void 0,
3856
+ onClick: () => {
3857
+ setWorkspace("ecommerce");
3858
+ },
3859
+ children: [tt("workspace.ecommerce"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3860
+ className: panel_module_css_default.previewBadge,
3861
+ children: tt("ecommerce.badge")
3862
+ })]
3863
+ })
3864
+ ]
3865
+ }),
3866
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3867
+ className: panel_module_css_default.panelHeaderActions,
3868
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3869
+ type: "button",
3870
+ className: panel_module_css_default.chatToggle,
3871
+ "data-open": chatOpen ? "true" : "false",
3872
+ "aria-pressed": chatOpen,
3873
+ title: chatOpen ? tt("chat.collapse") : tt("chat.expand"),
3874
+ onClick: () => {
3875
+ setChatOpen((open) => !open);
3876
+ },
3877
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3878
+ viewBox: "0 0 16 16",
3879
+ width: "13",
3880
+ height: "13",
3881
+ fill: "none",
3882
+ stroke: "currentColor",
3883
+ strokeWidth: "1.4",
3884
+ strokeLinecap: "round",
3885
+ strokeLinejoin: "round",
3886
+ "aria-hidden": "true",
3887
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M2.5 3.5h11v7.5H6.8L3.8 13.6v-2.6H2.5z" })
3888
+ }), tt("chat.toggle")]
3889
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3890
+ type: "button",
3891
+ className: panel_module_css_default.connectionStatus,
3892
+ "data-connected": connected ? "true" : "false",
3893
+ "aria-label": tt(connected ? "connection.connected" : "connection.disconnected"),
3894
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3895
+ className: panel_module_css_default.connectionDot,
3896
+ "aria-hidden": "true"
3897
+ }), tt(connected ? "connection.connected" : "connection.disconnected")]
3898
+ })]
3899
+ })
3900
+ ]
3035
3901
  }),
3036
3902
  update !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3037
3903
  className: panel_module_css_default.updateBanner,
@@ -3063,10 +3929,43 @@ window.__ModuleLoader__.load({
3063
3929
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3064
3930
  className: panel_module_css_default.generation,
3065
3931
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("aside", {
3932
+ ref: configAsideRef,
3066
3933
  className: panel_module_css_default.config,
3067
- "data-gallery": tab === "gallery" ? "true" : void 0,
3934
+ style: { "--dsh-imagegen-config-width": `${configWidth}px` },
3935
+ "data-collapsed": configCollapsed ? "true" : "false",
3936
+ "data-gallery": workspace === "normal" && tab === "gallery" ? "true" : void 0,
3068
3937
  children: [
3069
- tab === "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3938
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3939
+ className: panel_module_css_default.configResizer,
3940
+ title: tt("config.resizeHint"),
3941
+ onPointerDown: onConfigResizeStart
3942
+ }),
3943
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3944
+ className: panel_module_css_default.configHeader,
3945
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3946
+ type: "button",
3947
+ className: panel_module_css_default.configToggle,
3948
+ "aria-expanded": !configCollapsed,
3949
+ "aria-label": tt(configCollapsed ? "panel.expandConfig" : "panel.collapseConfig"),
3950
+ title: tt(configCollapsed ? "panel.expandConfig" : "panel.collapseConfig"),
3951
+ onClick: () => {
3952
+ setConfigCollapsed((previous) => !previous);
3953
+ },
3954
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3955
+ viewBox: "0 0 16 16",
3956
+ width: "16",
3957
+ height: "16",
3958
+ fill: "none",
3959
+ stroke: "currentColor",
3960
+ strokeWidth: "1.6",
3961
+ strokeLinecap: "round",
3962
+ strokeLinejoin: "round",
3963
+ "aria-hidden": "true",
3964
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: configCollapsed ? "M6 3l5 5-5 5" : "M10 3L5 8l5 5" })
3965
+ })
3966
+ })
3967
+ }),
3968
+ workspace === "normal" && tab === "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3070
3969
  className: panel_module_css_default.galleryFilters,
3071
3970
  children: [
3072
3971
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -3141,40 +4040,382 @@ window.__ModuleLoader__.load({
3141
4040
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3142
4041
  className: panel_module_css_default.configScroll,
3143
4042
  children: [
3144
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
4043
+ workspace === "normal" && tab !== "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
3145
4044
  className: panel_module_css_default.card,
3146
4045
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3147
4046
  className: panel_module_css_default.modeRow,
3148
4047
  role: "tablist",
3149
4048
  "aria-label": tt("panel.title"),
3150
- children: [
3151
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
3152
- active: tab === "text",
3153
- onClick: () => {
3154
- setTab("text");
3155
- },
3156
- className: panel_module_css_default.modePill,
3157
- children: tt("mode.text")
3158
- }),
3159
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
3160
- active: tab === "edit",
3161
- onClick: () => {
3162
- setTab("edit");
3163
- },
3164
- className: panel_module_css_default.modePill,
3165
- children: tt("mode.edit")
3166
- }),
3167
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
3168
- active: tab === "gallery",
3169
- onClick: () => {
3170
- setTab("gallery");
3171
- },
3172
- className: panel_module_css_default.modePill,
3173
- children: tt("gallery.title")
3174
- })
3175
- ]
4049
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
4050
+ active: tab === "text",
4051
+ onClick: () => {
4052
+ setTab("text");
4053
+ },
4054
+ className: panel_module_css_default.modePill,
4055
+ children: tt("mode.text")
4056
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
4057
+ active: tab === "edit",
4058
+ onClick: () => {
4059
+ setTab("edit");
4060
+ },
4061
+ className: panel_module_css_default.modePill,
4062
+ children: tt("mode.edit")
4063
+ })]
3176
4064
  })
3177
- }),
4065
+ }) : null,
4066
+ workspace === "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4067
+ className: panel_module_css_default.ecommerceWorkspace,
4068
+ "data-ecommerce-workspace": "",
4069
+ children: [
4070
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4071
+ className: panel_module_css_default.ecommerceSection,
4072
+ children: [
4073
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.product") }),
4074
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4075
+ className: panel_module_css_default.ecommerceField,
4076
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4077
+ className: panel_module_css_default.ecommerceFieldLabel,
4078
+ children: tt("ecommerce.productName")
4079
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4080
+ value: ecommerce.productName,
4081
+ placeholder: tt("ecommerce.productName"),
4082
+ onChange: (event) => setEcommerce((previous) => ({
4083
+ ...previous,
4084
+ productName: event.target.value
4085
+ }))
4086
+ })]
4087
+ }),
4088
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4089
+ className: panel_module_css_default.ecommerceField,
4090
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4091
+ className: panel_module_css_default.ecommerceFieldLabel,
4092
+ children: tt("ecommerce.projectName")
4093
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4094
+ value: ecommerce.projectName,
4095
+ placeholder: tt("ecommerce.projectName"),
4096
+ onChange: (event) => setEcommerce((previous) => ({
4097
+ ...previous,
4098
+ projectName: event.target.value
4099
+ }))
4100
+ })]
4101
+ }),
4102
+ ecommerceAssets.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4103
+ type: "button",
4104
+ className: panel_module_css_default.ecommerceUploadHero,
4105
+ "data-ecommerce-upload": "",
4106
+ onClick: () => {
4107
+ ecommerceFileInput.current?.click();
4108
+ },
4109
+ onDragOver: (event) => {
4110
+ event.preventDefault();
4111
+ },
4112
+ onDrop: (event) => {
4113
+ event.preventDefault();
4114
+ acceptEcommerceFiles(event.dataTransfer.files ?? void 0);
4115
+ },
4116
+ children: [
4117
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
4118
+ viewBox: "0 0 16 16",
4119
+ width: "15",
4120
+ height: "15",
4121
+ fill: "none",
4122
+ stroke: "currentColor",
4123
+ strokeWidth: "1.3",
4124
+ strokeLinecap: "round",
4125
+ strokeLinejoin: "round",
4126
+ "aria-hidden": "true",
4127
+ children: [
4128
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8 10V3.5" }),
4129
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M5.5 5.5L8 3l2.5 2.5" }),
4130
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M3 9.5V12a1.5 1.5 0 001.5 1.5h7A1.5 1.5 0 0013 12V9.5" })
4131
+ ]
4132
+ }),
4133
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: tt("ecommerce.uploadRef") }),
4134
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: tt("edit.uploadHint") })
4135
+ ]
4136
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4137
+ className: panel_module_css_default.ecommerceAssets,
4138
+ children: [ecommerceAssets.map((asset) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4139
+ className: panel_module_css_default.ecommerceAsset,
4140
+ "data-ecommerce-asset": "",
4141
+ children: [
4142
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
4143
+ src: asset.dataUrl,
4144
+ alt: asset.name
4145
+ }),
4146
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
4147
+ value: asset.role,
4148
+ "data-ecommerce-asset-role": "",
4149
+ "aria-label": tt("ecommerce.refSelect"),
4150
+ onChange: (event) => setEcommerceAssets((previous) => previous.map((item) => item.id === asset.id ? {
4151
+ ...item,
4152
+ role: event.target.value
4153
+ } : item)),
4154
+ children: ECOMMERCE_ASSET_ROLES.map((role) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4155
+ value: role,
4156
+ children: tt(`ecommerce.role.${role}`)
4157
+ }, role))
4158
+ }),
4159
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4160
+ type: "button",
4161
+ "aria-label": tt("edit.remove"),
4162
+ onClick: () => {
4163
+ setEcommerceAssets((previous) => previous.filter((item) => item.id !== asset.id));
4164
+ },
4165
+ children: "×"
4166
+ })
4167
+ ]
4168
+ }, asset.id)), ecommerceAssets.length < MAX_ECOMMERCE_ASSETS ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4169
+ type: "button",
4170
+ className: panel_module_css_default.ecommerceAssetAdd,
4171
+ "data-ecommerce-upload": "",
4172
+ title: tt("ecommerce.uploadRef"),
4173
+ onClick: () => {
4174
+ ecommerceFileInput.current?.click();
4175
+ },
4176
+ onDragOver: (event) => {
4177
+ event.preventDefault();
4178
+ },
4179
+ onDrop: (event) => {
4180
+ event.preventDefault();
4181
+ acceptEcommerceFiles(event.dataTransfer.files ?? void 0);
4182
+ },
4183
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4184
+ "aria-hidden": "true",
4185
+ children: "+"
4186
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: tt("ecommerce.uploadShort") })]
4187
+ }) : null]
4188
+ })
4189
+ ]
4190
+ }),
4191
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4192
+ className: panel_module_css_default.ecommerceSection,
4193
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.params") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4194
+ className: panel_module_css_default.ecommerceParamGrid,
4195
+ children: [
4196
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4197
+ className: panel_module_css_default.ecommerceField,
4198
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4199
+ className: panel_module_css_default.ecommerceFieldLabel,
4200
+ children: tt("ecommerce.platformLabel")
4201
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4202
+ value: ecommerce.platform,
4203
+ onChange: (event) => setEcommerce((previous) => ({
4204
+ ...previous,
4205
+ platform: event.target.value
4206
+ })),
4207
+ children: [
4208
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "通用" }),
4209
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "淘宝 / 京东" }),
4210
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "Amazon" })
4211
+ ]
4212
+ })]
4213
+ }),
4214
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4215
+ className: panel_module_css_default.ecommerceField,
4216
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4217
+ className: panel_module_css_default.ecommerceFieldLabel,
4218
+ children: tt("ecommerce.languageLabel")
4219
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4220
+ value: ecommerce.language,
4221
+ onChange: (event) => setEcommerce((previous) => ({
4222
+ ...previous,
4223
+ language: event.target.value
4224
+ })),
4225
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "中文" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "English" })]
4226
+ })]
4227
+ }),
4228
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4229
+ className: panel_module_css_default.ecommerceField,
4230
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4231
+ className: panel_module_css_default.ecommerceFieldLabel,
4232
+ children: tt("ecommerce.ratioLabel")
4233
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
4234
+ value: ecommerce.size,
4235
+ onChange: (event) => setEcommerce((previous) => ({
4236
+ ...previous,
4237
+ size: event.target.value
4238
+ })),
4239
+ children: SIZES.filter((size) => size !== "auto").map((size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: size }, size))
4240
+ })]
4241
+ }),
4242
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4243
+ className: panel_module_css_default.ecommerceField,
4244
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4245
+ className: panel_module_css_default.ecommerceFieldLabel,
4246
+ children: tt("ecommerce.categoryLabel")
4247
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4248
+ value: ecommerce.category,
4249
+ onChange: (event) => setEcommerce((previous) => ({
4250
+ ...previous,
4251
+ category: event.target.value
4252
+ })),
4253
+ children: [
4254
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "通用商品" }),
4255
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "食品饮料" }),
4256
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "美妆个护" }),
4257
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "服装配饰" }),
4258
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "家居用品" }),
4259
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "3C 数码" })
4260
+ ]
4261
+ })]
4262
+ })
4263
+ ]
4264
+ })]
4265
+ }),
4266
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4267
+ className: panel_module_css_default.ecommerceSection,
4268
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.sellingTitle") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
4269
+ value: ecommerce.sellingPoints,
4270
+ placeholder: tt("ecommerce.sellingPoints"),
4271
+ onChange: (event) => setEcommerce((previous) => ({
4272
+ ...previous,
4273
+ sellingPoints: event.target.value
4274
+ }))
4275
+ })]
4276
+ }),
4277
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4278
+ className: panel_module_css_default.ecommerceSection,
4279
+ children: [
4280
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h3", { children: [tt("ecommerce.setStructure"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
4281
+ className: panel_module_css_default.ecommerceSectionHint,
4282
+ children: tt("ecommerce.multiSelect")
4283
+ })] }),
4284
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4285
+ className: panel_module_css_default.ecommerceStructureGrid,
4286
+ children: ecommerce.slots.map((slot) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4287
+ type: "button",
4288
+ className: panel_module_css_default.ecommerceSlotCard,
4289
+ "data-active": slot.enabled ? "" : void 0,
4290
+ title: `${slot.label}:${slot.description}`,
4291
+ onClick: () => setEcommerce((previous) => ({
4292
+ ...previous,
4293
+ slots: previous.slots.map((item) => item.key === slot.key ? {
4294
+ ...item,
4295
+ enabled: !item.enabled
4296
+ } : item)
4297
+ })),
4298
+ children: [slot.label, slot.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4299
+ className: panel_module_css_default.ecommerceSlotCount,
4300
+ title: tt("ecommerce.countHint"),
4301
+ onClick: (event) => {
4302
+ event.stopPropagation();
4303
+ setEcommerce((previous) => ({
4304
+ ...previous,
4305
+ slots: previous.slots.map((item) => item.key === slot.key ? {
4306
+ ...item,
4307
+ count: item.count >= 4 ? 1 : item.count + 1
4308
+ } : item)
4309
+ }));
4310
+ },
4311
+ children: slot.count
4312
+ }) : null]
4313
+ }, slot.key))
4314
+ }),
4315
+ ecommerceSlots.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4316
+ type: "button",
4317
+ className: panel_module_css_default.ecommerceAdvancedToggle,
4318
+ "aria-expanded": ecommerceRefOpen,
4319
+ onClick: () => {
4320
+ setEcommerceRefOpen((open) => !open);
4321
+ },
4322
+ children: [tt("ecommerce.refSettings"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4323
+ className: panel_module_css_default.ecommerceAdvancedChevron,
4324
+ "aria-hidden": "true",
4325
+ children: ecommerceRefOpen ? "⌃" : "⌄"
4326
+ })]
4327
+ }), ecommerceRefOpen ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4328
+ className: panel_module_css_default.ecommerceAdvancedBody,
4329
+ children: ecommerceSlots.map((slot) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4330
+ className: panel_module_css_default.ecommerceRefRow,
4331
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: slot.label }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4332
+ value: slot.refRole ?? "product",
4333
+ "data-ecommerce-ref-select": "",
4334
+ "aria-label": `${tt("ecommerce.refSelect")} · ${slot.label}`,
4335
+ onChange: (event) => setEcommerce((previous) => ({
4336
+ ...previous,
4337
+ slots: previous.slots.map((item) => item.key === slot.key ? {
4338
+ ...item,
4339
+ refRole: event.target.value
4340
+ } : item)
4341
+ })),
4342
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4343
+ value: "none",
4344
+ children: tt("ecommerce.refNone")
4345
+ }), ECOMMERCE_ASSET_ROLES.map((role) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4346
+ value: role,
4347
+ children: tt(`ecommerce.role.${role}`)
4348
+ }, role))]
4349
+ })]
4350
+ }, slot.key))
4351
+ }) : null] }) : null
4352
+ ]
4353
+ }),
4354
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4355
+ className: panel_module_css_default.ecommerceSection,
4356
+ children: [
4357
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.generation") }),
4358
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
4359
+ value: modeModels.includes(model) ? model : modeModels[0] ?? "",
4360
+ "aria-label": tt("model.label"),
4361
+ onChange: (event) => setModel(event.target.value),
4362
+ children: modeModels.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4363
+ value: option,
4364
+ children: option
4365
+ }, option))
4366
+ }),
4367
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4368
+ className: panel_module_css_default.optionRow,
4369
+ children: QUALITIES.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
4370
+ active: quality === option,
4371
+ onClick: () => {
4372
+ setQuality(option);
4373
+ },
4374
+ className: panel_module_css_default.optionPill,
4375
+ children: tt(`quality.${option}`)
4376
+ }, option))
4377
+ })
4378
+ ]
4379
+ }),
4380
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4381
+ className: panel_module_css_default.ecommerceSection,
4382
+ children: [
4383
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.styleTitle") }),
4384
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
4385
+ value: ecommerce.styleHint,
4386
+ placeholder: tt("ecommerce.styleHint"),
4387
+ onChange: (event) => setEcommerce((previous) => ({
4388
+ ...previous,
4389
+ styleHint: event.target.value
4390
+ }))
4391
+ }),
4392
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4393
+ className: panel_module_css_default.ecommerceFieldLabel,
4394
+ children: tt("ecommerce.protectedLabel")
4395
+ }),
4396
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
4397
+ value: ecommerce.protectedFeatures,
4398
+ placeholder: tt("ecommerce.protectedFeatures"),
4399
+ onChange: (event) => setEcommerce((previous) => ({
4400
+ ...previous,
4401
+ protectedFeatures: event.target.value
4402
+ }))
4403
+ })
4404
+ ]
4405
+ }),
4406
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4407
+ ref: ecommerceFileInput,
4408
+ type: "file",
4409
+ multiple: true,
4410
+ accept: "image/png,image/jpeg,image/webp,image/gif",
4411
+ className: panel_module_css_default.hiddenFile,
4412
+ onChange: (event) => {
4413
+ acceptEcommerceFiles(event.target.files ?? void 0);
4414
+ event.target.value = "";
4415
+ }
4416
+ })
4417
+ ]
4418
+ }) : null,
3178
4419
  tab === "edit" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3179
4420
  className: panel_module_css_default.card,
3180
4421
  children: [refImage === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
@@ -3251,7 +4492,7 @@ window.__ModuleLoader__.load({
3251
4492
  }
3252
4493
  })]
3253
4494
  }) : null,
3254
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4495
+ workspace === "normal" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3255
4496
  className: panel_module_css_default.card,
3256
4497
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
3257
4498
  className: panel_module_css_default.prompt,
@@ -3299,8 +4540,7 @@ window.__ModuleLoader__.load({
3299
4540
  })
3300
4541
  ]
3301
4542
  })]
3302
- }),
3303
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4543
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3304
4544
  className: panel_module_css_default.card,
3305
4545
  children: [
3306
4546
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -3384,13 +4624,64 @@ window.__ModuleLoader__.load({
3384
4624
  ]
3385
4625
  })
3386
4626
  ]
3387
- })
4627
+ })] }) : null
3388
4628
  ]
3389
4629
  }),
3390
4630
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3391
4631
  className: panel_module_css_default.footer,
3392
4632
  children: [
3393
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4633
+ workspace === "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4634
+ className: panel_module_css_default.ecommerceFooterBody,
4635
+ children: ecommercePreview ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
4636
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4637
+ className: panel_module_css_default.ecommercePlanMini,
4638
+ children: [
4639
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: tt("ecommerce.planTitle", { count: ecommerceTotal }) }),
4640
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4641
+ className: panel_module_css_default.ecommercePlanList,
4642
+ children: ecommerceSlots.map((slot) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: slot.label }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["×", slot.count] })] }, slot.key))
4643
+ }),
4644
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4645
+ className: panel_module_css_default.ecommercePlanNote,
4646
+ children: tt("ecommerce.anchorNote")
4647
+ }),
4648
+ ecommerceAssets.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4649
+ className: panel_module_css_default.ecommercePlanWarn,
4650
+ children: tt("ecommerce.noAssetWarn")
4651
+ }) : null
4652
+ ]
4653
+ }),
4654
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
4655
+ variant: "primary",
4656
+ size: "md",
4657
+ className: panel_module_css_default.ecommercePrimaryAction,
4658
+ disabled: ecommerceGenerateDisabled,
4659
+ onClick: () => {
4660
+ handleEcommerceGenerate();
4661
+ },
4662
+ children: ecommerceGenerating ? tt("generating") : tt("ecommerce.confirm")
4663
+ }),
4664
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4665
+ type: "button",
4666
+ className: panel_module_css_default.ecommercePlanBack,
4667
+ onClick: () => {
4668
+ setEcommercePreview(false);
4669
+ },
4670
+ children: tt("gallery.tagsCancel")
4671
+ })
4672
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4673
+ className: panel_module_css_default.ecommerceFooterHint,
4674
+ children: ecommerceTotal > 0 ? tt("ecommerce.footerReady", { count: ecommerceTotal }) : tt("ecommerce.footerEmpty")
4675
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
4676
+ variant: "primary",
4677
+ size: "md",
4678
+ className: panel_module_css_default.ecommercePrimaryAction,
4679
+ disabled: ecommerce.productName.trim() === "" || ecommerceTotal === 0,
4680
+ onClick: () => setEcommercePreview(true),
4681
+ children: tt("ecommerce.preview")
4682
+ })] })
4683
+ }) : null,
4684
+ workspace === "ecommerce" ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
3394
4685
  className: panel_module_css_default.modelWrap,
3395
4686
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3396
4687
  className: panel_module_css_default.modelLabel,
@@ -3439,7 +4730,7 @@ window.__ModuleLoader__.load({
3439
4730
  }) : null]
3440
4731
  })]
3441
4732
  }),
3442
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4733
+ workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3443
4734
  className: panel_module_css_default.compareControl,
3444
4735
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
3445
4736
  className: panel_module_css_default.compareToggle,
@@ -3462,8 +4753,8 @@ window.__ModuleLoader__.load({
3462
4753
  }
3463
4754
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: option })] }, option))
3464
4755
  }) : null]
3465
- }),
3466
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
4756
+ }) : null,
4757
+ workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
3467
4758
  variant: "primary",
3468
4759
  size: "md",
3469
4760
  className: panel_module_css_default.generateButton,
@@ -3475,15 +4766,15 @@ window.__ModuleLoader__.load({
3475
4766
  className: panel_module_css_default.generateInner,
3476
4767
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: panel_module_css_default.spinner }), tt("generating")]
3477
4768
  }) : tt("generate")
3478
- })
4769
+ }) : null
3479
4770
  ]
3480
4771
  })
3481
4772
  ]
3482
4773
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3483
4774
  className: panel_module_css_default.canvas,
3484
- "data-gallery": tab === "gallery" ? "true" : void 0,
4775
+ "data-gallery": workspace === "normal" && tab === "gallery" ? "true" : void 0,
3485
4776
  children: [
3486
- tab === "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4777
+ workspace === "normal" && tab === "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3487
4778
  className: panel_module_css_default.galleryWorkspace,
3488
4779
  children: [
3489
4780
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
@@ -3570,6 +4861,7 @@ window.__ModuleLoader__.load({
3570
4861
  gallery.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3571
4862
  type: "button",
3572
4863
  className: panel_module_css_default.galleryClear,
4864
+ "data-gallery-clear": "",
3573
4865
  onClick: () => {
3574
4866
  clearGalleryAll();
3575
4867
  },
@@ -3664,6 +4956,32 @@ window.__ModuleLoader__.load({
3664
4956
  children: entry.mode === "edit" ? tt("mode.edit") : tt("mode.text")
3665
4957
  })]
3666
4958
  }),
4959
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4960
+ className: panel_module_css_default.galleryCardActions,
4961
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4962
+ type: "button",
4963
+ className: panel_module_css_default.galleryCardAction,
4964
+ "data-gallery-add-conversation": "",
4965
+ disabled: conversationBusy,
4966
+ title: tt("conversation.addHint"),
4967
+ onClick: (event) => {
4968
+ event.stopPropagation();
4969
+ addGalleryEntryToConversation(entry);
4970
+ },
4971
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
4972
+ viewBox: "0 0 16 16",
4973
+ width: "13",
4974
+ height: "13",
4975
+ fill: "none",
4976
+ stroke: "currentColor",
4977
+ strokeWidth: "1.5",
4978
+ strokeLinecap: "round",
4979
+ strokeLinejoin: "round",
4980
+ "aria-hidden": "true",
4981
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M3 4.5h10v7H3z" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M5.5 2.5h5M8 6v4M6 8h4" })]
4982
+ }), galleryConversationAddingId === entry.id || addingToConversation === `gallery:${entry.id}` ? tt("conversation.adding") : tt("conversation.add")]
4983
+ })
4984
+ }),
3667
4985
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3668
4986
  className: panel_module_css_default.galleryCardFooter,
3669
4987
  children: [
@@ -3749,7 +5067,130 @@ window.__ModuleLoader__.load({
3749
5067
  })
3750
5068
  ]
3751
5069
  }) : null,
3752
- tab !== "gallery" && tasks.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5070
+ workspace === "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5071
+ className: panel_module_css_default.ecommerceResults,
5072
+ "data-ecommerce-results": "",
5073
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
5074
+ className: panel_module_css_default.ecommerceResultsHeader,
5075
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
5076
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.results.title") }),
5077
+ ecommerceRestored !== null && ecommerceRestored.projectId === ecommerceProjectId && ecommerceRestored.projectName !== "" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: ecommerceRestored.projectName }) : null,
5078
+ ecommerceMergedItems.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [tt("ecommerce.results.progress", {
5079
+ done: ecommerceDoneCount,
5080
+ total: ecommerceMergedItems.length
5081
+ }), ecommerceFailedCount > 0 ? ` · ${tt("ecommerce.results.failed", { count: ecommerceFailedCount })}` : ""] }) : null,
5082
+ ecommerceAnchor !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5083
+ "data-ecommerce-anchor": "",
5084
+ children: tt("ecommerce.anchorPending")
5085
+ }) : null
5086
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5087
+ className: panel_module_css_default.ecommerceResultsActions,
5088
+ children: [ecommerceMergedItems.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5089
+ type: "button",
5090
+ className: panel_module_css_default.galleryBulkButton,
5091
+ "data-ecommerce-export": "",
5092
+ onClick: exportEcommerceManifest,
5093
+ children: tt("ecommerce.results.export")
5094
+ }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5095
+ type: "button",
5096
+ className: panel_module_css_default.galleryBulkButton,
5097
+ "data-ecommerce-new": "",
5098
+ onClick: newEcommerceProduct,
5099
+ children: tt("ecommerce.results.newProduct")
5100
+ })]
5101
+ })]
5102
+ }), ecommerceMergedItems.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5103
+ className: panel_module_css_default.ecommerceResultsEmpty,
5104
+ children: tt("ecommerce.results.empty")
5105
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5106
+ className: panel_module_css_default.ecommerceGroups,
5107
+ children: ecommerceResultGroups.map((group) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5108
+ className: panel_module_css_default.ecommerceGroup,
5109
+ "data-ecommerce-group": group.label,
5110
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [
5111
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: group.label }),
5112
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
5113
+ group.items.filter((item) => item.status === "completed").length,
5114
+ "/",
5115
+ group.items.length
5116
+ ] }),
5117
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5118
+ type: "button",
5119
+ className: panel_module_css_default.galleryBulkButton,
5120
+ disabled: ecommerceGenerating,
5121
+ onClick: () => {
5122
+ regenerateEcommerceSlot(group.label);
5123
+ },
5124
+ children: tt("ecommerce.results.regenerate")
5125
+ })
5126
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5127
+ className: panel_module_css_default.ecommerceGroupGrid,
5128
+ children: group.items.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5129
+ className: panel_module_css_default.ecommerceTaskCard,
5130
+ "data-status": item.status,
5131
+ children: item.status === "completed" && item.images.length > 0 ? item.images.map((image, imageIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("figure", {
5132
+ className: panel_module_css_default.imageCard,
5133
+ role: "button",
5134
+ tabIndex: 0,
5135
+ title: tt("preview.open"),
5136
+ onClick: () => {
5137
+ openPreview(item.images, imageIndex);
5138
+ },
5139
+ children: [
5140
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
5141
+ className: panel_module_css_default.image,
5142
+ src: srcOf(image),
5143
+ alt: `${group.label} ${imageIndex + 1}`
5144
+ }),
5145
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5146
+ className: panel_module_css_default.ecommerceResultBadge,
5147
+ children: group.label
5148
+ }),
5149
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5150
+ className: panel_module_css_default.ecommerceTaskActions,
5151
+ onClick: (event) => event.stopPropagation(),
5152
+ children: [
5153
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
5154
+ className: panel_module_css_default.ecommerceActionChip,
5155
+ href: srcOf(image),
5156
+ download: `product-${item.slotKey || item.id}-${imageIndex + 1}.${extensionOf(image.mime)}`,
5157
+ children: tt("download")
5158
+ }),
5159
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5160
+ type: "button",
5161
+ className: panel_module_css_default.ecommerceActionChip,
5162
+ disabled: galleryAdding,
5163
+ onClick: () => {
5164
+ addToGallery(image);
5165
+ },
5166
+ children: tt("gallery.add")
5167
+ }),
5168
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5169
+ type: "button",
5170
+ className: panel_module_css_default.ecommerceActionChip,
5171
+ disabled: conversationBusy,
5172
+ onClick: () => {
5173
+ addImageToConversation(image, imageIndex, `${item.id}:${imageIndex}`);
5174
+ },
5175
+ children: addingToConversation === `${item.id}:${imageIndex}` ? tt("conversation.adding") : tt("conversation.add")
5176
+ })
5177
+ ]
5178
+ })
5179
+ ]
5180
+ }, imageIndex)) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5181
+ className: panel_module_css_default.ecommerceTaskState,
5182
+ children: [
5183
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: group.label }),
5184
+ tt(`tasks.${item.status}`),
5185
+ item.error !== void 0 ? ` · ${item.error}` : ""
5186
+ ]
5187
+ })
5188
+ }, item.id))
5189
+ })]
5190
+ }, group.label))
5191
+ })]
5192
+ }) : null,
5193
+ (workspace === "ecommerce" || tab !== "gallery") && tasks.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3753
5194
  className: panel_module_css_default.taskTray,
3754
5195
  "data-open": taskTrayOpen ? "true" : "false",
3755
5196
  "aria-label": tt("tasks.title"),
@@ -3815,7 +5256,7 @@ window.__ModuleLoader__.load({
3815
5256
  }, task.id))
3816
5257
  })]
3817
5258
  }) : null,
3818
- tab !== "gallery" && comparison !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5259
+ workspace === "normal" && tab !== "gallery" && comparison !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3819
5260
  className: panel_module_css_default.comparisonBoard,
3820
5261
  "aria-label": tt("compare.title"),
3821
5262
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: tt("compare.title") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
@@ -3850,7 +5291,7 @@ window.__ModuleLoader__.load({
3850
5291
  })
3851
5292
  })]
3852
5293
  }) : null,
3853
- generating && comparison === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5294
+ generating && comparison === null && workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3854
5295
  className: panel_module_css_default.canvasState,
3855
5296
  "data-generation-state": activeTask?.status ?? "submitting",
3856
5297
  role: "status",
@@ -3871,7 +5312,7 @@ window.__ModuleLoader__.load({
3871
5312
  role: "alert",
3872
5313
  children: tt("canvas.error", { error })
3873
5314
  }) : null,
3874
- !generating && !error && images.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5315
+ !generating && !error && images.length === 0 && workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3875
5316
  className: panel_module_css_default.canvasState,
3876
5317
  children: [
3877
5318
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -3913,7 +5354,7 @@ window.__ModuleLoader__.load({
3913
5354
  })
3914
5355
  ]
3915
5356
  }) : null,
3916
- !generating && images.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5357
+ !generating && images.length > 0 && workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3917
5358
  className: panel_module_css_default.canvasBody,
3918
5359
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3919
5360
  className: panel_module_css_default.canvasMeta,
@@ -4004,7 +5445,7 @@ window.__ModuleLoader__.load({
4004
5445
  type: "button",
4005
5446
  className: panel_module_css_default.conversationAdd,
4006
5447
  title: tt("conversation.add"),
4007
- disabled: addingToConversation !== null,
5448
+ disabled: conversationBusy,
4008
5449
  onClick: (event) => {
4009
5450
  event.stopPropagation();
4010
5451
  addImageToConversation(image, index);
@@ -4046,7 +5487,7 @@ window.__ModuleLoader__.load({
4046
5487
  setLibraryOpen(false);
4047
5488
  },
4048
5489
  onUse: (text) => {
4049
- setTab("text");
5490
+ openTab("text");
4050
5491
  setPrompt(text);
4051
5492
  setError(null);
4052
5493
  setLibraryOpen(false);
@@ -4321,7 +5762,8 @@ window.__ModuleLoader__.load({
4321
5762
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4322
5763
  type: "button",
4323
5764
  className: panel_module_css_default.lightboxEdit,
4324
- disabled: addingToConversation !== null,
5765
+ disabled: conversationBusy,
5766
+ title: tt("conversation.addHint"),
4325
5767
  onClick: () => {
4326
5768
  addImageToConversation(previewImage, preview.index);
4327
5769
  },
@@ -4808,7 +6250,7 @@ window.__ModuleLoader__.load({
4808
6250
  }
4809
6251
  /** Publish a projection of this form, rebuilt whenever the scope or a draft changes. */
4810
6252
  bind(project) {
4811
- const store = (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)(project());
6253
+ const store = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(project());
4812
6254
  this.listeners.add(() => {
4813
6255
  store.set(project());
4814
6256
  });
@@ -5024,7 +6466,7 @@ window.__ModuleLoader__.load({
5024
6466
  }
5025
6467
  /** Publish a projection of this form, rebuilt on every scope or draft change. */
5026
6468
  bind(project) {
5027
- const store = (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)(project());
6469
+ const store = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(project());
5028
6470
  this.listeners.add(() => {
5029
6471
  store.set(project());
5030
6472
  });
@@ -5200,8 +6642,8 @@ window.__ModuleLoader__.load({
5200
6642
  return Array.isArray(view?.channels) ? view.channels : [];
5201
6643
  }
5202
6644
  //#endregion
5203
- //#region \0dsh-css:D:\learn\dsh\dsh-imagegen\src\client\settings-card.module.css.mjs
5204
- const css$1 = ".lDRIuW_card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;list-style:none;transition:border-color .16s,background .16s}.lDRIuW_card:hover{border-color:var(--dsw-alias-label-dimmed)}.lDRIuW_card:has(.lDRIuW_body){background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}.lDRIuW_header{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.lDRIuW_header:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}.lDRIuW_headText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.lDRIuW_name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}.lDRIuW_description{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}.lDRIuW_chevron,.lDRIuW_chevronOpen{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.lDRIuW_chevronOpen{transform:rotate(180deg)}.lDRIuW_pending{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.lDRIuW_body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding-bottom:8px}.lDRIuW_versionRow{border-bottom:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:12px;padding:12px 0;display:flex}.lDRIuW_versionLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:1.5}.lDRIuW_versionValue{background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-family-mono,monospace);border-radius:999px;padding:1px 8px;font-size:12px;line-height:1.5}.lDRIuW_field{flex-direction:column;gap:6px;padding:12px 0;display:flex}.lDRIuW_field+.lDRIuW_field{border-top:1px solid var(--dsw-alias-border-l2)}.lDRIuW_head{align-items:center;gap:8px;display:flex}.lDRIuW_label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:13px;font-weight:500;line-height:1.5}.lDRIuW_badges{align-items:center;gap:8px;display:inline-flex}.lDRIuW_badge{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.lDRIuW_reset{font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;line-height:1.5}.lDRIuW_reset:hover:not(:disabled){color:var(--dsw-alias-label-primary)}.lDRIuW_reset:disabled{cursor:default;opacity:.5}.lDRIuW_input,.lDRIuW_select{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;outline:none;padding:0 12px;font-size:13px;line-height:1.5}.lDRIuW_input:focus-visible,.lDRIuW_select:focus-visible{border-color:var(--dsw-alias-brand-primary)}.lDRIuW_input:disabled,.lDRIuW_select:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.lDRIuW_inputInvalid{border:1px solid var(--dsw-alias-label-error);background:var(--dsw-alias-bg-layer-3);height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;outline:none;padding:0 12px;font-size:13px;line-height:1.5}.lDRIuW_textarea,.lDRIuW_textareaInvalid{resize:vertical;background:var(--dsw-alias-bg-layer-3);min-height:70px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;outline:none;padding:8px 12px;font-size:13px;line-height:1.5}.lDRIuW_textarea{border:1px solid var(--dsw-alias-border-l2)}.lDRIuW_textareaInvalid{border:1px solid var(--dsw-alias-label-error)}.lDRIuW_textarea:focus-visible{border-color:var(--dsw-alias-brand-primary)}.lDRIuW_textarea:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.lDRIuW_hint,.lDRIuW_invalid{margin:0;font-size:12px;line-height:1.5}.lDRIuW_hint{color:var(--dsw-alias-label-tertiary)}.lDRIuW_invalid{color:var(--dsw-alias-label-error)}.lDRIuW_readOnly,.lDRIuW_notExposed{color:var(--dsw-alias-label-tertiary);margin:12px 0 0;font-size:12px;line-height:1.5}.lDRIuW_sectionDivider{background:var(--dsw-alias-border-l2);height:1px;margin:18px 0 14px}.lDRIuW_sectionTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:14px;line-height:1.4}.lDRIuW_sectionHint{color:var(--dsw-alias-label-tertiary);margin:-4px 0 2px;font-size:12px;line-height:1.5}.lDRIuW_modelSection{padding:2px 0 14px}.lDRIuW_sectionHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.lDRIuW_sectionHeader .lDRIuW_sectionHint{max-width:430px}.lDRIuW_modelSummary{flex-wrap:wrap;align-items:center;gap:6px;margin-top:12px;display:flex}.lDRIuW_modelChip{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);max-width:100%;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family-mono,monospace);border-radius:6px;align-items:center;gap:5px;padding:3px 5px 3px 8px;font-size:12px;line-height:1.5;display:inline-flex}.lDRIuW_modelChip>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.lDRIuW_modelChip button{appearance:none;width:18px;height:18px;color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0;line-height:18px}.lDRIuW_modelChip button:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform)}.lDRIuW_modelChip button:disabled{cursor:default;opacity:.45}.lDRIuW_addModel{appearance:none;border:1px dashed var(--dsw-alias-border-l2);min-height:28px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border-radius:6px;padding:0 9px;font-size:12px}.lDRIuW_addModel:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.lDRIuW_addModel:disabled{opacity:.45;cursor:default}.lDRIuW_manualModelRow{gap:8px;margin-top:10px;display:flex}.lDRIuW_manualModelRow .lDRIuW_input{flex:1;min-width:0}.lDRIuW_disclosure{appearance:none;border:0;border-top:1px solid var(--dsw-alias-border-l2);width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;align-items:center;gap:8px;padding:13px 0;font-size:13px;font-weight:500;display:flex}.lDRIuW_disclosure>span:nth-child(2){color:var(--dsw-alias-label-tertiary);margin-left:auto;font-size:12px;font-weight:400}.lDRIuW_disclosure>span:last-child{color:var(--dsw-alias-label-tertiary)}.lDRIuW_disclosure:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.lDRIuW_optionalContent{padding:0 0 8px}.lDRIuW_inlineDisclosure{appearance:none;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;margin-top:12px;padding:0;font-size:12px;display:inline-flex}.lDRIuW_inlineDisclosure:hover{color:var(--dsw-alias-label-primary)}.lDRIuW_modelFetchRow{align-items:center;gap:8px;display:flex}.lDRIuW_modelFetch,.lDRIuW_modelChoices{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);min-height:32px;color:var(--dsw-alias-label-secondary);font:inherit;border-radius:7px;font-size:12px}.lDRIuW_modelFetch{cursor:pointer;padding:0 10px}.lDRIuW_modelFetch:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.lDRIuW_modelFetch:disabled{opacity:.5;cursor:default}.lDRIuW_modelChoices{flex:1;min-width:0;padding:0 8px}.lDRIuW_modelCandidateList{flex-wrap:wrap;gap:6px 10px;margin-top:10px;display:flex}.lDRIuW_modelCandidateLabel{width:100%;color:var(--dsw-alias-label-tertiary);font-size:12px}.lDRIuW_modelCandidate{appearance:none;min-width:0;color:var(--dsw-alias-label-secondary);cursor:pointer;background:var(--dsw-alias-bg-layer-3);font-size:12px;line-height:1.5;font:inherit;border:1px solid #0000;border-radius:5px;align-items:center;gap:5px;padding:3px 6px;display:inline-flex}.lDRIuW_modelCandidate input{margin:0}.lDRIuW_modelCandidate[data-selected]{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary)}.lDRIuW_footer{border-top:1px solid var(--dsw-alias-border-l2);justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px;display:flex}.lDRIuW_failed{min-width:0;color:var(--dsw-alias-label-error);flex:1;margin:0;font-size:12px;line-height:1.5}.lDRIuW_discard,.lDRIuW_save{appearance:none;font:inherit;cursor:pointer;border:1px solid #0000;border-radius:8px;padding:5px 14px;font-size:13px;line-height:1.5}.lDRIuW_discard{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:0 0}.lDRIuW_discard:hover:not(:disabled){color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed)}.lDRIuW_save{background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3)}.lDRIuW_discard:disabled,.lDRIuW_save:disabled{opacity:.4;cursor:default}.lDRIuW_discard:focus-visible,.lDRIuW_save:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}@media (prefers-reduced-motion:reduce){.lDRIuW_card,.lDRIuW_chevron,.lDRIuW_chevronOpen{transition:none}}.lDRIuW_channelSection{padding:6px 0 2px}.lDRIuW_channelEmpty{color:var(--dsw-alias-label-tertiary);margin:10px 0 0;font-size:12px;line-height:1.5}.lDRIuW_channelList{flex-direction:column;gap:6px;margin:10px 0 0;padding:0;list-style:none;display:flex}.lDRIuW_channelRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;align-items:center;gap:10px;padding:8px 10px;display:flex}.lDRIuW_channelRow[data-action]{flex-wrap:wrap}.lDRIuW_channelDotReady,.lDRIuW_channelDotWarn{border-radius:50%;flex:none;width:9px;height:9px}.lDRIuW_channelDotReady{background:var(--dsw-color-success,#2fbf71)}.lDRIuW_channelDotWarn{background:var(--dsw-color-danger,#e5484d)}.lDRIuW_channelMain{appearance:none;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;flex:1;gap:3px;padding:0;display:flex}.lDRIuW_channelName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;line-height:1.4;overflow:hidden}.lDRIuW_channelMeta{flex-wrap:wrap;align-items:center;gap:4px 8px;display:flex}.lDRIuW_channelHost{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.5;font-family:var(--dsw-font-family-mono,monospace);text-overflow:ellipsis;white-space:nowrap;max-width:180px;overflow:hidden}.lDRIuW_channelBadge{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border-radius:999px;padding:0 7px;font-size:11px;font-weight:500;line-height:17px}.lDRIuW_channelBadge[data-warn]{color:var(--dsw-alias-label-error)}.lDRIuW_channelBadge[data-default]{background:var(--dsw-alias-bg-module-poped,var(--dsw-alias-bg-module-platform));color:var(--dsw-alias-brand-primary)}.lDRIuW_channelAction{appearance:none;font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;padding:4px 8px;font-size:12px;line-height:1.5}.lDRIuW_channelAction:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform)}.lDRIuW_channelAction[data-danger]{color:var(--dsw-alias-label-error)}.lDRIuW_channelAction:disabled{opacity:.45;cursor:default}.lDRIuW_channelDanger{appearance:none;border:1px solid var(--dsw-alias-label-error);color:var(--dsw-alias-label-error);font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;padding:3px 10px;font-size:12px}.lDRIuW_channelDanger:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-label-error) 12%, transparent)}.lDRIuW_channelDanger:disabled{opacity:.45;cursor:default}.lDRIuW_deleteConfirmText{min-width:0;color:var(--dsw-alias-label-error);flex:1;font-size:12px;line-height:1.5}.lDRIuW_channelAddRow{gap:8px;margin-top:10px;display:flex}.lDRIuW_channelAdd{appearance:none;border:1px dashed var(--dsw-alias-border-l2);min-height:30px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border-radius:8px;padding:0 12px;font-size:12px}.lDRIuW_channelAdd:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.lDRIuW_channelAdd:disabled{opacity:.45;cursor:default}.lDRIuW_spacer{flex:1}.lDRIuW_editorBackdrop{z-index:120;background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#000) 45%, transparent);justify-content:center;align-items:flex-start;padding:9vh 16px 16px;display:flex;position:fixed;inset:0}.lDRIuW_editorPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:14px;width:min(560px,100%);max-height:82vh;padding:16px;overflow-y:auto;box-shadow:0 18px 50px #00000059}.lDRIuW_editorHeader{border-bottom:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:flex-start;gap:12px;padding-bottom:10px;display:flex}.lDRIuW_editorClose{appearance:none;width:26px;height:26px;color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;font-size:16px;line-height:26px}.lDRIuW_editorClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform)}.lDRIuW_editorField{flex-direction:column;gap:6px;padding:12px 0 0;display:flex}.lDRIuW_editorDivider{background:var(--dsw-alias-border-l2);height:1px;margin:14px 0 4px}.lDRIuW_editorSectionHeader{justify-content:space-between;align-items:center;gap:12px;padding:10px 0 4px;display:flex}.lDRIuW_editorSectionHeader .lDRIuW_label{flex:1}.lDRIuW_editorTools{flex-direction:column;gap:8px;margin-top:10px;display:flex}.lDRIuW_editorFooter{border-top:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding-top:12px;display:flex}.lDRIuW_detectOk{color:var(--dsw-color-success,var(--dsw-alias-label-secondary));margin:0;font-size:12px;line-height:1.5}.lDRIuW_modelRows{flex-direction:column;gap:8px;margin:8px 0 0;padding:0;list-style:none;display:flex}.lDRIuW_modelRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;justify-content:space-between;align-items:center;gap:10px;padding:8px 10px;display:flex}.lDRIuW_modelRowInputs{flex:1;align-items:center;gap:6px;min-width:0;display:flex}.lDRIuW_modelRowInputs .lDRIuW_input{flex:1;min-width:0}.lDRIuW_modelArrow{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px}.lDRIuW_modelRowBadges{flex:none;align-items:center;gap:6px;display:flex}.lDRIuW_modelBadge{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:0 7px;font-size:11px;line-height:17px}.lDRIuW_modelBadge[data-verified]{color:var(--dsw-color-success,var(--dsw-alias-label-secondary))}.lDRIuW_modelBadge[data-warn]{color:var(--dsw-alias-label-error)}.lDRIuW_modelRowRemove{appearance:none;width:20px;height:20px;color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;padding:0;line-height:20px}.lDRIuW_modelRowRemove:hover:not(:disabled){color:var(--dsw-alias-label-error);background:var(--dsw-alias-bg-module-platform)}.lDRIuW_modelRowRemove:disabled{opacity:.45;cursor:default}.lDRIuW_modelCandidate>.lDRIuW_modelBadge{flex:none}.lDRIuW_channelControls{position:relative}.lDRIuW_presetInline{z-index:10;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;width:min(420px,100vw - 48px);max-height:min(440px,60vh);margin:0;padding:12px;position:absolute;bottom:calc(100% + 8px);left:0;overflow-y:auto;box-shadow:0 12px 30px #0000004d}.lDRIuW_presetInlineHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.lDRIuW_presetList{flex-direction:column;gap:8px;margin-top:12px;display:flex}.lDRIuW_presetRow{appearance:none;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:10px;flex-direction:column;align-items:flex-start;gap:3px;padding:10px 12px;display:flex}.lDRIuW_presetRow:hover:not(:disabled){border-color:var(--dsw-alias-brand-primary)}.lDRIuW_presetRow[data-custom]{border-style:dashed}.lDRIuW_presetRow:disabled{opacity:.5;cursor:default}.lDRIuW_presetName{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600;line-height:1.4}.lDRIuW_presetMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.5;font-family:var(--dsw-font-family-mono,monospace)}.lDRIuW_presetHint{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}";
6645
+ //#region \0dsh-css:E:\dsh-plugin\src\client\settings-card.module.css.mjs
6646
+ const css$1 = ".i1cc5G_card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;list-style:none;transition:border-color .16s,background .16s}.i1cc5G_card:hover{border-color:var(--dsw-alias-label-dimmed)}.i1cc5G_card:has(.i1cc5G_body){background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}.i1cc5G_header{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.i1cc5G_header:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}.i1cc5G_headText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.i1cc5G_name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}.i1cc5G_description{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}.i1cc5G_chevron,.i1cc5G_chevronOpen{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.i1cc5G_chevronOpen{transform:rotate(180deg)}.i1cc5G_pending{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.i1cc5G_body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding-bottom:8px}.i1cc5G_versionRow{border-bottom:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:12px;padding:12px 0;display:flex}.i1cc5G_versionLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:1.5}.i1cc5G_versionValue{background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-family-mono,monospace);border-radius:999px;padding:1px 8px;font-size:12px;line-height:1.5}.i1cc5G_field{flex-direction:column;gap:6px;padding:12px 0;display:flex}.i1cc5G_field+.i1cc5G_field{border-top:1px solid var(--dsw-alias-border-l2)}.i1cc5G_head{align-items:center;gap:8px;display:flex}.i1cc5G_label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:13px;font-weight:500;line-height:1.5}.i1cc5G_badges{align-items:center;gap:8px;display:inline-flex}.i1cc5G_badge{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.i1cc5G_reset{font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;line-height:1.5}.i1cc5G_reset:hover:not(:disabled){color:var(--dsw-alias-label-primary)}.i1cc5G_reset:disabled{cursor:default;opacity:.5}.i1cc5G_input,.i1cc5G_select{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;outline:none;padding:0 12px;font-size:13px;line-height:1.5}.i1cc5G_input:focus-visible,.i1cc5G_select:focus-visible{border-color:var(--dsw-alias-brand-primary)}.i1cc5G_input:disabled,.i1cc5G_select:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.i1cc5G_inputInvalid{border:1px solid var(--dsw-alias-label-error);background:var(--dsw-alias-bg-layer-3);height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;outline:none;padding:0 12px;font-size:13px;line-height:1.5}.i1cc5G_textarea,.i1cc5G_textareaInvalid{resize:vertical;background:var(--dsw-alias-bg-layer-3);min-height:70px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;outline:none;padding:8px 12px;font-size:13px;line-height:1.5}.i1cc5G_textarea{border:1px solid var(--dsw-alias-border-l2)}.i1cc5G_textareaInvalid{border:1px solid var(--dsw-alias-label-error)}.i1cc5G_textarea:focus-visible{border-color:var(--dsw-alias-brand-primary)}.i1cc5G_textarea:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.i1cc5G_hint,.i1cc5G_invalid{margin:0;font-size:12px;line-height:1.5}.i1cc5G_hint{color:var(--dsw-alias-label-tertiary)}.i1cc5G_invalid{color:var(--dsw-alias-label-error)}.i1cc5G_readOnly,.i1cc5G_notExposed{color:var(--dsw-alias-label-tertiary);margin:12px 0 0;font-size:12px;line-height:1.5}.i1cc5G_sectionDivider{background:var(--dsw-alias-border-l2);height:1px;margin:18px 0 14px}.i1cc5G_sectionTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:14px;line-height:1.4}.i1cc5G_sectionHint{color:var(--dsw-alias-label-tertiary);margin:-4px 0 2px;font-size:12px;line-height:1.5}.i1cc5G_modelSection{padding:2px 0 14px}.i1cc5G_sectionHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.i1cc5G_sectionHeader .i1cc5G_sectionHint{max-width:430px}.i1cc5G_modelSummary{flex-wrap:wrap;align-items:center;gap:6px;margin-top:12px;display:flex}.i1cc5G_modelChip{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);max-width:100%;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family-mono,monospace);border-radius:6px;align-items:center;gap:5px;padding:3px 5px 3px 8px;font-size:12px;line-height:1.5;display:inline-flex}.i1cc5G_modelChip>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.i1cc5G_modelChip button{appearance:none;width:18px;height:18px;color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0;line-height:18px}.i1cc5G_modelChip button:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform)}.i1cc5G_modelChip button:disabled{cursor:default;opacity:.45}.i1cc5G_addModel{appearance:none;border:1px dashed var(--dsw-alias-border-l2);min-height:28px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border-radius:6px;padding:0 9px;font-size:12px}.i1cc5G_addModel:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.i1cc5G_addModel:disabled{opacity:.45;cursor:default}.i1cc5G_manualModelRow{gap:8px;margin-top:10px;display:flex}.i1cc5G_manualModelRow .i1cc5G_input{flex:1;min-width:0}.i1cc5G_disclosure{appearance:none;border:0;border-top:1px solid var(--dsw-alias-border-l2);width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;align-items:center;gap:8px;padding:13px 0;font-size:13px;font-weight:500;display:flex}.i1cc5G_disclosure>span:nth-child(2){color:var(--dsw-alias-label-tertiary);margin-left:auto;font-size:12px;font-weight:400}.i1cc5G_disclosure>span:last-child{color:var(--dsw-alias-label-tertiary)}.i1cc5G_disclosure:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.i1cc5G_optionalContent{padding:0 0 8px}.i1cc5G_inlineDisclosure{appearance:none;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;margin-top:12px;padding:0;font-size:12px;display:inline-flex}.i1cc5G_inlineDisclosure:hover{color:var(--dsw-alias-label-primary)}.i1cc5G_modelFetchRow{align-items:center;gap:8px;display:flex}.i1cc5G_modelFetch,.i1cc5G_modelChoices{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);min-height:32px;color:var(--dsw-alias-label-secondary);font:inherit;border-radius:7px;font-size:12px}.i1cc5G_modelFetch{cursor:pointer;padding:0 10px}.i1cc5G_modelFetch:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.i1cc5G_modelFetch:disabled{opacity:.5;cursor:default}.i1cc5G_modelChoices{flex:1;min-width:0;padding:0 8px}.i1cc5G_modelCandidateList{flex-wrap:wrap;gap:6px 10px;margin-top:10px;display:flex}.i1cc5G_modelCandidateLabel{width:100%;color:var(--dsw-alias-label-tertiary);font-size:12px}.i1cc5G_modelCandidate{appearance:none;min-width:0;color:var(--dsw-alias-label-secondary);cursor:pointer;background:var(--dsw-alias-bg-layer-3);font-size:12px;line-height:1.5;font:inherit;border:1px solid #0000;border-radius:5px;align-items:center;gap:5px;padding:3px 6px;display:inline-flex}.i1cc5G_modelCandidate input{margin:0}.i1cc5G_modelCandidate[data-selected]{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary)}.i1cc5G_footer{border-top:1px solid var(--dsw-alias-border-l2);justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px;display:flex}.i1cc5G_failed{min-width:0;color:var(--dsw-alias-label-error);flex:1;margin:0;font-size:12px;line-height:1.5}.i1cc5G_discard,.i1cc5G_save{appearance:none;font:inherit;cursor:pointer;border:1px solid #0000;border-radius:8px;padding:5px 14px;font-size:13px;line-height:1.5}.i1cc5G_discard{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:0 0}.i1cc5G_discard:hover:not(:disabled){color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed)}.i1cc5G_save{background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3)}.i1cc5G_discard:disabled,.i1cc5G_save:disabled{opacity:.4;cursor:default}.i1cc5G_discard:focus-visible,.i1cc5G_save:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}@media (prefers-reduced-motion:reduce){.i1cc5G_card,.i1cc5G_chevron,.i1cc5G_chevronOpen{transition:none}}.i1cc5G_channelSection{padding:6px 0 2px}.i1cc5G_channelEmpty{color:var(--dsw-alias-label-tertiary);margin:10px 0 0;font-size:12px;line-height:1.5}.i1cc5G_channelList{flex-direction:column;gap:6px;margin:10px 0 0;padding:0;list-style:none;display:flex}.i1cc5G_channelRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;align-items:center;gap:10px;padding:8px 10px;display:flex}.i1cc5G_channelRow[data-action]{flex-wrap:wrap}.i1cc5G_channelDotReady,.i1cc5G_channelDotWarn{border-radius:50%;flex:none;width:9px;height:9px}.i1cc5G_channelDotReady{background:var(--dsw-color-success,#2fbf71)}.i1cc5G_channelDotWarn{background:var(--dsw-color-danger,#e5484d)}.i1cc5G_channelMain{appearance:none;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;flex:1;gap:3px;padding:0;display:flex}.i1cc5G_channelName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;line-height:1.4;overflow:hidden}.i1cc5G_channelMeta{flex-wrap:wrap;align-items:center;gap:4px 8px;display:flex}.i1cc5G_channelHost{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.5;font-family:var(--dsw-font-family-mono,monospace);text-overflow:ellipsis;white-space:nowrap;max-width:180px;overflow:hidden}.i1cc5G_channelBadge{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border-radius:999px;padding:0 7px;font-size:11px;font-weight:500;line-height:17px}.i1cc5G_channelBadge[data-warn]{color:var(--dsw-alias-label-error)}.i1cc5G_channelBadge[data-default]{background:var(--dsw-alias-bg-module-poped,var(--dsw-alias-bg-module-platform));color:var(--dsw-alias-brand-primary)}.i1cc5G_channelAction{appearance:none;font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;padding:4px 8px;font-size:12px;line-height:1.5}.i1cc5G_channelAction:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform)}.i1cc5G_channelAction[data-danger]{color:var(--dsw-alias-label-error)}.i1cc5G_channelAction:disabled{opacity:.45;cursor:default}.i1cc5G_channelDanger{appearance:none;border:1px solid var(--dsw-alias-label-error);color:var(--dsw-alias-label-error);font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;padding:3px 10px;font-size:12px}.i1cc5G_channelDanger:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-label-error) 12%, transparent)}.i1cc5G_channelDanger:disabled{opacity:.45;cursor:default}.i1cc5G_deleteConfirmText{min-width:0;color:var(--dsw-alias-label-error);flex:1;font-size:12px;line-height:1.5}.i1cc5G_channelAddRow{gap:8px;margin-top:10px;display:flex}.i1cc5G_channelAdd{appearance:none;border:1px dashed var(--dsw-alias-border-l2);min-height:30px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border-radius:8px;padding:0 12px;font-size:12px}.i1cc5G_channelAdd:hover:not(:disabled){color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}.i1cc5G_channelAdd:disabled{opacity:.45;cursor:default}.i1cc5G_spacer{flex:1}.i1cc5G_editorBackdrop{z-index:120;background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#000) 45%, transparent);justify-content:center;align-items:flex-start;padding:9vh 16px 16px;display:flex;position:fixed;inset:0}.i1cc5G_editorPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:14px;width:min(560px,100%);max-height:82vh;padding:16px;overflow-y:auto;box-shadow:0 18px 50px #00000059}.i1cc5G_editorHeader{border-bottom:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:flex-start;gap:12px;padding-bottom:10px;display:flex}.i1cc5G_editorClose{appearance:none;width:26px;height:26px;color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;font-size:16px;line-height:26px}.i1cc5G_editorClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform)}.i1cc5G_editorField{flex-direction:column;gap:6px;padding:12px 0 0;display:flex}.i1cc5G_editorDivider{background:var(--dsw-alias-border-l2);height:1px;margin:14px 0 4px}.i1cc5G_editorSectionHeader{justify-content:space-between;align-items:center;gap:12px;padding:10px 0 4px;display:flex}.i1cc5G_editorSectionHeader .i1cc5G_label{flex:1}.i1cc5G_editorTools{flex-direction:column;gap:8px;margin-top:10px;display:flex}.i1cc5G_editorFooter{border-top:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding-top:12px;display:flex}.i1cc5G_detectOk{color:var(--dsw-color-success,var(--dsw-alias-label-secondary));margin:0;font-size:12px;line-height:1.5}.i1cc5G_modelRows{flex-direction:column;gap:8px;margin:8px 0 0;padding:0;list-style:none;display:flex}.i1cc5G_modelRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;justify-content:space-between;align-items:center;gap:10px;padding:8px 10px;display:flex}.i1cc5G_modelRowInputs{flex:1;align-items:center;gap:6px;min-width:0;display:flex}.i1cc5G_modelRowInputs .i1cc5G_input{flex:1;min-width:0}.i1cc5G_modelArrow{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px}.i1cc5G_modelRowBadges{flex:none;align-items:center;gap:6px;display:flex}.i1cc5G_modelBadge{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:0 7px;font-size:11px;line-height:17px}.i1cc5G_modelBadge[data-verified]{color:var(--dsw-color-success,var(--dsw-alias-label-secondary))}.i1cc5G_modelBadge[data-warn]{color:var(--dsw-alias-label-error)}.i1cc5G_modelRowRemove{appearance:none;width:20px;height:20px;color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;padding:0;line-height:20px}.i1cc5G_modelRowRemove:hover:not(:disabled){color:var(--dsw-alias-label-error);background:var(--dsw-alias-bg-module-platform)}.i1cc5G_modelRowRemove:disabled{opacity:.45;cursor:default}.i1cc5G_modelCandidate>.i1cc5G_modelBadge{flex:none}.i1cc5G_channelControls{position:relative}.i1cc5G_presetInline{z-index:10;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;width:min(420px,100vw - 48px);max-height:min(440px,60vh);margin:0;padding:12px;position:absolute;bottom:calc(100% + 8px);left:0;overflow-y:auto;box-shadow:0 12px 30px #0000004d}.i1cc5G_presetInlineHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.i1cc5G_presetList{flex-direction:column;gap:8px;margin-top:12px;display:flex}.i1cc5G_presetRow{appearance:none;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:10px;flex-direction:column;align-items:flex-start;gap:3px;padding:10px 12px;display:flex}.i1cc5G_presetRow:hover:not(:disabled){border-color:var(--dsw-alias-brand-primary)}.i1cc5G_presetRow[data-custom]{border-style:dashed}.i1cc5G_presetRow:disabled{opacity:.5;cursor:default}.i1cc5G_presetName{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600;line-height:1.4}.i1cc5G_presetMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.5;font-family:var(--dsw-font-family-mono,monospace)}.i1cc5G_presetHint{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}";
5205
6647
  const tagId$1 = "@dickpy/dsh-imagegen/settings-card.module.css";
5206
6648
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
5207
6649
  const tag = document.createElement("style");
@@ -5211,97 +6653,97 @@ window.__ModuleLoader__.load({
5211
6653
  document.head.appendChild(tag);
5212
6654
  }
5213
6655
  var settings_card_module_css_default = {
5214
- "save": "lDRIuW_save",
5215
- "pending": "lDRIuW_pending",
5216
- "presetInline": "lDRIuW_presetInline",
5217
- "editorFooter": "lDRIuW_editorFooter",
5218
- "chevron": "lDRIuW_chevron",
5219
- "input": "lDRIuW_input",
5220
- "detectOk": "lDRIuW_detectOk",
5221
- "channelRow": "lDRIuW_channelRow",
5222
- "hint": "lDRIuW_hint",
5223
- "presetHint": "lDRIuW_presetHint",
5224
- "modelChoices": "lDRIuW_modelChoices",
5225
- "disclosure": "lDRIuW_disclosure",
5226
- "modelRow": "lDRIuW_modelRow",
5227
- "presetRow": "lDRIuW_presetRow",
5228
- "addModel": "lDRIuW_addModel",
5229
- "card": "lDRIuW_card",
5230
- "channelSection": "lDRIuW_channelSection",
5231
- "head": "lDRIuW_head",
5232
- "versionLabel": "lDRIuW_versionLabel",
5233
- "channelDotReady": "lDRIuW_channelDotReady",
5234
- "channelEmpty": "lDRIuW_channelEmpty",
5235
- "field": "lDRIuW_field",
5236
- "modelFetch": "lDRIuW_modelFetch",
5237
- "header": "lDRIuW_header",
5238
- "deleteConfirmText": "lDRIuW_deleteConfirmText",
5239
- "spacer": "lDRIuW_spacer",
5240
- "select": "lDRIuW_select",
5241
- "editorBackdrop": "lDRIuW_editorBackdrop",
5242
- "editorDivider": "lDRIuW_editorDivider",
5243
- "editorTools": "lDRIuW_editorTools",
5244
- "modelRows": "lDRIuW_modelRows",
5245
- "sectionHint": "lDRIuW_sectionHint",
5246
- "invalid": "lDRIuW_invalid",
5247
- "editorClose": "lDRIuW_editorClose",
5248
- "footer": "lDRIuW_footer",
5249
- "chevronOpen": "lDRIuW_chevronOpen",
5250
- "inlineDisclosure": "lDRIuW_inlineDisclosure",
5251
- "versionRow": "lDRIuW_versionRow",
5252
- "channelHost": "lDRIuW_channelHost",
5253
- "badge": "lDRIuW_badge",
5254
- "name": "lDRIuW_name",
5255
- "description": "lDRIuW_description",
5256
- "sectionTitle": "lDRIuW_sectionTitle",
5257
- "modelSummary": "lDRIuW_modelSummary",
5258
- "modelFetchRow": "lDRIuW_modelFetchRow",
5259
- "textarea": "lDRIuW_textarea",
5260
- "inputInvalid": "lDRIuW_inputInvalid",
5261
- "manualModelRow": "lDRIuW_manualModelRow",
5262
- "channelDanger": "lDRIuW_channelDanger",
5263
- "sectionDivider": "lDRIuW_sectionDivider",
5264
- "channelAdd": "lDRIuW_channelAdd",
5265
- "modelCandidateList": "lDRIuW_modelCandidateList",
5266
- "channelName": "lDRIuW_channelName",
5267
- "modelSection": "lDRIuW_modelSection",
5268
- "badges": "lDRIuW_badges",
5269
- "discard": "lDRIuW_discard",
5270
- "body": "lDRIuW_body",
5271
- "presetMeta": "lDRIuW_presetMeta",
5272
- "versionValue": "lDRIuW_versionValue",
5273
- "modelRowInputs": "lDRIuW_modelRowInputs",
5274
- "channelBadge": "lDRIuW_channelBadge",
5275
- "modelArrow": "lDRIuW_modelArrow",
5276
- "modelCandidate": "lDRIuW_modelCandidate",
5277
- "failed": "lDRIuW_failed",
5278
- "modelCandidateLabel": "lDRIuW_modelCandidateLabel",
5279
- "channelControls": "lDRIuW_channelControls",
5280
- "readOnly": "lDRIuW_readOnly",
5281
- "notExposed": "lDRIuW_notExposed",
5282
- "channelList": "lDRIuW_channelList",
5283
- "editorSectionHeader": "lDRIuW_editorSectionHeader",
5284
- "presetInlineHeader": "lDRIuW_presetInlineHeader",
5285
- "channelAction": "lDRIuW_channelAction",
5286
- "headText": "lDRIuW_headText",
5287
- "channelAddRow": "lDRIuW_channelAddRow",
5288
- "textareaInvalid": "lDRIuW_textareaInvalid",
5289
- "reset": "lDRIuW_reset",
5290
- "editorField": "lDRIuW_editorField",
5291
- "editorPanel": "lDRIuW_editorPanel",
5292
- "sectionHeader": "lDRIuW_sectionHeader",
5293
- "modelRowBadges": "lDRIuW_modelRowBadges",
5294
- "modelRowRemove": "lDRIuW_modelRowRemove",
5295
- "modelChip": "lDRIuW_modelChip",
5296
- "channelDotWarn": "lDRIuW_channelDotWarn",
5297
- "modelBadge": "lDRIuW_modelBadge",
5298
- "channelMeta": "lDRIuW_channelMeta",
5299
- "editorHeader": "lDRIuW_editorHeader",
5300
- "channelMain": "lDRIuW_channelMain",
5301
- "label": "lDRIuW_label",
5302
- "presetName": "lDRIuW_presetName",
5303
- "optionalContent": "lDRIuW_optionalContent",
5304
- "presetList": "lDRIuW_presetList"
6656
+ "textareaInvalid": "i1cc5G_textareaInvalid",
6657
+ "readOnly": "i1cc5G_readOnly",
6658
+ "badge": "i1cc5G_badge",
6659
+ "channelName": "i1cc5G_channelName",
6660
+ "channelAdd": "i1cc5G_channelAdd",
6661
+ "save": "i1cc5G_save",
6662
+ "channelBadge": "i1cc5G_channelBadge",
6663
+ "detectOk": "i1cc5G_detectOk",
6664
+ "modelRowBadges": "i1cc5G_modelRowBadges",
6665
+ "modelBadge": "i1cc5G_modelBadge",
6666
+ "label": "i1cc5G_label",
6667
+ "inputInvalid": "i1cc5G_inputInvalid",
6668
+ "channelDotWarn": "i1cc5G_channelDotWarn",
6669
+ "presetName": "i1cc5G_presetName",
6670
+ "presetHint": "i1cc5G_presetHint",
6671
+ "modelRow": "i1cc5G_modelRow",
6672
+ "select": "i1cc5G_select",
6673
+ "input": "i1cc5G_input",
6674
+ "badges": "i1cc5G_badges",
6675
+ "channelList": "i1cc5G_channelList",
6676
+ "editorTools": "i1cc5G_editorTools",
6677
+ "channelMeta": "i1cc5G_channelMeta",
6678
+ "modelRowRemove": "i1cc5G_modelRowRemove",
6679
+ "channelHost": "i1cc5G_channelHost",
6680
+ "chevronOpen": "i1cc5G_chevronOpen",
6681
+ "sectionTitle": "i1cc5G_sectionTitle",
6682
+ "sectionHeader": "i1cc5G_sectionHeader",
6683
+ "editorField": "i1cc5G_editorField",
6684
+ "editorSectionHeader": "i1cc5G_editorSectionHeader",
6685
+ "editorHeader": "i1cc5G_editorHeader",
6686
+ "editorClose": "i1cc5G_editorClose",
6687
+ "modelFetchRow": "i1cc5G_modelFetchRow",
6688
+ "failed": "i1cc5G_failed",
6689
+ "editorDivider": "i1cc5G_editorDivider",
6690
+ "discard": "i1cc5G_discard",
6691
+ "name": "i1cc5G_name",
6692
+ "channelAddRow": "i1cc5G_channelAddRow",
6693
+ "editorBackdrop": "i1cc5G_editorBackdrop",
6694
+ "channelDotReady": "i1cc5G_channelDotReady",
6695
+ "headText": "i1cc5G_headText",
6696
+ "versionValue": "i1cc5G_versionValue",
6697
+ "editorPanel": "i1cc5G_editorPanel",
6698
+ "presetList": "i1cc5G_presetList",
6699
+ "modelCandidate": "i1cc5G_modelCandidate",
6700
+ "optionalContent": "i1cc5G_optionalContent",
6701
+ "modelRows": "i1cc5G_modelRows",
6702
+ "modelRowInputs": "i1cc5G_modelRowInputs",
6703
+ "addModel": "i1cc5G_addModel",
6704
+ "channelSection": "i1cc5G_channelSection",
6705
+ "presetRow": "i1cc5G_presetRow",
6706
+ "modelCandidateLabel": "i1cc5G_modelCandidateLabel",
6707
+ "channelDanger": "i1cc5G_channelDanger",
6708
+ "presetMeta": "i1cc5G_presetMeta",
6709
+ "field": "i1cc5G_field",
6710
+ "hint": "i1cc5G_hint",
6711
+ "versionLabel": "i1cc5G_versionLabel",
6712
+ "body": "i1cc5G_body",
6713
+ "manualModelRow": "i1cc5G_manualModelRow",
6714
+ "pending": "i1cc5G_pending",
6715
+ "notExposed": "i1cc5G_notExposed",
6716
+ "modelCandidateList": "i1cc5G_modelCandidateList",
6717
+ "modelArrow": "i1cc5G_modelArrow",
6718
+ "chevron": "i1cc5G_chevron",
6719
+ "modelChoices": "i1cc5G_modelChoices",
6720
+ "head": "i1cc5G_head",
6721
+ "inlineDisclosure": "i1cc5G_inlineDisclosure",
6722
+ "disclosure": "i1cc5G_disclosure",
6723
+ "channelRow": "i1cc5G_channelRow",
6724
+ "card": "i1cc5G_card",
6725
+ "description": "i1cc5G_description",
6726
+ "modelFetch": "i1cc5G_modelFetch",
6727
+ "channelMain": "i1cc5G_channelMain",
6728
+ "header": "i1cc5G_header",
6729
+ "modelSummary": "i1cc5G_modelSummary",
6730
+ "versionRow": "i1cc5G_versionRow",
6731
+ "channelAction": "i1cc5G_channelAction",
6732
+ "sectionDivider": "i1cc5G_sectionDivider",
6733
+ "channelControls": "i1cc5G_channelControls",
6734
+ "presetInlineHeader": "i1cc5G_presetInlineHeader",
6735
+ "presetInline": "i1cc5G_presetInline",
6736
+ "deleteConfirmText": "i1cc5G_deleteConfirmText",
6737
+ "textarea": "i1cc5G_textarea",
6738
+ "modelChip": "i1cc5G_modelChip",
6739
+ "spacer": "i1cc5G_spacer",
6740
+ "editorFooter": "i1cc5G_editorFooter",
6741
+ "reset": "i1cc5G_reset",
6742
+ "channelEmpty": "i1cc5G_channelEmpty",
6743
+ "invalid": "i1cc5G_invalid",
6744
+ "modelSection": "i1cc5G_modelSection",
6745
+ "footer": "i1cc5G_footer",
6746
+ "sectionHint": "i1cc5G_sectionHint"
5305
6747
  };
5306
6748
  //#endregion
5307
6749
  //#region src/client/SettingsCard.tsx
@@ -6553,8 +7995,8 @@ window.__ModuleLoader__.load({
6553
7995
  });
6554
7996
  }
6555
7997
  //#endregion
6556
- //#region \0dsh-css:D:\learn\dsh\dsh-imagegen\src\client\image-toolview.module.css.mjs
6557
- const css = ".NPSazW_root{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:8px;flex-direction:column;gap:7px;margin:4px 0;padding:8px 10px 10px;display:flex}.NPSazW_header{min-height:20px;color:var(--dsw-alias-label-secondary);align-items:center;gap:7px;font-size:12px;display:flex}.NPSazW_icon{color:var(--dsw-alias-brand-primary);font-size:15px;line-height:1}.NPSazW_status{color:var(--dsw-alias-label-tertiary);margin-left:auto;font-size:11px}.NPSazW_message,.NPSazW_loading,.NPSazW_error{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin:0;font-size:12px;line-height:1.5}.NPSazW_images{flex-wrap:wrap;gap:8px;display:flex}.NPSazW_imageLink{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:6px;max-width:min(280px,100%);display:block;overflow:hidden}.NPSazW_imageLink:hover{border-color:var(--dsw-alias-brand-primary)}.NPSazW_image{object-fit:contain;width:auto;max-width:280px;height:auto;max-height:220px;display:block}.NPSazW_error{color:var(--dsw-alias-state-error-primary)}";
7998
+ //#region \0dsh-css:E:\dsh-plugin\src\client\image-toolview.module.css.mjs
7999
+ const css = "._3eGrYG_root{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:8px;flex-direction:column;gap:7px;margin:4px 0;padding:8px 10px 10px;display:flex}._3eGrYG_header{min-height:20px;color:var(--dsw-alias-label-secondary);align-items:center;gap:7px;font-size:12px;display:flex}._3eGrYG_icon{color:var(--dsw-alias-brand-primary);font-size:15px;line-height:1}._3eGrYG_status{color:var(--dsw-alias-label-tertiary);margin-left:auto;font-size:11px}._3eGrYG_message,._3eGrYG_loading,._3eGrYG_error{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin:0;font-size:12px;line-height:1.5}._3eGrYG_images{flex-wrap:wrap;gap:8px;display:flex}._3eGrYG_imageLink{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:6px;max-width:min(280px,100%);display:block;overflow:hidden}._3eGrYG_imageLink:hover{border-color:var(--dsw-alias-brand-primary)}._3eGrYG_image{object-fit:contain;width:auto;max-width:280px;height:auto;max-height:220px;display:block}._3eGrYG_error{color:var(--dsw-alias-state-error-primary)}";
6558
8000
  const tagId = "@dickpy/dsh-imagegen/image-toolview.module.css";
6559
8001
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
6560
8002
  const tag = document.createElement("style");
@@ -6564,16 +8006,16 @@ window.__ModuleLoader__.load({
6564
8006
  document.head.appendChild(tag);
6565
8007
  }
6566
8008
  var image_toolview_module_css_default = {
6567
- "error": "NPSazW_error",
6568
- "icon": "NPSazW_icon",
6569
- "imageLink": "NPSazW_imageLink",
6570
- "header": "NPSazW_header",
6571
- "images": "NPSazW_images",
6572
- "status": "NPSazW_status",
6573
- "image": "NPSazW_image",
6574
- "root": "NPSazW_root",
6575
- "message": "NPSazW_message",
6576
- "loading": "NPSazW_loading"
8009
+ "imageLink": "_3eGrYG_imageLink",
8010
+ "error": "_3eGrYG_error",
8011
+ "root": "_3eGrYG_root",
8012
+ "loading": "_3eGrYG_loading",
8013
+ "images": "_3eGrYG_images",
8014
+ "header": "_3eGrYG_header",
8015
+ "image": "_3eGrYG_image",
8016
+ "status": "_3eGrYG_status",
8017
+ "icon": "_3eGrYG_icon",
8018
+ "message": "_3eGrYG_message"
6577
8019
  };
6578
8020
  //#endregion
6579
8021
  //#region src/client/image-toolview.tsx
@@ -6582,8 +8024,7 @@ window.__ModuleLoader__.load({
6582
8024
  }
6583
8025
  function imageRefsOf(block) {
6584
8026
  if (!isSettled(block)) return [];
6585
- const resultContent = block.resultView?.card === "generic" ? block.resultView.content ?? [] : [];
6586
- return [...block.content, ...resultContent].flatMap((content) => content.type === "image" ? [content.attachment] : []);
8027
+ return block.content.flatMap((content) => content.type === "image" ? [content.attachment] : []);
6587
8028
  }
6588
8029
  function textOf(block) {
6589
8030
  if (!isSettled(block)) return "";
@@ -6739,7 +8180,8 @@ window.__ModuleLoader__.load({
6739
8180
  "get_image_generation_task"
6740
8181
  ]) yield ctx.slots.register({
6741
8182
  name: "tool.call.toolview",
6742
- key
8183
+ key,
8184
+ inject: (sessionId) => ({ sessionId })
6743
8185
  }, ImageToolView);
6744
8186
  });
6745
8187
  }