Purpose: In-place editing UI for existing DreamNodes - modify metadata and manage relationships.
Parent feature: dreamnode/ (core types, services, persistence)
dreamnode-editor/
├── store/
│ └── slice.ts # Edit mode state (Zustand)
├── services/
│ └── editor-service.ts # Save orchestration using parent service
├── DreamNodeEditor3D.tsx # Main 3D editing component (self-contained)
├── RelationshipSearchInput.tsx # Semantic search for relationship candidates
├── commands.ts # Obsidian command palette commands
├── index.ts # Barrel export
└── README.md
// Store (state management)
export * from './store/slice';
// → createEditModeSlice, EditModeSlice, EditModeState, EditModeValidationErrors
// Commands
export { registerEditModeCommands } from './commands';
// Services
export * from './services/editor-service';
// → saveEditModeChanges, getFreshNodeData, cancelEditMode, exitToLiminalWeb
// Components
export { default as DreamNodeEditor3D } from './DreamNodeEditor3D';
export { default as RelationshipSearchInput } from './RelationshipSearchInput';| Command | Hotkey | Description |
|---|---|---|
| Enter Edit Mode | Ctrl+E |
Open editor for selected DreamNode |
| Exit Edit Mode | Escape |
Close editor without saving |
| Save Edit Mode Changes | Ctrl+S |
Save changes and exit |
| Cancel Edit Mode Changes | - | Discard changes and exit |
| Search Related Nodes | Ctrl+R |
Toggle relationship search in edit mode |
| Find Similar Related Nodes | - | Semantic search for relationship candidates |
- Enter: User selects node in liminal-web layout, presses
Ctrl+E - Edit: DreamNodeEditor3D renders at center with node data
- Modify: User edits title, contact info (dreamer only), uploads media
- Relationships: Toggle search to find/add relationship candidates
- Save: EditorService orchestrates persistence via parent GitDreamNodeService
- Exit: Return to liminal-web layout with updated node
-
DreamNodeEditor3D: Self-contained editor UI
- Renders only when
editMode.isActiveis true - Title editing, contact fields (dreamer only), media drag/drop
- Relationship search toggle
- Note: Node type (dream/dreamer) is immutable - set at creation
- Renders only when
-
RelationshipSearchInput: Semantic search for finding nodes to link
- Debounced search as user types
- Searches opposite-type nodes (dream searches dreamers, vice versa)
-
EditorService: Save orchestration
- Uses parent
GitDreamNodeService.update()for metadata - Uses parent
GitDreamNodeService.updateRelationships()for links - Smart file deduplication (hash comparison to avoid duplicate copies)
- Uses parent
User clicks Save → UI calls handleSave() → calls saveEditModeChanges() (service)
↓
GitDreamNodeService.update() (parent)
GitDreamNodeService.updateRelationships() (parent)
Commands registered in commands.ts also use the service layer, ensuring
consistent behavior whether triggered via UI or command palette.
From dreamnode/:
DreamNodetypeGitDreamNodeService(via serviceManager)isValidDreamTalkMedia()- media file validationdreamNodeStyles,getNodeColors(),getNodeGlow()- visual styling
From semantic-search/:
semanticSearchService.searchOppositeTypeNodes()- relationship discovery