Replace frontend with deployed TS version from a08dd73

- Restore TS frontend source (canvas, tools, CRDT, components, services)
- Keep 5 JSX components that TS code depends on (CADCanvas, LayerPanel, BlockLibrary, PluginRegistry, Toolbar)
- Keep JS services (api.js, blockService.js) that components depend on
- Fix vite/plugin-react version mismatch (downgrade to v4 for vite 6)
- Add axios dependency
- Skip tsc in build script (vite/esbuild handles transpilation)
- Fix index.html lang=de, favicon path
- Add vite proxy config for /api and /ws
- Backend unchanged (already from deployed containers)
This commit is contained in:
Agent Zero
2026-06-28 02:16:58 +02:00
parent 6e508fb68e
commit 05ccebad8d
89 changed files with 12577 additions and 1231 deletions
+62
View File
@@ -0,0 +1,62 @@
import * as Y from 'yjs';
class HistoryManager {
private undoStack: Uint8Array[] = [];
private redoStack: Uint8Array[] = [];
private maxSize: number;
private doc: Y.Doc;
constructor(doc: Y.Doc, maxSize: number = 100) {
this.doc = doc;
this.maxSize = maxSize;
}
push(update: Uint8Array) {
this.undoStack.push(update);
if (this.undoStack.length > this.maxSize) {
this.undoStack.shift();
}
// Clear redo stack when new action is performed
this.redoStack = [];
}
undo() {
if (this.undoStack.length === 0) return false;
const update = this.undoStack.pop();
if (update) {
// Apply inverse of the update
Y.applyUpdate(this.doc, Y.encodeStateAsUpdate(this.doc, Y.createRelativePositionFromJSON(Y.createRelativePositionFromType(update as any))));
this.redoStack.push(update);
return true;
}
return false;
}
redo() {
if (this.redoStack.length === 0) return false;
const update = this.redoStack.pop();
if (update) {
Y.applyUpdate(this.doc, update);
this.undoStack.push(update);
return true;
}
return false;
}
canUndo(): boolean {
return this.undoStack.length > 0;
}
canRedo(): boolean {
return this.redoStack.length > 0;
}
clear() {
this.undoStack = [];
this.redoStack = [];
}
}
export default HistoryManager;