mirror of
https://github.com/OFFIS-ESC/constellation-analyzer
synced 2026-01-26 23:43:40 +00:00
312 lines
8.4 KiB
Markdown
312 lines
8.4 KiB
Markdown
# Constellation Analyzer
|
|
|
|
A React-based visual editor for creating and analyzing Constellation Analyses. Build interactive graphs to examine actors (nodes) and their relationships (edges) with a powerful drag-and-drop interface.
|
|
|
|
## Vibe-Warning
|
|
|
|
This is a testing ground for Agent Based LLM Coding. It presently does not contain hand-written code. Hence, please take the whole code-base with a grain of salt.
|
|
|
|
## Features
|
|
|
|
- **Interactive Graph Visualization**: Built on React Flow for smooth, performant graph editing
|
|
- **Customizable Node Types**: Define and configure multiple actor types with distinct visual properties
|
|
- **Flexible Edge Types**: Create various relationship categories with different styles and colors
|
|
- **Drag-and-Drop Interface**: Intuitive node manipulation and edge creation
|
|
- **Real-time Updates**: Instant visual feedback as you build your constellation
|
|
- **Type-Safe**: Full TypeScript support for robust development
|
|
- **State Management**: Zustand for lightweight, efficient state handling
|
|
- **Responsive Design**: Tailwind CSS for modern, adaptive UI
|
|
|
|
## Technology Stack
|
|
|
|
- **React 18.2** - UI framework
|
|
- **TypeScript 5.2** - Type safety
|
|
- **Vite 5.1** - Build tool and dev server
|
|
- **React Flow 11.11** - Graph visualization library
|
|
- **Zustand 4.5** - State management
|
|
- **Tailwind CSS 3.4** - Styling framework
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
|
|
- Node.js 20.x or higher
|
|
- npm 9.x or higher
|
|
|
|
### Installation
|
|
|
|
```bash
|
|
# Install dependencies
|
|
npm install
|
|
```
|
|
|
|
### Development
|
|
|
|
```bash
|
|
# Start development server (opens at http://localhost:3000)
|
|
npm run dev
|
|
```
|
|
|
|
### Build
|
|
|
|
```bash
|
|
# Build for production
|
|
npm run build
|
|
|
|
# Preview production build
|
|
npm run preview
|
|
```
|
|
|
|
### Lint
|
|
|
|
```bash
|
|
# Run ESLint
|
|
npm run lint
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
constellation-analyzer/
|
|
├── src/
|
|
│ ├── components/ # React components
|
|
│ │ ├── Editor/ # Main graph editor
|
|
│ │ │ └── GraphEditor.tsx
|
|
│ │ ├── Nodes/ # Custom node components
|
|
│ │ │ └── CustomNode.tsx
|
|
│ │ ├── Edges/ # Custom edge components
|
|
│ │ │ └── CustomEdge.tsx
|
|
│ │ └── Toolbar/ # Editor controls
|
|
│ │ └── Toolbar.tsx
|
|
│ ├── stores/ # Zustand state stores
|
|
│ │ ├── graphStore.ts # Graph state (nodes, edges, types)
|
|
│ │ └── editorStore.ts # Editor settings
|
|
│ ├── types/ # TypeScript definitions
|
|
│ │ └── index.ts
|
|
│ ├── utils/ # Utility functions
|
|
│ │ ├── nodeUtils.ts
|
|
│ │ └── edgeUtils.ts
|
|
│ ├── styles/ # Global styles
|
|
│ │ └── index.css
|
|
│ ├── App.tsx # Root component
|
|
│ ├── main.tsx # Entry point
|
|
│ └── vite-env.d.ts # Vite types
|
|
├── public/ # Static assets
|
|
├── index.html # HTML template
|
|
├── package.json # Dependencies
|
|
├── tsconfig.json # TypeScript config
|
|
├── vite.config.ts # Vite config
|
|
├── tailwind.config.js # Tailwind config
|
|
└── README.md # This file
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Adding Actors (Nodes)
|
|
|
|
1. Click any of the actor type buttons in the toolbar (Person, Organization, System, Concept)
|
|
2. A new node will appear on the canvas
|
|
3. Drag the node to position it
|
|
|
|
### Creating Relations (Edges)
|
|
|
|
1. Click and drag from any colored handle (circle) on a node
|
|
2. Release over a handle on another node to create a connection
|
|
3. The edge will automatically appear with default styling
|
|
|
|
### Deleting Elements
|
|
|
|
- **Delete Node**: Select a node and press `Delete` or `Backspace`
|
|
- **Delete Edge**: Select an edge and press `Delete` or `Backspace`
|
|
|
|
### Navigation
|
|
|
|
- **Pan**: Click and drag on empty canvas space
|
|
- **Zoom**: Use mouse wheel or pinch gesture
|
|
- **Fit View**: Use the controls in bottom-left corner
|
|
- **MiniMap**: View overview and navigate in bottom-right corner
|
|
|
|
## Core Concepts
|
|
|
|
### Actors (Nodes)
|
|
|
|
Actors represent entities in your analysis. Each actor has:
|
|
- **Type**: Category (person, organization, system, concept)
|
|
- **Label**: Display name
|
|
- **Description**: Optional details
|
|
- **Position**: X/Y coordinates on canvas
|
|
- **Metadata**: Custom properties
|
|
|
|
### Relations (Edges)
|
|
|
|
Relations connect actors to show relationships. Each relation has:
|
|
- **Type**: Category (collaborates, reports-to, depends-on, influences)
|
|
- **Label**: Optional description
|
|
- **Style**: Visual representation (solid, dashed, dotted)
|
|
- **Source/Target**: Connected actors
|
|
|
|
### Node Types
|
|
|
|
Pre-configured actor categories:
|
|
- **Person**: Individual (Blue)
|
|
- **Organization**: Company/group (Green)
|
|
- **System**: Technical system (Orange)
|
|
- **Concept**: Abstract idea (Purple)
|
|
|
|
### Edge Types
|
|
|
|
Pre-configured relationship categories:
|
|
- **Collaborates**: Working together (Blue, solid)
|
|
- **Reports To**: Hierarchical (Green, solid)
|
|
- **Depends On**: Dependency (Orange, dashed)
|
|
- **Influences**: Impact (Purple, dotted)
|
|
|
|
## Customization
|
|
|
|
### Adding New Node Types
|
|
|
|
Edit `/src/stores/graphStore.ts`:
|
|
|
|
```typescript
|
|
const defaultNodeTypes: NodeTypeConfig[] = [
|
|
// Add your custom type
|
|
{
|
|
id: 'custom-type',
|
|
label: 'Custom Type',
|
|
color: '#ff6b6b',
|
|
description: 'My custom actor type'
|
|
},
|
|
];
|
|
```
|
|
|
|
### Adding New Edge Types
|
|
|
|
Edit `/src/stores/graphStore.ts`:
|
|
|
|
```typescript
|
|
const defaultEdgeTypes: EdgeTypeConfig[] = [
|
|
// Add your custom type
|
|
{
|
|
id: 'custom-relation',
|
|
label: 'Custom Relation',
|
|
color: '#ff6b6b',
|
|
style: 'solid'
|
|
},
|
|
];
|
|
```
|
|
|
|
## Architecture Decisions
|
|
|
|
### Why React Flow?
|
|
- React-native components for seamless integration
|
|
- Excellent performance with large graphs
|
|
- Rich API for customization
|
|
- Active community and maintenance
|
|
|
|
### Why Zustand?
|
|
- Lightweight (< 1KB)
|
|
- Simple, hook-based API
|
|
- No boilerplate compared to Redux
|
|
- Perfect for graph state management
|
|
|
|
### Why Vite?
|
|
- Lightning-fast HMR (Hot Module Replacement)
|
|
- Modern build tool with ES modules
|
|
- Optimized production builds
|
|
- Better DX than Create React App
|
|
|
|
### Why Tailwind CSS?
|
|
- Rapid UI development
|
|
- Consistent design system
|
|
- Small production bundle (unused classes purged)
|
|
- Easy responsive design
|
|
|
|
## Development Guidelines
|
|
|
|
### ⚠️ Important: Always Use History-Tracked Operations
|
|
|
|
When modifying graph state in components, **always use `useGraphWithHistory()`** instead of `useGraphStore()` directly:
|
|
|
|
```typescript
|
|
// ✅ CORRECT: Uses history tracking (enables undo/redo)
|
|
import { useGraphWithHistory } from '../../hooks/useGraphWithHistory';
|
|
|
|
function MyComponent() {
|
|
const { addNode, updateNode, deleteNode } = useGraphWithHistory();
|
|
|
|
const handleAddNode = () => {
|
|
addNode(newNode); // Automatically tracked in history
|
|
};
|
|
}
|
|
```
|
|
|
|
```typescript
|
|
// ❌ WRONG: Bypasses history (undo/redo won't work)
|
|
import { useGraphStore } from '../../stores/graphStore';
|
|
|
|
function MyComponent() {
|
|
const graphStore = useGraphStore();
|
|
|
|
const handleAddNode = () => {
|
|
graphStore.addNode(newNode); // History not tracked!
|
|
};
|
|
}
|
|
```
|
|
|
|
**Exception**: Read-only access in presentation components (CustomNode, CustomEdge) is acceptable since it doesn't modify state.
|
|
|
|
### History-Tracked Operations
|
|
|
|
All these operations automatically create undo/redo history entries:
|
|
- Node operations: `addNode`, `updateNode`, `deleteNode`
|
|
- Edge operations: `addEdge`, `updateEdge`, `deleteEdge`
|
|
- Type operations: `addNodeType`, `updateNodeType`, `deleteNodeType`, `addEdgeType`, `updateEdgeType`, `deleteEdgeType`
|
|
- Utility: `clearGraph`
|
|
|
|
See `src/hooks/useGraphWithHistory.ts` for complete documentation.
|
|
|
|
## Next Steps
|
|
|
|
### Suggested Enhancements
|
|
|
|
1. **Data Persistence**
|
|
- Save/load graphs to/from JSON
|
|
- Local storage integration
|
|
- Export to PNG/SVG
|
|
|
|
2. **Advanced Editing**
|
|
- Multi-select nodes
|
|
- Copy/paste functionality
|
|
- ✅ Undo/redo history (implemented - per-document with 50 action limit)
|
|
|
|
3. **Node/Edge Properties Panel**
|
|
- Edit labels and descriptions
|
|
- Change types dynamically
|
|
- Add custom metadata
|
|
|
|
4. **Layout Algorithms**
|
|
- Auto-arrange nodes
|
|
- Hierarchical layout
|
|
- Force-directed layout
|
|
|
|
5. **Analysis Tools**
|
|
- Calculate graph metrics
|
|
- Find shortest paths
|
|
- Identify clusters
|
|
|
|
6. **Collaboration**
|
|
- Real-time multi-user editing
|
|
- Version control
|
|
- Comments and annotations
|
|
|
|
## Contributing
|
|
|
|
This is a new project. Contributions are welcome!
|
|
|
|
## License
|
|
|
|
MIT
|
|
|
|
## Support
|
|
|
|
For issues and questions, please open an issue on the repository.
|