π§ͺ Testing Guide for Workflow Studio UX Fixes
Date: October 25, 2025
Branch: rc-3
Files Changed: 3 core components + CSS + documentation
π― Quick Startβ
# Navigate to web app
cd web/typescript/valkyr_labs_com
# Install dependencies (if needed)
yarn install
# Start dev server
yarn dev
# Navigate to Workflow Builder
# URL: http://localhost:5173/workflow/builder (or similar)
β Test Checklistβ
Test 1: Component Palette Drag Smoothnessβ
Location: Open Workflow Builder page
Steps:
- Locate the floating component palette toolbar (left side or floating)
- Hover over any module item in the palette
- β Item should lift up 2px smoothly
- β Border should glow with blue accent color
- β Cursor should change to "grab" pointer
- Click and drag a module item
- β Cursor should change to "grabbing"
- β Drag ghost should appear with 80% opacity
- β Drag should be smooth with no lag
- Release the module on the canvas
- β Node should be created at drop position
- β No console errors
Expected Performance:
- Hover animation: < 50ms
- Drag start: Instant
- Frame rate during drag: 60 FPS
- No state update warnings in console
Test 2: Floating Toolbar Drag & Resizeβ
Location: Workflow Builder - Component Palette
Steps:
- Locate the toolbar header (top bar with grip icon)
- Click and drag the header
- β Toolbar should move smoothly
- β No jumping or stuttering
- β Position updates should feel instant
- Release and drag again rapidly
- β No lag build-up
- β Consistent smooth motion
- Locate the resize handle (bottom-right corner)
- Click and drag to resize
- β Resize should be smooth
- β Content should reflow correctly
- β No state conflicts
Expected Performance:
- Drag updates: 5-10 per second (not 50+)
- No console warnings about state updates
- Memory usage stable during drag
- Toolbar stops exactly where released
Debug Commands (Browser Console):
// Check for excessive re-renders
// Open React DevTools β Profiler
// Record while dragging
// Look for <DraggableFloatingToolbar> render count
// Should be < 20 for a 2-second drag
Test 3: 3D Viewer Redux Integrationβ
Location: Workflow Builder - Overview Tab
Steps:
- Open Workflow Builder
- Create a new workflow or load existing one
- Add 2-3 tasks to the workflow canvas
- Switch to "Overview" tab
- Check 3D Viewer section
- β Tasks should appear as 3D spheres
- β Each task should be visible
- β Rotating/orbiting (from modules)
- Return to canvas and add another task
- Switch back to Overview tab
- β New task should appear in 3D viewer
- β No loading spinner stuck
- Remove a task from canvas
- Check 3D viewer again
- β Task should disappear from 3D view
Expected Behavior:
- 3D viewer updates in real-time
- No infinite loading spinners
- Empty state shows: "No tasks to visualize..."
- Network tab shows NO unnecessary
/TaskAPI calls
Debug Commands (Browser Console):
// Check Redux state
import { store } from "@/redux/store";
store.getState().workflowEditor.draft.tasks;
// Should match what you see in 3D viewer
// Check if viewer is connected to Redux
// Open React DevTools β Components
// Find Workflow3DViewer
// Check hooks: should see useAppSelector
Test 4: State Management Stabilityβ
Location: Browser DevTools β Console
Steps:
- Open browser DevTools (F12)
- Go to Console tab
- Perform all above tests
- Monitor for warnings/errors
Expected Results:
- β NO "Maximum update depth exceeded" warnings
- β NO "Cannot update a component while rendering" errors
- β NO infinite loop warnings
- β Clean console (or only unrelated warnings)
Common Issues (Now Fixed):
- β "Warning: Maximum update depth exceeded" β FIXED in DraggableFloatingToolbar
- β "Cannot update during an existing state transition" β FIXED with isDragging guard
- β "useEffect dependency array" warnings β FIXED with proper deps
π Visual Inspection Guideβ
Component Palette Itemsβ
Correct Appearance (Hover):
- Background: Slightly lighter
- Border: Blue glow (#38bdf8 at 50% opacity)
- Shadow: 2-layer shadow with accent ring
- Transform: Lift 2px up, scale 1.02x
- Transition: Smooth cubic-bezier
Correct Appearance (Active/Dragging):
- Cursor: "grabbing" pointer
- Opacity: 0.9
- Scale: 1.05x
- Drag ghost: Semi-transparent clone
3D Viewerβ
Correct Appearance:
- Canvas: Dark background (rgba(0,0,0,0.3))
- Tasks: Colored spheres (green/orange/red based on status)
- Modules: Rotating small boxes around tasks
- Labels: White text above each sphere
- Empty state: Centered message, light gray text
π Troubleshootingβ
Issue: Drag is still laggyβ
Check:
- Open React DevTools β Profiler
- Record while dragging
- Look for component with excessive renders
- Verify
hasInitializedis true after first render
Solution:
// Should see this in DraggableFloatingToolbar
const [hasInitialized, setHasInitialized] = useState(false);
// And this guard in useEffect
if (isDragging || isResizing) return;
Issue: 3D Viewer is emptyβ
Check:
- Open Redux DevTools
- Navigate to State β workflowEditor β draft β tasks
- Verify tasks array exists and has items
- Check Workflow3DViewer props in React DevTools
Solution:
// Verify this connection exists in Workflow3DViewer.tsx
const workflowDraft = useAppSelector(selectWorkflowDraft);
const sourceTasks = propTasks || workflowDraft?.tasks || fetchedTasks;
Issue: Palette items not draggableβ
Check:
- Verify
draggableattribute is true - Check
onDragStarthandler is attached - Look for JavaScript errors in console
Solution:
<div
draggable
onDragStart={(e) => onDragStart(e, item)}
className="palette-item"
>
π Performance Benchmarksβ
Acceptable Performanceβ
| Metric | Target | How to Measure |
|---|---|---|
| Drag FPS | 60 | Chrome DevTools β Performance β Record during drag |
| State updates/sec | < 10 | React DevTools β Profiler |
| 3D render time | < 100ms | Performance API: performance.now() before/after |
| Memory growth | < 5MB | Chrome DevTools β Memory β Take heap snapshot |
Commands for Benchmarkingβ
// In browser console
// 1. Measure drag performance
let dragStart = performance.now();
// ... perform drag ...
let dragEnd = performance.now();
console.log("Drag took:", dragEnd - dragStart, "ms");
// 2. Count re-renders
let renderCount = 0;
// Add to component: useEffect(() => { renderCount++; });
// After test: console.log('Renders:', renderCount);
// 3. Check memory
performance.memory.usedJSHeapSize / 1048576; // MB
β Sign-Off Criteriaβ
Before marking as complete:
- All drag operations smooth (60 FPS)
- No console errors or warnings
- 3D viewer shows current workflow tasks
- Hover effects work correctly
- Resize/drag toolbar stable
- Memory usage stable over 5 minutes
- Works in Chrome, Firefox, Safari
- Redux state matches UI state
π Deployment Checklistβ
Before deploying to production:
- Run full test suite:
yarn test - Build without warnings:
yarn build - Test on staging environment
- Performance test with 50+ nodes
- Mobile/tablet touch testing
- Screen reader testing (basic)
- Update CHANGELOG.md
- Tag release:
v1.0.1(or appropriate)
π Reporting Issuesβ
If you find a bug:
- Check if it's a known issue (see WORKFLOW_UX_FIXES_OCT25.md)
- Gather information:
- Browser and version
- Steps to reproduce
- Console errors (screenshot)
- Expected vs actual behavior
- Create GitHub issue with template:
### Bug Report: [Component] - [Issue]
**Environment**:
- Browser: Chrome 120
- OS: macOS 14
- Branch: rc-3
**Steps to Reproduce**:
1. Open Workflow Builder
2. Drag component palette
3. ...
**Expected**: Smooth drag
**Actual**: Lag after 2 seconds
**Console Errors**:
[paste errors here]
**Screenshots**: [attach]
π Learning Resourcesβ
Understanding the Fixesβ
- React Hook Dependencies: https://react.dev/reference/react/useEffect#specifying-reactive-dependencies
- Redux Best Practices: https://redux.js.org/style-guide/
- React Performance: https://react.dev/learn/render-and-commit
Related Documentationβ
N8N_KILLER_UX_UPDATE.md- Original UX requirementsWORKFLOW_UX_FIXES_OCT25.md- Detailed fix documentationsystemPatterns.md- Architecture patternstechContext.md- Technical context
Happy Testing! π
If all tests pass, you have successfully verified the smoothest workflow UX ever created! π