Commit Graph
45 Commits
Author SHA1 Message Date
Æ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
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
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
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
google-labs-jules[bot] 717b823d20 fix(ui): prevent race conditions and focus hijacking in dropdown 2026-01-17 07:42:29 +00:00
google-labs-jules[bot] 3ab3e4a02e fix(ui): fix event listener leak on dropdown re-open 2026-01-17 06:31:06 +00:00
google-labs-jules[bot] 2786436e4a fix(ui): restrict keyboard handler to focused dropdown 2026-01-17 05:56:45 +00:00
google-labs-jules[bot] d8ee89ca02 fix(ui): prevent event listener leak in dropdown selection 2026-01-17 05:25:38 +00:00
google-labs-jules[bot] 55c7114fa0 feat(ui): add keyboard navigation and ARIA to node selector dropdown 2026-01-17 04:43:13 +00:00
Æmotion Studio 40c70bdba4 Merge pull request #21 from AEmotionStudio/bolt/optimize-render-overlays-1998194206652878890
⚡ Bolt: Optimize rendering loop by hoisting getBoundingClientRect
2026-01-15 22:28:43 -08:00
Æmotion Studio 9092cfd0ac Merge pull request #20 from AEmotionStudio/sentinel-validation-fix-2381716828487744723
🛡️ Sentinel: [MEDIUM] Add input validation for info panel settings
2026-01-15 22:28:27 -08:00
google-labs-jules[bot] 6d5791eb3c perf: hoist getBoundingClientRect out of render loop
- Moves `litegraphCanvas.getBoundingClientRect()` call outside the widget loop in `renderHtmlOverlays`.
- Reuses the `dpr` calculated at the top level.
- Adds regression test `tests/unit/MagnifyGlassRenderOptim.test.ts`.

Improves rendering performance by reducing forced reflows during magnification.
2026-01-16 04:57:01 +00:00
google-labs-jules[bot] fe771ef87e feat(security): implement strict input validation for InfoPanel settings
Add validation for all InfoPanel settings loaded in StateManager to prevent
injection of invalid values (e.g. out-of-bounds numbers, invalid colors).
This mitigates risks of degraded stability or potential injection via
manipulated settings storage.

- Add validateNumber, validateColor, validateStringOption helpers
- Update StateManager.loadSettings to validate all keys
- Add unit tests for validation logic
2026-01-16 04:45:01 +00:00
google-labs-jules[bot] d7f6b99051 feat(a11y): associate labels with form controls in sidebar
- Export form creation helpers for testing
- Add unique ID generation for sliders, selects, and color pickers
- Associate labels with inputs using `htmlFor`
- Add unit tests to verify accessibility attributes
2026-01-16 04:37:17 +00:00
Æmotion Studio 6ce27c62a3 Merge pull request #17 from AEmotionStudio/palette/accessible-toggles-10339516210084959098
feat: make sidebar toggle switches accessible
2026-01-14 21:41:39 -08:00
google-labs-jules[bot] bc872f58f6 fix: ensure keyboard events stop propagation in toggles
- Pass event object to handleToggle from keydown listener
- Ensure stopPropagation() is called for keyboard events
- Maintain consistency between mouse and keyboard interaction behavior
2026-01-15 05:33:39 +00:00
google-labs-jules[bot] b73705a106 fix: synchronize aria-checked state in settings panel
- Update Require Alt Key toggle sync to include aria-checked attribute
- Update Reset Position button to clear aria-checked on Follow Cursor toggle
- Add regression tests for sidebar interaction state synchronization
2026-01-15 05:19:31 +00:00
google-labs-jules[bot] 1109ca9f06 feat: make sidebar toggle switches accessible
- Add `role="switch"` and `aria-checked` to toggle elements
- Add `tabIndex="0"` for keyboard focus
- Add keyboard event listeners for Enter and Space keys
- Add `aria-labelledby` to associate toggles with their labels
- Enable toggling by clicking the label text
- Export `createToggle` for testing
- Add unit tests for accessibility and interaction logic
2026-01-15 04:59:19 +00:00
google-labs-jules[bot] f928f848e5 feat(security): add input validation for configuration settings
- Implement `validateNumber` and `validateColor` in `ConfigManager`.
- Clamp numeric settings (zoom, size, borders) to safe ranges.
- Validate color settings against hex regex.
- Update `ConfigManager` unit tests to cover validation logic.

This enhancement prevents invalid configuration states and potential stability issues caused by malformed or extreme setting values.
2026-01-15 04:56:22 +00:00
google-labs-jules[bot] 5e5c49a99c fix(security): handle non-string inputs in escapeHtml to prevent crashes
- Update `escapeHtml` to explicitly coerce input to string
- Handle null/undefined values safely
- Add unit tests for non-string input types (numbers, booleans, objects)
2026-01-14 05:56:33 +00:00
google-labs-jules[bot] 4cf3e9f50b fix(security): allow trusted html in info panel while sanitizing user input
- Add `isHtml` flag to `Focus Node` button to bypass escaping
- Update `UIManager` to check for `isHtml` flag before formatting/escaping
- Add regression tests for trusted HTML rendering logic
2026-01-14 04:56:25 +00:00
google-labs-jules[bot] 416090376e feat(security): sanitize user input in info panel to prevent XSS
- Add `escapeHtml` utility to `src/shared/utils.ts`
- Sanitize rendered values in `src/info-panel/ValueFormatter.ts`
- Sanitize node titles, types, and labels in `src/info-panel/UIManager.ts`
- Add unit tests verifying XSS prevention in `tests/unit/Security.test.ts`
2026-01-14 04:38:38 +00:00
AEmotionStudio ac8bda31ac feat: Introduce NodeSelector for fetching, sorting, and searching ComfyUI nodes. 2026-01-05 15:50:52 -08:00
AEmotionStudio 3804d41ef1 feat: Add ability to hide magnify glass preview and refine info panel visibility based on glass state. 2026-01-05 12:19:46 -08:00
AEmotionStudio 69926fca2b feat: Implement offscreen rendering and remove debug mode setting from defaults. 2026-01-03 17:33:55 -08:00
AEmotionStudio 638fa44442 feat: Introduce shared logger and unit tests, and update magnify glass and info panel components. 2026-01-01 14:46:56 -08:00
AEmotionStudio 9e8b981bdc refactor: Overhaul testing setup with Vitest, add new unit tests for state and config managers, and update WebGLRenderer. 2025-12-31 20:32:02 -08:00
AEmotionStudio 0b49471ad8 refactor: migrate magnify glass and info panel to TypeScript with Vite and Vue 2025-12-31 17:53:29 -08:00