Commit Graph
205 Commits
Author SHA1 Message Date
Æmotion StudioandClaude Opus 5.5 5c51f01877 Hide the frontend's $$ preview widgets from the Inspector rows
Load Image listed its internal $$canvas-image-preview widget as a row in
the Inspector and the pop-out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 11:43:54 -08:00
Æmotion StudioandClaude Opus 5.5 ebae4f904d Show pop-out run badges only in the workflow tab that ran
Run ids name other nodes in another workflow tab. The run state now says
whether the tab on screen is the one that ran, and is sent again with the
info a tab switch changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 11:20:26 -08:00
Æmotion StudioandClaude Opus 5.5 b325ea9d4c Fix the Inspector highlight recursing after a Nodes 2.0 toggle
The frontend wraps canvas.onDrawForeground again whenever its DOM widgets
mount, and the wrapper calls the highlighter's hook, which then called the
wrapper. The hook now keeps every function it replaced and goes one level
down per call, so each runs once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 11:20:26 -08:00
Æmotion StudioandClaude Opus 5.5 f27a2e20f0 Draw pop-out frames straight into the viewer window
Encoding each frame to PNG and posting it over the channel lagged the glass
and capped it at 30 fps. The viewer is a same-origin popup, so the glass now
draws each rendered frame into it in the same animation frame. The viewer
hands its window back through opener.postMessage after a ComfyUI reload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 10:46:07 -08:00
Æmotion StudioandClaude Opus 5.5 f748f7b333 Fix reconnecting, duplicated tabs and idle rendering in the pop-out viewer
- Listen for the viewer once ComfyUI is set up, so a viewer left open over a reload connects fully
- A duplicated tab starts its own session instead of sharing the viewer
- Ignore requests from a viewer that is not connected
- Stop the render loop while the glass is hidden and the viewer shows no frames
- Do not place the panel again on the 250 ms refresh
- Build output URLs from filename, subfolder and type only
- Viewer: skip undecodable frames, tolerate showPicker and blocked storage, keep the channel open on unload, shorten "Go to node…"

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 10:39:27 -08:00
Æmotion StudioandClaude Opus 5.5 7852897c1d Add Inputs and Outputs links to the pop-out viewer
Each slot lists the nodes it links to as chips that jump to them, and flags
required inputs with nothing connected. Links to a subgraph's own input or
output show as plain chips.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 10:14:49 -08:00
Æmotion StudioandClaude Opus 5.5 278f8504d8 Add output previews to the pop-out viewer
The shown node's live previews or last results appear as thumbnails under the
header, and the Output view shows one in place of the frame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 10:05:19 -08:00
Æmotion StudioandClaude Opus 5.5 94cdf46a72 Add queue progress and errors to the pop-out viewer
Forward ComfyUI's execution events as a throttled run message while the
viewer is connected: a run bar, node badges, an error banner and marked rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 09:53:54 -08:00
Æmotion StudioandClaude Opus 5.5 a7ea681e7a Add zoom, view modes and a resizable Inspector to the pop-out viewer
The pop-out can set the glass zoom, switch between Split, Glass and Info,
and resize the Inspector by dragging or with the arrow keys; the layout is kept per browser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 09:40:04 -08:00
Æmotion StudioandClaude Opus 5.5 1aad893f6f Make the pop-out navigate and edit like the Inspector
Add the Inspector's header, nav row, breadcrumb and searchable node picker,
run panel actions through UIManager.runAction, and bring the editors, copy
buttons and viewer keys in line with the Inspector.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 09:29:53 -08:00
Æmotion StudioandClaude Opus 5.5 9e78c29991 Make the pop-out viewer follow the ComfyUI palette
Send a snapshot of the palette tokens instead of a theme name, and draw the
viewer flat like the Inspector with SVG icons, switches and a stacked layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 09:14:46 -08:00
Æmotion StudioandClaude Opus 5.5 65a8ca74bc Use Blobs and createImageBitmap for pop-out frames
Frames are encoded with toBlob one at a time, stale decodes are dropped,
and fit and fullscreen use object-fit: contain so they no longer crop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 09:03:29 -08:00
Æmotion StudioandClaude Opus 5.5 bbbbd3e53a Make the pop-out show the Inspector's rows and edit through InfoPanel
InfoPanel builds the payload, applies the Inspector's edit guards and refreshes
the viewer on a 250 ms tick while connected, also when the glass is off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:59:55 -08:00
Æmotion StudioandClaude Opus 5.5 76bb34da1d Make the pop-out pair with its own tab and keep its connection
Each ComfyUI tab talks to its viewer on a session channel. Pings run only while
connected, status follows pings, and a hidden glass keeps feeding the viewer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:43:59 -08:00
Æmotion StudioandClaude Opus 5.5 305a163b10 Fix the pop-out viewer URL and escape its values
Resolve the viewer from import.meta.url, open it as a popup window, and
render data:image values and node ids without raw HTML or inline handlers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:33:17 -08:00
Æmotion StudioandClaude Opus 5.5 d239086c15 Add pop-out and close buttons to the sidebar header
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:57:36 -08:00
Æmotion StudioandClaude Opus 5.5 e4cee7214e Fix Nodes 2.0 support and glass title emphasis
- Paint Vue nodes under the glass from the DOM, since the canvas capture
  has none of them.
- Resolve the Inspector's hovered node from the Vue node element under
  the cursor, falling back to the canvas hit test in pan mode.
- Fit the node highlight to collapsed nodes in both modes.
- Draw Node Title Emphasis on the title bar instead of the first slot
  row, and skip nodes without a title bar such as Reroute.
- Fill the glass with the page background so it is not half-empty at
  the canvas edge or wrong at zoom 1.5 and above.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:57:36 -08:00
Æmotion StudioandClaude Opus 5.5 4b06ee92bb Update the Inspector panel look, navigation and editing
Restyle the panel on ComfyUI palette tokens and drop the built-in themes.
Add a header with Back/Forward, Prev/Next, Focus, Lock and a searchable
Go to node picker, a subgraph/group breadcrumb, and simplified modes:
Follow glass or Float, plus Sticky, Follow selection and Lock to node
(replaces Hold).

Fix widget edits (step2 steps, INT/FLOAT, commit on Enter/blur, undo),
subgraph lookups, orphaned dropdown menus, global arrow-key capture,
the pop-out editor, and remove Google Fonts loading and dead code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 06:47:21 -08:00
Æmotion StudioandClaude Opus 5.5 6799dc8fbb Fix sidebar collapse and glass media culling
- Make the sidebar tab wrapper fill the panel, and let the content keep its
  natural height when the parent has none, so the settings no longer collapse
  to a 16px scroller.
- Only measure DOM images and videos under the glass, so per-frame work scales
  with what is under the glass instead of all media on the page.
- Cap Virtual Zoom near 60 fps again, so high-refresh displays do not run two
  full graph draws every frame.
- Cull nodes with LiteGraph's boundingRect and keep collapsed nodes, so title
  bars and collapsed nodes in front of a preview stay on top in the glass.
- Drop the self-min on the title width and the dead pos/size guards.
- Remove the stale web/shared/settings.js build output.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:32:16 -08:00
Æmotion StudioandClaude Opus 5.5 79c7a1e9b5 Redesign the sidebar and add an About section with links
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:10:58 -08:00
Æmotion StudioandClaude Opus 5.5 f738714925 Make the Inspector panel toggle fully disable the panel
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 19:59:49 -08:00
Æmotion StudioandClaude Opus 5.5 818248facc Fix image and video previews in the magnify glass
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 19:47:32 -08:00
Æmotion Studio f4f55f8ad0 Merge pull request #31 from AEmotionStudio/palette/editable-color-picker-6542475088779009480
🎨 Palette: Editable Hex Code in Color Picker
2026-02-09 19:57:30 -08:00
Æmotion Studio a512c1838d Merge pull request #32 from AEmotionStudio/perf-optimize-node-rendering-1447179187303014016
⚡ Bolt: Optimize OffscreenRenderer node iterations
2026-02-09 19:57:09 -08:00
google-labs-jules[bot]andAEmotionStudio 09da6a1d7b feat(security): enhance DOM sanitization to strip dangerous URIs
Updated `sanitizeElement` to strictly remove whitespace and control characters from URI attributes before validation.
This prevents bypasses like `java\tscript:` in `href`, `src`, `action`, and `formaction` attributes.
Added comprehensive unit tests covering these bypass vectors.

Co-authored-by: AEmotionStudio <163354043+AEmotionStudio@users.noreply.github.com>
2026-02-10 03:35:57 +00:00
google-labs-jules[bot]andAEmotionStudio 49f1efeeb1 feat(security): sanitize cloned DOM elements to prevent XSS
Added `sanitizeElement` utility to recursively remove inline event handlers (on*) and javascript: URIs from HTML elements.
Applied sanitization in `MagnifyGlass.renderHtmlOverlays` when cloning nodes for the magnifying glass view.
Added unit tests to verify sanitization logic.

Co-authored-by: AEmotionStudio <163354043+AEmotionStudio@users.noreply.github.com>
2026-02-10 03:24:55 +00:00
google-labs-jules[bot]andAEmotionStudio 6e1740e72b feat(security): sanitize cloned DOM elements to prevent XSS
Added `sanitizeElement` utility to recursively remove inline event handlers (on*) from HTML elements.
Applied sanitization in `MagnifyGlass.renderHtmlOverlays` when cloning nodes for the magnifying glass view.
Added unit tests to verify sanitization logic.

Co-authored-by: AEmotionStudio <163354043+AEmotionStudio@users.noreply.github.com>
2026-02-09 23:28:33 +00:00
google-labs-jules[bot]andAEmotionStudio 07374a8306 feat(sidebar): add editable hex code input to color picker
- Replaced read-only hex code span with an editable text input in `createColorPicker`
- Implemented bidirectional sync between text input and color picker
- Added validation for hex codes and auto-correction on change/blur
- Ensured keydown propagation is stopped to prevent triggering global shortcuts
- Added aria-label for accessibility
- Updated unit tests to verify sync logic and event handling
- Added CSS styles for `magnify-color-preview` input to match UI design

Co-authored-by: AEmotionStudio <163354043+AEmotionStudio@users.noreply.github.com>
2026-02-09 23:27:45 +00:00
google-labs-jules[bot]andAEmotionStudio 85a0a6fa33 perf: optimize node rendering by caching visible nodes
Reduced redundant iterations over `app.graph._nodes` in `OffscreenRenderer`.
Implemented `getVisibleNodes` to calculate visible nodes once per frame (O(N)) and reused this list for text, title, and image preview rendering passes (O(M)).
This improves performance for large graphs by replacing multiple O(N) traversals with a single O(N) traversal followed by O(M) traversals where M << N.

Added unit tests in `tests/unit/OffscreenRenderer.test.ts` to verify node visibility culling logic.
Updated `.jules/bolt.md` with performance learnings.

Co-authored-by: AEmotionStudio <163354043+AEmotionStudio@users.noreply.github.com>
2026-02-09 16:18:12 +00:00
google-labs-jules[bot]andAEmotionStudio 6bd509bdf7 feat(sidebar): add editable hex code input to color picker
- Replaced read-only hex code span with an editable text input in `createColorPicker`
- Implemented bidirectional sync between text input and color picker
- Added validation for hex codes and auto-correction on blur
- Ensured keydown propagation is stopped to prevent triggering global shortcuts
- Added aria-label for accessibility
- Updated unit tests to verify sync logic and event handling
- Added CSS styles for `magnify-color-preview` input to match UI design

Co-authored-by: AEmotionStudio <163354043+AEmotionStudio@users.noreply.github.com>
2026-02-09 16:09:24 +00:00
Æmotion Studio 274e562f16 fix: use pointer events for glass drag to fix Firefox/Brave canvas corruption 2026-02-07 19:48:09 -08:00
Æmotion Studio 9359a42f3b fix: prevent LiteGraph canvas state corruption after glass drag 2026-02-07 19:38:35 -08:00
Æmotion Studio 9e0da38f75 fix: rewrite glass drag to use pointer capture for reliable cursor reset 2026-02-07 19:13:09 -08:00
Æmotion Studio 79cb020c85 fix: glass drag cursor stuck in grab mode after release 2026-02-07 19:04:09 -08:00
Æmotion Studio e08a0b257b fix: ghost cursor interactions persisting after hiding info panel 2026-02-07 18:55:42 -08:00
Æmotion Studio 6db4b2a576 Merge pull request #29 from AEmotionStudio/bolt/layout-thrashing-fix-5688373778482661560
⚡ Bolt: Prevent layout thrashing in magnifier update loop
2026-01-18 21:20:05 -08:00
Æmotion Studio 089098df90 Merge pull request #30 from AEmotionStudio/sentinel/fix-xss-bypass-uimanager-7199572335326487852
🛡️ Sentinel: [HIGH] Fix XSS vulnerability in UIManager by removing isHtml bypass
2026-01-18 21:19:54 -08:00
Æmotion Studio ad0cc473bb Merge pull request #28 from AEmotionStudio/palette-accessibility-focus-2231388305888170951
🎨 Palette: Improve keyboard accessibility for sidebar settings
2026-01-18 21:13:06 -08:00
google-labs-jules[bot] f6a9e5faa7 security(ui): eliminate XSS vector by replacing isHtml bypass with strict specialType
Removed the `isHtml` flag support in `UIManager`, which allowed bypassing HTML escaping.
Replaced it with a `specialType` mechanism (specifically 'focus-node') to render trusted
HTML structures internally while ensuring dynamic values are always escaped.
Updated `Security.test.ts` to verify the fix and prevent regression.

Fixes: Potential XSS vulnerability via unchecked HTML injection.
2026-01-19 05:05:28 +00:00
google-labs-jules[bot] bb9c545eda perf: prevent layout thrashing in magnifier update loop
Refactors `MagnifyGlass.updateMagnifiedView` and `calculateSourceRegion` to accept an optional cached `DOMRect`. This allows `EventHandler` to pass the canvas dimensions it read before updating the glass position, preventing a forced synchronous reflow (Read-Write-Read cycle) that was previously occurring on every mouse move frame.

Optimizes the hot path for mouse movement and magnifier updates.
2026-01-19 05:00:41 +00:00
google-labs-jules[bot] 1fe803d8fb feat: improve keyboard accessibility for sidebar settings
- Add visible focus indicators for interactive elements in the sidebar
- Add aria-valuetext to sliders to announce values with units
- Update journal with accessibility learnings
2026-01-19 04:41:54 +00:00
AEmotionStudio acc96254a6 fix: persist menu toggle button across Vue re-renders using MutationObserver 2026-01-18 20:40:38 -08:00
AEmotionStudio 8954d2d44d perf: disable sourcemaps, remove build artifacts, and adjust default glass Y offset 2026-01-18 18:24:00 -08:00
AEmotionStudio 2927c140dc feat: sync popout widget edits and improve inspector parameter visibility
- Implemented 'onWidgetEdit' listener in 'InfoPanel' to force refresh when popout widgets change.
- Refactored 'NodeDataExtractor' to display all widgets in the inspector (matching popout behavior) and removed aggressive deduplication.
- Fixed theme update logic in 'UIManager' to correctly handle hyphenated theme names.
- Enhanced combo box editing in 'popout-viewer.html' with better selection and blur handling.
2026-01-18 11:51:41 -08:00
AEmotionStudio 8bdfbedf46 feat: add new themes and enhance popout viewer interaction
- Added 'Obsidian', 'Obsidian Dark', and 'Milk White' themes to Info Panel and PopOut viewer.
- Improved theme detection in 'StateManager' to support new themes.
- Implemented button widget support in PopOut viewer with 'button-click' event handling.
- Enhanced widget options handling in 'PopOutManager' for combo widgets.
- Updated dropdown accessibility tests.
2026-01-18 11:02:06 -08:00
AEmotionStudio cb589761c8 feat: add grid layout support for batch images in OffscreenRenderer
- Updated `drawNodeImages` to render multiple images from `node.imgs[]` in a grid.
- Implemented aspect-ratio-preserving centering for each image within its grid cell.
- Added configurable gap between images in the grid.
2026-01-18 01:24:21 -08:00
AEmotionStudio 8213a086ab feat: add inline action buttons to inspector and improve widget handling
- Added support for inline action buttons in the inspector panel.
- Implemented `InlineControlFactory.createInlineButton` to execute widget callbacks.
- Enhanced `WidgetSyncManager` to detect 'button' widgets via type or heuristics.
- Updated `UIManager` and `NodeDataExtractor` to process actionable widgets.
- Added styles for inline action buttons.
- Added `Escape` key handler to slider widget editor.
- Refactored canvas coordinate calculations in `MagnifyGlass` for better accuracy.
2026-01-18 00:21:06 -08:00
Æmotion Studio 093bde19e0 Merge pull request #25 from AEmotionStudio/bolt/optimize-render-overlays-9313858051447850514
⚡ Bolt: Optimize renderHtmlOverlays loop
2026-01-17 22:15:16 -08:00
Æmotion Studio 75d6285678 Merge pull request #27 from AEmotionStudio/sentinel-fix-webgl-xss-17500734846144735282
🛡️ Sentinel: [MEDIUM] Fix potential XSS in WebGL error toast
2026-01-17 22:12:13 -08:00
google-labs-jules[bot] dd4e34df6f fix(security): prevent XSS in WebGL error toast by using DOM API
- Refactor `showWebGLError` to use `document.createElement` instead of `innerHTML`
- Replace inline `onclick` handler with `addEventListener` for CSP compliance
- Add unit test to verify XSS prevention and button functionality
2026-01-18 04:50:44 +00:00