Ilya Ashikhmin cd937cf4ac fix(ui): keep paper host out of React-managed DOM; fix duplicate stroke-width in node SVGs
Paper.remove() during dispose deleted the React canvas div (StrictMode double
mount left a blank canvas). Duplicate XML attributes made 5 symbol data URIs
unparseable.

Also: README, Playwright smoke test (e2e/smoke.mjs), ES2022 lib.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 23:30:46 +02:00

72 lines
3.7 KiB
Markdown

# Pipeline Diagram Editor
Desktop editor for pipeline / utility network diagrams (water, heating, gas,
sewage, power, signal) built with **Tauri 2**, **React + TypeScript + Vite**
and **JointJS core** (SVG diagramming, MPL-2.0).
![stack](https://img.shields.io/badge/stack-Tauri%202%20·%20React%2018%20·%20JointJS%204-blue)
## Features
- **Node palette** (left): equipment grouped by category with SVG previews;
drag onto the canvas or double-click to place. Search filter included.
- **Ports & relations**: click a node to reveal its ports. Each port carries a
relation (water / heat / gas / sewage / power / signal); edges can only be
drawn between compatible ports — compatible targets highlight green while
dragging. Direction rules forbid out→out / in→in connections.
- **Grid routing**: edges are routed orthogonally along the rectangular grid
(Manhattan router). A configuration option draws an **arc (jumpover) at
line intersections**. Router, grid size, snapping — all configurable.
- **Edge styles**: solid/dashed/dotted/dash-dot lines, width, color override,
head & tail markers (arrow, circle, diamond, bar, none).
- **Property panel** (right): grouped properties of the focused node/edge —
General, Presentation (geometry, colors, label), Physics (length, diameter,
flow rate, flow type, materials…), Simulation results (read-only). Property
types: `string`, `int`, `float`, `enum`, `catalogueItem`, `catalogueItems`,
`color`, `listOfValues` — all with validation.
- **Catalogues**: pipe diameter series (DN), materials, media, insulation.
- **Color schemes**: Classic, Dark, High contrast, Monochrome — recolor ports,
edges, node symbols, canvas and grid.
- **Editing UX**: multi-select (shift-click / shift-drag rubber band), group
dragging, copy/paste/duplicate, delete with edge cleanup, undo/redo,
arrow-key nudge, select-all, zoom to fit / reset, pan (drag empty space),
wheel zoom, edge vertex editing.
- **Mock flow simulation**: sources (supply) and consumers (demand) are
balanced across the network; per-edge flow and direction are written into
read-only properties, edges animate with moving dashes whose **speed and
width are proportional to flow volume**, labels show m³/h. Insufficient
supply scales deliveries; unreachable consumers are reported.
- **Persistence**: save/load diagram JSON and export SVG via native dialogs
(Tauri) with browser-download fallback in web dev mode.
## Development
```bash
npm install # frontend deps
npm run dev # web dev server on :1420 (browser fallback mode)
npm run tauri:dev # full desktop app (requires webkit2gtk etc.)
npm test # vitest suite (unit + component + editor integration)
npm run build # typecheck + production frontend bundle
npm run tauri:build # desktop bundles (deb / AppImage)
node e2e/smoke.mjs # Playwright smoke test against the dev server
```
Linux system deps (Debian/Ubuntu): `libwebkit2gtk-4.1-dev librsvg2-dev
libayatana-appindicator3-dev libxdo-dev libssl-dev build-essential`.
## Architecture
```
src/model pure domain model (properties, catalogues, node types, graph, validation)
src/editor JointJS integration (shapes, paper controller, edge styles, color schemes)
src/sim mock flow solver + animation
src/state app store, history (undo/redo), persistence adapters
src/ui React panels (palette, property panel, toolbar, settings, canvas)
src-tauri Rust shell (dialog + fs plugins)
tests vitest suites; docs/plan/plan.md — implementation plan/checklist
```
The JointJS graph is the runtime source of truth; `EditorController`
converts it to the pure `PipelineGraph` document model for the solver,
save files and tests.