Compare commits

...

366 Commits

Author SHA1 Message Date
github-actions
69366e5e91 Update locales [skip ci] 2025-02-28 22:11:52 +00:00
bymyself
5facc77529 move to expandable advanced tools 2025-02-28 15:08:07 -07:00
bymyself
289cbe428e move validation to form 2025-02-28 15:08:07 -07:00
github-actions
96e39b4c85 Update locales [skip ci] 2025-02-28 00:53:08 +00:00
bymyself
590280dd92 node model metadata edit popover 2025-02-27 17:41:36 -07:00
Chenlei Hu
cb4a5b88fc Remove magic 10% scale on numeric widget step (#2759) 2025-02-27 16:56:22 -05:00
Chenlei Hu
b685eba689 Update litegraph 0.8.99 (#2761) 2025-02-27 16:30:17 -05:00
bymyself
8775c1d930 Add video_upload to combo input schema (#2760) 2025-02-27 16:22:14 -05:00
Chenlei Hu
1dab413473 [Schema] Expose input options types (#2757) 2025-02-27 14:22:42 -05:00
Chenlei Hu
1d95d639e9 [Refactor] Extract nodeDefSchema from apiSchema (#2756) 2025-02-27 13:39:23 -05:00
bymyself
e380d792c7 Support models metadata in node properties (#2754) 2025-02-27 13:25:16 -05:00
bymyself
0910d485fd [Test] Fix flaky optional combo test (#2755) 2025-02-27 11:13:38 -07:00
Chenlei Hu
cdf42d5ad7 [Refactor] Move zod schemas to schemas/ folder (#2753) 2025-02-27 13:05:01 -05:00
Chenlei Hu
96f02dbf80 [Refactor] Use util.clone in mergeIfValid (#2752) 2025-02-27 11:47:56 -05:00
bymyself
f9157ee05f Update workflow schema to include node pack ID and version (#2751) 2025-02-27 11:15:31 -05:00
Terry Jia
cb6f2e4398 [3d] fix preview camera not sync up issue (#2747) 2025-02-27 08:42:07 -05:00
bymyself
71f3f720bf Lower floor on max history items setting (#2748) 2025-02-27 08:41:50 -05:00
Chenlei Hu
d1fead298f [Revert] Restrict applyToGraph to PrimitiveNode (#2746) 2025-02-26 22:29:13 -05:00
Chenlei Hu
0bc66965f0 [Cleanup] Remove LiteGraph global type declarations (#2745) 2025-02-26 21:50:41 -05:00
Terry Jia
e843f53799 [3d] temp fix preview camera not sync up (#2743) 2025-02-26 21:39:19 -05:00
Chenlei Hu
0259befcdd 1.11.4 (#2744) 2025-02-26 20:20:53 -05:00
Chenlei Hu
3662938080 Update litegraph 0.8.98 (#2742) 2025-02-26 20:10:10 -05:00
Chenlei Hu
ab9c65f28b Type widgetInputs (#2741) 2025-02-26 18:01:56 -05:00
Chenlei Hu
bdfa2efa50 [BugFix] Remove outputs.animated in queueStore (#2740) 2025-02-26 16:04:01 -05:00
Silver
1c408d2f6a replace colorSelect.png cursor (#2738) 2025-02-26 14:13:50 -05:00
bymyself
76818b54e6 Fix widget label extraction (#2737) 2025-02-26 13:44:05 -05:00
Chenlei Hu
2d41aed051 [BugFix] Properly update color button color on first selection (#2736) 2025-02-26 13:43:09 -05:00
bymyself
237b895e8b Add thumbnails for workflow templates (#2729)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-26 10:39:27 -05:00
bymyself
e2087d2a7b Add node to default/tutorial workflow with link to getting started page of docs (#2734) 2025-02-26 10:35:40 -05:00
bymyself
74e8852958 Fix combo values from optional inputs not changed when refreshing (#2733) 2025-02-26 10:35:22 -05:00
Chenlei Hu
3c196f8f97 1.11.3 (#2731) 2025-02-25 21:40:17 -05:00
Chenlei Hu
6dbdde6491 Update litegraph 0.8.97 (#2730) 2025-02-25 21:40:07 -05:00
Chenlei Hu
a784abef0d Type INodeOutputSlot widget hack on PrimitiveNode (#2728) 2025-02-25 19:34:23 -05:00
filtered
c20ea0c523 [TS] Add null check in graph to prompt (#2727) 2025-02-25 13:39:46 -05:00
filtered
101e8dea11 [TS] Update type to match strict Litegraph (#2726) 2025-02-26 04:00:55 +11:00
Chenlei Hu
156013aa24 [Reland] Restrict applyToGraph to PrimitiveNode (#2724) 2025-02-25 10:54:21 -05:00
Comfy Org PR Bot
1a7145fbc9 Update locales for node definitions (#2723)
Co-authored-by: huchenlei <20929282+huchenlei@users.noreply.github.com>
2025-02-25 10:24:09 -05:00
Terry Jia
956b9609fd [3d] disable depth mode (#2720) 2025-02-25 10:05:10 -05:00
filtered
51c16a4f56 [TS] Add null check in paste handler (#2722) 2025-02-25 22:45:37 +11:00
filtered
417a089186 [Refactor] Use more explicit types in usePaste (#2721) 2025-02-25 21:52:47 +11:00
Chenlei Hu
f5cec41130 [i18n] Translate button widget labels (#2719)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-24 20:31:14 -05:00
Chenlei Hu
d3dda14267 Update litegraph 0.8.95 (#2718) 2025-02-24 19:48:44 -05:00
Chenlei Hu
3a63b9eb56 1.11.2 (#2717) 2025-02-24 18:41:10 -05:00
bymyself
aabd409bf7 Add copy paste audio files onto LoadAudio nodes or canvas (#2716) 2025-02-24 16:37:03 -05:00
Terry Jia
7f98342492 [3d] some general improvement (#2714) 2025-02-24 14:57:36 -05:00
Chenlei Hu
1a9d6aca7d [nit] Fix import path (#2715) 2025-02-24 14:57:20 -05:00
bymyself
15785fea68 Add drag and drop audio files onto LoadAudio nodes (#2710)
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-02-24 14:05:44 -05:00
bymyself
d340e634a8 [Refactor] Move node composables to subfolder (#2712) 2025-02-24 14:04:16 -05:00
bymyself
9cb993cd3d [CodeHealth] Remove unused var (#2713) 2025-02-24 14:03:52 -05:00
Chenlei Hu
2ac67f2dd0 Add tooltip show-delay in action bar (#2709) 2025-02-24 11:22:26 -05:00
Chenlei Hu
96ba2b4564 Allow quitting instant queue mode with the stop button (#2708) 2025-02-24 11:20:34 -05:00
bymyself
05bd64820d Fix node videos when preview format setting is set (#2706) 2025-02-24 10:49:45 -05:00
bymyself
a35071fcb2 Add previewMediaType flag for simpler node preview rendering (#2694)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-24 10:48:55 -05:00
bymyself
37d4cc974b Cleanup node's file input elements on node removal (#2703)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-24 10:45:27 -05:00
bymyself
81102604f5 Type addDOMWidget (#2705) 2025-02-24 10:32:43 -05:00
filtered
97f9d654b6 [TS] Fix nullability (#2702)
`LGraphCanvas.graph` may explicity set to null by litegraph.
2025-02-24 22:00:19 +11:00
Terry Jia
822a8e02f8 [3d] add missing i18n (#2700)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-23 23:50:13 -05:00
Chenlei Hu
eb951c9cf9 Show image size (W x H) on image nodes (#2699) 2025-02-23 19:52:58 -05:00
Chenlei Hu
e98fda31ba 1.11.1 (#2698) 2025-02-23 18:48:47 -05:00
Chenlei Hu
78e4537fc2 Update litegraph 0.8.94 (#2697) 2025-02-23 18:47:45 -05:00
filtered
436b952c59 [Refactor] Simplify & document graphToPrompt (#2696) 2025-02-23 16:18:06 -05:00
bymyself
2ed3e59135 Type widget.options.serialize (#2692)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-23 13:14:20 -05:00
bymyself
c7ac0b8325 [Tests] Update test expectations (#2693)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-23 12:57:25 -05:00
bymyself
e7420fe2e3 Translate runtime-generated widget labels (#2688) 2025-02-23 10:16:25 -05:00
Terry Jia
d033640927 [3d] redesign UI (#2686)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-02-23 10:14:52 -05:00
bymyself
6f3b99209e Don't serialize file upload and video preview widgets (#2689) 2025-02-23 10:12:45 -05:00
bymyself
f7ee6861f1 Translate control before/after generate labels (#2690)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-23 10:09:06 -05:00
Chenlei Hu
8dcf7eca74 1.11.0 (#2685) 2025-02-22 19:22:19 -05:00
bymyself
f94831d054 Add node video previews (#2635) 2025-02-22 18:37:42 -05:00
Terry Jia
c502b86c31 [3d] refactor load3d nodes (#2683)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-22 18:36:47 -05:00
Chenlei Hu
86b65d481a 1.10.10 (#2679) 2025-02-21 23:30:06 -05:00
Chenlei Hu
064e982f01 Revert "[Refactor] Extract RerouteNode as a separate file" (#2678) 2025-02-21 22:57:19 -05:00
Chenlei Hu
f43eac7c71 Revert "Restrict applyToGraph to PrimitiveNode" (#2677) 2025-02-21 22:56:51 -05:00
bymyself
d7c9a43aba [Docs] Add id to details tag in README.md (#2676) 2025-02-21 22:36:55 -05:00
Chenlei Hu
dee3f5824a 1.10.9 (#2673) 2025-02-21 20:19:29 -05:00
Chenlei Hu
9b88909caa [Extension] Selection toolbox API (#2672) 2025-02-21 19:25:30 -05:00
Chenlei Hu
3fa512957c [CI] Enable release on LTS branches (#2671) 2025-02-21 16:36:17 -05:00
Chenlei Hu
b012f243b3 Only show delete in selection toolbox for reroute (#2670) 2025-02-21 16:03:36 -05:00
Chenlei Hu
6cb33d9431 Restrict applyToGraph to PrimitiveNode (#2669) 2025-02-21 15:53:33 -05:00
Chenlei Hu
85d04f6814 [Refactor] Extract RerouteNode as a separate file (#2668) 2025-02-21 15:04:47 -05:00
Chenlei Hu
40da43861e [Refactor] Move Widget.beforeQueued invocation from graphToPrompt to queuePrompt (#2667) 2025-02-21 14:18:11 -05:00
Chenlei Hu
40deb19634 [Cleanup] Remove upstreamed litegraph types (#2666) 2025-02-21 13:39:13 -05:00
Chenlei Hu
abfc7481d3 Remove 'clean' param from graphToPrompt (#2665) 2025-02-21 12:01:26 -05:00
Chenlei Hu
ec94811637 [Refactor] Move app.graphToPrompt to executionUtil (#2664) 2025-02-21 11:41:25 -05:00
Chenlei Hu
cea5a4a3dd Update litegraph 0.8.92 (#2662) 2025-02-21 09:28:43 -05:00
Chenlei Hu
0937c1f2cd 1.10.8 (#2659) 2025-02-20 20:14:32 -05:00
Chenlei Hu
8074d797b0 [BugFix] Fix incorrect selection overlay after drag (#2658) 2025-02-20 20:12:42 -05:00
Terry Jia
c3c6ec627b [3d] support using image as background (#2657)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-20 20:05:54 -05:00
Chenlei Hu
02d77002c9 Update litegraph to 0.8.91 (#2654)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-20 14:43:51 -05:00
Chenlei Hu
3e31045fbb [BugFix] Properly trigger onClose hook in dialogService (#2655) 2025-02-20 14:42:52 -05:00
Chenlei Hu
78146c86f4 [BugFix] Copy LGraphCanvas.ds on serialization (#2653) 2025-02-20 10:25:17 -05:00
bymyself
365fd1e047 Fix error translating legacy setting options (#2648) 2025-02-20 10:12:46 -05:00
filtered
fbb6c2f825 Update issue report image (#2647) 2025-02-20 16:29:21 +11:00
bymyself
9c7d86ee49 Update issue report template (#2645) 2025-02-19 22:46:22 -05:00
filtered
bc43cf0290 [CI] Always test LTS branches (#2641)
- Adds core/* and desktop/* to CI testing worfklows
2025-02-20 13:51:17 +11:00
Chenlei Hu
45c59f9e84 1.10.7 (#2639) 2025-02-19 17:45:05 -05:00
Terry Jia
014a65411e [3d] flash preview screen border if reach out limitation (#2638) 2025-02-19 15:49:36 -05:00
Chenlei Hu
6c6d86a30b Selection toolbox color picker button (#2637)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-19 15:25:46 -05:00
filtered
08a6867c00 [Desktop] Offer Troubleshoot page instead of Reinstall on start error (#2623)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-19 10:30:23 -05:00
filtered
dbbe67dfcd [Desktop] Fix missing git logo in troubleshooting (#2633) 2025-02-19 10:29:48 -05:00
bymyself
40fa1d37bc Fix pasting image that was copied from browser (#2630) 2025-02-19 10:27:58 -05:00
filtered
0d6bc669f5 [Desktop] Fix invalid type assertion in API (#2631) 2025-02-19 21:59:17 +11:00
Chenlei Hu
e4444d4074 1.10.6 (#2628) 2025-02-18 20:33:58 -05:00
Chenlei Hu
cbf5dff633 Update litegraph 0.8.87 (#2625)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-18 20:25:17 -05:00
Chenlei Hu
9de8450deb Update test expectations (#2627)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-18 20:25:06 -05:00
Chenlei Hu
3b0e3d635b [BugFix] Fix node color for custom light themes (#2621)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-18 19:08:34 -05:00
Chenlei Hu
d1a682bc01 [Refactor] Extract color selector as component (#2620) 2025-02-18 15:28:17 -05:00
Terry Jia
01ffc9e4eb [3d] allow using mouse wheel to adjust preview screen size (#2619) 2025-02-18 14:59:43 -05:00
Chenlei Hu
54e42178f7 1.10.5 (#2617) 2025-02-18 12:26:27 -05:00
Chenlei Hu
25e5ab3a36 Add bypass action to selection toolbox (#2616) 2025-02-18 12:25:49 -05:00
Chenlei Hu
28dd6a2702 Update litegraph 0.8.85 (#2615) 2025-02-18 11:51:36 -05:00
bymyself
3b3df250cd Add refresh button to selecton toolbox (#2612) 2025-02-18 11:39:43 -05:00
bymyself
6441a86619 [Style] Update toolbox style (#2614) 2025-02-18 11:34:06 -05:00
Chenlei Hu
79db202925 [New Feature] Selection Toolbox (#2608)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-17 19:07:49 -05:00
Chenlei Hu
f7556e0015 Add DeleteSelectedItems command (#2606) 2025-02-17 17:16:12 -05:00
bymyself
141e64354c Support batch image upload (#2597) 2025-02-17 13:56:21 -05:00
bymyself
79452ce267 Fix extraneous values in template workflows (#2605) 2025-02-17 13:55:29 -05:00
Chenlei Hu
4d8a5eacba 1.10.4 (#2604) 2025-02-17 10:13:43 -05:00
bymyself
8f5a9a50aa Remove duplicate outpaint template (#2602)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-02-17 10:12:09 -05:00
Margen67
7bc48c5074 Formatting/cleanup (#2594) 2025-02-17 10:10:00 -05:00
Dr.Lt.Data
e04ea07774 refine locales/ko (#2600) 2025-02-17 10:09:09 -05:00
bymyself
75af956279 Fix gallery navigator icons (#2601) 2025-02-17 10:08:46 -05:00
bymyself
434a2307a2 Remove lora dependency from flux canny template (#2603) 2025-02-17 10:08:16 -05:00
filtered
336b3caf9a [Desktop] Update uv cache clear task to show terminal (#2598) 2025-02-17 23:33:34 +11:00
filtered
c757fbaeb4 [Test] Fix unnecessary circular reference (#2596) 2025-02-17 20:18:26 +11:00
Chenlei Hu
fd27b3d580 Fix title editor font size (#2593) 2025-02-16 21:48:02 -05:00
Chenlei Hu
0658698a13 Selection Overlay (#2592) 2025-02-16 21:23:07 -05:00
Terry Jia
b2375a150c [3d] fully convert load 3d nodes into vue (#2590) 2025-02-16 20:15:49 -05:00
Chenlei Hu
9ebb5b2a0c 1.10.3 (#2591) 2025-02-16 20:14:50 -05:00
Chenlei Hu
d6a5deccd8 [Refactor] useAbsolutePosition composable (#2589) 2025-02-16 15:39:58 -05:00
Chenlei Hu
3f4d11c63a Inplace widget to input conversion (#2588)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-16 13:41:32 -05:00
Margen67
44498739fc Update setup-node to v4 (#2587) 2025-02-16 13:14:01 -05:00
dependabot[bot]
764ec9f7d0 Bump vite from 5.4.6 to 5.4.14 (#2585)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-16 11:23:17 -05:00
bymyself
e3234aa0aa Normalize translation keys in template card component (#2574)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-16 10:17:49 -05:00
bymyself
df11c99393 Refactor node image upload and preview (#2580)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-16 10:09:02 -05:00
Chenlei Hu
317ea8b932 1.10.2 (#2583) 2025-02-16 09:49:25 -05:00
bymyself
108884a304 Replace "clip" with "text_encoders" in template workflows (#2572) 2025-02-16 09:39:10 -05:00
bymyself
9f1992ca59 Change title of pose ControlNet template workflow (#2573) 2025-02-16 09:38:18 -05:00
bymyself
39f245fd97 Remove interchangeable models from template workflows (#2575) 2025-02-16 09:36:34 -05:00
bymyself
2d2fa5bfe9 Fix incorrect link in template workflow (#2579) 2025-02-16 09:35:54 -05:00
Terry Jia
bfb1b80cd7 [3d] bug fix for unable click vue button (#2581) 2025-02-16 09:35:20 -05:00
bymyself
0c8bfb4650 Add stable zero model url to whitelist (#2577) 2025-02-16 08:42:50 -05:00
bymyself
f69180cd84 Move node field to tags in error report (#2570)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-15 21:50:54 -05:00
Chenlei Hu
2ac177caeb 1.10.1 (#2569) 2025-02-15 19:34:13 -05:00
bymyself
77d3e0c45e Add ComfyUI Examples workflows to in-app templates (#2541)
Co-authored-by: jojodecayz <121620462+jojodecayz@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
2025-02-15 16:15:56 -05:00
Chenlei Hu
00dceb880a Update litegraph 0.8.81 (#2568) 2025-02-15 15:06:21 -05:00
Chenlei Hu
acea173ba0 [BugFix] Set height to 0 for hidden widgets on GroupNode (#2566) 2025-02-15 12:24:38 -05:00
Chenlei Hu
bcedd5f4ed [Style] Show right arrow on nested submenu item (#2564) 2025-02-15 11:18:46 -05:00
Chenlei Hu
168ea05f81 [Style] Highlight active workflow item in the workflow sidebar (#2563) 2025-02-15 11:01:47 -05:00
Chenlei Hu
370ad7a4f9 1.10.0 (#2562) 2025-02-15 09:59:56 -05:00
Hiroaki Ogasawara
b9cfa70dcd chore: Add type augmentations for litegraph and enable copying of DTS (#2560) 2025-02-15 09:57:27 -05:00
Chenlei Hu
c15201bfe2 [Cleanup] Remove unused imports in domWidget (#2559) 2025-02-14 22:09:27 -05:00
Chenlei Hu
0e2ce5e1ca Upstream widgets layout to litegraph (#2557) 2025-02-14 19:40:31 -05:00
Chenlei Hu
5dc4a1b9cd Update litegraph 0.8.79 (#2556)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-14 14:42:53 -05:00
Chenlei Hu
acfb95f8d4 Use LGraphNode.setSize (#2555) 2025-02-14 11:02:56 -05:00
Chenlei Hu
f2065777b5 1.9.17 (#2553) 2025-02-14 09:58:19 -05:00
Yuki Shindo
b8b1e58172 [keybinding-panel] Include label in filter fields for multilingual search (#2549) 2025-02-14 09:48:44 -05:00
bymyself
2e86393378 Add null checks to widget constructor options (#2552) 2025-02-14 09:48:07 -05:00
bymyself
530ca75dd0 Fix remote widget undefined arg (#2551) 2025-02-14 09:47:18 -05:00
Chenlei Hu
f9c2db5908 Type LGraphNode.addDOMWidget (#2548) 2025-02-13 15:15:21 -05:00
Chenlei Hu
166ad432f3 [Refactor] Generalize dom widget layout as Widget.computeLayoutSize hook (#2547) 2025-02-13 14:30:46 -05:00
Chenlei Hu
174754e646 [Refactor] Extract widget layout logic (#2545) 2025-02-13 11:43:40 -05:00
Chenlei Hu
43dd457bf5 1.9.16 (#2546) 2025-02-13 11:03:16 -05:00
Yuki Shindo
625aa9bd11 Improve Japanese Text for Enhanced Readability (#2542) 2025-02-12 20:58:05 -05:00
Chenlei Hu
f791322ddb Revert "[Cleanup] Remove unused hooks on DOMWidget" (#2543) 2025-02-12 20:57:38 -05:00
Chenlei Hu
89812ce7d0 [Cleanup] Remove unused hooks on DOMWidget (#2540) 2025-02-12 19:41:06 -05:00
Chenlei Hu
c7aaa2a45d Type Widget.computedHeight (#2539) 2025-02-12 16:50:30 -05:00
Chenlei Hu
8bb785c5e4 Show convert to widget option slot context menu (#2538) 2025-02-12 16:07:19 -05:00
Chenlei Hu
a861a070d0 Remove horizontal layout of reroute node (#2532) 2025-02-12 14:43:34 -05:00
Chenlei Hu
108e37deca 1.9.15 (#2535) 2025-02-12 14:19:15 -05:00
Chenlei Hu
9082903956 [Style] Fix pointer events on graph canvas panel content (#2534) 2025-02-12 14:11:54 -05:00
Chenlei Hu
2cb9d4dd1c 1.9.14 (#2531) 2025-02-12 11:16:05 -05:00
bymyself
46f0733ae7 Ignore reserved keybindings when typing in text input (#2514)
Co-authored-by: filtered <176114999+webfiltered@users.noreply.github.com>
2025-02-12 11:15:19 -05:00
Chenlei Hu
150b4341b2 Update litegraph 0.8.77 (#2530) 2025-02-12 11:11:05 -05:00
bymyself
054f8f6838 Move install directory selection tooltip to not block buttons (#2527) 2025-02-12 10:02:56 -05:00
bymyself
9fd73873b6 [Desktop] Re-run path validation when re-focusing installation location input (#2528) 2025-02-12 10:02:42 -05:00
bymyself
bfec9b692b Add keybind hint to confirm close dialog (#2529)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-12 10:02:27 -05:00
Terry Jia
29cd693335 [3d] add tooltip (#2524)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-11 22:28:24 -05:00
Chenlei Hu
4f6891a5ad [Cleanup] Remove legacy settings dialog CSS (#2525) 2025-02-11 21:55:21 -05:00
Chenlei Hu
ca2aee296a [Cleanup] Remove unnecessary pointer-event-auto (#2523) 2025-02-11 21:41:47 -05:00
Chenlei Hu
9017513979 [Refactor] Manage comfyui-body elements with Vue (#2522)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-11 18:37:08 -05:00
Terry Jia
8cfe814daa [3d] refactor load3d (#2521) 2025-02-11 17:43:36 -05:00
Chenlei Hu
c901d5f659 1.9.13 (#2520) 2025-02-11 13:40:17 -05:00
Chenlei Hu
1263fbb4ad Enable ts-strict for scripts/widgets.ts (#2519) 2025-02-11 12:38:24 -05:00
Chenlei Hu
8db101c1cb [Type] Mark app as required arg for ComfyWidgetConstructor (#2518) 2025-02-11 11:39:23 -05:00
Chenlei Hu
efe7843469 [Refactor] useComboWidget composable (#2517) 2025-02-11 11:17:09 -05:00
Chenlei Hu
cfa46ebacb [Refactor] useBooleanWidget composable (#2516) 2025-02-11 11:05:58 -05:00
Chenlei Hu
ab305059bc [Refactor] useImageUploadWidget composable (#2515) 2025-02-11 10:50:55 -05:00
bymyself
cd8c0d2865 Add refresh button to remote (lazy) widgets (#2494) 2025-02-11 10:31:32 -05:00
bymyself
6a9d309818 Increase width of actionbar drag handle (#2511) 2025-02-11 10:29:26 -05:00
bymyself
e3f226e483 Fix actionbar has drag preview (#2512) 2025-02-11 10:28:56 -05:00
bymyself
8822edaf24 Improve settings dialog accessibility (#2513) 2025-02-11 10:28:41 -05:00
Chenlei Hu
44b9a477b1 [Refactor] useMarkdownWidget composable (#2510) 2025-02-11 00:12:29 -05:00
bymyself
e4f8d4b8d0 Add support for image_folder field in node image input spec (#2509) 2025-02-11 00:12:03 -05:00
Chenlei Hu
a93f57eeb2 [Refactor] useSeedWidget composable (#2508) 2025-02-10 23:55:59 -05:00
Chenlei Hu
0c2879b6f4 [Refactor] useIntWidget composable (#2507) 2025-02-10 23:07:57 -05:00
Chenlei Hu
d8d46f8cf6 1.9.12 (#2506) 2025-02-10 22:17:12 -05:00
Chenlei Hu
1a06c91ed1 [BugFix] Workaround custom nodes expectation on DOMWidget.value (#2505) 2025-02-10 22:06:20 -05:00
Chenlei Hu
d4122a7510 [Refactor] useFloatWidget composable (#2504) 2025-02-10 22:06:11 -05:00
Chenlei Hu
b4c59ffae1 [Refactor] useStringWidget composable (#2503) 2025-02-10 19:49:00 -05:00
Chenlei Hu
46428cbf7d [Cleanup] Rename remoteWidgetHook (#2500) 2025-02-10 18:12:15 -05:00
filtered
2d759aa9e3 Fix element style override CSS in #2499 (#2501) 2025-02-10 18:11:32 -05:00
Chenlei Hu
08e613e468 Enable ts-strict for scripts/domWidgets (#2499) 2025-02-10 17:20:30 -05:00
Chenlei Hu
8052b2a02a Type LGraphNode.getInnerNodes (#2498) 2025-02-10 16:35:26 -05:00
Chenlei Hu
0479b112c1 1.9.11 (#2497) 2025-02-10 15:31:17 -05:00
Chenlei Hu
d7a0ee8703 Update litegraph 0.8.76 (#2496)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-10 15:30:46 -05:00
Chenlei Hu
9051ab8d7a Type domWidget computeSize (#2495) 2025-02-10 12:58:40 -05:00
Terry Jia
aaca5191ab Light fov UI change (#2492) 2025-02-10 11:23:33 -05:00
Chenlei Hu
9707a30d0e 1.9.10 (#2491) 2025-02-09 23:39:57 -05:00
Chenlei Hu
e100041db4 Update litegraph 0.8.75 (#2490) 2025-02-09 23:39:27 -05:00
Chenlei Hu
21718d9da2 1.9.9 (#2486) 2025-02-09 20:50:47 -05:00
Chenlei Hu
2b4c594b21 Update litegraph 0.8.74 (#2485) 2025-02-09 20:26:58 -05:00
Chenlei Hu
00abd885c9 [Refactor] ES6 DOMWidget class (#2482) 2025-02-09 20:20:51 -05:00
bymyself
550a9d04c5 Fix color and slider settings types to inherit attrs (#2483) 2025-02-09 20:18:09 -05:00
bymyself
eeb1c34ada Update public API syntax of remote (lazy) widgets (#2477)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-09 12:41:14 -05:00
Terry Jia
83cc49a42b [3d] use vue to rewrite the UI for load3d (#2467) 2025-02-09 12:05:42 -05:00
Chenlei Hu
91a3d1228e Reference specific ComfyUI_devtools in CI (#2479) 2025-02-09 12:00:26 -05:00
Chenlei Hu
3d59d478b6 [Desktop] Fix torch mirror setting (#2475) 2025-02-08 21:08:23 -05:00
Chenlei Hu
4dd292252e 1.9.8 (#2474) 2025-02-08 18:31:16 -05:00
Chenlei Hu
0d307ff587 Update litegraph 0.8.73 (#2472) 2025-02-08 17:58:39 -05:00
Chenlei Hu
88a969df07 Update litegraph 0.8.72 (#2470) 2025-02-08 17:51:37 -05:00
Dr.Lt.Data
9e37738dc8 refine locales/ko (#2469) 2025-02-08 17:31:26 -05:00
Chenlei Hu
9b97abad57 1.9.7 (#2466) 2025-02-08 12:11:24 -05:00
Chenlei Hu
67fcb4fed4 Update litegraph 0.8.71 (#2465) 2025-02-08 12:10:44 -05:00
bymyself
a914456827 Add support for new COMBO input spec and lazy/remote COMBO widgets (#2422) 2025-02-07 15:35:42 -05:00
Chenlei Hu
340513e27f Type INodeSlot.widget (#2463) 2025-02-07 14:33:21 -05:00
bymyself
117c8be3a0 Use fp16 safetensors model in default/fallback workflow (#2433)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-06 19:47:14 -05:00
Chenlei Hu
68f6d51ad2 [i18n] Translate clipboard toast messages (#2462)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-06 15:34:15 -05:00
Chenlei Hu
2da23fd373 [Refactor] Extract litegraph settings sync to a composable (#2461) 2025-02-06 15:21:11 -05:00
Chenlei Hu
7ddcac88d7 [Refactor] Upstream drag zoom feature to litegraph (#2459) 2025-02-06 14:54:36 -05:00
Chenlei Hu
40a817bb0f 1.9.6 (#2460) 2025-02-06 14:48:57 -05:00
filtered
774ed4178f [Cleanup] Fix file and variable names to match usage (#2458) 2025-02-06 14:48:24 -05:00
filtered
78e4161c51 [Refactor] Terminal output drawer shared component (#2457) 2025-02-06 14:33:12 -05:00
filtered
dda9a72966 [Desktop] Add desktop updating page (#2454)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-06 14:23:51 -05:00
Chenlei Hu
d7673af8f5 [Refactor] Move resetView to litegraphService (#2456) 2025-02-06 14:22:40 -05:00
Chenlei Hu
2b18949615 [Cleanup] Remove duplicated group header drawing logic (#2453) 2025-02-06 13:52:05 -05:00
Chenlei Hu
629ac63f06 Type LGraphNode.pasteFile (#2455) 2025-02-06 13:50:48 -05:00
Chenlei Hu
1061620783 [Refactor] Move paste handling to usePaste composable (#2452) 2025-02-06 13:37:37 -05:00
Chenlei Hu
af7a6601e0 [Refactor] Move copy handling to useCopy composable (#2451) 2025-02-06 13:22:48 -05:00
Chenlei Hu
0e0c4b1302 [Refactor] Move isImageNode to litegraphUtil (#2450) 2025-02-06 13:15:17 -05:00
Chenlei Hu
fb170c9ee9 1.9.5 (#2448) 2025-02-06 10:49:37 -05:00
Chenlei Hu
7ef304b381 Fix litegraph copy in Chrome 133 (#2446) 2025-02-06 10:18:28 -05:00
Chenlei Hu
50833341bb 1.9.4 (#2444) 2025-02-05 22:25:19 -05:00
kvick-games
f5c5a95bdc Refresh Preview3D node with node.onMouseEnter (#2439) 2025-02-05 21:26:45 -05:00
Chenlei Hu
b700cc1824 [Documentation] Add src/scripts/README.md (#2442) 2025-02-05 18:32:44 -05:00
Chenlei Hu
a6031ec2be [Cleanup] Rename usePragmaticDroppable to usePragmaticDragAndDrop (#2441) 2025-02-05 17:46:28 -05:00
Chenlei Hu
a4d99d9d28 Support insert workflow by dragging from workflow sidebar to canvas (#2440) 2025-02-05 17:09:01 -05:00
Chenlei Hu
5a7465a907 Add node drag preview for bookmarked nodes (#2438) 2025-02-05 16:25:56 -05:00
Chenlei Hu
6525ae7cf4 [Refactor] Rename hooks/ to composables/ (#2437) 2025-02-05 15:05:56 -05:00
Chenlei Hu
c6ef107111 [Style] Fix shrinking of extension added topmenu items (#2436) 2025-02-05 13:40:14 -05:00
bymyself
3fbccd20ff Use fp16 model in default img2img template workflow (#2430) 2025-02-05 13:27:16 -05:00
Chenlei Hu
fa0682d66e 1.9.3 (#2434) 2025-02-05 13:26:56 -05:00
Chenlei Hu
f7b613c6cb 1.9.2 (#2429)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-05 12:20:20 -05:00
Chenlei Hu
292af3fe3f [Refactor] Replace explicit 'node' param with 'this' for TreeExplorer (#2427) 2025-02-05 12:20:08 -05:00
KarryCharon
2c12df12ab [i18n] Impl i18n context menu translation (#2425)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-02-05 12:07:40 -05:00
Chenlei Hu
d0e99beaa7 Swap eslint/prettier trigger order in pre-commit (#2428) 2025-02-05 12:04:20 -05:00
Chenlei Hu
6b64b74f6c [Desktop] Use fallback mirrors for China users (#2424) 2025-02-05 10:51:32 -05:00
Chenlei Hu
0af4768dd2 Update litegraph 0.8.67 (#2423) 2025-02-04 19:31:09 -05:00
Chenlei Hu
5f850ddaa4 [BrowserTest] Add test on boolean widget (#2421)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-04 17:28:32 -05:00
dependabot[bot]
9fb3235df4 Bump vitest from 2.0.5 to 2.1.9 (#2420)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-04 17:11:56 -05:00
Chenlei Hu
628facaa75 1.9.1 (#2416) 2025-02-03 20:55:06 -05:00
Chenlei Hu
eb5a4b65ab Update litegraph 0.8.66 (#2415) 2025-02-03 20:30:01 -05:00
Chenlei Hu
98c197e8b1 Add LiteGraph.Canvas.LowQualityRenderingZoomThreshold setting (#2412)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-03 20:28:07 -05:00
Chenlei Hu
90914a40ba Use canvas.low_quality flag for DOMWidget show/hide (#2413) 2025-02-03 20:23:07 -05:00
Chenlei Hu
821816955f Update litegraph 0.8.65 (#2411) 2025-02-03 17:38:29 -05:00
Chenlei Hu
b4121008cd Fix NoteNode constructor fields (#2410) 2025-02-03 14:20:39 -05:00
Chenlei Hu
3730c2b36f [Refactor] Use litegraph.strokeShape (#2406) 2025-02-02 23:15:09 -05:00
bymyself
77be5ac514 [BrowserTest] Add test on groupnode with duplicate hidden inputs (#2403) 2025-02-02 21:03:08 -05:00
bymyself
83759b9a4a Use command label as header text in change keybinding dialog (#2404) 2025-02-02 21:02:48 -05:00
Chenlei Hu
b8f187713e 1.9.0 (#2401) 2025-02-02 17:35:04 -05:00
filtered
b8088ad782 Revert "Correct node/output titles when grouping nodes (#2359) (#2370)" (#2399)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-02 17:23:55 -05:00
bymyself
a37671b154 Add bottom panel to extension manager (#2393) 2025-02-02 15:01:42 -05:00
filtered
57bc7ad312 Add node tooltip delay setting (#2396)
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-02-02 14:31:34 -05:00
filtered
5f59fbdead [Desktop] Persist troubleshooting terminal when hidden (#2398)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-02 14:29:47 -05:00
filtered
4eed9c7e53 [Accessibility] Use keybindings to add keybindings (#2384) 2025-01-31 09:46:23 -08:00
bymyself
ee6197785a Fix typo in coreSettings.ts (#2391)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-31 07:50:16 -08:00
Chenlei Hu
f5d6ad07e8 1.8.12 (#2390) 2025-01-30 15:51:53 -08:00
Chenlei Hu
45207dabbc Type LGraphNode.onDragOver/onDragDrop (#2389) 2025-01-30 15:50:04 -08:00
bymyself
4699360147 Show bookmark buttons when item is focused (#2386) 2025-01-30 14:45:04 -08:00
Chenlei Hu
8ef3b87e59 Generate drag preview for node library nodes (#2387) 2025-01-30 11:11:22 -08:00
Dr.Lt.Data
d3a6baf8cd refine locales/ko (#2385) 2025-01-30 09:55:40 -08:00
jojodecayz
b4d679d31f Update Python fallback mirror in uvMirrors.ts (#2382) 2025-01-29 20:06:45 -08:00
Chenlei Hu
7afc1baf7d [Refactor] Extract litegraph canvas drop target logic as composable (#2381) 2025-01-29 17:15:01 -08:00
Chenlei Hu
7bdad335ca [Refactor] Extract global window litegraph as a composable (#2380) 2025-01-29 16:53:26 -08:00
Chenlei Hu
94065b6c21 [Style] Show sidebar tool buttons when sidebar is focused (#2379) 2025-01-29 16:29:59 -08:00
Chenlei Hu
a205a5cca5 [Style] Only show sidebar tool buttons when sidebar hovered (#2378) 2025-01-29 16:16:10 -08:00
Chenlei Hu
788d6cf514 1.8.11 (#2377) 2025-01-29 15:00:32 -08:00
Chenlei Hu
766710cf37 [Desktop] Fix mirror validation in settings dialog (#2375) 2025-01-29 14:57:36 -08:00
Chenlei Hu
e019277ba0 [Style] Use consistent color for workflow sidebar tab tool buttons (#2376) 2025-01-29 14:57:19 -08:00
Chenlei Hu
97e5c9c6d2 1.8.10 (#2374) 2025-01-29 14:09:55 -08:00
Chenlei Hu
52e42b5339 Fix 404 PythonInstallMirror url suffix (#2373) 2025-01-29 13:01:54 -08:00
Chenlei Hu
c42cdf5cd9 1.8.9 (#2372) 2025-01-29 11:15:00 -08:00
Chenlei Hu
c07ec659a7 Fix mirror item key not being unique (#2371) 2025-01-29 11:13:04 -08:00
Chenlei Hu
cbcbeab9d9 Correct node/output titles when grouping nodes (#2359) (#2370)
Co-authored-by: Anastasiy Safari <anastasiuspernat@gmail.com>
Co-authored-by: github-actions <github-actions@github.com>
2025-01-29 11:05:48 -08:00
Dr.Lt.Data
bf9d2affb4 refine locales/ko (#2368) 2025-01-29 10:46:57 -08:00
Chenlei Hu
2c8c8718e9 [Desktop] Apply default pypi mirror when installing CPU torch (#2367) 2025-01-28 18:00:08 -08:00
Chenlei Hu
475e38ddb4 [CI] Skip draft in github release action (#2366) 2025-01-28 15:28:41 -08:00
Chenlei Hu
430f051c64 Add UV mirrors settings (#2333)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-28 14:39:51 -08:00
filtered
29b5f606b0 [CI] Auto-generate release notes in GH action (#2364) 2025-01-27 17:10:34 -08:00
Terry Jia
55d63a8aef [3d] move change background color button (#2365) 2025-01-27 17:06:01 -08:00
filtered
99009a18f7 1.8.8 (#2363) 2025-01-27 22:58:11 +11:00
filtered
e3ab0e4d68 Add option to disable combo box zoom-in scaling (#2362)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-27 22:56:40 +11:00
filtered
0e1ae41c0c Update litegraph 0.8.62 (#2360) 2025-01-27 22:32:24 +11:00
filtered
f12d4a2d6f [Test] Update test expectations for 2357 (#2361) 2025-01-27 22:09:25 +11:00
bymyself
7bd8527bca Add cursor drop effect when dragging nodes/models onto graph (#2354) 2025-01-26 07:08:10 -05:00
bymyself
cb356d50b8 Set Node ID badges to hidden by default (#2356) 2025-01-26 07:07:05 -05:00
filtered
d2e9943e79 Add convert to input for the clicked widget (#2357)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-26 07:06:41 -05:00
Chenlei Hu
27e4bd2592 [Refactor] Use computed states for maintenance/StatusTag (#2352) 2025-01-25 20:56:05 -05:00
Chenlei Hu
82e0c3a8b6 1.8.7 (#2351) 2025-01-25 20:12:21 -05:00
Chenlei Hu
2852720b2c [Refactor] Extract workflow/workflow tabs restore into a composable (#2350) 2025-01-25 16:58:50 -05:00
Chenlei Hu
38b8a68e50 [Refactor] Move workflow restore from app to GraphCanvas (#2349) 2025-01-25 15:36:50 -05:00
Chenlei Hu
44321e4692 [DevExperience] Add default VSCode launch.json (#2348) 2025-01-25 12:53:36 -05:00
bymyself
e992bd6571 Add tutorial workflow function for new desktop users (#2315)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-25 12:23:27 -05:00
bymyself
e971ba31e0 Add "Don't show this again" checkbox to missing models dialog (#2344)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-25 11:42:01 -05:00
Terry Jia
28b163cdd5 [3d] animation node UI change (#2347) 2025-01-25 11:41:05 -05:00
bymyself
652125de1f Use v1-5-pruned-emaonly-fp16 model in default template workflow (#2346) 2025-01-25 11:40:39 -05:00
bymyself
c5d153cf16 Enable missing models dialog by default (#2345) 2025-01-25 11:40:18 -05:00
Chenlei Hu
9459f599b6 1.8.6 (#2343) 2025-01-24 22:41:38 -05:00
Terry Jia
326839db88 [3d] add preview 3d animation node (#2341) 2025-01-24 22:35:28 -05:00
Chenlei Hu
30fdc70218 Click url input status icon to trigger validation (#2339) 2025-01-24 14:15:54 -05:00
bymyself
9c42c31968 Fix missing models dialog (#2336) 2025-01-24 10:37:19 -05:00
Chenlei Hu
44aa1bf8c3 1.8.5 (#2335) 2025-01-23 22:06:57 -05:00
Chenlei Hu
caad27e28d Validate on mount for UrlInput (#2332) 2025-01-23 15:09:00 -05:00
Chenlei Hu
e8136ff0ae UrlInput emits update:modelValue only on blur (#2331) 2025-01-23 14:55:12 -05:00
Chenlei Hu
157475cb2e Add validateUrlFn props on UrlInput component (#2330) 2025-01-23 14:44:06 -05:00
Chenlei Hu
93dc50a95a Allow passthrough attrs on UrlInput (#2329) 2025-01-23 14:29:38 -05:00
Terry Jia
3f787e2dbf [3d] improve storing Camera State logic (#2328) 2025-01-23 14:26:13 -05:00
Terry Jia
b54e270b10 [3d] refactor code (#2326) 2025-01-23 11:26:27 -05:00
Chenlei Hu
0ab1d974c0 Add url setting type (#2327) 2025-01-23 11:25:06 -05:00
bymyself
95ff01a67b Fix form validation message appearing unnecessarily (#2324) 2025-01-23 09:25:36 -05:00
filtered
6f05ce6cc2 [Desktop] Add restart app instruction to git fix task (#2322) 2025-01-23 09:25:04 -05:00
bymyself
b8bef57522 Clean tags in issue reports (#2323) 2025-01-23 09:23:07 -05:00
bymyself
46500bf3dd Fix translation id in folder customization dialog (#2320) 2025-01-22 20:44:02 -05:00
Chenlei Hu
1bcc00cd33 [i18n] Load custom nodes locales from ComfyUI server (#2314) 2025-01-22 17:37:02 -05:00
Chenlei Hu
08d2322817 1.8.4 (#2319) 2025-01-22 15:37:07 -05:00
filtered
8cfc1c4682 [Desktop] Remove beforeunload handler - unusable in electron (#2318) 2025-01-22 15:35:21 -05:00
filtered
c7bce87b8d [Desktop] Use Window Controls Overlay API (#2316)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-22 13:22:21 -05:00
Chenlei Hu
8f6b594a9f Fix console error on adding node via searchbox (#2317) 2025-01-22 13:13:26 -05:00
Chenlei Hu
1c9b300396 1.8.3 (#2312) 2025-01-21 20:36:54 -05:00
filtered
cd5283c4b7 [Refactor] Desktop maintenance task runner (#2311) 2025-01-21 20:18:01 -05:00
filtered
0b69d3cbfe [Desktop] Startup maintenance screen (#2253)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-21 16:10:15 -05:00
bymyself
8257e848c6 Update SearchBox vue features (#2310) 2025-01-21 10:32:46 -05:00
Chenlei Hu
a07b7693b6 [chore] Update vue to 3.5 (#2308)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-20 21:21:13 -05:00
Chenlei Hu
26ddf69451 Fix validation message locale (#2309) 2025-01-20 21:11:23 -05:00
bymyself
ed6ece2099 Add forms plugin to issue report component (#2302) 2025-01-20 20:20:59 -05:00
Chenlei Hu
b42516d39c 1.8.2 (#2307) 2025-01-20 17:24:58 -05:00
Chenlei Hu
ef24efe5a3 [Desktop] Report execution complete events (#2306) 2025-01-20 17:24:15 -05:00
Chenlei Hu
34c267c755 [chore] Update primevue to 4.2.5 (#2304) 2025-01-20 16:22:24 -05:00
bymyself
8b9f0ddd1d Add Comfy Forum (forum.comfy.org) to Help menu (#2305)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-20 16:06:31 -05:00
filtered
af658b7792 [Style] Use import/export icons for colour palette (#2300) 2025-01-20 14:33:02 -05:00
filtered
9c53bbd53d [Refactor] Move type extensions out of LG (SoC) (#2303)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-20 14:22:56 -05:00
filtered
f9be20fa78 [Desktop] Fix unnecessary setting update (#2301)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-20 14:00:35 -05:00
Chenlei Hu
87fc7a2c5d [Cleanup] Remove explicit prettier plugin call (#2299) 2025-01-20 11:15:16 -05:00
Chenlei Hu
1f266e826e Fix .cursorrules typo (#2298) 2025-01-20 11:12:59 -05:00
Dr.Lt.Data
911adfe9f8 refine locales/ko (#2296) 2025-01-20 11:11:16 -05:00
bymyself
654d72b4cc Add issue report dialog service (#2284)
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-19 20:44:11 -05:00
bymyself
a1ed67fc74 Add User Feedback buttons (#2275)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: huchenlei <huchenlei@proton.me>
2025-01-19 19:41:58 -05:00
Chenlei Hu
78bc635518 1.8.1 (#2295) 2025-01-19 19:07:18 -05:00
Chenlei Hu
f49ec175e9 1.8.0 (#2293)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-19 18:57:07 -05:00
Yuki Shindo
e4c60e7e18 Prevent Enter Key from Triggering Selection During IME Composition in AutoCompletePlus (#2285) 2025-01-19 18:34:26 -05:00
filtered
37cb2cb0a5 [Desktop] Add quit command (#2286)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Chenlei Hu <huchenlei@proton.me>
2025-01-19 14:31:52 -05:00
Hikari-Fox
141825e988 Update Russian localization: refine terminology for "node", "hook", "… (#2289)
Co-authored-by: Vladimir Pozdnyakov <pozdnyakov044@gmail.com>
2025-01-19 14:29:40 -05:00
filtered
78f43b1e06 [Desktop] Add electron types update script (#2290) 2025-01-19 14:16:27 -05:00
filtered
a6105eb8c7 [DevExperience] Tailwind rules (#2292) 2025-01-19 14:16:03 -05:00
filtered
79ed598d5d [chore] Update electron-types to 0.4.11 (#2291) 2025-01-19 14:12:17 -05:00
bymyself
816574e0ab [Refactor] improve type safety in dialog service (#2283) 2025-01-18 15:46:57 -05:00
640 changed files with 42036 additions and 7262 deletions

View File

@@ -15,7 +15,7 @@ const folderStructure = `
src/
components/
constants/
hooks/
composables/
views/
stores/
services/

View File

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

View File

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

View File

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

View File

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

View File

@@ -13,7 +13,7 @@ jobs:
update-locales:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.2
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend

View File

@@ -1,4 +1,5 @@
name: Update Locales
on:
pull_request:
branches: [ main, master, dev* ]
@@ -9,7 +10,7 @@ jobs:
if: github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.2
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend

View File

@@ -2,12 +2,10 @@ name: Create Release Draft
on:
pull_request:
types: [closed]
branches:
- main
- master
types: [ closed ]
branches: [ main, core/* ]
paths:
- "package.json"
- 'package.json'
jobs:
draft_release:
@@ -18,9 +16,9 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: lts/*
node-version: 'lts/*'
- name: Get current version
id: current_version
run: echo ::set-output name=version::$(node -p "require('./package.json').version")
@@ -40,9 +38,11 @@ jobs:
files: |
dist.zip
tag_name: v${{ steps.current_version.outputs.version }}
target_commitish: ${{ github.event.pull_request.base.ref }}
make_latest: ${{ github.event.pull_request.base.ref == 'main' }}
draft: true
prerelease: false
make_latest: "true"
generate_release_notes: true
publish_types:
runs-on: ubuntu-latest
if: >
@@ -50,14 +50,14 @@ jobs:
contains(github.event.pull_request.labels.*.name, 'Release')
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: lts/*
registry-url: "https://registry.npmjs.org"
node-version: 'lts/*'
registry-url: https://registry.npmjs.org
- run: npm ci
- run: npm run build:types
- name: Publish package
run: npm publish --access public
working-directory: ./dist
working-directory: dist
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

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

View File

@@ -2,20 +2,17 @@ name: Tests CI
on:
push:
branches:
- main
- master
branches: [ main, master, core/*, desktop/* ]
pull_request:
branches:
- main
- master
- 'dev*'
branches: [ main, master, dev*, core/*, desktop/* ]
jobs:
jest-tests:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.2
with:
devtools_ref: 080e6d4af809a46852d1c4b7ed85f06e8a3a72be
- name: Run Jest tests
run: |
npm run test:generate
@@ -25,7 +22,9 @@ jobs:
playwright-tests-chromium:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.2
with:
devtools_ref: 080e6d4af809a46852d1c4b7ed85f06e8a3a72be
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
@@ -42,7 +41,9 @@ jobs:
playwright-tests-chromium-2x:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.2
with:
devtools_ref: 080e6d4af809a46852d1c4b7ed85f06e8a3a72be
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
@@ -59,7 +60,9 @@ jobs:
playwright-tests-mobile-chrome:
runs-on: ubuntu-latest
steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.1
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.2
with:
devtools_ref: 080e6d4af809a46852d1c4b7ed85f06e8a3a72be
- name: Install Playwright Browsers
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend

View File

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

3
.gitignore vendored
View File

@@ -16,6 +16,9 @@ dist-ssr
.vscode/*
*.code-workspace
!.vscode/extensions.json
!.vscode/tailwind.json
!.vscode/settings.json.default
!.vscode/launch.json.default
.idea
.DS_Store
*.suo

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

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

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

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

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

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

View File

@@ -468,6 +468,35 @@ We will support custom icons later.
![image](https://github.com/user-attachments/assets/7bff028a-bf91-4cab-bf97-55c243b3f5e0)
</details>
<details id='extension-api-selection-toolbox'>
<summary>v1.10.9: Selection Toolbox API</summary>
Extensions can register commands that appear in the selection toolbox when specific items are selected on the canvas.
```js
app.registerExtension({
name: 'TestExtension1',
commands: [
{
id: 'test.selection.command',
label: 'Test Command',
icon: 'pi pi-star',
function: () => {
// Command logic here
}
}
],
// Return an array of command IDs to show in the selection toolbox
// when an item is selected
getSelectionToolboxCommands: (selectedItem) => ['test.selection.command']
})
```
The selection toolbox will display the command button when items are selected:
![Image](https://github.com/user-attachments/assets/28d91267-c0a9-4bd5-a7c4-36e8ec44c9bd)
</details>
## Development
### Tech Stack

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 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: 98 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 102 KiB

View File

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

View File

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

View File

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

View File

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

View File

@@ -62,6 +62,9 @@ export class NodeWidgetReference {
readonly node: NodeReference
) {}
/**
* @returns The position of the widget's center
*/
async getPosition(): Promise<Position> {
const pos: [number, number] = await this.node.comfyPage.page.evaluate(
([id, index]) => {
@@ -83,6 +86,28 @@ export class NodeWidgetReference {
y: pos[1]
}
}
async click() {
await this.node.comfyPage.canvas.click({
position: await this.getPosition()
})
}
async dragHorizontal(delta: number) {
const pos = await this.getPosition()
const canvas = this.node.comfyPage.canvas
const canvasPos = (await canvas.boundingBox())!
this.node.comfyPage.dragAndDrop(
{
x: canvasPos.x + pos.x,
y: canvasPos.y + pos.y
},
{
x: canvasPos.x + pos.x + delta,
y: canvasPos.y + pos.y
}
)
}
}
export class NodeReference {

View File

@@ -8,7 +8,7 @@ import type {
HistoryTaskItem,
TaskItem,
TaskOutput
} from '../../../src/types/apiTypes'
} from '../../../src/schemas/apiSchema'
import type { ComfyPage } from '../ComfyPage'
/** keyof TaskOutput[string] */

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View File

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

View File

@@ -1,4 +1,8 @@
import { Locator, Page } from '@playwright/test'
import path from 'path'
import { CORE_TEMPLATES } from '../../src/constants/coreTemplates'
import { TemplateInfo } from '../../src/types/workflowTemplateTypes'
export class ComfyTemplates {
readonly content: Locator
@@ -8,6 +12,17 @@ export class ComfyTemplates {
}
async loadTemplate(id: string) {
await this.content.getByTestId(`template-workflow-${id}`).click()
await this.content
.getByTestId(`template-workflow-${id}`)
.getByRole('img')
.click()
}
getAllTemplates(): TemplateInfo[] {
return CORE_TEMPLATES.flatMap((category) => category.templates)
}
getTemplatePath(filename: string): string {
return path.join('public', 'templates', filename)
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 100 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: 96 KiB

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 109 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: 99 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

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