@dickpy/dsh-imagegen 1.5.7 → 1.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/lib/client.js +36358 -845
- package/lib/client.js.map +1 -1
- package/lib/index.js +3 -3
- package/package.json +82 -81
- package/src/canvas-store.ts +376 -375
- package/src/client/CanvasWorkspace.tsx +417 -77
- package/src/client/canvas-workspace.module.css +157 -33
- package/src/client/locales.ts +21 -12
- package/src/protocol.ts +580 -580
|
@@ -130,6 +130,39 @@
|
|
|
130
130
|
opacity: 0.5;
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
/* Interactive fluid flowmap dot field lives in a <canvas>; aurora is pure CSS.
|
|
134
|
+
* Both render themselves at full strength (the 0.5 grid dimming stays off). */
|
|
135
|
+
.flowCanvas {
|
|
136
|
+
position: absolute;
|
|
137
|
+
inset: 0;
|
|
138
|
+
width: 100%;
|
|
139
|
+
height: 100%;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.grid[data-mode="flow"],
|
|
143
|
+
.grid[data-mode="aurora"] {
|
|
144
|
+
opacity: 1;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.grid[data-mode="aurora"] {
|
|
148
|
+
background-image:
|
|
149
|
+
radial-gradient(560px 380px at 22% 28%, color-mix(in srgb, var(--dsw-alias-brand-primary) 24%, transparent), transparent 72%),
|
|
150
|
+
radial-gradient(680px 480px at 78% 62%, rgb(167 139 250 / 20%), transparent 72%),
|
|
151
|
+
radial-gradient(520px 400px at 48% 88%, rgb(34 211 238 / 17%), transparent 74%);
|
|
152
|
+
background-size: 220% 220%;
|
|
153
|
+
background-position: 0% 0%;
|
|
154
|
+
animation: auroraDrift 20s ease-in-out infinite alternate;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
@keyframes auroraDrift {
|
|
158
|
+
from { background-position: 0% 0%; }
|
|
159
|
+
to { background-position: 100% 100%; }
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
@media (prefers-reduced-motion: reduce) {
|
|
163
|
+
.grid[data-mode="aurora"] { animation: none; }
|
|
164
|
+
}
|
|
165
|
+
|
|
133
166
|
.grid[data-mode="dots"] {
|
|
134
167
|
background-image: radial-gradient(circle, color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent) 1.1px, transparent 1.4px);
|
|
135
168
|
}
|
|
@@ -180,7 +213,7 @@
|
|
|
180
213
|
.backgroundMenu button {
|
|
181
214
|
display: flex;
|
|
182
215
|
align-items: center;
|
|
183
|
-
justify-content:
|
|
216
|
+
justify-content: flex-start;
|
|
184
217
|
border: none;
|
|
185
218
|
border-radius: 7px;
|
|
186
219
|
background: transparent;
|
|
@@ -383,6 +416,9 @@
|
|
|
383
416
|
color: var(--dsw-alias-label-tertiary);
|
|
384
417
|
font-size: 12px;
|
|
385
418
|
cursor: pointer;
|
|
419
|
+
/* .nodeBody disables pointer events for node dragging; the upload button
|
|
420
|
+
* inside must opt back in or its onClick never fires. */
|
|
421
|
+
pointer-events: auto;
|
|
386
422
|
}
|
|
387
423
|
|
|
388
424
|
.nodeEmpty:hover {
|
|
@@ -432,45 +468,26 @@
|
|
|
432
468
|
backdrop-filter: blur(10px);
|
|
433
469
|
}
|
|
434
470
|
|
|
471
|
+
/* macOS-dock magnification: the pointermove handler on .dock feeds a gaussian
|
|
472
|
+
* falloff into --dock-scale / --dock-lift, so the hovered icon swells and lifts
|
|
473
|
+
* while neighbours rise and fall like a zipper as the pointer slides across. */
|
|
435
474
|
.dock .iconButton {
|
|
436
475
|
position: relative;
|
|
437
|
-
overflow: hidden;
|
|
438
476
|
width: 40px;
|
|
439
477
|
height: 40px;
|
|
440
478
|
border-radius: 11px;
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
/* water-wave sheen sweeping across + gentle lift on hover */
|
|
445
|
-
.dock .iconButton::before {
|
|
446
|
-
content: '';
|
|
447
|
-
position: absolute;
|
|
448
|
-
top: -4px;
|
|
449
|
-
bottom: -4px;
|
|
450
|
-
left: -150%;
|
|
451
|
-
width: 65%;
|
|
452
|
-
background: linear-gradient(105deg, transparent, color-mix(in srgb, currentColor 26%, transparent), transparent);
|
|
453
|
-
transform: skewX(-18deg);
|
|
454
|
-
opacity: 0;
|
|
455
|
-
pointer-events: none;
|
|
479
|
+
transform: translateY(var(--dock-lift, 0px)) scale(var(--dock-scale, 1));
|
|
480
|
+
transform-origin: 50% 100%;
|
|
481
|
+
transition: transform 0.16s cubic-bezier(0.33, 1, 0.68, 1), background 0.15s ease, color 0.15s ease, box-shadow 0.18s ease;
|
|
456
482
|
}
|
|
457
483
|
|
|
458
484
|
.dock .iconButton:not(:disabled):hover {
|
|
459
|
-
|
|
485
|
+
z-index: 2;
|
|
460
486
|
box-shadow: 0 6px 14px color-mix(in srgb, var(--dsw-alias-label-primary) 20%, transparent);
|
|
461
487
|
}
|
|
462
488
|
|
|
463
|
-
.dock .iconButton:not(:disabled):hover::before {
|
|
464
|
-
animation: dockShine 0.55s ease forwards;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
489
|
.dock .iconButton:not(:disabled):active {
|
|
468
|
-
transform: translateY(-
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
@keyframes dockShine {
|
|
472
|
-
0% { left: -150%; opacity: 1; }
|
|
473
|
-
100% { left: 170%; opacity: 1; }
|
|
490
|
+
transform: translateY(var(--dock-lift, 0px)) scale(0.94);
|
|
474
491
|
}
|
|
475
492
|
|
|
476
493
|
.dock .iconButton[data-active] {
|
|
@@ -553,6 +570,70 @@
|
|
|
553
570
|
max-width: 128px;
|
|
554
571
|
}
|
|
555
572
|
|
|
573
|
+
/* custom dropdown button + popup (styled replacement for native <select>) */
|
|
574
|
+
.composerSelect {
|
|
575
|
+
display: inline-flex;
|
|
576
|
+
align-items: center;
|
|
577
|
+
gap: 6px;
|
|
578
|
+
height: 28px;
|
|
579
|
+
padding: 0 8px 0 11px;
|
|
580
|
+
border-radius: 999px;
|
|
581
|
+
border: 1px solid var(--dsw-alias-border-l1);
|
|
582
|
+
background: transparent;
|
|
583
|
+
color: var(--dsw-alias-label-primary);
|
|
584
|
+
font-size: 11.5px;
|
|
585
|
+
min-width: 0;
|
|
586
|
+
max-width: 138px;
|
|
587
|
+
cursor: pointer;
|
|
588
|
+
transition: background 0.15s ease, border-color 0.15s ease;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
.composerSelect:hover { background: var(--dsw-alias-interactive-bg-hover); }
|
|
592
|
+
.composerSelect[data-open] { border-color: var(--dsw-alias-brand-primary); color: var(--dsw-alias-brand-primary); }
|
|
593
|
+
.composerSelect svg { flex: none; opacity: 0.65; }
|
|
594
|
+
.composerSelect[data-open] svg { opacity: 0.9; }
|
|
595
|
+
|
|
596
|
+
.composerSelectValue {
|
|
597
|
+
overflow: hidden;
|
|
598
|
+
text-overflow: ellipsis;
|
|
599
|
+
white-space: nowrap;
|
|
600
|
+
min-width: 0;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
.composerSelectMenu {
|
|
604
|
+
position: fixed;
|
|
605
|
+
z-index: 95;
|
|
606
|
+
max-height: 264px;
|
|
607
|
+
overflow: auto;
|
|
608
|
+
padding: 5px;
|
|
609
|
+
border-radius: 11px;
|
|
610
|
+
border: 1px solid var(--dsw-alias-border-l1);
|
|
611
|
+
background: color-mix(in srgb, var(--dsw-alias-bg-layer-1) 97%, transparent);
|
|
612
|
+
box-shadow: 0 14px 38px rgb(15 23 42 / 18%);
|
|
613
|
+
backdrop-filter: blur(10px);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
.composerSelectMenu button {
|
|
617
|
+
display: block;
|
|
618
|
+
width: 100%;
|
|
619
|
+
border: none;
|
|
620
|
+
border-radius: 7px;
|
|
621
|
+
background: transparent;
|
|
622
|
+
color: var(--dsw-alias-label-primary);
|
|
623
|
+
font-size: 12.5px;
|
|
624
|
+
line-height: 1.45;
|
|
625
|
+
padding: 7px 10px;
|
|
626
|
+
cursor: pointer;
|
|
627
|
+
text-align: left;
|
|
628
|
+
white-space: nowrap;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
.composerSelectMenu button:hover { background: var(--dsw-alias-interactive-bg-hover); }
|
|
632
|
+
.composerSelectMenu button[data-selected] {
|
|
633
|
+
color: var(--dsw-alias-brand-primary);
|
|
634
|
+
background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);
|
|
635
|
+
}
|
|
636
|
+
|
|
556
637
|
.composerSend {
|
|
557
638
|
margin-left: auto;
|
|
558
639
|
width: 34px;
|
|
@@ -631,6 +712,25 @@
|
|
|
631
712
|
|
|
632
713
|
.handle:hover { background: var(--dsw-alias-brand-primary); }
|
|
633
714
|
|
|
715
|
+
/* The source handle doubles as a quick-add button (hover opens the node
|
|
716
|
+
* picker, drag connects) so it reads as a Dify-style big ⊕. */
|
|
717
|
+
.handleRight {
|
|
718
|
+
display: flex;
|
|
719
|
+
align-items: center;
|
|
720
|
+
justify-content: center;
|
|
721
|
+
width: 20px;
|
|
722
|
+
height: 20px;
|
|
723
|
+
right: -10px;
|
|
724
|
+
font-size: 13px;
|
|
725
|
+
font-weight: 600;
|
|
726
|
+
line-height: 1;
|
|
727
|
+
color: var(--dsw-alias-brand-primary);
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
.handleRight::after { content: '+'; }
|
|
731
|
+
|
|
732
|
+
.handleRight:hover { color: var(--dsw-alias-bg-layer-1); transform: translateY(-50%) scale(1.12); }
|
|
733
|
+
|
|
634
734
|
.resizeHandle {
|
|
635
735
|
position: absolute;
|
|
636
736
|
right: -5px;
|
|
@@ -681,15 +781,13 @@
|
|
|
681
781
|
|
|
682
782
|
.connectionPath {
|
|
683
783
|
fill: none;
|
|
684
|
-
stroke:
|
|
685
|
-
stroke-
|
|
686
|
-
stroke-opacity: 0.85;
|
|
784
|
+
stroke-width: 1.8;
|
|
785
|
+
stroke-opacity: 0.9;
|
|
687
786
|
pointer-events: none;
|
|
688
787
|
}
|
|
689
788
|
|
|
690
789
|
.connectionActive {
|
|
691
|
-
stroke:
|
|
692
|
-
stroke-width: 3;
|
|
790
|
+
stroke-width: 2.6;
|
|
693
791
|
stroke-opacity: 1;
|
|
694
792
|
filter: drop-shadow(0 0 6px color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, transparent));
|
|
695
793
|
}
|
|
@@ -702,6 +800,32 @@
|
|
|
702
800
|
pointer-events: none;
|
|
703
801
|
}
|
|
704
802
|
|
|
803
|
+
/* Flow overlay: a soft light band glides from the path start (source) toward
|
|
804
|
+
* its end (target), echoing the direction of the gradient and arrowhead. */
|
|
805
|
+
.connectionFlow {
|
|
806
|
+
fill: none;
|
|
807
|
+
stroke: var(--dsw-alias-brand-primary);
|
|
808
|
+
stroke-width: 2;
|
|
809
|
+
stroke-linecap: round;
|
|
810
|
+
stroke-dasharray: 30 90;
|
|
811
|
+
opacity: 0.4;
|
|
812
|
+
pointer-events: none;
|
|
813
|
+
animation: connectionFlow 1.6s linear infinite;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
.connectionFlowActive {
|
|
817
|
+
stroke: var(--dsw-alias-brand-primary);
|
|
818
|
+
opacity: 0.85;
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
@keyframes connectionFlow {
|
|
822
|
+
to { stroke-dashoffset: -120; }
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
@media (prefers-reduced-motion: reduce) {
|
|
826
|
+
.connectionFlow { animation: none; opacity: 0.35; }
|
|
827
|
+
}
|
|
828
|
+
|
|
705
829
|
/* --------------------------------------------------------- empty hint */
|
|
706
830
|
|
|
707
831
|
.emptyHint {
|
package/src/client/locales.ts
CHANGED
|
@@ -44,6 +44,8 @@ export const zh = {
|
|
|
44
44
|
'canvas.backgroundLines': '网格线',
|
|
45
45
|
'canvas.backgroundDiagonal': '斜线',
|
|
46
46
|
'canvas.backgroundChecker': '棋盘格',
|
|
47
|
+
'canvas.backgroundFlow': '流体扰动',
|
|
48
|
+
'canvas.backgroundAurora': '极光',
|
|
47
49
|
'canvas.backgroundBlank': '空白',
|
|
48
50
|
'canvas.backgroundUpload': '上传自定义背景…',
|
|
49
51
|
'canvas.backgroundRemove': '移除自定义背景',
|
|
@@ -71,6 +73,7 @@ export const zh = {
|
|
|
71
73
|
'canvas.taskLost': '生成任务已丢失(服务重启),请重试',
|
|
72
74
|
'canvas.emptyImageNode': '点击上传图片',
|
|
73
75
|
'canvas.connectHint': '拖到其他节点建立连线',
|
|
76
|
+
'canvas.connectAddHint': '拖到其他节点建立连线;点击直接添加下一节点',
|
|
74
77
|
'canvas.resizeHint': '拖动调整大小(图片锁定比例)',
|
|
75
78
|
'canvas.count': '生成数量',
|
|
76
79
|
'canvas.configNode': '生成配置',
|
|
@@ -98,10 +101,10 @@ export const zh = {
|
|
|
98
101
|
'canvas.tabUpload': '上传',
|
|
99
102
|
'canvas.tabHistory': '历史记录',
|
|
100
103
|
'canvas.tabGallery': '素材库',
|
|
101
|
-
'canvas.imageMenuUpload': '
|
|
102
|
-
'canvas.imageMenuAssets': '
|
|
103
|
-
'canvas.imageMenuHistory': '
|
|
104
|
-
'canvas.imageMenuGenerate': 'AI
|
|
104
|
+
'canvas.imageMenuUpload': '本地图片',
|
|
105
|
+
'canvas.imageMenuAssets': '素材库',
|
|
106
|
+
'canvas.imageMenuHistory': '历史记录',
|
|
107
|
+
'canvas.imageMenuGenerate': 'AI生成',
|
|
105
108
|
'canvas.tabGenerate': 'AI 生成',
|
|
106
109
|
'canvas.dropHint': '图片拖动到此处即可添加',
|
|
107
110
|
'canvas.dropSub': '支持多选,PNG / JPG / WebP / GIF',
|
|
@@ -555,6 +558,8 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
555
558
|
'canvas.backgroundLines': 'Grid lines',
|
|
556
559
|
'canvas.backgroundDiagonal': 'Diagonal',
|
|
557
560
|
'canvas.backgroundChecker': 'Checkerboard',
|
|
561
|
+
'canvas.backgroundFlow': 'Fluid flow',
|
|
562
|
+
'canvas.backgroundAurora': 'Aurora',
|
|
558
563
|
'canvas.backgroundBlank': 'Blank',
|
|
559
564
|
'canvas.backgroundUpload': 'Upload custom background…',
|
|
560
565
|
'canvas.backgroundRemove': 'Remove custom background',
|
|
@@ -582,6 +587,7 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
582
587
|
'canvas.taskLost': 'Generation task lost (service restarted); please retry',
|
|
583
588
|
'canvas.emptyImageNode': 'Click to upload an image',
|
|
584
589
|
'canvas.connectHint': 'Drag onto another node to connect',
|
|
590
|
+
'canvas.connectAddHint': 'Drag onto another node to connect, or click to add the next node',
|
|
585
591
|
'canvas.resizeHint': 'Drag to resize (image ratio locked)',
|
|
586
592
|
'canvas.count': 'Image count',
|
|
587
593
|
'canvas.configNode': 'Generation config',
|
|
@@ -609,10 +615,10 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
609
615
|
'canvas.tabUpload': 'Upload',
|
|
610
616
|
'canvas.tabHistory': 'History',
|
|
611
617
|
'canvas.tabGallery': 'Assets',
|
|
612
|
-
'canvas.imageMenuUpload': '
|
|
613
|
-
'canvas.imageMenuAssets': '
|
|
614
|
-
'canvas.imageMenuHistory': '
|
|
615
|
-
'canvas.imageMenuGenerate': '
|
|
618
|
+
'canvas.imageMenuUpload': 'Local image',
|
|
619
|
+
'canvas.imageMenuAssets': 'Assets',
|
|
620
|
+
'canvas.imageMenuHistory': 'History',
|
|
621
|
+
'canvas.imageMenuGenerate': 'AI generate',
|
|
616
622
|
'canvas.tabGenerate': 'AI generate',
|
|
617
623
|
'canvas.dropHint': 'Drop images here to add them',
|
|
618
624
|
'canvas.dropSub': 'Multiple files, PNG / JPG / WebP / GIF',
|
|
@@ -1058,6 +1064,8 @@ export const ru: Record<keyof typeof zh, string> = {
|
|
|
1058
1064
|
'canvas.backgroundLines': 'Сетка',
|
|
1059
1065
|
'canvas.backgroundDiagonal': 'Диагональ',
|
|
1060
1066
|
'canvas.backgroundChecker': 'Шахматка',
|
|
1067
|
+
'canvas.backgroundFlow': 'Жидкостный поток',
|
|
1068
|
+
'canvas.backgroundAurora': 'Аврора',
|
|
1061
1069
|
'canvas.backgroundBlank': 'Пустой',
|
|
1062
1070
|
'canvas.backgroundUpload': 'Загрузить свой фон…',
|
|
1063
1071
|
'canvas.backgroundRemove': 'Убрать свой фон',
|
|
@@ -1085,6 +1093,7 @@ export const ru: Record<keyof typeof zh, string> = {
|
|
|
1085
1093
|
'canvas.taskLost': 'Задача генерации потеряна (сервис перезапущен); повторите',
|
|
1086
1094
|
'canvas.emptyImageNode': 'Нажмите, чтобы загрузить изображение',
|
|
1087
1095
|
'canvas.connectHint': 'Потяните к другому узлу, чтобы соединить',
|
|
1096
|
+
'canvas.connectAddHint': 'Потяните к другому узлу, чтобы соединить; клик добавляет следующий узел',
|
|
1088
1097
|
'canvas.resizeHint': 'Потяните, чтобы изменить размер (пропорции зафиксированы)',
|
|
1089
1098
|
'canvas.count': 'Кол-во изображений',
|
|
1090
1099
|
'canvas.configNode': 'Конфигурация генерации',
|
|
@@ -1112,10 +1121,10 @@ export const ru: Record<keyof typeof zh, string> = {
|
|
|
1112
1121
|
'canvas.tabUpload': 'Загрузка',
|
|
1113
1122
|
'canvas.tabHistory': 'История',
|
|
1114
1123
|
'canvas.tabGallery': 'Материалы',
|
|
1115
|
-
'canvas.imageMenuUpload': '
|
|
1116
|
-
'canvas.imageMenuAssets': '
|
|
1117
|
-
'canvas.imageMenuHistory': '
|
|
1118
|
-
'canvas.imageMenuGenerate': '
|
|
1124
|
+
'canvas.imageMenuUpload': 'Локальное изображение',
|
|
1125
|
+
'canvas.imageMenuAssets': 'Материалы',
|
|
1126
|
+
'canvas.imageMenuHistory': 'История',
|
|
1127
|
+
'canvas.imageMenuGenerate': 'AI-генерация',
|
|
1119
1128
|
'canvas.tabGenerate': 'AI-генерация',
|
|
1120
1129
|
'canvas.dropHint': 'Перетащите изображения сюда',
|
|
1121
1130
|
'canvas.dropSub': 'Несколько файлов, PNG / JPG / WebP / GIF',
|