329 Commits
Author SHA1 Message Date
DumiFlex bb8ecce1fb fix(assembler): show the template boxes on a subgraph node (#394)
A template or negative box wired to a subgraph input showed an empty row on the subgraph node. The subgraph node now gets the full editor, reading and writing the value ComfyUI keeps for the promoted input.
2026-11-13 02:17:44 +01:00
DumiFlex 3b7d8c10d7 feat(toggles): Pick one "Always one on" (#393) 2026-11-13 02:07:52 +01:00
DumiFlex 64f6f58844 fix(context): keep bundle headers inside narrow frames and the settings preview (#391)
The bundle frame keeps its width; the state badge and summary shorten before the name, and a narrow header shows the badge's dot instead of its word.
2026-11-13 00:32:06 +01:00
DumiFlex a16129a973 feat(assembler): mark unused variables internal from the toolbar (#390)
A new eye button beside Load, Save and Clear marks every upstream variable that neither the template nor the negative template reads as internal. Assemblers below each writer are checked first and keep what they read; a Context module is flipped only when none of its variables is in use. Undo in the toast puts every widget back unless it was edited since.
2026-11-12 17:39:27 +00:00
DumiFlex 4476cebf57 fix(debug): Show node opens folded bundles, groups and rows before it blinks (#389)
Widgets marked data-wp-reveal get a wp-reveal event with the target before the blink looks: Context unfolds the bundles around the module, Toggles its label groups, the Injector its folded row list. Subgraphs are entered, never unpacked. The trace link underlines only its word.
2026-11-12 18:28:59 +01:00
DumiFlex 257be0bfc7 fix(context): open the drop gap beside a nested bundle (#387)
The nested frame's own margins outranked the kit's wp-rowdrag gap; matching three-class rules let the gap and line open beside it.
2026-11-12 17:49:09 +01:00
DumiFlex 3caa30e410 feat(context): drag with the kit's row-drag look; drop into closed bundles (#386)
WP Context uses the kit's row-drag gap and line (bundle-coloured inside a bundle); a dragged bundle dims; a closed bundle takes drops on the middle of its header and opens.
2026-11-12 17:32:50 +01:00
DumiFlex cc2cea239a feat(toggles): shared row drag from wp-kit 0.19.0 (Toggles + Injector) (#385)
Bump @dumiflex/wp-kit to 0.19.0. Toggles and the Context Injector drag on the kit's useRowDrag; Toggles groups reorder and toggles can drop below a group; grid tiles size to their content.
2026-11-12 16:15:36 +01:00
DumiFlex 54d48f88f5 fix(toggles): show toggle negatives in the Assembler's negative preview (#382)
A toggle's Negative (or Off negative), and the picked toggle's negative in Pick one, now show in the Assembler's negative preview.
2026-11-12 06:32:07 +01:00
DumiFlex ed21697b3a fix(toggles): grid and socket polish (#380)
- Group layout is a grid button beside the icon and colour buttons.
- Control and output dots' tooltips say the toggle's name.
- A merged socket line says how many go in and out, names on hover.
- A Buttons toggle takes two tiles once two fit.
- A folded group keeps its toggles' input dots on its title.
- Socket carets line up with the group carets; control icons use the
  rows' colours.
- Dots are placed from the layout, so a row being dragged doesn't drag
  them along.
2026-11-12 04:06:35 +01:00
DumiFlex b890660980 feat(toggles): a Grid layout for WP Toggles (#378)
Rows or Grid for the node and for each group, in both modes and every style. Grid tiles wrap to the node's width; wired toggles' dots sit on thin socket lines under a group's tiles, control dots packed on the left and outputs on the right, and a group's lines merge into one like the Context Injector's merged wires.
2026-11-12 03:24:03 +01:00
DumiFlex 108c2b3e53 feat(toggles): an Off value and Off negative for Any on toggles (#371)
A toggle can say what its variable writes while off, with its own negative. Either a Value or an Off value makes the variable hold text; with neither it writes true/false. $name.bool reads the switch either way.
2026-11-12 02:46:22 +01:00
DumiFlex e41ae4ded0 feat(debug): trace steps say why they came out that way, per kind (#370)
Wildcard steps list their options with weights and why each was cut, the pool chain, locked seed, separator and matched value; fixed values, combines and node templates show what they read; constraint steps link the steps they re-weighted; Model Info, Toggles, Injector and Context Loop rows carry their own facts.
2026-11-12 02:33:22 +01:00
DumiFlex 3a7671b467 fix(examples): Var nodes read $name.bool, so Quick preview picks the small size again (#369)
lookup_var reads $name.bool from the toggles' on/off table; example 2's Var → Bool reads $quick_preview.bool since the Quick toggle's Value (12) now fills $quick_preview. Tests, docs note and release-notes line.
2026-11-12 02:28:10 +01:00
DumiFlex 4005954615 feat(debug): give WP Debug a view of its own for the Loop, Model Info, Toggles and Injector (#360)
Variables grouped into per-node cards with kind squares, module facts, toggle true/false and value + .bool, Injector type chips, Loop frame line; long values fold until Show all; .axis/.bool/tags as kit chips. Trace stays numbered run order. Show node blinks the module or field on the canvas. Grouped right-click menus with a kind header. Loop trace rows, node warning labels and links.
2026-11-12 02:12:23 +01:00
DumiFlex 4ff45d2492 feat(toggles): every toggle can have a Value and a Negative, plus $name.bool (#367)
A toggle with a Value writes it to its variable while on and nothing while off; its Negative goes with the variable. $name.bool reads the switch (true/false) across nodes, in text and in conditions, through __wp_toggle_bools__. Payloads reading $name.bool stamp schema 12; bool is reserved as a tag group.
2026-11-12 02:12:08 +01:00
DumiFlex f30185d36a feat(toggles): a toggle's settings in a window, icons, colours and a Pick one negative (#361)
Each toggle's settings open in a kit Modal: name, variable, looks (icon, icon/name/control colours on kit IconPicker and ColorField), Pick one value and negative, style, needs, when off. The header and the row wear the toggle's looks; the icon is a column beside the name and $var. Labels take an icon and colour. Window warnings use the kit Banner. Bundle guide raised to 670 KB.
2026-11-12 01:51:09 +01:00
DumiFlex eb9d8e483d feat(note): pick any extension picture, and keep the Pictures panel open after adding (#365)
* feat(note): pick any extension picture, and keep the Pictures panel open after adding

* feat(note): show the extension's pictures only once you search

* feat(note): preview the note as the node draws it, and let the icon picker fill the editor
2026-11-11 23:54:14 +00:00
DumiFlex 089b803497 feat(note): write the note's text in its own window, and drag Note and Bookmark while editing (#359)
The text and a live preview move into a window like the module editors
(NodeEditWindow, shared with the Toggles editor). The node keeps tone,
look, colour, title, pin and the bookmark settings. An open Note or
Bookmark editor now lets presses on its background through, so the node
drags.
2026-11-11 21:57:47 +00:00
DumiFlex 51f9f3fc3a fix(toggles): toggle variables reach the Assembler, internal globe, Pick one styles (#358)
Graph walkers marked every WP Toggles variable internal, so the Assembler
showed none. Each toggle now has a globe (internal by default), Pick one
gets a node-wide style, the Value field is a rich input that warns about
inline picks and missing variables, and toggles drag into and out of groups.
2026-11-11 22:36:58 +01:00
DumiFlex 8c99088dca fix(ui): give manager pop-up panels their padding back under Tailwind 4 (#356)
Tailwind 4's preflight resets padding, margin and border on every element in @layer base, which ranked above the kit's @layer wp-extension, so the Popover lost its padding (Test Runner picker flush against its edges). layers.css, imported first, ranks wp-extension above base.
2026-11-11 21:11:09 +01:00
DumiFlex d34fc8f8cf feat(tutorials): in-depth Context Loop, Context Injector and Image Filter videos (#352)
* feat(tutorials): in-depth Context Loop, Context Injector and Image Filter videos

N05 walks the whole Context Loop (frames vs batch size vs Run count, Edit
frame chips, Override Context seed, strategies, the seeds panel, Ctrl/Alt
click, values, a rule on $iteration, Seed List, Hold, Bypass loop). N04
takes the Context Injector apart and N12 the Image Filter (labels, prompt
edits with clip, the mask painter, Compare, Zoom, Send to Loop, the node's
settings). The old Nodes videos move to their new numbers (Debug N03,
Label & Grid N13, Note N14, Bookmark N15); N12 replaces the old N01.

* fix(tutorials): tick both rows in T03's bulk edit

The selection bar slides in after the first tick and moves the rows, so the
second click could land where its row used to be. Tick one row at a time and
check each one took.

* fix(tutorials): scroll T05's rules into view before boxing them

scrollTo now falls back to scrolling the part's own scrolling box when the
wheel doesn't move it, and T05 scrolls each branch (and the second action)
to the upper screen before its callout, so the boxes are on screen.

* fix(tutorials): narrate T06's canvas build so it plays at normal speed

The two builds had no line, so the render squeezed them to 4.5x and the
hand looked rushed. A line over each keeps them at normal speed.

* fix(tutorials): a hand at work plays at most 2x in the render

The Tutor now records when the hand clicks, drags, types or presses a key
(cues.json acts), and render.mjs speeds a silent stretch with hand work up
by at most 2x instead of up to 8x, so builds don't look rushed. The ten
longest silent builds (T04, A04, A05, A06, A09, A10, A12, L03 and two in
N14) get a line, so they play at normal speed.

* fix(tutorials): give N04's Injector room beside the stand-in nodes

The Injector landed on the first text box and covered its output, so the
first wire never connected. The stand-ins sit further right, the Injector
further right still, and the canvas slides left before the Context step.

* fix(tutorials): keep both ends of N12's new wires on screen

The mask wire was dragged from the filter to a node that had scrolled off
the top, so it dropped on empty canvas. The canvas now fits the nodes of
each wire into the free part of the screen first, and the new Set Latent
Noise Mask goes under the refine sampler.

* fix(tutorials): N05 and N04 fixes from the first takes

N05: zoom in on the Seed List while it's talked about (it sat under the
caption), and drop the callout labels that covered the frame chips and the
template. N04: narrate the Context / Assembler / preview build (36 s of
silence) and move the hand off the rows so the globe tooltip closes.

* fix(tutorials): paint N12's mask on the painter's canvas

In paint mode the mask painter replaces the detail image, so the strokes
aimed at an image that was no longer there.

* fix(tutorials): a single click doesn't hold a long wait at 2x

A Run click followed by a long wait counted as hand work, so the wait played
at 2x instead of being squeezed. A stretch now needs two or more hand
actions to be capped.

* fix(tutorials): tuck N12's picker away with its minus button

Escape in Detail goes back to the grid instead of tucking the picker away,
so the waiting pill never showed.

* fix(tutorials): box N12's two extra slots as a pair

The callout took one locator matching both slot dots, which strict mode
refuses.

* fix(image-filter): keep the picker's keys after a view change

Switching mode or leaving the painter removed the focused control and dropped
focus to body, so the picker's keys went to the canvas bookmarks. Focus goes
back to the picker. N12 hands the keys back before Compare and Zoom.

* fix(tutorials): L05 waits for Role's save to store a history entry

* fix(tutorials): a few clicks across a long wait don't cap the squeeze

* fix(tutorials): review 2026-11-11 first half (lines over empty canvas, late boxes, N12 framing)

* fix(tutorials): review 2026-11-11 A09-A19 findings

* fix(tutorials): review 2026-11-11 L03, L05, N14, E4 findings; jumpTo keeps tall notes above the caption

* fix(tutorials): A06 and T05 build their Context before the line

* fix(tutorials): N14 keeps the label's peek open through its line

* fix(tutorials): N12 boxes the extra slot rows; callouts fall back to the raw box

* fix(tutorials): N14 hovers the label before its line

* fix(tutorials): N14 keeps the hover card up while its line plays
2026-11-11 03:33:14 +00:00
DumiFlex 4bdacc8506 fix(note): open the editor wide enough for its tools (#330)
The editor's tools (text toolbar, bookmark zoom box) need about 358 px and
the editor opened at 340, so they spilled past the edge. FORM_WIDTH is
360, the toolbar wraps on a narrower note, and the fitted size goes
through setSize so Nodes 2.0 hears it.
2026-11-10 03:20:03 +00:00
DumiFlex 0e822858f1 fix(note): buttons, links and text box scrolling in Nodes 2.0 (#331)
Restores clicks on a note's own buttons and links in Nodes 2.0 (specificity regression from #328), and lets the wheel scroll a long textarea under the wheel shield even when Firefox reports its overflow as visible.
2026-11-10 04:06:41 +01:00
DumiFlex fb00b7ca94 fix(context): collapsed bundles show trouble inside and don't widen the node (#332)
Hidden rows inside a collapsed bundle no longer raise the WP Context width floor, and a collapsed bundle's header shows a dot for the worst conflict and library state among the rows it hides.
2026-11-10 04:00:51 +01:00
DumiFlex a08b763036 chore(kit): bump @dumiflex/wp-kit to 0.15.4 (#329)
Bar room only while a box actually scrolls, so the category icon picker has no empty strip. The module list's scrolling table wrap takes v-bar-room.
2026-11-10 03:28:30 +01:00
DumiFlex 6d1d0591a2 fix(note): let the editor keep the pointer so its scrollbars work in Firefox (#328)
While a WP Note is being edited, the frameless pass-through gives the pointer back to the editor (legacy and Nodes 2.0), so Firefox's overlay scrollbars respond on hover. It takes it again when editing ends.
2026-11-10 02:38:39 +01:00
DumiFlex aadc550207 chore(deps): bump @dumiflex/wp-kit to 0.15.3, leave room for overlay scrollbars (#326) 2026-11-10 02:26:16 +01:00
DumiFlex 1f3e610c59 fix(note): frame pictures so they don't read as a hole in the node (#324) 2026-11-10 02:09:05 +01:00
DumiFlex 272a761e11 fix(categories): draw icons saved with a pi- prefix (#323) 2026-11-10 01:44:35 +01:00
DumiFlex 2b50da3d22 feat(manager): ComfyUI palette colour theme (#327) 2026-11-10 01:37:18 +01:00
DumiFlex 24ab53e531 feat(canvas): follow ComfyUI color palettes beyond Dark and Light (#322) 2026-11-10 01:23:45 +01:00
DumiFlex 2a9336bee5 fix(ui): uncut g/p/q/y on seed buttons and health names, roomier unset chip (#320) 2026-11-10 01:01:01 +01:00
DumiFlex 4f8e1dcf0e fix(assembler): plain-text status, empty variables note and uncut negative row (#319)
Without a Context the preview said '(template empty or unresolved)' about
text with nothing to resolve. It now reads 'plain text', counts $names
nothing sets as unresolved, and the empty variables row explains itself.
The negative row's line height no longer clips descenders.
2026-11-09 23:24:44 +00:00
DumiFlex 78d2d4c395 fix(var-nodes): show the default after a run whose variable was missing (#317)
The last-execute strip decided 'has run' from a non-empty source text or
a choice note, so Var → Int / Float / Bool reading an unset variable kept
saying 'run workflow to see result' instead of the amber default. The
host now passes an executed flag, and the strip names the unset variable.
2026-11-09 23:14:55 +00:00
DumiFlex da637c451a fix(canvas): hide the part of a WP widget a node on top covers (legacy look) (#318)
In the legacy renderer every DOM widget sits in one layer over the
canvas, and ComfyUI's own clipping only cuts out the selected node, so a
WP panel showed through any node dropped on top of it. On each canvas
draw, each WP widget now gets a clip-path that leaves out the nodes
drawn after its own. Cleared under Nodes 2.0.
2026-11-09 23:07:02 +00:00
DumiFlex d2042ecb3a fix(bundles): fill a child's missing payload hash so a new bundle isn't drifted (#316)
* fix(bundles): fill a child's missing payload hash so a new bundle isn't drifted

A bundle child saved without payload_hash (hand-made or imported packs,
like the tutorial library) came onto the canvas with no hash, and the
canvas reads a hashless row whose id is in the library as drifted. GET
now gives such a child the hash of its own payload.

* docs(release-notes): bundle children no longer drifted on insert
2026-11-09 22:45:35 +00:00
DumiFlex 791b3d8a06 fix(extension): toast Focus opens the subgraph the node lives in (#312)
The Focus button on an unresolved-Assembler warning now opens the graph the node lives in (into a subgraph or back out to the root) before centring, selecting and flashing it, through a shared showGraph helper the Debug viewer's Show node uses too. The pre-run scan starts from the root graph, and the flash re-finds the Nodes 2.0 element once it is drawn.
2026-11-09 17:37:21 +01:00
DumiFlex e891e4f6af feat: export library items as plain wildcard files (#310)
Import / Export gets a Wildcard files (.zip) button: picks become Dynamic Prompts / Impact Pack .txt files (engine/wildcard_export.py, POST /wp/api/export/plain), with a README listing what has no plain form. The community site vendors the exporter.
2026-11-09 14:36:15 +01:00
DumiFlex 6f089755fd feat(wildcards): filter a wildcard's pool by a run-time variable (#309)
* fix(extension): explain an empty wildcard pool when no option has tags

* feat(wildcards): filter a wildcard's pool by a run-time variable

A $name term in a Pool filter or a reference filter reads the variable
when the prompt runs: options tagged with its value stay, options with no
tag in that value's group stay too. An unset variable or a value that is
no tag on the wildcard drops that term and files filter_variable_no_tag.
Constraints still apply on top. Stamps schema 11 (MAX_KNOWN 11).

* test(syntax): cover the filter variable helpers in the syntax suite
2026-11-09 14:11:10 +01:00
DumiFlex 43e94b1a51 fix(extension): explain an empty wildcard pool when no option has tags (#305) 2026-11-09 13:57:56 +01:00
DumiFlex 1b6865a8ef fix(engine): booleans read as true / false so a Boolean node can drive a rule (#308) 2026-11-09 12:39:01 +00:00
DumiFlex e0fdbb3036 fix(extension): subgraph variables and Nodes 2.0 badges, centred loop chevrons (#307)
Current frontends give nodes text ids ("-10") and the root graph a UUID id, so walkers never crossed a subgraph's edge: variables set outside showed as missing inside. Nodes 2.0 only read the subgraph badge when a node rendered; each SubgraphNode now gets one badge getter up front and a change bumps a revision on ComfyUI's own reactive store. The Context Loop and Seed List chevrons sit at the right edge, level with the label.
2026-11-09 13:24:30 +01:00
DumiFlexandgithub-actions[bot] df769e5d10 chore: clear the release notes shipped in v2.21.0 (#304)
Co-authored-by: github-actions[bot] <41898283+github-actions[bot]@users.noreply.github.com>
2026-11-05 19:39:22 +00:00
DumiFlex 4b534a3ade fix(extension): send every per-node edit to the Assembler preview (#291)
The preview dropped 11 instance keys the engine reads (constraint reach, cell/exception overrides, derivation branch edits, hold seeds), so it could show picks the run never makes. A test now checks the whitelist against the engine handlers.
2026-11-05 19:24:25 +01:00
DumiFlex 477211ab31 fix(extension): preview reads a Context seed wired from another node; A09 rolls one shared seed (#290)
The Assembler preview now follows a seed input wired from an Int or seed node. Tutorial A09 wires one Int into all three Contexts and steps it.
2026-11-05 18:22:57 +01:00
DumiFlex 94248c53ed fix(manager): fit the constraint exception factor box to its column (#289)
The factor box took its number input's default width, wider than the 120 px column, so the value sat under the delete button. It now fills its cell.
2026-11-05 18:13:06 +01:00
DumiFlex 5f2d1ea1be fix(autocomplete): write whole LoRA and embedding references (#285)
Picking a LoRA inside <lora: inserted only the path, leaving no weight and no closing bracket. Commits now close the reference (or keep an existing weight), absorb a < the user typed, and rewrite <embedding:...> into embedding:name.
2026-11-05 12:55:02 +01:00
DumiFlex 1117b97c45 fix(ai): a tip in the chat never draws a second tip inside it (#283)
Blocks inside a chat callout drop their own 💡 / "Tip:" marker instead of drawing a second callout.
2026-11-05 10:43:52 +01:00
DumiFlex bcc5a4ae57 feat(assembler): negatives are opt-in with $negatives, prefilled on new nodes (#278) 2026-11-04 23:25:50 +01:00