Adds a text link with banana icon at the bottom of the links list in
the welcome modal, linking to https://nodebananapro.com.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
If a debounced data-edit snapshot was pending when loading or clearing
a workflow, it could fire after undoManager.clear() and push stale
state into the new workflow's undo history. Now both paths cancel the
pending timer and snapshot before clearing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a text link with banana icon below the description in the welcome
modal left column, linking to https://nodebananapro.com.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a top-level "Video" quick-access button to the floating action bar
and adds videoInput to the Input category in the All Nodes menu. Fixes
test selectors to disambiguate the new top-level Video button from the
Generate dropdown's Video option.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Captures snapshots before all undoable mutations (add/remove nodes,
connect/remove edges, paste, group operations, edge style, drag start).
Data edits are debounced (500ms). Execution outputs are not undoable.
History depth: 50 entries. Cleared on load/clear workflow.
Keyboard shortcuts added to WorkflowCanvas and shortcuts dialog.
15 integration tests covering all undo/redo scenarios through the store.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a new videoInput node type that allows users to drag-and-drop or
browse for video files (MP4, WebM, QuickTime), preview them inline with
native video controls, and feed them into downstream video processing
nodes. Includes full media externalization/hydration support, Shift+Y
keyboard shortcut, and ConnectionDropMenu integration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove obsolete scripts/cleanup-workflow.js
- Revert locked guards from group drag/resize/rename (lock is
execution-only, not interaction)
- Add lock icon in group title pill for visual feedback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GroupsOverlay: reset color picker when menu closes, guard locked groups
from drag/resize/rename
- AudioInputNode: add keyboard accessibility to dropzone (role, tabIndex,
onKeyDown)
- list-workflows: fix name regex to handle escaped quotes
- GroupsOverlay.test: add missing NBP Input menu item assertion
- WorkflowBrowserView: make relativePath required to match API contract
- WorkflowBrowserModal: add dialog role, aria-modal, aria-labelledby
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The group controls (lock, delete, color) moved from individual toolbar
buttons into a dropdown menu behind "Group options". Update tests to
open the menu first, then interact with items by text label.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add recursive directory scanning (up to 3 levels deep) to the
list-workflows API so projects organized into subdirectories are
visible in the workflow browser. Skips hidden dirs and node_modules.
Returns relativePath field displayed as the subtitle in the UI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- WelcomeModal: "Load workflow" now navigates to WorkflowBrowserView
instead of calling browse-directory API directly. Replaced 4 obsolete
fetch-based tests with 3 tests covering view navigation and callback.
- QuickstartInitialView: updated description regex to match new copy
("generative AI pipelines" instead of "AI image generation").
All 1934 tests now pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The open button now opens a WorkflowBrowserModal instead of calling
the browse-directory API. Updated the test to assert modal rendering
and removed two obsolete tests that tested the old fetch-based flow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Back button sits on its own row so the title and directory path are
flush-left instead of indented beside the arrow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add folder icon with background per row for clear visual anchoring
- Show directory basename as secondary text under workflow name
- Right-align timestamps as de-emphasized metadata
- Add project count in header
- Richer empty state with icon and two-line message
- Border-based hover/active states instead of flat background tint
- Footer actions get small icons for scannability
- Deduplicate browseAndSetDir handler
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of parsing entire workflow JSON files (which can be many MB with
embedded base64 data), read only the first 1KB to extract the name via
regex. Drop nodeCount from the listing. Probe all directories in parallel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Header's folder icon now opens the workflow browser modal instead of
the OS directory picker directly. The modal wraps WorkflowBrowserView
in the standard overlay pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Load workflow button now navigates to the WorkflowBrowserView instead
of immediately opening the OS directory picker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reusable component with two states: empty state prompting user to choose
a workflows folder, and listing state showing all workflows with name,
node count, and relative time. Supports changing folder and one-off browsing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Same approach as Header.tsx — replace browser file picker with native OS
directory picker so loadWorkflow receives the filesystem path for media
hydration from sibling inputs/ and generations/ folders.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace browser file picker with the existing /api/browse-directory native
OS folder picker so loadWorkflow receives the actual filesystem path,
enabling media hydration from sibling inputs/ and generations/ folders.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add 14 tests covering:
- Optional inputs with no data are skipped
- Skip propagation cascades downstream (ANY merge policy)
- Shared nodes are not skipped
- Backward compatibility without isOptional
- Skipped status cleared after workflow completes
- Multi-level cascade
Also add skippedNodeIds to WorkflowCanvas test mock.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add node-skipped CSS class (opacity 0.35) for skip dimming
- Expose skippedNodeIds in Zustand store for reactive CSS updates
- Apply node-skipped class in WorkflowCanvas alongside switch-dimmed
- Clear skippedNodeIds on workflow stop, reset, and completion
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows a toggle in the FloatingNodeHeader for imageInput, audioInput,
and prompt nodes. When toggled on, the button turns amber and shows
"Optional"; when off, it shows "Required" in the default style.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ImageInputNode: dashed border + "Optional" text when empty, badge when loaded
- AudioInputNode: same pattern as ImageInputNode
- PromptNode: updated placeholder text when isOptional is set
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Error overlay persisted on nodes when cycling through history to
previous successful generations. Now resets status/error on carousel
navigation in image, video, and audio generation nodes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Saves the base directory to localStorage when creating a project and
prefills it next time the "New Project" modal opens, reducing repetitive
path entry for users who store projects under the same parent directory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allow marking groups as NBP inputs for workflow export. Adds isNbpInput
flag to NodeGroup, a toggle row in the group context menu with checkmark
indicator, and a dashed border on marked group backgrounds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move fan container from inside the Background row to a child of the
menu div itself, positioned at top-0 left-0. Dots offset by -12px
(half their size) so the fan radiates exactly from the corner.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace inline horizontal controls with a vertical dropdown menu that
appears above the three-dot button. Menu has icon+label rows for
Background (color picker), Lock/Unlock, and Delete. Color picker fan
anchors from top-left of the menu. Three-dot button is always visible.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bump button hit areas from w-5/h-5 to w-6/h-6, SVG icons from w-3/h-3
to w-3.5/h-3.5, and three-dot circles from 3px to 4px.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Consolidate group controls (color picker, lock/unlock, delete) from the
floating top-right div into a three-dot menu within the zoom-scaled title
container. Controls now scale with zoom like the title label, and are
toggled via a vertical dots button next to the group name.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
BaseNode: the settings expand branch now clamps the computed height to
minHeight, matching the collapse and ResizeObserver branches.
connectedInputs: resolveTextSourcesThroughRouters now recurses through
switch nodes (same as routers) so upstream text sources are not missed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The left handle was rendered before the image wrapper div in DOM order.
Since the image wrapper has position: relative (needed for its remove
button), it painted over the handle. Moving both handles to render
after visual content ensures they paint last (on top).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Nodes that passed overflow-clip via contentClassName to BaseNode were
clipping their React Flow handles since handles are children of the
content div. Moved the clip to inner content wrappers that don't
contain handles.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use the Lucide split icon (rotated 90deg) for the auto-route button
to better convey the splitting action. Also improve settings reactivity
by reading from Zustand store directly and reparsing atomically on
setting changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>