41 Commits
Author SHA1 Message Date
rubz 6f8ad8320b fix: complete Nodes 2.0 compatibility for custom widgets, bump to 1.1.1
Simplifies the preset-chip picker (Smart Resize / Smart Batch Resize)
to a single canvas implementation - drops the dual DOM-widget path,
so chips stay positioned correctly under "Longest side (px)" in both
classic and Nodes 2.0 rendering instead of jumping to the bottom of
the node.

Adds a shared setWidgetVisible() helper so dynamic show/hide (Counter
start, the hidden customtext output on every node) actually works
under Nodes 2.0's Vue reactivity - it previously only worked in
classic canvas mode.

Fixes two silent Nodes 2.0 rendering bugs: widgets only repaint via
their own triggerDraw(), not setDirtyCanvas(), so the active preset
chip and status-box text were going visually stale after an update
even though the underlying value was correct. And Nodes 2.0's
WidgetLegacy bridge permanently stamps a widget.width that classic
mode's own click hit-test then reads forever after - once a node had
ever rendered under Nodes 2.0, classic mode silently lost clicks on
the right side of a wide node. Both fixed by keeping widget state in
sync on every draw() instead of trusting it to survive across
renderer switches.

Also centers section-divider labels with flanking lines (was
label-left/line-right) and brightens the line color, which had
become nearly invisible under Nodes 2.0's extra canvas scaling.

README: reorders node sections into actual pipeline order (Prompt
Controller -> Profile Switch -> Resize -> Resolution Multiplier ->
Batch Resize, standalone tool last instead of mid-list), adds a
Nodes 2.0 compatibility screenshot, and refreshes the Smart Batch
Resize screenshot to match its current UI.
v1.1.1
2026-08-13 20:45:33 +02:00
rubz c6c26a35fa fix: read live node width in draw() instead of a stale LiteGraph cache; cache-bust shared module imports
- LiteGraph caches a widget's .width the first time it lays a custom-typed
  widget out and reuses that cached value on every later draw() call. For a
  divider/status/preset widget added before the node reaches its final size,
  that cached width goes stale and never updates, making section-divider
  lines and the status box stop partway across the node instead of spanning
  it, and clipping/unevenly sizing the preset chips. All three shared
  widgets now read node.size[0] directly in draw() instead of trusting the
  widgetWidth parameter, which sidesteps the stale cache entirely.
- Add a ?v=2 query string to every import of the shared/*.mjs modules.
  aiohttp's static file server doesn't send Cache-Control: no-store for
  these (unlike the top-level registered extension .js files), so browsers
  were free to keep serving an old cached copy even across a hard reload.
  A versioned import URL forces a fresh fetch regardless of cache state.
2026-08-13 16:29:25 +02:00
rubz dd0c4d9b2e fix: make CraftKit's custom-drawn JS widgets render correctly under Nodes 2.0
- Add js/shared/{nodes2,canvas_widgets,preset_picker_widget}.mjs: widgets
  registered with type "button" get hijacked by ComfyUI's Vue widget
  registry (Nodes 2.0), which renders a generic button showing the raw
  internal widget name instead of calling our draw(). Dividers/status
  boxes now use type "custom" via addCustomWidget, which correctly falls
  through to the legacy-canvas bridge in both renderers. The interactive
  preset-chip picker is dual-path: canvas+hit-testing in classic mode,
  real <button> elements via addDOMWidget in Nodes 2.0 (mirrors how
  ComfyUI-Pixaroma solved the same problem for its own widgets)
- Rewire smart_batch_resize.js, smart_resize.js, smart_profile_switch.js,
  smart_prompt_controller.js to use the shared factories, removing the
  duplicated divider/status/preset-chip code that existed across them
- Fix a save/reload regression found during verification: repositioning
  the Nodes 2.0 preset-chip DOM widget into the middle of node.widgets
  after configure() has run desyncs Vue's value-to-row binding for every
  later widget (values appear shifted by one row, though the saved JSON
  itself is correct). The DOM widget is no longer repositioned under
  Nodes 2.0; classic mode is unaffected and keeps the original placement
2026-08-07 11:07:54 +02:00
rubz 254358790f readme cleaned up 2026-07-28 12:21:35 +02:00
rubz 691d0e6df5 swap image 2026-07-28 00:39:08 +02:00
rubz 25f80d8e33 fix: reorganize Smart Batch Resize into labeled sections; bump to 1.1.0
- Add section-header dividers (Resize/Filename/Output Location/Output
  Format/Options) to js/smart_batch_resize.js — the node grew to ~19
  widgets after the review fixes and needed grouping to stay scannable
- Move `delimiter` next to the other filename-building fields, and
  reorder Output Location/Output Format/Options into a more logical
  flow. This changes the node's widget order — workflows saved before
  this change will need the node re-placed once (values shift on load)
- Update README: new screenshot, full input table rewritten to match
  the new field order and the alpha_mode/output_format/quality/
  preview_limit/upscale_if_smaller additions, "Why these nodes?" bullet
  on the transparency handling
2026-07-28 00:28:12 +02:00
rubz f695c67ff1 chore: tighten error handling and dedupe a magic string from the nitpick pass
- Narrow the ProgressBar import guard to ImportError only, with a comment explaining why it stays (the module is imported standalone by the test suite outside a live ComfyUI)
- Extract the CRAFTKIT_DIALOG_ERROR: sentinel into a shared constant instead of three separate literals, use str.removeprefix
- Note that .avif/.heic can also fail on re-encode (with output_format=keep_source), not just decode
2026-07-27 21:51:08 +02:00
rubz 50af1e743d fix: nitpick cleanups from code review (N-23 through N-32)
- os module imported properly instead of __import__("os")
- browse_folder distinguishes a real COM/dialog failure from a user cancel
- fix Marshal.PtrToStringUni + leak-safe cleanup in the folder-picker COM call
- lock browse_folder so two concurrent clicks can't open two dialogs
- drop redundant int(round()) in SmartResolutionMultiplier
- unify "CraftKit —" docstring prefix across nodes
- comment OUTPUT_NODE=True on the status-label nodes so it isn't "cleaned up" later
- add .jfif/.avif/.heic to SmartBatchResize's supported extensions, document non-recursive scanning
- add a progress bar to SmartBatchResize (degrades gracefully outside a live ComfyUI)
- add readme/requires-python and a dependency-rationale comment to pyproject.toml
2026-07-27 21:40:18 +02:00
rubz 1750601338 fix: stale-skip detection, alpha/format controls, and remaining Minor issues from code review
- SmartBatchResize: only skip existing files if their actual dimensions still match current settings (was serving stale sizes after a settings change)
- SmartBatchResize: add alpha_mode (auto/flatten/keep) and output_format (keep_source/png/webp/jpg) with a quality control, replacing the undocumented silent alpha loss
- SmartProfileSwitch: warn when index is out of range instead of silently reading as slot 1 (catches an unconnected Smart Prompt Controller)
- SmartProfileSwitch JS: guard widget reorder against missing lookups, append rather than drop unrecognized widgets
- SmartPromptController JS: add the serialize override the other node JS files already have, preventing widget value drift
- Remove js/smart_batch_controller.js (dead code, referenced a node class that no longer exists)
- Untrack .claude/worktrees/* accidentally committed earlier; add .claude/ to .gitignore
2026-07-27 20:20:41 +02:00
rubz 6fa40684ac fix: stale-skip detection, alpha/format controls, and remaining Minor issues from code review
- SmartBatchResize: only skip existing files if their actual dimensions still match current settings (was serving stale sizes after a settings change)
- SmartBatchResize: add alpha_mode (auto/flatten/keep) and output_format (keep_source/png/webp/jpg) with a quality control, replacing the undocumented silent alpha loss
- SmartProfileSwitch: warn when index is out of range instead of silently reading as slot 1 (catches an unconnected Smart Prompt Controller)
- SmartProfileSwitch JS: guard widget reorder against missing lookups, append rather than drop unrecognized widgets
- SmartPromptController JS: add the serialize override the other node JS files already have, preventing widget value drift
- Remove js/smart_batch_controller.js (dead code, referenced a node class that no longer exists)
- Untrack .claude/worktrees/* accidentally committed earlier; add .claude/ to .gitignore
2026-07-27 20:15:24 +02:00
rubz c6f6914488 fix: batch collapse, memory blowup, resize rounding, and 8 more Should-Fix issues from code review
- Reject use_original_name=False + use_counter=False (all files collapsed to one output name)
- Add preview_limit to cap in-memory preview tensors (was holding entire batch as float32)
- Recover from per-file failures instead of aborting the whole batch
- Fix _calc_new_size overshoot past longest_side and off-by-one truncation
- Add upscale_if_smaller to SmartBatchResize to match SmartResize
- Clip pixel values before uint8 cast (was wrapping on overflow)
- Support CUDA tensors and RGBA/grayscale images in SmartResize
- Handle empty batches; derive width/height from the actual output tensor
- Require POST + loopback/origin check on the browse_folder endpoint (CSRF)
- Add subprocess timeout to the folder picker dialog
- Isolate the browse_folder route registration so import failures don't take down all nodes
- Validate folder_custom against path traversal and self-overwrite
- Replace IS_CHANGED=NaN with a folder-listing hash so unrelated graph runs can still cache
2026-07-27 18:42:54 +02:00
rubz e7caae4a3e fix: SmartBatchResize caching, EXIF rotation, skip-all crash, docstring; bump to 1.0.3
- add IS_CHANGED so new/removed files in input_folder are picked up without a widget change
- fix EXIF orientation ignored on load (phone photos were saved rotated)
- when all files are skipped, load existing resized output from disk instead of returning
  an empty list — fixes IndexError downstream (e.g. Preview Image) and removes the
  misleading "No images processed" error
- fix stale docstring in Smart Resolution Multiplier (SeedVR2's resolution input, not max_resolution)
v1.0.3
2026-07-06 11:39:54 +02:00
rubz 4b85129857 update icon: dark maroon/orange to match banner colors v1.0.2 2026-07-02 11:37:13 +02:00
rubz c5ccc7799d tweak README structure: dedupe title, keep H1 for SEO
- crop node screenshots (removed embedded title banners, they duplicated the markdown headings)
- briefly dropped the H1 + tagline below the banner (seemed redundant with banner text), then restored it — real text still matters for SEO/accessibility, image alt text alone isn't enough
2026-07-01 13:00:10 +02:00
rubz 155144a018 polish README: images up top, full-width, custom value + standalone notes
- move all node screenshots above the description text, full-width (100%)
- note that Longest side accepts a typed custom value, not just the presets
- clarify Smart Batch Resize works standalone (no wiring needed, just folder + Run Batch)
2026-07-01 12:53:00 +02:00
rubz 6a3dbaea98 replace svg 2026-07-01 12:35:44 +02:00
rubz c0609cfc85 add Smart Profile Switch, fix folder picker, README overhaul, v1.0.2
- rename Smart Category Config → Smart Profile Switch 🧩 (code, JS, locales, demo workflow)
- add banner.svg and embed it at the top of README
- replace fragile OpenFileDialog folder-browse hack with native IFileDialog/FOS_PICKFOLDERS picker — fixes wrong-folder bug on single-click select
- flip Smart Resize's upscale_if_smaller default to true — node now resizes to target by default, as the name implies
- add width/height source tooltip to Smart Resolution Multiplier's image input
- fix stale widgets_values in smart_batch_resize_demo.json (10 fields → 13 after prefix/counter fields were added)
- full README rewrite: correct inputs/defaults/outputs for all 5 nodes, new Smart Profile Switch section, Example workflows section, expanded "Why these nodes?"
- add new example workflow (seedvr2_smartresize_demo.json), updated screenshots
- add assets/*.ai to .gitignore
- bump version to 1.0.2
2026-07-01 12:33:32 +02:00
rubz f54122f895 polish: SPC result display, SmartResize presets, README rewrite, error messages 2026-06-30 10:02:55 +02:00
rubz 4231615d52 bump version to 1.0.1 2026-06-30 00:10:31 +02:00
rubz 2008eccd71 clean up SmartBatchResize outputs and minor polish
- remove filenames and output_paths outputs (not actionable in ComfyUI)
- keep images and count
- update locales and example workflow to match
2026-06-30 00:07:49 +02:00
rubz 9bf268bf1b Add Browse folder button + longest_side presets to Smart Batch Resize
- Browse folder button: native Windows folder picker via PowerShell
  (TopMost owner form + OpenFileDialog for modern Explorer view)
- longest_side preset chips (512/768/1024/1536) drawn on canvas,
  active preset highlighted
- Reorder inputs into logical groups (input → resize → naming → folder → options)
- README: describe Smart Batch Resize disk-save / filename-preservation behaviour
2026-06-29 22:02:37 +02:00
rubz e218330869 fix README installation instructions: Craftopia → CraftKit 2026-06-29 15:40:56 +02:00
rubz fd90def305 add registry publishing setup 2026-04-08 23:54:25 +02:00
rubz cb7da507e4 updated catagory 2026-04-08 23:09:39 +02:00
rubz cf94f2aa8e renames Readme 2026-03-23 09:18:11 +01:00
rubz 7b49cbe603 changed repo name 2026-03-23 09:09:42 +01:00
rubz 32c8c85bd5 fixed dreadme images en renaming v1.0.0 2026-03-23 01:11:42 +01:00
rubz 6a47c67c25 rebranded en updated prompt controler 2026-03-22 23:06:30 +01:00
rubz eeb365bc0a fixed a bug 2026-03-22 01:15:18 +01:00
rubz dd70f0b118 4 nodes 2026-03-22 00:29:53 +01:00
rubz c8ce133fad commit 2026-03-22 00:29:25 +01:00
rubz 2421ffd343 updated init correct 2026-03-22 00:26:05 +01:00
rubz addba92a81 added a node: smart_batch_controller.py 2026-03-22 00:18:46 +01:00
rubz 4dd47aa2c6 Refactor SmartBatchResize parameters for clarity and consistency in suffix handling 2026-03-04 16:04:34 +01:00
rubz 745bc13b6d Refactor SmartBatchResize input parameters and enhance output naming conventions 2026-03-04 15:30:26 +01:00
rubz a3da1123f4 added delimiter before filename 2026-03-04 15:01:18 +01:00
rubz 21c80dd971 Refactor SmartBatchResize to enhance filename and subfolder suffix handling 2026-03-04 14:57:32 +01:00
rubz a28c35fac5 Add delimiter and auto-suffix options for filename and output folder in SmartBatchResize 2026-03-04 14:37:32 +01:00
rubz 98dbd02632 Update README and refactor node categories to Craftopia
- Revised README to clarify node functionalities and typical use cases.
- Changed category for SmartResize, SmartBatchResize, and SmartSizeMultiplier nodes to "Craftopia".
2026-03-03 13:00:32 +01:00
rubz aa2e2bd16c uploaded SmartResize nodes 2026-03-03 12:13:32 +01:00
rubz 3a64d873ab Initial commit 2026-03-03 11:53:51 +01:00