Compare commits

..

621 Commits

Author SHA1 Message Date
Chenlei Hu
5e6e34cfd3 Fix regex handling of folderName 2025-03-17 15:05:24 -04:00
Chenlei Hu
2a445f3f94 workaround placeholder filename 2025-03-17 14:49:21 -04:00
Chenlei Hu
f8dcb915aa nit 2025-03-17 14:12:49 -04:00
Chenlei Hu
11925ce345 Create folder support 2025-03-17 14:09:07 -04:00
Chenlei Hu
90053058ba [Refactor] Support handleAddFolder in TreeExplorer (#3101) 2025-03-17 14:08:23 -04:00
Chenlei Hu
b36f748a78 [nit] Remove unused provide in TreeExplorer (#3100) 2025-03-17 12:26:35 -04:00
Chenlei Hu
d57d12b426 [Refactor] Handle rename in TreeExplorer (#3099) 2025-03-17 12:26:26 -04:00
Christian Byrne
bd1be28478 [Manager] Add progress queue dialog (#3091)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-17 12:16:36 -04:00
Christian Byrne
891e18af8e [Manager] Improve node pack card header style (#3098) 2025-03-17 12:15:34 -04:00
Chenlei Hu
1610d06cd1 [Refactor] Accept single root node in TreeExplorer (#3088) 2025-03-17 10:52:06 -04:00
Comfy Org PR Bot
e3c7bbf966 1.14.0 (#3097)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-17 10:41:08 -04:00
Christian Byrne
0bfbbe838f [Manager] Remove shadows on version selector list (#3094) 2025-03-17 10:39:44 -04:00
Christian Byrne
c82fe80716 Allow rectangular virtual grid items (#3093) 2025-03-17 10:39:02 -04:00
Christian Byrne
ad98bcb87c [Manager] Fix registry search results flashing screen (#3092) 2025-03-17 10:38:08 -04:00
Christian Byrne
652ea15e8b Allow footer component and position props in dialogs (#3090) 2025-03-17 10:37:19 -04:00
Christian Byrne
a7a8cc633b [Manager] Improve node pack card design (#3089) 2025-03-17 10:36:35 -04:00
Comfy Org PR Bot
d23aec4ceb [chore] Update litegraph to 0.10.9 (#3095)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-18 00:21:02 +11:00
Chenlei Hu
8db088b27a Remove duplicated toolbuttons for workflow sidebar (#3087) 2025-03-16 20:18:24 -04:00
samnyan
7ef6e52f38 [nit] add refresh button to workflow sidebar tab (#3062) 2025-03-16 19:46:13 -04:00
Comfy Org PR Bot
edeefe0883 [chore] Update litegraph to 0.10.8 (#3086)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-16 19:18:49 -04:00
MohammadAboulEla
c6046e47d2 Allowing control over domWidgets margin (#3085) 2025-03-16 19:16:11 -04:00
filtered
e8bcccc276 [Test] Update expectation - graph ID (#3083) 2025-03-17 05:29:16 +11:00
Comfy Org PR Bot
7705a09760 1.13.7 (#3082)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-16 11:59:11 -04:00
Christian Byrne
2a860d72b2 [Manager] Wrap manager requests with log wrapper (#3081) 2025-03-16 11:37:17 -04:00
AustinMroz
f583015a14 Fix regression when configuring graph with missing converted input (#3066) 2025-03-16 11:36:42 -04:00
yolain
07f285b05a Fix the litegraph context menu missing prototype after adding translation (#3080) 2025-03-17 01:42:05 +11:00
Christian Byrne
64a0a120b6 Add server logs listener composable (#3074) 2025-03-15 14:42:27 -04:00
Christian Byrne
3956e31810 Fix LoadAudio node (#3065)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-14 21:44:39 -07:00
Comfy Org PR Bot
679f2daa8d 1.13.6 (#3063)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-14 21:26:18 -04:00
Christian Byrne
48ae6f7bf2 [Tests] Add Node Pack toggle component test (#3060) 2025-03-14 21:25:32 -04:00
Christian Byrne
cf732974a9 [Manager] Fix enabled/disabled node pack logic (#3061) 2025-03-14 21:25:07 -04:00
Chenlei Hu
e1179aace0 [nit] Add title to show full text in workflow template dialog (#3058) 2025-03-14 16:23:25 -04:00
Chenlei Hu
866d03b9c4 [i18n] Fix Wan i2v label (#3056)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-14 16:02:02 -04:00
Chenlei Hu
aab1dd8698 [Test] Prune disabled tests (#3052)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-14 14:20:36 -04:00
Chenlei Hu
eff68ae7a8 [Test] Only run chromium-2x test for tagged items (#3050) 2025-03-14 13:57:23 -04:00
Christian Byrne
8be25883cd [Manager] Add suggestions to search (#3041) 2025-03-14 13:24:28 -04:00
Comfy Org PR Bot
c6b3e2a0ed Update locales for node definitions (#3048)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-14 12:08:19 -04:00
Chenlei Hu
bde518fa13 [CI] Update i18n-node-defs GH action (#3047) 2025-03-14 12:08:08 -04:00
Chenlei Hu
c34be53f4d [Bug] Handle null return value from createBounds (#3046) 2025-03-14 12:01:37 -04:00
Christian Byrne
412500ea48 Add pointer events back on video preview widget (#3044) 2025-03-14 11:41:48 -04:00
Christian Byrne
d1c53a2eb5 Fix video preview widget computed min height (#3043)
Co-authored-by: filtered <176114999+webfiltered@users.noreply.github.com>
2025-03-14 11:39:54 -04:00
Christian Byrne
af0d0c6e39 Add Wan 2.1 template title translations (#3042)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-14 11:35:54 -04:00
Comfy Org PR Bot
9f0abac57b [chore] Update litegraph to 0.10.7 (#3039)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-14 16:16:05 +11:00
filtered
24c2f2b712 [chore] Add test expections for Litegraph 0.10.6 (#3038)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-14 13:29:25 +11:00
Comfy Org PR Bot
7450e61b10 [chore] Update litegraph to 0.10.6 (#3037)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-14 12:57:58 +11:00
Christian Byrne
05dd587928 [Manager] Add Algolia search (#3036) 2025-03-13 18:24:38 -07:00
Chenlei Hu
20d2eca51e [Test] Add playwright test on litegraph native reroute (#3033)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-13 21:06:07 -04:00
Chenlei Hu
3b5634623a [Schema] Add floatingLinks to workflow schema (#3034) 2025-03-13 21:05:45 -04:00
Christian Byrne
8f8b5bdcf4 [Manager] Add filtering nodes/packs by 'Installed' or 'All' (#3031)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-13 20:39:27 -04:00
Terry Jia
0cfd6a487a [3d] apply new vue desige (#3018) 2025-03-13 20:37:54 -04:00
Comfy Org PR Bot
744b5fab68 [chore] Update litegraph to 0.10.5 (#3032)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-14 11:29:26 +11:00
Comfy Org PR Bot
56cea8047d 1.13.5 (#3030)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-13 19:49:38 -04:00
Christian Byrne
27fe7f89be Add enable/disable toggle to node pack info panel (#3026) 2025-03-13 19:48:22 -04:00
Christian Byrne
116a11bd58 [Manager] Allow multiple queued callbacks in manager task queue hook (#3027) 2025-03-13 19:45:53 -04:00
Christian Byrne
58be9ad4c3 [Manager] Refactor node pack card footer to separate component (#3028) 2025-03-13 19:45:09 -04:00
Christian Byrne
1605a37679 [Manager] Refactor pack enable toggle (#3029) 2025-03-13 19:44:53 -04:00
Comfy Org PR Bot
c1d17b64b0 [chore] Update litegraph to 0.10.4 (#3025)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-14 09:13:53 +11:00
Chenlei Hu
46fa50f232 [i18n] Add translation to mask editor. (#3024)
Co-authored-by: samnyan <4137880+samnyan@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
2025-03-13 14:14:50 -04:00
Christian Byrne
a7d3a74daa Fix download gated HF models (#3004) 2025-03-13 13:54:40 -04:00
Christian Byrne
8b69b280fa Add node pack actions: install, uninstall, enable, disable, change version (#3016)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-13 13:53:56 -04:00
drozbay
fe5e4e0d8a Fix name of SaveWEBM node for applying output filename text replacements (#3021)
Co-authored-by: ozbayb <17261091+ozbayb@users.noreply.github.com>
2025-03-13 13:52:16 -04:00
Chenlei Hu
067a0ea376 [Bug] Fix absolute path issue for workflow templates (#3020) 2025-03-13 10:57:21 -04:00
Comfy Org PR Bot
661934156c [chore] Update Comfy Registry API types from comfy-api@4b71b92 (#3017)
Co-authored-by: christian-byrne <72887196+christian-byrne@users.noreply.github.com>
2025-03-13 03:37:34 -07:00
Comfy Org PR Bot
e6ccdccce3 1.13.4 (#3012)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-12 21:34:48 -04:00
Chenlei Hu
e1e8fcf62c [TS] Type various WidgetOption props (#3010) 2025-03-12 14:44:50 -04:00
Christian Byrne
d133aeb614 Add Comfy Manager store (#3007) 2025-03-12 12:44:57 -04:00
Christian Byrne
e371880a4e [Style] Remove unused classes (#3005) 2025-03-12 09:36:44 -07:00
Chenlei Hu
bcd76ba49b Vue component multi-select widget (#2987) 2025-03-12 12:03:21 -04:00
dependabot[bot]
aad7ded636 Bump @babel/runtime from 7.24.7 to 7.26.10 (#3002)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-12 11:00:25 -04:00
Christian Byrne
3e8ef33cbc Fetch model metadata for Civitai models embedded in workflows (#2994) 2025-03-12 10:43:15 -04:00
Christian Byrne
0facb0458b Whitelist RealESRGAN_x4Plus model (#2995) 2025-03-12 10:42:19 -04:00
Christian Byrne
fd6aae141a Rename 'ControlNet' template to 'Scribble ControlNet' (#3000) 2025-03-12 10:42:04 -04:00
Christian Byrne
9be090f929 [Style] Improve error message in missing models dialog (#2997) 2025-03-12 10:41:31 -04:00
Chenlei Hu
313f32b094 Wrap widget value in API format workflow (#2989) 2025-03-12 10:00:05 -04:00
Comfy Org PR Bot
d76391b682 1.13.3 (#2990)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-11 21:44:29 -04:00
Chenlei Hu
3c68a1da2c [CI] Directly publish release for main branch release (#2991) 2025-03-11 21:44:14 -04:00
Christian Byrne
3de1ef993e Fix image not shown on PreviewImage (#2988) 2025-03-11 19:30:16 -04:00
Comfy Org PR Bot
29df14f477 [chore] Update litegraph to 0.10.2 (#2984)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-12 04:14:55 +11:00
Comfy Org PR Bot
e4e7d53fcc [chore] Update litegraph to 0.10.1 (#2983)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-12 03:48:42 +11:00
filtered
8fa970ffba Standardise widgets - always initialize y to 0 (#2982) 2025-03-11 11:31:03 -04:00
Chenlei Hu
d4c3685326 [TS] Type Clipspace.widgets (#2981) 2025-03-11 10:49:50 -04:00
Chenlei Hu
ebb030c401 [Bug] Fix mask editor saving (#2979) 2025-03-11 10:13:18 -04:00
Chenlei Hu
db6a25a092 [Bug] Fix overwriting of hideOnZoom widget option (#2978) 2025-03-11 09:57:57 -04:00
Christian Byrne
a90b6519b5 [Style] Remove underline hover effect in custom nodes manager (#2977) 2025-03-11 09:49:20 -04:00
Christian Byrne
c2006412de Fix custom nodes license parsing logic (#2975) 2025-03-11 09:49:09 -04:00
Christian Byrne
a046e00bc3 Add node pack version selector dropdown (#2973)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-11 09:48:25 -04:00
Christian Byrne
b347693f4d Fix manager info panel metadata text (#2971) 2025-03-11 09:47:47 -04:00
Christian Byrne
c4ca694d1d Add composable to manage ComfyUI-Manager task queue (#2970) 2025-03-11 09:47:29 -04:00
Christian Byrne
cd7e2d7b91 Add Comfy Manager service (#2968) 2025-03-11 09:46:21 -04:00
Christian Byrne
46029a5ce3 Add ComfyUI-Manager API types (#2967) 2025-03-11 09:45:43 -04:00
Christian Byrne
4123cb611c [Style] Fix registry search filter dropdown style (#2974) 2025-03-11 06:24:56 -07:00
filtered
03bf81cc1b [Cleanup] Remove redundant reroute opt-in setting (#2972)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-11 23:25:16 +11:00
Comfy Org PR Bot
710bc2bb2e 1.13.2 (#2965)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-10 21:54:08 -04:00
Comfy Org PR Bot
e6ef4c8e6d [chore] Update litegraph to 0.10.0 (#2963)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
Co-authored-by: Chenlei Hu <hcl@comfy.org>
2025-03-10 15:06:01 -04:00
Chenlei Hu
62528fde2e [Refactor] Move DOM widget event listeners to vue (#2960) 2025-03-10 13:07:23 -04:00
Chenlei Hu
abe4754904 Use relative url path for reverse proxy hosting on template thumbnails (#2959) 2025-03-10 10:13:41 -04:00
Christian Byrne
3eb036b5e3 Fix dark mode card surface in workflow templates dialog (#2942) 2025-03-10 09:57:19 -04:00
Tristan Sommer
e29a5d3047 Maskeditor: Added opacity controls for the color select tool and the paint bucket tool (#2955) 2025-03-10 14:05:21 +01:00
Chenlei Hu
9cea1fe0d3 Only update widget state when visible (#2954) 2025-03-09 23:27:48 -04:00
Comfy Org PR Bot
61cf07be88 1.13.1 (#2953)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-09 22:02:05 -04:00
Chenlei Hu
ec013cc511 Draw canvas image preview in a widget (#2952) 2025-03-09 21:56:50 -04:00
dependabot[bot]
60022134ed Bump vue-i18n from 9.13.1 to 9.14.3 (#2951)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-09 20:25:41 -04:00
Chenlei Hu
1558a5bb19 [Refactor] Add useNodeAnimatedImage composable (#2950) 2025-03-09 18:08:03 -04:00
Terry Jia
445be93d50 [3d] extract controls classes (#2948) 2025-03-09 17:32:49 -04:00
dependabot[bot]
4b05d5a8fa Bump axios from 1.7.4 to 1.8.2 (#2949)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-09 17:32:40 -04:00
Chenlei Hu
131229f02f Use uuid for dom widget id (#2947) 2025-03-09 17:22:18 -04:00
Chenlei Hu
3a0b337d0c Manage style of DOM widgets in Vue (#2946) 2025-03-09 16:51:42 -04:00
Christian Byrne
97d9f90374 [Manager] Use iI8n for date strings (#2938) 2025-03-09 13:48:53 -04:00
Christian Byrne
496abfde53 Fix settings content not visible on large font sizes (#2940) 2025-03-09 13:48:27 -04:00
Christian Byrne
72994621a6 Translate template categories (#2937)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-09 13:47:49 -04:00
Christian Byrne
83f9240587 [Manager] Show progress spinner on initial load (#2936) 2025-03-09 13:47:14 -04:00
filtered
ba8c1ee823 Remove legacy code (follow-up on #2925) (#2930) 2025-03-09 13:44:55 -04:00
Terry Jia
3d6fe41ee9 [3d] add edge threshold support (#2939)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-09 13:44:30 -04:00
Comfy Org PR Bot
96b84761f3 1.13.0 (#2929)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-08 21:29:34 -05:00
Comfy Org PR Bot
d32ff0b018 [chore] Update litegraph to 0.10.0-0 (#2928)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-08 21:25:26 -05:00
Chenlei Hu
6e378c68f9 [Bug] Fix load audio node (#2927)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-08 20:17:19 -05:00
Chenlei Hu
65573f106b [Cleanup] Use WidgetOptions.step2 (#2926) 2025-03-08 19:10:33 -05:00
Christian Byrne
d8721760f1 Add custom nodes manager UI (#2923)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-08 18:54:08 -05:00
filtered
f53c04834f Add support for Litegraph LinkConnector (#2925) 2025-03-09 09:37:47 +11:00
Comfy Org PR Bot
50ecefadc1 1.12.8 (#2922)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-07 21:27:31 -05:00
Chenlei Hu
fdc899a7d9 Add __version__ to pypi package (#2919) 2025-03-07 18:32:15 -05:00
Chenlei Hu
fb0a134278 [Bug] Fix widget remove when node is deleted (#2918) 2025-03-07 17:48:37 -05:00
Christian Byrne
082f0061f6 Refactor responsive sidebar to composable (#2917) 2025-03-07 15:46:43 -05:00
MohammadAboulEla
d10dad85c6 Update formatUtil.ts (#2906)
Co-authored-by: filtered <176114999+webfiltered@users.noreply.github.com>
2025-03-07 15:06:26 -05:00
Chenlei Hu
e4659a3930 Move i18n related content to src/locales/README.md (#2916) 2025-03-07 15:04:04 -05:00
Chenlei Hu
91388e8b16 [Test] Add playwright test on connect to dom widget (#2912)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-07 14:24:55 -05:00
Comfy Org PR Bot
d24bbe2d7f [chore] Update litegraph to 0.9.9 (#2914)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-07 13:26:12 -05:00
Chenlei Hu
87c21b45d7 [nit] format fix (#2913) 2025-03-07 13:21:54 -05:00
nmvjhd
8718e20693 Use Built-in VAE for Workflow Generation from Images (#2910)
Co-authored-by: matengfei <matengfei@qiyi.com>
2025-03-07 09:43:31 -05:00
Comfy Org PR Bot
37ae12eb41 [chore] Update Comfy Registry API types from comfy-api@a3897fc (#2907)
Co-authored-by: christian-byrne <72887196+christian-byrne@users.noreply.github.com>
2025-03-07 09:39:04 -05:00
filtered
b546131efb [chore] Update litegraph accessor: isNodeOverInput (#2909) 2025-03-07 21:53:53 +11:00
Comfy Org PR Bot
48fe30a977 [chore] Update litegraph to 0.9.8 (#2908)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-07 21:33:16 +11:00
Comfy Org PR Bot
278555f984 1.12.7 (#2904)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-06 21:41:09 -05:00
Terry Jia
e51dcb9860 [3d] improve lineart (#2903) 2025-03-06 21:35:46 -05:00
Chenlei Hu
5f149ceb30 [BugFix] Sync dom widget store state on widget remove (#2902) 2025-03-06 18:29:30 -05:00
Comfy Org PR Bot
af31937e54 [chore] Update litegraph to 0.9.7 (#2901)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-06 15:53:22 -05:00
Chenlei Hu
d74f47db0b Directly use node.collapsed state in dom widget (#2900) 2025-03-06 13:50:45 -05:00
Chenlei Hu
f7be9157e0 Dom widget store (#2899) 2025-03-06 13:23:58 -05:00
Christian Byrne
caaf050728 Fix animated webp output preview (#2897) 2025-03-06 11:19:48 -05:00
Christian Byrne
367a1c63a5 Fix template dialog double scrollbar (#2896) 2025-03-06 11:17:53 -05:00
Christian Byrne
f0ba48ea22 Trim whitespace in URL form items (#2884) 2025-03-06 11:17:24 -05:00
Comfy Org PR Bot
49964b1c2f 1.12.6 (#2885)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-05 21:32:55 -05:00
Chenlei Hu
aca419e1fb [nit] Remove duplicated declaration on DOMWidget interface (#2883) 2025-03-05 17:34:48 -05:00
Chenlei Hu
e7863676dd [BugFix] Fire resize callback for all dom widgets under the same node (#2882) 2025-03-05 16:59:16 -05:00
Chenlei Hu
a6d54de2a7 Rename 'queue' button to 'run' button (#2881)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-05 14:56:05 -05:00
Chenlei Hu
15e396b4cc [Refactor] Remove app.getWidgetType (#2880) 2025-03-05 14:02:13 -05:00
Chenlei Hu
ba4e4ed0b8 Deprecate widgetType:widgetName key in widgets map (#2879) 2025-03-05 13:32:47 -05:00
Chenlei Hu
35e6cabfe7 Use v2 input spec for combo widget (#2878) 2025-03-05 13:12:51 -05:00
Chenlei Hu
8a479979b1 Use v2 input spec in string widgets (#2877) 2025-03-05 12:48:23 -05:00
Chenlei Hu
1882a9af6f Fix node min size specified by widget constructor (#2876) 2025-03-05 12:09:29 -05:00
Chenlei Hu
c3a984a293 [Test] Add test on load image widget (#2875)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-05 12:09:14 -05:00
Comfy Org PR Bot
4c31d04573 1.12.5 (#2874)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-05 11:20:01 -05:00
Chenlei Hu
621568f99e Fix extension node def manipulation (#2873) 2025-03-05 11:18:58 -05:00
Comfy Org PR Bot
b80c991299 1.12.4 (#2865)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-04 19:46:11 -05:00
Robin Huang
b71952c141 Update uv astral python mirror. (#2863) 2025-03-04 18:53:58 -05:00
Chenlei Hu
680268bb29 Generate json schema for node def (#2862) 2025-03-04 17:40:26 -05:00
Chenlei Hu
d0ce2d2597 [Cleanup] Refactor widget construction (#2861) 2025-03-04 17:40:13 -05:00
Chenlei Hu
6255cea181 Use V2 schema in widget constructors (Part 1) (#2860) 2025-03-04 17:22:13 -05:00
Chenlei Hu
89b73429b7 Add back type guard on string widget (#2859) 2025-03-04 16:52:58 -05:00
bymyself
a415da616c Add Comfy Registry store and search hook (#2848) 2025-03-04 16:33:46 -05:00
Chenlei Hu
05b6f6d8a2 [Cleanup] Remove unused LGraphNode.callback (#2857) 2025-03-04 16:05:12 -05:00
Chenlei Hu
2d179ad632 [Refactor] Use node def v2 in registerNodeDef (#2856) 2025-03-04 12:07:13 -05:00
Chenlei Hu
fe5964ceb6 [Refactor] Use V2 node def in ComfyApp (#2854) 2025-03-04 11:14:14 -05:00
Comfy Org PR Bot
f434610979 [chore] Update litegraph to 0.9.6 (#2855)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-04 10:50:43 -05:00
Chenlei Hu
eceea51800 [Test] Add playwright test on Note and MarkdownNote (#2853)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-04 10:04:03 -05:00
Comfy Org PR Bot
ed4d2aa40c 1.12.3 (#2852)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-04 09:36:26 -05:00
Chenlei Hu
f593f3caa4 [Schema] ComfyNodeDefV2 schema (#2847) 2025-03-04 09:15:16 -05:00
filtered
252e07ad17 [Workaround] Fix #2849 with runtime type guard (#2850) 2025-03-04 23:10:09 +11:00
Chenlei Hu
51aafaec08 [TS] Fix InputSpec type in node constructor (#2846) 2025-03-03 21:26:21 -05:00
Comfy Org PR Bot
85aee9838f 1.12.2 (#2843)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-03 18:49:19 -05:00
bymyself
e8efd0d801 Show templates to first time user (#2841) 2025-03-03 18:49:08 -05:00
bymyself
22f0dcc0a0 Fix handling of templates index.json not found (#2842) 2025-03-03 18:48:30 -05:00
Chenlei Hu
b2f3d85e24 [Cleanup] Remove manual double click delay (#2840) 2025-03-03 17:36:26 -05:00
bymyself
e1f23bf02e Rename SVD templates (#2839) 2025-03-03 17:35:36 -05:00
Chenlei Hu
8affd7eec7 [Cleanup] Remove combo connection type check (#2838) 2025-03-03 17:35:18 -05:00
bymyself
47604e6c2d Add Comfy Registry service (#2836) 2025-03-03 16:58:06 -05:00
Chenlei Hu
30c750f787 [i18n] Ignore devtools nodes for i18n (#2835) 2025-03-03 16:57:52 -05:00
Comfy Org PR Bot
b24bc48102 Update locales for node definitions (#2837)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-03 16:57:43 -05:00
Chenlei Hu
603825b2a0 [Refactor] Add util to merge input spec (#2834) 2025-03-03 15:23:47 -05:00
Comfy Org PR Bot
f76995a3b9 [chore] Update litegraph to 0.9.5 (#2833)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-04 06:34:56 +11:00
Comfy Org PR Bot
21f115c077 [chore] Update litegraph to 0.9.4 (#2832)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-03 13:17:50 -05:00
Chenlei Hu
ca1607024f Add tooltip to selection toolbox items (#2829) 2025-03-03 11:22:18 -05:00
Comfy Org PR Bot
1b14e4086e [chore] Update Comfy Registry API types from comfy-api@dac7ff0 (#2830)
Co-authored-by: christian-byrne <72887196+christian-byrne@users.noreply.github.com>
2025-03-03 11:22:03 -05:00
Miguel C
82a8aba704 [Feature] Add InputKnob component and integrate with FormItem (#2821) 2025-03-03 10:54:16 -05:00
bymyself
a38a11f397 Fix update-registry-types workflow (#2820) 2025-03-03 09:40:18 -05:00
Miguel C
132a0ded09 [Feature] Adds the litegraph knob widget support (#2822) 2025-03-03 09:38:57 -05:00
Dr.Lt.Data
c997bcdba1 refine locales/ko (#2824) 2025-03-03 09:37:31 -05:00
filtered
9f36b9daf3 [Test] Add ComfyMouse fixture for Playwright tests (#2826) 2025-03-04 01:34:42 +11:00
Comfy Org PR Bot
bd8672a04a [chore] Update litegraph to 0.9.3 (#2823)
Co-authored-by: webfiltered <176114999+webfiltered@users.noreply.github.com>
2025-03-03 18:32:49 +11:00
Chenlei Hu
f16ef00055 Re-enable add node / add group tests (#2815)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-02 21:58:43 -05:00
bymyself
8584f982a0 Add workflow to generate comfy registry ts types (#2818) 2025-03-02 21:33:34 -05:00
Chenlei Hu
d37ac3aa16 [TS] Fix input spec types in widgets (#2817) 2025-03-02 21:01:50 -05:00
Chenlei Hu
a8bb6c4daa [Cleanup] Remove unused dependency ts-node (#2813) 2025-03-02 18:53:53 -05:00
Comfy Org PR Bot
5543c969b2 1.12.1 (#2812)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-02 17:16:07 -05:00
Chenlei Hu
b30aac6f98 [CI] Use gh action to update electron types (#2811) 2025-03-02 17:15:16 -05:00
Chenlei Hu
fd4263065b [CI] Use gh action to bump version (#2810) 2025-03-02 17:10:30 -05:00
Comfy Org PR Bot
fee833ddb6 [chore] Update litegraph to 0.9.0 (#2809)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-03-02 17:09:25 -05:00
Chenlei Hu
5b2b3cdacf [CI] Use gh action to update litegraph (#2808) 2025-03-02 16:57:30 -05:00
Chenlei Hu
0386fd7c7d Revert "[nit] Remove hardcoded grid style on body" (#2807) 2025-03-02 15:51:05 -05:00
bymyself
8d515dc309 Use index.json to load workflow templates (#2803) 2025-03-02 15:37:15 -05:00
Chenlei Hu
e6a583e11b [Cleanup] Remove deploy script (#2806) 2025-03-02 15:36:54 -05:00
Chenlei Hu
9431c955a6 [CI] Include workflow templates at build time (#2775) 2025-03-02 15:22:18 -05:00
Chenlei Hu
6303992f4e [CI] Update ComfyUI_frontend_setup_action (#2805) 2025-03-02 15:11:13 -05:00
bymyself
3493a827ee [Docs] Fix example in doc comment (#2804) 2025-03-02 14:22:55 -05:00
Terry Jia
790b284a23 add credit (#2802) 2025-03-02 12:50:22 -05:00
bymyself
224a236896 Fix pasting image from browser on Windows (#2797) 2025-03-02 10:49:57 -05:00
bymyself
0aef39ceee Fix race when creating loader node to handle pasted media (#2799) 2025-03-02 10:49:09 -05:00
Terry Jia
b1713b4c80 [3d] add lineart mode (#2800)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-02 10:48:23 -05:00
Chenlei Hu
699ebe2f93 Update README.md (Release Schedule) (#2796) 2025-03-01 21:39:31 -05:00
Chenlei Hu
f5c21814f9 Remove broken/unused widget[TARGET] (#2795) 2025-03-01 21:26:50 -05:00
Chenlei Hu
ba2797c332 1.12.0 (#2794) 2025-03-01 19:56:47 -05:00
Chenlei Hu
0175db58bb [Type] Add type annotations for widgetInputs litegraph hooks (#2793) 2025-03-01 19:27:21 -05:00
Chenlei Hu
503341b966 Inline numeric widget configurations (#2792) 2025-03-01 18:09:23 -05:00
bymyself
e58fab92d1 Use responsive grid for templates dialog (#2791) 2025-03-01 17:08:41 -05:00
Chenlei Hu
09ab14ac81 [Type] Disallow type upcasting for node input spec (#2790) 2025-03-01 16:58:45 -05:00
filtered
bca0af82a3 [TS] Update type to reflect actual usage (#2788) 2025-03-01 16:44:33 -05:00
bymyself
9b8f9bd597 Allow passthrough to root component when creating dialog (#2787) 2025-03-01 16:43:32 -05:00
filtered
9b5fa95ae2 Update litegraph 0.8.100 (#2786) 2025-03-02 03:51:06 +11:00
Chenlei Hu
1e36b6ef22 [nit] Remove hardcoded grid style on body (#2785) 2025-03-01 11:18:47 -05:00
Chenlei Hu
2b212f9701 S&R improved filename sanitizing (#2784)
Co-authored-by: typpos <28550406+typpos@users.noreply.github.com>
2025-03-01 10:47:42 -05:00
Chenlei Hu
ba4bb5774e [CI] Update frontend install method (#2783) 2025-03-01 10:10:04 -05:00
filtered
b71a851a35 [TS] Use Litegraph strict narrowed type (#2781) 2025-03-01 21:52:34 +11:00
Chenlei Hu
8bcf9e8640 [Cleanup] Remove unused babel dependency (#2780) 2025-02-28 22:21:22 -05:00
Chenlei Hu
a814f9f902 [Test] Run unittest with vitest (#2779) 2025-02-28 22:09:17 -05:00
Chenlei Hu
7d92e453ef 1.11.6 (#2778) 2025-02-28 20:16:57 -05:00
Chenlei Hu
a244f295a6 Remove server elements from unit tests (#2777) 2025-02-28 20:01:40 -05:00
Chenlei Hu
3e54146afd [CI] Refactor test-ui gh action (#2776) 2025-02-28 19:46:57 -05:00
Chenlei Hu
3b051a11a4 [CI] Publish comfyui-frontend-package to pypi (#2774) 2025-02-28 18:22:42 -05:00
bymyself
792c5f2246 Load workflows from webm files (#2772)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-28 16:00:02 -05:00
Chenlei Hu
96768bba97 1.11.5 (#2762) 2025-02-27 19:34:20 -05:00
Chenlei Hu
fc39ce9624 Rewrite/Test rounding logic of numeric widgets (#2758) 2025-02-27 17:52:16 -05:00
Chenlei Hu
cb4a5b88fc Remove magic 10% scale on numeric widget step (#2759) 2025-02-27 16:56:22 -05:00
Chenlei Hu
b685eba689 Update litegraph 0.8.99 (#2761) 2025-02-27 16:30:17 -05:00
bymyself
8775c1d930 Add video_upload to combo input schema (#2760) 2025-02-27 16:22:14 -05:00
Chenlei Hu
1dab413473 [Schema] Expose input options types (#2757) 2025-02-27 14:22:42 -05:00
Chenlei Hu
1d95d639e9 [Refactor] Extract nodeDefSchema from apiSchema (#2756) 2025-02-27 13:39:23 -05:00
bymyself
e380d792c7 Support models metadata in node properties (#2754) 2025-02-27 13:25:16 -05:00
bymyself
0910d485fd [Test] Fix flaky optional combo test (#2755) 2025-02-27 11:13:38 -07:00
Chenlei Hu
cdf42d5ad7 [Refactor] Move zod schemas to schemas/ folder (#2753) 2025-02-27 13:05:01 -05:00
Chenlei Hu
96f02dbf80 [Refactor] Use util.clone in mergeIfValid (#2752) 2025-02-27 11:47:56 -05:00
bymyself
f9157ee05f Update workflow schema to include node pack ID and version (#2751) 2025-02-27 11:15:31 -05:00
Terry Jia
cb6f2e4398 [3d] fix preview camera not sync up issue (#2747) 2025-02-27 08:42:07 -05:00
bymyself
71f3f720bf Lower floor on max history items setting (#2748) 2025-02-27 08:41:50 -05:00
Chenlei Hu
d1fead298f [Revert] Restrict applyToGraph to PrimitiveNode (#2746) 2025-02-26 22:29:13 -05:00
Chenlei Hu
0bc66965f0 [Cleanup] Remove LiteGraph global type declarations (#2745) 2025-02-26 21:50:41 -05:00
Terry Jia
e843f53799 [3d] temp fix preview camera not sync up (#2743) 2025-02-26 21:39:19 -05:00
Chenlei Hu
0259befcdd 1.11.4 (#2744) 2025-02-26 20:20:53 -05:00
Chenlei Hu
3662938080 Update litegraph 0.8.98 (#2742) 2025-02-26 20:10:10 -05:00
Chenlei Hu
ab9c65f28b Type widgetInputs (#2741) 2025-02-26 18:01:56 -05:00
Chenlei Hu
bdfa2efa50 [BugFix] Remove outputs.animated in queueStore (#2740) 2025-02-26 16:04:01 -05:00
Silver
1c408d2f6a replace colorSelect.png cursor (#2738) 2025-02-26 14:13:50 -05:00
bymyself
76818b54e6 Fix widget label extraction (#2737) 2025-02-26 13:44:05 -05:00
Chenlei Hu
2d41aed051 [BugFix] Properly update color button color on first selection (#2736) 2025-02-26 13:43:09 -05:00
bymyself
237b895e8b Add thumbnails for workflow templates (#2729)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-26 10:39:27 -05:00
bymyself
e2087d2a7b Add node to default/tutorial workflow with link to getting started page of docs (#2734) 2025-02-26 10:35:40 -05:00
bymyself
74e8852958 Fix combo values from optional inputs not changed when refreshing (#2733) 2025-02-26 10:35:22 -05:00
Chenlei Hu
3c196f8f97 1.11.3 (#2731) 2025-02-25 21:40:17 -05:00
Chenlei Hu
6dbdde6491 Update litegraph 0.8.97 (#2730) 2025-02-25 21:40:07 -05:00
Chenlei Hu
a784abef0d Type INodeOutputSlot widget hack on PrimitiveNode (#2728) 2025-02-25 19:34:23 -05:00
filtered
c20ea0c523 [TS] Add null check in graph to prompt (#2727) 2025-02-25 13:39:46 -05:00
filtered
101e8dea11 [TS] Update type to match strict Litegraph (#2726) 2025-02-26 04:00:55 +11:00
Chenlei Hu
156013aa24 [Reland] Restrict applyToGraph to PrimitiveNode (#2724) 2025-02-25 10:54:21 -05:00
Comfy Org PR Bot
1a7145fbc9 Update locales for node definitions (#2723)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-02-25 10:24:09 -05:00
Terry Jia
956b9609fd [3d] disable depth mode (#2720) 2025-02-25 10:05:10 -05:00
filtered
51c16a4f56 [TS] Add null check in paste handler (#2722) 2025-02-25 22:45:37 +11:00
filtered
417a089186 [Refactor] Use more explicit types in usePaste (#2721) 2025-02-25 21:52:47 +11:00
Chenlei Hu
f5cec41130 [i18n] Translate button widget labels (#2719)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-24 20:31:14 -05:00
Chenlei Hu
d3dda14267 Update litegraph 0.8.95 (#2718) 2025-02-24 19:48:44 -05:00
Chenlei Hu
3a63b9eb56 1.11.2 (#2717) 2025-02-24 18:41:10 -05:00
bymyself
aabd409bf7 Add copy paste audio files onto LoadAudio nodes or canvas (#2716) 2025-02-24 16:37:03 -05:00
Terry Jia
7f98342492 [3d] some general improvement (#2714) 2025-02-24 14:57:36 -05:00
Chenlei Hu
1a9d6aca7d [nit] Fix import path (#2715) 2025-02-24 14:57:20 -05:00
bymyself
15785fea68 Add drag and drop audio files onto LoadAudio nodes (#2710)
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-02-24 14:05:44 -05:00
bymyself
d340e634a8 [Refactor] Move node composables to subfolder (#2712) 2025-02-24 14:04:16 -05:00
bymyself
9cb993cd3d [CodeHealth] Remove unused var (#2713) 2025-02-24 14:03:52 -05:00
Chenlei Hu
2ac67f2dd0 Add tooltip show-delay in action bar (#2709) 2025-02-24 11:22:26 -05:00
Chenlei Hu
96ba2b4564 Allow quitting instant queue mode with the stop button (#2708) 2025-02-24 11:20:34 -05:00
bymyself
05bd64820d Fix node videos when preview format setting is set (#2706) 2025-02-24 10:49:45 -05:00
bymyself
a35071fcb2 Add previewMediaType flag for simpler node preview rendering (#2694)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-24 10:48:55 -05:00
bymyself
37d4cc974b Cleanup node's file input elements on node removal (#2703)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-24 10:45:27 -05:00
bymyself
81102604f5 Type addDOMWidget (#2705) 2025-02-24 10:32:43 -05:00
filtered
97f9d654b6 [TS] Fix nullability (#2702)
`LGraphCanvas.graph` may explicity set to null by litegraph.
2025-02-24 22:00:19 +11:00
Terry Jia
822a8e02f8 [3d] add missing i18n (#2700)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-23 23:50:13 -05:00
Chenlei Hu
eb951c9cf9 Show image size (W x H) on image nodes (#2699) 2025-02-23 19:52:58 -05:00
Chenlei Hu
e98fda31ba 1.11.1 (#2698) 2025-02-23 18:48:47 -05:00
Chenlei Hu
78e4537fc2 Update litegraph 0.8.94 (#2697) 2025-02-23 18:47:45 -05:00
filtered
436b952c59 [Refactor] Simplify & document graphToPrompt (#2696) 2025-02-23 16:18:06 -05:00
bymyself
2ed3e59135 Type widget.options.serialize (#2692)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-23 13:14:20 -05:00
bymyself
c7ac0b8325 [Tests] Update test expectations (#2693)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-23 12:57:25 -05:00
bymyself
e7420fe2e3 Translate runtime-generated widget labels (#2688) 2025-02-23 10:16:25 -05:00
Terry Jia
d033640927 [3d] redesign UI (#2686)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-02-23 10:14:52 -05:00
bymyself
6f3b99209e Don't serialize file upload and video preview widgets (#2689) 2025-02-23 10:12:45 -05:00
bymyself
f7ee6861f1 Translate control before/after generate labels (#2690)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-23 10:09:06 -05:00
Chenlei Hu
8dcf7eca74 1.11.0 (#2685) 2025-02-22 19:22:19 -05:00
bymyself
f94831d054 Add node video previews (#2635) 2025-02-22 18:37:42 -05:00
Terry Jia
c502b86c31 [3d] refactor load3d nodes (#2683)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-22 18:36:47 -05:00
Chenlei Hu
86b65d481a 1.10.10 (#2679) 2025-02-21 23:30:06 -05:00
Chenlei Hu
064e982f01 Revert "[Refactor] Extract RerouteNode as a separate file" (#2678) 2025-02-21 22:57:19 -05:00
Chenlei Hu
f43eac7c71 Revert "Restrict applyToGraph to PrimitiveNode" (#2677) 2025-02-21 22:56:51 -05:00
bymyself
d7c9a43aba [Docs] Add id to details tag in README.md (#2676) 2025-02-21 22:36:55 -05:00
Chenlei Hu
dee3f5824a 1.10.9 (#2673) 2025-02-21 20:19:29 -05:00
Chenlei Hu
9b88909caa [Extension] Selection toolbox API (#2672) 2025-02-21 19:25:30 -05:00
Chenlei Hu
3fa512957c [CI] Enable release on LTS branches (#2671) 2025-02-21 16:36:17 -05:00
Chenlei Hu
b012f243b3 Only show delete in selection toolbox for reroute (#2670) 2025-02-21 16:03:36 -05:00
Chenlei Hu
6cb33d9431 Restrict applyToGraph to PrimitiveNode (#2669) 2025-02-21 15:53:33 -05:00
Chenlei Hu
85d04f6814 [Refactor] Extract RerouteNode as a separate file (#2668) 2025-02-21 15:04:47 -05:00
Chenlei Hu
40da43861e [Refactor] Move Widget.beforeQueued invocation from graphToPrompt to queuePrompt (#2667) 2025-02-21 14:18:11 -05:00
Chenlei Hu
40deb19634 [Cleanup] Remove upstreamed litegraph types (#2666) 2025-02-21 13:39:13 -05:00
Chenlei Hu
abfc7481d3 Remove 'clean' param from graphToPrompt (#2665) 2025-02-21 12:01:26 -05:00
Chenlei Hu
ec94811637 [Refactor] Move app.graphToPrompt to executionUtil (#2664) 2025-02-21 11:41:25 -05:00
Chenlei Hu
cea5a4a3dd Update litegraph 0.8.92 (#2662) 2025-02-21 09:28:43 -05:00
Chenlei Hu
0937c1f2cd 1.10.8 (#2659) 2025-02-20 20:14:32 -05:00
Chenlei Hu
8074d797b0 [BugFix] Fix incorrect selection overlay after drag (#2658) 2025-02-20 20:12:42 -05:00
Terry Jia
c3c6ec627b [3d] support using image as background (#2657)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-20 20:05:54 -05:00
Chenlei Hu
02d77002c9 Update litegraph to 0.8.91 (#2654)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-20 14:43:51 -05:00
Chenlei Hu
3e31045fbb [BugFix] Properly trigger onClose hook in dialogService (#2655) 2025-02-20 14:42:52 -05:00
Chenlei Hu
78146c86f4 [BugFix] Copy LGraphCanvas.ds on serialization (#2653) 2025-02-20 10:25:17 -05:00
bymyself
365fd1e047 Fix error translating legacy setting options (#2648) 2025-02-20 10:12:46 -05:00
filtered
fbb6c2f825 Update issue report image (#2647) 2025-02-20 16:29:21 +11:00
bymyself
9c7d86ee49 Update issue report template (#2645) 2025-02-19 22:46:22 -05:00
filtered
bc43cf0290 [CI] Always test LTS branches (#2641)
- Adds core/* and desktop/* to CI testing worfklows
2025-02-20 13:51:17 +11:00
Chenlei Hu
45c59f9e84 1.10.7 (#2639) 2025-02-19 17:45:05 -05:00
Terry Jia
014a65411e [3d] flash preview screen border if reach out limitation (#2638) 2025-02-19 15:49:36 -05:00
Chenlei Hu
6c6d86a30b Selection toolbox color picker button (#2637)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-19 15:25:46 -05:00
filtered
08a6867c00 [Desktop] Offer Troubleshoot page instead of Reinstall on start error (#2623)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-19 10:30:23 -05:00
filtered
dbbe67dfcd [Desktop] Fix missing git logo in troubleshooting (#2633) 2025-02-19 10:29:48 -05:00
bymyself
40fa1d37bc Fix pasting image that was copied from browser (#2630) 2025-02-19 10:27:58 -05:00
filtered
0d6bc669f5 [Desktop] Fix invalid type assertion in API (#2631) 2025-02-19 21:59:17 +11:00
Chenlei Hu
e4444d4074 1.10.6 (#2628) 2025-02-18 20:33:58 -05:00
Chenlei Hu
cbf5dff633 Update litegraph 0.8.87 (#2625)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-18 20:25:17 -05:00
Chenlei Hu
9de8450deb Update test expectations (#2627)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-18 20:25:06 -05:00
Chenlei Hu
3b0e3d635b [BugFix] Fix node color for custom light themes (#2621)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-18 19:08:34 -05:00
Chenlei Hu
d1a682bc01 [Refactor] Extract color selector as component (#2620) 2025-02-18 15:28:17 -05:00
Terry Jia
01ffc9e4eb [3d] allow using mouse wheel to adjust preview screen size (#2619) 2025-02-18 14:59:43 -05:00
Chenlei Hu
54e42178f7 1.10.5 (#2617) 2025-02-18 12:26:27 -05:00
Chenlei Hu
25e5ab3a36 Add bypass action to selection toolbox (#2616) 2025-02-18 12:25:49 -05:00
Chenlei Hu
28dd6a2702 Update litegraph 0.8.85 (#2615) 2025-02-18 11:51:36 -05:00
bymyself
3b3df250cd Add refresh button to selecton toolbox (#2612) 2025-02-18 11:39:43 -05:00
bymyself
6441a86619 [Style] Update toolbox style (#2614) 2025-02-18 11:34:06 -05:00
Chenlei Hu
79db202925 [New Feature] Selection Toolbox (#2608)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-17 19:07:49 -05:00
Chenlei Hu
f7556e0015 Add DeleteSelectedItems command (#2606) 2025-02-17 17:16:12 -05:00
bymyself
141e64354c Support batch image upload (#2597) 2025-02-17 13:56:21 -05:00
bymyself
79452ce267 Fix extraneous values in template workflows (#2605) 2025-02-17 13:55:29 -05:00
Chenlei Hu
4d8a5eacba 1.10.4 (#2604) 2025-02-17 10:13:43 -05:00
bymyself
8f5a9a50aa Remove duplicate outpaint template (#2602)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-02-17 10:12:09 -05:00
Margen67
7bc48c5074 Formatting/cleanup (#2594) 2025-02-17 10:10:00 -05:00
Dr.Lt.Data
e04ea07774 refine locales/ko (#2600) 2025-02-17 10:09:09 -05:00
bymyself
75af956279 Fix gallery navigator icons (#2601) 2025-02-17 10:08:46 -05:00
bymyself
434a2307a2 Remove lora dependency from flux canny template (#2603) 2025-02-17 10:08:16 -05:00
filtered
336b3caf9a [Desktop] Update uv cache clear task to show terminal (#2598) 2025-02-17 23:33:34 +11:00
filtered
c757fbaeb4 [Test] Fix unnecessary circular reference (#2596) 2025-02-17 20:18:26 +11:00
Chenlei Hu
fd27b3d580 Fix title editor font size (#2593) 2025-02-16 21:48:02 -05:00
Chenlei Hu
0658698a13 Selection Overlay (#2592) 2025-02-16 21:23:07 -05:00
Terry Jia
b2375a150c [3d] fully convert load 3d nodes into vue (#2590) 2025-02-16 20:15:49 -05:00
Chenlei Hu
9ebb5b2a0c 1.10.3 (#2591) 2025-02-16 20:14:50 -05:00
Chenlei Hu
d6a5deccd8 [Refactor] useAbsolutePosition composable (#2589) 2025-02-16 15:39:58 -05:00
Chenlei Hu
3f4d11c63a Inplace widget to input conversion (#2588)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-16 13:41:32 -05:00
Margen67
44498739fc Update setup-node to v4 (#2587) 2025-02-16 13:14:01 -05:00
dependabot[bot]
764ec9f7d0 Bump vite from 5.4.6 to 5.4.14 (#2585)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-16 11:23:17 -05:00
bymyself
e3234aa0aa Normalize translation keys in template card component (#2574)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-16 10:17:49 -05:00
bymyself
df11c99393 Refactor node image upload and preview (#2580)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-16 10:09:02 -05:00
Chenlei Hu
317ea8b932 1.10.2 (#2583) 2025-02-16 09:49:25 -05:00
bymyself
108884a304 Replace "clip" with "text_encoders" in template workflows (#2572) 2025-02-16 09:39:10 -05:00
bymyself
9f1992ca59 Change title of pose ControlNet template workflow (#2573) 2025-02-16 09:38:18 -05:00
bymyself
39f245fd97 Remove interchangeable models from template workflows (#2575) 2025-02-16 09:36:34 -05:00
bymyself
2d2fa5bfe9 Fix incorrect link in template workflow (#2579) 2025-02-16 09:35:54 -05:00
Terry Jia
bfb1b80cd7 [3d] bug fix for unable click vue button (#2581) 2025-02-16 09:35:20 -05:00
bymyself
0c8bfb4650 Add stable zero model url to whitelist (#2577) 2025-02-16 08:42:50 -05:00
bymyself
f69180cd84 Move node field to tags in error report (#2570)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-15 21:50:54 -05:00
Chenlei Hu
2ac177caeb 1.10.1 (#2569) 2025-02-15 19:34:13 -05:00
bymyself
77d3e0c45e Add ComfyUI Examples workflows to in-app templates (#2541)
Co-authored-by: jojodecayz <121620462+jojodecayz@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
2025-02-15 16:15:56 -05:00
Chenlei Hu
00dceb880a Update litegraph 0.8.81 (#2568) 2025-02-15 15:06:21 -05:00
Chenlei Hu
acea173ba0 [BugFix] Set height to 0 for hidden widgets on GroupNode (#2566) 2025-02-15 12:24:38 -05:00
Chenlei Hu
bcedd5f4ed [Style] Show right arrow on nested submenu item (#2564) 2025-02-15 11:18:46 -05:00
Chenlei Hu
168ea05f81 [Style] Highlight active workflow item in the workflow sidebar (#2563) 2025-02-15 11:01:47 -05:00
Chenlei Hu
370ad7a4f9 1.10.0 (#2562) 2025-02-15 09:59:56 -05:00
Hiroaki Ogasawara
b9cfa70dcd chore: Add type augmentations for litegraph and enable copying of DTS (#2560) 2025-02-15 09:57:27 -05:00
Chenlei Hu
c15201bfe2 [Cleanup] Remove unused imports in domWidget (#2559) 2025-02-14 22:09:27 -05:00
Chenlei Hu
0e2ce5e1ca Upstream widgets layout to litegraph (#2557) 2025-02-14 19:40:31 -05:00
Chenlei Hu
5dc4a1b9cd Update litegraph 0.8.79 (#2556)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-14 14:42:53 -05:00
Chenlei Hu
acfb95f8d4 Use LGraphNode.setSize (#2555) 2025-02-14 11:02:56 -05:00
Chenlei Hu
f2065777b5 1.9.17 (#2553) 2025-02-14 09:58:19 -05:00
Yuki Shindo
b8b1e58172 [keybinding-panel] Include label in filter fields for multilingual search (#2549) 2025-02-14 09:48:44 -05:00
bymyself
2e86393378 Add null checks to widget constructor options (#2552) 2025-02-14 09:48:07 -05:00
bymyself
530ca75dd0 Fix remote widget undefined arg (#2551) 2025-02-14 09:47:18 -05:00
Chenlei Hu
f9c2db5908 Type LGraphNode.addDOMWidget (#2548) 2025-02-13 15:15:21 -05:00
Chenlei Hu
166ad432f3 [Refactor] Generalize dom widget layout as Widget.computeLayoutSize hook (#2547) 2025-02-13 14:30:46 -05:00
Chenlei Hu
174754e646 [Refactor] Extract widget layout logic (#2545) 2025-02-13 11:43:40 -05:00
Chenlei Hu
43dd457bf5 1.9.16 (#2546) 2025-02-13 11:03:16 -05:00
Yuki Shindo
625aa9bd11 Improve Japanese Text for Enhanced Readability (#2542) 2025-02-12 20:58:05 -05:00
Chenlei Hu
f791322ddb Revert "[Cleanup] Remove unused hooks on DOMWidget" (#2543) 2025-02-12 20:57:38 -05:00
Chenlei Hu
89812ce7d0 [Cleanup] Remove unused hooks on DOMWidget (#2540) 2025-02-12 19:41:06 -05:00
Chenlei Hu
c7aaa2a45d Type Widget.computedHeight (#2539) 2025-02-12 16:50:30 -05:00
Chenlei Hu
8bb785c5e4 Show convert to widget option slot context menu (#2538) 2025-02-12 16:07:19 -05:00
Chenlei Hu
a861a070d0 Remove horizontal layout of reroute node (#2532) 2025-02-12 14:43:34 -05:00
Chenlei Hu
108e37deca 1.9.15 (#2535) 2025-02-12 14:19:15 -05:00
Chenlei Hu
9082903956 [Style] Fix pointer events on graph canvas panel content (#2534) 2025-02-12 14:11:54 -05:00
Chenlei Hu
2cb9d4dd1c 1.9.14 (#2531) 2025-02-12 11:16:05 -05:00
bymyself
46f0733ae7 Ignore reserved keybindings when typing in text input (#2514)
Co-authored-by: filtered <176114999+webfiltered@users.noreply.github.com>
2025-02-12 11:15:19 -05:00
Chenlei Hu
150b4341b2 Update litegraph 0.8.77 (#2530) 2025-02-12 11:11:05 -05:00
bymyself
054f8f6838 Move install directory selection tooltip to not block buttons (#2527) 2025-02-12 10:02:56 -05:00
bymyself
9fd73873b6 [Desktop] Re-run path validation when re-focusing installation location input (#2528) 2025-02-12 10:02:42 -05:00
bymyself
bfec9b692b Add keybind hint to confirm close dialog (#2529)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-12 10:02:27 -05:00
Terry Jia
29cd693335 [3d] add tooltip (#2524)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-11 22:28:24 -05:00
Chenlei Hu
4f6891a5ad [Cleanup] Remove legacy settings dialog CSS (#2525) 2025-02-11 21:55:21 -05:00
Chenlei Hu
ca2aee296a [Cleanup] Remove unnecessary pointer-event-auto (#2523) 2025-02-11 21:41:47 -05:00
Chenlei Hu
9017513979 [Refactor] Manage comfyui-body elements with Vue (#2522)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-11 18:37:08 -05:00
Terry Jia
8cfe814daa [3d] refactor load3d (#2521) 2025-02-11 17:43:36 -05:00
Chenlei Hu
c901d5f659 1.9.13 (#2520) 2025-02-11 13:40:17 -05:00
Chenlei Hu
1263fbb4ad Enable ts-strict for scripts/widgets.ts (#2519) 2025-02-11 12:38:24 -05:00
Chenlei Hu
8db101c1cb [Type] Mark app as required arg for ComfyWidgetConstructor (#2518) 2025-02-11 11:39:23 -05:00
Chenlei Hu
efe7843469 [Refactor] useComboWidget composable (#2517) 2025-02-11 11:17:09 -05:00
Chenlei Hu
cfa46ebacb [Refactor] useBooleanWidget composable (#2516) 2025-02-11 11:05:58 -05:00
Chenlei Hu
ab305059bc [Refactor] useImageUploadWidget composable (#2515) 2025-02-11 10:50:55 -05:00
bymyself
cd8c0d2865 Add refresh button to remote (lazy) widgets (#2494) 2025-02-11 10:31:32 -05:00
bymyself
6a9d309818 Increase width of actionbar drag handle (#2511) 2025-02-11 10:29:26 -05:00
bymyself
e3f226e483 Fix actionbar has drag preview (#2512) 2025-02-11 10:28:56 -05:00
bymyself
8822edaf24 Improve settings dialog accessibility (#2513) 2025-02-11 10:28:41 -05:00
Chenlei Hu
44b9a477b1 [Refactor] useMarkdownWidget composable (#2510) 2025-02-11 00:12:29 -05:00
bymyself
e4f8d4b8d0 Add support for image_folder field in node image input spec (#2509) 2025-02-11 00:12:03 -05:00
Chenlei Hu
a93f57eeb2 [Refactor] useSeedWidget composable (#2508) 2025-02-10 23:55:59 -05:00
Chenlei Hu
0c2879b6f4 [Refactor] useIntWidget composable (#2507) 2025-02-10 23:07:57 -05:00
Chenlei Hu
d8d46f8cf6 1.9.12 (#2506) 2025-02-10 22:17:12 -05:00
Chenlei Hu
1a06c91ed1 [BugFix] Workaround custom nodes expectation on DOMWidget.value (#2505) 2025-02-10 22:06:20 -05:00
Chenlei Hu
d4122a7510 [Refactor] useFloatWidget composable (#2504) 2025-02-10 22:06:11 -05:00
Chenlei Hu
b4c59ffae1 [Refactor] useStringWidget composable (#2503) 2025-02-10 19:49:00 -05:00
Chenlei Hu
46428cbf7d [Cleanup] Rename remoteWidgetHook (#2500) 2025-02-10 18:12:15 -05:00
filtered
2d759aa9e3 Fix element style override CSS in #2499 (#2501) 2025-02-10 18:11:32 -05:00
Chenlei Hu
08e613e468 Enable ts-strict for scripts/domWidgets (#2499) 2025-02-10 17:20:30 -05:00
Chenlei Hu
8052b2a02a Type LGraphNode.getInnerNodes (#2498) 2025-02-10 16:35:26 -05:00
Chenlei Hu
0479b112c1 1.9.11 (#2497) 2025-02-10 15:31:17 -05:00
Chenlei Hu
d7a0ee8703 Update litegraph 0.8.76 (#2496)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-10 15:30:46 -05:00
Chenlei Hu
9051ab8d7a Type domWidget computeSize (#2495) 2025-02-10 12:58:40 -05:00
Terry Jia
aaca5191ab Light fov UI change (#2492) 2025-02-10 11:23:33 -05:00
Chenlei Hu
9707a30d0e 1.9.10 (#2491) 2025-02-09 23:39:57 -05:00
Chenlei Hu
e100041db4 Update litegraph 0.8.75 (#2490) 2025-02-09 23:39:27 -05:00
Chenlei Hu
21718d9da2 1.9.9 (#2486) 2025-02-09 20:50:47 -05:00
Chenlei Hu
2b4c594b21 Update litegraph 0.8.74 (#2485) 2025-02-09 20:26:58 -05:00
Chenlei Hu
00abd885c9 [Refactor] ES6 DOMWidget class (#2482) 2025-02-09 20:20:51 -05:00
bymyself
550a9d04c5 Fix color and slider settings types to inherit attrs (#2483) 2025-02-09 20:18:09 -05:00
bymyself
eeb1c34ada Update public API syntax of remote (lazy) widgets (#2477)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-09 12:41:14 -05:00
Terry Jia
83cc49a42b [3d] use vue to rewrite the UI for load3d (#2467) 2025-02-09 12:05:42 -05:00
Chenlei Hu
91a3d1228e Reference specific ComfyUI_devtools in CI (#2479) 2025-02-09 12:00:26 -05:00
Chenlei Hu
3d59d478b6 [Desktop] Fix torch mirror setting (#2475) 2025-02-08 21:08:23 -05:00
Chenlei Hu
4dd292252e 1.9.8 (#2474) 2025-02-08 18:31:16 -05:00
Chenlei Hu
0d307ff587 Update litegraph 0.8.73 (#2472) 2025-02-08 17:58:39 -05:00
Chenlei Hu
88a969df07 Update litegraph 0.8.72 (#2470) 2025-02-08 17:51:37 -05:00
Dr.Lt.Data
9e37738dc8 refine locales/ko (#2469) 2025-02-08 17:31:26 -05:00
Chenlei Hu
9b97abad57 1.9.7 (#2466) 2025-02-08 12:11:24 -05:00
Chenlei Hu
67fcb4fed4 Update litegraph 0.8.71 (#2465) 2025-02-08 12:10:44 -05:00
bymyself
a914456827 Add support for new COMBO input spec and lazy/remote COMBO widgets (#2422) 2025-02-07 15:35:42 -05:00
Chenlei Hu
340513e27f Type INodeSlot.widget (#2463) 2025-02-07 14:33:21 -05:00
bymyself
117c8be3a0 Use fp16 safetensors model in default/fallback workflow (#2433)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-06 19:47:14 -05:00
Chenlei Hu
68f6d51ad2 [i18n] Translate clipboard toast messages (#2462)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-06 15:34:15 -05:00
Chenlei Hu
2da23fd373 [Refactor] Extract litegraph settings sync to a composable (#2461) 2025-02-06 15:21:11 -05:00
Chenlei Hu
7ddcac88d7 [Refactor] Upstream drag zoom feature to litegraph (#2459) 2025-02-06 14:54:36 -05:00
Chenlei Hu
40a817bb0f 1.9.6 (#2460) 2025-02-06 14:48:57 -05:00
filtered
774ed4178f [Cleanup] Fix file and variable names to match usage (#2458) 2025-02-06 14:48:24 -05:00
filtered
78e4161c51 [Refactor] Terminal output drawer shared component (#2457) 2025-02-06 14:33:12 -05:00
filtered
dda9a72966 [Desktop] Add desktop updating page (#2454)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-06 14:23:51 -05:00
Chenlei Hu
d7673af8f5 [Refactor] Move resetView to litegraphService (#2456) 2025-02-06 14:22:40 -05:00
Chenlei Hu
2b18949615 [Cleanup] Remove duplicated group header drawing logic (#2453) 2025-02-06 13:52:05 -05:00
Chenlei Hu
629ac63f06 Type LGraphNode.pasteFile (#2455) 2025-02-06 13:50:48 -05:00
Chenlei Hu
1061620783 [Refactor] Move paste handling to usePaste composable (#2452) 2025-02-06 13:37:37 -05:00
Chenlei Hu
af7a6601e0 [Refactor] Move copy handling to useCopy composable (#2451) 2025-02-06 13:22:48 -05:00
Chenlei Hu
0e0c4b1302 [Refactor] Move isImageNode to litegraphUtil (#2450) 2025-02-06 13:15:17 -05:00
Chenlei Hu
fb170c9ee9 1.9.5 (#2448) 2025-02-06 10:49:37 -05:00
Chenlei Hu
7ef304b381 Fix litegraph copy in Chrome 133 (#2446) 2025-02-06 10:18:28 -05:00
Chenlei Hu
50833341bb 1.9.4 (#2444) 2025-02-05 22:25:19 -05:00
kvick-games
f5c5a95bdc Refresh Preview3D node with node.onMouseEnter (#2439) 2025-02-05 21:26:45 -05:00
Chenlei Hu
b700cc1824 [Documentation] Add src/scripts/README.md (#2442) 2025-02-05 18:32:44 -05:00
Chenlei Hu
a6031ec2be [Cleanup] Rename usePragmaticDroppable to usePragmaticDragAndDrop (#2441) 2025-02-05 17:46:28 -05:00
Chenlei Hu
a4d99d9d28 Support insert workflow by dragging from workflow sidebar to canvas (#2440) 2025-02-05 17:09:01 -05:00
Chenlei Hu
5a7465a907 Add node drag preview for bookmarked nodes (#2438) 2025-02-05 16:25:56 -05:00
Chenlei Hu
6525ae7cf4 [Refactor] Rename hooks/ to composables/ (#2437) 2025-02-05 15:05:56 -05:00
Chenlei Hu
c6ef107111 [Style] Fix shrinking of extension added topmenu items (#2436) 2025-02-05 13:40:14 -05:00
bymyself
3fbccd20ff Use fp16 model in default img2img template workflow (#2430) 2025-02-05 13:27:16 -05:00
Chenlei Hu
fa0682d66e 1.9.3 (#2434) 2025-02-05 13:26:56 -05:00
Chenlei Hu
f7b613c6cb 1.9.2 (#2429)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-05 12:20:20 -05:00
Chenlei Hu
292af3fe3f [Refactor] Replace explicit 'node' param with 'this' for TreeExplorer (#2427) 2025-02-05 12:20:08 -05:00
KarryCharon
2c12df12ab [i18n] Impl i18n context menu translation (#2425)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-05 12:07:40 -05:00
Chenlei Hu
d0e99beaa7 Swap eslint/prettier trigger order in pre-commit (#2428) 2025-02-05 12:04:20 -05:00
Chenlei Hu
6b64b74f6c [Desktop] Use fallback mirrors for China users (#2424) 2025-02-05 10:51:32 -05:00
Chenlei Hu
0af4768dd2 Update litegraph 0.8.67 (#2423) 2025-02-04 19:31:09 -05:00
Chenlei Hu
5f850ddaa4 [BrowserTest] Add test on boolean widget (#2421)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-04 17:28:32 -05:00
dependabot[bot]
9fb3235df4 Bump vitest from 2.0.5 to 2.1.9 (#2420)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-04 17:11:56 -05:00
Chenlei Hu
628facaa75 1.9.1 (#2416) 2025-02-03 20:55:06 -05:00
Chenlei Hu
eb5a4b65ab Update litegraph 0.8.66 (#2415) 2025-02-03 20:30:01 -05:00
Chenlei Hu
98c197e8b1 Add LiteGraph.Canvas.LowQualityRenderingZoomThreshold setting (#2412)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-03 20:28:07 -05:00
Chenlei Hu
90914a40ba Use canvas.low_quality flag for DOMWidget show/hide (#2413) 2025-02-03 20:23:07 -05:00
Chenlei Hu
821816955f Update litegraph 0.8.65 (#2411) 2025-02-03 17:38:29 -05:00
Chenlei Hu
b4121008cd Fix NoteNode constructor fields (#2410) 2025-02-03 14:20:39 -05:00
Chenlei Hu
3730c2b36f [Refactor] Use litegraph.strokeShape (#2406) 2025-02-02 23:15:09 -05:00
bymyself
77be5ac514 [BrowserTest] Add test on groupnode with duplicate hidden inputs (#2403) 2025-02-02 21:03:08 -05:00
bymyself
83759b9a4a Use command label as header text in change keybinding dialog (#2404) 2025-02-02 21:02:48 -05:00
Chenlei Hu
b8f187713e 1.9.0 (#2401) 2025-02-02 17:35:04 -05:00
filtered
b8088ad782 Revert "Correct node/output titles when grouping nodes (#2359) (#2370)" (#2399)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-02 17:23:55 -05:00
bymyself
a37671b154 Add bottom panel to extension manager (#2393) 2025-02-02 15:01:42 -05:00
filtered
57bc7ad312 Add node tooltip delay setting (#2396)
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-02-02 14:31:34 -05:00
filtered
5f59fbdead [Desktop] Persist troubleshooting terminal when hidden (#2398)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-02 14:29:47 -05:00
filtered
4eed9c7e53 [Accessibility] Use keybindings to add keybindings (#2384) 2025-01-31 09:46:23 -08:00
bymyself
ee6197785a Fix typo in coreSettings.ts (#2391)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-31 07:50:16 -08:00
Chenlei Hu
f5d6ad07e8 1.8.12 (#2390) 2025-01-30 15:51:53 -08:00
Chenlei Hu
45207dabbc Type LGraphNode.onDragOver/onDragDrop (#2389) 2025-01-30 15:50:04 -08:00
bymyself
4699360147 Show bookmark buttons when item is focused (#2386) 2025-01-30 14:45:04 -08:00
Chenlei Hu
8ef3b87e59 Generate drag preview for node library nodes (#2387) 2025-01-30 11:11:22 -08:00
Dr.Lt.Data
d3a6baf8cd refine locales/ko (#2385) 2025-01-30 09:55:40 -08:00
jojodecayz
b4d679d31f Update Python fallback mirror in uvMirrors.ts (#2382) 2025-01-29 20:06:45 -08:00
Chenlei Hu
7afc1baf7d [Refactor] Extract litegraph canvas drop target logic as composable (#2381) 2025-01-29 17:15:01 -08:00
Chenlei Hu
7bdad335ca [Refactor] Extract global window litegraph as a composable (#2380) 2025-01-29 16:53:26 -08:00
Chenlei Hu
94065b6c21 [Style] Show sidebar tool buttons when sidebar is focused (#2379) 2025-01-29 16:29:59 -08:00
Chenlei Hu
a205a5cca5 [Style] Only show sidebar tool buttons when sidebar hovered (#2378) 2025-01-29 16:16:10 -08:00
Chenlei Hu
788d6cf514 1.8.11 (#2377) 2025-01-29 15:00:32 -08:00
Chenlei Hu
766710cf37 [Desktop] Fix mirror validation in settings dialog (#2375) 2025-01-29 14:57:36 -08:00
Chenlei Hu
e019277ba0 [Style] Use consistent color for workflow sidebar tab tool buttons (#2376) 2025-01-29 14:57:19 -08:00
Chenlei Hu
97e5c9c6d2 1.8.10 (#2374) 2025-01-29 14:09:55 -08:00
Chenlei Hu
52e42b5339 Fix 404 PythonInstallMirror url suffix (#2373) 2025-01-29 13:01:54 -08:00
Chenlei Hu
c42cdf5cd9 1.8.9 (#2372) 2025-01-29 11:15:00 -08:00
Chenlei Hu
c07ec659a7 Fix mirror item key not being unique (#2371) 2025-01-29 11:13:04 -08:00
Chenlei Hu
cbcbeab9d9 Correct node/output titles when grouping nodes (#2359) (#2370)
Co-authored-by: Anastasiy Safari <anastasiuspernat@gmail.com>
Co-authored-by: github-actions <github-actions@github.com>
2025-01-29 11:05:48 -08:00
Dr.Lt.Data
bf9d2affb4 refine locales/ko (#2368) 2025-01-29 10:46:57 -08:00
Chenlei Hu
2c8c8718e9 [Desktop] Apply default pypi mirror when installing CPU torch (#2367) 2025-01-28 18:00:08 -08:00
Chenlei Hu
475e38ddb4 [CI] Skip draft in github release action (#2366) 2025-01-28 15:28:41 -08:00
Chenlei Hu
430f051c64 Add UV mirrors settings (#2333)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-28 14:39:51 -08:00
filtered
29b5f606b0 [CI] Auto-generate release notes in GH action (#2364) 2025-01-27 17:10:34 -08:00
Terry Jia
55d63a8aef [3d] move change background color button (#2365) 2025-01-27 17:06:01 -08:00
filtered
99009a18f7 1.8.8 (#2363) 2025-01-27 22:58:11 +11:00
filtered
e3ab0e4d68 Add option to disable combo box zoom-in scaling (#2362)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-27 22:56:40 +11:00
filtered
0e1ae41c0c Update litegraph 0.8.62 (#2360) 2025-01-27 22:32:24 +11:00
filtered
f12d4a2d6f [Test] Update test expectations for 2357 (#2361) 2025-01-27 22:09:25 +11:00
bymyself
7bd8527bca Add cursor drop effect when dragging nodes/models onto graph (#2354) 2025-01-26 07:08:10 -05:00
bymyself
cb356d50b8 Set Node ID badges to hidden by default (#2356) 2025-01-26 07:07:05 -05:00
filtered
d2e9943e79 Add convert to input for the clicked widget (#2357)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-26 07:06:41 -05:00
Chenlei Hu
27e4bd2592 [Refactor] Use computed states for maintenance/StatusTag (#2352) 2025-01-25 20:56:05 -05:00
Chenlei Hu
82e0c3a8b6 1.8.7 (#2351) 2025-01-25 20:12:21 -05:00
Chenlei Hu
2852720b2c [Refactor] Extract workflow/workflow tabs restore into a composable (#2350) 2025-01-25 16:58:50 -05:00
Chenlei Hu
38b8a68e50 [Refactor] Move workflow restore from app to GraphCanvas (#2349) 2025-01-25 15:36:50 -05:00
Chenlei Hu
44321e4692 [DevExperience] Add default VSCode launch.json (#2348) 2025-01-25 12:53:36 -05:00
bymyself
e992bd6571 Add tutorial workflow function for new desktop users (#2315)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-25 12:23:27 -05:00
bymyself
e971ba31e0 Add "Don't show this again" checkbox to missing models dialog (#2344)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-25 11:42:01 -05:00
Terry Jia
28b163cdd5 [3d] animation node UI change (#2347) 2025-01-25 11:41:05 -05:00
bymyself
652125de1f Use v1-5-pruned-emaonly-fp16 model in default template workflow (#2346) 2025-01-25 11:40:39 -05:00
bymyself
c5d153cf16 Enable missing models dialog by default (#2345) 2025-01-25 11:40:18 -05:00
Chenlei Hu
9459f599b6 1.8.6 (#2343) 2025-01-24 22:41:38 -05:00
Terry Jia
326839db88 [3d] add preview 3d animation node (#2341) 2025-01-24 22:35:28 -05:00
Chenlei Hu
30fdc70218 Click url input status icon to trigger validation (#2339) 2025-01-24 14:15:54 -05:00
bymyself
9c42c31968 Fix missing models dialog (#2336) 2025-01-24 10:37:19 -05:00
Chenlei Hu
44aa1bf8c3 1.8.5 (#2335) 2025-01-23 22:06:57 -05:00
Chenlei Hu
caad27e28d Validate on mount for UrlInput (#2332) 2025-01-23 15:09:00 -05:00
Chenlei Hu
e8136ff0ae UrlInput emits update:modelValue only on blur (#2331) 2025-01-23 14:55:12 -05:00
Chenlei Hu
157475cb2e Add validateUrlFn props on UrlInput component (#2330) 2025-01-23 14:44:06 -05:00
Chenlei Hu
93dc50a95a Allow passthrough attrs on UrlInput (#2329) 2025-01-23 14:29:38 -05:00
Terry Jia
3f787e2dbf [3d] improve storing Camera State logic (#2328) 2025-01-23 14:26:13 -05:00
Terry Jia
b54e270b10 [3d] refactor code (#2326) 2025-01-23 11:26:27 -05:00
Chenlei Hu
0ab1d974c0 Add url setting type (#2327) 2025-01-23 11:25:06 -05:00
bymyself
95ff01a67b Fix form validation message appearing unnecessarily (#2324) 2025-01-23 09:25:36 -05:00
filtered
6f05ce6cc2 [Desktop] Add restart app instruction to git fix task (#2322) 2025-01-23 09:25:04 -05:00
bymyself
b8bef57522 Clean tags in issue reports (#2323) 2025-01-23 09:23:07 -05:00
bymyself
46500bf3dd Fix translation id in folder customization dialog (#2320) 2025-01-22 20:44:02 -05:00
Chenlei Hu
1bcc00cd33 [i18n] Load custom nodes locales from ComfyUI server (#2314) 2025-01-22 17:37:02 -05:00
Chenlei Hu
08d2322817 1.8.4 (#2319) 2025-01-22 15:37:07 -05:00
filtered
8cfc1c4682 [Desktop] Remove beforeunload handler - unusable in electron (#2318) 2025-01-22 15:35:21 -05:00
filtered
c7bce87b8d [Desktop] Use Window Controls Overlay API (#2316)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-22 13:22:21 -05:00
Chenlei Hu
8f6b594a9f Fix console error on adding node via searchbox (#2317) 2025-01-22 13:13:26 -05:00
Chenlei Hu
1c9b300396 1.8.3 (#2312) 2025-01-21 20:36:54 -05:00
filtered
cd5283c4b7 [Refactor] Desktop maintenance task runner (#2311) 2025-01-21 20:18:01 -05:00
filtered
0b69d3cbfe [Desktop] Startup maintenance screen (#2253)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-21 16:10:15 -05:00
bymyself
8257e848c6 Update SearchBox vue features (#2310) 2025-01-21 10:32:46 -05:00
Chenlei Hu
a07b7693b6 [chore] Update vue to 3.5 (#2308)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-20 21:21:13 -05:00
Chenlei Hu
26ddf69451 Fix validation message locale (#2309) 2025-01-20 21:11:23 -05:00
bymyself
ed6ece2099 Add forms plugin to issue report component (#2302) 2025-01-20 20:20:59 -05:00
Chenlei Hu
b42516d39c 1.8.2 (#2307) 2025-01-20 17:24:58 -05:00
Chenlei Hu
ef24efe5a3 [Desktop] Report execution complete events (#2306) 2025-01-20 17:24:15 -05:00
Chenlei Hu
34c267c755 [chore] Update primevue to 4.2.5 (#2304) 2025-01-20 16:22:24 -05:00
bymyself
8b9f0ddd1d Add Comfy Forum (forum.comfy.org) to Help menu (#2305)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-20 16:06:31 -05:00
filtered
af658b7792 [Style] Use import/export icons for colour palette (#2300) 2025-01-20 14:33:02 -05:00
filtered
9c53bbd53d [Refactor] Move type extensions out of LG (SoC) (#2303)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-20 14:22:56 -05:00
filtered
f9be20fa78 [Desktop] Fix unnecessary setting update (#2301)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-20 14:00:35 -05:00
Chenlei Hu
87fc7a2c5d [Cleanup] Remove explicit prettier plugin call (#2299) 2025-01-20 11:15:16 -05:00
Chenlei Hu
1f266e826e Fix .cursorrules typo (#2298) 2025-01-20 11:12:59 -05:00
Dr.Lt.Data
911adfe9f8 refine locales/ko (#2296) 2025-01-20 11:11:16 -05:00
bymyself
654d72b4cc Add issue report dialog service (#2284)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-19 20:44:11 -05:00
bymyself
a1ed67fc74 Add User Feedback buttons (#2275)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-19 19:41:58 -05:00
Chenlei Hu
78bc635518 1.8.1 (#2295) 2025-01-19 19:07:18 -05:00
Chenlei Hu
f49ec175e9 1.8.0 (#2293)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-19 18:57:07 -05:00
Yuki Shindo
e4c60e7e18 Prevent Enter Key from Triggering Selection During IME Composition in AutoCompletePlus (#2285) 2025-01-19 18:34:26 -05:00
filtered
37cb2cb0a5 [Desktop] Add quit command (#2286)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-01-19 14:31:52 -05:00
Hikari-Fox
141825e988 Update Russian localization: refine terminology for "node", "hook", "… (#2289)
Co-authored-by: Vladimir Pozdnyakov <pozdnyakov044@gmail.com>
2025-01-19 14:29:40 -05:00
filtered
78f43b1e06 [Desktop] Add electron types update script (#2290) 2025-01-19 14:16:27 -05:00
filtered
a6105eb8c7 [DevExperience] Tailwind rules (#2292) 2025-01-19 14:16:03 -05:00
filtered
79ed598d5d [chore] Update electron-types to 0.4.11 (#2291) 2025-01-19 14:12:17 -05:00
bymyself
816574e0ab [Refactor] improve type safety in dialog service (#2283) 2025-01-18 15:46:57 -05:00
Chenlei Hu
1a4e77a3ab [Desktop] Ctrl+w to close workflow tab (#2282) 2025-01-17 20:02:54 -05:00
Chenlei Hu
de570712df 1.7.14 (#2281) 2025-01-17 18:04:43 -05:00
Chenlei Hu
44612e8f97 [Desktop] Add privacy policy link to install view about dialog (#2280)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-17 18:04:08 -05:00
bymyself
3df911c1bf Add consent prompt view (#2268)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-17 17:39:50 -05:00
Chenlei Hu
af26b9ad6d [Desktop] Report completed generation status (#2279) 2025-01-17 17:36:46 -05:00
Chenlei Hu
d503873980 Move queueStore update from QueueSidebarTab to GraphView (#2278) 2025-01-17 17:14:22 -05:00
bymyself
842a9f74fc [BrowserTest] Fix flaky gallery test (#2150) 2025-01-17 17:11:49 -05:00
Chenlei Hu
29551a36b3 Add .cursorrules (#2277) 2025-01-17 16:35:25 -05:00
filtered
d6e5c8950c [Desktop] Loading screen (#2274)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-17 11:12:03 -05:00
Chenlei Hu
ad1c1ce9c2 [chore] Update electron-types to 0.4.9 (#2276) 2025-01-17 10:59:41 -05:00
Benjamin Lu
cb9d2c6bae Caching brush settings in mask editor (#2271)
Co-authored-by: Benjamin Lu <templu1107@proton.me>
2025-01-17 10:38:23 -05:00
Chenlei Hu
7fd41eeaba 1.7.13 (#2270) 2025-01-16 11:51:58 -05:00
filtered
79fee6ac72 Fix collapsed node textarea causes UI inconsistency (#2267) 2025-01-16 11:50:53 -05:00
Benjamin Lu
edd58cd153 Hotfix scoped --sidebar-width uasges in maskeditor.ts (#2269)
Co-authored-by: Benjamin Lu <templu1107@proton.me>
2025-01-16 11:36:11 -05:00
Chenlei Hu
e153508955 1.7.12 (#2265) 2025-01-15 20:19:24 -05:00
Chenlei Hu
237fca0bf1 [CodeHealth] Use scoped CSS for SideToolbar (#2264) 2025-01-15 20:16:39 -05:00
Chenlei Hu
65542b885a [Style] Fix root CSS selector (#2263) 2025-01-15 19:44:46 -05:00
Chenlei Hu
f739f704af [CodeHealth] Use scoped CSS in views (#2262) 2025-01-15 19:35:01 -05:00
Chenlei Hu
37abdbe35d [Desktop] Add install screen stepper change metrics (#2261) 2025-01-15 19:27:05 -05:00
Chenlei Hu
ff445f5c95 Apply min col on logs terminal for colab (#2260) 2025-01-15 17:16:33 -05:00
Chenlei Hu
84b652a281 [CodeHealth] Convert useAutoSize to kwargs (#2259) 2025-01-15 17:06:45 -05:00
Chenlei Hu
184291d21b [Settings] Enable Comfy.Window.UnloadConfirmation by default (#2258) 2025-01-15 16:37:11 -05:00
Chenlei Hu
d7fb25a36a Don't prompt unsaved when there is no unsaved workflow on window close (#2257) 2025-01-15 16:34:05 -05:00
Comfy Org PR Bot
c039a60fcc Update locales for node definitions (#2256)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-15 16:23:45 -05:00
Chenlei Hu
3b6108c26e Add work dir to i18n-node-defs.yaml (#2255) 2025-01-15 16:19:13 -05:00
Chenlei Hu
49bb247526 1.7.11 (#2250) 2025-01-14 23:34:58 -05:00
bymyself
dd005f5fa5 Allow parent component to pass tags to issue report panel (#2247) 2025-01-14 23:34:11 -05:00
Chenlei Hu
bf90b458d3 [Desktop] Add clarification of migration from existing install (#2249)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-14 23:33:53 -05:00
bymyself
7e78c5b1dc Fix type error in BaseViewTemplate (#2245) 2025-01-14 20:19:35 -05:00
724 changed files with 39366 additions and 17296 deletions

43
.cursorrules Normal file
View File

@@ -0,0 +1,43 @@
// Vue 3 Composition API .cursorrules
// Vue 3 Composition API best practices
const vue3CompositionApiBestPractices = [
"Use setup() function for component logic",
"Utilize ref and reactive for reactive state",
"Implement computed properties with computed()",
"Use watch and watchEffect for side effects",
"Implement lifecycle hooks with onMounted, onUpdated, etc.",
"Utilize provide/inject for dependency injection",
]
// Folder structure
const folderStructure = `
src/
components/
constants/
composables/
views/
stores/
services/
App.vue
main.ts
`;
// Tailwind CSS best practices
const tailwindCssBestPractices = [
"Use Tailwind CSS for styling",
"Implement responsive design with Tailwind CSS",
]
// Additional instructions
const additionalInstructions = `
1. Leverage VueUse functions for performance-enhancing styles
2. Use lodash for utility functions
3. Use TypeScript for type safety
4. Implement proper props and emits definitions
5. Utilize Vue 3's Teleport component when needed
6. Use Suspense for async components
7. Implement proper error handling
8. Follow Vue 3 style guide and naming conventions
9. Use Vite for fast development and building
`;

View File

@@ -11,18 +11,9 @@ DEV_SERVER_COMFYUI_URL=http://127.0.0.1:8188
# and public addresses.
VITE_REMOTE_DEV=false
# The target ComfyUI checkout directory to deploy the frontend code to.
# The dist directory will be copied to {DEPLOY_COMFYUI_DIR}/custom_web_versions/main/dev
# Add `--front-end-root {DEPLOY_COMFYUI_DIR}/custom_web_versions/main/dev`
# to ComfyUI launch script to serve the custom web version.
DEPLOY_COMFYUI_DIR=/home/ComfyUI/web
# The directory containing the ComfyUI installation used to run Playwright tests.
# If you aren't using a separate install for testing, point this to your regular install.
TEST_COMFYUI_DIR=/home/ComfyUI
# The directory containing the ComfyUI_examples repo used to extract test workflows.
EXAMPLE_REPO_PATH=tests-ui/ComfyUI_examples
# Whether to enable minification of the frontend code.
ENABLE_MINIFY=true

View File

@@ -16,7 +16,18 @@ body:
- type: textarea
attributes:
label: Frontend Version
description: 'What is the frontend version you are using? You can check this in the settings dialog'
description: |
What is the frontend version you are using? You can check this in the settings dialog.
<details>
<summary>Click to show where to find the version</summary>
Open the setting by clicking the cog icon in the bottom-left of the screen, then click `About`.
![Frontend version](https://github.com/user-attachments/assets/561fb7c3-3012-457c-a494-9bdc1ff035c0)
</details>
validations:
required: true
- type: textarea
@@ -72,7 +83,8 @@ body:
- Other
- type: textarea
attributes:
label: Other
description: 'Any other additional information you think might be helpful.'
label: Other Information
description: 'Any other context, details, or screenshots that might help solve the issue.'
placeholder: 'Add any other relevant information here...'
validations:
required: false

View File

@@ -2,10 +2,7 @@ name: ESLint
on:
pull_request:
branches:
- main
- master
- 'dev*'
branches: [ main, master, dev*, core/*, desktop/* ]
jobs:
eslint:
@@ -13,8 +10,8 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: lts/*
node-version: 'lts/*'
- run: npm ci
- run: npm run lint
- run: npm run lint

View File

@@ -2,7 +2,7 @@ name: Prettier Check
on:
pull_request:
branches: [ main, master, dev* ]
branches: [ main, master, dev*, core/*, desktop/* ]
jobs:
prettier:
@@ -12,12 +12,12 @@ jobs:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: lts/*
node-version: 'lts/*'
- name: Install dependencies
run: npm ci
- name: Run Prettier check
run: npm run format:check
run: npm run format:check

View File

@@ -1,4 +1,5 @@
name: Update Locales for given custom node repository
on:
workflow_dispatch:
inputs:
@@ -23,27 +24,27 @@ jobs:
- name: Checkout ComfyUI
uses: actions/checkout@v4
with:
repository: 'comfyanonymous/ComfyUI'
path: 'ComfyUI'
repository: comfyanonymous/ComfyUI
path: ComfyUI
ref: master
- name: Checkout ComfyUI_frontend
uses: actions/checkout@v4
with:
repository: 'Comfy-Org/ComfyUI_frontend'
path: 'ComfyUI_frontend'
repository: Comfy-Org/ComfyUI_frontend
path: ComfyUI_frontend
- name: Checkout ComfyUI_devtools
uses: actions/checkout@v4
with:
repository: 'Comfy-Org/ComfyUI_devtools'
path: 'ComfyUI/custom_nodes/ComfyUI_devtools'
repository: Comfy-Org/ComfyUI_devtools
path: ComfyUI/custom_nodes/ComfyUI_devtools
- name: Checkout custom node repository
uses: actions/checkout@v4
with:
repository: ${{ inputs.owner }}/${{ inputs.repository }}
path: 'ComfyUI/custom_nodes/${{ inputs.repository }}'
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: lts/*
node-version: 'lts/*'
- uses: actions/setup-python@v4
with:
python-version: '3.10'
@@ -53,14 +54,12 @@ jobs:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install -r requirements.txt
pip install wait-for-it
shell: bash
working-directory: ComfyUI
- name: Install custom node requirements
run: |
if [ -f "requirements.txt" ]; then
pip install -r requirements.txt
fi
shell: bash
working-directory: ComfyUI/custom_nodes/${{ inputs.repository }}
- name: Build & Install ComfyUI_frontend
run: |
@@ -68,14 +67,12 @@ jobs:
npm run build
rm -rf ../ComfyUI/web/*
mv dist/* ../ComfyUI/web/
shell: bash
working-directory: ComfyUI_frontend
- name: Start ComfyUI server
run: |
python main.py --cpu --multi-user &
wait-for-it --service 127.0.0.1:8188 -t 600
working-directory: ComfyUI
shell: bash
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
@@ -153,7 +150,7 @@ jobs:
echo "Pushing changes to ${{ inputs.fork_owner }}/${{ inputs.repository }}"
git push -f git@github.com:${{ inputs.fork_owner }}/${{ inputs.repository }}.git update-locales
- name: Create PR
- name: Create PR
working-directory: ComfyUI/custom_nodes/${{ inputs.repository }}
run: |
# Create PR using gh cli

View File

@@ -13,7 +13,7 @@ jobs:
update-locales:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
@@ -42,6 +42,7 @@ jobs:
Automated PR to update locales for node definitions
This PR was created automatically by the frontend update workflow.
branch: update-locales-node-defs-{{ github.event.inputs.trigger_type }}-{{ github.run_id }}
branch: update-locales-node-defs-${{ github.event.inputs.trigger_type }}-${{ github.run_id }}
base: main
labels: dependencies
labels: dependencies
path: ComfyUI_frontend

View File

@@ -1,4 +1,5 @@
name: Update Locales
on:
pull_request:
branches: [ main, master, dev* ]
@@ -9,7 +10,7 @@ jobs:
if: github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
@@ -33,7 +34,11 @@ jobs:
git config --global user.name 'github-actions'
git config --global user.email 'github-actions@github.com'
git fetch origin ${{ github.head_ref }}
# Stash any local changes before checkout
git stash -u
git checkout -B ${{ github.head_ref }} origin/${{ github.head_ref }}
# Apply the stashed changes if any
git stash pop || true
git add src/locales/
git diff --staged --quiet || git commit -m "Update locales [skip ci]"
git push origin HEAD:${{ github.head_ref }}

View File

@@ -2,35 +2,56 @@ name: Create Release Draft
on:
pull_request:
types: [closed]
branches:
- main
- master
types: [ closed ]
branches: [ main, core/* ]
paths:
- "package.json"
- 'package.json'
jobs:
draft_release:
build:
runs-on: ubuntu-latest
if: >
github.event.pull_request.merged == true &&
contains(github.event.pull_request.labels.*.name, 'Release')
outputs:
version: ${{ steps.current_version.outputs.version }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: lts/*
node-version: 'lts/*'
- name: Get current version
id: current_version
run: echo ::set-output name=version::$(node -p "require('./package.json').version")
run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT
- name: Build project
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
run: |
npm ci
npm run fetch-templates
npm run build
npm run zipdist
- name: Upload dist artifact
uses: actions/upload-artifact@v4
with:
name: dist-files
path: |
dist/
dist.zip
draft_release:
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download dist artifact
uses: actions/download-artifact@v4
with:
name: dist-files
- name: Create release
id: create_release
uses: softprops/action-gh-release@v2
@@ -39,25 +60,57 @@ jobs:
with:
files: |
dist.zip
tag_name: v${{ steps.current_version.outputs.version }}
draft: true
tag_name: v${{ needs.build.outputs.version }}
target_commitish: ${{ github.event.pull_request.base.ref }}
make_latest: ${{ github.event.pull_request.base.ref == 'main' }}
draft: ${{ github.event.pull_request.base.ref != 'main' }}
prerelease: false
make_latest: "true"
publish_types:
generate_release_notes: true
publish_pypi:
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download dist artifact
uses: actions/download-artifact@v4
with:
name: dist-files
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install build dependencies
run: python -m pip install build
- name: Setup pypi package
run: |
mkdir -p comfyui_frontend_package/comfyui_frontend_package/static/
cp -r dist/* comfyui_frontend_package/comfyui_frontend_package/static/
- name: Build pypi package
run: python -m build
working-directory: comfyui_frontend_package
env:
COMFYUI_FRONTEND_VERSION: ${{ needs.build.outputs.version }}
- name: Publish pypi package
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_TOKEN }}
packages-dir: comfyui_frontend_package/dist
publish_types:
needs: build
runs-on: ubuntu-latest
if: >
github.event.pull_request.merged == true &&
contains(github.event.pull_request.labels.*.name, 'Release')
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: lts/*
registry-url: "https://registry.npmjs.org"
node-version: 'lts/*'
registry-url: https://registry.npmjs.org
- run: npm ci
- run: npm run build:types
- name: Publish package
run: npm publish --access public
working-directory: ./dist
working-directory: dist
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -1,5 +1,4 @@
# Setting test expectation screenshots for Playwright
name: Update Playwright Expectations
on:
@@ -11,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
if: github.event.label.name == 'New Browser Test Expectations'
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend

View File

@@ -2,73 +2,104 @@ name: Tests CI
on:
push:
branches:
- main
- master
branches: [main, master, core/*, desktop/*]
pull_request:
branches:
- main
- master
- 'dev*'
branches: [main, master, dev*, core/*, desktop/*]
jobs:
jest-tests:
setup:
runs-on: ubuntu-latest
outputs:
cache-key: ${{ steps.cache-key.outputs.key }}
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- name: Run Jest tests
run: |
npm run test:generate
npm run test:jest -- --verbose
working-directory: ComfyUI_frontend
- name: Checkout ComfyUI
uses: actions/checkout@v4
with:
repository: 'comfyanonymous/ComfyUI'
path: 'ComfyUI'
ref: master
playwright-tests-chromium:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
- name: Run Playwright tests (Chromium)
run: npx playwright test --project=chromium
working-directory: ComfyUI_frontend
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-chromium
path: ComfyUI_frontend/playwright-report/
retention-days: 30
- name: Checkout ComfyUI_frontend
uses: actions/checkout@v4
with:
repository: 'Comfy-Org/ComfyUI_frontend'
path: 'ComfyUI_frontend'
playwright-tests-chromium-2x:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
- name: Run Playwright tests (Chromium 2x)
run: npx playwright test --project=chromium-2x
working-directory: ComfyUI_frontend
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-chromium-2x
path: ComfyUI_frontend/playwright-report/
retention-days: 30
- name: Checkout ComfyUI_devtools
uses: actions/checkout@v4
with:
repository: 'Comfy-Org/ComfyUI_devtools'
path: 'ComfyUI/custom_nodes/ComfyUI_devtools'
ref: '080e6d4af809a46852d1c4b7ed85f06e8a3a72be'
playwright-tests-mobile-chrome:
- uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Build ComfyUI_frontend
run: |
npm ci
npm run fetch-templates
npm run build
working-directory: ComfyUI_frontend
- name: Generate cache key
id: cache-key
run: echo "key=$(date +%s)" >> $GITHUB_OUTPUT
- name: Cache setup
uses: actions/cache@v3
with:
path: |
ComfyUI
ComfyUI_frontend
key: comfyui-setup-${{ steps.cache-key.outputs.key }}
playwright-tests:
needs: setup
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
browser: [chromium, chromium-2x, mobile-chrome]
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
- name: Run Playwright tests (Mobile Chrome)
run: npx playwright test --project=mobile-chrome
working-directory: ComfyUI_frontend
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-mobile-chrome
path: ComfyUI_frontend/playwright-report/
retention-days: 30
- name: Restore cached setup
uses: actions/cache@v3
with:
path: |
ComfyUI
ComfyUI_frontend
key: comfyui-setup-${{ needs.setup.outputs.cache-key }}
- uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install requirements
run: |
python -m pip install --upgrade pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install -r requirements.txt
pip install wait-for-it
working-directory: ComfyUI
- name: Start ComfyUI server
run: |
python main.py --cpu --multi-user --front-end-root ../ComfyUI_frontend/dist &
wait-for-it --service 127.0.0.1:8188 -t 600
working-directory: ComfyUI
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
- name: Run Playwright tests (${{ matrix.browser }})
run: npx playwright test --project=${{ matrix.browser }}
working-directory: ComfyUI_frontend
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-${{ matrix.browser }}
path: ComfyUI_frontend/playwright-report/
retention-days: 30

View File

@@ -0,0 +1,44 @@
name: Update Electron Types
on:
workflow_dispatch:
jobs:
update-electron-types:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: 'npm'
- name: Update electron types
run: npm install @comfyorg/comfyui-electron-types@latest
- name: Get new version
id: get-version
run: |
NEW_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('./package-lock.json')).packages['node_modules/@comfyorg/comfyui-electron-types'].version)")
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: '[chore] Update electron-types to ${{ steps.get-version.outputs.NEW_VERSION }}'
title: '[chore] Update electron-types to ${{ steps.get-version.outputs.NEW_VERSION }}'
body: |
Automated update of desktop API types to version ${{ steps.get-version.outputs.NEW_VERSION }}.
branch: update-electron-types-${{ steps.get-version.outputs.NEW_VERSION }}
base: main
labels: |
dependencies
Electron

43
.github/workflows/update-litegraph.yaml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: Update Litegraph Dependency
on:
workflow_dispatch:
jobs:
update-litegraph:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Update litegraph
run: npm install @comfyorg/litegraph@latest
- name: Get new version
id: get-version
run: |
NEW_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('./package-lock.json')).packages['node_modules/@comfyorg/litegraph'].version)")
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.PR_GH_TOKEN }}
commit-message: '[chore] Update litegraph to ${{ steps.get-version.outputs.NEW_VERSION }}'
title: '[chore] Update litegraph to ${{ steps.get-version.outputs.NEW_VERSION }}'
body: |
Automated update of litegraph to version ${{ steps.get-version.outputs.NEW_VERSION }}.
Ref: https://github.com/Comfy-Org/litegraph.js/releases/tag/v${{ steps.get-version.outputs.NEW_VERSION }}
branch: update-litegraph-${{ steps.get-version.outputs.NEW_VERSION }}
base: main
labels: |
dependencies

View File

@@ -0,0 +1,97 @@
name: Update Comfy Registry API Types
on:
# Manual trigger
workflow_dispatch:
# Triggered from comfy-api repo
repository_dispatch:
types: [comfy-api-updated]
jobs:
update-registry-types:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Checkout comfy-api repository
uses: actions/checkout@v4
with:
repository: Comfy-Org/comfy-api
path: comfy-api
token: ${{ secrets.COMFY_API_PAT }}
clean: true
- name: Get API commit information
id: api-info
run: |
cd comfy-api
API_COMMIT=$(git rev-parse --short HEAD)
echo "commit=${API_COMMIT}" >> $GITHUB_OUTPUT
cd ..
- name: Generate API types
run: |
echo "Generating TypeScript types from comfy-api@${{ steps.api-info.outputs.commit }}..."
npx openapi-typescript ./comfy-api/openapi.yml --output ./src/types/comfyRegistryTypes.ts
- name: Validate generated types
run: |
if [ ! -f ./src/types/comfyRegistryTypes.ts ]; then
echo "Error: Types file was not generated."
exit 1
fi
# Check if file is not empty
if [ ! -s ./src/types/comfyRegistryTypes.ts ]; then
echo "Error: Generated types file is empty."
exit 1
fi
- name: Check for changes
id: check-changes
run: |
if [[ -z $(git status --porcelain ./src/types/comfyRegistryTypes.ts) ]]; then
echo "No changes to Comfy Registry API types detected."
echo "changed=false" >> $GITHUB_OUTPUT
exit 0
else
echo "Changes detected in Comfy Registry API types."
echo "changed=true" >> $GITHUB_OUTPUT
fi
- name: Create Pull Request
if: steps.check-changes.outputs.changed == 'true'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.PR_GH_TOKEN }}
commit-message: '[chore] Update Comfy Registry API types from comfy-api@${{ steps.api-info.outputs.commit }}'
title: '[chore] Update Comfy Registry API types from comfy-api@${{ steps.api-info.outputs.commit }}'
body: |
## Automated API Type Update
This PR updates the Comfy Registry API types from the latest comfy-api OpenAPI specification.
- API commit: ${{ steps.api-info.outputs.commit }}
- Generated on: ${{ github.event.repository.updated_at }}
These types are automatically generated using openapi-typescript.
branch: update-registry-types-${{ steps.api-info.outputs.commit }}
base: main
labels: CNR
delete-branch: true
add-paths: |
src/types/comfyRegistryTypes.ts

51
.github/workflows/version-bump.yaml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: Version Bump
on:
workflow_dispatch:
inputs:
version_type:
description: 'Version increment type'
required: true
default: 'patch'
type: 'choice'
options:
- patch
- minor
- major
jobs:
bump-version:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: 'npm'
- name: Bump version
id: bump-version
run: |
npm version ${{ github.event.inputs.version_type }} --no-git-tag-version
NEW_VERSION=$(node -p "require('./package.json').version")
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.PR_GH_TOKEN }}
commit-message: '[release] Bump version to ${{ steps.bump-version.outputs.NEW_VERSION }}'
title: '${{ steps.bump-version.outputs.NEW_VERSION }}'
body: |
Automated version bump to ${{ steps.bump-version.outputs.NEW_VERSION }}
branch: version-bump-${{ steps.bump-version.outputs.NEW_VERSION }}
base: main
labels: |
Release

View File

@@ -2,15 +2,9 @@ name: Vitest Tests
on:
push:
branches:
- main
- master
- 'dev*'
branches: [ main, master, dev*, core/*, desktop/* ]
pull_request:
branches:
- main
- master
- 'dev*'
branches: [ main, master, dev*, core/*, desktop/* ]
jobs:
test:
@@ -20,12 +14,14 @@ jobs:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: lts/*
node-version: 'lts/*'
- name: Install dependencies
run: npm ci
- name: Run Vitest tests
run: npm run test:component
run: |
npm run test:component
npm run test:unit

10
.gitignore vendored
View File

@@ -16,6 +16,9 @@ dist-ssr
.vscode/*
*.code-workspace
!.vscode/extensions.json
!.vscode/tailwind.json
!.vscode/settings.json.default
!.vscode/launch.json.default
.idea
.DS_Store
*.suo
@@ -45,3 +48,10 @@ dist.zip
# Generated JSON Schemas
/schemas/
# Workflow templates assets
# Hosted on https://github.com/Comfy-Org/workflow_templates
/public/templates/
# Temporary repository directory
templates_repo/

View File

@@ -10,7 +10,7 @@ module.exports = defineConfig({
entryLocale: 'en',
output: 'src/locales',
outputLocales: ['zh', 'ru', 'ja', 'ko', 'fr'],
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade.
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade, controlnet, lora.
'latent' is the short form of 'latent space'.
'mask' is in the context of image processing.
`

16
.vscode/launch.json.default vendored Normal file
View File

@@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome on frontend dev",
"url": "http://localhost:5173",
"webRoot": "${workspaceFolder}/src",
"sourceMaps": true,
}
]
}

5
.vscode/settings.json.default vendored Normal file
View File

@@ -0,0 +1,5 @@
{
"css.customData": [
".vscode/tailwind.json"
]
}

55
.vscode/tailwind.json vendored Normal file
View File

@@ -0,0 +1,55 @@
{
"version": 1.1,
"atDirectives": [
{
"name": "@tailwind",
"description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#tailwind"
}
]
},
{
"name": "@apply",
"description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that youd like to extract to a new component.",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#apply"
}
]
},
{
"name": "@responsive",
"description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#responsive"
}
]
},
{
"name": "@screen",
"description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#screen"
}
]
},
{
"name": "@variants",
"description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#variants"
}
]
}
]
}

158
README.md
View File

@@ -31,8 +31,22 @@
## Release Schedule
### Nightly Release
The project follows a structured release process for each minor version, consisting of three distinct phases:
1. **Development Phase** - 1 week
- Active development of new features
- Code changes merged to the development branch
2. **Feature Freeze** - 1 week
- No new features accepted
- Only bug fixes are cherry-picked to the release branch
- Testing and stabilization of the codebase
3. **Publication**
- Release is published at the end of the freeze period
- Version is finalized and made available to all users
### Nightly Releases
Nightly releases are published daily at [https://github.com/Comfy-Org/ComfyUI_frontend/releases](https://github.com/Comfy-Org/ComfyUI_frontend/releases).
To use the latest nightly release, add the following command line argument to your ComfyUI launch script:
@@ -41,18 +55,17 @@ To use the latest nightly release, add the following command line argument to yo
--front-end-version Comfy-Org/ComfyUI_frontend@latest
```
#### For Windows Stand-alone Build Users
## Overlapping Release Cycles
The development of successive minor versions overlaps. For example, while version 1.1 is in feature freeze, development for version 1.2 begins simultaneously.
Edit your `run_cpu.bat` or `run_nvidia_gpu.bat` file as follows:
### Example Release Cycle
```bat
.\python_embeded\python.exe -s ComfyUI\main.py --windows-standalone-build --front-end-version Comfy-Org/ComfyUI_frontend@latest
pause
```
### Stable Release
Stable releases are published bi-weekly in the ComfyUI main repository.
| Week | Date Range | Version 1.1 | Version 1.2 | Version 1.3 | Patch Releases |
|------|------------|-------------|-------------|-------------|----------------|
| 1 | Mar 1-7 | Development | - | - | - |
| 2 | Mar 8-14 | Feature Freeze | Development | - | 1.1.0 through 1.1.6 (daily) |
| 3 | Mar 15-21 | Released | Feature Freeze | Development | 1.1.7 through 1.1.13 (daily)<br>1.2.0 through 1.2.6 (daily) |
| 4 | Mar 22-28 | - | Released | Feature Freeze | 1.2.7 through 1.2.13 (daily)<br>1.3.0 through 1.3.6 (daily) |
## Release Summary
@@ -468,6 +481,35 @@ We will support custom icons later.
![image](https://github.com/user-attachments/assets/7bff028a-bf91-4cab-bf97-55c243b3f5e0)
</details>
<details id='extension-api-selection-toolbox'>
<summary>v1.10.9: Selection Toolbox API</summary>
Extensions can register commands that appear in the selection toolbox when specific items are selected on the canvas.
```js
app.registerExtension({
name: 'TestExtension1',
commands: [
{
id: 'test.selection.command',
label: 'Test Command',
icon: 'pi pi-star',
function: () => {
// Command logic here
}
}
],
// Return an array of command IDs to show in the selection toolbox
// when an item is selected
getSelectionToolboxCommands: (selectedItem) => ['test.selection.command']
})
```
The selection toolbox will display the command button when items are selected:
![Image](https://github.com/user-attachments/assets/28d91267-c0a9-4bd5-a7c4-36e8ec44c9bd)
</details>
## Development
### Tech Stack
@@ -475,7 +517,7 @@ We will support custom icons later.
- [Vue 3](https://vuejs.org/) with [TypeScript](https://www.typescriptlang.org/)
- [Pinia](https://pinia.vuejs.org/) for state management
- [PrimeVue](https://primevue.org/) with [TailwindCSS](https://tailwindcss.com/) for UI
- [Litegraph](https://github.com/Comfy-Org/litegraph.js) for node editor
- [litegraph.js](https://github.com/Comfy-Org/litegraph.js) for node editor
- [zod](https://zod.dev/) for schema validation
- [vue-i18n](https://github.com/intlify/vue-i18n) for internationalization
@@ -517,10 +559,8 @@ navigate to `http://<server_ip>:5173` (e.g. `http://192.168.2.20:5173` here), to
### Unit Test
- `git clone https://github.com/comfyanonymous/ComfyUI_examples.git` to `tests-ui/ComfyUI_examples` or the EXAMPLE_REPO_PATH location specified in .env
- `npm i` to install all dependencies
- `npm run test:generate` to fetch `tests-ui/data/object_info.json`
- `npm run test:jest` to execute all unit tests.
- `npm run test:unit` to execute all unit tests.
### Component Test
@@ -532,97 +572,17 @@ Component test verifies Vue components in `src/components/`.
Playwright test verifies the whole app. See <https://github.com/Comfy-Org/ComfyUI_frontend/blob/main/browser_tests/README.md> for details.
### LiteGraph
### litegraph.js
This repo is using litegraph package hosted on <https://github.com/Comfy-Org/litegraph.js>. Any changes to litegraph should be submitted in that repo instead.
### Test litegraph changes
#### Test litegraph.js changes
- Run `npm link` in the local litegraph repo.
- Run `npm link @comfyorg/litegraph` in this repo.
This will replace the litegraph package in this repo with the local litegraph repo.
## Internationalization (i18n)
### i18n
Our project supports multiple languages using `vue-i18n`. This allows users around the world to use the application in their preferred language.
### Supported Languages
- en (English)
- zh (中文)
- ru (Русский)
- ja (日本語)
- ko (한국어)
- fr (Français)
### How to Add a New Language
We welcome the addition of new languages. You can add a new language by following these steps:
#### 1. Generate language files
We use [lobe-i18n](https://github.com/lobehub/lobe-cli-toolbox/blob/master/packages/lobe-i18n/README.md) as our translation tool, which integrates with LLM for efficient localization.
Update the configuration file to include the new language(s) you wish to add:
```javascript
const { defineConfig } = require('@lobehub/i18n-cli');
module.exports = defineConfig({
entry: 'src/locales/en.json', // Base language file
entryLocale: 'en',
output: 'src/locales',
outputLocales: ['zh', 'ru', 'ja'], // Add the new language(s) here
});
```
Set your OpenAI API Key by running the following command:
```sh
npx lobe-i18n --option
```
Once configured, generate the translation files with:
```sh
npx lobe-i18n locale
```
This will create the language files for the specified languages in the configuration.
#### 2. Update i18n Configuration
Import the newly generated locale file(s) in the `src/i18n.ts` file to include them in the application's i18n setup.
#### 3. Enable Selection of the New Language
Add the newly added language to the following item in `src/constants/coreSettings.ts`:
```typescript
{
id: 'Comfy.Locale',
name: 'Locale',
type: 'combo',
// Add the new language(s) here
options: [
{ value: 'en', text: 'English' },
{ value: 'zh', text: '中文' },
{ value: 'ru', text: 'Русский' },
{ value: 'ja', text: '日本語' }
],
defaultValue: navigator.language.split('-')[0] || 'en'
},
```
This will make the new language selectable in the application's settings.
#### 4. Test the Translations
Start the development server, switch to the new language, and verify the translations.
You can switch languages by opening the ComfyUI Settings and selecting from the `ComfyUI > Locale` dropdown box.
## Deploy
- Option 1: Set `DEPLOY_COMFYUI_DIR` in `.env` and run `npm run deploy`.
- Option 2: Copy everything under `dist/` to `ComfyUI/web/` in your ComfyUI checkout manually.
See [locales/README.md](src/locales/README.md) for details.

View File

@@ -1,8 +0,0 @@
{
"presets": [
"@babel/preset-env"
],
"plugins": [
"babel-plugin-transform-import-meta"
]
}

View File

@@ -1,7 +1,7 @@
import type { Response } from '@playwright/test'
import { expect, mergeTests } from '@playwright/test'
import type { StatusWsMessage } from '../src/types/apiTypes.ts'
import type { StatusWsMessage } from '../src/schemas/apiSchema.ts'
import { comfyPageFixture } from './fixtures/ComfyPage'
import { webSocketFixture } from './fixtures/ws.ts'

View File

@@ -0,0 +1,37 @@
{
"last_node_id": 1,
"last_link_id": 0,
"nodes": [
{
"id": 1,
"type": "CLIPTextEncode",
"pos": [20, 50],
"size": [400, 200],
"flags": { "collapsed": true },
"order": 0,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": null,
"localized_name": "clip"
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": null,
"localized_name": "CONDITIONING"
}
],
"properties": {},
"widgets_values": ["Should not be displayed."]
}
],
"links": [],
"groups": [],
"config": {},
"version": 0.4
}

View File

@@ -114,7 +114,7 @@
{ "name": "VAE", "type": "VAE", "links": [8], "slot_index": 2 }
],
"properties": {},
"widgets_values": ["v1-5-pruned-emaonly.ckpt"]
"widgets_values": ["v1-5-pruned-emaonly-fp16.safetensors"]
}
],
"links": [

View File

@@ -0,0 +1,163 @@
{
"last_node_id": 19,
"last_link_id": 14,
"nodes": [
{
"id": 19,
"type": "workflow>two_VAE_decode",
"pos": [
1368.800048828125,
768.7999877929688
],
"size": [
418.1999816894531,
86
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": null
},
{
"name": "vae",
"type": "VAE",
"link": null
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": null
},
{
"name": "VAEDecode IMAGE",
"type": "IMAGE",
"links": null
}
],
"properties": {}
}
],
"links": [],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
0,
0
]
},
"node_versions": {},
"ue_links": [],
"groupNodes": {
"two_VAE_decode": {
"nodes": [
{
"id": -1,
"type": "VAEDecode",
"pos": [
1368.800048828125,
768.7999877929688
],
"size": [
210,
46
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": null,
"localized_name": "samples"
},
{
"name": "vae",
"type": "VAE",
"link": null,
"localized_name": "vae"
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": null,
"localized_name": "IMAGE"
}
],
"properties": {
"Node name for S&R": "VAEDecode"
},
"index": 0
},
{
"id": -1,
"type": "VAEDecode",
"pos": [
1368.800048828125,
873.7999877929688
],
"size": [
210,
46
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": null,
"localized_name": "samples"
},
{
"name": "vae",
"type": "VAE",
"link": null,
"localized_name": "vae"
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": null,
"localized_name": "IMAGE"
}
],
"properties": {
"Node name for S&R": "VAEDecode"
},
"index": 1
}
],
"links": [],
"external": [],
"config": {
"1": {
"input": {
"samples": {
"visible": false
},
"vae": {
"visible": false
}
}
}
}
}
}
},
"version": 0.4
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -18,7 +18,7 @@
{
"name": "fake_model.safetensors",
"url": "http://localhost:8188/api/devtools/fake_model.safetensors",
"directory": "clip"
"directory": "text_encoders"
}
],
"version": 0.4

View File

@@ -0,0 +1,49 @@
{
"last_node_id": 1,
"last_link_id": 1,
"nodes": [
{
"id": 1,
"type": "CheckpointLoaderSimple",
"pos": [256, 256],
"size": [315, 98],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": null
},
{
"name": "CLIP",
"type": "CLIP",
"links": null
},
{
"name": "VAE",
"type": "VAE",
"links": null
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple",
"models": [
{
"name": "fake_model.safetensors",
"url": "http://localhost:8188/api/devtools/fake_model.safetensors",
"directory": "text_encoders"
}
]
},
"widgets_values": ["fake_model.safetensors"]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {},
"version": 0.4
}

View File

@@ -0,0 +1,63 @@
{
"last_node_id": 1,
"last_link_id": 0,
"nodes": [
{
"id": 1,
"type": "UNKNOWN NODE",
"pos": [
48,
86
],
"size": {
"0": 358.80780029296875,
"1": 314.7989501953125
},
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": null,
"slot_index": 0
},
{
"name": "foo",
"type": "STRING",
"link": null,
"slot_index": 1,
"widget": {
"name": "foo"
}
}
],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": [],
"slot_index": 0,
"shape": 6
}
],
"properties": {
"Node name for S&R": "UNKNOWN NODE"
},
"widgets_values": [
"wd-v1-4-moat-tagger-v2",
0.35,
0.85,
false,
false,
""
]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {},
"version": 0.4
}

View File

@@ -0,0 +1,55 @@
{
"last_node_id": 2,
"last_link_id": 0,
"nodes": [
{
"id": 1,
"type": "Note",
"pos": [
50, 50
],
"size": [
322.3645935058594,
167.91612243652344
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {},
"widgets_values": [
"Foo\n123"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 2,
"type": "MarkdownNote",
"pos": [
50, 300
],
"size": [
320.9985656738281,
179.52735900878906
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {},
"widgets_values": [
"# Bar\n123"
],
"color": "#432",
"bgcolor": "#653"
}
],
"links": [],
"groups": [],
"config": {},
"extra": {},
"version": 0.4
}

View File

@@ -0,0 +1,37 @@
{
"last_node_id": 16,
"last_link_id": 17,
"nodes": [
{
"id": 16,
"type": "DevToolsNodeWithOptionalComboInput",
"pos": [1605, 480],
"size": [378, 58],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": null
}
],
"properties": {
"Node name for S&R": "DevToolsNodeWithOptionalComboInput"
},
"widgets_values": ["Random Unique Option 1740551583.3507228"]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 2.0875710456451313,
"offset": [-1311.5753953400676, -176.7620403697558]
}
},
"version": 0.4
}

View File

@@ -0,0 +1,59 @@
{
"last_node_id": 3,
"last_link_id": 1,
"nodes": [
{
"id": 1,
"type": "PrimitiveNode",
"pos": [14, 43],
"size": [203.1999969482422, 40.36840057373047],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "connect to widget input",
"type": "*",
"links": [],
"slot_index": 0
}
],
"properties": {
"Run widget replace on values": false
}
},
{
"id": 2,
"type": "CLIPTextEncode",
"pos": [306.2463684082031, 45.30042266845703],
"size": [400, 200],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": null
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": null
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [""]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {},
"version": 0.4
}

View File

@@ -0,0 +1,48 @@
{
"last_node_id": 15,
"last_link_id": 10,
"nodes": [
{
"id": 15,
"type": "DevToolsRemoteWidgetNode",
"pos": [
495,
735
],
"size": [
315,
58
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": null
}
],
"properties": {
"Node name for S&R": "DevToolsRemoteWidgetNode"
},
"widgets_values": [
"v1-5-pruned-emaonly-fp16.safetensors"
]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.8008869919566275,
"offset": [
538.9801226576359,
-55.24554581806672
]
}
},
"version": 0.4
}

View File

@@ -0,0 +1,101 @@
{
"last_node_id": 4,
"last_link_id": 2,
"nodes": [
{
"id": 3,
"type": "EmptyLatentImage",
"pos": [
380.51641845703125,
191.39659118652344
],
"size": [
315,
106
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "breadth",
"type": "INT",
"widget": {
"name": "breadth"
},
"link": 2
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": null
}
],
"properties": {
"Node name for S&R": "EmptyLatentImage"
},
"widgets_values": [
512,
512,
1
]
},
{
"id": 4,
"type": "PrimitiveNode",
"pos": [
73.6164321899414,
197.9966278076172
],
"size": [
210,
82
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "INT",
"type": "INT",
"widget": {
"name": "bredth"
},
"links": [
2
]
}
],
"title": "breadth",
"properties": {
"Run widget replace on values": false
},
"widgets_values": [
512,
"fixed"
]
}
],
"links": [
[
2,
4,
0,
3,
0,
"INT"
]
],
"groups": [],
"config": {},
"extra": {
"VHS_latentpreview": true,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": false,
"VHS_KeepIntermediate": false
},
"version": 0.4
}

View File

@@ -0,0 +1,110 @@
{
"last_node_id": 25,
"last_link_id": 33,
"nodes": [
{
"id": 4,
"type": "CheckpointLoaderSimple",
"pos": [160, 240],
"size": [315, 98],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": []
},
{
"name": "CLIP",
"type": "CLIP",
"slot_index": 1,
"links": []
},
{
"name": "VAE",
"type": "VAE",
"slot_index": 2,
"links": [33]
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": ["v1-5-pruned-emaonly.safetensors"]
},
{
"id": 19,
"type": "VAEDecode",
"pos": [623.0897216796875, 324.64453125],
"size": [210, 46],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": null
},
{
"name": "vae",
"type": "VAE",
"link": 33
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": null
}
],
"properties": {
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
}
],
"links": [[33, 4, 2, 19, 1, "VAE"]],
"floatingLinks": [
{
"id": 6,
"origin_id": 4,
"origin_slot": 2,
"target_id": -1,
"target_slot": -1,
"type": "VAE",
"parentId": 1
}
],
"groups": [],
"config": {},
"extra": {
"reroutes": [
{
"id": 1,
"pos": [545.4541015625, 295.85760498046875],
"linkIds": [],
"floating": {
"slotType": "output"
}
},
{
"id": 2,
"pos": [543.8283081054688, 355.45849609375],
"linkIds": [33]
}
],
"linkExtensions": [
{
"id": 33,
"parentId": 2
}
]
},
"version": 0.4
}

View File

@@ -0,0 +1,35 @@
{
"last_node_id": 11,
"last_link_id": 9,
"nodes": [
{
"id": 11,
"type": "DevToolsNodeWithBooleanInput",
"pos": [
0,
30
],
"size": [
315,
58
],
"flags": {
"collapsed": false
},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "DevToolsNodeWithBooleanInput"
},
"widgets_values": [
false
]
}
],
"links": [],
"groups": [],
"config": {},
"version": 0.4
}

View File

@@ -0,0 +1,32 @@
{
"last_node_id": 1,
"last_link_id": 0,
"nodes": [
{
"id": 1,
"type": "LoadAudio",
"pos": [41.5296516418457, 16.930862426757812],
"size": [315, 82],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "AUDIO",
"type": "AUDIO",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadAudio"
},
"widgets_values": [null, ""]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {},
"version": 0.4
}

View File

@@ -0,0 +1,46 @@
{
"last_node_id": 10,
"last_link_id": 10,
"nodes": [
{
"id": 10,
"type": "LoadImage",
"pos": [
50,
50
],
"size": [
315,
314
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": null
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"example.png",
"image"
]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {},
"version": 0.4
}

View File

@@ -0,0 +1,43 @@
{
"last_node_id": 10,
"last_link_id": 9,
"nodes": [
{
"id": 10,
"type": "DevToolsNodeWithSeedInput",
"pos": [
20,
50
],
"size": [
315,
82
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "DevToolsNodeWithSeedInput"
},
"widgets_values": [
0,
"randomize"
]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
0,
0
]
}
},
"version": 0.4
}

Binary file not shown.

View File

@@ -1,6 +1,6 @@
import { expect } from '@playwright/test'
import type { Palette } from '../src/types/colorPaletteTypes'
import type { Palette } from '../src/schemas/colorPaletteSchema'
import { comfyPageFixture as test } from './fixtures/ComfyPage'
const customColorPalettes: Record<string, Palette> = {
@@ -152,9 +152,10 @@ test.describe('Color Palette', () => {
// doesn't update the store immediately.
await comfyPage.setup()
await comfyPage.loadWorkflow('every_node_color')
await comfyPage.setSetting('Comfy.ColorPalette', 'obsidian_dark')
await expect(comfyPage.canvas).toHaveScreenshot(
'custom-color-palette-obsidian-dark.png'
'custom-color-palette-obsidian-dark-all-colors.png'
)
await comfyPage.setSetting('Comfy.ColorPalette', 'light_red')
await comfyPage.nextFrame()
@@ -232,7 +233,7 @@ test.describe('Node Color Adjustments', () => {
const workflow = await comfyPage.page.evaluate(() => {
return localStorage.getItem('workflow')
})
for (const node of JSON.parse(workflow).nodes) {
for (const node of JSON.parse(workflow ?? '{}').nodes) {
if (node.bgcolor) expect(node.bgcolor).not.toMatch(/hsla/)
if (node.color) expect(node.color).not.toMatch(/hsla/)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 102 KiB

View File

@@ -1,6 +1,6 @@
import { expect } from '@playwright/test'
import { Locator, expect } from '@playwright/test'
import { Keybinding } from '../src/types/keyBindingTypes'
import type { Keybinding } from '../src/schemas/keyBindingSchema'
import { comfyPageFixture as test } from './fixtures/ComfyPage'
test.describe('Load workflow warning', () => {
@@ -66,9 +66,76 @@ test.describe('Missing models warning', () => {
}, comfyPage.url)
})
test('Should display a warning when missing models are found', async ({
comfyPage
}) => {
await comfyPage.loadWorkflow('missing_models')
const missingModelsWarning = comfyPage.page.locator('.comfy-missing-models')
await expect(missingModelsWarning).toBeVisible()
const downloadButton = missingModelsWarning.getByLabel('Download')
await expect(downloadButton).toBeVisible()
})
test('Should display a warning when missing models are found in node properties', async ({
comfyPage
}) => {
// Load workflow that has a node with models metadata at the node level
await comfyPage.loadWorkflow('missing_models_from_node_properties')
const missingModelsWarning = comfyPage.page.locator('.comfy-missing-models')
await expect(missingModelsWarning).toBeVisible()
const downloadButton = missingModelsWarning.getByLabel('Download')
await expect(downloadButton).toBeVisible()
})
test('Should not display a warning when no missing models are found', async ({
comfyPage
}) => {
const modelFoldersRes = {
status: 200,
body: JSON.stringify([
{
name: 'text_encoders',
folders: ['ComfyUI/models/text_encoders']
}
])
}
comfyPage.page.route(
'**/api/experiment/models',
(route) => route.fulfill(modelFoldersRes),
{ times: 1 }
)
// Reload page to trigger indexing of model folders
await comfyPage.setup()
const clipModelsRes = {
status: 200,
body: JSON.stringify([
{
name: 'fake_model.safetensors',
pathIndex: 0
}
])
}
comfyPage.page.route(
'**/api/experiment/models/text_encoders',
(route) => route.fulfill(clipModelsRes),
{ times: 1 }
)
await comfyPage.loadWorkflow('missing_models')
const missingModelsWarning = comfyPage.page.locator('.comfy-missing-models')
await expect(missingModelsWarning).not.toBeVisible()
})
// Flaky test after parallelization
// https://github.com/Comfy-Org/ComfyUI_frontend/pull/1400
test.skip('Should display a warning when missing models are found', async ({
test.skip('Should download missing model when clicking download button', async ({
comfyPage
}) => {
// The fake_model.safetensors is served by
@@ -86,6 +153,49 @@ test.describe('Missing models warning', () => {
const download = await downloadPromise
expect(download.suggestedFilename()).toBe('fake_model.safetensors')
})
test.describe('Do not show again checkbox', () => {
let checkbox: Locator
let closeButton: Locator
test.beforeEach(async ({ comfyPage }) => {
await comfyPage.setSetting(
'Comfy.Workflow.ShowMissingModelsWarning',
true
)
await comfyPage.loadWorkflow('missing_models')
checkbox = comfyPage.page.getByLabel("Don't show this again")
closeButton = comfyPage.page.getByLabel('Close')
})
test('Should disable warning dialog when checkbox is checked', async ({
comfyPage
}) => {
await checkbox.click()
const changeSettingPromise = comfyPage.page.waitForRequest(
'**/api/settings/Comfy.Workflow.ShowMissingModelsWarning'
)
await closeButton.click()
await changeSettingPromise
const settingValue = await comfyPage.getSetting(
'Comfy.Workflow.ShowMissingModelsWarning'
)
expect(settingValue).toBe(false)
})
test('Should keep warning dialog enabled when checkbox is unchecked', async ({
comfyPage
}) => {
await closeButton.click()
const settingValue = await comfyPage.getSetting(
'Comfy.Workflow.ShowMissingModelsWarning'
)
expect(settingValue).toBe(true)
})
})
})
test.describe('Settings', () => {
@@ -148,7 +258,7 @@ test.describe('Settings', () => {
// Save keybinding
const saveButton = comfyPage.page
.getByLabel('Comfy.NewBlankWorkflow')
.getByLabel('New Blank Workflow')
.getByLabel('Save')
await saveButton.click()
@@ -165,3 +275,37 @@ test.describe('Settings', () => {
expect(request.postData()).toContain(JSON.stringify(expectedSetting))
})
})
test.describe('Feedback dialog', () => {
test('Should open from topmenu help command', async ({ comfyPage }) => {
// Open feedback dialog from top menu
await comfyPage.setSetting('Comfy.UseNewMenu', 'Top')
await comfyPage.menu.topbar.triggerTopbarCommand(['Help', 'Feedback'])
// Verify feedback dialog content is visible
const feedbackHeader = comfyPage.page.getByRole('heading', {
name: 'Feedback'
})
await expect(feedbackHeader).toBeVisible()
})
test('Should close when close button clicked', async ({ comfyPage }) => {
// Open feedback dialog
await comfyPage.setSetting('Comfy.UseNewMenu', 'Top')
await comfyPage.menu.topbar.triggerTopbarCommand(['Help', 'Feedback'])
const feedbackHeader = comfyPage.page.getByRole('heading', {
name: 'Feedback'
})
// Close feedback dialog
await comfyPage.page
.getByLabel('', { exact: true })
.getByLabel('Close')
.click()
await feedbackHeader.waitFor({ state: 'hidden' })
// Verify dialog is closed
await expect(feedbackHeader).not.toBeVisible()
})
})

View File

@@ -0,0 +1,27 @@
import { expect } from '@playwright/test'
import { comfyPageFixture as test } from './fixtures/ComfyPage'
test.describe('DOM Widget', () => {
test('Collapsed multiline textarea is not visible', async ({ comfyPage }) => {
await comfyPage.loadWorkflow('collapsed_multiline')
expect(comfyPage.page.locator('.comfy-multiline-input')).not.toBeVisible()
})
test('Multiline textarea correctly collapses', async ({ comfyPage }) => {
const multilineTextAreas = comfyPage.page.locator('.comfy-multiline-input')
const firstMultiline = multilineTextAreas.first()
const lastMultiline = multilineTextAreas.last()
await expect(firstMultiline).toBeVisible()
await expect(lastMultiline).toBeVisible()
const nodes = await comfyPage.getNodeRefsByType('CLIPTextEncode')
for (const node of nodes) {
await node.click('collapse')
}
await expect(firstMultiline).not.toBeVisible()
await expect(lastMultiline).not.toBeVisible()
})
})

View File

@@ -1,5 +1,6 @@
import { expect } from '@playwright/test'
import { SettingParams } from '../src/types/settingTypes'
import { comfyPageFixture as test } from './fixtures/ComfyPage'
test.describe('Topbar commands', () => {
@@ -134,6 +135,90 @@ test.describe('Topbar commands', () => {
expect(await comfyPage.getSetting('Comfy.TestSetting')).toBe(true)
expect(await comfyPage.page.evaluate(() => window['changeCount'])).toBe(2)
})
test.describe('Passing through attrs to setting components', () => {
const testCases: Array<{
config: Partial<SettingParams>
selector: string
}> = [
{
config: {
type: 'boolean',
defaultValue: true
},
selector: '.p-toggleswitch.p-component'
},
{
config: {
type: 'number',
defaultValue: 10
},
selector: '.p-inputnumber input'
},
{
config: {
type: 'slider',
defaultValue: 10
},
selector: '.p-slider.p-component'
},
{
config: {
type: 'combo',
defaultValue: 'foo',
options: ['foo', 'bar', 'baz']
},
selector: '.p-select.p-component'
},
{
config: {
type: 'text',
defaultValue: 'Hello'
},
selector: '.p-inputtext'
},
{
config: {
type: 'color',
defaultValue: '#000000'
},
selector: '.p-colorpicker-preview'
}
] as const
for (const { config, selector } of testCases) {
test(`${config.type} component should respect disabled attr`, async ({
comfyPage
}) => {
await comfyPage.page.evaluate((config) => {
window['app'].registerExtension({
name: 'TestExtension1',
settings: [
{
id: 'Comfy.TestSetting',
name: 'Test',
// The `disabled` attr is common to all settings components
attrs: { disabled: true },
...config
}
]
})
}, config)
await comfyPage.settingDialog.open()
const component = comfyPage.settingDialog.root
.getByText('TestSetting Test')
.locator(selector)
const isDisabled = await component.evaluate((el) =>
el.tagName === 'INPUT'
? (el as HTMLInputElement).disabled
: el.classList.contains('p-disabled')
)
expect(isDisabled).toBe(true)
})
}
})
})
test.describe('About panel', () => {
@@ -195,5 +280,63 @@ test.describe('Topbar commands', () => {
await comfyPage.confirmDialog.click('confirm')
expect(await comfyPage.page.evaluate(() => window['value'])).toBe(true)
})
test('Should allow dismissing a dialog', async ({ comfyPage }) => {
await comfyPage.page.evaluate(() => {
window['value'] = 'foo'
window['app'].extensionManager.dialog
.confirm({
title: 'Test Confirm',
message: 'Test Confirm Message'
})
.then((value: boolean) => {
window['value'] = value
})
})
await comfyPage.confirmDialog.click('reject')
expect(await comfyPage.page.evaluate(() => window['value'])).toBeNull()
})
})
test.describe('Selection Toolbox', () => {
test.beforeEach(async ({ comfyPage }) => {
await comfyPage.setSetting('Comfy.Canvas.SelectionToolbox', true)
})
test('Should allow adding commands to selection toolbox', async ({
comfyPage
}) => {
// Register an extension with a selection toolbox command
await comfyPage.page.evaluate(() => {
window['app'].registerExtension({
name: 'TestExtension1',
commands: [
{
id: 'test.selection.command',
label: 'Test Command',
icon: 'pi pi-star',
function: () => {
window['selectionCommandExecuted'] = true
}
}
],
getSelectionToolboxCommands: () => ['test.selection.command']
})
})
await comfyPage.selectNodes(['CLIP Text Encode (Prompt)'])
// Click the command button in the selection toolbox
const toolboxButton = comfyPage.page.locator(
'.selection-toolbox button:has(.pi-star)'
)
await toolboxButton.click()
// Verify the command was executed
expect(
await comfyPage.page.evaluate(() => window['selectionCommandExecuted'])
).toBe(true)
})
})
})

View File

@@ -0,0 +1,97 @@
import type { Mouse } from '@playwright/test'
import type { ComfyPage } from './ComfyPage'
import type { Position } from './types'
/**
* Used for drag and drop ops
* @see
* - {@link Mouse.down}
* - {@link Mouse.move}
* - {@link Mouse.up}
*/
export interface DragOptions {
button?: 'left' | 'right' | 'middle'
clickCount?: number
steps?: number
}
/**
* Wraps mouse drag and drop to work with a canvas-based app.
*
* Requires the next frame animated before and after all steps, giving the
* canvas time to render the changes before screenshots are taken.
*/
export class ComfyMouse implements Omit<Mouse, 'move'> {
static defaultSteps = 5
static defaultOptions: DragOptions = { steps: ComfyMouse.defaultSteps }
constructor(readonly comfyPage: ComfyPage) {}
/** The normal Playwright {@link Mouse} property from {@link ComfyPage.page}. */
get mouse() {
return this.comfyPage.page.mouse
}
async nextFrame() {
await this.comfyPage.nextFrame()
}
/** Drags from current location to a new location and hovers there (no pointerup event) */
async drag(to: Position, options = ComfyMouse.defaultOptions) {
const { steps, ...downOptions } = options
await this.mouse.down(downOptions)
await this.nextFrame()
await this.move(to, { steps })
await this.nextFrame()
}
async drop(options = ComfyMouse.defaultOptions) {
await this.mouse.up(options)
await this.nextFrame()
}
async dragAndDrop(
from: Position,
to: Position,
options = ComfyMouse.defaultOptions
) {
const { steps } = options
await this.nextFrame()
await this.move(from, { steps })
await this.drag(to, options)
await this.drop(options)
}
/** @see {@link Mouse.move} */
async move(to: Position, options = ComfyMouse.defaultOptions) {
await this.mouse.move(to.x, to.y, options)
await this.nextFrame()
}
//#region Pass-through
async click(...args: Parameters<Mouse['click']>) {
return await this.mouse.click(...args)
}
async dblclick(...args: Parameters<Mouse['dblclick']>) {
return await this.mouse.dblclick(...args)
}
async down(...args: Parameters<Mouse['down']>) {
return await this.mouse.down(...args)
}
async up(...args: Parameters<Mouse['up']>) {
return await this.mouse.up(...args)
}
async wheel(...args: Parameters<Mouse['wheel']>) {
return await this.mouse.wheel(...args)
}
//#endregion Pass-through
}

View File

@@ -1,15 +1,17 @@
import type { LGraphNode } from '@comfyorg/litegraph'
import type { APIRequestContext, Locator, Page } from '@playwright/test'
import { expect } from '@playwright/test'
import { test as base } from '@playwright/test'
import dotenv from 'dotenv'
import * as fs from 'fs'
import type { NodeId } from '../../src/schemas/comfyWorkflowSchema'
import type { KeyCombo } from '../../src/schemas/keyBindingSchema'
import type { useWorkspaceStore } from '../../src/stores/workspaceStore'
import type { NodeId } from '../../src/types/comfyWorkflow'
import type { KeyCombo } from '../../src/types/keyBindingTypes'
import { NodeBadgeMode } from '../../src/types/nodeSource'
import { ComfyActionbar } from '../helpers/actionbar'
import { ComfyTemplates } from '../helpers/templates'
import { ComfyMouse } from './ComfyMouse'
import { ComfyNodeSearchBox } from './components/ComfyNodeSearchBox'
import { SettingDialog } from './components/SettingDialog'
import {
@@ -278,8 +280,8 @@ export class ComfyPage {
await this.page.addStyleTag({
content: `
* {
font-family: 'Roboto Mono', 'Noto Color Emoji';
}`
font-family: 'Roboto Mono', 'Noto Color Emoji';
}`
})
await this.page.waitForFunction(() => document.fonts.ready)
await this.page.waitForFunction(
@@ -467,6 +469,7 @@ export class ComfyPage {
const getFileType = (fileName: string) => {
if (fileName.endsWith('.png')) return 'image/png'
if (fileName.endsWith('.webp')) return 'image/webp'
if (fileName.endsWith('.webm')) return 'video/webm'
if (fileName.endsWith('.json')) return 'application/json'
return 'application/octet-stream'
}
@@ -646,6 +649,18 @@ export class ComfyPage {
await this.nextFrame()
}
async selectNodes(nodeTitles: string[]) {
await this.page.keyboard.down('Control')
for (const nodeTitle of nodeTitles) {
const nodes = await this.getNodeRefsByTitle(nodeTitle)
for (const node of nodes) {
await node.click('title')
}
}
await this.page.keyboard.up('Control')
await this.nextFrame()
}
async select2Nodes() {
// Select 2 CLIP nodes.
await this.page.keyboard.down('Control')
@@ -835,12 +850,24 @@ export class ComfyPage {
(
await this.page.evaluate((type) => {
return window['app'].graph.nodes
.filter((n) => n.type === type)
.map((n) => n.id)
.filter((n: LGraphNode) => n.type === type)
.map((n: LGraphNode) => n.id)
}, type)
).map((id: NodeId) => this.getNodeRefById(id))
)
}
async getNodeRefsByTitle(title: string): Promise<NodeReference[]> {
return Promise.all(
(
await this.page.evaluate((title) => {
return window['app'].graph.nodes
.filter((n: LGraphNode) => n.title === title)
.map((n: LGraphNode) => n.id)
}, title)
).map((id: NodeId) => this.getNodeRefById(id))
)
}
async getFirstNodeRef(): Promise<NodeReference | null> {
const id = await this.page.evaluate(() => {
return window['app'].graph.nodes[0]?.id
@@ -884,11 +911,14 @@ export class ComfyPage {
}
}
export const comfyPageFixture = base.extend<{ comfyPage: ComfyPage }>({
comfyPage: async ({ page, request }, use) => {
export const comfyPageFixture = base.extend<{
comfyPage: ComfyPage
comfyMouse: ComfyMouse
}>({
comfyPage: async ({ page, request }, use, testInfo) => {
const comfyPage = new ComfyPage(page, request)
const { parallelIndex } = comfyPageFixture.info()
const { parallelIndex } = testInfo
const username = `playwright-test-${parallelIndex}`
const userId = await comfyPage.setupUser(username)
comfyPage.userIds[parallelIndex] = userId
@@ -896,15 +926,18 @@ export const comfyPageFixture = base.extend<{ comfyPage: ComfyPage }>({
try {
await comfyPage.setupSettings({
'Comfy.UseNewMenu': 'Disabled',
// Hide canvas menu/info by default.
// Hide canvas menu/info/selection toolbox by default.
'Comfy.Graph.CanvasInfo': false,
'Comfy.Graph.CanvasMenu': false,
'Comfy.Canvas.SelectionToolbox': false,
// Hide all badges by default.
'Comfy.NodeBadge.NodeIdBadgeMode': NodeBadgeMode.None,
'Comfy.NodeBadge.NodeSourceBadgeMode': NodeBadgeMode.None,
// Disable tooltips by default to avoid flakiness.
'Comfy.EnableTooltips': false,
'Comfy.userId': userId
'Comfy.userId': userId,
// Set tutorial completed to true to avoid loading the tutorial workflow.
'Comfy.TutorialCompleted': true
})
} catch (e) {
console.error(e)
@@ -912,6 +945,10 @@ export const comfyPageFixture = base.extend<{ comfyPage: ComfyPage }>({
await comfyPage.setup()
await use(comfyPage)
},
comfyMouse: async ({ comfyPage }, use) => {
const comfyMouse = new ComfyMouse(comfyPage)
use(comfyMouse)
}
})

View File

@@ -3,6 +3,10 @@ import { Page } from '@playwright/test'
export class SettingDialog {
constructor(public readonly page: Page) {}
get root() {
return this.page.locator('div.settings-container')
}
async open() {
const button = this.page.locator('button.comfy-settings-btn:visible')
await button.click()

View File

@@ -95,18 +95,6 @@ export class WorkflowsSidebarTab extends SidebarTab {
return this.page.locator('.workflows-sidebar-tab')
}
get browseGalleryButton() {
return this.root.locator('.browse-templates-button')
}
get newBlankWorkflowButton() {
return this.root.locator('.new-blank-workflow-button')
}
get openWorkflowButton() {
return this.root.locator('.open-workflow-button')
}
async getOpenedWorkflowNames() {
return await this.root
.locator('.comfyui-workflows-open .node-label')
@@ -194,6 +182,10 @@ export class QueueSidebarTab extends SidebarTab {
return this.root.locator('.no-results-placeholder')
}
get galleryImage() {
return this.page.locator('.galleria-image')
}
private getToggleExpandButton(isExpanded: boolean) {
const iconSelector = isExpanded ? '.pi-image' : '.pi-images'
return this.root.locator(`.toggle-expanded-button ${iconSelector}`)
@@ -256,14 +248,24 @@ export class QueueSidebarTab extends SidebarTab {
async openTaskPreview(taskIndex: number) {
const previewButton = this.getTaskPreviewButton(taskIndex)
await previewButton.hover()
await previewButton.click()
return this.getGalleryImage(taskIndex).waitFor({ state: 'visible' })
return this.galleryImage.waitFor({ state: 'visible' })
}
getGalleryImage(galleryItemIndex: number) {
// Aria labels of Galleria items are 1-based indices
const galleryLabel = `${galleryItemIndex + 1}`
return this.page.getByLabel(galleryLabel).locator('.galleria-image')
getGalleryImage(imageFilename: string) {
return this.galleryImage.and(this.page.getByAltText(imageFilename))
}
getTaskImage(imageFilename: string) {
return this.tasks.getByAltText(imageFilename)
}
/** Trigger the queue store and tasks to update */
async triggerTasksUpdate() {
await this.page.evaluate(() => {
window['app']['api'].dispatchCustomEvent('status', {
exec_info: { queue_remaining: 0 }
})
})
}
}

View File

@@ -1,10 +1,17 @@
import type { Page } from '@playwright/test'
import type { NodeId } from '../../../src/types/comfyWorkflow'
import type { NodeId } from '../../../src/schemas/comfyWorkflowSchema'
import { ManageGroupNode } from '../../helpers/manageGroupNode'
import type { ComfyPage } from '../ComfyPage'
import type { Position, Size } from '../types'
export const getMiddlePoint = (pos1: Position, pos2: Position) => {
return {
x: (pos1.x + pos2.x) / 2,
y: (pos1.y + pos2.y) / 2
}
}
export class NodeSlotReference {
constructor(
readonly type: 'input' | 'output',
@@ -62,6 +69,9 @@ export class NodeWidgetReference {
readonly node: NodeReference
) {}
/**
* @returns The position of the widget's center
*/
async getPosition(): Promise<Position> {
const pos: [number, number] = await this.node.comfyPage.page.evaluate(
([id, index]) => {
@@ -83,6 +93,28 @@ export class NodeWidgetReference {
y: pos[1]
}
}
async click() {
await this.node.comfyPage.canvas.click({
position: await this.getPosition()
})
}
async dragHorizontal(delta: number) {
const pos = await this.getPosition()
const canvas = this.node.comfyPage.canvas
const canvasPos = (await canvas.boundingBox())!
this.node.comfyPage.dragAndDrop(
{
x: canvasPos.x + pos.x,
y: canvasPos.y + pos.y
},
{
x: canvasPos.x + pos.x + delta,
y: canvasPos.y + pos.y
}
)
}
}
export class NodeReference {

View File

@@ -8,7 +8,7 @@ import type {
HistoryTaskItem,
TaskItem,
TaskOutput
} from '../../../src/types/apiTypes'
} from '../../../src/schemas/apiSchema'
import type { ComfyPage } from '../ComfyPage'
/** keyof TaskOutput[string] */
@@ -132,11 +132,12 @@ export default class TaskHistory {
private addTask(task: HistoryTaskItem) {
setPromptId(task)
setQueueIndex(task)
this.tasks.push(task)
this.tasks.unshift(task) // Tasks are added to the front of the queue
}
clearTasks() {
clearTasks(): this {
this.tasks = []
return this
}
withTask(
@@ -155,7 +156,7 @@ export default class TaskHistory {
/** Repeats the last task in the task history a specified number of times. */
repeat(n: number): this {
for (let i = 0; i < n; i++)
this.addTask(structuredClone(this.tasks.at(-1)) as HistoryTaskItem)
this.addTask(structuredClone(this.tasks.at(0)) as HistoryTaskItem)
return this
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View File

@@ -134,6 +134,37 @@ test.describe('Group Node', () => {
expect(await manage2.getSelectedNodeType()).toBe('g2')
})
test('Preserves hidden input configuration when containing duplicate node types', async ({
comfyPage
}) => {
await comfyPage.loadWorkflow('group_node_identical_nodes_hidden_inputs')
await comfyPage.nextFrame()
const groupNodeId = 19
const groupNodeName = 'two_VAE_decode'
const totalInputCount = await comfyPage.page.evaluate((nodeName) => {
const {
extra: { groupNodes }
} = window['app'].graph
const { nodes } = groupNodes[nodeName]
return nodes.reduce((acc: number, node) => {
return acc + node.inputs.length
}, 0)
}, groupNodeName)
const visibleInputCount = await comfyPage.page.evaluate((id) => {
const node = window['app'].graph.getNodeById(id)
return node.inputs.length
}, groupNodeId)
// Verify there are 4 total inputs (2 VAE decode nodes with 2 inputs each)
expect(totalInputCount).toBe(4)
// Verify there are 2 visible inputs (2 have been hidden in config)
expect(visibleInputCount).toBe(2)
})
test('Reconnects inputs after configuration changed via manage dialog save', async ({
comfyPage
}) => {

View File

@@ -1,4 +1,10 @@
import { Locator, Page } from '@playwright/test'
import path from 'path'
import {
TemplateInfo,
WorkflowTemplates
} from '../../src/types/workflowTemplateTypes'
export class ComfyTemplates {
readonly content: Locator
@@ -8,6 +14,20 @@ export class ComfyTemplates {
}
async loadTemplate(id: string) {
await this.content.getByTestId(`template-workflow-${id}`).click()
await this.content
.getByTestId(`template-workflow-${id}`)
.getByRole('img')
.click()
}
async getAllTemplates(): Promise<TemplateInfo[]> {
const templates: WorkflowTemplates[] = await this.page.evaluate(() =>
window['app'].api.getCoreWorkflowTemplates()
)
return templates.flatMap((t) => t.templates)
}
getTemplatePath(filename: string): string {
return path.join('public', 'templates', filename)
}
}

View File

@@ -49,7 +49,7 @@ test.describe('Node Interaction', () => {
})
})
test('Can highlight selected', async ({ comfyPage }) => {
test('@2x Can highlight selected', async ({ comfyPage }) => {
await expect(comfyPage.canvas).toHaveScreenshot('default.png')
await comfyPage.clickTextEncodeNode1()
await expect(comfyPage.canvas).toHaveScreenshot('selected-node1.png')
@@ -103,9 +103,7 @@ test.describe('Node Interaction', () => {
})
})
// Chromium 2x cannot move link.
// See https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/10876381315/job/30176211513
test.skip('Can move link', async ({ comfyPage }) => {
test('Can move link', async ({ comfyPage }) => {
await comfyPage.dragAndDrop(
comfyPage.clipTextEncodeNode1InputSlot,
comfyPage.emptySpace
@@ -118,10 +116,7 @@ test.describe('Node Interaction', () => {
await expect(comfyPage.canvas).toHaveScreenshot('moved-link.png')
})
// Copy link is not working on CI at all
// Chromium 2x recognize it as dragging canvas.
// Chromium triggers search box after link release. The link is indeed copied.
// See https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/10876381315/job/30176211513
// Shift drag copy link regressed. See https://github.com/Comfy-Org/ComfyUI_frontend/issues/2941
test.skip('Can copy link by shift-drag existing link', async ({
comfyPage
}) => {
@@ -140,20 +135,14 @@ test.describe('Node Interaction', () => {
})
test('Auto snap&highlight when dragging link over node', async ({
comfyPage
comfyPage,
comfyMouse
}) => {
await comfyPage.setSetting('Comfy.Node.AutoSnapLinkToSlot', true)
await comfyPage.setSetting('Comfy.Node.SnapHighlightsNode', true)
await comfyPage.page.mouse.move(
comfyPage.clipTextEncodeNode1InputSlot.x,
comfyPage.clipTextEncodeNode1InputSlot.y
)
await comfyPage.page.mouse.down()
await comfyPage.page.mouse.move(
comfyPage.clipTextEncodeNode2InputSlot.x,
comfyPage.clipTextEncodeNode2InputSlot.y
)
await comfyMouse.move(comfyPage.clipTextEncodeNode1InputSlot)
await comfyMouse.drag(comfyPage.clipTextEncodeNode2InputSlot)
await expect(comfyPage.canvas).toHaveScreenshot('snapped-highlighted.png')
})
})
@@ -330,16 +319,12 @@ test.describe('Node Interaction', () => {
await expect(comfyPage.canvas).toHaveScreenshot('group-fit-to-contents.png')
})
// Somehow this test fails on GitHub Actions. It works locally.
// https://github.com/Comfy-Org/ComfyUI_frontend/pull/736
test.skip('Can pin/unpin nodes with keyboard shortcut', async ({
comfyPage
}) => {
test('Can pin/unpin nodes', async ({ comfyPage }) => {
await comfyPage.select2Nodes()
await comfyPage.canvas.press('KeyP')
await comfyPage.executeCommand('Comfy.Canvas.ToggleSelectedNodes.Pin')
await comfyPage.nextFrame()
await expect(comfyPage.canvas).toHaveScreenshot('nodes-pinned.png')
await comfyPage.canvas.press('KeyP')
await comfyPage.executeCommand('Comfy.Canvas.ToggleSelectedNodes.Pin')
await comfyPage.nextFrame()
await expect(comfyPage.canvas).toHaveScreenshot('nodes-unpinned.png')
})
@@ -506,24 +491,24 @@ test.describe('Canvas Interaction', () => {
expect(await getCursorStyle()).toBe('default')
})
test('Can pan when dragging a link', async ({ comfyPage }) => {
test('Can pan when dragging a link', async ({ comfyPage, comfyMouse }) => {
const posSlot1 = comfyPage.clipTextEncodeNode1InputSlot
await comfyPage.page.mouse.move(posSlot1.x, posSlot1.y)
await comfyPage.page.mouse.down()
await comfyMouse.move(posSlot1)
const posEmpty = comfyPage.emptySpace
await comfyPage.page.mouse.move(posEmpty.x, posEmpty.y)
await comfyMouse.drag(posEmpty)
await expect(comfyPage.canvas).toHaveScreenshot('dragging-link1.png')
await comfyPage.page.keyboard.down('Space')
await comfyPage.page.mouse.move(posEmpty.x + 100, posEmpty.y + 100)
await comfyMouse.mouse.move(posEmpty.x + 100, posEmpty.y + 100)
// Canvas should be panned.
await expect(comfyPage.canvas).toHaveScreenshot(
'panning-when-dragging-link.png'
)
await comfyPage.page.keyboard.up('Space')
await comfyPage.page.mouse.move(posEmpty.x, posEmpty.y)
await comfyMouse.move(posEmpty)
// Should be back to dragging link mode when space is released.
await expect(comfyPage.canvas).toHaveScreenshot('dragging-link2.png')
await comfyPage.page.mouse.up()
await comfyMouse.drop()
})
test('Can pan very far and back', async ({ comfyPage }) => {
@@ -688,7 +673,7 @@ test.describe('Load duplicate workflow', () => {
}) => {
await comfyPage.loadWorkflow('single_ksampler')
await comfyPage.menu.workflowsTab.open()
await comfyPage.menu.workflowsTab.newBlankWorkflowButton.click()
await comfyPage.executeCommand('Comfy.NewBlankWorkflow')
await comfyPage.loadWorkflow('single_ksampler')
expect(await comfyPage.getGraphNodesCount()).toBe(1)
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Some files were not shown because too many files have changed in this diff Show More