Three related improvements to the file selector popups:
- The Load Existing flake picker opens at img/<family_folder>/ derived
from the active node's selected family (instead of root) and shows
models/flakes/<rel> in the breadcrumb. The up arrow can still walk
past the family folder for cross-family use.
- The generic file browser (LoRAs, checkpoints, flakes) header now
renders models/<type>/<rel>/ instead of a bare /, so the user knows
exactly which directory the listing came from.
- Search inside the Load Existing picker is now scoped to the current
folder, matching the breadcrumb. Searching from the family folder
no longer pulls in unrelated flakes from elsewhere.
- The empty-state message also shows up when navigating into an empty
family folder (previously only at the root).
Open the LoRA file browser at img/<family_folder>/ instead of the
loras root, derived from the active modal's family dropdown (create
mode) or the existing flake's stored path prefix (edit mode).
The file browser also now falls back to the loras root if the
requested directory doesn't exist on disk, so the UX is forgiving
when a family folder hasn't been populated yet.
When the user selects a LoRA on a flake and no cover has been picked
yet, fetch the LoRA's sibling image (same basename, .png/.jpg/.webp/...)
from models/loras/ and use it as the flake's default cover.
Triggers from all three LoRA selection paths (file browser, dropdown
change, dropdown blur) but only for the first LoRA on the flake, and
only when no cover file has been chosen by the user. Adds a server
endpoint /flakes/lora_sibling_image mirroring the existing checkpoint
sibling endpoint, with a shared helper.
The Modify and Remove buttons that appear on hover over a selected
preset were 24x24 with small icons, making them awkward to target.
Bump to 36x36 with 20px icons, larger shadow and gap, and add a
per-button mouseenter scale + brighter background so they feel
clickable when targeted.
The Family dropdown was too small to comfortably click on the Flake
Stack node and clicks were leaking to the LiteGraph canvas on the
Flake Model Preset node, where they triggered the underlying preset
combo. Increase font size, padding, and min-height across all four
widgets, and stop mousedown/click propagation so the canvas no longer
intercepts dropdown opens.
Also introduce a shared FAMILY_FOLDERS / familyFolder helper in utils
to be used by upcoming path-aware features.
- Add openPresetPicker() that shows presets in a searchable grid with
cover images, matching ComfyUI Load Image dropdown styling.
- Rewrite FlakeModelPreset widget: remove dropdown, add 'Select Preset'
and 'Create Preset' buttons. When selected, show cover image with
preset name and hover buttons for Remove/Modify.
- Update FlakeModelCombo widget: remove dropdown, use the visual picker
when clicking 'Add Preset'.
Fixes#54, Fixes#55, Fixes#57
Adds cache-busting to the preset list fetch and makes widget DOM
updates more robust by trying multiple element selectors. Also
forces a canvas redraw so existing nodes reflect the new preset
without requiring a ComfyUI reload.
Fixes#56
Adds String() coercion and null-safety to the file browser search
filter to prevent 'No matches' when entries have unexpected types.
Removes redundant keyup listener since input already covers text changes.
Fixes#58
- Add /flakes/checkpoint_sibling_image endpoint to find an image next to
the selected checkpoint with the same basename.
- In the preset editor, auto-load that image as cover when a checkpoint is
selected, but only if no cover already exists.
- Poll preset widget value in FlakeModelPreset so cover updates immediately
when the user swaps presets via the dropdown.
Closes#52
- Add dblclick handler on file rows to immediately select and close.
- Add keyup fallback for search filtering.
- Add Enter key support to select the first matching file.
- Focus search input when dialog opens.
Closes#50
- Increase select and option font-size from 10px to 13px
- Increase height from 22px to 26px to fit larger text
- Fix asymmetric padding (0 18px 0 4px → 0 18px) so selected text is
truly centered across the full width, not offset by the chevron
- Add text-align:center to each <option> so open dropdown items are centered
Closes#47
- Stop filtering out already-added flakes from the picker list
- Add double-click handler on flake thumbnails to select+close immediately
- Add double-click on folder items to navigate into them
- Update both FlakesStack and FlakesCombo handleLoad call sites
Closes#46
- Model Preset: move URL input above checkpoint path selector
- Model Preset: make toggle button bigger (14px) with flex centering
- Model Preset: make link icon blue (#4a9eff)
- Flake LoRA editor: same bigger toggle button and blue link icon
Closes#45
- Replace module-level _BROWSE_ROOTS with dynamic _get_browse_roots() called
at request time. This fixes the Empty folder bug caused by evaluating paths
before ComfyUI has finished registering them.
- Search ALL configured roots for a given type and merge/deduplicate results,
matching the behavior of folder_paths.get_filename_list().
- Add security check per-root so symlink escapes are skipped rather than fatal.
Closes#44
- openFileLoadPicker now accepts {flakes, directories} and builds a folder tree
- Folders rendered as large 📁 icons with labels; clicking navigates into them
- Breadcrumb path bar shows current location; click to return to root
- Up-folder item (..) shown when inside a subfolder
- Search bar filters all flakes globally regardless of folder
- Exclude model_presets/ from both directory tree and search results
- Update both FlakesStack and FlakesCombo handleLoad call sites
Closes#43
- Replace defaultPath: 'img' with '' for both checkpoints and loras pickers
so they open at the model root instead of a non-existent img/ subfolder
- Add real-time search bar to openFileBrowser overlay filtering files/folders
in the current directory by name
- Show 'No matches' when search yields no results
Closes#42
- Save: build ordered dict by iterating activeFields so YAML keys follow
the user-dragged order
- Load: derive activeFields from Object.keys(data) order (Python preserves
insertion order via yaml.safe_dump sort_keys=False)
- Fallback appends any fields not present in the key order
Closes#41
- Add makePanelDropdown helper with dark background (#1a1a1a), #333 border,
4px radius, 10px font, 22px height — matching makeSmallValueSlider
- Hide native arrow with appearance:none and add custom SVG chevron
- Center text edge-to-edge using text-align-last:center
- Options now share the same 10px font size as the selected value
- Replace inline select creation in rebuildPanel with makePanelDropdown
Closes#40
- Extract loadOptions() to fetch flake metadata in the background on init
- Call loadOptions() immediately so triangle button shows for flakes with options/loras
- Remove right-click handler that was used as a workaround
Closes#39
- Replaces file-browser-based load picker with a dedicated overlay
- Shows thumbnail grid with cover images (background-size:cover)
- Search bar filters flakes by name in real time
- Click to select, Cancel / Select buttons in footer
Closes#32
- Add proper dragstart/dragover/drop/dragend handlers to field drag handles
- Visual drop indicator shows between fields during drag
- Reorders activeFields array and re-renders on drop
Closes#36
- Model Preset: checkpoint URL hidden by default, toggle with triangle button
next to Checkpoint label. Blue link icon appears when URL is populated.
- Flake LoRA: replace [...] button with triangle toggle. Header shows LoRA name
and blue link icon when URL is populated. Full URL no longer shown in header.
Closes#33, closes#34
Backend:
- Add LoraEntry dataclass with name, url, path, strength
- Flake dataclass now has loras[] list; legacy lora_path/strength kept for compat
- _flake_from_raw parses both new multi-LoRA and legacy single-LoRA formats
- resolve() applies multi-LoRA strength overrides from grid entries
- full_flake_node.py applies all LoRAs in order
Frontend:
- Flake edit modal: each LoRA gets its own section with name, URL, path picker,
strength slider. +Add LoRA button to add more. [...] button edits name/URL.
- Grid dropdown: shows one strength slider per LoRA, labeled with LoRA name
- Grid entries store loras[] array of strengths for overrides
- Backward compatibility: old entries with single strength auto-converted
Closes#30
- Replace inset box-shadow with absolutely positioned indicator at left:-3px
so the blue line appears in the gap between items rather than on the item
- Add dragover/drop handlers to the Add block for dropping after the last item
- Clear all indicators on drag end
Closes#28
- Update has_lora flag after editing/saving a flake (both defaultUpdated and saved cases)
- Update has_lora after overriding pending changes to disk
- Fix incorrect lora_path field name: raw YAML uses 'path', not 'lora_path'
Closes#27