Commit Graph
201 Commits
Author SHA1 Message Date
ausboss b8bd2798f7 Release 2.8.0
Callout and Image Folder, the Nodes 2.0 size fixes, and Save Video
showing a saved gif or webp. The version pair, the changelog title, the
description and the keywords follow.
2026-10-06 18:04:10 -05:00
ausboss 863ddf47b3 Merge pull request #147 from ausboss/feat/callout-note
Callout: a note whose text fills the box, with arrows you type
2026-10-06 18:00:20 -05:00
ausboss 5e3f854a15 Merge pull request #145 from ausboss/fix/save-video-gif-webp-preview
Save Video: a saved gif or webp shows on the node
2026-10-06 18:00:12 -05:00
ausboss 4a5b8c5af3 Callout: a note whose text fills the box, with arrows you type
A new Utility node for explaining a workflow on the canvas. The text grows
to the largest size that fits the note, so it reads without zooming in, and
each point gets a thin teal line beside it.

An arrow emoji in the text (or the arrow row under the editor) becomes a
teal arrow in the line. Click a node while editing, then press an arrow, and
the arrow is linked to that node: clicking it later brings the node into
view, the way Workflow Switches does. The link is kept in the text as #id,
so editing the words never moves it.

The node has one hidden text input and no outputs, so it never runs.
2026-10-06 17:49:53 -05:00
ausboss 1ff1a863fb Crop editors: spell Center the US way
The row next to Fill, Feather and Resize said Centre. It now says Center,
and so do the two button tooltips and the three crop help pages. Code
names and comments are unchanged, since nobody sees them.
2026-10-06 17:49:38 -05:00
ausboss 0c404b37f3 Save Video: a saved gif or webp shows on the node
With format set to gif or webp the file was saved, but the node's stage
stayed empty and said "Execution finished without video metadata".

The node has shown a gif or webp in an <img> since the two formats were
added, because a <video> cannot play either. The run's result was still
searched with a list of video file endings only, so for these two nothing
was found and the <img> was never filled. The list of picture endings now
sits beside that lookup in js/shared/video_preview.mjs, and both the
lookup and the choice of tag read it. A png is still not taken.

In the classic renderer a saved webp was also drawn a second time under
the stage. ComfyUI shows an animated webp in a widget of its own, neither
its video preview nor its picture preview, and only those two were stood
down. suppressCoreVideoPreview hides that widget as well. The node's
smallest height with a saved webp goes from 469 px back to 415 px.

Tests: the lookup finds a saved gif and webp and sends them to the <img>;
every row of the backend's VIDEO_FORMATS is read from its source and has
to be found and sent to the right tag; the animated widget is hidden on
arrival and when it is already on the node.
2026-10-06 17:35:31 -05:00
ausboss 1e1721ab26 Video nodes: the clip no longer sets their height in Nodes 2.0
In Nodes 2.0, Load Video and Save Video could not be dragged shorter than
their clip drawn at the node's full width. With a 9:16 clip, Load Video at
320 px wide stopped at 965 px, where the classic renderer goes to 584 px,
and Save Video at 823 px against 446 px. A node saved at its classic size
was drawn taller than saved and could cover the node under it.

Nodes 2.0 lays a node out by its content, and the saved size is only a
minimum. The shared stage kept its <video> in normal flow at full width, so
a portrait clip set the stage's height. The clip now sits out of flow and
fills the stage, and so does the <img> Save Video keeps for a gif or webp.
The stage takes its size from the node alone and the clip scales to fit.
The player fills the stage, where the preview picture is centred at its
own size, so its controls stay along the stage's bottom edge.

The classic renderer is unchanged.
2026-10-06 16:48:34 -05:00
ausboss 20ae46ad53 Merge main into fix/nodes2-panel-min-height 2026-10-06 15:40:11 -05:00
ausboss 2b27fee214 Merge pull request #135: Node text: say what the nodes do today 2026-10-06 15:39:43 -05:00
ausboss 2e06f01c97 Panels: keep their minimum height in Nodes 2.0
In Nodes 2.0 a node with a picture panel could be dragged shorter than the
panel's minimum. A corner drag took Mask Refine from 356 to 218 px and left
its picture a 2 px line, Save Image lost its saved picture, and Latent Size
lost its whole stage. The classic renderer stops at the panel's floor.

The classic floor is the minHeight a panel declares through fillNodeHeight.
Nodes 2.0 lays a node out by its content and does not use that number, so a
panel whose content has no height of its own had nothing to stop at.
fillNodeHeight now also writes the floor, less the DOM widget frame, to the
panel's element as a CSS min-height while the element sits inside a Nodes
2.0 node. It is written whenever the floor is read and when the panel is
first laid out, so a floor that follows state is followed: with the preview
switched off the node still shrinks to the bar.

The preview panel's stage also carries its own floor inside a Nodes 2.0
node. That panel's declared floor holds less frame than the shared number
takes off, and without the rule its nodes stopped 10 px under the height
ComfyUI lifts them to on the next load.

The classic renderer is unchanged.
2026-10-06 14:48:50 -05:00
ausboss 2f456ef288 Merge main into fix/nodes2-card-height 2026-10-06 13:38:54 -05:00
ausboss 36d6905477 Add Image Folder: pick a folder, tick its pictures, run the workflow on each
A loader for many pictures. The card chooses the folder inside ComfyUI's
input or output folder, and a thumbnail gallery under it ticks the pictures
to use. All in one run sends every picked picture through as a list; one
per run loads one picture each run and moves on when a run is queued. It
gives image, mask, filename, index and count. Pictures dropped on the node
or added with Add are uploaded into the input folder.

Folder names and picked names are attacker-controlled: a folder is only
read as a path below the input or output folder, links that lead out are
refused, and picked names are compared with what the folder holds, never
opened.
2026-10-06 13:28:51 -05:00
ausboss 7469156a30 Cards: keep their own height in Nodes 2.0, the picture takes the rest
In Nodes 2.0 a node with a card above a picture panel gave half of its
spare height to the card. The card got empty space under its last row and
the picture was drawn at about half the size it has in the classic
renderer, on a node at its smallest size too.

Nodes 2.0 lets a widget's row take spare height whenever the widget has a
computeLayoutSize, and every DOM widget inherits one. A card that pinned
only its computeSize was pinned for the classic renderer alone.
pinVuePanelHeight clears the inherited method, and the widget cards and
Save Image's card call it. The classic renderer is unchanged.
2026-10-06 13:20:52 -05:00
ausboss 1ec9359a92 Node text: say what the nodes do today
Tooltips, two labels and one console warning still described older
versions of the nodes. Wording only: no inputs, outputs or saved values
change.

- Latent Size: the gear, its menu and an error said "Resolution".
- Video Crop + Rotate + Pad -> Clip: tooltips said Snap and Limit where
  the node says Frames for and Length, and described dragging a handle
  to move the whole window. IN and OUT trim; Length sets a frame count.
- Run Timer: earlier runs are in the right-click menu, not under the
  number.
- Krea 2 Outpaint Model Patch: the rounding strip the warning names only
  comes from Divisible by on the Crop + Rotate + Pad nodes. Load Image +
  Pad never adds one.
- Save Image: its preview switch said off skips a temp file. It writes
  none, so it gets its own tooltip; the other preview nodes keep theirs.
- Workflow Note: the Banner layout shows the title, subtitle and author.
- LoRA Loader: a docstring said the pack only reads the Civitai file. It
  also writes it on Fetch Civitai info.
2026-10-06 13:15:16 -05:00
ausboss 8946850038 Release 2.7.0
Mask by Name and Workflow Switches, with an example workflow that shows
both. The version pair, the changelog title, the description and the
keywords follow.
2026-10-06 11:34:02 -05:00
ausboss 64df182242 Cards: show each row's tooltip on hover
The card read a row's hover text from the widget, where the frontend does
not keep it, so no row of any card said anything on hover. It now falls
back to the node's definition, which holds the tooltips the backend
declares.
2026-10-06 11:16:19 -05:00
ausboss 73f273c3dc Cards: opening More keeps the height the person gave the node
A card whose height changed set its node to its smallest size, so a node
made taller for its picture lost that height whenever More opened or
closed. The node now grows or shrinks by what the card did when the person
changed it by hand, stays as it is when the card changed by itself, and a
loading workflow takes its saved height. A node that sat at its floor
still hugs the new floor.
2026-10-06 10:54:38 -05:00
ausboss 895493c49c Mask by Name: the card, the FIND button and the picture on the node
Registers the node, gives it a widget card and the shared preview panel
with a FIND tool that runs the node alone, a readout of how many things
matched and how sure SAM 3 was, and the stop message on the node's own
face. A stopped run shows the plain picture, not the last find. Each name
asks SAM 3 for up to 16 matches, and Sureness starts at 0.7.
2026-10-06 09:59:28 -05:00
ausboss 9c347f0616 Merge main into feat/workflow-switches
# Conflicts:
#	CHANGELOG.md
2026-10-06 09:36:58 -05:00
ausboss 032c0cd1b4 Load a file dropped on a loader's picture into the node, not a new Load Image node 2026-10-06 08:15:30 -05:00
ausboss 3007140cd6 Workflow Switches: a click anywhere on a pill flips the switch 2026-10-06 07:34:28 -05:00
ausboss c5a15d99c4 Workflow Switches: a switch can change settings instead of turning nodes off 2026-10-06 00:25:24 -05:00
ausboss 22bd33a093 Add Workflow Switches, a card that switches parts of a workflow off and on 2026-10-05 23:59:34 -05:00
ausboss 0692e0a26d Add the logic behind Workflow Switches 2026-10-05 23:49:19 -05:00
ausboss c647d5302d Release 2.6.4: Integer steps by 1, a note above the boxes in the examples 2026-10-05 16:28:45 -05:00
ausboss d5c95bed83 Whole numbers on cards step by 1, pixel sizes keep 8
The card took any whole number with a range over 2048 for a pixel size and
stepped it by 8. On the Integer node that made a Steps box go 25, 17, 9, 1:
8 was out of reach without typing. Select Every Nth, Split Batch, Select
Frame and Load Video's frame limit stepped by 8 too.

A whole number now moves by its own increment. A row steps by 8 only when it
is a pixel size (a px unit, or `pixels` on a row that shows no unit, as
Image Resize's W x H), and a row can name its own `step` (Load Image + Pad's
Multiple keeps 8).
2026-10-05 15:49:12 -05:00
ausboss b455b20dd3 Release 2.6.3: Ctrl + Enter in popups, Use it for LoRAs, Stitch Inpaint with RGBA, node minimum width 2026-10-05 09:52:57 -05:00
ausboss 5a4674f5f6 Hold each node's minimum width
Every node stops at the width it was built for when it is dragged narrower:
the growing panels and the fixed cards. Load Video's IN and OUT boxes stay
whole in a narrow node.

The frontend adds 104 pixels to a growing panel's minimum width and leaves a
fixed-height card's minimum out of its width sum, so a card fell to a 210
pixel default. Panels pass exactMinWidth to fillNodeHeight or call
holdNodeMinWidth, and tests/panel_guards.test.mjs fails a new panel that does
neither.
2026-10-05 09:35:15 -05:00
ausboss aea32dea2d Workflow Note: Use it covers a LoRA, and writes paths the way the folder lists them
A LoRA from the note's list that sits in a subfolder only showed as
installed, while the model, text encoder and VAE lines offered Use it. The
LoRA line now shows the folder and offers Use it as well, which writes the
found path into the LoRA Loader row. LoRA Loader follows a row change made
by another node in Nodes 2.0 too.

Use it also wrote the found path with forward slashes. A Windows server
lists files in subfolders with backslashes, and a loader only takes a file
exactly as listed, so the loader kept an unknown value. Use it now writes
the folder's own spelling.
2026-10-05 09:35:15 -05:00
ausboss be8b071c55 Ctrl + Enter runs the workflow from the boxes in our popups
2.6.2 let app shortcuts through from the boxes on a node face. Six more
boxes still stopped every key: the LoRA picker's search box, the trigger
word and template name boxes, the gear menu's boxes, the picture and video
picker's filter, and the server file path box on the video nodes. They use
keepKeyInField now, and a search box no longer treats Ctrl + Enter as a pick.

A test reads every keydown handler under js/ and fails on one that stops a
key before looking at it. The Workflow Note editor and the keep or discard
question are the two that own the keyboard on purpose.
2026-10-05 09:35:15 -05:00
ausboss 90594e3b82 Release 2.6.2: Ctrl + Enter from our boxes, Workflow Note model notes, reload notice 2026-10-04 19:07:55 -05:00
ausboss e57725fd2b Ctrl + Enter runs the workflow from our text and number boxes
Every field on a node face stopped all key presses, so ComfyUI's shortcuts did nothing while the cursor was in a Text node, a number box, the Seed box or a file name box. Ctrl + Enter only queued a run after a click outside the node.

The fields now keep the keys they type and edit with (so Delete or Ctrl + A never reach the canvas) and pass app shortcuts on to ComfyUI, as its own text boxes do. One helper, keepKeyInField in js/shared/canvas_passthrough.mjs, is used by the shared card's text, multiline and colour fields, the number boxes, the Seed box, Save Image's name fields, Load Video's IN and OUT boxes and LoRA Loader's strength boxes.
2026-10-04 19:01:02 -05:00
ausboss dce75240d2 Merge remote-tracking branch 'origin/main' into fix/note-model-row-notes
# Conflicts:
#	CHANGELOG.md
2026-10-04 15:43:55 -05:00
ausboss 491bc9086f Release 2.6.1: Fetch Civitai info is back, Ctrl + Shift drag-zoom in Nodes 2.0 2026-10-03 19:06:24 -05:00
ausboss 1fb650bbb2 Let Ctrl + Shift drag-zoom start over our nodes in Nodes 2.0
In Nodes 2.0 a panel sits in the node's own widget area instead of a
.dom-widget, so the pass-through did not recognise it and the drag-zoom
never started there. Both layouts are matched now.
2026-10-03 15:51:33 -05:00
ausboss da60955801 LoRA Loader: bring back Fetch Civitai info as a click-only browser lookup
The pack's server still never contacts a host. The info card's button has the
browser ask civitai.com about one file by its SHA256, then the server saves
the answer beside the LoRA as <model>.civitai.info after checking it names the
same file (size, shape and hash). The old Python HTTP call stays gone.

release_preflight now allows a raw fetch() only in js/cache_guard and
js/lora_loader. SECURITY.md, AGENTS.md, the README and the LoRA Loader help
page describe the change.
2026-10-03 15:23:57 -05:00
ausboss d67de2df67 Merge remote-tracking branch 'origin/main' into release/2.6.0 2026-10-03 15:04:37 -05:00
ausboss 8d831d97fe Let the graph zoom and pan while the pointer is over our nodes
The wheel, Ctrl+Shift drag-zoom and middle-button pan never reached the
graph from over Compare, the crop previews, the video viewers or any control
on a card. One pack-wide listener hands them back, the way ComfyUI does for
its own text boxes. Panels that scroll keep the wheel until they reach an end.
2026-10-03 14:38:33 -05:00
ausboss 99252cfa72 Release 2.6.0: corner handles, Centre buttons, mask tint, Divisible by, Latent Size on Qwen 2.1 2026-10-03 12:26:47 -05:00
ausboss 41bde6a3ff Show the MaskEditor mask on Image Crop + Rotate + Pad's picture
The MaskEditor saves its picture into the image widget's stored value
without calling the widget back, so the node kept showing the old picture
and nobody could tell a mask was there. The stage now follows a source
changed that way (on the node's draw, and when the MaskEditor sets the
node's preview, which covers Nodes 2.0 too), keeping the framing.

The mask is the picture's alpha. The stage reads it once per picture by the
run's own 90% rule and draws the picture as the run uses it: kept pixels
solid, painted parts empty over the fill, with Show blend's teal on top.
The teal turns, crops and pads with the picture, in the full editor too,
and Show blend's paste mask now includes the painted parts. A gear on the
image source box turns the teal off for this browser.
2026-10-02 20:02:24 -05:00
ausboss 7d019d15d7 Add corner handles and Centre buttons to Crop + Rotate + Pad
Four orange corner handles sit outside the canvas corners, on the same
ring as the side diamonds. Dragging one makes the canvas bigger or
smaller and keeps its shape: the padding on that corner's two sides
changes and the opposite corner holds still. Alt (Option on a Mac)
changes all four sides about the centre, and can be pressed or let go
mid-drag. A corner stops when one of its sides runs out of padding.

Two Centre buttons, on the node face next to Fill and Feather and in the
editor's Padding section, put the picture in the middle side to side or
top to bottom. They only move padding from one side to the other, so the
canvas keeps its size and a lit ratio stays lit; with Divisible by on,
its strip counts, so the visible bands come out even.

The rotate knob took the spot the top-right corner handle now needs, so
it moves to the nearest free gap on the handle ring when blocked, and it
keeps its place on its arm while it turns. In the editor, Alt-drag still
pans everywhere except on a corner handle.

Frontend only: the node inputs are unchanged.
2026-10-02 19:45:54 -05:00
ausboss 0257e71ab8 Let the rotate knob turn past upside down
A picture turned to 180 degrees could not be turned back with the knob:
dragging one way it stayed at -180, and the other way it snapped back to
-180 once the pointer passed straight left of the picture. Turning
clockwise through 180 also made it jump.

The turn was the pointer's angle minus its angle when the drag began.
atan2 flips from +180 to -180 straight left of the centre, so crossing
that line read as a whole turn back, and the clamp to -180..180 then
pinned the picture at the end of the range.

The knob is now followed move by move, each step the short way round
(knobStep), and the rotation wraps instead of clamping (wrapDegrees):
past 180 it carries on from -180. The Degrees box keeps its range.
2026-10-02 19:45:10 -05:00
ausboss 8988c63f27 Divisible by: explain Round canvas to and step it 1, 8, 16
Round canvas to on Image Crop + Rotate + Pad and both Video Crop + Rotate
+ Pad nodes is now labelled Divisible by. Its tooltip says what it does
(a few pixels of fill on the right and bottom so the width and height
divide evenly by the number), when to use it (models that need sizes
divisible by 8, 16 or 32) and that 1 is off. The input is still
canvas_multiple, so saved workflows keep their value.

Its arrows and drags added 8 to whatever was there, so from 1 (off) they
went 9, 17, 25. makeScrubInput gets a snap option: whole steps land on
multiples of the step (1, 8, 16, 24 and back down to 1), while Shift's
fine step and typed values are left alone. The resize Step box on the
same nodes and Multiple on Load Image + Pad had the same problem and use
it too.

The editor's status panel now refreshes when Divisible by changes, as it
already did for every other size control.
2026-10-02 19:18:16 -05:00
ausboss b2f9a4c7ee Release 2.5.2: refresh cached frontend modules after updates 2026-10-02 11:16:17 -05:00
ausboss 07b9321f7d Release 2.5.1 2026-10-01 11:53:03 -05:00
ausboss 161b305c18 Release 2.5.0 2026-09-30 01:50:35 -05:00
ausboss 0cd8a31fd5 Crop + Rotate + Pad: keep the Resize off | on pill inside the card 2026-09-30 01:00:59 -05:00
ausboss 36a0b5ca6a Merge branch 'fix/mask-refine-fill-limit' into rc/2026-09-30
# Conflicts:
#	CHANGELOG.md
2026-09-29 22:39:30 -05:00
ausboss e4501b2e0c Cards: a number widget holding an old save's empty value counts as unknown
holdsUnknownValue judged only switches and choices, so a number input
appended after a release could not be given a resetUnknown fallback: an
older save hands it the card's empty value, and it stayed there, which the
prompt then fails to convert. A number widget now holds only a finite
number. Only widgets named in a card's fallbacks are ever reset, so no
existing node changes.
2026-09-29 22:38:23 -05:00
ausboss ae2af9db47 Merge branch 'fix/clip-node-ux' into rc/2026-09-30
# Conflicts:
#	CHANGELOG.md
#	example_workflows/LTX 2.3 Video Outpaint (AusBoss).json
#	js/input_preview/index.js
2026-09-29 22:16:33 -05:00