30 KiB
Actor Grouping Feature - UX Concept Document
Version: 1.0 Date: 2025-10-17 Application: Constellation Analyzer
Executive Summary
This document defines the UX concept for a new Actor Grouping feature in Constellation Analyzer. The feature allows users to group multiple actors into visual containers that can be collapsed/expanded to reduce UI clutter while maintaining graph relationships.
The design follows the application's existing patterns:
- React Flow-based graph visualization
- Tailwind CSS + Material-UI design system
- Zustand state management with history tracking
- Collapsible panels and sections
- Context-sensitive interactions
Table of Contents
- Feature Overview
- User Stories & Use Cases
- Information Architecture
- Visual Design
- Interaction Design
- State Management
- Edge Cases & Constraints
- Implementation Considerations
- Future Enhancements
1. Feature Overview
1.1 Purpose
Allow users to organize related actors into logical groups with visual containment, improving:
- Organization: Cluster related actors semantically (e.g., "Engineering Team", "External Systems")
- Clarity: Reduce visual complexity in large graphs
- Focus: Collapse groups to hide details, expand to show full structure
- Context: Maintain visible relationships between groups and individual actors
1.2 Core Capabilities
- Create Group: Select multiple actors and group them into a named container
- Visual Container: Box with header, background color, and contained actors
- Expand/Collapse: Toggle between full view and collapsed placeholder
- Group Editing: Rename, recolor, add/remove actors
- Nested Relations: Show relations within group and between group/external actors
- History Support: Full undo/redo integration
1.3 Key Principles
- Non-Destructive: Grouping does not delete or modify actors/relations
- Reversible: Groups can be ungrouped, returning actors to independent state
- Transparent: Collapsed groups show summary info (actor count, relation count)
- Consistent: Follows existing design patterns (collapsible sections, context menus, panels)
2. User Stories & Use Cases
User Story 1: Creating a Group
As a constellation analyst I want to select multiple actors and group them So that I can organize related entities visually
Acceptance Criteria:
- User can select 2+ actors using Shift+Click or drag selection box
- Context menu shows "Create Group" option for multi-selection
- Prompted to name the group (optional, defaults to "Group 1", "Group 2", etc.)
- Group container appears with all selected actors inside
- Actors maintain their relative positions within the group
User Story 2: Collapsing a Group
As a constellation analyst I want to collapse a group to hide its contents So that I can reduce clutter when viewing the big picture
Acceptance Criteria:
- Group header shows expand/collapse toggle button
- Collapsed state shows:
- Group name
- Actor count badge (e.g., "5 actors")
- Relation indicators (connections to external nodes)
- Relations from group actors to external nodes remain visible, attached to collapsed group boundary
- Double-click on collapsed group expands it
User Story 3: Editing Group Properties
As a constellation analyst I want to edit a group's name and appearance So that I can customize organization to my needs
Acceptance Criteria:
- Selecting a group shows properties in right panel
- Editable properties: name, color, description
- List of contained actors (with ability to remove from group)
- Delete group button (ungroups actors, doesn't delete them)
User Story 4: Ungrouping
As a constellation analyst I want to ungroup a set of actors So that I can reorganize my graph structure
Acceptance Criteria:
- Right-click group → "Ungroup" option
- Actors return to canvas at their last positions
- Relations remain intact
- Operation is undoable
3. Information Architecture
3.1 Data Model
// New type for groups
export interface GroupData {
label: string; // Group name
description?: string; // Optional description
color: string; // Background color (semi-transparent)
collapsed: boolean; // Expand/collapse state
actorIds: string[]; // IDs of actors in this group
metadata?: Record<string, unknown>;
}
export type Group = {
id: string; // Unique group ID
type: 'group'; // Node type identifier
position: { x: number; y: number }; // Top-left corner
data: GroupData;
// React Flow will calculate dimensions based on contained nodes
};
// Updated types
export interface GraphState {
nodes: Actor[];
edges: Relation[];
groups: Group[]; // NEW: Array of groups
nodeTypes: NodeTypeConfig[];
edgeTypes: EdgeTypeConfig[];
labels: LabelConfig[];
}
3.2 Hierarchical Relationships
Graph
├── Groups (containers)
│ ├── Group 1 (expanded)
│ │ ├── Actor A
│ │ ├── Actor B
│ │ └── Actor C
│ └── Group 2 (collapsed)
│ └── [3 actors hidden]
├── Standalone Actors
│ ├── Actor D
│ └── Actor E
└── Relations
├── A → B (internal to Group 1)
├── A → D (crosses group boundary)
└── Group 2 → E (from collapsed group)
3.3 Information Display Hierarchy
Expanded Group:
┌─────────────────────────────────┐
│ [−] Engineering Team [×] │ ← Header with collapse/delete
├─────────────────────────────────┤
│ │
│ ┌──────┐ ┌──────┐ │ ← Contained actors
│ │ Dev │ ───→ │ Lead │ │ with relations
│ └──────┘ └──────┘ │
│ │
│ ┌──────┐ │
│ │ QA │ │
│ └──────┘ │
│ │
└─────────────────────────────────┘
Collapsed Group:
┌─────────────────────────┐
│ [+] Engineering Team │ ← Compact header
│ 3 actors │ ← Summary info
└─────────────────────────┘
│ (Relations extend from edges)
└──────→ (External node)
4. Visual Design
4.1 Design Tokens
Group Colors (Semi-transparent backgrounds):
const DEFAULT_GROUP_COLORS = [
'rgba(59, 130, 246, 0.08)', // Blue
'rgba(16, 185, 129, 0.08)', // Green
'rgba(245, 158, 11, 0.08)', // Orange
'rgba(139, 92, 246, 0.08)', // Purple
'rgba(236, 72, 153, 0.08)', // Pink
'rgba(20, 184, 166, 0.08)', // Teal
];
Border Styles:
const GROUP_BORDER_STYLE = {
width: '2px',
style: 'dashed', // Dashed to differentiate from nodes
radius: '8px', // Rounded corners
opacity: 0.4, // Subtle
};
Header Styles:
const GROUP_HEADER_STYLE = {
background: 'rgba(0, 0, 0, 0.05)', // Subtle gray overlay
padding: '8px 12px',
fontSize: '14px',
fontWeight: 600,
color: '#374151', // Gray-700
height: '40px',
};
Typography:
- Group Name: 14px, font-semibold (600), gray-700
- Actor Count: 12px, font-medium (500), gray-500
- Description: 12px, font-normal (400), gray-600
Spacing:
- Padding inside group: 16px (around contained actors)
- Margin between actors in group: maintain existing spacing
- Collapsed group size: 240px × 80px (fixed dimensions)
4.2 Component Mockups
Expanded Group Structure
┌─────────────────────────────────────────────┐
│ Header Area (bg-gray-50/50, h-40px) │
│ ┌────────────────────────────────────────┐ │
│ │ [−] Group Name [👁️] [✏️] [×] │ │
│ └────────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ Content Area (padding: 16px) │
│ │
│ [Actor nodes positioned freely] │
│ [Relations between actors] │
│ │
│ │
└─────────────────────────────────────────────┘
↑ Dashed border (2px, border-color)
Header Components:
- Collapse Button
[−]: IconButton with ExpandLessIcon, left-aligned - Group Name: Text label, editable on double-click or via right panel
- Visibility Toggle
[👁️]: IconButton to show/hide group temporarily (fade out) - Edit Button
[✏️]: IconButton to open right panel with group properties - Delete Button
[×]: IconButton to ungroup (with confirmation)
Collapsed Group Structure
┌───────────────────────┐
│ [+] Group Name │ ← Header only
│ 5 actors │ ← Summary badge
│ 3 relations │ ← Connection count
└───────────────────────┘
Collapsed Dimensions:
- Width: 240px (fixed)
- Height: Auto (based on content, min 80px)
- Border: Same dashed style
- Background: Darker tint of group color (0.12 opacity)
Collapsed Summary:
- Actor count: Shows total actors inside
- Relation count: Shows external relations (connections to/from group)
- No internal structure visible
4.3 Relation Rendering
Internal Relations (within group):
- Rendered normally when group is expanded
- Hidden when group is collapsed
External Relations (group ↔ standalone actors):
- Expanded: Edge connects from specific actor inside group to external node
- Collapsed: Edge connects from group boundary (closest edge point) to external node
- Edge label shows source actor name in parentheses: "collaborates (Alice)"
Group-to-Group Relations:
- Treated as external relations
- Shows summary label when both groups collapsed
4.4 Selection & Highlighting States
Group Selected:
- Border becomes solid (not dashed)
- Border width: 3px
- Border color: Primary blue (#3b82f6)
- Right panel shows group properties
Group Hovered:
- Border opacity: 0.7 (from 0.4)
- Header background darkens slightly
- Cursor: pointer
Actor in Group Hovered/Selected:
- Same as current behavior
- Group border remains unchanged
5. Interaction Design
5.1 Creating Groups
Method 1: Selection + Context Menu (Primary)
-
Multi-Select Actors:
- Shift+Click: Add to selection
- Ctrl+Click (Windows) / Cmd+Click (Mac): Toggle selection
- Drag selection box: Select multiple actors in rectangle
-
Right-Click on Selected Actor:
- Context menu shows new option: "Group Selected Actors"
- Positioned near "Delete" option
-
Name Group Dialog:
- Modal dialog:
InputDialog - Title: "Create Actor Group"
- Message: "Enter a name for this group"
- Placeholder: "Group 1" (auto-increment)
- Validation: Max 50 characters
- Buttons: "Create" (primary blue) | "Cancel"
- Modal dialog:
-
Group Created:
- New group node added to graph
- Bounding box calculated from selected actors' positions
- Selected actors moved "into" group (z-index and parent relationship)
- Default color assigned (cycle through colors)
- Group starts in expanded state
Method 2: Left Panel Button (Alternative)
New Section in Left Panel: "Organization"
- Positioned between "Relations" and "Layout"
- Contains:
- "Create Group" button (disabled if < 2 actors selected)
- Explanation text: "Select 2+ actors to create a group"
5.2 Expanding/Collapsing Groups
Toggle via Header Button
- Click
[−]button → Collapses group - Click
[+]button → Expands group - Animation: 300ms ease-in-out transition
- Actors fade out/in
- Group dimensions animate
- Relations re-route smoothly
Keyboard Shortcut
- Select group → Press
Spaceto toggle collapse state
Double-Click Collapsed Group
- Double-clicking collapsed group expands it
- Fast interaction for exploration
5.3 Editing Groups
Select Group → Right Panel
Group Properties Panel (similar to NodeEditorPanel):
┌─────────────────────────────────┐
│ Group Properties [×] │
├─────────────────────────────────┤
│ Name │
│ ┌─────────────────────────────┐ │
│ │ Engineering Team │ │
│ └─────────────────────────────┘ │
│ │
│ Description (optional) │
│ ┌─────────────────────────────┐ │
│ │ Core development team... │ │
│ │ │ │
│ └─────────────────────────────┘ │
│ │
│ Background Color │
│ [Color Picker Component] │
│ │
│ Members (5 actors) │
│ ┌─────────────────────────────┐ │
│ │ • Alice (Developer) [×] │ │
│ │ • Bob (Lead) [×] │ │
│ │ • Charlie (QA) [×] │ │
│ └─────────────────────────────┘ │
│ │
│ State │
│ ○ Expanded ● Collapsed │
│ │
│ [Ungroup] [Delete Group] │
└─────────────────────────────────┘
Editable Properties:
- Name: Text input, live update (500ms debounce)
- Description: Textarea, optional
- Color: Color picker (same as node type config)
- Members: List with remove buttons
- Click
[×]→ Remove actor from group (moves to canvas) - Shows actor label and type
- Click
- State: Radio buttons to expand/collapse
- Actions:
- Ungroup: Button to dissolve group, actors return to canvas
- Delete Group: Button to delete group AND all actors inside (with confirmation)
Inline Name Editing
- Double-click group header → Enter edit mode
- Input field replaces name text
- Enter to save, Escape to cancel
5.4 Managing Group Membership
Add Actor to Existing Group (Drag & Drop)
- Drag actor node onto group
- Group highlights with thicker border (visual feedback)
- Drop → Actor becomes member of group
- Position adjusted to be inside group boundary
Remove Actor from Group
Method 1: Right panel → Click [×] next to actor name
Method 2: Drag actor out of group boundary → Auto-removed
Move Group
- Drag group header → Move entire group with all actors
- Actors maintain relative positions within group
- Relations update in real-time
5.5 Deleting & Ungrouping
Ungroup (Non-Destructive)
- Action: Right-click group → "Ungroup"
- Result:
- Group node removed
- All actors return to canvas at their absolute positions
- Relations unchanged
- Undo description: "Ungroup [Group Name]"
Delete Group (Destructive)
- Action: Right panel → "Delete Group" button
- Confirmation: Dialog warns:
- "Delete this group AND all 5 actors inside?"
- "This will also delete all connected relations."
- Severity: danger (red)
- Result:
- Group deleted
- All actors inside deleted
- All relations to/from those actors deleted
- Undo description: "Delete Group [Group Name]"
5.6 Keyboard Shortcuts
| Shortcut | Action |
|---|---|
Ctrl/Cmd + G |
Group selected actors |
Space (group selected) |
Toggle expand/collapse |
Ctrl/Cmd + Shift + G |
Ungroup selected group |
Delete |
Delete selected group (with confirmation) |
6. State Management
6.1 Zustand Store Updates
graphStore.ts:
interface GraphState {
// ... existing properties
groups: Group[];
}
interface GraphActions {
// ... existing actions
addGroup: (group: Group) => void;
updateGroup: (id: string, updates: Partial<GroupData>) => void;
deleteGroup: (id: string) => void;
addActorToGroup: (actorId: string, groupId: string) => void;
removeActorFromGroup: (actorId: string, groupId: string) => void;
setGroups: (groups: Group[]) => void;
}
Implementation Notes:
- Groups stored separately from nodes/edges
- React Flow renders groups as custom "parent" nodes
- Actors in groups have
parentNode: groupIdproperty - Use
useGraphWithHistory()for all mutations (undo/redo support)
6.2 History Integration
History Descriptions:
- "Create Group [Name]"
- "Rename Group [Old] → [New]"
- "Collapse Group [Name]"
- "Expand Group [Name]"
- "Add Actor to Group [Name]"
- "Remove Actor from Group [Name]"
- "Ungroup [Name]"
- "Delete Group [Name]"
Undo/Redo Behavior:
- Creating group: Undo removes group, actors return to original positions
- Collapsing: Undo expands group
- Ungrouping: Undo re-creates group with same members
- Deleting: Undo restores group and all actors
6.3 React Flow Integration
Parent-Child Nodes:
- React Flow supports parent nodes natively
- Actors in group have
parentNodeproperty set to group ID - React Flow calculates group bounds automatically
- Use
extent: 'parent'to constrain actors within group
Custom Node Type for Groups:
// src/components/Nodes/GroupNode.tsx
const GroupNode = ({ data, selected }: NodeProps<GroupData>) => {
// Render group container
// Header with collapse button, name, controls
// Background with padding
// Handle expand/collapse state
};
export default memo(GroupNode);
Node Types Registration:
const nodeTypes: NodeTypes = useMemo(
() => ({
custom: CustomNode, // Existing actor nodes
group: GroupNode, // NEW: Group container nodes
}),
[],
);
7. Edge Cases & Constraints
7.1 Constraints
- Minimum Group Size: Must contain at least 2 actors
- No Nested Groups: Groups cannot contain other groups (may be future enhancement)
- No Partial Overlap: Actor can only belong to one group at a time
- Group Name Length: Max 50 characters
- Selection Limit: No limit on actors per group, but UI should warn if >20 actors
7.2 Edge Cases
Case 1: Creating Group with Single Actor
- Behavior: "Create Group" option disabled in context menu
- Feedback: Tooltip shows "Select 2 or more actors to create a group"
Case 2: Collapsing Group with External Relations
- Behavior: Relations re-route to group boundary
- Display: Edge label shows source actor: "collaborates (Alice)"
- Re-expanding: Relations return to original actor
Case 3: Deleting Actor Inside Group
- Behavior: Actor removed from group member list
- If only 1 actor left: Prompt user: "Only 1 actor remaining. Ungroup or add more actors?"
- Auto-ungroup if user deletes second-to-last actor
Case 4: Moving Actor via Drag (Inside Group)
- Behavior: Actor moves within group bounds
- Constraint: Cannot drag outside group (use remove from group action instead)
- Alternative: Allow drag outside → Auto-removes from group (needs clear visual feedback)
Case 5: Undo After Deleting Actor in Group
- Behavior: Undo restores actor to group
- Challenge: Maintain group membership in history
Case 6: Group with No Name
- Behavior: Use default name "Group 1", "Group 2", etc.
- Auto-increment: Based on existing groups
Case 7: Searching/Filtering with Collapsed Groups
- Behavior: If search matches actor inside collapsed group:
- Auto-expand group to show matching actor
- OR: Highlight collapsed group with badge "2 matches inside"
- Recommendation: Auto-expand (simpler UX)
Case 8: Exporting Graph with Groups
- JSON Export: Include groups array in exported data
- PNG/SVG Export: Render groups visually (expanded or collapsed based on current state)
8. Implementation Considerations
8.1 Component Structure
New Components:
src/components/
├── Nodes/
│ ├── GroupNode.tsx # NEW: Group container component
│ └── CustomNode.tsx # Update: Support parentNode
├── Panels/
│ ├── GroupEditorPanel.tsx # NEW: Group properties editor
│ ├── LeftPanel.tsx # Update: Add "Organization" section
│ └── RightPanel.tsx # Update: Route to GroupEditorPanel
├── Config/
│ └── GroupConfig.tsx # NEW: (Optional) Manage group presets
└── Common/
└── GroupBadge.tsx # NEW: Actor count badge component
8.2 React Flow Configuration
Parent Node Setup:
// When creating group
const groupNode: Group = {
id: generateId(),
type: 'group',
position: { x: minX - 20, y: minY - 50 }, // Offset for padding
data: {
label: groupName,
color: selectedColor,
collapsed: false,
actorIds: selectedActorIds,
},
};
// Update actors to be children
const updatedActors = selectedActors.map(actor => ({
...actor,
parentNode: groupNode.id,
extent: 'parent' as const,
// Keep relative position
position: {
x: actor.position.x - groupNode.position.x,
y: actor.position.y - groupNode.position.y,
},
}));
ReactFlow Props:
<ReactFlow
nodes={[...nodes, ...groups]} // Groups are rendered as nodes
edges={edges}
nodeTypes={{ custom: CustomNode, group: GroupNode }}
// ... other props
/>
8.3 Collapse/Expand Logic
Collapse Transition:
- Save current actor positions (for undo)
- Set
group.data.collapsed = true - Set all actors in group to
hidden: true - Calculate collapsed group dimensions (fixed 240×80)
- Re-route external edges to group boundary
- Animate transition (300ms)
Expand Transition:
- Set
group.data.collapsed = false - Calculate expanded group dimensions (bounding box + padding)
- Set all actors in group to
hidden: false - Restore actor positions (relative to group)
- Re-route edges back to specific actors
- Animate transition (300ms)
8.4 Edge Routing for Collapsed Groups
Challenge: When group is collapsed, edges need to connect to group boundary instead of hidden actors.
Solution:
- Create virtual handles on collapsed group node (top, right, bottom, left)
- Calculate closest handle to external node
- Update edge source/target to group handle when collapsed
- Restore original actor handle when expanded
Custom Edge Logic:
// In CustomEdge.tsx
const sourceNode = nodes.find(n => n.id === source);
const isSourceCollapsedGroup =
sourceNode?.type === 'group' && sourceNode.data.collapsed;
if (isSourceCollapsedGroup) {
// Find original actor from edge metadata
const originalActorId = edge.data?.sourceActorId;
// Show label with actor name
edgeLabel = `${edge.data.label} (${originalActorName})`;
}
8.5 Performance Considerations
Optimization Strategies:
- Memoization: Memo GroupNode component
- Collapsed Rendering: Don't render hidden actors in DOM (use
hidden: true) - Lazy Expansion: Only calculate positions when expanding
- Debounced Updates: Group property edits debounced to 500ms
- Batch Operations: Group creation updates all actors in single transaction
Expected Performance:
- 100+ actors: No noticeable lag
- 10+ groups: Smooth interactions
- Collapse/Expand: <300ms animation
9. Future Enhancements
Phase 2 Features (Out of Scope for MVP)
- Nested Groups: Groups inside groups (tree hierarchy)
- Group Templates: Save/load group configurations
- Auto-Grouping: ML-based clustering suggestions
- Group Layouts: Auto-arrange actors within group (grid, circle, tree)
- Group Styles: Custom border styles, background patterns
- Minimap Integration: Show groups as colored regions in minimap
- Swimlanes: Horizontal/vertical lanes for process flows
- Group Permissions: Lock/unlock groups to prevent edits
- Group Notes: Rich text annotations for groups
- Import/Export Groups: Reuse group structures across documents
Design System Evolution
Potential Additions:
- Group color presets (beyond 6 default colors)
- Group icon library (similar to actor icons)
- Group shapes (rounded, rectangular, pill-shaped)
- Border style options (solid, dashed, dotted, double)
Accessibility Improvements
- Screen reader announcements for group operations
- Keyboard navigation between groups (Tab key)
- High contrast mode support
- Reduced motion option for collapse/expand animations
10. Appendix
10.1 Design Alignment Checklist
Visual Consistency:
- ✅ Uses Tailwind CSS utility classes
- ✅ Material-UI IconButton components
- ✅ Consistent spacing (padding-3, padding-16)
- ✅ Consistent typography (text-sm, font-semibold)
- ✅ Consistent colors (gray-50, gray-200, blue-500)
Interaction Patterns:
- ✅ Context menus for quick actions
- ✅ Right panel for detailed editing
- ✅ Collapsible sections
- ✅ Confirmation dialogs for destructive actions
- ✅ Debounced live updates (500ms)
State Management:
- ✅ Zustand for global state
- ✅
useGraphWithHistory()for mutations - ✅ Per-document history tracking
- ✅ LocalStorage persistence via workspace
10.2 Color Palette Reference
Group Background Colors (RGBA):
--group-blue: rgba(59, 130, 246, 0.08);
--group-green: rgba(16, 185, 129, 0.08);
--group-orange: rgba(245, 158, 11, 0.08);
--group-purple: rgba(139, 92, 246, 0.08);
--group-pink: rgba(236, 72, 153, 0.08);
--group-teal: rgba(20, 184, 166, 0.08);
Border Colors (Same as background, but with 0.4 opacity):
--group-border-blue: rgba(59, 130, 246, 0.4);
--group-border-green: rgba(16, 185, 129, 0.4);
/* etc. */
10.3 Component Hierarchy Diagram
GraphEditor
├── ReactFlow
│ ├── CustomNode (Actor)
│ │ └── NodeShapeRenderer
│ ├── GroupNode (NEW) ← NEW COMPONENT
│ │ ├── GroupHeader
│ │ │ ├── CollapseButton
│ │ │ ├── NameLabel
│ │ │ ├── EditButton
│ │ │ └── DeleteButton
│ │ └── GroupContent (when expanded)
│ │ └── [Contained CustomNode children]
│ └── CustomEdge (Relation)
│ └── [Updated to handle group edges]
└── RightPanel
├── GraphAnalysisPanel
├── NodeEditorPanel
├── EdgeEditorPanel
└── GroupEditorPanel (NEW) ← NEW COMPONENT
10.4 User Flow Diagrams
Creating a Group Flow:
[Select Multiple Actors]
↓
[Right-Click Selected Actor]
↓
[Context Menu: "Group Selected Actors"]
↓
[Input Dialog: "Enter Group Name"]
↓
[Create Group with Default Color]
↓
[Group Appears (Expanded)]
↓
[Select Group → Edit Properties in Right Panel]
Collapsing a Group Flow:
[Group Visible (Expanded)]
↓
[Click Collapse Button in Header]
↓
[Animation: Actors Fade Out (300ms)]
↓
[Group Shows Collapsed View]
↓
[External Relations Re-route to Group Boundary]
↓
[Summary Badges Show Actor/Relation Counts]
Conclusion
This UX concept provides a comprehensive design for Actor Grouping in Constellation Analyzer. The feature integrates seamlessly with the existing application architecture, following established patterns for visual design, interaction, and state management.
Key Design Decisions:
- Parent-Child Nodes: Leverage React Flow's parent node feature for natural containment
- Collapse as Primary View: Groups can be collapsed to reduce clutter (primary use case)
- Non-Destructive Operations: Grouping and ungrouping preserve all data
- Consistent UI Patterns: Reuse existing components (InputDialog, ConfirmDialog, Right Panel)
- History Integration: Full undo/redo support via
useGraphWithHistory()
Next Steps:
- Review and approve UX concept
- Create detailed technical implementation plan
- Implement core grouping functionality (create, expand/collapse)
- Implement group editing (right panel, properties)
- Implement advanced features (drag-to-group, edge routing)
- Testing and refinement
Document Metadata:
- Author: Claude Code
- Version: 1.0
- Last Updated: 2025-10-17
- Status: Draft for Review