@mhamz.01/easyflow-whiteboard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/components/node/custom-node-overlay-layer.d.ts +44 -0
  2. package/dist/components/node/custom-node-overlay-layer.d.ts.map +1 -0
  3. package/dist/components/node/custom-node-overlay-layer.js +353 -0
  4. package/dist/components/node/custom-node.d.ts +17 -0
  5. package/dist/components/node/custom-node.d.ts.map +1 -0
  6. package/dist/components/node/custom-node.js +63 -0
  7. package/dist/components/node/document-node.d.ts +14 -0
  8. package/dist/components/node/document-node.d.ts.map +1 -0
  9. package/dist/components/node/document-node.js +58 -0
  10. package/dist/components/toolbar/document-dropdown.d.ts +14 -0
  11. package/dist/components/toolbar/document-dropdown.d.ts.map +1 -0
  12. package/dist/components/toolbar/document-dropdown.js +66 -0
  13. package/dist/components/toolbar/options/arrow-options.d.ts +8 -0
  14. package/dist/components/toolbar/options/arrow-options.d.ts.map +1 -0
  15. package/dist/components/toolbar/options/arrow-options.js +109 -0
  16. package/dist/components/toolbar/options/erase-option.d.ts +2 -0
  17. package/dist/components/toolbar/options/erase-option.d.ts.map +1 -0
  18. package/dist/components/toolbar/options/erase-option.js +20 -0
  19. package/dist/components/toolbar/options/image-options.d.ts +2 -0
  20. package/dist/components/toolbar/options/image-options.d.ts.map +1 -0
  21. package/dist/components/toolbar/options/image-options.js +10 -0
  22. package/dist/components/toolbar/options/line-options.d.ts +2 -0
  23. package/dist/components/toolbar/options/line-options.d.ts.map +1 -0
  24. package/dist/components/toolbar/options/line-options.js +46 -0
  25. package/dist/components/toolbar/options/pen-option.d.ts +2 -0
  26. package/dist/components/toolbar/options/pen-option.d.ts.map +1 -0
  27. package/dist/components/toolbar/options/pen-option.js +53 -0
  28. package/dist/components/toolbar/options/shape-option.d.ts +6 -0
  29. package/dist/components/toolbar/options/shape-option.d.ts.map +1 -0
  30. package/dist/components/toolbar/options/shape-option.js +58 -0
  31. package/dist/components/toolbar/options/text-option.d.ts +2 -0
  32. package/dist/components/toolbar/options/text-option.d.ts.map +1 -0
  33. package/dist/components/toolbar/options/text-option.js +73 -0
  34. package/dist/components/toolbar/task-dropdown.d.ts +15 -0
  35. package/dist/components/toolbar/task-dropdown.d.ts.map +1 -0
  36. package/dist/components/toolbar/task-dropdown.js +85 -0
  37. package/dist/components/toolbar/toolbar-button.d.ts +12 -0
  38. package/dist/components/toolbar/toolbar-button.d.ts.map +1 -0
  39. package/dist/components/toolbar/toolbar-button.js +8 -0
  40. package/dist/components/toolbar/toolbar-seperator.d.ts +6 -0
  41. package/dist/components/toolbar/toolbar-seperator.d.ts.map +1 -0
  42. package/dist/components/toolbar/toolbar-seperator.js +5 -0
  43. package/dist/components/toolbar/tooloptions-panel.d.ts +8 -0
  44. package/dist/components/toolbar/tooloptions-panel.d.ts.map +1 -0
  45. package/dist/components/toolbar/tooloptions-panel.js +88 -0
  46. package/dist/components/toolbar/whiteboard-toolbar.d.ts +28 -0
  47. package/dist/components/toolbar/whiteboard-toolbar.d.ts.map +1 -0
  48. package/dist/components/toolbar/whiteboard-toolbar.js +160 -0
  49. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  50. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  51. package/dist/components/ui/dropdown-menu.js +51 -0
  52. package/dist/components/ui/label.d.ts +5 -0
  53. package/dist/components/ui/label.d.ts.map +1 -0
  54. package/dist/components/ui/label.js +8 -0
  55. package/dist/components/ui/slider.d.ts +5 -0
  56. package/dist/components/ui/slider.d.ts.map +1 -0
  57. package/dist/components/ui/slider.js +14 -0
  58. package/dist/components/whiteboard/whiteboard-test.d.ts +2 -0
  59. package/dist/components/whiteboard/whiteboard-test.d.ts.map +1 -0
  60. package/dist/components/whiteboard/whiteboard-test.js +207 -0
  61. package/dist/components/whiteboard/whiteboard.d.ts +1 -0
  62. package/dist/components/whiteboard/whiteboard.d.ts.map +1 -0
  63. package/dist/components/whiteboard/whiteboard.js +911 -0
  64. package/dist/components/zoomcontrol/zoom-control.d.ts +9 -0
  65. package/dist/components/zoomcontrol/zoom-control.d.ts.map +1 -0
  66. package/dist/components/zoomcontrol/zoom-control.js +7 -0
  67. package/dist/hooks/useCanvasInit.d.ts +15 -0
  68. package/dist/hooks/useCanvasInit.d.ts.map +1 -0
  69. package/dist/hooks/useCanvasInit.js +89 -0
  70. package/dist/hooks/useDrawing.d.ts +23 -0
  71. package/dist/hooks/useDrawing.d.ts.map +1 -0
  72. package/dist/hooks/useDrawing.js +142 -0
  73. package/dist/hooks/useEraser.d.ts +27 -0
  74. package/dist/hooks/useEraser.d.ts.map +1 -0
  75. package/dist/hooks/useEraser.js +143 -0
  76. package/dist/hooks/useLiveUpdate.d.ts +9 -0
  77. package/dist/hooks/useLiveUpdate.d.ts.map +1 -0
  78. package/dist/hooks/useLiveUpdate.js +63 -0
  79. package/dist/hooks/useMouseHandlers.d.ts +25 -0
  80. package/dist/hooks/useMouseHandlers.d.ts.map +1 -0
  81. package/dist/hooks/useMouseHandlers.js +44 -0
  82. package/dist/hooks/usePan.d.ts +17 -0
  83. package/dist/hooks/usePan.d.ts.map +1 -0
  84. package/dist/hooks/usePan.js +80 -0
  85. package/dist/hooks/usePersistance.d.ts +13 -0
  86. package/dist/hooks/usePersistance.d.ts.map +1 -0
  87. package/dist/hooks/usePersistance.js +79 -0
  88. package/dist/hooks/useSelection.d.ts +21 -0
  89. package/dist/hooks/useSelection.d.ts.map +1 -0
  90. package/dist/hooks/useSelection.js +142 -0
  91. package/dist/hooks/useTextStyle.d.ts +9 -0
  92. package/dist/hooks/useTextStyle.d.ts.map +1 -0
  93. package/dist/hooks/useTextStyle.js +32 -0
  94. package/dist/hooks/useToolManager.d.ts +15 -0
  95. package/dist/hooks/useToolManager.d.ts.map +1 -0
  96. package/dist/hooks/useToolManager.js +115 -0
  97. package/dist/hooks/useZoom.d.ts +25 -0
  98. package/dist/hooks/useZoom.d.ts.map +1 -0
  99. package/dist/hooks/useZoom.js +133 -0
  100. package/dist/index.d.ts +4 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +30 -0
  103. package/dist/lib/eraser-brush.d.ts +1 -0
  104. package/dist/lib/eraser-brush.d.ts.map +1 -0
  105. package/dist/lib/eraser-brush.js +21 -0
  106. package/dist/lib/fabric-arrow.d.ts +16 -0
  107. package/dist/lib/fabric-arrow.d.ts.map +1 -0
  108. package/dist/lib/fabric-arrow.js +50 -0
  109. package/dist/lib/fabric-bidirectional-arrow.d.ts +20 -0
  110. package/dist/lib/fabric-bidirectional-arrow.d.ts.map +1 -0
  111. package/dist/lib/fabric-bidirectional-arrow.js +65 -0
  112. package/dist/lib/fabric-frame.d.ts +7 -0
  113. package/dist/lib/fabric-frame.d.ts.map +1 -0
  114. package/dist/lib/fabric-frame.js +25 -0
  115. package/dist/lib/fabric-utils.d.ts +30 -0
  116. package/dist/lib/fabric-utils.d.ts.map +1 -0
  117. package/dist/lib/fabric-utils.js +273 -0
  118. package/dist/lib/utils.d.ts +3 -0
  119. package/dist/lib/utils.d.ts.map +1 -0
  120. package/dist/lib/utils.js +5 -0
  121. package/dist/store/whiteboard-store.d.ts +99 -0
  122. package/dist/store/whiteboard-store.d.ts.map +1 -0
  123. package/dist/store/whiteboard-store.js +137 -0
  124. package/dist/types/canvas-node.d.ts +24 -0
  125. package/dist/types/canvas-node.d.ts.map +1 -0
  126. package/dist/types/canvas-node.js +1 -0
  127. package/package.json +34 -0
@@ -0,0 +1,207 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useState } from "react";
4
+ import { classRegistry } from "fabric";
5
+ import { useWhiteboardStore } from "../../store/whiteboard-store";
6
+ import WhiteboardToolbar from "../toolbar/whiteboard-toolbar";
7
+ import ToolOptionsPanel from "../toolbar/tooloptions-panel";
8
+ import CanvasOverlayLayer from "../node/custom-node-overlay-layer";
9
+ import ZoomControls from "../zoomcontrol/zoom-control";
10
+ import { Frame } from "../../lib/fabric-frame";
11
+ // Import all hooks
12
+ import { useCanvasInit } from "../../hooks/useCanvasInit";
13
+ import { useToolManager } from "../../hooks/useToolManager";
14
+ import { useDrawing } from "../../hooks/useDrawing";
15
+ import { useEraser } from "../../hooks/useEraser";
16
+ import { usePan } from "../../hooks/usePan";
17
+ import { useZoom } from "../../hooks/useZoom";
18
+ import { useSelection } from "../../hooks/useSelection";
19
+ import { useTextStyle } from "../../hooks/useTextStyle";
20
+ import { useLiveUpdate } from "../../hooks/useLiveUpdate";
21
+ import { useMouseHandlers } from "../../hooks/useMouseHandlers";
22
+ import { usePersistence } from "../../hooks/usePersistance";
23
+ classRegistry.setClass(Frame, "frame");
24
+ export default function FabricWhiteboard() {
25
+ // Refs
26
+ const canvasRef = useRef(null);
27
+ const fabricCanvasRef = useRef(null);
28
+ const containerRef = useRef(null);
29
+ const isDrawingRef = useRef(false);
30
+ const startPointRef = useRef(null);
31
+ const currentShapeRef = useRef(null);
32
+ const suppressHistoryRef = useRef(false);
33
+ const isRestoringRef = useRef(false);
34
+ // Eraser refs
35
+ const eraserTraceRef = useRef(null);
36
+ const eraserTargetsRef = useRef(new Set());
37
+ const eraserActiveRef = useRef(false);
38
+ const eraserPathRef = useRef(null);
39
+ const eraserPathPointsRef = useRef([]);
40
+ // Store
41
+ const activeTool = useWhiteboardStore((state) => state.activeTool);
42
+ const toolOptions = useWhiteboardStore((state) => state.toolOptions);
43
+ const addCanvasObject = useWhiteboardStore((state) => state.addCanvasObject);
44
+ const pushHistory = useWhiteboardStore((state) => state.pushHistory);
45
+ // State
46
+ const [tasks, setTasks] = useState([]);
47
+ const [documents, setDocuments] = useState([]);
48
+ const [canvasZoom, setCanvasZoom] = useState(1);
49
+ const [canvasViewport, setCanvasViewport] = useState({ x: 0, y: 0 });
50
+ const [selectionBox, setSelectionBox] = useState(null);
51
+ const [selectedCanvasObjects, setSelectedCanvasObjects] = useState([]);
52
+ const MIN_ZOOM = 0.1;
53
+ const MAX_ZOOM = 5;
54
+ const ZOOM_STEP = 0.1;
55
+ // Initialize canvas
56
+ useCanvasInit({
57
+ canvasRef,
58
+ fabricCanvasRef,
59
+ activeTool,
60
+ suppressHistoryRef,
61
+ isRestoringRef,
62
+ pushHistory,
63
+ setTasks, // Passed so hook can load saved tasks
64
+ setDocuments, // Passed so hook can load saved docs
65
+ });
66
+ // 2. High-Efficiency Persistence (Auto-saving)
67
+ // This replaces the inline "saveState" listeners you had before
68
+ usePersistence({
69
+ fabricCanvas: fabricCanvasRef,
70
+ tasks,
71
+ documents,
72
+ pushHistory,
73
+ isRestoringRef,
74
+ suppressHistoryRef,
75
+ });
76
+ // 3. Tool management (Existing)
77
+ useToolManager({
78
+ fabricCanvas: fabricCanvasRef,
79
+ activeTool,
80
+ toolOptions,
81
+ eraserTraceRef,
82
+ eraserPathRef,
83
+ eraserPathPointsRef,
84
+ eraserTargetsRef,
85
+ });
86
+ // Drawing handlers
87
+ const drawingHandlers = useDrawing({
88
+ fabricCanvas: fabricCanvasRef,
89
+ activeTool,
90
+ toolOptions,
91
+ isDrawingRef,
92
+ startPointRef,
93
+ currentShapeRef,
94
+ suppressHistoryRef,
95
+ pushHistory,
96
+ addCanvasObject,
97
+ });
98
+ // Eraser handlers
99
+ const eraserHandlers = useEraser({
100
+ fabricCanvas: fabricCanvasRef,
101
+ activeTool,
102
+ toolOptions,
103
+ eraserTraceRef,
104
+ eraserTargetsRef,
105
+ eraserActiveRef,
106
+ eraserPathRef,
107
+ eraserPathPointsRef,
108
+ suppressHistoryRef,
109
+ pushHistory,
110
+ });
111
+ // Zoom
112
+ const { handleZoom } = useZoom({
113
+ fabricCanvas: fabricCanvasRef,
114
+ MIN_ZOOM,
115
+ MAX_ZOOM,
116
+ canvasZoom,
117
+ canvasViewport,
118
+ setCanvasZoom,
119
+ setCanvasViewport,
120
+ });
121
+ // Pan
122
+ usePan({
123
+ fabricCanvas: fabricCanvasRef,
124
+ activeTool,
125
+ handleZoom,
126
+ setCanvasViewport,
127
+ });
128
+ // Selection
129
+ useSelection({
130
+ fabricCanvas: fabricCanvasRef,
131
+ activeTool,
132
+ canvasZoom,
133
+ canvasViewport,
134
+ setSelectionBox,
135
+ setSelectedCanvasObjects,
136
+ isDrawingRef,
137
+ });
138
+ // Text style updates
139
+ useTextStyle({
140
+ fabricCanvas: fabricCanvasRef,
141
+ toolOptions,
142
+ });
143
+ // Live updates
144
+ useLiveUpdate({
145
+ fabricCanvas: fabricCanvasRef,
146
+ toolOptions,
147
+ });
148
+ // Mouse handlers
149
+ useMouseHandlers({
150
+ fabricCanvas: fabricCanvasRef,
151
+ activeTool,
152
+ toolOptions,
153
+ drawingHandlers,
154
+ eraserHandlers,
155
+ });
156
+ // Zoom controls
157
+ const handleZoomIn = () => handleZoom(canvasZoom + ZOOM_STEP);
158
+ const handleZoomOut = () => handleZoom(canvasZoom - ZOOM_STEP);
159
+ const handleResetZoom = () => handleZoom(1);
160
+ // Dropdown handlers
161
+ const handleAddTaskFromDropdown = (taskTemplate) => {
162
+ const canvas = fabricCanvasRef.current;
163
+ if (!canvas)
164
+ return;
165
+ const vpt = canvas.viewportTransform;
166
+ if (!vpt)
167
+ return;
168
+ const cx = (canvas.getWidth() / 2 - vpt[4]) / canvasZoom;
169
+ const cy = (canvas.getHeight() / 2 - vpt[5]) / canvasZoom;
170
+ setTasks((prev) => [
171
+ ...prev,
172
+ {
173
+ ...taskTemplate,
174
+ id: `${taskTemplate.id}-${Date.now()}`,
175
+ x: cx - 150,
176
+ y: cy - 60,
177
+ },
178
+ ]);
179
+ };
180
+ const handleAddDocumentFromDropdown = (docTemplate) => {
181
+ const canvas = fabricCanvasRef.current;
182
+ if (!canvas)
183
+ return;
184
+ const vpt = canvas.viewportTransform;
185
+ if (!vpt)
186
+ return;
187
+ const cx = (canvas.getWidth() / 2 - vpt[4]) / canvasZoom;
188
+ const cy = (canvas.getHeight() / 2 - vpt[5]) / canvasZoom;
189
+ setDocuments((prev) => [
190
+ ...prev,
191
+ {
192
+ ...docTemplate,
193
+ id: `${docTemplate.id}-${Date.now()}`,
194
+ x: cx - 150,
195
+ y: cy - 80,
196
+ },
197
+ ]);
198
+ };
199
+ return (_jsxs("div", { ref: containerRef, className: "relative w-full h-screen overflow-hidden bg-[#0b0b0b]", style: {
200
+ touchAction: "none",
201
+ overscrollBehavior: "none",
202
+ }, children: [_jsx("div", { className: "absolute inset-0 pointer-events-none", style: {
203
+ backgroundImage: `radial-gradient(circle, rgba(255,255,255,0.2) 1.2px, transparent 1.2px)`,
204
+ backgroundSize: "40px 40px",
205
+ zIndex: 0,
206
+ } }), _jsx("canvas", { ref: canvasRef, className: "absolute inset-0", style: { zIndex: 1 } }), _jsx(CanvasOverlayLayer, { tasks: tasks, documents: documents, onTasksUpdate: setTasks, onDocumentsUpdate: setDocuments, canvasZoom: canvasZoom, canvasViewport: canvasViewport, selectionBox: selectionBox, selectedCanvasObjects: selectedCanvasObjects, fabricCanvas: fabricCanvasRef }), _jsxs("div", { className: "absolute inset-0 pointer-events-none", style: { zIndex: 100 }, children: [_jsx("div", { className: "pointer-events-auto", children: _jsx(WhiteboardToolbar, { fabricCanvas: fabricCanvasRef, isRestoringRef: isRestoringRef, onAddTask: handleAddTaskFromDropdown, onAddDocument: handleAddDocumentFromDropdown }) }), _jsx("div", { className: "pointer-events-auto", children: _jsx(ToolOptionsPanel, { fabricCanvas: fabricCanvasRef }) }), _jsx("div", { className: "pointer-events-auto", children: _jsx(ZoomControls, { zoom: canvasZoom, onZoomIn: handleZoomIn, onZoomOut: handleZoomOut, onResetZoom: handleResetZoom }) })] })] }));
207
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=whiteboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whiteboard.d.ts","sourceRoot":"","sources":["../../../src/components/whiteboard/whiteboard.tsx"],"names":[],"mappings":""}