- Convert keyboard shortcuts help button to persistent click-toggle tooltip
- Add interactive, persistent, and onDismiss options to TooltipManager
- Dismiss persistent tooltips on outside pointerdown or Escape key
- Add delayed hide for interactive tooltips when leaving the target
- Update tooltip CSS for scrolling, interactive pointer-events, and text mode
Replace scattered inline tooltip implementations across canvas_view,
custom_shape_menu, layers_panel, batch_preview_manager, and notifications
with a single shared TooltipManager class.
- New src/utils/tooltip_manager.ts (and compiled js/utils/tooltip_manager.js)
provides observeRoot/bindTooltips/setTooltip/showTooltip/hideTooltip API
- Migrate title attributes to data-tooltip and normalize via MutationObserver
- Rename tooltip CSS from .lf-painter-tooltip/.lf-layerforge-tooltip to
.lf-global-tooltip and raise z-index to 1000001
- Remove duplicate matting-specific tooltip styles from canvas_view.css
- Update generated js/ outputs to match src/ changes
- Resolve mouse button in mask mode so middle-click pans instead of
inadvertently starting a mask draw, and cleanly end any active mask
stroke before panning.
- Redraw the mask brush cursor during pan so the brush outline stays
under the actual mouse position after the viewport transform changes.
- Reset interaction state on pointer up when leaving drawing modes so
stale interaction state cannot persist across gestures.
- Set the canvas cursor to grabbing when panning begins.
- Load initial state before checking connected inputs so already-restored
layers are present and can be skipped.
- Track layerForgeInputImageIdentity on layers and normalize sources to
ignore cache-busting query parameters.
- Sequence checkForInputData calls through a promise chain to avoid races.
- Route single backend input_image through addBatchImages so dedup applies.
- Update characterization tests for the new CanvasIO paths and Canvas state flags.
Use transparent canvas backgrounds, rgba styling, and CSS custom properties
(--lf-canvas-fill, --lf-surface-border, --lf-controls-surface,
--lf-layers-surface, --lf-surface-shadow) so the editor's native color tints
the node underneath. CanvasRenderer now clears the canvas each frame and
reads the fill from CSS, avoiding alpha buildup and keeping the UI readable.