Compare commits

...

349 Commits

Author SHA1 Message Date
Chenlei Hu
d2b3e325a4 1.2.50 (#798) 2024-09-12 17:16:54 +09:00
Chenlei Hu
c99ca004b4 Fix badge position on collapsed nodes (#797)
* Update litegraph (Proper collapsed node handling)

* Add playwright test

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-12 17:15:20 +09:00
Chenlei Hu
fa9a415c62 Fix litegraph crash on using custom colorPalette (#795) 2024-09-12 16:56:17 +09:00
Chenlei Hu
da3271fe57 Move InputSlider to common/ (#794) 2024-09-12 15:19:36 +09:00
Chenlei Hu
358c0ce83c Update litegraph (Pin/Unpin selected nodes) (#791)
* Update litegraph (Pin/Unpin selected nodes)

* Checkout head_ref first

* nit

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-12 15:04:43 +09:00
Chenlei Hu
110c007912 Update litegraph (Proper ContextMenu export) (#790) 2024-09-12 14:09:00 +09:00
Chenlei Hu
fdb01c06f2 Split playwright tests to multiple runners by project (#789) 2024-09-12 11:35:36 +09:00
Chenlei Hu
ca6bf7d054 Split jest unit test and playwright test into different actions (#787)
* Split jest unit test and playwright test into different actions

* Use composite action

* Add tag v1
2024-09-12 10:54:50 +09:00
Chenlei Hu
14f5019556 1.2.49 (#788) 2024-09-12 10:16:59 +09:00
Chenlei Hu
80ca1808f0 Node source/id badge (#781)
* Add basic node badge

* Node source badge

* Prevent manager badge rendering

* Update litegraph (Badge support)

* Add playwright tests

* Separate nodes

* nit

* Checkout devtools repo for browser test expectation CI

* Fix failing unittests

* Rename setting

* Hide all badges in playwright tests

* Handle group node

* Update test expectations [skip ci]

* Fix unittest

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-12 09:36:06 +09:00
Chenlei Hu
f2a30ec197 Fix missing model dialog test (#782) 2024-09-11 21:00:32 +09:00
Chenlei Hu
b8bdba0bcc Fix tailwindcss in NoResultsPlaceholder.vue (#780) 2024-09-11 17:38:42 +09:00
Chenlei Hu
baf0bc8de4 Run all playwright tests under dpr=2 (#779)
* Run all playwright tests under dpr=2

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-11 11:33:40 +09:00
Chenlei Hu
8ce7b515a3 Fix ComfyExtension types (#778) 2024-09-11 10:43:01 +09:00
Chenlei Hu
06a05cb283 Fix loading large workflow embedded in webp (#777)
* Fix loading large workflow embedded in webp

* Update test expectations [skip ci]

* nit

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-11 10:12:01 +09:00
bymyself
15758101aa Fix searchbox popover on touch devices (#773)
* Add delay on touch pointer event when opening searchbox

* Add playwright mobile test
2024-09-11 08:55:04 +09:00
ArtificialLab
05b3ad2f59 Front stack primary updates and improvements (#757)
* (fix) index.html formating for prettier

* (add) proper icon management
- on-demand icons auto importing
- handle all available icon sets (https://icones.js.org)

* (fix) proper css management

* (add) front stack improvement:
- implement vue router
- prepare for App.vue simplification
- proper management of views and layouts
- fix Tailwind CSS and prepare for overall css cleaning

* (fix) move back user.css to public dir

* (fix) remove user.css import from main.ts
2024-09-11 08:53:54 +09:00
bymyself
90abf9744c Document registerCustomNodes (#772) 2024-09-10 12:43:39 +09:00
filtered
0e01bb3c07 Fix reroute to wildcard & multi-typed slots (#769)
Use the same type check the rest of the connection process uses.
2024-09-09 17:53:47 +09:00
Chenlei Hu
8b77dde55a [skip ci] Update litegraph dev guide (#770) 2024-09-09 17:51:44 +09:00
Chenlei Hu
a41de30dc5 Fix tailwind css setup (#768)
* Fix tailwind css setup

* Install as dev dep

* Uninstall primeui tailwind
2024-09-09 16:56:32 +09:00
Chenlei Hu
534ea17816 1.2.48 (#767) 2024-09-09 16:20:01 +09:00
Chenlei Hu
913582c7cd [Chore] Update primevue (#766) 2024-09-09 16:14:20 +09:00
Chenlei Hu
3779878b57 Update litegraph (Bug fixes) (#765) 2024-09-09 16:11:28 +09:00
Chenlei Hu
023299cf1a Fix loading workflow from of edited webp (#764)
* Fix loading workflow from of edited webp

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-09 16:07:15 +09:00
Chenlei Hu
23796d9040 Any keyboard layout for Ctrl + V, Z, Y... (#763)
* Any keyboard layout for Ctrl + V, Z, Y...

`if` conditioning changed for better support any keyboard layout for shortcuts

* Format

---------

Co-authored-by: Khachatur Avanesian <jailbreakvideo@gmail.com>
2024-09-09 10:17:14 +09:00
bymyself
21c3883cc7 Improve beta menu nav accessibility (#762)
* Add ARIA labels to beta menu btns without text

* Adjust test locator
2024-09-09 09:49:43 +09:00
bymyself
616e295262 Improve searchbox accessibility (#760)
* Set field key for search result options label

* Add playwright test

* Add role attr to search dialog
2024-09-09 09:49:02 +09:00
bymyself
c201e86b97 Improve sidebar accessibility (#759)
* Add ARIA label to sidebar buttons

* Add component test

* Add generalized component tests
2024-09-09 09:48:29 +09:00
bymyself
61ee43aa6f [skip ci] Fix search box props type (#753) 2024-09-07 02:34:47 -04:00
bymyself
08a1fd0056 Dismiss gallery lightbox on background click (#752)
* Dismiss gallery on background click

* Add vitest tests
2024-09-07 02:32:56 -04:00
Chenlei Hu
56f3842045 1.2.47 (#747) 2024-09-05 11:41:00 -04:00
Chenlei Hu
81bc0fd9cb Release script (#746)
* Update main repo release script

* update readme [skip ci]
2024-09-05 11:40:05 -04:00
Chenlei Hu
38c957d3a9 Fix load of string node id workflow (#744)
* Update litegraph

* Fix string node id

* Add playwright test

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-05 11:16:41 -04:00
Chenlei Hu
9d855d637e Ignore missing dialog (#743)
* Do not report missing nodes/models warning repeatedly

* Add playwright tests

* cast finalOptions, add comments to interface

* Use old menu in tests to not break top left click methods

* Assert no dialog on undo and on redo separately

* nit

* nit

---------

Co-authored-by: christian-byrne <abolkonsky.rem@gmail.com>
2024-09-05 11:00:41 -04:00
bymyself
743683c01d Add logging setting display name (#742) 2024-09-05 10:39:22 -04:00
Chenlei Hu
720e7e112d 1.2.46 (#738) 2024-09-04 20:29:14 -04:00
Chenlei Hu
ce157afeac Disable minify on release dist (#737) 2024-09-04 20:28:38 -04:00
Chenlei Hu
95701ab761 Add keyboard shortcut for pin/unpin node (#736)
* Add keyboard shortcut for pin/unpin node

* Add playwright test

* Add nextFrame calls

* Keyboard event on canvas

* disable test
2024-09-04 20:26:10 -04:00
Alex "mcmonkey" Goodwin
060e61f0db initial model store (#674)
* initial model store

* refactor the 'modelstoreserviceimpl' to pinia

* pepper in some reactive

the inner ModelStore (per-folder) can't be pinia because its made of temporary instances, but it can be reactive

* use refs in metadata class

* remove 'reactive'

* remove ref too

* add simple unit tests for modelStore

* make things worse via autoformatting

* move mock impls to a function
2024-09-04 19:59:40 -04:00
Chenlei Hu
6c7fb5041d Replace locking with pining in core (#734)
* Replace locking with pin in core

* Add extra expectation

* Update litegraph

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-04 19:59:06 -04:00
Chenlei Hu
25a3c30fef [skip ci] Update README (#733) 2024-09-04 10:31:12 -04:00
Chenlei Hu
287bd7ddd0 Add test on text widget popover dismiss (#732)
* Add test on text widget popover dismiss (#719)

* nit

* Update test expectations [skip ci]

---------

Co-authored-by: bymyself <abolkonsky.rem@gmail.com>
Co-authored-by: github-actions <github-actions@github.com>
2024-09-04 10:31:01 -04:00
Chenlei Hu
b396d1a9fe Trigger searchbox on group body db click (#731) 2024-09-04 10:16:12 -04:00
Chenlei Hu
ada8500d21 1.2.45 (#727) 2024-09-03 20:17:34 -04:00
Chenlei Hu
0f32ab334a Update litegraph (Group highlight option) (#725) 2024-09-03 15:34:01 -04:00
Chenlei Hu
36cdebcad1 Restore context menu for new searchbox (#724)
* Searchbox revamp

* nit

* nit

* Add playwright test

* Update litegraph

* Rename setting

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-03 13:28:26 -04:00
Chenlei Hu
974a7ef63f Store shallowRef of litegraph canvas (#722)
* Store shallowRef of litegraph canvas

* nit
2024-09-03 10:11:31 -04:00
bymyself
b49b19c9b0 [skip ci] Add ToastMessageOptions docs to README (#721) 2024-09-03 08:10:23 -04:00
bymyself
a5d93f6910 Update Settings type with new fields (#718) 2024-09-02 22:50:56 -04:00
Chenlei Hu
8a99124470 1.2.44 (#716) 2024-09-02 20:31:01 -04:00
Chenlei Hu
4a230f720e Edit group name on group creation (With Ctrl + g) (#715)
* Editor store

* Merge editors

* nit

* Edit on group creation

* nit
2024-09-02 20:20:40 -04:00
Chenlei Hu
4ad1e67ebf Double click group title to edit (#714)
* Double click group title to edit

* Add playwright test

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-02 18:01:02 -04:00
Chenlei Hu
80e4384644 Eager init nodeSearchService (#713) 2024-09-02 15:40:10 -04:00
Chenlei Hu
51b7467012 Auto transforms bugged node pos (#712) 2024-09-02 14:41:45 -04:00
Chenlei Hu
9d69db6db7 Update litegraph (Fix node.pos serialization) (#711) 2024-09-02 14:34:58 -04:00
Chenlei Hu
e733b87f22 Add beforeRegisterVueAppNodeDefs hook (#709)
* Add beforeRegisterVueAppNodeDefs hook

* Remove min-char constraint on node library search
2024-09-02 11:06:16 -04:00
Chenlei Hu
adcef7d2f4 Add locale setting (#708) 2024-09-02 10:01:00 -04:00
mijuku233
8ba5da14bc Custom background image (#698) 2024-09-01 19:46:55 -04:00
Chenlei Hu
c181bf1f55 1.2.43 (#705) 2024-09-01 19:01:16 -04:00
Chenlei Hu
d9a7537169 Fix top level bookmark migration (#706) 2024-09-01 18:55:56 -04:00
Chenlei Hu
75e91137f0 Display node display_name instead of name (#704) 2024-09-01 18:33:19 -04:00
Chenlei Hu
a4a298924e Show node id name in node searchbox (#703)
* Show node unique name in node searchbox

* nit
2024-09-01 18:12:27 -04:00
Chenlei Hu
14da8433f7 Migrate node library sidebar to use unique name instead of display name (#702)
* Migrate node library sidebar to use unique name instead of display name

* Break word
2024-09-01 17:52:53 -04:00
Chenlei Hu
ff2d160230 Reduce divider margin in node library (#701) 2024-09-01 14:49:31 -04:00
Chenlei Hu
b0b5f92940 Add setting to control tree explorer item padding (#700) 2024-09-01 14:36:15 -04:00
Chenlei Hu
d04dbcd2c1 [Major Refactor] Use TreeExplorer on nodeLibrarySidebarTab (#699)
* Basic move

* Add back node bookmark

* Move node preview

* Fix drag node to canvas

* Restore click node to add to canvas

* Split bookmark tree and library tree

* Migrate rename and delete context menu

* Fix expanded keys

* Split components

* Support extra menu items

* Context menu only for folder

* Migrate add folder

* Handle drop

* Store color customization

* remove extra padding

* Do not show context menu if no item

* Hide divider if no bookmark

* Sort bookmarks alphabetically default

* nit

* proper edit

* Update test selectors

* Auto expand on item drop

* nit

* Fix tests

* Search also searches bookmarks tree

* Add serach playwright test
2024-09-01 14:03:15 -04:00
huchenlei
5383f97eba Add tree explorer tree node test 2024-08-31 21:10:32 -04:00
huchenlei
bc7da487e8 Add drop handler 2024-08-31 21:10:32 -04:00
huchenlei
86e7c12e27 Add draggable/droppable flags 2024-08-31 21:10:32 -04:00
huchenlei
50f1ca8eaf Add extra interfaces 2024-08-31 21:10:32 -04:00
huchenlei
280b43fd58 Merge folder and node impl 2024-08-31 21:10:32 -04:00
huchenlei
488f0d82b4 More refactor 2024-08-31 21:10:32 -04:00
huchenlei
bc3ec65967 Move 2024-08-31 21:10:32 -04:00
huchenlei
61342edba0 1.2.42 2024-08-31 09:56:05 -04:00
huchenlei
9247aec03a nit 2024-08-31 09:54:36 -04:00
huchenlei
0e88308571 Remove github button in error dialog 2024-08-31 09:54:36 -04:00
huchenlei
380cbdd5fc 1.2.41 2024-08-30 21:27:06 -04:00
huchenlei
68d6b1f172 Add confirm dialog on window close 2024-08-30 16:51:10 -04:00
Chenlei Hu
70d5e98c73 Update github action run conditions (#682) 2024-08-30 15:32:26 -04:00
Chenlei Hu
9009e784f9 Add component test (Vitest) (#681)
* Add component test (Vitest)

* Fix compile error
2024-08-30 15:32:26 -04:00
Chenlei Hu
877e500510 Update litegraph (ES6 LGraphCanvas) (#679) 2024-08-30 15:32:26 -04:00
Chenlei Hu
aee2afee36 1.2.40 (#685) 2024-08-29 21:30:58 -04:00
Chenlei Hu
f42609c966 Add support for extra system stats in error report (#684)
* Add support for extra system stats in error report

* Add toast on error
2024-08-29 21:29:33 -04:00
pythongosssss
aaea05a37b Sync pr fix clip path when using new menu (#184)
* Sync pr fix clip path when using new menu

* Enable test

* Update outdated test image

* Update test image
2024-08-29 18:02:10 -04:00
pythongosssss
d0067719b8 Fix primitive resize (#683)
* Fix primitive resize on load
Fixes #676

* Add test

* Add playwright test

* Update test expectations [skip ci]

---------

Co-authored-by: huchenlei <chenlei.hu@mail.utoronto.ca>
Co-authored-by: github-actions <github-actions@github.com>
2024-08-29 18:01:57 -04:00
Chenlei Hu
e59ed85cc0 1.2.39 (#675) 2024-08-28 20:22:18 -04:00
Alex "mcmonkey" Goodwin
d5b4311e24 run formatter and add .js to gitattributes (#673)
* run formatter and add .js to gitattributes

* remove npm format change
2024-08-28 17:21:07 -04:00
Alex "mcmonkey" Goodwin
6fed739402 add a git attributes file (#672)
set all ts and vue scripts as LF on Windows as there are scripts (eg the prettier format script) that will break with windows format
2024-08-28 17:03:38 -04:00
Chenlei Hu
b25c5259bd Fix node title editor's width when node is collapsed (#671)
* Fix node title editor's width when node is collapsed

* nit
2024-08-28 16:35:01 -04:00
Chenlei Hu
fb5bb57b0d Mark show missing models warning as experimental (#670)
* Mark show missing models warning as experimental

* nit
2024-08-28 16:22:40 -04:00
Chenlei Hu
986827cb91 Update litegraph (ES6 LGraphNode) (#669) 2024-08-28 15:45:45 -04:00
Chenlei Hu
6f9d2bfa17 Relands "Add support for LiteGraph to convert to classes" (#667)
* Revert "Revert "Add support for LiteGraph to convert to classes (#334)" (#386)"

This reverts commit d607f6c7f7.

* Format
2024-08-28 15:35:05 -04:00
Chenlei Hu
4e8acf6c77 Add setting to disable double click node title edit (#668) 2024-08-28 13:58:33 -04:00
Chenlei Hu
493805d0ee Update README (#664) 2024-08-28 12:00:13 -04:00
Chenlei Hu
2c174b5956 Group selected nodes by Ctrl + g (#663)
* Ctrl + g to group selected noes

* Add playwright test

* nit

* Move button loc

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-08-28 11:49:41 -04:00
Chenlei Hu
5c2cb00cd6 Replace autocomplete with select as node filter option input (#659)
* Replace autocomplete with select as node filter option input

* i18n
2024-08-27 21:45:44 -04:00
pythongosssss
968f417061 Node library search filters (#636)
* Add search filters to node library

* Fix

* Dont close on add

* Fix wildcard

---------

Co-authored-by: Chenlei Hu <chenlei.hu@mail.utoronto.ca>
2024-08-27 21:17:34 -04:00
Chenlei Hu
fef9395a2c Add format check CI task (#658) 2024-08-27 20:32:33 -04:00
Chenlei Hu
698754b835 1.2.38 (#657) 2024-08-27 18:23:10 -04:00
filtered
29d21348ca Fix image grid render consistency (#654)
- Makes image grids of non-uniform-size images fill the space the same as uniform image batches
- Re-uses existing code
- Removes workaround
- "Supports image sizes up to 1 terapixel"
2024-08-27 18:22:14 -04:00
Chenlei Hu
09d8f2a502 Missing model download dialog test (#656)
* Test prep

* Add missing model dialog test

* Basic test of download model

* Add comment

* Adjust setting in test

* Change download dir to not interfere with other tests
2024-08-27 17:34:32 -04:00
Chenlei Hu
50b418113c Double click node title to trigger edit (#655)
* Update litegraph

* Double click edit node title

* Update

* Auto select all

* Update litegraph

* Add playwright test

* Update readme

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-08-27 11:38:39 -04:00
Chenlei Hu
6ab92f28db Fix dialog maximization (#652) 2024-08-27 09:58:09 -04:00
Alex "mcmonkey" Goodwin
b19cbd9111 Model Downloader Improvements (#650)
* use new download_path value in download api

from https://github.com/comfyanonymous/ComfyUI/pull/4621

* add in-UI refusal for ckpt files
2024-08-27 08:56:57 -04:00
pythongosssss
9cdefca481 Enhancements to the queue image feed (#646)
* Enhancements to the queue image feed
 - Change flat list icon
 - Add cover/contain mode
 - Add right click -> go to node
 - Add go to node link on detail

* Add loading spinner

* resolve comments

---------

Co-authored-by: huchenlei <chenlei.hu@mail.utoronto.ca>
2024-08-26 21:57:23 -04:00
Chenlei Hu
84662ada9e 1.2.37 (#649) 2024-08-26 21:36:40 -04:00
Chenlei Hu
26b02979a1 1.2.36 (#648) 2024-08-26 21:31:38 -04:00
Chenlei Hu
0795c3041c Bookmark folder icon customization (#647)
* Add bookmark customization support

* WIP

* Fix bugs

* Fix color update

* Handle rename and delete of customization

* nit

* Add custom color picker

* Computed final color

* i18n

* Remove cancel button as dialog already has it

* Add playwright test
2024-08-26 21:30:38 -04:00
pythongosssss
c604209f40 Fix crash connecting to node with no slots (#644)
* Fix crash connecting to node with no slots

* Add playwright test

* Update test expectations [skip ci]

---------

Co-authored-by: huchenlei <chenlei.hu@mail.utoronto.ca>
Co-authored-by: github-actions <github-actions@github.com>
2024-08-26 18:29:52 -04:00
Chenlei Hu
96d129e8a6 Fix edit attention test (#640) 2024-08-26 11:31:46 -04:00
Chenlei Hu
a69858c87a Fix unbookmark node in node library (#639)
* Add unbookmark test

* Fix unbookmark
2024-08-26 11:04:08 -04:00
Chenlei Hu
03ac6eea19 Add playwright undo tests (#638) 2024-08-26 10:47:37 -04:00
filtered
f9ae5aaa0f Fix textarea undo history cleared by editAttention (#635) 2024-08-26 10:34:17 -04:00
Chenlei Hu
a5cdebe1a8 Adjust toast location to avoid overlap with side toolbar and menu (#637) 2024-08-26 10:32:34 -04:00
Chenlei Hu
298a4744d8 1.2.35 (#632) 2024-08-25 22:04:24 -04:00
Chenlei Hu
090fda2f22 Node library custom bookmark folder (#631)
* Add new folder button

* Add tree util test

* nit

* Support empty folder in node library

* Drag to bookmark folder

* Use bookmark icon for bookmark folder

* Highlight on dragover

* nit

* Auto-expand on item added

* Extract bookmark system as store

* Add context menu on bookmark folder

* Add editable text

* Fix reactivity

* Plumb editable text

* refactor

* Rename node

* Fix focus

* Prevent name collision

* nit

* Add new folder

* nested folder support

* Change drag behavior

* Add basic playwright tests

* nit

* Target tree-node-content instead of tree-node
2024-08-25 21:53:58 -04:00
Chenlei Hu
f36c934d37 Hide hidden settings (#630)
* Hide hidden settings

* nit
2024-08-25 15:45:05 -04:00
Chenlei Hu
87ef469d1c Update litegraph (popover dismiss) (#629) 2024-08-25 15:08:02 -04:00
Chenlei Hu
a1e40b14c7 Add textarea widget spell check setting (#627) 2024-08-25 10:22:36 -04:00
Chenlei Hu
b863c11e67 Fix node library bookmark preview (#626) 2024-08-25 10:01:42 -04:00
Chenlei Hu
7a7188aeb0 1.2.34 (#623) 2024-08-24 19:43:53 -04:00
Veikka
2079a54ffa multi-level node search ranking (#622) 2024-08-24 19:42:56 -04:00
Chenlei Hu
74baf2af12 Rename onNonLeafClick to toggleNodeOnEvent (#621) 2024-08-24 18:09:55 -04:00
Chenlei Hu
5dec86861b Replace ToggleButton with Button to be consistent in style (#620) 2024-08-24 17:54:03 -04:00
Chenlei Hu
fc05029f4e Cleanup dragSelector prop (#619) 2024-08-24 17:48:36 -04:00
Chenlei Hu
98064f301d Extract tree expand/collapse logic as hook (#618) 2024-08-24 17:43:26 -04:00
Chenlei Hu
bff1dc91fa Refactor node library drag and drop (#617) 2024-08-24 17:40:56 -04:00
bymyself
f4242f8a66 Explicitly invoke setting.options when it's a function (#616) 2024-08-24 16:22:08 -04:00
Chenlei Hu
845ab88d55 Update string input spec to include extra multiline args (#615) 2024-08-24 15:21:58 -04:00
Chenlei Hu
6c557eaa58 Fix unrecognized bookmark node crash the node library sidebar (#614)
* Add playwright test

* nit
2024-08-24 11:58:14 -04:00
Chenlei Hu
2fdaabd2c9 Ctrl + Click recursively expand/collapse node library folder (#613) 2024-08-24 11:01:10 -04:00
Chenlei Hu
a2143d9120 Bookmark nodes in node library (#612)
* Basic bookmark

* Extract node leaf as component

* bigger hitbox
2024-08-24 10:39:18 -04:00
Chenlei Hu
f2b02dd10b Add userFileStore (#611)
* WIP

* Refactor

* Add userFileStore test
2024-08-23 21:39:22 -04:00
Chenlei Hu
b831a82360 Target ES2022 in vite config to align with tsconfig target (#610) 2024-08-23 21:11:45 -04:00
Chenlei Hu
d232e38c33 1.2.33 (#609) 2024-08-23 18:53:48 -04:00
Chenlei Hu
1a3cf4c3f3 Show node name and node id on flattened task outputs (#608)
* wip

* Show node name and node id
2024-08-23 18:52:45 -04:00
Chenlei Hu
31d172d4d9 Fix hotkeys triggering while editing properties panel values (#606) (#607)
* Fix hotkeys triggering while editing properties panel values (#606)

* Add properties panel inputs to key handler ignore

* Add properties panel test

* Update test expectations [skip ci]

---------

Co-authored-by: bymyself <abolkonsky.rem@gmail.com>
Co-authored-by: github-actions <github-actions@github.com>
2024-08-23 16:46:40 -04:00
Chenlei Hu
92ce064ebf Fix github request too long issue (#605)
* Fix github request too long issue

* Remove life on error message
2024-08-23 13:52:53 -04:00
bymyself
3d041dd742 Fix settings dialog on mobile (#602) 2024-08-23 09:43:45 -04:00
Alex "mcmonkey" Goodwin
af378262f4 Model downloader dialog (#569)
* API core for model downloader

* initial basic dialog for missing models

* app.ts handling for missing models

* don't explode if getModels is a 404

* actually track downloads in progress

* overall pile of improvements to the missing models view

* minor fixes

* add setting to disable missing models warning

* temporarily remove 'models' entry from default graph

to avoid missing model dialog causing issues. Also because ckpt autodownloading shouldn't be allowed

* swap the url to a title

* add model directory to display

* match settingStore commit

* check setting before scanning models list

ie avoid redundant calcs when setting is disabled anyway
2024-08-23 09:43:20 -04:00
Chenlei Hu
57c5a78af3 Fix signature of listUserData (#601) 2024-08-22 20:26:23 -04:00
Chenlei Hu
233fd1347e Move error handling out of api.ts to workflows.ts (#600) 2024-08-22 20:21:31 -04:00
Chenlei Hu
60221254d9 1.2.32 (#599) 2024-08-22 19:48:04 -04:00
Chenlei Hu
7434691bed Disable flaky test (#598) 2024-08-22 19:42:38 -04:00
Chenlei Hu
fbdc9d430b Improve node search matching algorithm (#597) 2024-08-22 19:40:58 -04:00
Chenlei Hu
3e457f812d Execution Error Dialog Revamp (One click issue searching and filing) (#595)
* Add basic error dialog

* 2 level error report

* Add find issue button

* nit

* Add file issue button

* Single dialog

* nit

* Fix long text wrapping

* Merge component

* Test execution error dialog
2024-08-22 15:55:38 -04:00
bymyself
0466c79725 Fix right-click save image in gallery (firefox) (#588) 2024-08-21 21:28:12 -04:00
Chenlei Hu
8b989c6415 Add a wait to prevent searchbox popup (#589)
* Add a wait to prevent searchbox popup

* nit
2024-08-21 21:27:54 -04:00
Chenlei Hu
2e51122778 Add browser tests for litegraph changes (#580) (#585) (#587)
* Add browser tests for litegraph changes (#580) (#585)

* Zoom speed tests

* Merge

* Prompt dialog test

* Update test expectations [skip ci]

---------

Co-authored-by: bymyself <abolkonsky.rem@gmail.com>
Co-authored-by: github-actions <github-actions@github.com>
2024-08-21 20:39:30 -04:00
Chenlei Hu
8f8eac038a 1.2.31 (#586) 2024-08-21 19:03:40 -04:00
Tobias Menzi
4b3bad4bc5 Change broken relative font paths (#584) 2024-08-21 19:01:02 -04:00
Chenlei Hu
17c7f57d8f Update litegraph (Zoom speed adjustment) (#580) 2024-08-21 17:16:06 -04:00
Chenlei Hu
5542845710 Task output folder view (#579)
* Change to button

* Folder view
2024-08-21 16:47:30 -04:00
Chenlei Hu
f2de9b0d3c Revert "Add custom sort function to improve search matching (#574)" (#578)
This reverts commit 77ba201367.
2024-08-21 14:25:20 -04:00
Chenlei Hu
71fa71e82c Prefer saved media over preview media as task cover media (#576) 2024-08-21 14:19:27 -04:00
Chenlei Hu
77ba201367 Add custom sort function to improve search matching (#574) 2024-08-21 13:54:29 -04:00
Chenlei Hu
6edfc9bc1b Use settingStore to access setting (#572) 2024-08-21 11:42:12 -04:00
Chenlei Hu
743dc4879a Add setting to disable missing nodes dialog (#571)
* Add setting to disable missing nodes dialog

* nit

* nit
2024-08-21 10:31:07 -04:00
Alex "mcmonkey" Goodwin
2c1bd662e1 minor typo fix (#567) 2024-08-21 09:51:15 -04:00
Björn Söderqvist
7051d86ba7 Fix incorrect type paths (#568) 2024-08-21 09:41:06 -04:00
Chenlei Hu
7487c565c8 1.2.30 (#566) 2024-08-20 17:48:31 -04:00
Chenlei Hu
a86d10b02d Fix node library searchbox background color (#565) 2024-08-20 17:41:59 -04:00
Chenlei Hu
3d89c245e5 Add experimental/deprecated tags to search result / node library (#564) 2024-08-20 17:35:23 -04:00
Chenlei Hu
9dd6da3dc2 Support node deprecated/experimental flag (#563)
* Add deprecated field

* Hide deprecated nodes

* Add experimental node show/hide

* Add setting tooltips

* nit

* nit

* nit
2024-08-20 17:00:47 -04:00
Chenlei Hu
269e468425 i18n node searchbox placeholder (#561) 2024-08-20 15:20:00 -04:00
Chenlei Hu
c3ef716d53 Reduce search highlight padding (#560) 2024-08-20 15:12:30 -04:00
Chenlei Hu
bd7bbd9e95 Reduce debounce delay in node searchbox (#559) 2024-08-20 15:10:06 -04:00
ruucm
447d1c95ef enable cmd shortcuts for mac (mute & bypass) (#557) 2024-08-20 11:01:17 -04:00
Chenlei Hu
c4bc0e8430 Auto expand tree on search in node library tab (#558)
* Add custom nodelib searchbox

* Auto expand on search

* Support alphabetical sort in filtered tree
2024-08-20 11:01:05 -04:00
Chenlei Hu
f3ab9cfb8e Fix multiuser selection screen (#554) 2024-08-19 22:59:14 -04:00
Chenlei Hu
52c8c8194e Add browser_tests README (#553) 2024-08-19 22:45:06 -04:00
Chenlei Hu
9dbc114ae9 Remove win32 expectations (#551) 2024-08-19 21:59:05 -04:00
Chenlei Hu
556edea299 1.2.29 (#550) 2024-08-19 21:49:58 -04:00
Chenlei Hu
d5584a1d39 Fix node source chip alignment (#549) 2024-08-19 21:45:49 -04:00
Chenlei Hu
628f2afc34 Remove double reroute pin (#548) 2024-08-19 21:38:41 -04:00
Alex "mcmonkey" Goodwin
ea01fde607 [Experimental] hide/show logic improvement (#475)
* experimental hide/show logic improvement

for #470

* minor early out fix

not sure this is strictly needed (doesn't seem to be from a test, seems draw stops being called when hidden?) but better safe than sorry

* use null

* persist collapsed state
2024-08-19 21:22:48 -04:00
Chenlei Hu
b8a3e6b1ad Reduce padding on searchbox result item (#547)
* Reduce search result padding

* nit
2024-08-19 21:19:34 -04:00
Chenlei Hu
cfad3cd918 Add setting to hide node category in search result (#546) 2024-08-19 21:00:15 -04:00
Alex "mcmonkey" Goodwin
339e201920 Dom widget playwright tests (#540)
* gitignore win32 browser_test files

just so i can local dev with playwright without git cluttering up

* experimental add test for dom widget node toggle open/closed

* Update test expectations [skip ci]

* vs code extension lied to me, manually fix loc

* Update test expectations [skip ci]

* okay that time was my fault

* Update test expectations [skip ci]

* yknow what dont expect exactly default after actually

* Update test expectations [skip ci]

* test for multiple far panning

* Update test expectations [skip ci]

* oops, flip that

* Update test expectations [skip ci]

* more stable pan coords

* Update test expectations [skip ci]

* 'move' is not strictly relative, so compensate accordingly

* Update test expectations [skip ci]

* test to zoom very far out

* Update test expectations [skip ci]

* add hackaround for node search menu popup

* Update test expectations [skip ci]

* make zoom work better

* Update test expectations [skip ci]

* fix preexisting typo

this function is never called so it's fine

* dom widget toggle needs a delay

otherwise it's a double click

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-08-19 20:54:07 -04:00
bymyself
c227a8af9a Use DPI to calculate screen center (#544) 2024-08-19 20:51:24 -04:00
Chenlei Hu
6b47162606 Update README.md (#545) 2024-08-19 18:18:28 -04:00
Chenlei Hu
a4c5a2a3d1 Update README.md (#543) 2024-08-19 17:26:12 -04:00
Chenlei Hu
45a47be7c0 Ctrl+Shift+Drag zoom on mouse position (#538) (#541)
* Ctrl+Shift+Drag zoom on mouse position (#538)

* Update test expectations [skip ci]

---------

Co-authored-by: bymyself <abolkonsky.rem@gmail.com>
Co-authored-by: github-actions <github-actions@github.com>
2024-08-19 17:08:50 -04:00
Chenlei Hu
2252f0a134 Resize large image to fit into window for Image Gallery (#539) 2024-08-19 16:50:40 -04:00
pythongosssss
0dfbcfb2d6 Support clicking on library entries to toggle expand/insert node (#511)
* Support clicking on library entries to toggle expand/insert node

* Fix type
2024-08-19 14:09:34 -04:00
bymyself
b46036f25d Fix escape not resetting activeIndex in gallery (#535)
* Fix escape not resetting activeIndex in gallery

* Use handleVisibilityChange for consistency
2024-08-19 14:00:47 -04:00
Chenlei Hu
f5ce42d5d5 Add setting to show/hide canvas info (#533)
* Add setting to show/hide canvas info

* nit
2024-08-19 12:12:37 -04:00
Chenlei Hu
ce75a29202 Update README.md (Sheild badges) (#532) 2024-08-19 11:36:14 -04:00
Chenlei Hu
6a8a68a240 Image failed to load placeholder (#531)
* Image failed to load placeholder

* Use broken image placeholder in gallery

* nit
2024-08-19 11:16:35 -04:00
Chenlei Hu
f9adaadc7d Use toast on reconnection message (#530) 2024-08-19 10:18:09 -04:00
Chenlei Hu
727992048e Fix type check on TaskItemImpl (#529) 2024-08-19 09:47:33 -04:00
Chenlei Hu
dd1e3f087d Update README.md (#523) 2024-08-18 22:16:46 -04:00
Chenlei Hu
f1c1a3dab7 1.2.28 (#522) 2024-08-18 21:59:00 -04:00
Chenlei Hu
4a43dfe6b9 Performance optimization on queueStore (#521)
* Eager calculate flat outputs

* Optimize flat tasks performance
2024-08-18 21:48:48 -04:00
Chenlei Hu
8576d3797b Prefer image for queue task preview (#520) 2024-08-18 20:59:43 -04:00
Chenlei Hu
22e2628479 Queue preview gallery (#519)
* Custom preview event

* Plub event

* Basic gallery

* Gallery nits

* Navigate with keyboard keys
2024-08-18 20:42:42 -04:00
Chenlei Hu
4e1f14139b Fix queue tab update issue (#518) 2024-08-18 18:11:33 -04:00
Chenlei Hu
0c53ab9177 Fix context menu on node with only optional input (#514) 2024-08-18 16:25:45 -04:00
Chenlei Hu
eb5f4d9bc7 Support view of gifs in queue media preview (#513) 2024-08-18 16:20:56 -04:00
Chenlei Hu
19681fd43d Experimental settings BETA tag (#509)
* Add BETA tag for experimental setting

* Mark node searchbox impl as experimental

* nit
2024-08-18 13:04:37 -04:00
Chenlei Hu
add2f9baa0 Group comfy core settings (#508)
* Add category overwrite

* Group settings
2024-08-18 12:49:23 -04:00
Chenlei Hu
ec5f1152da Organize setting display for new settings dialog (#507) 2024-08-18 11:31:50 -04:00
Chenlei Hu
17aa44d9f6 Activate new settings dialog from default UI (#506) 2024-08-18 10:23:03 -04:00
Chenlei Hu
d8887a434d Add Comfy.Workflow.SortNodeIdOnSave setting (#502)
* Update litegraph (Sort order)

* nit

* Add sort node on save setting

* nit
2024-08-17 23:23:40 -04:00
Chenlei Hu
9d3ca763d0 Queue tab infinite scroll (#501)
* Add vueuse

* Infinite scroll queue tab

* Set item per page to 8

* Handle sidebar resize

* nit
2024-08-17 22:48:31 -04:00
Chenlei Hu
a45851d7a6 1.2.27 (#500) 2024-08-17 21:42:02 -04:00
Chenlei Hu
266336104a Fix frontend only node category (#499) 2024-08-17 21:31:56 -04:00
Chenlei Hu
8c40f83b35 Properly update vue app's node defs on refresh (#493) 2024-08-17 13:23:47 -04:00
Chenlei Hu
5ba524fd94 Add toast message on refresh button click (#492) 2024-08-17 13:11:47 -04:00
Chenlei Hu
966b1dd057 Extension API to add toast message (#491)
* Extension API to add toast message

* Update readme
2024-08-17 12:44:55 -04:00
Chenlei Hu
069766337a Add toast message on execution interrupted (#490)
* Move toast to top level

* Toast store
2024-08-17 12:29:48 -04:00
Chenlei Hu
a1a6eeed0f Remove unused var mainCanvas (#488) 2024-08-17 11:33:17 -04:00
Chenlei Hu
b33874db2b Fix queue cancelled status (#487) 2024-08-17 11:31:46 -04:00
bymyself
05c6193a1d Fix loadGraphData call when loading from json (#484) 2024-08-17 10:47:39 -04:00
bymyself
73f7889f81 Add touch-action event back to canvas (#483) 2024-08-17 09:05:23 -04:00
Alex "mcmonkey" Goodwin
c73915e31e EditAttention: allow negatives (#476)
for #474
2024-08-16 21:56:03 -04:00
Alex "mcmonkey" Goodwin
7626d08c98 vite relative paths fix (#472) 2024-08-16 21:15:03 -04:00
Alex "mcmonkey" Goodwin
f10554d914 fix minor typing error (#473)
introduced at e6d29656fa
2024-08-16 21:14:15 -04:00
Chenlei Hu
238225dd12 1.2.26 (#471) 2024-08-16 14:07:32 -04:00
Chenlei Hu
9cea54686a Pin reroute on link release searchbox (#469)
* Correctly handle wildcard type

* Add test

* nit

* Pin reroute on link release search

* Connect wildcard

* nit
2024-08-16 13:22:17 -04:00
Chenlei Hu
d1715972e3 Register frontend only node defs (#468)
* Register frontend only node defs

* nit

* nit
2024-08-16 12:16:41 -04:00
Chenlei Hu
49a910d7b0 Update litegraph (Sort order) (#467)
* Update litegraph (Sort order)

* Update

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-08-16 11:36:18 -04:00
Chenlei Hu
479ca63e3c Add setting to adjust textarea font size (#463) 2024-08-16 10:17:40 -04:00
Chenlei Hu
7468555c06 1.2.25 (#456) 2024-08-16 01:04:26 -04:00
Chenlei Hu
14a395a0ce Fix queue item context menu (#455) 2024-08-16 01:02:51 -04:00
Chenlei Hu
0a99a2bd53 1.2.24 (#454) 2024-08-16 00:02:15 -04:00
Chenlei Hu
955c703fde Still load workflow even validation fails (#453) 2024-08-15 23:55:20 -04:00
Chenlei Hu
ef8b952d79 Fix undefined spec (#452) 2024-08-15 23:37:42 -04:00
Chenlei Hu
e6d29656fa Queue media preview (#449)
* output url

* Basic image previews

* Split out task item component

* Move task actions to context menu

* simplify

* Move spinner

* Lift context menu to tab scope

* Better tag

* Fix placeholder style

* nit

* Correctly handle cancelled

* nit

* Split out result item as separate component

* nit

* Fix center crop

* nit

* Simplify task item

* Flat list

* Show prompt id

* Make image draggable

* Disable preview for dragging

* Fix key

* Correctly handle task in expanded view

* Add preview
2024-08-15 23:26:38 -04:00
Alex "mcmonkey" Goodwin
9e3dffd7fd Fix relative paths (#447)
ComfyUI is not necessarily the webroot, paths should be relative rather than absolute
2024-08-15 20:27:06 -04:00
Chenlei Hu
429e44f74d Control minify with env var (#445) 2024-08-15 14:41:36 -04:00
Alex "mcmonkey" Goodwin
73b0ecc8cb fix preview nodes clipping under the bottom (#444)
for #411 - moves code to main typescript section (to avoid vue weirdness) and finds the preview node element, adjust top by height
2024-08-15 13:33:02 -04:00
Björn Söderqvist
775f536d30 Add more Zod types to api.ts (#440) 2024-08-15 10:45:40 -04:00
Chenlei Hu
1ff7a70579 1.2.23 (#441) 2024-08-15 09:54:10 -04:00
Chenlei Hu
51233b4be3 Fix node preview location when sidebar location is right (#435) 2024-08-14 22:46:05 -04:00
bymyself
5c4d1c2cec Fix copy/paste on firefox (#432) 2024-08-14 22:05:15 -04:00
Chenlei Hu
711205b499 1.2.22 (#429) 2024-08-14 15:11:45 -04:00
Chenlei Hu
00fe3515b9 Fix delete queue item (#428) 2024-08-14 15:10:17 -04:00
Chenlei Hu
d8ee0b4584 Relax schema on node I/O link (#427) 2024-08-14 14:17:18 -04:00
Chenlei Hu
fc1b0b3e53 Fix searchbox trigger on non-always link release setting (#426)
* Fix searchbox trigger on non-always link release setting

* Add browsertest
2024-08-14 13:44:22 -04:00
Chenlei Hu
a68f7c680b Rename SideBar to Sidebar (#422)
* Rename SideBar to Sidebar

* rename files

* rename files
2024-08-14 11:27:23 -04:00
Chenlei Hu
c6b6bdcb67 Add setting to disable node preview in searchbox (#421) 2024-08-14 10:29:32 -04:00
Chenlei Hu
6993a56c2d Highlight query in search result in node searchbox (#420)
* min match set to 2

* Highlight query in search result

* nit
2024-08-14 10:28:17 -04:00
Chenlei Hu
4eb56a19ba Fix queue/history keybinding (#419) 2024-08-14 09:53:49 -04:00
Chenlei Hu
784947fdea 1.2.21 (#416) 2024-08-13 21:45:23 -04:00
Alex "mcmonkey" Goodwin
64ee131e64 Don't cache API requests (#415)
API requests should by default never be cached
2024-08-13 20:22:22 -04:00
Chenlei Hu
1b59e3ab6d Fast searchbox dialog activation (#410) 2024-08-13 16:25:11 -04:00
Chenlei Hu
37b414d1b2 Use fuse.js extended search (#405) 2024-08-13 16:01:52 -04:00
Yuta Hayashibe
7245eee85b Perform text replacement for SaveAnimatedWEBP in addition to SaveImage (#403) 2024-08-13 13:57:26 -04:00
Yuta Hayashibe
9f3696e70f Fix typos (#404)
* Fix typos: Interupt -> Interrupt

* Fix typos: tempateManagerRow -> templateManagerRow

* Fix some typos

* Fix typos: Convertable -> Convertible

* Fix some typos
2024-08-13 13:57:02 -04:00
Chenlei Hu
d5deb6d2a0 Only report each unknown message type once (#402) 2024-08-13 11:18:30 -04:00
Chenlei Hu
41889c3cfe Add GitHub action to automatically submit release PR to main repo (#400) 2024-08-13 10:14:38 -04:00
Chenlei Hu
e8602e88fa 1.2.20 (#398) 2024-08-12 22:28:17 -04:00
Chenlei Hu
b5f2d334d9 Add sidebar size setting (normal/small) (#397)
* Add sidebar size setting (normal/small)

* Set default small sidebar size for small window
2024-08-12 22:27:35 -04:00
Chenlei Hu
c459698956 Add side bar location in settings (left/right) (#396)
* Allow side bar on right side

* Panel on the right
2024-08-12 21:49:07 -04:00
Chenlei Hu
f91e335ca7 Only shim legacy directories (#395)
* Only shim legacy directories

* nit
2024-08-12 21:11:30 -04:00
Chenlei Hu
1fc173b48f 1.2.19 (#394) 2024-08-12 20:55:06 -04:00
Chenlei Hu
4fe44339fd Only validate new history items (#393) 2024-08-12 20:30:11 -04:00
Chenlei Hu
f987f4f5f3 Configure minify (#392) 2024-08-12 17:12:47 -04:00
Chenlei Hu
91e21b1387 Update ws message schema on reconnecting (#390)
* Update ws message schema on reconnecting

* nit
2024-08-12 13:21:48 -04:00
Chenlei Hu
a5be1f6072 Revert "Minify build (#373)" (#391)
This reverts commit 9385014799.
2024-08-12 13:12:51 -04:00
Chenlei Hu
d5f30be06d 1.2.18 (#387) 2024-08-12 09:21:53 -04:00
Chenlei Hu
d607f6c7f7 Revert "Add support for LiteGraph to convert to classes (#334)" (#386)
This reverts commit e2141a81e2.
2024-08-12 09:19:10 -04:00
Chenlei Hu
d9df0328c5 Revert "Update litegraph (ES6 LLink & LGraphNode) (#372)" (#385)
This reverts commit cfce1c6037.
2024-08-12 09:18:37 -04:00
Chenlei Hu
aff059b98b 1.2.17 (#380) 2024-08-11 19:46:42 -04:00
Chenlei Hu
cf53e8df6a Revert "Update primevue/themes to 4.0.0 (#378)" (#379)
This reverts commit d1d4324e57.
2024-08-11 19:39:55 -04:00
Chenlei Hu
d1d4324e57 Update primevue/themes to 4.0.0 (#378) 2024-08-11 19:38:27 -04:00
Chenlei Hu
c86abd3dc6 Remove pending task count on queue button (#377) 2024-08-11 19:33:43 -04:00
Chenlei Hu
281ed0c5d1 Show pending task count on side bar queue icon (#376)
* remove listener

* Store pending task count

* Add iconBadge to queue icon
2024-08-11 19:15:21 -04:00
Chenlei Hu
edf0396619 Type WS messages (#375) 2024-08-11 18:05:14 -04:00
Chenlei Hu
2a5b2e8d12 Reduce fusejs threshold (#374) 2024-08-11 12:39:23 -04:00
Chenlei Hu
9385014799 Minify build (#373) 2024-08-11 10:59:39 -04:00
Chenlei Hu
cfce1c6037 Update litegraph (ES6 LLink & LGraphNode) (#372) 2024-08-11 10:14:00 -04:00
Chenlei Hu
480679aa32 Relax restriction on data type in schema (#371) 2024-08-11 10:12:16 -04:00
filtered
e2141a81e2 Add support for LiteGraph to convert to classes (#334)
* Add support for LiteGraph to convert to classes

* Fix large context menu search regression

* Remove debug code

* Fix regression from rename & prototype change

* Fix super() calls to match LGraphNode
2024-08-11 09:46:54 -04:00
Chenlei Hu
0f3b58b610 Add space to setting group label (#370)
* Add space to setting group label

* handle acronym
2024-08-11 09:36:52 -04:00
Chenlei Hu
7ef8e56c25 1.2.16 (#366) 2024-08-10 21:06:51 -04:00
Chenlei Hu
9ffdf768b1 Better no task placeholder (#365) 2024-08-10 21:05:40 -04:00
Chenlei Hu
23fcdd3e44 Attach DOM widgets to canvas container instead of document body (#364) 2024-08-10 18:38:56 -04:00
Chenlei Hu
7ce7490bc3 Add search settings feature (#362)
* Add setting searchbox ui

* Basic search

* Remove first divider

* Keep group label on search result

* No result placeholder

* Prevent no result flash

* i18n

* Disable category nav when searching
2024-08-10 17:26:57 -04:00
pythongosssss
3e7b0a4907 Test using latest examples (#361) 2024-08-10 16:46:33 -04:00
Chenlei Hu
a095e7ecae Show category in node search box instead of description (#360) 2024-08-10 14:52:37 -04:00
Chenlei Hu
fe0d63e16c Use consistent NodeId and SlotIndex in schema (#359)
* Use consistent NodeId and SlotIndex in schema

* Add test
2024-08-10 14:15:00 -04:00
Chenlei Hu
3c76554bec 1.2.15 (#358) 2024-08-10 11:55:13 -04:00
Chenlei Hu
ce2a2dd2b6 Add link release searchbox trigger mode (#356) 2024-08-10 10:30:29 -04:00
Chenlei Hu
d6c304690c Allow skipping workflow validation (#355) 2024-08-10 09:49:12 -04:00
Chenlei Hu
e1bc2708d3 Make workflow group color optional (#354) 2024-08-10 08:55:48 -04:00
Chenlei Hu
95dc6ff5de Refactor nodeDefStore.nodeTree (#351) 2024-08-09 17:53:42 -04:00
Chenlei Hu
4b83ee3918 link release pops up searchbox by default (#348) (#350)
* link release pops up searchbox by default (#348)

* link release pops up searchbox by default

* Update browser test

* Fix tests

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-08-09 16:33:30 -04:00
Chenlei Hu
078df413b5 Update lg (ES6 LGraph) (#347) 2024-08-09 11:36:52 -04:00
Chenlei Hu
3fc85f1fb6 Update README.md (#346) 2024-08-09 11:11:43 -04:00
Chenlei Hu
ce14c1c071 i18n for setting dialog header (#343) 2024-08-09 09:30:08 -04:00
Chenlei Hu
0d31dc5b4c Reduce setting content height to avoid dialog level scroll (#341) 2024-08-08 20:31:00 -04:00
Chenlei Hu
42c1e4b5e1 1.2.14 (#340) 2024-08-08 20:15:38 -04:00
Chenlei Hu
5490ccf4f0 Assign default category Others (#339)
* Assign default category Others

* nit
2024-08-08 20:09:49 -04:00
Chenlei Hu
a5f0d2b201 Categorize setting items (#338)
* Basic setting panel rework

* refactor

* Style the setting item

* Reject invalid value

* nit

* nit

* Sort settings by label

* info chip as icon

* nit
2024-08-08 17:52:41 -04:00
Chenlei Hu
02d7f91e9e Migrate settings dialog to Vue (#335)
* Basic setting dialog

* Add custom setting value render

* handle combo options

* Add input slider

* 100% width for select dropdown
2024-08-07 14:01:43 -04:00
Chenlei Hu
eb1c66c90a Revert "Revert "Update litegraph (Vite build) (#320)" (#329)" (#332)
This reverts commit 3249bbf4ab.
2024-08-06 21:44:44 -04:00
Chenlei Hu
6b1776450b Explicitly bind litegraph names to global scope (#331) 2024-08-06 21:40:05 -04:00
Chenlei Hu
7804b25d5f 1.2.13 (#330) 2024-08-06 21:06:34 -04:00
Chenlei Hu
3249bbf4ab Revert "Update litegraph (Vite build) (#320)" (#329)
This reverts commit e162d0007c.
2024-08-06 21:04:48 -04:00
Chenlei Hu
baa1e54fc0 1.2.12 (#328) 2024-08-06 20:26:40 -04:00
Chenlei Hu
968a1da227 Add more litegraph change browser tests (#326)
* Add tests on litegraph batch disconnect shortcut (#323)

* Add tests on right click node pin/unpin (#324)

* Update test expectations [skip ci]

---------

Co-authored-by: bymyself <abolkonsky.rem@gmail.com>
Co-authored-by: github-actions <github-actions@github.com>
2024-08-06 20:24:40 -04:00
Chenlei Hu
a013d83fc0 Shift dialog close to right (#327) 2024-08-06 20:23:57 -04:00
Chenlei Hu
564ec887f2 Fix script type (#325) 2024-08-06 20:18:34 -04:00
Chenlei Hu
79469bd2b1 Missing node dialog revamp (#322)
* Basic rework of load workflow warning dialog

* Better style

* Add vue jest support

* Mock vue component in jest test

* nit

* Make dialog maximizable
2024-08-06 20:11:05 -04:00
Robin Huang
6fe2297cc1 Add models information to default workflow. (#321)
* Add models information to default workflow.

* Add models to zod schema.

* Fix zod schema.

* Update schema name.

* Add z prefix to modelfile schema name.
2024-08-06 13:45:07 -04:00
Chenlei Hu
e162d0007c Update litegraph (Vite build) (#320) 2024-08-06 10:46:19 -04:00
Chenlei Hu
5419865740 1.2.11 (#318) 2024-08-05 20:32:46 -04:00
Chenlei Hu
b90b1194d6 Organize searchbox files (#315) 2024-08-05 18:29:06 -04:00
Chenlei Hu
1eb45ddc55 Update README.md (#314) 2024-08-05 17:47:42 -04:00
Chenlei Hu
2f1df2c6ce Proper truncate of long content in node preview (#313) 2024-08-05 16:57:36 -04:00
Chenlei Hu
3269b54aae Sync 2666 Execution Model Inversion (#312)
* Sync 2666 Execution Model Inversion

* Fix unittest

* Fallback compatible
2024-08-05 16:42:37 -04:00
Chenlei Hu
50c4c87e62 Add error boundary on node.DrawBackground (#311) 2024-08-05 15:41:12 -04:00
Chenlei Hu
1b96c16cca Sync commit fixing flac metadata (#307) 2024-08-05 13:59:44 -04:00
Chenlei Hu
31ca016055 1.2.10 (#301) 2024-08-04 20:15:29 -04:00
Chenlei Hu
cf9d95aa97 Fix PrimeVue ref error on adding node via searchbox (#298) 2024-08-04 12:27:02 -04:00
pythongosssss
7a980f46c9 Add support for node/input/output tooltips (#287)
* Add support for node/input/output tooltips

* pr feedback

* Remove
2024-08-04 11:54:46 -04:00
Chenlei Hu
c48f68e53e Revert to sync validation on node def for better performance (#297) 2024-08-04 11:02:54 -04:00
Chenlei Hu
0210c7f438 Update README.md (#296) 2024-08-04 10:15:07 -04:00
Chenlei Hu
0384cf96c4 Reduce loglevel on node def validation (#295)
* Lower the loglevel of node def validation messages

* Fix tests
2024-08-04 10:08:55 -04:00
Chenlei Hu
4bebcb408e Add eslint (#294)
* Add eslint

* Add eslint github action
2024-08-04 09:35:49 -04:00
余腾靖
b5a919e8b2 fix: remove useless @ts-ignore and migrate to @ts-expect-error (#293)
* fix: vite primevue/treenode import error

* refactor: remove useless @ts-ignore and replace with @ts-expect-error

* build(tsconfig): enable incremental to speed up secondary time type check
2024-08-04 07:22:24 -04:00
Chenlei Hu
7e669b0f68 Add issue templates (#290) 2024-08-03 21:30:25 -04:00
Chenlei Hu
244cd3c920 1.2.9 (#285) 2024-08-03 14:25:16 -04:00
Chenlei Hu
0cf5e647af Fix copy paste of widget value (#284)
* Fix copy paste of widget value

* Fix ui tests

* Allow undefined group font size

* Update test expectations [skip ci]

* nit

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-08-03 14:22:43 -04:00
Chenlei Hu
f0f867481d Fix canvas not init issue (#283) 2024-08-03 10:48:54 -04:00
Chenlei Hu
d02b074fa3 Manage searchbox imp setting in Vue app (#282)
* Manage searchbox setting in vue

* nit
2024-08-03 10:31:10 -04:00
Chenlei Hu
e14d84526a 1.2.8 (#279) 2024-08-01 21:19:41 -04:00
Chenlei Hu
2aa9166079 Disable flux example workflow test (#278) 2024-08-01 21:17:28 -04:00
Chenlei Hu
3baa07e0a9 Update litegraph (Font size fix / Perf improvement) (#275) 2024-07-31 11:06:04 -04:00
Chenlei Hu
c494cd211e Allow INT/FLOAT represent list of numbers (#274) 2024-07-31 10:45:46 -04:00
Chenlei Hu
c00e2fd208 Allow input spec with extra values passthrough (#273)
* Allow input spec extra values passthrough

* Refine custom input spec

* nit

* nit
2024-07-31 09:51:32 -04:00
bymyself
d77343da83 Sync #4090 (#272) 2024-07-31 08:45:44 -04:00
Chenlei Hu
c611c15d40 Update README.md (#271) 2024-07-30 19:12:44 -04:00
Chenlei Hu
269686eebb 1.2.7 (#270) 2024-07-30 19:09:22 -04:00
Chenlei Hu
0e3590d017 Update litegraph (Batch link move with shift + drag) (#268)
* Refactor based on new event data format

* nit

* Add playwright tests

* Update test expectations [skip ci]

* nit

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-07-30 19:06:58 -04:00
Alistor
7d2d6df57b Add spellcheck option to Multiline widget, add Interrupt Queue keybind (#267)
* Add spellcheck option to Multiline widget and set to false by default

* Add Queue Interrupt Keybind

* Update keybinds.ts

Fixed indentation
2024-07-30 17:34:54 -04:00
Chenlei Hu
4462dabc63 Truncate JSON default value in node preview (#264) 2024-07-30 10:12:47 -04:00
Chenlei Hu
53bfc0c95a Block UI interaction when loading (#263) 2024-07-30 09:56:40 -04:00
Chenlei Hu
b78682689e Update litegraph (#262) 2024-07-30 09:25:27 -04:00
Chenlei Hu
6d1dce8255 1.2.6 (#261) 2024-07-29 18:38:51 -04:00
Chenlei Hu
73f4e5143d Attach isLeaf info (#260) 2024-07-29 17:49:57 -04:00
Chenlei Hu
7d75cc99ba Add sort button in node library sidebar tab (#259)
* Add sort button on node library

* tab template
2024-07-29 12:39:54 -04:00
Chenlei Hu
0aa7d0b99a Store spinner state in workspace state store (#256) 2024-07-29 10:54:22 -04:00
Chenlei Hu
66b690e5c8 Manage canvas element in Vue (#255)
* Manage canvas element in Vue

* nit

* Fix unittest
2024-07-29 10:29:29 -04:00
Chenlei Hu
6e27b884fc Fix node preview widget overflow (#254)
* Fix node preview widget overflow

* nit
2024-07-28 21:51:14 -04:00
Chenlei Hu
561162fb3e Update litegraph (Fix drag + alt copy node) (#253)
* Update litegraph

* Update github action

* Update test expectations [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-07-28 13:39:45 -04:00
382 changed files with 14987 additions and 2260 deletions

View File

@@ -13,4 +13,7 @@ DEV_SERVER_COMFYUI_URL=http://127.0.0.1:8188
DEPLOY_COMFYUI_DIR=/home/ComfyUI/web
# The directory containing the ComfyUI_examples repo used to extract test workflows.
EXAMPLE_REPO_PATH=tests-ui/ComfyUI_examples
EXAMPLE_REPO_PATH=tests-ui/ComfyUI_examples
# Whether to enable minification of the frontend code.
ENABLE_MINIFY=true

7
.gitattributes vendored Normal file
View File

@@ -0,0 +1,7 @@
# Default
* text=auto
# Force TS to LF to make the unixy scripts not break on Windows
*.ts text eol=lf
*.vue text eol=lf
*.js text eol=lf

72
.github/ISSUE_TEMPLATE/bug-report.yaml vendored Normal file
View File

@@ -0,0 +1,72 @@
name: Bug Report
description: "Something is not behaving as expected."
title: "[Bug]: "
labels: ['Potential Bug']
body:
- type: markdown
attributes:
value: |
Before submitting a **Bug Report**, please ensure the following:
- **1:** You are running the latest version of ComfyUI.
- **2:** You have looked at the existing bug reports and made sure this isn't already reported.
- **3:** You confirmed that the bug is not caused by a custom node. You can disable all custom nodes by passing
`--disable-all-custom-nodes` command line argument.
- type: textarea
attributes:
label: Frontend Version
description: 'What is the frontend version you are using? You can check this in the settings dialog'
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: 'What you expected to happen.'
validations:
required: true
- type: textarea
attributes:
label: Actual Behavior
description: 'What actually happened. Please include a screenshot / video clip of the issue if possible.'
validations:
required: true
- type: textarea
attributes:
label: Steps to Reproduce
description: "Describe how to reproduce the issue. Please be sure to attach a workflow JSON or PNG, ideally one that doesn't require custom nodes to test. If the bug open happens when certain custom nodes are used, most likely that custom node is what has the bug rather than ComfyUI, in which case it should be reported to the node's author."
validations:
required: true
- type: textarea
attributes:
label: Debug Logs
description: 'Please copy the output from your terminal logs here.'
render: powershell
validations:
required: true
- type: textarea
attributes:
label: Browser Logs
description: 'Please copy the output from your browser logs here. You can access this by pressing F12 to toggle the developer tools, then navigating to the Console tab.'
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: What browsers do you use to access the UI ?
multiple: true
options:
- Mozilla Firefox
- Google Chrome
- Brave
- Apple Safari
- Microsoft Edge
- Android
- iOS
- Other
- type: textarea
attributes:
label: Other
description: 'Any other additional information you think might be helpful.'
validations:
required: false

View File

@@ -0,0 +1,40 @@
name: Feature Request
description: Suggest an idea for this project
title: "[Feature Request]: "
labels: ["enhancement"]
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an issue already exists for the feature you want, and that it's not implemented in a recent build/commit.
options:
- label: I have searched the existing issues and checked the recent builds/commits
required: true
- type: markdown
attributes:
value: |
*Please fill this form with as much information as possible, provide screenshots and/or illustrations of the feature if possible*
- type: textarea
id: feature
attributes:
label: What would your feature do ?
description: Tell us about your feature in a very clear and simple way, and what problem it would solve
validations:
required: true
- type: textarea
id: workflow
attributes:
label: Proposed workflow
description: Please provide us with step by step information on how you'd like the feature to be accessed and used
value: |
1. Go to ....
2. Press ....
3. ...
validations:
required: true
- type: textarea
id: misc
attributes:
label: Additional information
description: Add any other context or screenshots about the feature request here.

20
.github/workflows/eslint.yaml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: ESLint
on:
pull_request:
branches:
- main
- master
- 'dev*'
jobs:
eslint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: lts/*
- run: npm ci
- run: npm run lint

23
.github/workflows/format.yaml vendored Normal file
View File

@@ -0,0 +1,23 @@
name: Prettier Check
on:
pull_request:
branches: [ main, master, dev* ]
jobs:
prettier:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: lts/*
- name: Install dependencies
run: npm ci
- name: Run Prettier check
run: npx prettier --check './**/*.{js,ts,tsx,vue}'

View File

@@ -12,43 +12,7 @@ jobs:
runs-on: ubuntu-latest
if: github.event.label.name == 'New Browser Test Expectations'
steps:
- name: Checkout ComfyUI
uses: actions/checkout@v4
with:
repository: "comfyanonymous/ComfyUI"
path: "ComfyUI"
ref: master
- name: Checkout ComfyUI_frontend
uses: actions/checkout@v4
with:
repository: "huchenlei/ComfyUI_frontend"
path: "ComfyUI_frontend"
ref: ${{ github.head_ref }}
- uses: actions/setup-node@v3
with:
node-version: lts/*
- 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: Build & Install ComfyUI_frontend
run: |
npm ci
npm run build
rm -rf ../ComfyUI/web/*
mv dist/* ../ComfyUI/web/
working-directory: ComfyUI_frontend
- name: Start ComfyUI server
run: |
python main.py --cpu &
wait-for-it --service 127.0.0.1:8188 -t 600
working-directory: ComfyUI
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v1
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
@@ -72,6 +36,8 @@ jobs:
run: |
git config --global user.name 'github-actions'
git config --global user.email 'github-actions@github.com'
git fetch origin ${{ github.head_ref }}
git checkout -B ${{ github.head_ref }} origin/${{ github.head_ref }}
git add browser_tests
git commit -m "Update test expectations [skip ci]"
git push origin HEAD:${{ github.head_ref }}

View File

@@ -5,7 +5,6 @@ on:
branches:
- main
- master
- 'dev*'
pull_request:
branches:
- main
@@ -13,75 +12,64 @@ on:
- 'dev*'
jobs:
test:
jest-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout ComfyUI
uses: actions/checkout@v4
with:
repository: "comfyanonymous/ComfyUI"
path: "ComfyUI"
ref: master
- name: Checkout ComfyUI_frontend
uses: actions/checkout@v4
with:
repository: "Comfy-Org/ComfyUI_frontend"
path: "ComfyUI_frontend"
- name: Get commit message
id: commit-message
run: echo "::set-output name=message::$(git log -1 --pretty=%B)"
working-directory: ComfyUI_frontend
- name: Checkout ComfyUI_examples
uses: actions/checkout@v4
with:
repository: "comfyanonymous/ComfyUI_examples"
path: "ComfyUI_frontend/tests-ui/ComfyUI_examples"
ref: master
- name: Skip CI
if: contains(steps.commit-message.outputs.message, '[skip ci]')
run: echo "Skipping CI as commit contains '[skip ci]'"
continue-on-error: true
working-directory: ComfyUI_frontend
- uses: actions/setup-node@v3
with:
node-version: lts/*
- 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: Build & Install ComfyUI_frontend
run: |
npm ci
npm run build
rm -rf ../ComfyUI/web/*
mv dist/* ../ComfyUI/web/
working-directory: ComfyUI_frontend
- name: Start ComfyUI server
run: |
python main.py --cpu &
wait-for-it --service 127.0.0.1:8188 -t 600
working-directory: ComfyUI
- name: Run UI tests
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v1
- name: Run Jest tests
run: |
npm run test:generate
npm run test:generate:examples
npm test -- --verbose
working-directory: ComfyUI_frontend
playwright-tests-chromium:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v1
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
- name: Run Playwright tests
run: npx playwright test
- 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
name: playwright-report-chromium
path: ComfyUI_frontend/playwright-report/
retention-days: 30
playwright-tests-chromium-2x:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v1
- 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
playwright-tests-mobile-chrome:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v1
- 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

53
.github/workflows/update-main.yaml vendored Normal file
View File

@@ -0,0 +1,53 @@
name: Update Main Repo from PR
on:
pull_request:
types: [labeled]
jobs:
update-main-repo:
if: github.event.label.name == 'Update Main Repo'
runs-on: ubuntu-latest
steps:
- name: Checkout frontend repo PR
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: lts/*
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
- name: Checkout ComfyUI
uses: actions/checkout@v4
with:
repository: "comfyanonymous/ComfyUI"
path: ComfyUI
ref: master
- name: Copy compiled assets
run: |
rm -rf ./ComfyUI/web/*
cp -R dist/* ./ComfyUI/web/
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.PAT }}
commit-message: 'Update frontend assets from PR #${{ github.event.pull_request.number }}'
title: 'Update frontend assets from PR #${{ github.event.pull_request.number }}'
body: |
This PR updates the compiled frontend assets from PR #${{ github.event.pull_request.number }} in the frontend repo.
Frontend PR: ${{ github.event.pull_request.html_url }}
branch: update-frontend-assets-pr-${{ github.event.pull_request.number }}
base: main
path: ComfyUI

31
.github/workflows/vitest.yaml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: Vitest Tests
on:
push:
branches:
- main
- master
- 'dev*'
pull_request:
branches:
- main
- master
- 'dev*'
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: lts/*
- name: Install dependencies
run: npm ci
- name: Run Vitest tests
run: npm run test:component

2
.gitignore vendored
View File

@@ -23,6 +23,7 @@ dist-ssr
*.njsproj
*.sln
*.sw?
components.d.ts
# Ignore test data.
tests-ui/data/*
@@ -34,6 +35,7 @@ tests-ui/workflows/examples
/playwright-report/
/blob-report/
/playwright/.cache/
browser_tests/*/*-win32.png
.env

133
README.md
View File

@@ -1,19 +1,63 @@
<div align="center">
# ComfyUI_frontend
Front-end of [ComfyUI](https://github.com/comfyanonymous/ComfyUI) modernized. This repo is fully compatible with the existing extension system.
**Official front-end implementation of [ComfyUI](https://github.com/comfyanonymous/ComfyUI).**
## How To Use
[![Website][website-shield]][website-url]
[![Discord][discord-shield]][discord-url]
[![Matrix][matrix-shield]][matrix-url]
<br>
[![][github-release-shield]][github-release-link]
[![][github-release-date-shield]][github-release-link]
[![][github-downloads-shield]][github-downloads-link]
[![][github-downloads-latest-shield]][github-downloads-link]
Add command line argument `--front-end-version Comfy-Org/ComfyUI_frontend@latest` to your
ComfyUI launch script.
For Windows stand-alone build users, please edit the `run_cpu.bat` / `run_nvidia_gpu.bat` file as following
[github-release-shield]: https://img.shields.io/github/v/release/Comfy-Org/ComfyUI_frontend?style=flat&sort=semver
[github-release-link]: https://github.com/Comfy-Org/ComfyUI_frontend/releases
[github-release-date-shield]: https://img.shields.io/github/release-date/Comfy-Org/ComfyUI_frontend?style=flat
[github-downloads-shield]: https://img.shields.io/github/downloads/Comfy-Org/ComfyUI_frontend/total?style=flat
[github-downloads-latest-shield]: https://img.shields.io/github/downloads/Comfy-Org/ComfyUI_frontend/latest/total?style=flat&label=downloads%40latest
[github-downloads-link]: https://github.com/Comfy-Org/ComfyUI_frontend/releases
[matrix-shield]: https://img.shields.io/badge/Matrix-000000?style=flat&logo=matrix&logoColor=white
[matrix-url]: https://app.element.io/#/room/%23comfyui_space%3Amatrix.org
[website-shield]: https://img.shields.io/badge/ComfyOrg-4285F4?style=flat
[website-url]: https://www.comfy.org/
[discord-shield]: https://img.shields.io/discord/1218270712402415686?style=flat&logo=discord&logoColor=white&label=Discord
[discord-url]: https://www.comfy.org/discord
</div>
## Release Schedule
### Nightly Release
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:
```
--front-end-version Comfy-Org/ComfyUI_frontend@latest
```
#### For Windows Stand-alone Build Users
Edit your `run_cpu.bat` or `run_nvidia_gpu.bat` file as follows:
```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 weekly in the ComfyUI main repository, aligned with ComfyUI backend's stable release schedule.
#### Feature Freeze
There will be a 2-day feature freeze before each stable release. During this period, no new major features will be merged.
## Release Summary
### Major features
@@ -46,6 +90,36 @@ https://github.com/user-attachments/assets/4bbca3ee-318f-4cf0-be32-a5a5541066cf
### QoL changes
<details>
<summary>v1.2.44: **Litegraph** Double click group title to edit</summary>
https://github.com/user-attachments/assets/5bf0e2b6-8b3a-40a7-b44f-f0879e9ad26f
</details>
<details>
<summary>v1.2.39: **Litegraph** Group selected nodes with Ctrl + G</summary>
https://github.com/user-attachments/assets/7805dc54-0854-4a28-8bcd-4b007fa01151
</details>
<details>
<summary>v1.2.38: **Litegraph** Double click node title to edit</summary>
https://github.com/user-attachments/assets/d61d5d0e-f200-4153-b293-3e3f6a212b30
</details>
<details>
<summary>v1.2.7: **Litegraph** drags multiple links with shift pressed</summary>
https://github.com/user-attachments/assets/68826715-bb55-4b2a-be6e-675cfc424afe
https://github.com/user-attachments/assets/c142c43f-2fe9-4030-8196-b3bfd4c6977d
</details>
<details>
<summary>v1.2.2: **Litegraph** auto connects to correct slot</summary>
@@ -64,9 +138,9 @@ https://github.com/user-attachments/assets/4bbca3ee-318f-4cf0-be32-a5a5541066cf
### Node developers API
<details>
<summary>v1.2.4: Extension API to register custom side bar tab</summary>
<summary>v1.2.4: Extension API to register custom sidebar tab</summary>
Extensions now can call following API to register a sidebar tab.
Extensions now can call the following API to register a sidebar tab.
```js
app.extensionManager.registerSidebarTab({
@@ -81,20 +155,37 @@ https://github.com/user-attachments/assets/4bbca3ee-318f-4cf0-be32-a5a5541066cf
});
```
The list of supported icons can be find here: https://primevue.org/icons/#list
The list of supported icons can be found here: <https://primevue.org/icons/#list>
We will support custom icon later.
We will support custom icons later.
![image](https://github.com/user-attachments/assets/7bff028a-bf91-4cab-bf97-55c243b3f5e0)
</details>
<details>
<summary>v1.2.27: Extension API to add toast message</summary>
Extensions can call the following API to add toast messages.
```js
app.extensionManager.toast.add({
severity: 'info',
summary: 'Loaded!',
detail: 'Extension loaded!',
life: 3000
})
```
Documentation of all supported options can be found here: <https://primevue.org/toast/#api.toast.interfaces.ToastMessageOptions>
![image](https://github.com/user-attachments/assets/de02cd7e-cd81-43d1-a0b0-bccef92ff487)
</details>
## Road Map
### What has been done
- Migrate all code to TypeScript with minimal change modification to the original logic.
- Bundle all code with vite's rollup build.
- Bundle all code with Vite's rollup build.
- Added a shim layer to be backward compatible with the existing extension system. <https://github.com/huchenlei/ComfyUI_frontend/pull/15>
- Front-end dev server.
- Zod schema for input validation on ComfyUI workflow.
@@ -102,18 +193,17 @@ We will support custom icon later.
- Introduce Vue to start managing part of the UI.
- Easy install and version management (<https://github.com/comfyanonymous/ComfyUI/pull/3897>).
- Better node management. Sherlock <https://github.com/Nuked88/ComfyUI-N-Sidebar>.
- Replace the existing ComfyUI front-end implementation. <https://github.com/comfyanonymous/ComfyUI/pull/4379>
### What to be done
- Replace the existing ComfyUI front-end impl
- Remove `@ts-ignore`s.
- Turn on `strict` on `tsconfig.json`.
- Add more widget types for node developers.
- LLM streaming node.
- Linear mode (Similar to InvokeAI's linear mode).
- Keybinding settings management. Register keybindings API for custom nodes.
- New extensions API for adding UI-related features.
## Development
@@ -139,11 +229,26 @@ core extensions will be loaded.
- `npm run test:generate:examples` to extract the example workflows
- `npm run test` to execute all unit tests.
### LiteGraph
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
- Run `npm link` in the local litegraph repo.
- Run `npm uninstall @comfyorg/litegraph` in this repo.
- Run `npm link @comfyorg/litegraph` in this repo.
This will replace the litegraph package in this repo with the local litegraph repo.
## 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.
## Breaking changes
## Publish release to ComfyUI main repo
- api.api_url now adds a prefix `api/` to every url going through the method. If the custom node registers a new api endpoint but does not offer the `api/` prefixed alt endpoint, it will have issue. Luckily there aren't many extensions that do that. We can perform an audit before launching to resolve this issue.
Run following command to publish a release to ComfyUI main repo. The script will create a new branch and do a commit to `web/` folder by checkout `dist.zip`
from GitHub release.
- `python scripts/main_repo_release.py <path_to_comfyui_main_repo> <version>`

View File

@@ -2,6 +2,8 @@ import type { Page, Locator } from '@playwright/test'
import { test as base } from '@playwright/test'
import dotenv from 'dotenv'
dotenv.config()
import * as fs from 'fs'
import { NodeBadgeMode } from '../src/types/nodeSource'
interface Position {
x: number
@@ -26,18 +28,24 @@ class ComfyNodeSearchBox {
)
}
async fillAndSelectFirstNode(nodeName: string) {
async fillAndSelectFirstNode(
nodeName: string,
options?: { suggestionIndex: number }
) {
await this.input.waitFor({ state: 'visible' })
await this.input.fill(nodeName)
await this.dropdown.waitFor({ state: 'visible' })
// Wait for some time for the auto complete list to update.
// The auto complete list is debounced and may take some time to update.
await this.page.waitForTimeout(500)
await this.dropdown.locator('li').nth(0).click()
await this.dropdown
.locator('li')
.nth(options?.suggestionIndex || 0)
.click()
}
}
class NodeLibrarySideBarTab {
class NodeLibrarySidebarTab {
public readonly tabId: string = 'node-library'
constructor(public readonly page: Page) {}
@@ -51,14 +59,26 @@ class NodeLibrarySideBarTab {
)
}
get nodeLibrarySearchBoxInput() {
return this.page.locator('.node-lib-search-box input[type="text"]')
}
get nodeLibraryTree() {
return this.page.locator('.node-lib-tree')
return this.page.locator('.node-lib-tree-explorer')
}
get nodePreview() {
return this.page.locator('.node-lib-node-preview')
}
get tabContainer() {
return this.page.locator('.sidebar-content-container')
}
get newFolderButton() {
return this.tabContainer.locator('.new-folder-button')
}
async open() {
if (await this.selectedTabButton.isVisible()) {
return
@@ -68,22 +88,34 @@ class NodeLibrarySideBarTab {
await this.nodeLibraryTree.waitFor({ state: 'visible' })
}
async toggleFirstFolder() {
await this.page.locator('.p-tree-node-toggle-button').nth(0).click()
folderSelector(folderName: string) {
return `.p-tree-node-content:has(> .tree-explorer-node-label:has(.tree-folder .node-label:has-text("${folderName}")))`
}
getFolder(folderName: string) {
return this.page.locator(this.folderSelector(folderName))
}
nodeSelector(nodeName: string) {
return `.p-tree-node-content:has(> .tree-explorer-node-label:has(.tree-leaf .node-label:has-text("${nodeName}")))`
}
getNode(nodeName: string) {
return this.page.locator(this.nodeSelector(nodeName))
}
}
class ComfyMenu {
public readonly sideToolBar: Locator
public readonly sideToolbar: Locator
public readonly themeToggleButton: Locator
constructor(public readonly page: Page) {
this.sideToolBar = page.locator('.side-tool-bar-container')
this.sideToolbar = page.locator('.side-tool-bar-container')
this.themeToggleButton = page.locator('.comfy-vue-theme-toggle')
}
get nodeLibraryTab() {
return new NodeLibrarySideBarTab(this.page)
return new NodeLibrarySidebarTab(this.page)
}
async toggleTheme() {
@@ -118,6 +150,7 @@ export class ComfyPage {
// Buttons
public readonly resetViewButton: Locator
public readonly queueButton: Locator
// Inputs
public readonly workflowUploadInput: Locator
@@ -131,6 +164,7 @@ export class ComfyPage {
this.canvas = page.locator('#graph-canvas')
this.widgetTextBox = page.getByPlaceholder('text').nth(1)
this.resetViewButton = page.getByRole('button', { name: 'Reset View' })
this.queueButton = page.getByRole('button', { name: 'Queue Prompt' })
this.workflowUploadInput = page.locator('#comfy-file-input')
this.searchBox = new ComfyNodeSearchBox(page)
this.menu = new ComfyMenu(page)
@@ -168,9 +202,35 @@ export class ComfyPage {
// Reset view to force re-rendering of canvas. So that info fields like fps
// become hidden.
await this.resetView()
// Hide all badges by default.
await this.setSetting('Comfy.NodeBadge.NodeIdBadgeMode', NodeBadgeMode.None)
await this.setSetting(
'Comfy.NodeBadge.NodeSourceBadgeMode',
NodeBadgeMode.None
)
}
async realod() {
public assetPath(fileName: string) {
return `./browser_tests/assets/${fileName}`
}
async setSetting(settingId: string, settingValue: any) {
return await this.page.evaluate(
async ({ id, value }) => {
await window['app'].ui.settings.setSettingValueAsync(id, value)
},
{ id: settingId, value: settingValue }
)
}
async getSetting(settingId: string) {
return await this.page.evaluate(async (id) => {
return await window['app'].ui.settings.getSettingValue(id)
}, settingId)
}
async reload() {
await this.page.reload({ timeout: 15000 })
await this.setup()
}
@@ -185,9 +245,13 @@ export class ComfyPage {
})
}
async delay(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
async loadWorkflow(workflowName: string) {
await this.workflowUploadInput.setInputFiles(
`./browser_tests/assets/${workflowName}.json`
this.assetPath(`${workflowName}.json`)
)
await this.nextFrame()
}
@@ -211,6 +275,16 @@ export class ComfyPage {
await this.nextFrame()
}
async clickTextEncodeNodeToggler() {
await this.canvas.click({
position: {
x: 430,
y: 171
}
})
await this.nextFrame()
}
async clickTextEncodeNode2() {
await this.canvas.click({
position: {
@@ -239,6 +313,54 @@ export class ComfyPage {
await this.nextFrame()
}
async dragAndDropFile(fileName: string) {
const filePath = this.assetPath(fileName)
// Read the file content
const buffer = fs.readFileSync(filePath)
// Get file type
const getFileType = (fileName: string) => {
if (fileName.endsWith('.png')) return 'image/png'
if (fileName.endsWith('.webp')) return 'image/webp'
if (fileName.endsWith('.json')) return 'application/json'
return 'application/octet-stream'
}
const fileType = getFileType(fileName)
await this.page.evaluate(
async ({ buffer, fileName, fileType }) => {
const file = new File([new Uint8Array(buffer)], fileName, {
type: fileType
})
const dataTransfer = new DataTransfer()
dataTransfer.items.add(file)
const dropEvent = new DragEvent('drop', {
bubbles: true,
cancelable: true,
dataTransfer
})
Object.defineProperty(dropEvent, 'preventDefault', {
value: () => {},
writable: false
})
Object.defineProperty(dropEvent, 'stopPropagation', {
value: () => {},
writable: false
})
document.dispatchEvent(dropEvent)
},
{ buffer: [...new Uint8Array(buffer)], fileName, fileType }
)
await this.nextFrame()
}
async dragNode2() {
await this.dragAndDrop({ x: 622, y: 400 }, { x: 622, y: 300 })
await this.nextFrame()
@@ -280,16 +402,22 @@ export class ComfyPage {
await this.nextFrame()
}
async zoom(deltaY: number) {
async zoom(deltaY: number, steps: number = 1) {
await this.page.mouse.move(10, 10)
await this.page.mouse.wheel(0, deltaY)
for (let i = 0; i < steps; i++) {
await this.page.mouse.wheel(0, deltaY)
}
await this.nextFrame()
}
async pan(offset: Position) {
await this.page.mouse.move(10, 10)
async pan(offset: Position, safeSpot?: Position) {
safeSpot = safeSpot || { x: 10, y: 10 }
await this.page.mouse.move(safeSpot.x, safeSpot.y)
await this.page.mouse.down()
await this.page.mouse.move(offset.x, offset.y)
// TEMPORARY HACK: Multiple pans open the search menu, so cheat and keep it closed.
// TODO: Fix that (double-click at not-the-same-coordinations should not open the menu)
await this.page.keyboard.press('Escape')
await this.page.mouse.move(offset.x + safeSpot.x, offset.y + safeSpot.y)
await this.page.mouse.up()
await this.nextFrame()
}
@@ -350,6 +478,34 @@ export class ComfyPage {
await this.nextFrame()
}
async ctrlZ() {
await this.page.keyboard.down('Control')
await this.page.keyboard.press('KeyZ')
await this.page.keyboard.up('Control')
await this.nextFrame()
}
async ctrlY() {
await this.page.keyboard.down('Control')
await this.page.keyboard.press('KeyY')
await this.page.keyboard.up('Control')
await this.nextFrame()
}
async ctrlArrowUp() {
await this.page.keyboard.down('Control')
await this.page.keyboard.press('ArrowUp')
await this.page.keyboard.up('Control')
await this.nextFrame()
}
async ctrlArrowDown() {
await this.page.keyboard.down('Control')
await this.page.keyboard.press('ArrowDown')
await this.page.keyboard.up('Control')
await this.nextFrame()
}
async closeMenu() {
await this.page.click('button.comfy-close-menu-btn')
await this.nextFrame()

41
browser_tests/README.md Normal file
View File

@@ -0,0 +1,41 @@
# Playwright Testing for ComfyUI_frontend
This document outlines the setup and usage of Playwright for testing the ComfyUI_frontend project.
## Setup
Ensure you have Node.js v20 or later installed. Then, set up the Chromium test driver:
```bash
npx playwright install chromium --with-deps
```
## Running Tests
There are two ways to run the tests:
1. **Headless mode with report generation:**
```bash
npx playwright test
```
This runs all tests without a visible browser and generates a comprehensive test report.
2. **UI mode for interactive testing:**
```bash
npx playwright test --ui
```
This opens a user interface where you can select specific tests to run and inspect the test execution timeline.
![Playwright UI Mode](https://github.com/user-attachments/assets/6a1ebef0-90eb-4157-8694-f5ee94d03755)
## Screenshot Expectations
Due to variations in system font rendering, screenshot expectations are platform-specific. Please note:
- We maintain Linux screenshot expectations as our GitHub Action runner operates in a Linux environment.
- To set new test expectations:
1. Create a pull request from a `Comfy-Org/ComfyUI_frontend` branch.
2. Add the `New Browser Test Expectation` tag to your pull request.
3. This will trigger a GitHub action to update the screenshot expectations automatically.
> **Note:** If you're making a pull request from a forked repository, the GitHub action won't be able to commit updated screenshot expectations directly to your PR branch.

View File

@@ -0,0 +1,193 @@
{
"last_node_id": 10,
"last_link_id": 9,
"nodes": [
{
"id": 4,
"type": "CheckpointLoaderSimple",
"pos": [
0,
92
],
"size": {
"0": 315,
"1": 98
},
"flags": {},
"order": 0,
"mode": 0,
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [],
"slot_index": 0
},
{
"name": "CLIP",
"type": "CLIP",
"links": [
3,
5
],
"slot_index": 1
},
{
"name": "VAE",
"type": "VAE",
"links": [],
"slot_index": 2
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"3Guofeng3_v32Light.safetensors"
]
},
{
"id": 6,
"type": "CLIPTextEncode",
"pos": [
460,
92
],
"size": {
"0": 422.84503173828125,
"1": 164.31304931640625
},
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 3
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"beautiful scenery nature glass bottle landscape, , purple galaxy bottle,"
]
},
{
"id": 7,
"type": "CLIPTextEncode",
"pos": [
460,
368
],
"size": {
"0": 425.27801513671875,
"1": 180.6060791015625
},
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 5
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"text, watermark"
]
},
{
"id": 10,
"type": "CheckpointLoaderSimple",
"pos": [
0,
276
],
"size": {
"0": 315,
"1": 98
},
"flags": {},
"order": 1,
"mode": 0,
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [],
"slot_index": 0
},
{
"name": "CLIP",
"type": "CLIP",
"links": [],
"slot_index": 1
},
{
"name": "VAE",
"type": "VAE",
"links": [],
"slot_index": 2
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"3Guofeng3_v32Light.safetensors"
]
}
],
"links": [
[
3,
4,
1,
6,
0,
"CLIP"
],
[
5,
4,
1,
7,
0,
"CLIP"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
0,
0
]
}
},
"version": 0.4
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

View File

@@ -0,0 +1,84 @@
{
"last_node_id": 17,
"last_link_id": 15,
"nodes": [
{
"id": 14,
"type": "PreviewImage",
"pos": {
"0": 300,
"1": 60
},
"size": {
"0": 213.8594970703125,
"1": 50.65289306640625
},
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 15
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
}
},
{
"id": 17,
"type": "DevToolsErrorRaiseNode",
"pos": {
"0": 20,
"1": 60
},
"size": {
"0": 210,
"1": 26
},
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
15
],
"slot_index": 0,
"shape": 3
}
],
"properties": {
"Node name for S&R": "DevToolsErrorRaiseNode"
}
}
],
"links": [
[
15,
17,
0,
14,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
117.20766722169206,
472.69035116826046
]
}
},
"version": 0.4
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

View File

@@ -0,0 +1,25 @@
{
"last_node_id": 0,
"last_link_id": 0,
"nodes": [],
"links": [],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
0,
0
]
}
},
"models": [
{
"name": "fake_model.safetensors",
"url": "http://localhost:8188/api/devtools/fake_model.safetensors",
"directory": "clip"
}
],
"version": 0.4
}

View File

@@ -0,0 +1,61 @@
{
"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
}
],
"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": {
"ds": {
"scale": 1,
"offset": [
0, 0
]
}
},
"version": 0.4
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

View File

@@ -0,0 +1,145 @@
{
"last_node_id": 2,
"last_link_id": 1,
"nodes": [
{
"id": 2,
"type": "KSampler",
"pos": {
"0": 521.0906982421875,
"1": 40.999996185302734,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0
},
"size": {
"0": 315,
"1": 262
},
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": null
},
{
"name": "positive",
"type": "CONDITIONING",
"link": null
},
{
"name": "negative",
"type": "CONDITIONING",
"link": null
},
{
"name": "latent_image",
"type": "LATENT",
"link": null
},
{
"name": "steps",
"type": "INT",
"link": 1,
"widget": {
"name": "steps"
}
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": null,
"shape": 3
}
],
"properties": {
"Node name for S&R": "KSampler"
},
"widgets_values": [
0,
"randomize",
20,
8,
"euler",
"normal",
1
]
},
{
"id": 1,
"type": "PrimitiveNode",
"pos": {
"0": 15,
"1": 46,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0
},
"size": [
446.96645387135936,
108.34243389566905
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "INT",
"type": "INT",
"links": [
1
],
"slot_index": 0,
"widget": {
"name": "steps"
}
}
],
"properties": {
"Run widget replace on values": false
},
"widgets_values": [
20,
"fixed"
]
}
],
"links": [
[
1,
1,
0,
2,
4,
"INT"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
0,
0
]
}
},
"version": 0.4
}

View File

@@ -0,0 +1,88 @@
{
"last_node_id": 9,
"last_link_id": 13,
"nodes": [
{
"id": 3,
"type": "KSampler",
"pos": {
"0": 10.321063995361328,
"1": 73.14462280273438
},
"size": {
"0": 315,
"1": 262
},
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": null
},
{
"name": "positive",
"type": "CONDITIONING",
"link": null
},
{
"name": "negative",
"type": "CONDITIONING",
"link": null
},
{
"name": "latent_image",
"type": "LATENT",
"link": null
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "KSampler"
},
"widgets_values": [
156680208700286,
"randomize",
20,
8,
"euler",
"normal",
1
]
}
],
"links": [],
"groups": [
{
"title": "Group",
"bounding": [
0,
0,
335,
346
],
"color": "#3f789e",
"font_size": 24
}
],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
0,
0
]
}
},
"version": 0.4
}

View File

@@ -0,0 +1,30 @@
{
"last_node_id": 9,
"last_link_id": 13,
"nodes": [],
"links": [],
"groups": [
{
"title": "Group",
"bounding": [
0,
0,
335,
346
],
"color": "#3f789e",
"font_size": 24
}
],
"config": {},
"extra": {
"ds": {
"scale": 1.2100000000000006,
"offset": [
104.34159172650945,
241.35965953210126
]
}
},
"version": 0.4
}

View File

@@ -0,0 +1,76 @@
{
"last_node_id": 9,
"last_link_id": 13,
"nodes": [
{
"id": 3,
"type": "KSampler",
"pos": [
0,
30
],
"size": {
"0": 315,
"1": 262
},
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": null
},
{
"name": "positive",
"type": "CONDITIONING",
"link": null
},
{
"name": "negative",
"type": "CONDITIONING",
"link": null
},
{
"name": "latent_image",
"type": "LATENT",
"link": null
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "KSampler"
},
"widgets_values": [
156680208700286,
"randomize",
20,
8,
"euler",
"normal",
1
]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
0,
0
]
}
},
"version": 0.4
}

View File

@@ -0,0 +1,46 @@
{
"last_node_id": 9,
"last_link_id": 9,
"nodes": [
{
"id": 9,
"type": "SaveImage",
"pos": {
"0": 64,
"1": 104
},
"size": {
"0": 210,
"1": 58
},
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": null
}
],
"outputs": [],
"properties": {},
"widgets_values": [
"ComfyUI"
]
}
],
"links": [],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
0,
0
]
}
},
"version": 0.4
}

View File

@@ -0,0 +1,377 @@
{
"last_node_id": 0,
"last_link_id": 18,
"nodes": [
{
"id": "CheckpointLoaderSimple.0",
"type": "CheckpointLoaderSimple",
"pos": {
"0": 100,
"1": 130
},
"size": {
"0": 315,
"1": 98
},
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
12
],
"shape": 3
},
{
"name": "CLIP",
"type": "CLIP",
"links": [
10,
11
],
"shape": 3
},
{
"name": "VAE",
"type": "VAE",
"links": [
17
],
"shape": 3
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"v1-5-pruned-emaonly.ckpt"
]
},
{
"id": "CLIPTextEncode.0",
"type": "CLIPTextEncode",
"pos": {
"0": 515,
"1": 130
},
"size": {
"0": 400,
"1": 200
},
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 10
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
13
],
"shape": 3
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"beautiful scenery nature glass bottle landscape, , purple galaxy bottle,"
]
},
{
"id": "CLIPTextEncode.1",
"type": "CLIPTextEncode",
"pos": {
"0": 515,
"1": 460
},
"size": {
"0": 400,
"1": 200
},
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 11
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
14
],
"shape": 3
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"text, watermark"
]
},
{
"id": "EmptyLatentImage.0",
"type": "EmptyLatentImage",
"pos": {
"0": 100,
"1": 358
},
"size": {
"0": 315,
"1": 106
},
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
15
],
"shape": 3
}
],
"properties": {
"Node name for S&R": "EmptyLatentImage"
},
"widgets_values": [
512,
512,
1
]
},
{
"id": "KSampler.0",
"type": "KSampler",
"pos": {
"0": 1015,
"1": 130
},
"size": {
"0": 315,
"1": 262
},
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 12
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 13
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 14
},
{
"name": "latent_image",
"type": "LATENT",
"link": 15
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
16
],
"shape": 3
}
],
"properties": {
"Node name for S&R": "KSampler"
},
"widgets_values": [
3,
"randomize",
20,
8,
"euler",
"normal",
1
]
},
{
"id": "VAEDecode.0",
"type": "VAEDecode",
"pos": {
"0": 1430,
"1": 130
},
"size": {
"0": 210,
"1": 46
},
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 16
},
{
"name": "vae",
"type": "VAE",
"link": 17
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
18
],
"shape": 3
}
],
"properties": {
"Node name for S&R": "VAEDecode"
}
},
{
"id": "SaveImage.0",
"type": "SaveImage",
"pos": {
"0": 1740,
"1": 130
},
"size": {
"0": 315,
"1": 58
},
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 18
}
],
"outputs": [],
"properties": {},
"widgets_values": [
"ComfyUI"
]
}
],
"links": [
[
10,
"CheckpointLoaderSimple.0",
1,
"CLIPTextEncode.0",
0,
"CLIP"
],
[
11,
"CheckpointLoaderSimple.0",
1,
"CLIPTextEncode.1",
0,
"CLIP"
],
[
12,
"CheckpointLoaderSimple.0",
0,
"KSampler.0",
0,
"MODEL"
],
[
13,
"CLIPTextEncode.0",
0,
"KSampler.0",
1,
"CONDITIONING"
],
[
14,
"CLIPTextEncode.1",
0,
"KSampler.0",
2,
"CONDITIONING"
],
[
15,
"EmptyLatentImage.0",
0,
"KSampler.0",
3,
"LATENT"
],
[
16,
"KSampler.0",
0,
"VAEDecode.0",
0,
"LATENT"
],
[
17,
"CheckpointLoaderSimple.0",
2,
"VAEDecode.0",
1,
"VAE"
],
[
18,
"VAEDecode.0",
0,
"SaveImage.0",
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1,
"offset": [
149.9747408641311,
383.8593224280729
]
}
},
"version": 0.4
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

View File

@@ -22,6 +22,28 @@ test.describe('Copy Paste', () => {
expect(resultString).toBe(originalString + originalString)
})
test('Can copy and paste widget value', async ({ comfyPage }) => {
// Copy width value (512) from empty latent node to KSampler's seed.
// Empty latent node's width
await comfyPage.canvas.click({
position: {
x: 718,
y: 643
}
})
await comfyPage.ctrlC()
// KSampler's seed
await comfyPage.canvas.click({
position: {
x: 1005,
y: 281
}
})
await comfyPage.ctrlV()
await comfyPage.page.keyboard.press('Enter')
await expect(comfyPage.canvas).toHaveScreenshot('copied-widget-value.png')
})
/**
* https://github.com/Comfy-Org/ComfyUI_frontend/issues/98
*/
@@ -53,4 +75,15 @@ test.describe('Copy Paste', () => {
await comfyPage.ctrlV()
await expect(comfyPage.canvas).toHaveScreenshot('no-node-copied.png')
})
test('Copy node by dragging + alt', async ({ comfyPage }) => {
// TextEncodeNode1
await comfyPage.page.mouse.move(618, 191)
await comfyPage.page.keyboard.down('Alt')
await comfyPage.page.mouse.down()
await comfyPage.page.mouse.move(100, 100)
await comfyPage.page.mouse.up()
await comfyPage.page.keyboard.up('Alt')
await expect(comfyPage.canvas).toHaveScreenshot('drag-copy-copied-node.png')
})
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

View File

@@ -0,0 +1,106 @@
import { expect } from '@playwright/test'
import { comfyPageFixture as test } from './ComfyPage'
test.describe('Load workflow warning', () => {
test('Should display a warning when loading a workflow with missing nodes', async ({
comfyPage
}) => {
await comfyPage.loadWorkflow('missing_nodes')
// Wait for the element with the .comfy-missing-nodes selector to be visible
const missingNodesWarning = comfyPage.page.locator('.comfy-missing-nodes')
await expect(missingNodesWarning).toBeVisible()
})
})
test('Does not report warning when switching between opened workflows', async ({
comfyPage
}) => {
await comfyPage.setSetting('Comfy.UseNewMenu', 'Top')
await comfyPage.loadWorkflow('missing_nodes')
await comfyPage.page.locator('.p-dialog-close-button').click()
// Load default workflow
const workflowSelector = comfyPage.page.locator(
'button.comfyui-workflows-button'
)
await workflowSelector.hover()
await workflowSelector.click()
await comfyPage.page.locator('button[title="Load default workflow"]').click()
// Switch back to the missing_nodes workflow
await workflowSelector.click()
await comfyPage.page.locator('span:has-text("missing_nodes")').first().click()
await comfyPage.nextFrame()
await expect(comfyPage.page.locator('.comfy-missing-nodes')).not.toBeVisible()
await comfyPage.setSetting('Comfy.UseNewMenu', 'Disabled')
})
test('Does not report warning on undo/redo', async ({ comfyPage }) => {
await comfyPage.loadWorkflow('missing_nodes')
await comfyPage.page.locator('.p-dialog-close-button').click()
await comfyPage.nextFrame()
// Make a change to the graph
await comfyPage.setSetting('Comfy.NodeSearchBoxImpl', 'default')
await comfyPage.page.waitForTimeout(256)
await comfyPage.doubleClickCanvas()
await comfyPage.searchBox.fillAndSelectFirstNode('KSampler')
// Undo and redo the change
await comfyPage.ctrlZ()
await expect(comfyPage.page.locator('.comfy-missing-nodes')).not.toBeVisible()
await comfyPage.ctrlY()
await expect(comfyPage.page.locator('.comfy-missing-nodes')).not.toBeVisible()
})
test.describe('Execution error', () => {
test('Should display an error message when an execution error occurs', async ({
comfyPage
}) => {
await comfyPage.loadWorkflow('execution_error')
await comfyPage.queueButton.click()
// Wait for the element with the .comfy-execution-error selector to be visible
const executionError = comfyPage.page.locator('.comfy-error-report')
await expect(executionError).toBeVisible()
})
})
test.describe('Missing models warning', () => {
test.beforeEach(async ({ comfyPage }) => {
await comfyPage.page.evaluate((url: string) => {
return fetch(`${url}/api/devtools/cleanup_fake_model`)
}, comfyPage.url)
await comfyPage.setSetting('Comfy.Workflow.ModelDownload.AllowedSources', [
'http://localhost:8188'
])
await comfyPage.setSetting('Comfy.Workflow.ModelDownload.AllowedSuffixes', [
'.safetensors'
])
})
test('Should display a warning when missing models are found', async ({
comfyPage
}) => {
await comfyPage.setSetting('Comfy.Workflow.ShowMissingModelsWarning', true)
// The fake_model.safetensors is served by
// https://github.com/Comfy-Org/ComfyUI_devtools/blob/main/__init__.py
await comfyPage.loadWorkflow('missing_models')
// Wait for the element with the .comfy-missing-models selector to be visible
const missingModelsWarning = comfyPage.page.locator('.comfy-missing-models')
await expect(missingModelsWarning).toBeVisible()
// Click the download button
const downloadButton = comfyPage.page.getByLabel('Download')
await expect(downloadButton).toBeVisible()
await downloadButton.click()
// Wait for the element with the .download-complete selector to be visible
const downloadComplete = comfyPage.page.locator('.download-complete')
await expect(downloadComplete).toBeVisible()
})
})

View File

@@ -1,5 +1,5 @@
import { expect } from '@playwright/test'
import { ComfyPage, comfyPageFixture as test } from './ComfyPage'
import { comfyPageFixture as test } from './ComfyPage'
test.describe('Node Interaction', () => {
test('Can enter prompt', async ({ comfyPage }) => {
@@ -19,13 +19,13 @@ test.describe('Node Interaction', () => {
await expect(comfyPage.canvas).toHaveScreenshot('selected-node2.png')
})
// Flaky. See https://github.com/comfyanonymous/ComfyUI/issues/3866
test.skip('Can drag node', async ({ comfyPage }) => {
test('Can drag node', async ({ comfyPage }) => {
await comfyPage.dragNode2()
await expect(comfyPage.canvas).toHaveScreenshot('dragged-node1.png')
})
test('Can disconnect/connect edge', async ({ comfyPage }) => {
await comfyPage.setSetting('Comfy.LinkRelease.Action', 'no action')
await comfyPage.disconnectEdge()
await expect(comfyPage.canvas).toHaveScreenshot(
'disconnected-edge-with-menu.png'
@@ -58,6 +58,174 @@ test.describe('Node Interaction', () => {
await expect(comfyPage.canvas).toHaveScreenshot('snap_to_slot_linked.png')
})
test('Can batch move links by drag with shift', async ({ comfyPage }) => {
await comfyPage.loadWorkflow('batch_move_links')
await expect(comfyPage.canvas).toHaveScreenshot('batch_move_links.png')
const outputSlot1Pos = {
x: 304,
y: 127
}
const outputSlot2Pos = {
x: 307,
y: 310
}
await comfyPage.page.keyboard.down('Shift')
await comfyPage.dragAndDrop(outputSlot1Pos, outputSlot2Pos)
await comfyPage.page.keyboard.up('Shift')
await expect(comfyPage.canvas).toHaveScreenshot(
'batch_move_links_moved.png'
)
})
test('Can batch disconnect links with ctrl+alt+click', async ({
comfyPage
}) => {
const loadCheckpointClipSlotPos = {
x: 332,
y: 508
}
await comfyPage.canvas.click({
modifiers: ['Control', 'Alt'],
position: loadCheckpointClipSlotPos
})
await comfyPage.nextFrame()
await expect(comfyPage.canvas).toHaveScreenshot(
'batch-disconnect-links-disconnected.png'
)
})
test('Can toggle dom widget node open/closed', async ({ comfyPage }) => {
await expect(comfyPage.canvas).toHaveScreenshot('default.png')
await comfyPage.clickTextEncodeNodeToggler()
await expect(comfyPage.canvas).toHaveScreenshot(
'text-encode-toggled-off.png'
)
await comfyPage.delay(1000)
await comfyPage.clickTextEncodeNodeToggler()
await expect(comfyPage.canvas).toHaveScreenshot(
'text-encode-toggled-back-open.png'
)
})
test('Can close prompt dialog with canvas click (number widget)', async ({
comfyPage
}) => {
const numberWidgetPos = {
x: 724,
y: 645
}
await comfyPage.canvas.click({
position: numberWidgetPos
})
await expect(comfyPage.canvas).toHaveScreenshot('prompt-dialog-opened.png')
// Wait for 1s so that it does not trigger the search box by double click.
await comfyPage.page.waitForTimeout(1000)
await comfyPage.canvas.click({
position: {
x: 10,
y: 10
}
})
await expect(comfyPage.canvas).toHaveScreenshot('prompt-dialog-closed.png')
})
test('Can close prompt dialog with canvas click (text widget)', async ({
comfyPage
}) => {
const textWidgetPos = {
x: 167,
y: 143
}
await comfyPage.loadWorkflow('single_save_image_node')
await comfyPage.canvas.click({
position: textWidgetPos
})
await expect(comfyPage.canvas).toHaveScreenshot(
'prompt-dialog-opened-text.png'
)
await comfyPage.page.waitForTimeout(1000)
await comfyPage.canvas.click({
position: {
x: 10,
y: 10
}
})
await expect(comfyPage.canvas).toHaveScreenshot(
'prompt-dialog-closed-text.png'
)
})
test('Can double click node title to edit', async ({ comfyPage }) => {
await comfyPage.loadWorkflow('single_ksampler')
await comfyPage.canvas.dblclick({
position: {
x: 50,
y: 10
}
})
await comfyPage.page.keyboard.type('Hello World')
await comfyPage.page.keyboard.press('Enter')
await expect(comfyPage.canvas).toHaveScreenshot('node-title-edited.png')
})
test('Double click node body does not trigger edit', async ({
comfyPage
}) => {
await comfyPage.loadWorkflow('single_ksampler')
await comfyPage.canvas.dblclick({
position: {
x: 50,
y: 50
}
})
expect(await comfyPage.page.locator('.node-title-editor').count()).toBe(0)
})
test('Can group selected nodes', async ({ comfyPage }) => {
await comfyPage.setSetting('Comfy.GroupSelectedNodes.Padding', 10)
await comfyPage.select2Nodes()
await comfyPage.page.keyboard.down('Control')
await comfyPage.page.keyboard.press('KeyG')
await comfyPage.page.keyboard.up('Control')
await comfyPage.nextFrame()
// Confirm group title
await comfyPage.page.keyboard.press('Enter')
await comfyPage.nextFrame()
await expect(comfyPage.canvas).toHaveScreenshot('group-selected-nodes.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
}) => {
await comfyPage.select2Nodes()
await comfyPage.canvas.press('KeyP')
await comfyPage.nextFrame()
await expect(comfyPage.canvas).toHaveScreenshot('nodes-pinned.png')
await comfyPage.canvas.press('KeyP')
await comfyPage.nextFrame()
await expect(comfyPage.canvas).toHaveScreenshot('nodes-unpinned.png')
})
})
test.describe('Group Interaction', () => {
test('Can double click group title to edit', async ({ comfyPage }) => {
await comfyPage.loadWorkflow('single_group')
await comfyPage.canvas.dblclick({
position: {
x: 50,
y: 10
}
})
await comfyPage.page.keyboard.type('Hello World')
await comfyPage.page.keyboard.press('Enter')
await expect(comfyPage.canvas).toHaveScreenshot('group-title-edited.png')
})
})
test.describe('Canvas Interaction', () => {
@@ -68,8 +236,111 @@ test.describe('Canvas Interaction', () => {
await expect(comfyPage.canvas).toHaveScreenshot('zoomed-out.png')
})
test('Can zoom very far out', async ({ comfyPage }) => {
await comfyPage.zoom(100, 12)
await expect(comfyPage.canvas).toHaveScreenshot('zoomed-very-far-out.png')
await comfyPage.zoom(-100, 12)
await expect(comfyPage.canvas).toHaveScreenshot('zoomed-back-in.png')
})
test('Can zoom in/out with ctrl+shift+vertical-drag', async ({
comfyPage
}) => {
await comfyPage.page.keyboard.down('Control')
await comfyPage.page.keyboard.down('Shift')
await comfyPage.dragAndDrop({ x: 10, y: 100 }, { x: 10, y: 40 })
await expect(comfyPage.canvas).toHaveScreenshot('zoomed-in-ctrl-shift.png')
await comfyPage.dragAndDrop({ x: 10, y: 40 }, { x: 10, y: 160 })
await expect(comfyPage.canvas).toHaveScreenshot('zoomed-out-ctrl-shift.png')
await comfyPage.dragAndDrop({ x: 10, y: 280 }, { x: 10, y: 220 })
await expect(comfyPage.canvas).toHaveScreenshot(
'zoomed-default-ctrl-shift.png'
)
await comfyPage.page.keyboard.up('Control')
await comfyPage.page.keyboard.up('Shift')
})
test('Can zoom in/out after decreasing canvas zoom speed setting', async ({
comfyPage
}) => {
await comfyPage.setSetting('Comfy.Graph.ZoomSpeed', 1.05)
await comfyPage.zoom(-100, 4)
await expect(comfyPage.canvas).toHaveScreenshot(
'zoomed-in-low-zoom-speed.png'
)
await comfyPage.zoom(100, 8)
await expect(comfyPage.canvas).toHaveScreenshot(
'zoomed-out-low-zoom-speed.png'
)
await comfyPage.setSetting('Comfy.Graph.ZoomSpeed', 1.1)
})
test('Can zoom in/out after increasing canvas zoom speed', async ({
comfyPage
}) => {
await comfyPage.setSetting('Comfy.Graph.ZoomSpeed', 1.5)
await comfyPage.zoom(-100, 4)
await expect(comfyPage.canvas).toHaveScreenshot(
'zoomed-in-high-zoom-speed.png'
)
await comfyPage.zoom(100, 8)
await expect(comfyPage.canvas).toHaveScreenshot(
'zoomed-out-high-zoom-speed.png'
)
await comfyPage.setSetting('Comfy.Graph.ZoomSpeed', 1.1)
})
test('Can pan', async ({ comfyPage }) => {
await comfyPage.pan({ x: 200, y: 200 })
await expect(comfyPage.canvas).toHaveScreenshot('panned.png')
})
test('Can pan very far and back', async ({ comfyPage }) => {
// intentionally slice the edge of where the clip text encode dom widgets are
await comfyPage.pan({ x: -800, y: -300 }, { x: 1000, y: 10 })
await expect(comfyPage.canvas).toHaveScreenshot('panned-step-one.png')
await comfyPage.pan({ x: -200, y: 0 }, { x: 1000, y: 10 })
await expect(comfyPage.canvas).toHaveScreenshot('panned-step-two.png')
await comfyPage.pan({ x: -2200, y: -2200 }, { x: 1000, y: 10 })
await expect(comfyPage.canvas).toHaveScreenshot('panned-far-away.png')
await comfyPage.pan({ x: 2200, y: 2200 }, { x: 1000, y: 10 })
await expect(comfyPage.canvas).toHaveScreenshot('panned-back-from-far.png')
await comfyPage.pan({ x: 200, y: 0 }, { x: 1000, y: 10 })
await expect(comfyPage.canvas).toHaveScreenshot('panned-back-to-two.png')
await comfyPage.pan({ x: 800, y: 300 }, { x: 1000, y: 10 })
await expect(comfyPage.canvas).toHaveScreenshot('panned-back-to-one.png')
})
})
test.describe('Widget Interaction', () => {
test('Undo text input', async ({ comfyPage }) => {
const textBox = comfyPage.widgetTextBox
await textBox.click()
await textBox.fill('')
await expect(textBox).toHaveValue('')
await textBox.fill('Hello World')
await expect(textBox).toHaveValue('Hello World')
await comfyPage.ctrlZ()
await expect(textBox).toHaveValue('')
})
test('Undo attention edit', async ({ comfyPage }) => {
await comfyPage.setSetting('Comfy.EditAttention.Delta', 0.05)
const textBox = comfyPage.widgetTextBox
await textBox.click()
await textBox.fill('1girl')
await expect(textBox).toHaveValue('1girl')
await textBox.selectText()
await comfyPage.ctrlArrowUp()
await expect(textBox).toHaveValue('(1girl:1.05)')
await comfyPage.ctrlZ()
await expect(textBox).toHaveValue('1girl')
})
})
test.describe('Load workflow', () => {
test('Can load workflow with string node id', async ({ comfyPage }) => {
await comfyPage.loadWorkflow('string_node_id')
await expect(comfyPage.canvas).toHaveScreenshot('string_node_id.png')
})
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

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