@dickpy/dsh-imagegen 1.4.0 → 1.5.0

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 (53) 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 +1859 -420
  10. package/lib/client.js.map +1 -1
  11. package/lib/index.js +327 -112
  12. package/package.json +69 -68
  13. package/src/agent-image-tools.ts +447 -418
  14. package/src/client/ImageGenPanel.tsx +1242 -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 +18 -18
  25. package/src/client/index.ts +22 -22
  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 +336 -336
  31. package/src/client/settings-scope.ts +298 -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 +964 -916
  47. package/src/task-queue.ts +113 -113
  48. package/src/templates/cases.json +10196 -10196
  49. package/src/templates-store.ts +278 -278
  50. package/src/updater.ts +117 -117
  51. package/docs/images/agent-chat-edit.png +0 -0
  52. package/docs/images/agent-chat-generate.png +0 -0
  53. package/docs/images/agent-chat-poster-workflow.png +0 -0
package/lib/client.js CHANGED
@@ -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
+ "dsh-imagegen-templates-spin": "o0mAxG_dsh-imagegen-templates-spin",
1065
+ "headerActions": "o0mAxG_headerActions",
1066
+ "cardMeta": "o0mAxG_cardMeta",
1067
+ "detailPrompt": "o0mAxG_detailPrompt",
1068
+ "close": "o0mAxG_close",
1069
+ "detailLink": "o0mAxG_detailLink",
1070
+ "overlay": "o0mAxG_overlay",
1071
+ "categoryPill": "o0mAxG_categoryPill",
1072
+ "notice": "o0mAxG_notice",
1073
+ "title": "o0mAxG_title",
1074
+ "grid": "o0mAxG_grid",
1075
+ "cardSource": "o0mAxG_cardSource",
1076
+ "heading": "o0mAxG_heading",
1077
+ "thumbWrap": "o0mAxG_thumbWrap",
1078
+ "detail": "o0mAxG_detail",
1079
+ "thumbPlaceholder": "o0mAxG_thumbPlaceholder",
1080
+ "detailMedia": "o0mAxG_detailMedia",
1081
+ "detailInfo": "o0mAxG_detailInfo",
1082
+ "thumb": "o0mAxG_thumb",
1083
+ "footer": "o0mAxG_footer",
1084
+ "attribution": "o0mAxG_attribution",
1085
+ "cardCategory": "o0mAxG_cardCategory",
1086
+ "sourceLink": "o0mAxG_sourceLink",
1087
+ "meta": "o0mAxG_meta",
1088
+ "toolbar": "o0mAxG_toolbar",
1089
+ "detailActions": "o0mAxG_detailActions",
1090
+ "cardTitle": "o0mAxG_cardTitle",
1091
+ "search": "o0mAxG_search",
1092
+ "spinner": "o0mAxG_spinner",
1093
+ "cardBody": "o0mAxG_cardBody",
1094
+ "featuredBadge": "o0mAxG_featuredBadge",
1095
+ "body": "o0mAxG_body",
1096
+ "detailMeta": "o0mAxG_detailMeta",
1097
+ "header": "o0mAxG_header",
1098
+ "categoryRow": "o0mAxG_categoryRow",
1099
+ "detailImage": "o0mAxG_detailImage",
1100
+ "detailTitle": "o0mAxG_detailTitle",
1101
+ "state": "o0mAxG_state",
1102
+ "card": "o0mAxG_card",
1103
+ "shell": "o0mAxG_shell",
1104
+ "detailOverlay": "o0mAxG_detailOverlay"
963
1105
  };
964
1106
  //#endregion
965
1107
  //#region src/client/TemplateLibrary.tsx
@@ -1797,8 +1939,8 @@ window.__ModuleLoader__.load({
1797
1939
  /** Document event used to bridge chat tool results into the image workspace. */
1798
1940
  const CHAT_IMAGE_EVENT = "dsh-imagegen:chat-images";
1799
1941
  //#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}}";
1942
+ //#region \0dsh-css:E:\dsh-plugin\src\client\panel.module.css.mjs
1943
+ 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
1944
  const tagId$2 = "@dickpy/dsh-imagegen/panel.module.css";
1803
1945
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
1804
1946
  const tag = document.createElement("style");
@@ -1808,176 +1950,226 @@ window.__ModuleLoader__.load({
1808
1950
  document.head.appendChild(tag);
1809
1951
  }
1810
1952
  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"
1953
+ "optionRow": "Yvqh9W_optionRow",
1954
+ "galleryFilterNote": "Yvqh9W_galleryFilterNote",
1955
+ "ecommerceAsset": "Yvqh9W_ecommerceAsset",
1956
+ "ecommerceFooterHint": "Yvqh9W_ecommerceFooterHint",
1957
+ "lightboxClose": "Yvqh9W_lightboxClose",
1958
+ "imageCaption": "Yvqh9W_imageCaption",
1959
+ "taskTrayCount": "Yvqh9W_taskTrayCount",
1960
+ "lightboxActions": "Yvqh9W_lightboxActions",
1961
+ "ecommerceRefRow": "Yvqh9W_ecommerceRefRow",
1962
+ "historyHeader": "Yvqh9W_historyHeader",
1963
+ "paramGroup": "Yvqh9W_paramGroup",
1964
+ "gallerySelectMode": "Yvqh9W_gallerySelectMode",
1965
+ "lightboxCaptionRow": "Yvqh9W_lightboxCaptionRow",
1966
+ "entryLabel": "Yvqh9W_entryLabel",
1967
+ "configToggle": "Yvqh9W_configToggle",
1968
+ "sessionTab": "Yvqh9W_sessionTab",
1969
+ "galleryBadge": "Yvqh9W_galleryBadge",
1970
+ "historyTitle": "Yvqh9W_historyTitle",
1971
+ "topNavDivider": "Yvqh9W_topNavDivider",
1972
+ "configResizer": "Yvqh9W_configResizer",
1973
+ "taskTrayChevron": "Yvqh9W_taskTrayChevron",
1974
+ "generateInner": "Yvqh9W_generateInner",
1975
+ "historyActions": "Yvqh9W_historyActions",
1976
+ "zoomHint": "Yvqh9W_zoomHint",
1977
+ "modelSelect": "Yvqh9W_modelSelect",
1978
+ "enhanceButton": "Yvqh9W_enhanceButton",
1979
+ "sidebarHistoryHost": "Yvqh9W_sidebarHistoryHost",
1980
+ "lightboxImage": "Yvqh9W_lightboxImage",
1981
+ "conversationToast": "Yvqh9W_conversationToast",
1982
+ "lightboxEdit": "Yvqh9W_lightboxEdit",
1983
+ "canvasStateTitle": "Yvqh9W_canvasStateTitle",
1984
+ "galleryHeading": "Yvqh9W_galleryHeading",
1985
+ "ecommerceResults": "Yvqh9W_ecommerceResults",
1986
+ "galleryTags": "Yvqh9W_galleryTags",
1987
+ "spinner": "Yvqh9W_spinner",
1988
+ "taskTray": "Yvqh9W_taskTray",
1989
+ "modeRow": "Yvqh9W_modeRow",
1990
+ "historyThumbPlaceholder": "Yvqh9W_historyThumbPlaceholder",
1991
+ "historyEmpty": "Yvqh9W_historyEmpty",
1992
+ "ecommercePlanBack": "Yvqh9W_ecommercePlanBack",
1993
+ "conversationAdd": "Yvqh9W_conversationAdd",
1994
+ "ecommerceSlotCount": "Yvqh9W_ecommerceSlotCount",
1995
+ "ecommerceGroups": "Yvqh9W_ecommerceGroups",
1996
+ "bigSpinner": "Yvqh9W_bigSpinner",
1997
+ "taskRows": "Yvqh9W_taskRows",
1998
+ "configScroll": "Yvqh9W_configScroll",
1999
+ "galleryToast": "Yvqh9W_galleryToast",
2000
+ "lightboxNav": "Yvqh9W_lightboxNav",
2001
+ "ecommerceAssets": "Yvqh9W_ecommerceAssets",
2002
+ "panelHeading": "Yvqh9W_panelHeading",
2003
+ "galleryTagFilter": "Yvqh9W_galleryTagFilter",
2004
+ "comparisonFullscreen": "Yvqh9W_comparisonFullscreen",
2005
+ "lightboxTools": "Yvqh9W_lightboxTools",
2006
+ "optionGrid": "Yvqh9W_optionGrid",
2007
+ "galleryCount": "Yvqh9W_galleryCount",
2008
+ "modelMenu": "Yvqh9W_modelMenu",
2009
+ "paramHint": "Yvqh9W_paramHint",
2010
+ "ecommerceParamGrid": "Yvqh9W_ecommerceParamGrid",
2011
+ "lightboxCopy": "Yvqh9W_lightboxCopy",
2012
+ "templatesButton": "Yvqh9W_templatesButton",
2013
+ "canvasState": "Yvqh9W_canvasState",
2014
+ "ecommerceWorkspace": "Yvqh9W_ecommerceWorkspace",
2015
+ "promptFooter": "Yvqh9W_promptFooter",
2016
+ "galleryFilterDivider": "Yvqh9W_galleryFilterDivider",
2017
+ "lightboxCaption": "Yvqh9W_lightboxCaption",
2018
+ "entry": "Yvqh9W_entry",
2019
+ "canvas": "Yvqh9W_canvas",
2020
+ "configHeader": "Yvqh9W_configHeader",
2021
+ "chatResizer": "Yvqh9W_chatResizer",
2022
+ "ecommerceResultsHeader": "Yvqh9W_ecommerceResultsHeader",
2023
+ "updateBanner": "Yvqh9W_updateBanner",
2024
+ "topNavItem": "Yvqh9W_topNavItem",
2025
+ "galleryClear": "Yvqh9W_galleryClear",
2026
+ "compareModelChoices": "Yvqh9W_compareModelChoices",
2027
+ "referenceActions": "Yvqh9W_referenceActions",
2028
+ "comparisonBoard": "Yvqh9W_comparisonBoard",
2029
+ "galleryCardInfo": "Yvqh9W_galleryCardInfo",
2030
+ "galleryBulkButton": "Yvqh9W_galleryBulkButton",
2031
+ "ecommercePlanList": "Yvqh9W_ecommercePlanList",
2032
+ "entryIcon": "Yvqh9W_entryIcon",
2033
+ "ecommerceResultBadge": "Yvqh9W_ecommerceResultBadge",
2034
+ "ecommerceAdvancedChevron": "Yvqh9W_ecommerceAdvancedChevron",
2035
+ "historyThumb": "Yvqh9W_historyThumb",
2036
+ "lightboxScaleFrame": "Yvqh9W_lightboxScaleFrame",
2037
+ "ecommerceFieldLabel": "Yvqh9W_ecommerceFieldLabel",
2038
+ "comparisonImageButton": "Yvqh9W_comparisonImageButton",
2039
+ "card": "Yvqh9W_card",
2040
+ "configGuideBody": "Yvqh9W_configGuideBody",
2041
+ "ecommerceField": "Yvqh9W_ecommerceField",
2042
+ "ecommerceTaskState": "Yvqh9W_ecommerceTaskState",
2043
+ "galleryWorkspace": "Yvqh9W_galleryWorkspace",
2044
+ "lightbox": "Yvqh9W_lightbox",
2045
+ "generateButton": "Yvqh9W_generateButton",
2046
+ "galleryRatioList": "Yvqh9W_galleryRatioList",
2047
+ "taskPrompt": "Yvqh9W_taskPrompt",
2048
+ "lightboxZoomLevel": "Yvqh9W_lightboxZoomLevel",
2049
+ "historyPrompt": "Yvqh9W_historyPrompt",
2050
+ "ecommercePlanMini": "Yvqh9W_ecommercePlanMini",
2051
+ "sessionTabLabel": "Yvqh9W_sessionTabLabel",
2052
+ "prompt": "Yvqh9W_prompt",
2053
+ "lightboxMeta": "Yvqh9W_lightboxMeta",
2054
+ "modelLabel": "Yvqh9W_modelLabel",
2055
+ "gallerySelectionBar": "Yvqh9W_gallerySelectionBar",
2056
+ "galleryCardActions": "Yvqh9W_galleryCardActions",
2057
+ "galleryAvatar": "Yvqh9W_galleryAvatar",
2058
+ "githubLink": "Yvqh9W_githubLink",
2059
+ "galleryToolbar": "Yvqh9W_galleryToolbar",
2060
+ "galleryCardFooter": "Yvqh9W_galleryCardFooter",
2061
+ "compareToggle": "Yvqh9W_compareToggle",
2062
+ "historySearch": "Yvqh9W_historySearch",
2063
+ "lightboxFigure": "Yvqh9W_lightboxFigure",
2064
+ "uploadBox": "Yvqh9W_uploadBox",
2065
+ "galleryFilter": "Yvqh9W_galleryFilter",
2066
+ "galleryTagEditor": "Yvqh9W_galleryTagEditor",
2067
+ "download": "Yvqh9W_download",
2068
+ "galleryToolbarActions": "Yvqh9W_galleryToolbarActions",
2069
+ "imageCard": "Yvqh9W_imageCard",
2070
+ "comparisonFullscreenGrid": "Yvqh9W_comparisonFullscreenGrid",
2071
+ "gallerySelect": "Yvqh9W_gallerySelect",
2072
+ "taskTrayHeader": "Yvqh9W_taskTrayHeader",
2073
+ "ecommerceResultsActions": "Yvqh9W_ecommerceResultsActions",
2074
+ "topNav": "Yvqh9W_topNav",
2075
+ "connectionStatus": "Yvqh9W_connectionStatus",
2076
+ "ecommercePlanWarn": "Yvqh9W_ecommercePlanWarn",
2077
+ "paramLabel": "Yvqh9W_paramLabel",
2078
+ "ecommerceGroup": "Yvqh9W_ecommerceGroup",
2079
+ "canvasEmptyIcon": "Yvqh9W_canvasEmptyIcon",
2080
+ "sessionTabIcon": "Yvqh9W_sessionTabIcon",
2081
+ "historyAction": "Yvqh9W_historyAction",
2082
+ "ecommerceSlotCard": "Yvqh9W_ecommerceSlotCard",
2083
+ "panelHeaderActions": "Yvqh9W_panelHeaderActions",
2084
+ "modelMenuList": "Yvqh9W_modelMenuList",
2085
+ "taskTrayToggle": "Yvqh9W_taskTrayToggle",
2086
+ "updateActions": "Yvqh9W_updateActions",
2087
+ "uploadIcon": "Yvqh9W_uploadIcon",
2088
+ "canvasMeta": "Yvqh9W_canvasMeta",
2089
+ "canvasHistoryTag": "Yvqh9W_canvasHistoryTag",
2090
+ "dshImageGenSpin": "Yvqh9W_dshImageGenSpin",
2091
+ "galleryImageButton": "Yvqh9W_galleryImageButton",
2092
+ "gallerySearch": "Yvqh9W_gallerySearch",
2093
+ "historyItem": "Yvqh9W_historyItem",
2094
+ "promptCount": "Yvqh9W_promptCount",
2095
+ "grid": "Yvqh9W_grid",
2096
+ "historyHeaderActions": "Yvqh9W_historyHeaderActions",
2097
+ "view": "Yvqh9W_view",
2098
+ "taskStatus": "Yvqh9W_taskStatus",
2099
+ "taskRow": "Yvqh9W_taskRow",
2100
+ "galleryCard": "Yvqh9W_galleryCard",
2101
+ "footer": "Yvqh9W_footer",
2102
+ "galleryImage": "Yvqh9W_galleryImage",
2103
+ "ecommerceGroupGrid": "Yvqh9W_ecommerceGroupGrid",
2104
+ "panelHeader": "Yvqh9W_panelHeader",
2105
+ "lightboxDownload": "Yvqh9W_lightboxDownload",
2106
+ "ecommerceSection": "Yvqh9W_ecommerceSection",
2107
+ "hiddenFile": "Yvqh9W_hiddenFile",
2108
+ "galleryRatio": "Yvqh9W_galleryRatio",
2109
+ "ecommerceResultsEmpty": "Yvqh9W_ecommerceResultsEmpty",
2110
+ "historyMain": "Yvqh9W_historyMain",
2111
+ "configGuide": "Yvqh9W_configGuide",
2112
+ "connectionDot": "Yvqh9W_connectionDot",
2113
+ "historyFilters": "Yvqh9W_historyFilters",
2114
+ "config": "Yvqh9W_config",
2115
+ "ecommerceFooterBody": "Yvqh9W_ecommerceFooterBody",
2116
+ "modePill": "Yvqh9W_modePill",
2117
+ "ecommerceTaskActions": "Yvqh9W_ecommerceTaskActions",
2118
+ "reference": "Yvqh9W_reference",
2119
+ "galleryAdd": "Yvqh9W_galleryAdd",
2120
+ "gallerySort": "Yvqh9W_gallerySort",
2121
+ "galleryViewToggle": "Yvqh9W_galleryViewToggle",
2122
+ "galleryMasonry": "Yvqh9W_galleryMasonry",
2123
+ "galleryRemove": "Yvqh9W_galleryRemove",
2124
+ "galleryTagInput": "Yvqh9W_galleryTagInput",
2125
+ "updateText": "Yvqh9W_updateText",
2126
+ "generation": "Yvqh9W_generation",
2127
+ "ecommerceAdvancedToggle": "Yvqh9W_ecommerceAdvancedToggle",
2128
+ "image": "Yvqh9W_image",
2129
+ "historyMeta": "Yvqh9W_historyMeta",
2130
+ "modelWrap": "Yvqh9W_modelWrap",
2131
+ "lightboxStage": "Yvqh9W_lightboxStage",
2132
+ "lightboxIndex": "Yvqh9W_lightboxIndex",
2133
+ "galleryFilterCount": "Yvqh9W_galleryFilterCount",
2134
+ "galleryTagFilterList": "Yvqh9W_galleryTagFilterList",
2135
+ "comparisonGrid": "Yvqh9W_comparisonGrid",
2136
+ "historyClear": "Yvqh9W_historyClear",
2137
+ "studio": "Yvqh9W_studio",
2138
+ "ecommercePrimaryAction": "Yvqh9W_ecommercePrimaryAction",
2139
+ "previewBadge": "Yvqh9W_previewBadge",
2140
+ "chatToggle": "Yvqh9W_chatToggle",
2141
+ "lightboxTool": "Yvqh9W_lightboxTool",
2142
+ "historyList": "Yvqh9W_historyList",
2143
+ "ecommerceAdvancedBody": "Yvqh9W_ecommerceAdvancedBody",
2144
+ "dshImageGenToastIn": "Yvqh9W_dshImageGenToastIn",
2145
+ "history": "Yvqh9W_history",
2146
+ "modelMenuItem": "Yvqh9W_modelMenuItem",
2147
+ "sessionTabs": "Yvqh9W_sessionTabs",
2148
+ "ecommerceStructureGrid": "Yvqh9W_ecommerceStructureGrid",
2149
+ "canvasStateHint": "Yvqh9W_canvasStateHint",
2150
+ "ecommerceSectionHint": "Yvqh9W_ecommerceSectionHint",
2151
+ "ecommerceUploadHero": "Yvqh9W_ecommerceUploadHero",
2152
+ "referenceImage": "Yvqh9W_referenceImage",
2153
+ "galleryTagEdit": "Yvqh9W_galleryTagEdit",
2154
+ "ecommerceTaskCard": "Yvqh9W_ecommerceTaskCard",
2155
+ "ecommercePlanNote": "Yvqh9W_ecommercePlanNote",
2156
+ "ecommerceActionChip": "Yvqh9W_ecommerceActionChip",
2157
+ "canvasError": "Yvqh9W_canvasError",
2158
+ "galleryFilterHeading": "Yvqh9W_galleryFilterHeading",
2159
+ "taskTrayClose": "Yvqh9W_taskTrayClose",
2160
+ "uploadHint": "Yvqh9W_uploadHint",
2161
+ "optionPill": "Yvqh9W_optionPill",
2162
+ "gallerySelectionClear": "Yvqh9W_gallerySelectionClear",
2163
+ "updateRelease": "Yvqh9W_updateRelease",
2164
+ "historyNew": "Yvqh9W_historyNew",
2165
+ "canvasBody": "Yvqh9W_canvasBody",
2166
+ "panel": "Yvqh9W_panel",
2167
+ "historyInfo": "Yvqh9W_historyInfo",
2168
+ "ecommerceAssetAdd": "Yvqh9W_ecommerceAssetAdd",
2169
+ "panelTitle": "Yvqh9W_panelTitle",
2170
+ "galleryFilters": "Yvqh9W_galleryFilters",
2171
+ "compareControl": "Yvqh9W_compareControl",
2172
+ "galleryCardAction": "Yvqh9W_galleryCardAction"
1981
2173
  };
1982
2174
  //#endregion
1983
2175
  //#region src/client/ImageGenPanel.tsx
@@ -2032,9 +2224,78 @@ window.__ModuleLoader__.load({
2032
2224
  "high"
2033
2225
  ];
2034
2226
  const REF_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
2227
+ const CONVERSATION_IMAGE_MAX_DIMENSION = 2e3;
2228
+ const CONVERSATION_IMAGE_JPEG_QUALITY = .9;
2035
2229
  const PREVIEW_SCALE_MIN = .5;
2036
2230
  const PREVIEW_SCALE_MAX = 3;
2037
2231
  const PREVIEW_SCALE_STEP = .25;
2232
+ const CONFIG_COLLAPSED_STORAGE_KEY = "dsh-imagegen-config-collapsed";
2233
+ const ECOMMERCE_DRAFT_STORAGE_KEY = "dsh-imagegen-ecommerce-draft";
2234
+ /** Reference roles an uploaded product asset can play (slot selections can
2235
+ * also pick 'none'). */
2236
+ const ECOMMERCE_ASSET_ROLES = [
2237
+ "product",
2238
+ "packaging",
2239
+ "detail",
2240
+ "style"
2241
+ ];
2242
+ const MAX_ECOMMERCE_ASSETS = 4;
2243
+ const ECOMMERCE_ROLE_PROMPT_LABELS = {
2244
+ product: "商品主体",
2245
+ packaging: "包装",
2246
+ detail: "细节/角度",
2247
+ style: "风格参考"
2248
+ };
2249
+ const PRODUCT_SET_SLOTS = [
2250
+ {
2251
+ key: "main",
2252
+ label: "主图",
2253
+ description: "干净背景,突出商品主体",
2254
+ count: 1,
2255
+ enabled: true,
2256
+ refRole: "product"
2257
+ },
2258
+ {
2259
+ key: "selling-point",
2260
+ label: "卖点图",
2261
+ description: "用画面展示商品核心卖点",
2262
+ count: 2,
2263
+ enabled: true,
2264
+ refRole: "product"
2265
+ },
2266
+ {
2267
+ key: "scene",
2268
+ label: "场景图",
2269
+ description: "真实生活或使用场景",
2270
+ count: 2,
2271
+ enabled: true,
2272
+ refRole: "product"
2273
+ },
2274
+ {
2275
+ key: "detail",
2276
+ label: "细节图",
2277
+ description: "材质、结构或工艺特写",
2278
+ count: 1,
2279
+ enabled: true,
2280
+ refRole: "detail"
2281
+ },
2282
+ {
2283
+ key: "spec",
2284
+ label: "规格图",
2285
+ description: "尺寸、容量或参数展示",
2286
+ count: 1,
2287
+ enabled: false,
2288
+ refRole: "product"
2289
+ },
2290
+ {
2291
+ key: "model",
2292
+ label: "使用图",
2293
+ description: "人物上手或穿戴效果",
2294
+ count: 1,
2295
+ enabled: false,
2296
+ refRole: "product"
2297
+ }
2298
+ ];
2038
2299
  /** Legacy pixel sizes saved by older versions, mapped onto the current
2039
2300
  * aspect-ratio vocabulary so restoring old history entries still works. */
2040
2301
  const LEGACY_SIZE_TO_RATIO = {
@@ -2064,6 +2325,37 @@ window.__ModuleLoader__.load({
2064
2325
  function clampPreviewScale(scale) {
2065
2326
  return Math.min(PREVIEW_SCALE_MAX, Math.max(PREVIEW_SCALE_MIN, scale));
2066
2327
  }
2328
+ /** Keep the image canvas preference across panel remounts without making it
2329
+ * part of the host settings document. */
2330
+ function readConfigCollapsed() {
2331
+ try {
2332
+ return window.localStorage.getItem(CONFIG_COLLAPSED_STORAGE_KEY) === "true";
2333
+ } catch {
2334
+ return false;
2335
+ }
2336
+ }
2337
+ const CHAT_COLLAPSED_STORAGE_KEY = "dsh-imagegen:chat-collapsed";
2338
+ const CONFIG_WIDTH_STORAGE_KEY = "dsh-imagegen:config-width";
2339
+ const CONFIG_WIDTH_MIN = 260;
2340
+ const CONFIG_WIDTH_MAX = 480;
2341
+ const CONFIG_WIDTH_DEFAULT = 300;
2342
+ /** The chat pane starts collapsed unless the user explicitly opened it. */
2343
+ function readChatOpen() {
2344
+ try {
2345
+ return window.localStorage.getItem(CHAT_COLLAPSED_STORAGE_KEY) === "open";
2346
+ } catch {
2347
+ return false;
2348
+ }
2349
+ }
2350
+ function readConfigWidth() {
2351
+ try {
2352
+ const raw = window.localStorage.getItem(CONFIG_WIDTH_STORAGE_KEY);
2353
+ if (raw === null) return CONFIG_WIDTH_DEFAULT;
2354
+ const value = Number(raw);
2355
+ if (Number.isFinite(value) && value > 0) return Math.min(CONFIG_WIDTH_MAX, Math.max(CONFIG_WIDTH_MIN, Math.round(value)));
2356
+ } catch {}
2357
+ return CONFIG_WIDTH_DEFAULT;
2358
+ }
2067
2359
  /** Read the current config from the settings scope snapshot. */
2068
2360
  function useConfig(scope) {
2069
2361
  const [value, setValue] = (0, react.useState)(scope.getSnapshot().value);
@@ -2133,6 +2425,62 @@ window.__ModuleLoader__.load({
2133
2425
  for (let offset = 0; offset < binary.length; offset += 1) bytes[offset] = binary.charCodeAt(offset);
2134
2426
  return new File([bytes], `dsh-image-${index + 1}.${extensionOf(image.mime)}`, { type: image.mime });
2135
2427
  }
2428
+ /** Decode a data URL into a browser File for the native composer. */
2429
+ function dataUrlToFile(dataUrl, name) {
2430
+ const match = /^data:(image\/(?:png|jpeg|webp|gif));base64,(.*)$/su.exec(dataUrl);
2431
+ if (match === null || match[1] === void 0 || match[2] === void 0) throw new Error("image processing returned an invalid data URL");
2432
+ const binary = atob(match[2]);
2433
+ const bytes = new Uint8Array(binary.length);
2434
+ for (let offset = 0; offset < binary.length; offset += 1) bytes[offset] = binary.charCodeAt(offset);
2435
+ return new File([bytes], name, { type: match[1] });
2436
+ }
2437
+ /** Read intrinsic dimensions without changing the original preview. */
2438
+ function imageDimensions(dataUrl) {
2439
+ return new Promise((resolve, reject) => {
2440
+ const image = new Image();
2441
+ image.onload = () => {
2442
+ const width = image.naturalWidth || image.width;
2443
+ const height = image.naturalHeight || image.height;
2444
+ if (width < 1 || height < 1) reject(/* @__PURE__ */ new Error("image dimensions are unavailable"));
2445
+ else resolve({
2446
+ width,
2447
+ height
2448
+ });
2449
+ };
2450
+ image.onerror = () => reject(/* @__PURE__ */ new Error("image decode failed"));
2451
+ image.src = dataUrl;
2452
+ });
2453
+ }
2454
+ /** Prepare the smaller conversation copy required by the host attachment policy. */
2455
+ async function prepareConversationImage(image, index) {
2456
+ const dataUrl = srcOf(image);
2457
+ const { width, height } = await imageDimensions(dataUrl);
2458
+ const longestSide = Math.max(width, height);
2459
+ if (longestSide <= CONVERSATION_IMAGE_MAX_DIMENSION) return {
2460
+ file: generatedImageToFile(image, index),
2461
+ dataUrl
2462
+ };
2463
+ const scale = CONVERSATION_IMAGE_MAX_DIMENSION / longestSide;
2464
+ const targetWidth = Math.max(1, Math.round(width * scale));
2465
+ const targetHeight = Math.max(1, Math.round(height * scale));
2466
+ const canvas = document.createElement("canvas");
2467
+ canvas.width = targetWidth;
2468
+ canvas.height = targetHeight;
2469
+ const context = canvas.getContext("2d");
2470
+ if (context === null) throw new Error("image resize is unavailable in this browser");
2471
+ const source = await new Promise((resolve, reject) => {
2472
+ const sourceImage = new Image();
2473
+ sourceImage.onload = () => resolve(sourceImage);
2474
+ sourceImage.onerror = () => reject(/* @__PURE__ */ new Error("image decode failed"));
2475
+ sourceImage.src = dataUrl;
2476
+ });
2477
+ context.drawImage(source, 0, 0, targetWidth, targetHeight);
2478
+ const resizedDataUrl = canvas.toDataURL("image/jpeg", CONVERSATION_IMAGE_JPEG_QUALITY);
2479
+ return {
2480
+ dataUrl: resizedDataUrl,
2481
+ file: dataUrlToFile(resizedDataUrl, `dsh-image-${index + 1}.jpg`)
2482
+ };
2483
+ }
2136
2484
  /** Follow the native session selection while the image panel stays mounted. */
2137
2485
  function useCurrentSessionId(sessions) {
2138
2486
  const [sessionId, setSessionId] = (0, react.useState)(() => sessions?.list.getSnapshot().current);
@@ -2194,14 +2542,45 @@ window.__ModuleLoader__.load({
2194
2542
  const pad = (n) => String(n).padStart(2, "0");
2195
2543
  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
2196
2544
  }
2545
+ function defaultEcommerceDraft() {
2546
+ return {
2547
+ projectId: "",
2548
+ projectName: "",
2549
+ category: "通用商品",
2550
+ platform: "通用",
2551
+ language: "中文",
2552
+ size: "1:1",
2553
+ productName: "",
2554
+ sellingPoints: "",
2555
+ protectedFeatures: "",
2556
+ styleHint: "",
2557
+ slots: PRODUCT_SET_SLOTS.map((slot) => ({ ...slot }))
2558
+ };
2559
+ }
2560
+ function ecommercePrompt(draft, slot) {
2561
+ const points = draft.sellingPoints.trim() || "突出商品真实材质、结构和核心价值";
2562
+ const protectedFeatures = draft.protectedFeatures.trim() || "保持商品颜色、形状、Logo、包装文字和结构真实,不添加不存在的配件";
2563
+ const refClause = slot.refRole !== void 0 && slot.refRole !== "none" ? `本图以上传的${ECOMMERCE_ROLE_PROMPT_LABELS[slot.refRole]}图片为参考,商品与风格必须与参考图保持一致;` : "";
2564
+ return `电商${slot.label}:为${draft.productName.trim() || "该商品"}制作${slot.description}。商品品类:${draft.category};平台:${draft.platform};语言:${draft.language}。商品卖点:${points}。必须遵守:${protectedFeatures}。${refClause}整体要求:商品主体清晰、比例真实、光线自然、画面干净、适合电商发布;${draft.styleHint.trim()}`;
2565
+ }
2566
+ /** Consistency prefix for slots generated after the main image exists. */
2567
+ function withAnchorNote(prompt) {
2568
+ return "商品套图一致性约束:附件是本套商品的主图,图中商品(外形、颜色、材质、Logo、包装文字)必须与附件完全一致,不得重新发明商品。" + prompt;
2569
+ }
2197
2570
  function modelsOfHistoryEntry(entry) {
2198
2571
  return entry.comparisonModels?.length !== void 0 && entry.comparisonModels.length > 1 ? entry.comparisonModels : [entry.model];
2199
2572
  }
2573
+ /** Comparison runs collapse by comparisonId, product sets by projectId. */
2574
+ function historyGroupKey(entry) {
2575
+ if (entry.comparisonId !== void 0) return entry.comparisonId;
2576
+ if (entry.workflow === "ecommerce" && entry.projectId !== void 0) return `project:${entry.projectId}`;
2577
+ return entry.id;
2578
+ }
2200
2579
  /** Collapse the per-model history rows that belong to one comparison run. */
2201
2580
  function groupHistoryEntries(entries) {
2202
2581
  const groups = /* @__PURE__ */ new Map();
2203
2582
  for (const entry of entries) {
2204
- const key = entry.comparisonId ?? entry.id;
2583
+ const key = historyGroupKey(entry);
2205
2584
  const existing = groups.get(key);
2206
2585
  if (existing === void 0) groups.set(key, {
2207
2586
  key,
@@ -2235,6 +2614,12 @@ window.__ModuleLoader__.load({
2235
2614
  const apiKeySet = (config?.channels ?? []).length > 0 ? channelKeySet : legacyKeySet;
2236
2615
  const connected = enabled && configured && apiKeySet;
2237
2616
  const [tab, setTab] = (0, react.useState)("text");
2617
+ const [workspace, setWorkspace] = (0, react.useState)("normal");
2618
+ /** Switch to a normal-generation tab, leaving any task workspace. */
2619
+ const openTab = (next) => {
2620
+ setWorkspace("normal");
2621
+ setTab(next);
2622
+ };
2238
2623
  const [prompt, setPrompt] = (0, react.useState)("");
2239
2624
  const [size, setSize] = (0, react.useState)("auto");
2240
2625
  const [quality, setQuality] = (0, react.useState)("auto");
@@ -2247,6 +2632,7 @@ window.__ModuleLoader__.load({
2247
2632
  const [refImage, setRefImage] = (0, react.useState)(null);
2248
2633
  const [images, setImages] = (0, react.useState)([]);
2249
2634
  const [addingToConversation, setAddingToConversation] = (0, react.useState)(null);
2635
+ const [galleryConversationAddingId, setGalleryConversationAddingId] = (0, react.useState)(null);
2250
2636
  const [conversationMessage, setConversationMessage] = (0, react.useState)(null);
2251
2637
  const [error, setError] = (0, react.useState)(null);
2252
2638
  const [submitting, setSubmitting] = (0, react.useState)(false);
@@ -2285,6 +2671,38 @@ window.__ModuleLoader__.load({
2285
2671
  const [taskTrayOpen, setTaskTrayOpen] = (0, react.useState)(false);
2286
2672
  const [comparison, setComparison] = (0, react.useState)(null);
2287
2673
  const [comparisonFullscreen, setComparisonFullscreen] = (0, react.useState)(false);
2674
+ const [ecommerce, setEcommerce] = (0, react.useState)(() => {
2675
+ try {
2676
+ const saved = window.localStorage.getItem(ECOMMERCE_DRAFT_STORAGE_KEY);
2677
+ if (saved !== null) {
2678
+ const merged = {
2679
+ ...defaultEcommerceDraft(),
2680
+ ...JSON.parse(saved)
2681
+ };
2682
+ if (Array.isArray(merged.slots)) merged.slots = merged.slots.map((slot) => ({
2683
+ ...slot,
2684
+ refRole: slot.refRole ?? "product"
2685
+ }));
2686
+ return merged;
2687
+ }
2688
+ } catch {}
2689
+ return defaultEcommerceDraft();
2690
+ });
2691
+ const [ecommercePreview, setEcommercePreview] = (0, react.useState)(false);
2692
+ const [ecommerceGenerating, setEcommerceGenerating] = (0, react.useState)(false);
2693
+ const [ecommerceProjectId, setEcommerceProjectId] = (0, react.useState)(null);
2694
+ const [ecommerceAssets, setEcommerceAssets] = (0, react.useState)([]);
2695
+ /** History-restored product set currently shown in the results canvas. */
2696
+ const [ecommerceRestored, setEcommerceRestored] = (0, react.useState)(null);
2697
+ /** Pending main-image anchor: the main image task is in flight; once it
2698
+ * completes, the remaining slots are resubmitted with it as their shared
2699
+ * reference so every image in the set shows the same product. */
2700
+ const [ecommerceAnchor, setEcommerceAnchor] = (0, react.useState)(null);
2701
+ const [ecommerceRefOpen, setEcommerceRefOpen] = (0, react.useState)(false);
2702
+ const [configCollapsed, setConfigCollapsed] = (0, react.useState)(readConfigCollapsed);
2703
+ const [chatOpen, setChatOpen] = (0, react.useState)(readChatOpen);
2704
+ const [configWidth, setConfigWidth] = (0, react.useState)(readConfigWidth);
2705
+ const configAsideRef = (0, react.useRef)(null);
2288
2706
  const currentSessionId = useCurrentSessionId(sessions);
2289
2707
  const sidebarHistoryHost = useSidebarHistoryHost();
2290
2708
  const modeModels = tab === "edit" ? imageModels.filter((candidate) => describeModel(candidate).supportsEdit) : imageModels;
@@ -2294,6 +2712,57 @@ window.__ModuleLoader__.load({
2294
2712
  const activeTask = activeTasks.find((task) => task.status === "running") ?? activeTasks[0];
2295
2713
  const generating = submitting || activeTasks.length > 0;
2296
2714
  const elapsed = useElapsed(generating, activeTask?.startedAt ?? activeTask?.createdAt ?? null);
2715
+ (0, react.useEffect)(() => {
2716
+ try {
2717
+ window.localStorage.setItem(ECOMMERCE_DRAFT_STORAGE_KEY, JSON.stringify(ecommerce));
2718
+ } catch {}
2719
+ }, [ecommerce]);
2720
+ (0, react.useEffect)(() => {
2721
+ try {
2722
+ window.localStorage.setItem(CONFIG_COLLAPSED_STORAGE_KEY, String(configCollapsed));
2723
+ } catch {}
2724
+ }, [configCollapsed]);
2725
+ (0, react.useEffect)(() => {
2726
+ if (chatOpen) delete document.documentElement.dataset.dshImagegenChatCollapsed;
2727
+ else document.documentElement.dataset.dshImagegenChatCollapsed = "1";
2728
+ try {
2729
+ window.localStorage.setItem(CHAT_COLLAPSED_STORAGE_KEY, chatOpen ? "open" : "collapsed");
2730
+ } catch {}
2731
+ }, [chatOpen]);
2732
+ (0, react.useEffect)(() => () => {
2733
+ delete document.documentElement.dataset.dshImagegenChatCollapsed;
2734
+ }, []);
2735
+ (0, react.useEffect)(() => {
2736
+ if (ecommerceAnchor === null) return;
2737
+ const anchor = ecommerceAnchor;
2738
+ const mains = tasks.filter((task) => anchor.mainTaskIds.includes(task.id));
2739
+ if (mains.length === 0) return;
2740
+ if (mains.every((task) => task.status === "failed" || task.status === "cancelled")) {
2741
+ setEcommerceAnchor(null);
2742
+ setError(tt("ecommerce.anchorFailed"));
2743
+ return;
2744
+ }
2745
+ const done = mains.find((task) => task.status === "completed" && task.result !== void 0 && task.result.images.length > 0);
2746
+ if (done === void 0) return;
2747
+ setEcommerceAnchor(null);
2748
+ const dataUrl = srcOf(done.result.images[0]);
2749
+ const requests = anchor.remaining.map((request) => ({
2750
+ ...request,
2751
+ mode: "edit",
2752
+ image: dataUrl,
2753
+ refName: "set-main-anchor",
2754
+ prompt: withAnchorNote(request.prompt)
2755
+ }));
2756
+ Promise.all(requests.map((request) => api.taskSubmit(request))).then((submitted) => {
2757
+ setTasks((previous) => [...submitted, ...previous]);
2758
+ }).catch((caught) => {
2759
+ setError(errorMessage(caught));
2760
+ });
2761
+ }, [
2762
+ api,
2763
+ tasks,
2764
+ ecommerceAnchor
2765
+ ]);
2297
2766
  (0, react.useEffect)(() => {
2298
2767
  setModel((previous) => modeModels.includes(previous) ? previous : modeModels[0] ?? "");
2299
2768
  setCompareModels((previous) => {
@@ -2330,7 +2799,7 @@ window.__ModuleLoader__.load({
2330
2799
  const detail = event.detail;
2331
2800
  if (detail === void 0 || currentSessionId === void 0 || detail.sessionId !== currentSessionId) return;
2332
2801
  Promise.all(detail.refs.map(attachmentToGenerated)).then((next) => {
2333
- setTab("text");
2802
+ openTab("text");
2334
2803
  setImages(next);
2335
2804
  setComparison(null);
2336
2805
  setViewingHistoryId(null);
@@ -2464,6 +2933,39 @@ window.__ModuleLoader__.load({
2464
2933
  };
2465
2934
  reader.readAsDataURL(file);
2466
2935
  };
2936
+ /** Read uploaded product assets into session-only data-URL chips, capped at
2937
+ * MAX_ECOMMERCE_ASSETS. Each starts as the product-role reference. */
2938
+ const acceptEcommerceFiles = (files) => {
2939
+ if (files === void 0) return;
2940
+ const incoming = Array.from(files).filter((file) => file.type.startsWith("image/") && file.size <= REF_IMAGE_MAX_BYTES);
2941
+ if (incoming.length === 0) {
2942
+ setError(tt("edit.uploadHint"));
2943
+ return;
2944
+ }
2945
+ for (const file of incoming) {
2946
+ const reader = new FileReader();
2947
+ reader.onload = () => {
2948
+ if (typeof reader.result !== "string") return;
2949
+ const dataUrl = reader.result;
2950
+ setEcommerceAssets((previous) => {
2951
+ if (previous.length >= MAX_ECOMMERCE_ASSETS) {
2952
+ setError(tt("ecommerce.assetsFull"));
2953
+ return previous;
2954
+ }
2955
+ return [...previous, {
2956
+ id: newComparisonId(),
2957
+ dataUrl,
2958
+ name: file.name,
2959
+ role: "product"
2960
+ }];
2961
+ });
2962
+ };
2963
+ reader.onerror = () => {
2964
+ setError(tt("edit.uploadHint"));
2965
+ };
2966
+ reader.readAsDataURL(file);
2967
+ }
2968
+ };
2467
2969
  /** Run one generation. */
2468
2970
  const handleGenerate = async () => {
2469
2971
  if (submitting) return;
@@ -2485,7 +2987,7 @@ window.__ModuleLoader__.load({
2485
2987
  return;
2486
2988
  }
2487
2989
  const request = {
2488
- mode: tab === "gallery" ? "text" : tab,
2990
+ mode: tab === "edit" ? "edit" : "text",
2489
2991
  model: modeModels.includes(model) ? model : modeModels[0] ?? "",
2490
2992
  prompt: promptText,
2491
2993
  size,
@@ -2526,7 +3028,173 @@ window.__ModuleLoader__.load({
2526
3028
  setSubmitting(false);
2527
3029
  }
2528
3030
  };
2529
- /** Open the full-screen image preview at a given index. */
3031
+ const handleEcommerceGenerate = async () => {
3032
+ if (ecommerceGenerateDisabled) return;
3033
+ if (!enabled || !configured || !apiKeySet) {
3034
+ openSettingsGuide("generation");
3035
+ return;
3036
+ }
3037
+ const projectId = ecommerce.projectId || newComparisonId();
3038
+ const buildRequest = (slot, index) => {
3039
+ const refRole = slot.refRole ?? "product";
3040
+ const asset = refRole === "none" ? void 0 : ecommerceAssets.find((item) => item.role === refRole);
3041
+ return {
3042
+ mode: asset !== void 0 ? "edit" : "text",
3043
+ model: modeModels.includes(model) ? model : modeModels[0] ?? "",
3044
+ prompt: ecommercePrompt(ecommerce, slot),
3045
+ size: ecommerce.size,
3046
+ quality,
3047
+ n: 1,
3048
+ detail,
3049
+ ...defaultChannelId !== void 0 ? { channelId: defaultChannelId } : {},
3050
+ ...asset !== void 0 ? {
3051
+ image: asset.dataUrl,
3052
+ refName: asset.name
3053
+ } : {},
3054
+ workflow: "ecommerce",
3055
+ projectId,
3056
+ projectName: ecommerce.projectName.trim() || ecommerce.productName.trim(),
3057
+ slotKey: `${slot.key}-${index + 1}`,
3058
+ slotLabel: slot.label
3059
+ };
3060
+ };
3061
+ const mainSlots = ecommerceSlots.filter((slot) => slot.key === "main");
3062
+ const otherSlots = ecommerceSlots.filter((slot) => slot.key !== "main");
3063
+ const anchorChain = mainSlots.length > 0 && otherSlots.length > 0;
3064
+ const requests = (anchorChain ? mainSlots : ecommerceSlots).flatMap((slot) => Array.from({ length: slot.count }, (_, index) => buildRequest(slot, index)));
3065
+ const remaining = anchorChain ? otherSlots.flatMap((slot) => Array.from({ length: slot.count }, (_, index) => {
3066
+ const { image: _image, refName: _refName, ...rest } = buildRequest(slot, index);
3067
+ return rest;
3068
+ })) : [];
3069
+ setEcommerceGenerating(true);
3070
+ setSubmitting(true);
3071
+ setError(null);
3072
+ setEcommerceProjectId(projectId);
3073
+ setEcommerceRestored(null);
3074
+ setEcommerceAnchor(null);
3075
+ try {
3076
+ const submitted = await Promise.all(requests.map((request) => api.taskSubmit(request)));
3077
+ setTasks((previous) => [...submitted, ...previous]);
3078
+ setEcommercePreview(false);
3079
+ if (anchorChain) setEcommerceAnchor({
3080
+ projectId,
3081
+ mainTaskIds: submitted.map((task) => task.id),
3082
+ remaining
3083
+ });
3084
+ } catch (caught) {
3085
+ setError(errorMessage(caught));
3086
+ } finally {
3087
+ setSubmitting(false);
3088
+ setEcommerceGenerating(false);
3089
+ }
3090
+ };
3091
+ /** Start over with a fresh product draft (the old results stay in history). */
3092
+ const newEcommerceProduct = () => {
3093
+ setEcommerce(defaultEcommerceDraft());
3094
+ setEcommercePreview(false);
3095
+ setEcommerceProjectId(null);
3096
+ setEcommerceRestored(null);
3097
+ setEcommerceAnchor(null);
3098
+ setEcommerceAssets([]);
3099
+ setRefImage(null);
3100
+ setError(null);
3101
+ };
3102
+ /** Re-run every image of one slot with its original request. */
3103
+ const regenerateEcommerceSlot = async (label) => {
3104
+ if (ecommerceGenerating) return;
3105
+ const group = ecommerceMergedItems.filter((item) => item.label === label);
3106
+ if (group.length === 0) return;
3107
+ setEcommerceGenerating(true);
3108
+ setError(null);
3109
+ try {
3110
+ const submitted = await Promise.all(group.map((item) => api.taskSubmit({ ...item.source })));
3111
+ setTasks((previous) => [...submitted, ...previous]);
3112
+ } catch (caught) {
3113
+ setError(errorMessage(caught));
3114
+ } finally {
3115
+ setEcommerceGenerating(false);
3116
+ }
3117
+ };
3118
+ /** Open one persisted product set from history: rebuild the grouped results
3119
+ * canvas from its entries. Reference images are not persisted, so restored
3120
+ * edit-mode slots regenerate as text-to-image. */
3121
+ const viewEcommerceProject = async (group) => {
3122
+ const entry = group.entries[0];
3123
+ if (entry === void 0 || entry.projectId === void 0) return;
3124
+ try {
3125
+ const items = await Promise.all(group.entries.map(async (item) => ({
3126
+ id: item.id,
3127
+ label: item.slotLabel ?? "",
3128
+ slotKey: item.slotKey ?? "",
3129
+ status: "completed",
3130
+ model: item.model,
3131
+ prompt: item.prompt,
3132
+ images: await historyImagesToGenerated(item.images),
3133
+ source: {
3134
+ mode: item.mode === "edit" ? "text" : item.mode,
3135
+ model: item.model,
3136
+ prompt: item.prompt,
3137
+ size: item.size,
3138
+ quality: item.quality,
3139
+ detail: item.detail,
3140
+ n: 1,
3141
+ ...item.channelId !== void 0 ? { channelId: item.channelId } : {},
3142
+ workflow: "ecommerce",
3143
+ projectId: entry.projectId,
3144
+ projectName: entry.projectName ?? "",
3145
+ slotKey: item.slotKey ?? "",
3146
+ slotLabel: item.slotLabel ?? ""
3147
+ }
3148
+ })));
3149
+ setWorkspace("ecommerce");
3150
+ setEcommerceRestored({
3151
+ projectId: entry.projectId,
3152
+ projectName: entry.projectName ?? "",
3153
+ items
3154
+ });
3155
+ setEcommerceProjectId(entry.projectId);
3156
+ setEcommercePreview(false);
3157
+ setError(null);
3158
+ setViewingHistoryId(entry.id);
3159
+ setGalleryViewingId(null);
3160
+ } catch (caught) {
3161
+ setError(errorMessage(caught));
3162
+ }
3163
+ };
3164
+ /** Download a JSON manifest describing the whole product set (prompts,
3165
+ * slots and task outcomes) so results stay reproducible outside the panel. */
3166
+ const exportEcommerceManifest = () => {
3167
+ const manifest = {
3168
+ project: {
3169
+ id: ecommerceProjectId,
3170
+ name: ecommerce.projectName || ecommerce.productName,
3171
+ productName: ecommerce.productName,
3172
+ category: ecommerce.category,
3173
+ platform: ecommerce.platform,
3174
+ language: ecommerce.language,
3175
+ size: ecommerce.size,
3176
+ sellingPoints: ecommerce.sellingPoints,
3177
+ protectedFeatures: ecommerce.protectedFeatures,
3178
+ styleHint: ecommerce.styleHint
3179
+ },
3180
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
3181
+ images: ecommerceMergedItems.map((item) => ({
3182
+ slotKey: item.slotKey,
3183
+ slotLabel: item.label,
3184
+ status: item.status,
3185
+ model: item.model,
3186
+ prompt: item.prompt,
3187
+ error: item.error
3188
+ }))
3189
+ };
3190
+ const blob = new Blob([JSON.stringify(manifest, null, 2)], { type: "application/json" });
3191
+ const url = URL.createObjectURL(blob);
3192
+ const anchor = document.createElement("a");
3193
+ anchor.href = url;
3194
+ anchor.download = `dsh-product-set-${(ecommerce.projectName || ecommerce.productName || "set").replace(/[^\w-]+/g, "-")}.json`;
3195
+ anchor.click();
3196
+ URL.revokeObjectURL(url);
3197
+ };
2530
3198
  const openPreview = (previewImages, index) => {
2531
3199
  setPreview({
2532
3200
  images: previewImages,
@@ -2583,7 +3251,11 @@ window.__ModuleLoader__.load({
2583
3251
  const viewHistoryGroup = async (group) => {
2584
3252
  const entry = group.entries[0];
2585
3253
  if (entry === void 0) return;
2586
- setTab("text");
3254
+ if (entry.workflow === "ecommerce" && entry.projectId !== void 0) {
3255
+ await viewEcommerceProject(group);
3256
+ return;
3257
+ }
3258
+ openTab("text");
2587
3259
  try {
2588
3260
  setImages(await loadHistoryGroup(group));
2589
3261
  setComparison(null);
@@ -2598,9 +3270,13 @@ window.__ModuleLoader__.load({
2598
3270
  const restoreHistoryGroup = async (group) => {
2599
3271
  const entry = group.entries[0];
2600
3272
  if (entry === void 0) return;
3273
+ if (entry.workflow === "ecommerce" && entry.projectId !== void 0) {
3274
+ await viewEcommerceProject(group);
3275
+ return;
3276
+ }
2601
3277
  try {
2602
3278
  const restored = await loadHistoryGroup(group);
2603
- setTab(entry.mode);
3279
+ openTab(entry.mode);
2604
3280
  setPrompt(entry.prompt);
2605
3281
  setSize(normalizeSize(entry.size));
2606
3282
  setQuality(normalizeQuality(entry.quality));
@@ -2624,14 +3300,40 @@ window.__ModuleLoader__.load({
2624
3300
  const ids = new Set(group.entries.map((entry) => entry.id));
2625
3301
  setHistory((previous) => previous.filter((entry) => !ids.has(entry.id)));
2626
3302
  if (viewingHistoryId !== null && ids.has(viewingHistoryId)) setViewingHistoryId(null);
3303
+ if (ecommerceRestored !== null && group.entries.some((entry) => entry.projectId === ecommerceRestored.projectId)) {
3304
+ setEcommerceRestored(null);
3305
+ setEcommerceProjectId(null);
3306
+ setEcommerceAnchor(null);
3307
+ }
2627
3308
  try {
2628
3309
  let next = history;
2629
3310
  for (const id of ids) next = await api.historyRemove(id);
2630
3311
  setHistory(next);
2631
3312
  } catch {}
2632
3313
  };
3314
+ /** Reset the workspace for a fresh image-generation run. */
3315
+ const startNewCreation = () => {
3316
+ openTab("text");
3317
+ setPrompt("");
3318
+ setRefImage(null);
3319
+ setImages([]);
3320
+ setPreview(null);
3321
+ setPreviewScale(1);
3322
+ setPromptCopied(false);
3323
+ setViewingHistoryId(null);
3324
+ setGalleryViewingId(null);
3325
+ setGallerySelecting(false);
3326
+ setSelectedGalleryIds(/* @__PURE__ */ new Set());
3327
+ setComparison(null);
3328
+ setComparisonFullscreen(false);
3329
+ setEcommerceRestored(null);
3330
+ setError(null);
3331
+ setConversationMessage(null);
3332
+ setGalleryMessage(null);
3333
+ };
2633
3334
  /** Remove all history entries. */
2634
3335
  const clearHistory = async () => {
3336
+ if (!window.confirm(tt("history.clearConfirm"))) return;
2635
3337
  setHistory([]);
2636
3338
  setViewingHistoryId(null);
2637
3339
  try {
@@ -2643,7 +3345,7 @@ window.__ModuleLoader__.load({
2643
3345
  * metadata + first image are saved); otherwise the current form state is
2644
3346
  * used. */
2645
3347
  const addToGallery = async (image, entry) => {
2646
- if (galleryAdding || tab === "gallery") return;
3348
+ if (galleryAdding || workspace === "normal" && tab === "gallery") return;
2647
3349
  const source = entry ?? viewingEntry ?? {
2648
3350
  mode: tab === "edit" ? "edit" : "text",
2649
3351
  model,
@@ -2680,7 +3382,7 @@ window.__ModuleLoader__.load({
2680
3382
  }
2681
3383
  };
2682
3384
  /** Put a generated image into the native conversation composer. */
2683
- const addImageToConversation = async (image, index) => {
3385
+ const addImageToConversation = async (image, index, actionKey = index) => {
2684
3386
  if (addingToConversation !== null) return;
2685
3387
  if (conversation === void 0 || sessions === void 0 || currentSessionId === void 0) {
2686
3388
  setError(tt("conversation.noSession"));
@@ -2691,15 +3393,23 @@ window.__ModuleLoader__.load({
2691
3393
  setError(tt("conversation.unavailable"));
2692
3394
  return;
2693
3395
  }
2694
- setAddingToConversation(index);
3396
+ setAddingToConversation(actionKey);
2695
3397
  let attachments = [];
2696
3398
  let added = false;
2697
3399
  try {
2698
- const file = generatedImageToFile(image, index);
3400
+ const prepared = await prepareConversationImage(image, index);
3401
+ const file = prepared.file;
2699
3402
  attachments = conversation.createDraftImages([file]);
2700
3403
  const input = conversation.input.for(sessionScope);
2701
3404
  if (!input.addImages(attachments.map((attachment) => attachment.id))) throw new Error(tt("conversation.busy"));
2702
3405
  added = true;
3406
+ try {
3407
+ await api.attachConversationImage(String(currentSessionId), prepared.dataUrl, file.name);
3408
+ } catch (caught) {
3409
+ for (const attachment of attachments) input.removeImage(attachment.id);
3410
+ added = false;
3411
+ throw caught;
3412
+ }
2703
3413
  if (input.state.getSnapshot().draft.trim() === "" && prompt.trim() !== "") input.setDraft(prompt.trim());
2704
3414
  setConversationMessage(tt("conversation.added"));
2705
3415
  window.setTimeout(() => {
@@ -2724,6 +3434,20 @@ window.__ModuleLoader__.load({
2724
3434
  setError(errorMessage(caught));
2725
3435
  }
2726
3436
  };
3437
+ /** Load a persisted gallery image and add it to the current chat draft. */
3438
+ const addGalleryEntryToConversation = async (entry) => {
3439
+ if (galleryConversationAddingId !== null || addingToConversation !== null || entry.images.length === 0) return;
3440
+ setGalleryConversationAddingId(entry.id);
3441
+ try {
3442
+ const [image] = await historyImagesToGenerated(entry.images.slice(0, 1));
3443
+ if (image === void 0) return;
3444
+ await addImageToConversation(image, 0, `gallery:${entry.id}`);
3445
+ } catch (caught) {
3446
+ setError(errorMessage(caught));
3447
+ } finally {
3448
+ setGalleryConversationAddingId(null);
3449
+ }
3450
+ };
2727
3451
  /** View a gallery image in the canvas. */
2728
3452
  const viewGalleryEntry = async (entry) => {
2729
3453
  try {
@@ -2747,6 +3471,7 @@ window.__ModuleLoader__.load({
2747
3471
  };
2748
3472
  /** Remove every gallery entry. */
2749
3473
  const clearGalleryAll = async () => {
3474
+ if (!window.confirm(tt("gallery.clearConfirm"))) return;
2750
3475
  setGallery([]);
2751
3476
  setGalleryViewingId(null);
2752
3477
  try {
@@ -2815,6 +3540,30 @@ window.__ModuleLoader__.load({
2815
3540
  });
2816
3541
  };
2817
3542
  const generateDisabled = submitting || modeModels.length === 0;
3543
+ const ecommerceSlots = ecommerce.slots.filter((slot) => slot.enabled && slot.count > 0);
3544
+ const ecommerceTotal = ecommerceSlots.reduce((total, slot) => total + slot.count, 0);
3545
+ const ecommerceGenerateDisabled = submitting || ecommerceGenerating || ecommerceSlots.length === 0 || ecommerce.productName.trim() === "";
3546
+ const ecommerceFileInput = (0, react.useRef)(null);
3547
+ const ecommerceProjectTasks = ecommerceProjectId === null ? [] : tasks.filter((task) => task.request.workflow === "ecommerce" && task.request.projectId === ecommerceProjectId);
3548
+ const liveSlotKeys = new Set(ecommerceProjectTasks.map((task) => task.request.slotKey ?? task.id));
3549
+ const ecommerceMergedItems = [...ecommerceProjectTasks.map((task) => ({
3550
+ id: task.id,
3551
+ label: task.request.slotLabel ?? "",
3552
+ slotKey: task.request.slotKey ?? "",
3553
+ status: task.status,
3554
+ model: task.request.model,
3555
+ prompt: task.request.prompt,
3556
+ ...task.error !== void 0 ? { error: task.error } : {},
3557
+ images: task.result?.images ?? [],
3558
+ source: task.request
3559
+ })), ...ecommerceRestored !== null && ecommerceRestored.projectId === ecommerceProjectId ? ecommerceRestored.items.filter((item) => !liveSlotKeys.has(item.slotKey)) : []];
3560
+ const ecommerceDoneCount = ecommerceMergedItems.filter((item) => item.status === "completed").length;
3561
+ const ecommerceFailedCount = ecommerceMergedItems.filter((item) => item.status === "failed" || item.status === "cancelled").length;
3562
+ const ecommerceResultGroups = [...new Set(ecommerceMergedItems.map((item) => item.label))].filter((label) => label !== "").map((label) => ({
3563
+ label,
3564
+ items: ecommerceMergedItems.filter((item) => item.label === label)
3565
+ }));
3566
+ const conversationBusy = addingToConversation !== null || galleryConversationAddingId !== null;
2818
3567
  const viewingEntry = viewingHistoryId === null ? null : history.find((entry) => entry.id === viewingHistoryId) ?? null;
2819
3568
  const viewingGalleryEntry = galleryViewingId === null ? null : gallery.find((entry) => entry.id === galleryViewingId) ?? null;
2820
3569
  const previewImage = preview === null ? null : preview.images[preview.index] ?? null;
@@ -2822,6 +3571,30 @@ window.__ModuleLoader__.load({
2822
3571
  const comparisonResults = comparisonTasks.filter((task) => task.status === "completed" && task.result !== void 0);
2823
3572
  const previewFrameScale = Math.max(1, previewScale);
2824
3573
  const previewImageScale = previewScale / previewFrameScale;
3574
+ /** Drag the config panel's right edge to resize it (persisted per browser). */
3575
+ const onConfigResizeStart = (event) => {
3576
+ if (event.button !== 0) return;
3577
+ event.preventDefault();
3578
+ const aside = configAsideRef.current;
3579
+ if (aside === null) return;
3580
+ const left = aside.getBoundingClientRect().left;
3581
+ const onMove = (move) => {
3582
+ const width = Math.round(Math.min(CONFIG_WIDTH_MAX, Math.max(CONFIG_WIDTH_MIN, move.clientX - left)));
3583
+ setConfigWidth(width);
3584
+ try {
3585
+ window.localStorage.setItem(CONFIG_WIDTH_STORAGE_KEY, String(width));
3586
+ } catch {}
3587
+ };
3588
+ const onUp = () => {
3589
+ window.removeEventListener("pointermove", onMove);
3590
+ document.documentElement.style.removeProperty("cursor");
3591
+ document.documentElement.style.removeProperty("user-select");
3592
+ };
3593
+ window.addEventListener("pointermove", onMove);
3594
+ window.addEventListener("pointerup", onUp, { once: true });
3595
+ document.documentElement.style.setProperty("cursor", "col-resize");
3596
+ document.documentElement.style.setProperty("user-select", "none");
3597
+ };
2825
3598
  const copyPreviewPrompt = async (text) => {
2826
3599
  try {
2827
3600
  if (navigator.clipboard?.writeText !== void 0) await navigator.clipboard.writeText(text);
@@ -2846,7 +3619,7 @@ window.__ModuleLoader__.load({
2846
3619
  };
2847
3620
  const addPreviewToEdit = () => {
2848
3621
  if (previewImage === null || preview === null) return;
2849
- setTab("edit");
3622
+ openTab("edit");
2850
3623
  setRefImage({
2851
3624
  dataUrl: srcOf(previewImage),
2852
3625
  name: `dsh-image-${preview.index + 1}.${extensionOf(previewImage.mime)}`
@@ -2864,14 +3637,36 @@ window.__ModuleLoader__.load({
2864
3637
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2865
3638
  className: panel_module_css_default.historyTitle,
2866
3639
  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]
3640
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3641
+ className: panel_module_css_default.historyHeaderActions,
3642
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3643
+ type: "button",
3644
+ className: panel_module_css_default.historyNew,
3645
+ "data-history-new": "",
3646
+ "aria-label": tt("canvas.new"),
3647
+ title: tt("canvas.newHint"),
3648
+ onClick: startNewCreation,
3649
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3650
+ viewBox: "0 0 16 16",
3651
+ width: "15",
3652
+ height: "15",
3653
+ fill: "none",
3654
+ stroke: "currentColor",
3655
+ strokeWidth: "1.7",
3656
+ strokeLinecap: "round",
3657
+ "aria-hidden": "true",
3658
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8 3v10M3 8h10" })
3659
+ })
3660
+ }), history.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3661
+ type: "button",
3662
+ className: panel_module_css_default.historyClear,
3663
+ "data-history-clear": "",
3664
+ onClick: () => {
3665
+ clearHistory();
3666
+ },
3667
+ children: tt("history.clear")
3668
+ }) : null]
3669
+ })]
2875
3670
  }),
2876
3671
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2877
3672
  className: panel_module_css_default.historyFilters,
@@ -2947,7 +3742,7 @@ window.__ModuleLoader__.load({
2947
3742
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2948
3743
  className: panel_module_css_default.historyMeta,
2949
3744
  children: [
2950
- isComparison ? tt("compare.title") : tt(`mode.${entry.mode === "edit" ? "edit" : "text"}`),
3745
+ 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
3746
  " · ",
2952
3747
  isComparison ? group.models.join(" · ") : entry.model,
2953
3748
  " · ",
@@ -3001,37 +3796,105 @@ window.__ModuleLoader__.load({
3001
3796
  children: [
3002
3797
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
3003
3798
  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
- })]
3799
+ children: [
3800
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3801
+ className: panel_module_css_default.panelHeading,
3802
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
3803
+ className: panel_module_css_default.panelTitle,
3804
+ children: tt("panel.title")
3805
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
3806
+ className: panel_module_css_default.githubLink,
3807
+ href: "https://github.com/dickpy/dsh-imagegen",
3808
+ target: "_blank",
3809
+ rel: "noreferrer",
3810
+ title: tt("panel.githubTip"),
3811
+ "aria-label": tt("panel.githubTip"),
3812
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3813
+ viewBox: "0 0 16 16",
3814
+ width: "15",
3815
+ height: "15",
3816
+ fill: "currentColor",
3817
+ "aria-hidden": "true",
3818
+ 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" })
3819
+ })
3820
+ })]
3821
+ }),
3822
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("nav", {
3823
+ className: panel_module_css_default.topNav,
3824
+ role: "tablist",
3825
+ "aria-label": tt("workspace.label"),
3826
+ children: [
3827
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3828
+ type: "button",
3829
+ className: panel_module_css_default.topNavItem,
3830
+ "data-active": workspace === "normal" && tab !== "gallery" ? "" : void 0,
3831
+ onClick: () => {
3832
+ if (workspace !== "normal" || tab === "gallery") openTab("text");
3833
+ },
3834
+ children: tt("workspace.normal")
3835
+ }),
3836
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3837
+ type: "button",
3838
+ className: panel_module_css_default.topNavItem,
3839
+ "data-active": workspace === "normal" && tab === "gallery" ? "" : void 0,
3840
+ onClick: () => {
3841
+ openTab("gallery");
3842
+ },
3843
+ children: tt("gallery.title")
3844
+ }),
3845
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3846
+ className: panel_module_css_default.topNavDivider,
3847
+ "aria-hidden": "true"
3848
+ }),
3849
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3850
+ type: "button",
3851
+ className: panel_module_css_default.topNavItem,
3852
+ "data-active": workspace === "ecommerce" ? "" : void 0,
3853
+ onClick: () => {
3854
+ setWorkspace("ecommerce");
3855
+ },
3856
+ children: [tt("workspace.ecommerce"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3857
+ className: panel_module_css_default.previewBadge,
3858
+ children: tt("ecommerce.badge")
3859
+ })]
3860
+ })
3861
+ ]
3862
+ }),
3863
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3864
+ className: panel_module_css_default.panelHeaderActions,
3865
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3866
+ type: "button",
3867
+ className: panel_module_css_default.chatToggle,
3868
+ "data-open": chatOpen ? "true" : "false",
3869
+ "aria-pressed": chatOpen,
3870
+ title: chatOpen ? tt("chat.collapse") : tt("chat.expand"),
3871
+ onClick: () => {
3872
+ setChatOpen((open) => !open);
3873
+ },
3874
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3875
+ viewBox: "0 0 16 16",
3876
+ width: "13",
3877
+ height: "13",
3878
+ fill: "none",
3879
+ stroke: "currentColor",
3880
+ strokeWidth: "1.4",
3881
+ strokeLinecap: "round",
3882
+ strokeLinejoin: "round",
3883
+ "aria-hidden": "true",
3884
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M2.5 3.5h11v7.5H6.8L3.8 13.6v-2.6H2.5z" })
3885
+ }), tt("chat.toggle")]
3886
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3887
+ type: "button",
3888
+ className: panel_module_css_default.connectionStatus,
3889
+ "data-connected": connected ? "true" : "false",
3890
+ "aria-label": tt(connected ? "connection.connected" : "connection.disconnected"),
3891
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3892
+ className: panel_module_css_default.connectionDot,
3893
+ "aria-hidden": "true"
3894
+ }), tt(connected ? "connection.connected" : "connection.disconnected")]
3895
+ })]
3896
+ })
3897
+ ]
3035
3898
  }),
3036
3899
  update !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3037
3900
  className: panel_module_css_default.updateBanner,
@@ -3063,10 +3926,43 @@ window.__ModuleLoader__.load({
3063
3926
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3064
3927
  className: panel_module_css_default.generation,
3065
3928
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("aside", {
3929
+ ref: configAsideRef,
3066
3930
  className: panel_module_css_default.config,
3067
- "data-gallery": tab === "gallery" ? "true" : void 0,
3931
+ style: { "--dsh-imagegen-config-width": `${configWidth}px` },
3932
+ "data-collapsed": configCollapsed ? "true" : "false",
3933
+ "data-gallery": workspace === "normal" && tab === "gallery" ? "true" : void 0,
3068
3934
  children: [
3069
- tab === "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3935
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3936
+ className: panel_module_css_default.configResizer,
3937
+ title: tt("config.resizeHint"),
3938
+ onPointerDown: onConfigResizeStart
3939
+ }),
3940
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3941
+ className: panel_module_css_default.configHeader,
3942
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3943
+ type: "button",
3944
+ className: panel_module_css_default.configToggle,
3945
+ "aria-expanded": !configCollapsed,
3946
+ "aria-label": tt(configCollapsed ? "panel.expandConfig" : "panel.collapseConfig"),
3947
+ title: tt(configCollapsed ? "panel.expandConfig" : "panel.collapseConfig"),
3948
+ onClick: () => {
3949
+ setConfigCollapsed((previous) => !previous);
3950
+ },
3951
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
3952
+ viewBox: "0 0 16 16",
3953
+ width: "16",
3954
+ height: "16",
3955
+ fill: "none",
3956
+ stroke: "currentColor",
3957
+ strokeWidth: "1.6",
3958
+ strokeLinecap: "round",
3959
+ strokeLinejoin: "round",
3960
+ "aria-hidden": "true",
3961
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: configCollapsed ? "M6 3l5 5-5 5" : "M10 3L5 8l5 5" })
3962
+ })
3963
+ })
3964
+ }),
3965
+ workspace === "normal" && tab === "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3070
3966
  className: panel_module_css_default.galleryFilters,
3071
3967
  children: [
3072
3968
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -3141,40 +4037,382 @@ window.__ModuleLoader__.load({
3141
4037
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3142
4038
  className: panel_module_css_default.configScroll,
3143
4039
  children: [
3144
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
4040
+ workspace === "normal" && tab !== "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
3145
4041
  className: panel_module_css_default.card,
3146
4042
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3147
4043
  className: panel_module_css_default.modeRow,
3148
4044
  role: "tablist",
3149
4045
  "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
- ]
4046
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
4047
+ active: tab === "text",
4048
+ onClick: () => {
4049
+ setTab("text");
4050
+ },
4051
+ className: panel_module_css_default.modePill,
4052
+ children: tt("mode.text")
4053
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
4054
+ active: tab === "edit",
4055
+ onClick: () => {
4056
+ setTab("edit");
4057
+ },
4058
+ className: panel_module_css_default.modePill,
4059
+ children: tt("mode.edit")
4060
+ })]
3176
4061
  })
3177
- }),
4062
+ }) : null,
4063
+ workspace === "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4064
+ className: panel_module_css_default.ecommerceWorkspace,
4065
+ "data-ecommerce-workspace": "",
4066
+ children: [
4067
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4068
+ className: panel_module_css_default.ecommerceSection,
4069
+ children: [
4070
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.product") }),
4071
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4072
+ className: panel_module_css_default.ecommerceField,
4073
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4074
+ className: panel_module_css_default.ecommerceFieldLabel,
4075
+ children: tt("ecommerce.productName")
4076
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4077
+ value: ecommerce.productName,
4078
+ placeholder: tt("ecommerce.productName"),
4079
+ onChange: (event) => setEcommerce((previous) => ({
4080
+ ...previous,
4081
+ productName: event.target.value
4082
+ }))
4083
+ })]
4084
+ }),
4085
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4086
+ className: panel_module_css_default.ecommerceField,
4087
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4088
+ className: panel_module_css_default.ecommerceFieldLabel,
4089
+ children: tt("ecommerce.projectName")
4090
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4091
+ value: ecommerce.projectName,
4092
+ placeholder: tt("ecommerce.projectName"),
4093
+ onChange: (event) => setEcommerce((previous) => ({
4094
+ ...previous,
4095
+ projectName: event.target.value
4096
+ }))
4097
+ })]
4098
+ }),
4099
+ ecommerceAssets.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4100
+ type: "button",
4101
+ className: panel_module_css_default.ecommerceUploadHero,
4102
+ "data-ecommerce-upload": "",
4103
+ onClick: () => {
4104
+ ecommerceFileInput.current?.click();
4105
+ },
4106
+ onDragOver: (event) => {
4107
+ event.preventDefault();
4108
+ },
4109
+ onDrop: (event) => {
4110
+ event.preventDefault();
4111
+ acceptEcommerceFiles(event.dataTransfer.files ?? void 0);
4112
+ },
4113
+ children: [
4114
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
4115
+ viewBox: "0 0 16 16",
4116
+ width: "15",
4117
+ height: "15",
4118
+ fill: "none",
4119
+ stroke: "currentColor",
4120
+ strokeWidth: "1.3",
4121
+ strokeLinecap: "round",
4122
+ strokeLinejoin: "round",
4123
+ "aria-hidden": "true",
4124
+ children: [
4125
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8 10V3.5" }),
4126
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M5.5 5.5L8 3l2.5 2.5" }),
4127
+ /* @__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" })
4128
+ ]
4129
+ }),
4130
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: tt("ecommerce.uploadRef") }),
4131
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: tt("edit.uploadHint") })
4132
+ ]
4133
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4134
+ className: panel_module_css_default.ecommerceAssets,
4135
+ children: [ecommerceAssets.map((asset) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4136
+ className: panel_module_css_default.ecommerceAsset,
4137
+ "data-ecommerce-asset": "",
4138
+ children: [
4139
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
4140
+ src: asset.dataUrl,
4141
+ alt: asset.name
4142
+ }),
4143
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
4144
+ value: asset.role,
4145
+ "data-ecommerce-asset-role": "",
4146
+ "aria-label": tt("ecommerce.refSelect"),
4147
+ onChange: (event) => setEcommerceAssets((previous) => previous.map((item) => item.id === asset.id ? {
4148
+ ...item,
4149
+ role: event.target.value
4150
+ } : item)),
4151
+ children: ECOMMERCE_ASSET_ROLES.map((role) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4152
+ value: role,
4153
+ children: tt(`ecommerce.role.${role}`)
4154
+ }, role))
4155
+ }),
4156
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4157
+ type: "button",
4158
+ "aria-label": tt("edit.remove"),
4159
+ onClick: () => {
4160
+ setEcommerceAssets((previous) => previous.filter((item) => item.id !== asset.id));
4161
+ },
4162
+ children: "×"
4163
+ })
4164
+ ]
4165
+ }, asset.id)), ecommerceAssets.length < MAX_ECOMMERCE_ASSETS ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4166
+ type: "button",
4167
+ className: panel_module_css_default.ecommerceAssetAdd,
4168
+ "data-ecommerce-upload": "",
4169
+ title: tt("ecommerce.uploadRef"),
4170
+ onClick: () => {
4171
+ ecommerceFileInput.current?.click();
4172
+ },
4173
+ onDragOver: (event) => {
4174
+ event.preventDefault();
4175
+ },
4176
+ onDrop: (event) => {
4177
+ event.preventDefault();
4178
+ acceptEcommerceFiles(event.dataTransfer.files ?? void 0);
4179
+ },
4180
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4181
+ "aria-hidden": "true",
4182
+ children: "+"
4183
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: tt("ecommerce.uploadShort") })]
4184
+ }) : null]
4185
+ })
4186
+ ]
4187
+ }),
4188
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4189
+ className: panel_module_css_default.ecommerceSection,
4190
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.params") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4191
+ className: panel_module_css_default.ecommerceParamGrid,
4192
+ children: [
4193
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4194
+ className: panel_module_css_default.ecommerceField,
4195
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4196
+ className: panel_module_css_default.ecommerceFieldLabel,
4197
+ children: tt("ecommerce.platformLabel")
4198
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4199
+ value: ecommerce.platform,
4200
+ onChange: (event) => setEcommerce((previous) => ({
4201
+ ...previous,
4202
+ platform: event.target.value
4203
+ })),
4204
+ children: [
4205
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "通用" }),
4206
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "淘宝 / 京东" }),
4207
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "Amazon" })
4208
+ ]
4209
+ })]
4210
+ }),
4211
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4212
+ className: panel_module_css_default.ecommerceField,
4213
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4214
+ className: panel_module_css_default.ecommerceFieldLabel,
4215
+ children: tt("ecommerce.languageLabel")
4216
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4217
+ value: ecommerce.language,
4218
+ onChange: (event) => setEcommerce((previous) => ({
4219
+ ...previous,
4220
+ language: event.target.value
4221
+ })),
4222
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "中文" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "English" })]
4223
+ })]
4224
+ }),
4225
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4226
+ className: panel_module_css_default.ecommerceField,
4227
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4228
+ className: panel_module_css_default.ecommerceFieldLabel,
4229
+ children: tt("ecommerce.ratioLabel")
4230
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
4231
+ value: ecommerce.size,
4232
+ onChange: (event) => setEcommerce((previous) => ({
4233
+ ...previous,
4234
+ size: event.target.value
4235
+ })),
4236
+ children: SIZES.filter((size) => size !== "auto").map((size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: size }, size))
4237
+ })]
4238
+ }),
4239
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4240
+ className: panel_module_css_default.ecommerceField,
4241
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4242
+ className: panel_module_css_default.ecommerceFieldLabel,
4243
+ children: tt("ecommerce.categoryLabel")
4244
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4245
+ value: ecommerce.category,
4246
+ onChange: (event) => setEcommerce((previous) => ({
4247
+ ...previous,
4248
+ category: event.target.value
4249
+ })),
4250
+ children: [
4251
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "通用商品" }),
4252
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: "食品饮料" }),
4253
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { 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: "3C 数码" })
4257
+ ]
4258
+ })]
4259
+ })
4260
+ ]
4261
+ })]
4262
+ }),
4263
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4264
+ className: panel_module_css_default.ecommerceSection,
4265
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.sellingTitle") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
4266
+ value: ecommerce.sellingPoints,
4267
+ placeholder: tt("ecommerce.sellingPoints"),
4268
+ onChange: (event) => setEcommerce((previous) => ({
4269
+ ...previous,
4270
+ sellingPoints: event.target.value
4271
+ }))
4272
+ })]
4273
+ }),
4274
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4275
+ className: panel_module_css_default.ecommerceSection,
4276
+ children: [
4277
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h3", { children: [tt("ecommerce.setStructure"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
4278
+ className: panel_module_css_default.ecommerceSectionHint,
4279
+ children: tt("ecommerce.multiSelect")
4280
+ })] }),
4281
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4282
+ className: panel_module_css_default.ecommerceStructureGrid,
4283
+ children: ecommerce.slots.map((slot) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4284
+ type: "button",
4285
+ className: panel_module_css_default.ecommerceSlotCard,
4286
+ "data-active": slot.enabled ? "" : void 0,
4287
+ title: `${slot.label}:${slot.description}`,
4288
+ onClick: () => setEcommerce((previous) => ({
4289
+ ...previous,
4290
+ slots: previous.slots.map((item) => item.key === slot.key ? {
4291
+ ...item,
4292
+ enabled: !item.enabled
4293
+ } : item)
4294
+ })),
4295
+ children: [slot.label, slot.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4296
+ className: panel_module_css_default.ecommerceSlotCount,
4297
+ title: tt("ecommerce.countHint"),
4298
+ onClick: (event) => {
4299
+ event.stopPropagation();
4300
+ setEcommerce((previous) => ({
4301
+ ...previous,
4302
+ slots: previous.slots.map((item) => item.key === slot.key ? {
4303
+ ...item,
4304
+ count: item.count >= 4 ? 1 : item.count + 1
4305
+ } : item)
4306
+ }));
4307
+ },
4308
+ children: slot.count
4309
+ }) : null]
4310
+ }, slot.key))
4311
+ }),
4312
+ ecommerceSlots.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4313
+ type: "button",
4314
+ className: panel_module_css_default.ecommerceAdvancedToggle,
4315
+ "aria-expanded": ecommerceRefOpen,
4316
+ onClick: () => {
4317
+ setEcommerceRefOpen((open) => !open);
4318
+ },
4319
+ children: [tt("ecommerce.refSettings"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4320
+ className: panel_module_css_default.ecommerceAdvancedChevron,
4321
+ "aria-hidden": "true",
4322
+ children: ecommerceRefOpen ? "⌃" : "⌄"
4323
+ })]
4324
+ }), ecommerceRefOpen ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4325
+ className: panel_module_css_default.ecommerceAdvancedBody,
4326
+ children: ecommerceSlots.map((slot) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4327
+ className: panel_module_css_default.ecommerceRefRow,
4328
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: slot.label }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4329
+ value: slot.refRole ?? "product",
4330
+ "data-ecommerce-ref-select": "",
4331
+ "aria-label": `${tt("ecommerce.refSelect")} · ${slot.label}`,
4332
+ onChange: (event) => setEcommerce((previous) => ({
4333
+ ...previous,
4334
+ slots: previous.slots.map((item) => item.key === slot.key ? {
4335
+ ...item,
4336
+ refRole: event.target.value
4337
+ } : item)
4338
+ })),
4339
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4340
+ value: "none",
4341
+ children: tt("ecommerce.refNone")
4342
+ }), ECOMMERCE_ASSET_ROLES.map((role) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4343
+ value: role,
4344
+ children: tt(`ecommerce.role.${role}`)
4345
+ }, role))]
4346
+ })]
4347
+ }, slot.key))
4348
+ }) : null] }) : null
4349
+ ]
4350
+ }),
4351
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4352
+ className: panel_module_css_default.ecommerceSection,
4353
+ children: [
4354
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.generation") }),
4355
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
4356
+ value: modeModels.includes(model) ? model : modeModels[0] ?? "",
4357
+ "aria-label": tt("model.label"),
4358
+ onChange: (event) => setModel(event.target.value),
4359
+ children: modeModels.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4360
+ value: option,
4361
+ children: option
4362
+ }, option))
4363
+ }),
4364
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4365
+ className: panel_module_css_default.optionRow,
4366
+ children: QUALITIES.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
4367
+ active: quality === option,
4368
+ onClick: () => {
4369
+ setQuality(option);
4370
+ },
4371
+ className: panel_module_css_default.optionPill,
4372
+ children: tt(`quality.${option}`)
4373
+ }, option))
4374
+ })
4375
+ ]
4376
+ }),
4377
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4378
+ className: panel_module_css_default.ecommerceSection,
4379
+ children: [
4380
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.styleTitle") }),
4381
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
4382
+ value: ecommerce.styleHint,
4383
+ placeholder: tt("ecommerce.styleHint"),
4384
+ onChange: (event) => setEcommerce((previous) => ({
4385
+ ...previous,
4386
+ styleHint: event.target.value
4387
+ }))
4388
+ }),
4389
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4390
+ className: panel_module_css_default.ecommerceFieldLabel,
4391
+ children: tt("ecommerce.protectedLabel")
4392
+ }),
4393
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
4394
+ value: ecommerce.protectedFeatures,
4395
+ placeholder: tt("ecommerce.protectedFeatures"),
4396
+ onChange: (event) => setEcommerce((previous) => ({
4397
+ ...previous,
4398
+ protectedFeatures: event.target.value
4399
+ }))
4400
+ })
4401
+ ]
4402
+ }),
4403
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4404
+ ref: ecommerceFileInput,
4405
+ type: "file",
4406
+ multiple: true,
4407
+ accept: "image/png,image/jpeg,image/webp,image/gif",
4408
+ className: panel_module_css_default.hiddenFile,
4409
+ onChange: (event) => {
4410
+ acceptEcommerceFiles(event.target.files ?? void 0);
4411
+ event.target.value = "";
4412
+ }
4413
+ })
4414
+ ]
4415
+ }) : null,
3178
4416
  tab === "edit" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3179
4417
  className: panel_module_css_default.card,
3180
4418
  children: [refImage === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
@@ -3251,7 +4489,7 @@ window.__ModuleLoader__.load({
3251
4489
  }
3252
4490
  })]
3253
4491
  }) : null,
3254
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4492
+ workspace === "normal" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3255
4493
  className: panel_module_css_default.card,
3256
4494
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
3257
4495
  className: panel_module_css_default.prompt,
@@ -3299,8 +4537,7 @@ window.__ModuleLoader__.load({
3299
4537
  })
3300
4538
  ]
3301
4539
  })]
3302
- }),
3303
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4540
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3304
4541
  className: panel_module_css_default.card,
3305
4542
  children: [
3306
4543
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -3384,13 +4621,64 @@ window.__ModuleLoader__.load({
3384
4621
  ]
3385
4622
  })
3386
4623
  ]
3387
- })
4624
+ })] }) : null
3388
4625
  ]
3389
4626
  }),
3390
4627
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3391
4628
  className: panel_module_css_default.footer,
3392
4629
  children: [
3393
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4630
+ workspace === "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4631
+ className: panel_module_css_default.ecommerceFooterBody,
4632
+ children: ecommercePreview ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
4633
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4634
+ className: panel_module_css_default.ecommercePlanMini,
4635
+ children: [
4636
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: tt("ecommerce.planTitle", { count: ecommerceTotal }) }),
4637
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4638
+ className: panel_module_css_default.ecommercePlanList,
4639
+ 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))
4640
+ }),
4641
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4642
+ className: panel_module_css_default.ecommercePlanNote,
4643
+ children: tt("ecommerce.anchorNote")
4644
+ }),
4645
+ ecommerceAssets.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4646
+ className: panel_module_css_default.ecommercePlanWarn,
4647
+ children: tt("ecommerce.noAssetWarn")
4648
+ }) : null
4649
+ ]
4650
+ }),
4651
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
4652
+ variant: "primary",
4653
+ size: "md",
4654
+ className: panel_module_css_default.ecommercePrimaryAction,
4655
+ disabled: ecommerceGenerateDisabled,
4656
+ onClick: () => {
4657
+ handleEcommerceGenerate();
4658
+ },
4659
+ children: ecommerceGenerating ? tt("generating") : tt("ecommerce.confirm")
4660
+ }),
4661
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4662
+ type: "button",
4663
+ className: panel_module_css_default.ecommercePlanBack,
4664
+ onClick: () => {
4665
+ setEcommercePreview(false);
4666
+ },
4667
+ children: tt("gallery.tagsCancel")
4668
+ })
4669
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4670
+ className: panel_module_css_default.ecommerceFooterHint,
4671
+ children: ecommerceTotal > 0 ? tt("ecommerce.footerReady", { count: ecommerceTotal }) : tt("ecommerce.footerEmpty")
4672
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
4673
+ variant: "primary",
4674
+ size: "md",
4675
+ className: panel_module_css_default.ecommercePrimaryAction,
4676
+ disabled: ecommerce.productName.trim() === "" || ecommerceTotal === 0,
4677
+ onClick: () => setEcommercePreview(true),
4678
+ children: tt("ecommerce.preview")
4679
+ })] })
4680
+ }) : null,
4681
+ workspace === "ecommerce" ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
3394
4682
  className: panel_module_css_default.modelWrap,
3395
4683
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3396
4684
  className: panel_module_css_default.modelLabel,
@@ -3439,7 +4727,7 @@ window.__ModuleLoader__.load({
3439
4727
  }) : null]
3440
4728
  })]
3441
4729
  }),
3442
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4730
+ workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3443
4731
  className: panel_module_css_default.compareControl,
3444
4732
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
3445
4733
  className: panel_module_css_default.compareToggle,
@@ -3462,8 +4750,8 @@ window.__ModuleLoader__.load({
3462
4750
  }
3463
4751
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: option })] }, option))
3464
4752
  }) : null]
3465
- }),
3466
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
4753
+ }) : null,
4754
+ workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
3467
4755
  variant: "primary",
3468
4756
  size: "md",
3469
4757
  className: panel_module_css_default.generateButton,
@@ -3475,15 +4763,15 @@ window.__ModuleLoader__.load({
3475
4763
  className: panel_module_css_default.generateInner,
3476
4764
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: panel_module_css_default.spinner }), tt("generating")]
3477
4765
  }) : tt("generate")
3478
- })
4766
+ }) : null
3479
4767
  ]
3480
4768
  })
3481
4769
  ]
3482
4770
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3483
4771
  className: panel_module_css_default.canvas,
3484
- "data-gallery": tab === "gallery" ? "true" : void 0,
4772
+ "data-gallery": workspace === "normal" && tab === "gallery" ? "true" : void 0,
3485
4773
  children: [
3486
- tab === "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4774
+ workspace === "normal" && tab === "gallery" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3487
4775
  className: panel_module_css_default.galleryWorkspace,
3488
4776
  children: [
3489
4777
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
@@ -3570,6 +4858,7 @@ window.__ModuleLoader__.load({
3570
4858
  gallery.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3571
4859
  type: "button",
3572
4860
  className: panel_module_css_default.galleryClear,
4861
+ "data-gallery-clear": "",
3573
4862
  onClick: () => {
3574
4863
  clearGalleryAll();
3575
4864
  },
@@ -3664,6 +4953,32 @@ window.__ModuleLoader__.load({
3664
4953
  children: entry.mode === "edit" ? tt("mode.edit") : tt("mode.text")
3665
4954
  })]
3666
4955
  }),
4956
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4957
+ className: panel_module_css_default.galleryCardActions,
4958
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
4959
+ type: "button",
4960
+ className: panel_module_css_default.galleryCardAction,
4961
+ "data-gallery-add-conversation": "",
4962
+ disabled: conversationBusy,
4963
+ title: tt("conversation.addHint"),
4964
+ onClick: (event) => {
4965
+ event.stopPropagation();
4966
+ addGalleryEntryToConversation(entry);
4967
+ },
4968
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
4969
+ viewBox: "0 0 16 16",
4970
+ width: "13",
4971
+ height: "13",
4972
+ fill: "none",
4973
+ stroke: "currentColor",
4974
+ strokeWidth: "1.5",
4975
+ strokeLinecap: "round",
4976
+ strokeLinejoin: "round",
4977
+ "aria-hidden": "true",
4978
+ 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" })]
4979
+ }), galleryConversationAddingId === entry.id || addingToConversation === `gallery:${entry.id}` ? tt("conversation.adding") : tt("conversation.add")]
4980
+ })
4981
+ }),
3667
4982
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3668
4983
  className: panel_module_css_default.galleryCardFooter,
3669
4984
  children: [
@@ -3749,7 +5064,130 @@ window.__ModuleLoader__.load({
3749
5064
  })
3750
5065
  ]
3751
5066
  }) : null,
3752
- tab !== "gallery" && tasks.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5067
+ workspace === "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5068
+ className: panel_module_css_default.ecommerceResults,
5069
+ "data-ecommerce-results": "",
5070
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
5071
+ className: panel_module_css_default.ecommerceResultsHeader,
5072
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
5073
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: tt("ecommerce.results.title") }),
5074
+ ecommerceRestored !== null && ecommerceRestored.projectId === ecommerceProjectId && ecommerceRestored.projectName !== "" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: ecommerceRestored.projectName }) : null,
5075
+ ecommerceMergedItems.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [tt("ecommerce.results.progress", {
5076
+ done: ecommerceDoneCount,
5077
+ total: ecommerceMergedItems.length
5078
+ }), ecommerceFailedCount > 0 ? ` · ${tt("ecommerce.results.failed", { count: ecommerceFailedCount })}` : ""] }) : null,
5079
+ ecommerceAnchor !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5080
+ "data-ecommerce-anchor": "",
5081
+ children: tt("ecommerce.anchorPending")
5082
+ }) : null
5083
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5084
+ className: panel_module_css_default.ecommerceResultsActions,
5085
+ children: [ecommerceMergedItems.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5086
+ type: "button",
5087
+ className: panel_module_css_default.galleryBulkButton,
5088
+ "data-ecommerce-export": "",
5089
+ onClick: exportEcommerceManifest,
5090
+ children: tt("ecommerce.results.export")
5091
+ }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5092
+ type: "button",
5093
+ className: panel_module_css_default.galleryBulkButton,
5094
+ "data-ecommerce-new": "",
5095
+ onClick: newEcommerceProduct,
5096
+ children: tt("ecommerce.results.newProduct")
5097
+ })]
5098
+ })]
5099
+ }), ecommerceMergedItems.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5100
+ className: panel_module_css_default.ecommerceResultsEmpty,
5101
+ children: tt("ecommerce.results.empty")
5102
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5103
+ className: panel_module_css_default.ecommerceGroups,
5104
+ children: ecommerceResultGroups.map((group) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5105
+ className: panel_module_css_default.ecommerceGroup,
5106
+ "data-ecommerce-group": group.label,
5107
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [
5108
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: group.label }),
5109
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
5110
+ group.items.filter((item) => item.status === "completed").length,
5111
+ "/",
5112
+ group.items.length
5113
+ ] }),
5114
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5115
+ type: "button",
5116
+ className: panel_module_css_default.galleryBulkButton,
5117
+ disabled: ecommerceGenerating,
5118
+ onClick: () => {
5119
+ regenerateEcommerceSlot(group.label);
5120
+ },
5121
+ children: tt("ecommerce.results.regenerate")
5122
+ })
5123
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5124
+ className: panel_module_css_default.ecommerceGroupGrid,
5125
+ children: group.items.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5126
+ className: panel_module_css_default.ecommerceTaskCard,
5127
+ "data-status": item.status,
5128
+ children: item.status === "completed" && item.images.length > 0 ? item.images.map((image, imageIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("figure", {
5129
+ className: panel_module_css_default.imageCard,
5130
+ role: "button",
5131
+ tabIndex: 0,
5132
+ title: tt("preview.open"),
5133
+ onClick: () => {
5134
+ openPreview(item.images, imageIndex);
5135
+ },
5136
+ children: [
5137
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
5138
+ className: panel_module_css_default.image,
5139
+ src: srcOf(image),
5140
+ alt: `${group.label} ${imageIndex + 1}`
5141
+ }),
5142
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5143
+ className: panel_module_css_default.ecommerceResultBadge,
5144
+ children: group.label
5145
+ }),
5146
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5147
+ className: panel_module_css_default.ecommerceTaskActions,
5148
+ onClick: (event) => event.stopPropagation(),
5149
+ children: [
5150
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
5151
+ className: panel_module_css_default.ecommerceActionChip,
5152
+ href: srcOf(image),
5153
+ download: `product-${item.slotKey || item.id}-${imageIndex + 1}.${extensionOf(image.mime)}`,
5154
+ children: tt("download")
5155
+ }),
5156
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5157
+ type: "button",
5158
+ className: panel_module_css_default.ecommerceActionChip,
5159
+ disabled: galleryAdding,
5160
+ onClick: () => {
5161
+ addToGallery(image);
5162
+ },
5163
+ children: tt("gallery.add")
5164
+ }),
5165
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5166
+ type: "button",
5167
+ className: panel_module_css_default.ecommerceActionChip,
5168
+ disabled: conversationBusy,
5169
+ onClick: () => {
5170
+ addImageToConversation(image, imageIndex, `${item.id}:${imageIndex}`);
5171
+ },
5172
+ children: addingToConversation === `${item.id}:${imageIndex}` ? tt("conversation.adding") : tt("conversation.add")
5173
+ })
5174
+ ]
5175
+ })
5176
+ ]
5177
+ }, imageIndex)) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5178
+ className: panel_module_css_default.ecommerceTaskState,
5179
+ children: [
5180
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: group.label }),
5181
+ tt(`tasks.${item.status}`),
5182
+ item.error !== void 0 ? ` · ${item.error}` : ""
5183
+ ]
5184
+ })
5185
+ }, item.id))
5186
+ })]
5187
+ }, group.label))
5188
+ })]
5189
+ }) : null,
5190
+ (workspace === "ecommerce" || tab !== "gallery") && tasks.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3753
5191
  className: panel_module_css_default.taskTray,
3754
5192
  "data-open": taskTrayOpen ? "true" : "false",
3755
5193
  "aria-label": tt("tasks.title"),
@@ -3815,7 +5253,7 @@ window.__ModuleLoader__.load({
3815
5253
  }, task.id))
3816
5254
  })]
3817
5255
  }) : null,
3818
- tab !== "gallery" && comparison !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5256
+ workspace === "normal" && tab !== "gallery" && comparison !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3819
5257
  className: panel_module_css_default.comparisonBoard,
3820
5258
  "aria-label": tt("compare.title"),
3821
5259
  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 +5288,7 @@ window.__ModuleLoader__.load({
3850
5288
  })
3851
5289
  })]
3852
5290
  }) : null,
3853
- generating && comparison === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5291
+ generating && comparison === null && workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3854
5292
  className: panel_module_css_default.canvasState,
3855
5293
  "data-generation-state": activeTask?.status ?? "submitting",
3856
5294
  role: "status",
@@ -3871,7 +5309,7 @@ window.__ModuleLoader__.load({
3871
5309
  role: "alert",
3872
5310
  children: tt("canvas.error", { error })
3873
5311
  }) : null,
3874
- !generating && !error && images.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5312
+ !generating && !error && images.length === 0 && workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3875
5313
  className: panel_module_css_default.canvasState,
3876
5314
  children: [
3877
5315
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -3913,7 +5351,7 @@ window.__ModuleLoader__.load({
3913
5351
  })
3914
5352
  ]
3915
5353
  }) : null,
3916
- !generating && images.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5354
+ !generating && images.length > 0 && workspace !== "ecommerce" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3917
5355
  className: panel_module_css_default.canvasBody,
3918
5356
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3919
5357
  className: panel_module_css_default.canvasMeta,
@@ -4004,7 +5442,7 @@ window.__ModuleLoader__.load({
4004
5442
  type: "button",
4005
5443
  className: panel_module_css_default.conversationAdd,
4006
5444
  title: tt("conversation.add"),
4007
- disabled: addingToConversation !== null,
5445
+ disabled: conversationBusy,
4008
5446
  onClick: (event) => {
4009
5447
  event.stopPropagation();
4010
5448
  addImageToConversation(image, index);
@@ -4046,7 +5484,7 @@ window.__ModuleLoader__.load({
4046
5484
  setLibraryOpen(false);
4047
5485
  },
4048
5486
  onUse: (text) => {
4049
- setTab("text");
5487
+ openTab("text");
4050
5488
  setPrompt(text);
4051
5489
  setError(null);
4052
5490
  setLibraryOpen(false);
@@ -4321,7 +5759,8 @@ window.__ModuleLoader__.load({
4321
5759
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4322
5760
  type: "button",
4323
5761
  className: panel_module_css_default.lightboxEdit,
4324
- disabled: addingToConversation !== null,
5762
+ disabled: conversationBusy,
5763
+ title: tt("conversation.addHint"),
4325
5764
  onClick: () => {
4326
5765
  addImageToConversation(previewImage, preview.index);
4327
5766
  },
@@ -5200,8 +6639,8 @@ window.__ModuleLoader__.load({
5200
6639
  return Array.isArray(view?.channels) ? view.channels : [];
5201
6640
  }
5202
6641
  //#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}";
6642
+ //#region \0dsh-css:E:\dsh-plugin\src\client\settings-card.module.css.mjs
6643
+ 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
6644
  const tagId$1 = "@dickpy/dsh-imagegen/settings-card.module.css";
5206
6645
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
5207
6646
  const tag = document.createElement("style");
@@ -5211,97 +6650,97 @@ window.__ModuleLoader__.load({
5211
6650
  document.head.appendChild(tag);
5212
6651
  }
5213
6652
  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"
6653
+ "modelBadge": "i1cc5G_modelBadge",
6654
+ "headText": "i1cc5G_headText",
6655
+ "channelDotWarn": "i1cc5G_channelDotWarn",
6656
+ "channelName": "i1cc5G_channelName",
6657
+ "spacer": "i1cc5G_spacer",
6658
+ "modelRows": "i1cc5G_modelRows",
6659
+ "save": "i1cc5G_save",
6660
+ "input": "i1cc5G_input",
6661
+ "optionalContent": "i1cc5G_optionalContent",
6662
+ "modelSection": "i1cc5G_modelSection",
6663
+ "chevron": "i1cc5G_chevron",
6664
+ "presetList": "i1cc5G_presetList",
6665
+ "channelAddRow": "i1cc5G_channelAddRow",
6666
+ "channelRow": "i1cc5G_channelRow",
6667
+ "badge": "i1cc5G_badge",
6668
+ "select": "i1cc5G_select",
6669
+ "modelRowRemove": "i1cc5G_modelRowRemove",
6670
+ "presetMeta": "i1cc5G_presetMeta",
6671
+ "textareaInvalid": "i1cc5G_textareaInvalid",
6672
+ "failed": "i1cc5G_failed",
6673
+ "editorPanel": "i1cc5G_editorPanel",
6674
+ "presetHint": "i1cc5G_presetHint",
6675
+ "modelChip": "i1cc5G_modelChip",
6676
+ "modelChoices": "i1cc5G_modelChoices",
6677
+ "reset": "i1cc5G_reset",
6678
+ "detectOk": "i1cc5G_detectOk",
6679
+ "channelAction": "i1cc5G_channelAction",
6680
+ "hint": "i1cc5G_hint",
6681
+ "modelSummary": "i1cc5G_modelSummary",
6682
+ "presetName": "i1cc5G_presetName",
6683
+ "sectionDivider": "i1cc5G_sectionDivider",
6684
+ "discard": "i1cc5G_discard",
6685
+ "textarea": "i1cc5G_textarea",
6686
+ "channelAdd": "i1cc5G_channelAdd",
6687
+ "editorDivider": "i1cc5G_editorDivider",
6688
+ "channelList": "i1cc5G_channelList",
6689
+ "editorSectionHeader": "i1cc5G_editorSectionHeader",
6690
+ "channelBadge": "i1cc5G_channelBadge",
6691
+ "presetRow": "i1cc5G_presetRow",
6692
+ "invalid": "i1cc5G_invalid",
6693
+ "presetInlineHeader": "i1cc5G_presetInlineHeader",
6694
+ "sectionHint": "i1cc5G_sectionHint",
6695
+ "modelFetch": "i1cc5G_modelFetch",
6696
+ "addModel": "i1cc5G_addModel",
6697
+ "modelArrow": "i1cc5G_modelArrow",
6698
+ "editorClose": "i1cc5G_editorClose",
6699
+ "sectionTitle": "i1cc5G_sectionTitle",
6700
+ "badges": "i1cc5G_badges",
6701
+ "disclosure": "i1cc5G_disclosure",
6702
+ "modelCandidateList": "i1cc5G_modelCandidateList",
6703
+ "modelCandidateLabel": "i1cc5G_modelCandidateLabel",
6704
+ "inlineDisclosure": "i1cc5G_inlineDisclosure",
6705
+ "versionLabel": "i1cc5G_versionLabel",
6706
+ "channelEmpty": "i1cc5G_channelEmpty",
6707
+ "channelMain": "i1cc5G_channelMain",
6708
+ "deleteConfirmText": "i1cc5G_deleteConfirmText",
6709
+ "versionRow": "i1cc5G_versionRow",
6710
+ "name": "i1cc5G_name",
6711
+ "editorHeader": "i1cc5G_editorHeader",
6712
+ "editorFooter": "i1cc5G_editorFooter",
6713
+ "channelDotReady": "i1cc5G_channelDotReady",
6714
+ "editorBackdrop": "i1cc5G_editorBackdrop",
6715
+ "footer": "i1cc5G_footer",
6716
+ "notExposed": "i1cc5G_notExposed",
6717
+ "head": "i1cc5G_head",
6718
+ "versionValue": "i1cc5G_versionValue",
6719
+ "body": "i1cc5G_body",
6720
+ "inputInvalid": "i1cc5G_inputInvalid",
6721
+ "modelRow": "i1cc5G_modelRow",
6722
+ "sectionHeader": "i1cc5G_sectionHeader",
6723
+ "modelRowBadges": "i1cc5G_modelRowBadges",
6724
+ "channelDanger": "i1cc5G_channelDanger",
6725
+ "field": "i1cc5G_field",
6726
+ "description": "i1cc5G_description",
6727
+ "modelCandidate": "i1cc5G_modelCandidate",
6728
+ "channelSection": "i1cc5G_channelSection",
6729
+ "channelControls": "i1cc5G_channelControls",
6730
+ "channelMeta": "i1cc5G_channelMeta",
6731
+ "card": "i1cc5G_card",
6732
+ "editorField": "i1cc5G_editorField",
6733
+ "presetInline": "i1cc5G_presetInline",
6734
+ "modelFetchRow": "i1cc5G_modelFetchRow",
6735
+ "header": "i1cc5G_header",
6736
+ "pending": "i1cc5G_pending",
6737
+ "editorTools": "i1cc5G_editorTools",
6738
+ "readOnly": "i1cc5G_readOnly",
6739
+ "modelRowInputs": "i1cc5G_modelRowInputs",
6740
+ "chevronOpen": "i1cc5G_chevronOpen",
6741
+ "label": "i1cc5G_label",
6742
+ "manualModelRow": "i1cc5G_manualModelRow",
6743
+ "channelHost": "i1cc5G_channelHost"
5305
6744
  };
5306
6745
  //#endregion
5307
6746
  //#region src/client/SettingsCard.tsx
@@ -6553,8 +7992,8 @@ window.__ModuleLoader__.load({
6553
7992
  });
6554
7993
  }
6555
7994
  //#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)}";
7995
+ //#region \0dsh-css:E:\dsh-plugin\src\client\image-toolview.module.css.mjs
7996
+ 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
7997
  const tagId = "@dickpy/dsh-imagegen/image-toolview.module.css";
6559
7998
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
6560
7999
  const tag = document.createElement("style");
@@ -6564,16 +8003,16 @@ window.__ModuleLoader__.load({
6564
8003
  document.head.appendChild(tag);
6565
8004
  }
6566
8005
  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"
8006
+ "loading": "_3eGrYG_loading",
8007
+ "icon": "_3eGrYG_icon",
8008
+ "imageLink": "_3eGrYG_imageLink",
8009
+ "images": "_3eGrYG_images",
8010
+ "status": "_3eGrYG_status",
8011
+ "header": "_3eGrYG_header",
8012
+ "root": "_3eGrYG_root",
8013
+ "image": "_3eGrYG_image",
8014
+ "error": "_3eGrYG_error",
8015
+ "message": "_3eGrYG_message"
6577
8016
  };
6578
8017
  //#endregion
6579
8018
  //#region src/client/image-toolview.tsx