Commit Graph
39 Commits
Author SHA1 Message Date
ausboss 9aefc53134 LoRA Loader: say why a Civitai lookup failed
The button still reads Civitai lookup failed, and a message now gives the
reason. A browser that cannot reach civitai.com at all names the usual
causes: a firewall, a VPN, or ComfyUI started with --disable-api-nodes.
2026-10-25 13:00:09 -05:00
ausboss 15718c07ee LoRA Loader: Fetch Civitai info also saves the LoRA's picture
The browser downloads a small copy of the LoRA's first picture from
Civitai's picture server (PG-13 or milder unless the gear menu's Civitai
picture option says any), and the server saves it beside the LoRA as
<model>.preview.jpg, never replacing a picture. The LoRA Previews add-on
is no longer needed, so its hooks and install hint are gone.
2026-10-24 18:30:09 -05:00
ausboss da98850591 LoRA Loader: hand Civitai info to the LoRA Previews add-on
After Fetch Civitai info saves its file, LoRA Loader sends a browser
event. The separate LoRA Previews add-on answers it by saving the LoRA's
preview picture, and the card and hover show it without a reload. The
info card links to the add-on when a LoRA has Civitai info but no picture.
2026-10-24 16:55:24 -05:00
ausboss 812a22c070 LoRA Loader: groups get their own switch; Workflow Switches can own a group
Turning a group off stops its LoRAs and keeps each row's own on/off for when
the group comes back on. A switch saved with a group on and off now moves only
the group, shows one lock on the group's header, and leaves the rows inside to
the person. Renaming the group keeps the switch; clicking the lock takes the
group back.
2026-10-24 15:18:36 -05:00
ausboss 0afae99b30 LoRA Loader: Shift-click ticks a run in the picker
Shift-click a tick box or name ticks every file from the last one ticked.
Ctrl+Enter ticks the highlighted file and Shift+Enter ticks the run up to it.
2026-10-24 14:58:33 -05:00
ausboss 840f0003dd LoRA Loader: fix picker arrows and drag-out, add stack menu
- The picker's arrow keys no longer stick when the list opens under a
  pointer that has not moved: only a real pointer move takes the
  highlight.
- A group's only LoRA can be dragged out, and a group's first row
  dropped above its own header lands there instead of at the bottom.
  Just below a group's last row is now always outside the group.
- Right-click on the space around the rows opens a stack menu (add,
  group the selection, fold or open all groups, delete all) instead of
  the browser's Copy / Select all; the group menu also ends with
  Delete all.
2026-10-24 14:22:27 -05:00
ausboss 7469c5869e LoRA Loader: tick several files to add, and group rows
The + LoRA list gets a tick box beside each file. Ticked files (also by
Ctrl/Shift-click or Ctrl/Shift+Enter) are added together from a bar at
the bottom; ticks survive a search, and files already in the stack read
"in stack".

Rows can be grouped: Ctrl/Shift-click to select, right-click to group,
move to a group or take out. A group header has a switch for all its
rows, a fold arrow that shortens the node, a double-click rename, and a
grip to drag the whole group. Rows drag in and out by their grip. The
group name is stored on each row, so the stack still runs top to bottom
and groups travel with templates and undo; folded groups are a node
property.
2026-10-24 14:03:06 -05:00
ausboss 79c30f632c LoRA Loader: keep the owned-row line clear of the lock
The teal line on a row a switch sets moves into the stack's padding, a few pixels left of the lock, instead of an inset edge right against it.
2026-10-15 10:58:56 -05:00
ausboss 067f5e21c8 LoRA Loader: rows on a subgraph box, and a lock on rows a switch sets
A LoRA Loader inside a subgraph gets a first gear item, Rows on the box.
Show brings its rows up the frontend's own way (a subgraph input linked to
the loras input), and the box then shows the loader's row card on its face,
bound to the box's copy of the rows, which is what runs. Each copy of the
box keeps its own rows. On the box the card keeps the rows, the master pill
and Re-check; templates and the gear stay inside. The card also appears
when loras is brought up from the frontend's Edit subgraph widgets list.

Inside, the loader says where its rows are set and shows and edits the
copy of the box it was entered through (or the only box); with several
boxes and no known way in it is read only. Take back removes the subgraph
input and keeps the rows of that box.

Workflow Switches needs no change to set rows on a box: the box's copy is
an ordinary widget value. A row that a switch sets shows a lock in place
of its grip, naming the switch on hover; a click on the lock removes that
row from the switch's saved sides (releaseStackRow), and the row still
drags. Pure helpers live in js/shared/lora_box.mjs and
js/shared/workflow_switches.mjs, with tests.
2026-10-15 10:36:10 -05:00
ausboss 0e815ee6f0 LoRA Loader: a trigger with a comma in it switches on and off
Some LoRAs list a whole sentence as their trigger. A click on it in a
row's info card added it to the row, but its chip stayed dark, and a
second click added it again instead of taking it out.

A row keeps its triggers as one comma-joined text. The chip's check and
toggleTrigger both split that text at commas and looked for the whole
trigger as one part, so a trigger with a comma of its own never matched.
A trigger is now looked for as the run of parts it becomes (hasTrigger),
and toggleTrigger uses the same search. Off takes out every copy, so a row
that already holds the sentence twice is cleared with one click. A click
refreshes every chip of the card: the same words can sit in two lists.

No Python change and no input change. The row text and the triggers
output are what they were for every trigger.
2026-10-12 01:28:52 -05:00
ausboss b6ec6db301 LoRA Loader: add a whole folder, and use the rows from the keyboard
- + LoRA opens one list grouped by folder. A click on a file adds it, a
  click on a folder name adds every LoRA under it. Files already in the
  stack are skipped, the add is one undo step, and nothing is added when
  it would pass 64 rows. Folders fold with their own arrows; the folded
  view is remembered in the browser, and search shows matches without
  changing it.
- A row can be reached with Tab and worked with the keys: Up/Down between
  rows and + LoRA, Enter for the file picker, Space for the switch,
  Left/Right for strength (Shift for the fine step). Delete and Backspace
  are kept from ComfyUI there, so they cannot delete the node. Focus goes
  back to a row only when the keyboard was in use; after a mouse click
  the keys stay with ComfyUI as before.
- Remove this LoRA is red in the row menu.
- The row switch reports on/off to screen readers and the strength boxes
  have short names.
2026-10-11 00:14:26 -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 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 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 8d03e59d2b Open 1.x saves with the preview and Stop on missing LoRA on
Workflows saved by the 1.x releases also end in a panel's empty value: the
preview panel on LaMa Inpaint and Mask Refine (Select Frame from 1.2.0) and
LoRA Loader's rows. The inputs added in 2.0.0 sit in those slots, so preview
opened as "" (the switch showed on, but the prompt ran without a preview)
and on_missing opened as "" (the menu showed Stop on missing LoRA off while
the node still stopped the run). Each now opens on its default, which is
also what an API prompt without the input runs with: the three cards reset
preview through resetUnknown, and LoRA Loader, which has no card, applies a
RESET_UNKNOWN when a workflow opens. On a real 1.x save (pack 1.3.0 saved by
frontend 1.47.12) only those four values change.

The guard's history now reaches back to 1.0.0. Mask Refine's preview was
inserted ahead of an existing socket rather than appended, so the table now
lists each node's last input as of this guard and APPENDED_SINCE declares
everything added since the node first saved an empty value. The fallback
check also reads RESET_UNKNOWN, and tests/test_card_fallbacks.py becomes
tests/test_saved_fallbacks.py, which checks both kinds.
2026-09-29 03:20:45 -05:00
ausboss 2a3268f934 Cards and panels: leave them out of saved workflows
Every card and DOM panel was added with options.serialize = false, which
only keeps a widget out of the queued prompt. The frontend saves each
widget whose own serialize is not false and hands saved values back by
position, so each card and panel saved an empty value of its own after the
node's real values, and an input appended to the node later opened holding
it (Stitch Inpaint's seam, Crop For Inpaint's keep_inside). Every DOM widget
now also sets widget.serialize = false, as the frontend's own previews do,
so new saves carry only real values.

Older saves still end in those empty values, and loading them now skips
the cards and panels. On every node that saves by position they come after
all real values (Save Image's card sits mid-list, but Save Image saves by
name), so nothing moves. On frontend 1.53.6 the examples (the 21 from
before the trim and the 7 now) and 14 older saved workflows queue
byte-identical prompts before and after, keep every value, and save and
reopen cleanly.

An input appended later still needs a fallback for those older saves.
tests/saved_widget_values.test.mjs checks that every DOM widget sets the
flag, that the examples keep their values with the panels skipped, and that
each input appended to a node whose older saves end in an empty value is
declared and, as a widget input, has a card resetUnknown fallback that
fires. tests/test_card_fallbacks.py (ComfyUI's Python) checks each fallback
is the input's own default. AGENTS.md states the rule.
2026-09-29 03:20:45 -05:00
ausboss 45b27dd94a Latent Size (was Resolution Master): resizable; LoRA Loader long-name choice
Resolution Master is renamed Latent Size: the old name belongs to another
node pack. The node id AUSBOSS_NODES_Resolution is unchanged, so saved
workflows and API graphs load and run as before. Workflows only store a
title that differs from the default, so they pick up the new name; a saved
title that starts with "Resolution Master 🆎" gets the new name in its
place on load. The example, its thumbnail and the README image follow.

- Latent Size can be resized: wider stretches the chips, fields and size
  picks, and taller gives the stage the room. It opens at 340 x 531 as
  before and goes down to 320, where the size row tightens so W, H and MP
  stay whole.
- LoRA Loader: gear -> Long names, end (the default, as before) or middle,
  which keeps the checkpoint number at the end of a name in view. The
  picker opens wide enough for long names and shortens the folder first.
- The frontend adds 104 px to a DOM panel's minWidth before using it as
  the node's floor (LGraphNode.computeSize), so a node that opened
  narrower jumped wider the moment its corner was touched: the LoRA Loader
  could not go under 424. fillNodeHeight gains exactMinWidth, which
  measures that padding and takes it back off, and holdVueNodeMinWidth
  lends the floor to Nodes 2.0, whose corner drag reads the node's inline
  min-width instead. Both nodes use them; the other panels keep their old
  floors for now.
- README: the workflow-tools image shows Latent Size alone; the Seed card
  is gone.
2026-09-28 18:34:03 -05:00
ausboss 216c885b75 Show every pack message through one toast helper
Four extensions each carried their own copy of the toast-or-console
fallback, transform upload failures used a blocking alert(), and a
failed video drop onto Load Video only logged to the console. They all
go through showToast now, so every message looks and behaves the same.
2026-09-24 00:13:30 -05:00
ausboss dfc5f03795 Make every LoRA Loader number a scrub control
The info card's suggested-strength bounds were bare number inputs and
the gear menu's default strength and step were typed text boxes, the
last numbers in the pack that did not scrub. The scrub control gains an
optional empty state for bounds that may be absent ("any"), and gear
menu scrub rows take their own step and precision.
2026-09-24 00:11:15 -05:00
ausboss f656a3d954 Record LoRA, Compare and Mask Refine panel edits in undo history
The pack's DOM panels must tell ComfyUI's change tracker about their
writes, and several did not: LoRA Loader row edits other than a few
menu actions, Compare's slide / A-B mode, and Mask Refine's AUTO. LoRA
rows now record on every commit, with strength drags recording once on
release, and the other two record when they change a saved value.
2026-09-24 00:08:36 -05:00
ausboss 402bd671fd Keep a node's own settings when a gear menu is reset
Reset restored every schema default, including the entries that mirror
the open node rather than a stored preference. On the LoRA Loader that
turned separate strengths off and copied each row's model strength over
its CLIP strength; on Resolution the popup showed a latent layout and
batch the node did not have. Reset now leaves those entries as they are,
and LoRA Loader gear edits enter undo history.
2026-09-24 00:06:01 -05:00
ausboss 463bd89f7f Remove the Civitai lookup so the pack makes no network requests
The lookup was the pack's only outbound request and a standing Registry
finding. Its info-card button, gear-menu switch, server route, sidecar
writer and hash cache are gone. A .civitai.info sidecar already beside a
LoRA is still read, so words and links from earlier lookups or other
tools keep showing.
2026-09-23 23:47:52 -05:00
ausboss 4cb2af204a Release 2.1.0: Qwen workflows and polished image/video controls 2026-09-22 15:23:07 -05:00
ausboss 7f2395c1de Add empty LoRA row insertion above and below 2026-09-11 14:23:08 -05:00
ausboss 699208dadc Prepare 2.0.0 release candidate 2026-09-07 19:56:23 -05:00
ausboss e90be183a3 Absorb appends below the existing rows instead of on top
ausboss: imported loras should land under the rows already in the stack.
Upstream entries first in chain order, then downstream; LoRA patches
accumulate, so apply order does not change what the graph computes.
2026-08-31 11:12:28 -05:00
ausboss 67d8512425 Promote the lab LoRA loader feature set into the public node
Strength bars behind each row's name (name doubles as a scrub surface),
the absorb-chain gear action (core/rgthree/Pixaroma/AusBoss loaders,
both directions, originals bypassed), moved-file resolution at run time
with warn-and-skip for missing files plus the reconnect button riding
ComfyUI's R refresh, folder-free row names, the amber duplicate ring,
master-toggle memory, the control bar reclaiming the slot band, + LoRA
inside the stack, and unified strengths as a hard per-node default.

Pure logic merged from the lab's lora_lab.mjs into lora_stack.mjs;
settings_menu gains action rows and persist:false; _lora_helpers gains
match_lora_name and the resolve fallback; VALIDATE_INPUTS is structural
only so a missing file can never block the queue.
2026-08-31 11:01:37 -05:00
ausboss da5649e3b2 LoRA loader and panel polish round
- Drag-to-reorder actually drops: the row preview's reparenting silently
  released pointer capture, so the gesture now listens on the window for
  its whole lifetime.
- Step arrows on every strength box (configured step; Shift = 0.01), with
  range tinting carried over.
- The control bar (templates, stack toggle, count, settings) sits directly
  on top of the row stack and + Add LoRA pins to the node's bottom edge;
  the triggers output got its narrower name (slot links reconnect by index).
- Civitai lookup reads the whole response instead of the first TCP chunk,
  so successful lookups stop dying as 'lookup failed'.
- Compare and Load Video declare their height floors WITH the DOM-widget
  frame allowance, so minimum-height nodes stop shaving the caption and
  trim strip; panel_layout documents the rule.
- README and the LoRA doc catch up; panel_guards comments follow the
  body-as-layout-box reality.
2026-08-30 22:14:30 -05:00
ausboss 3f715a4af8 Ship the crush-list build-out: 7 new node files, replace button, video and LoRA polish
- New nodes: Image Resize plus the Utility group (Text, Integer, Float,
  Show Text, Math Expression, Select Every Nth, Split Batch, Merge
  Batches, Free Memory) - the dependency-free gaps that let shared
  workflows drop heavy packs.
- Replace with AusBoss nodes (prototype): preview-then-confirm graph
  rewrite swapping known third-party nodes for pack equivalents, with a
  tested translation map, per-node opt-out, and refuse-with-reason for
  nodes the pack cannot stand in for.
- Load Video: single-frame FRAME picker, an honest "what will load"
  label from the probed source rate, drop-a-video-to-restore. Save
  Video: format-aware widgets and a file_path output. Stitch Inpaint
  gained a blend_mask output, Select Frame negative from-the-end
  indexing, Image Size a batch count - all appended, saved workflows
  load unchanged.
- LoRA Loader: drag-to-reorder rows, hover thumbnails on rows, file
  size and date in the info card.
- Appearance: flagship scheme deepened to slate-teal; the retired
  bright-teal pair upgrades automatically via LEGACY_SCHEME_PAIRS.
  Optional queue-completion chime, off by default.
- Image Resize invariant: pixels are only invented on an explicit
  width+height pad request - scale-derived modes resolve divisible_by
  snaps with a sub-half-step resize, never bars.
- Docs refreshed for six stale pages, stale text and metadata fixed
  across the pack, the panel-height rule codified in AGENTS.md and the
  brand skill, and ausboss_node_tour.json added - a model-free example
  exercising 17 node types in one graph.

Validated: scripts/validate_nodes.py (24 files), 300 JS tests, all
Python suites under the ComfyUI embedded interpreter.
2026-08-27 13:30:35 -05:00
ausboss 80ef06bb4b Use standard Civitai LoRA sidecars 2026-08-25 15:05:05 -05:00
ausboss 139082a9d9 Fix LoRA mismatch detection, LM Studio reasoning, Compare height; add pad stitcher
Six fixes found while testing every node against real workflows.

LoRA Loader: the "wrong base model" warning never fired on a modern stack.
It matched comfy's model class name against a table covering 8 of the 81
classes comfy ships, so Krea 2, Qwen, WAN, LTXV, Z-Image and friends read as
"unknown" and skipped the check entirely - an SD 1.5 LoRA on Krea 2 patched
nothing, changed nothing, and said nothing. It now measures the applied-patch
count across model and CLIP before and after each row and warns when a row
patched nothing, which needs no table, no LoRA metadata, and works on every
model family. base_model_family also stopped mining ss_sd_model_name: that is
the trainer's source filename, and reading substrings out of it labelled any
..._v1.safetensors as SD1.5 and anything containing xl as SDXL.

LM Studio Chat: reasoning returned in the server's own reasoning_content field
now reaches the thinking output. Only inline <think> tags were read, so with
gemma/qwen-style hybrids the whole reply landed in a field the node never
looked at and text came back blank. An empty answer now explains itself,
naming the max_tokens budget when the model ran out of room mid-thought.

Compare: the stage follows the node's height, not only its width. Its panel
declared a computeSize, and the widget layout gives any widget that defines one
a fixed height and leaves it out of the leftover-space split, so dragging the
node taller only added dead space under the image.

Pad Image / Load Image + Pad: a stitcher output, so an outpaint can put the
source back exactly. Padding now builds the same stitcher shape Crop For
Inpaint emits - the crop is simply the whole canvas - so the existing Stitch
Inpaint node serves both and no second stitch node has to exist. Appended
last, so saved workflows keep their links.

Settings menus: editing one row no longer reverts the others. Each save handed
back a value set rebuilt from stored defaults, silently replacing every other
row on a node whose workflow differed from those defaults.

LoRA templates popover: Save was clipped off the panel edge and each saved
row's delete x was stretched across the whole row - one blanket
.ausboss-lora-menu button rule outranked the specialized buttons inside it.
2026-08-17 20:47:27 -05:00
ausboss c15c6c9317 Implement the pack audit batch: on-node pad editors, feature gaps, removals
The audit compared every node against ComfyUI core and the major packs;
this lands its outcomes in one branch.

On-node visual editing (the old Codex-pack interaction, rebuilt):
- New Load Image + Pad: image loader with whole-edge pad dragging on the
  node canvas, align-to-multiple rounding, and a megapixel target that
  rescales the source before padding so the mask seam stays binary.
- Pad Image gains the same handle canvas, fed by an execution-time
  snapshot of its input; wireframe with diagnostic empty states before
  the first run. Widgets, outputs, and saved workflows unchanged.
- Image Crop + Rotate + Pad's compact panel is now a live stage - crop,
  pad, and rotate handles on the node, one shared implementation with
  the full-screen editor so the two surfaces cannot drift.

Feature gaps closed against the ecosystem:
- Crop For Inpaint: target_megapixels, selectable rescale_algorithm
  (recorded in the stitcher for the paste-back), and extend_* inputs
  that grow the frame itself for outpainting.
- Save Video: format choice - mp4 h264, mp4 h265, webm vp9 with Opus
  (resampled to 48 kHz); CRF drives all three.
- Load Video: every_nth thinning (fps output divides to match) and a
  max_frames cap that ends the decode early.
- LoRA Loader: saved stack templates behind a bar button, and a console
  warning when a LoRA's base-model family disagrees with the checkpoint.
- LM Studio Chat: history in/out for multi-turn chains and a json_schema
  widget for structured replies.
- Drop Shadow: multiply blend and a shadow_mask output. Align Image:
  offset outputs for un-aligning after sampling. Color Match:
  first_frame reference mode as a one-node video flicker fix.

Removed (backed up in git history): Select Frame Range and the Video
Bundle family - core ImageFromBatch and the core VIDEO wire now cover
both jobs. Dead NODE_ID module variables cleaned out of every node file.

455 Python tests, 216 JS tests, validate_nodes.py green on 19 node files.
2026-08-17 10:49:55 -05:00
ausboss 01e4c2120b Round of feedback fixes on the polish batch
Frame Chooser: the notice inflated the grid's auto flex basis and squeezed
the action buttons into the bottom clip - the grid now flexes from a zero
basis, the fixed rows never shrink, and idle gets a little more room.

LoRA Loader: the empty state is just 'No LoRAs yet' and is itself a click
target that adds a row and opens the picker.

Align Image: pad mode gained an anchor (pad_position), a fill choice
(replicate or color), and pad_color - all hidden outside pad mode, the
color field hidden until the color fill is chosen.

LM Studio Chat: the gear moved off the node's tail into an endpoint
toolbar - status light, Test (asks the server for its model list through a
new /ausboss/lmstudio/models route; green/red + toast), Models (pick from
the server's list straight into the model field), gear. A visible
unload_llm switch frees the LLM right after the reply via LM Studio's JIT
ttl, overriding the gear's idle timer.
2026-08-16 20:15:20 -05:00
ausboss 43cffbce0d Restyle the LoRA Loader around one control language and a gear menu
Full-width filled Add button, master-toggle bar with the gear, rows in an
inset stack with a dashed empty state, system-ui info glyph. The gear
holds default strength, strength step, separate model/CLIP strengths, the
trigger-word separator (a hidden widget the output honors), hide-extension,
thumbnail, and Civitai-lookup preferences.
2026-08-16 19:42:22 -05:00
ausboss 8ee79fedd8 Discard planted widget widths so panels track their node
The frontend sizes a DOM widget's wrapper as widget.width ?? node.width
(GraphView, useDomWidget updateWidgets), and LiteGraph's layout plants
widget.width during draws. Once planted it outranks the node width
forever: resize the node narrower and the wrapper keeps the old width,
parking the panel's right edge - and the LoRA row's strength and info
controls - outside the border. None of the containment guards could
reach it: border-box and the overflow clip act at the wrapper's edge,
which is precisely the thing that is too wide, and the minimum-width
paths only stop the node going BELOW a floor, not the wrapper staying
ABOVE the node.

Diagnosed from a console measurement in the reporting browser (wrapper
styled 470px on a 328px node, scale 1.21) and reproduced exactly by
planting widget.width = 470: overflow +183px. keepDomWidgetWidthAuto
defines width as a discard-writes accessor, so the frontend's lookup
stays on its node-width fallback for the life of the widget. All six
DOM panels call it, the policy test requires it, and the fix was
verified end-to-end in a live classic-renderer session: with the plant
attempted, the wrapper tracked the node through narrow, add-row,
linked, grow and shrink at -13px inside the border throughout.
2026-08-15 21:50:39 -05:00
ausboss e026bfb0cc Keep the LoRA panel inside its node
The strength box and info button hung past the node's right edge, two
gaps stacked: the panel's 10px padding rendered outside the width the
frontend allocates (content-box), and nothing declared a minimum width
to the modern layout - computeSize clamped the PANEL to 300px, but
without computeLayoutSize the NODE could be resized narrower, and the
row's fixed-width trailing controls kept their size while the picker
shrank to nothing.

Every other DOM panel in the pack already carries the full guard set -
border-box, an overflow clip, computeLayoutSize minWidth, minNodeSize -
through the shared video root or its own CSS; the LoRA loader was the
one that had none of it. It now matches the house pattern, sharing one
PANEL_MIN_WIDTH constant across every sizing path the frontends
consult so the panel and the node can never disagree about how narrow
is legal.

tests/panel_guards.test.mjs makes the pattern policy: every entry that
calls addDOMWidget must carry the guards or mount the shared root that
does. Against the pre-fix file it fails 3 of 5.
2026-08-15 21:11:51 -05:00
ausboss 460e946778 Polish the LoRA Loader rows, picker, and info card 2026-08-13 09:38:45 -05:00
ausboss d6875fcaf8 Add the LoRA Loader node with stacked rows and trigger words 2026-08-12 22:54:06 -05:00