@markup-canvas/react 1.0.6 → 1.0.8
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.
- package/README.md +101 -6
- package/dist/hooks/useMarkupCanvas.d.ts +7 -0
- package/dist/index.cjs.js +54 -4
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +54 -4
- package/dist/index.esm.js.map +1 -1
- package/dist/types/index.d.ts +41 -0
- package/package.json +3 -3
- package/src/components/MarkupCanvas.tsx +26 -3
- package/src/hooks/useMarkupCanvas.ts +38 -0
- package/src/types/index.ts +39 -0
package/README.md
CHANGED
|
@@ -112,6 +112,8 @@ The `MarkupCanvas` component accepts the following props:
|
|
|
112
112
|
|------|------|---------|-------------|
|
|
113
113
|
| `enableRulers` | `boolean` | `true` | Show rulers on top and left |
|
|
114
114
|
| `enableGrid` | `boolean` | `false` | Show background grid |
|
|
115
|
+
| `showRulers` | `boolean` | `true` | Initially show rulers (only applies if `enableRulers` is true) |
|
|
116
|
+
| `showGrid` | `boolean` | `false` | Initially show grid (only applies if `enableGrid` is true) |
|
|
115
117
|
| `gridColor` | `string` | `"#e0e0e0"` | Grid line color |
|
|
116
118
|
|
|
117
119
|
**Ruler Styling**
|
|
@@ -121,12 +123,22 @@ The `MarkupCanvas` component accepts the following props:
|
|
|
121
123
|
| `rulerBackgroundColor` | `string` | `"#f5f5f5"` | Ruler background color |
|
|
122
124
|
| `rulerBorderColor` | `string` | `"#d0d0d0"` | Ruler border color |
|
|
123
125
|
| `rulerTextColor` | `string` | `"#666666"` | Ruler text color |
|
|
124
|
-
| `
|
|
125
|
-
| `rulerMinorTickColor` | `string` | `"#999999"` | Minor tick mark color |
|
|
126
|
+
| `rulerTickColor` | `string` | `"#cccccc"` | Tick mark color |
|
|
126
127
|
| `rulerFontSize` | `number` | `12` | Ruler font size in pixels |
|
|
127
128
|
| `rulerFontFamily` | `string` | `"monospace"` | Ruler font family |
|
|
128
129
|
| `rulerUnits` | `string` | `"px"` | Ruler units label |
|
|
129
130
|
|
|
131
|
+
**Dark Theme Support**
|
|
132
|
+
|
|
133
|
+
| Prop | Type | Default | Description |
|
|
134
|
+
|------|------|---------|-------------|
|
|
135
|
+
| `themeMode` | `"light" \| "dark"` | `"light"` | Current theme mode |
|
|
136
|
+
| `rulerBackgroundColorDark` | `string` | `"rgba(30, 30, 30, 0.95)"` | Dark mode ruler background color |
|
|
137
|
+
| `rulerBorderColorDark` | `string` | `"#444"` | Dark mode ruler border color |
|
|
138
|
+
| `rulerTextColorDark` | `string` | `"#aaa"` | Dark mode ruler text color |
|
|
139
|
+
| `rulerTickColorDark` | `string` | `"#383838"` | Dark mode tick mark color |
|
|
140
|
+
| `gridColorDark` | `string` | `"rgba(255, 255, 255, 0.1)"` | Dark mode grid line color |
|
|
141
|
+
|
|
130
142
|
**React-Specific Props**
|
|
131
143
|
|
|
132
144
|
| Prop | Type | Default | Description |
|
|
@@ -162,6 +174,7 @@ The `MarkupCanvas` component accepts the following props:
|
|
|
162
174
|
maxZoom={10}
|
|
163
175
|
gridColor="#e8e8e8"
|
|
164
176
|
rulerBackgroundColor="#fafafa"
|
|
177
|
+
themeMode="light"
|
|
165
178
|
enableClickToZoom={true}
|
|
166
179
|
clickZoomLevel={2}
|
|
167
180
|
onZoomChange={(zoom) => console.log('Zoom:', zoom)}
|
|
@@ -173,6 +186,41 @@ The `MarkupCanvas` component accepts the following props:
|
|
|
173
186
|
</MarkupCanvas>
|
|
174
187
|
```
|
|
175
188
|
|
|
189
|
+
**Theme Switching Example**
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
import { useRef, useState } from 'react';
|
|
193
|
+
import { MarkupCanvas, type MarkupCanvasRef } from '@markup-canvas/react';
|
|
194
|
+
|
|
195
|
+
function App() {
|
|
196
|
+
const canvasRef = useRef<MarkupCanvasRef>(null);
|
|
197
|
+
const [themeMode, setThemeMode] = useState<'light' | 'dark'>('light');
|
|
198
|
+
|
|
199
|
+
const handleThemeToggle = () => {
|
|
200
|
+
const newMode = themeMode === 'light' ? 'dark' : 'light';
|
|
201
|
+
setThemeMode(newMode);
|
|
202
|
+
canvasRef.current?.updateThemeMode(newMode);
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
return (
|
|
206
|
+
<div>
|
|
207
|
+
<button onClick={handleThemeToggle}>Toggle Theme</button>
|
|
208
|
+
|
|
209
|
+
<MarkupCanvas
|
|
210
|
+
ref={canvasRef}
|
|
211
|
+
width={20000}
|
|
212
|
+
height={15000}
|
|
213
|
+
themeMode={themeMode}
|
|
214
|
+
enableRulers={true}
|
|
215
|
+
enableGrid={true}
|
|
216
|
+
>
|
|
217
|
+
<div>Your content here</div>
|
|
218
|
+
</MarkupCanvas>
|
|
219
|
+
</div>
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
176
224
|
### useMarkupCanvas Hook
|
|
177
225
|
|
|
178
226
|
The `useMarkupCanvas` hook provides convenient access to canvas methods.
|
|
@@ -185,13 +233,26 @@ import { MarkupCanvas, type MarkupCanvasRef, useMarkupCanvas } from '@markup-can
|
|
|
185
233
|
function App() {
|
|
186
234
|
const canvasRef = useRef<MarkupCanvasRef>(null);
|
|
187
235
|
|
|
188
|
-
const {
|
|
236
|
+
const {
|
|
237
|
+
initCanvasUtils,
|
|
238
|
+
zoom,
|
|
239
|
+
zoomIn,
|
|
240
|
+
zoomOut,
|
|
241
|
+
fitToContent,
|
|
242
|
+
resetZoom,
|
|
243
|
+
themeMode,
|
|
244
|
+
toggleThemeMode,
|
|
245
|
+
updateThemeMode,
|
|
246
|
+
} = useMarkupCanvas(canvasRef);
|
|
189
247
|
|
|
190
248
|
return (
|
|
191
249
|
<div style={{ width: '100vw', height: '100vh' }}>
|
|
192
250
|
<button onClick={() => zoomIn()}>Zoom In</button>
|
|
193
251
|
<button onClick={() => zoomOut()}>Zoom Out</button>
|
|
194
252
|
<button onClick={() => fitToContent()}>Fit to Content</button>
|
|
253
|
+
<button onClick={toggleThemeMode}>
|
|
254
|
+
Toggle Theme (Current: {themeMode})
|
|
255
|
+
</button>
|
|
195
256
|
<span>Current zoom: {zoom.toFixed(2)}</span>
|
|
196
257
|
|
|
197
258
|
<MarkupCanvas
|
|
@@ -200,6 +261,7 @@ function App() {
|
|
|
200
261
|
height={15000}
|
|
201
262
|
enableZoom={true}
|
|
202
263
|
enablePan={true}
|
|
264
|
+
themeMode={themeMode}
|
|
203
265
|
onReady={initCanvasUtils} // Required for hook to work
|
|
204
266
|
>
|
|
205
267
|
<div style={{ position: 'absolute', top: 100, left: 100 }}>
|
|
@@ -211,9 +273,42 @@ function App() {
|
|
|
211
273
|
}
|
|
212
274
|
```
|
|
213
275
|
|
|
214
|
-
|
|
276
|
+
**Hook Return Values**
|
|
277
|
+
|
|
278
|
+
The `useMarkupCanvas` hook returns an object with the following properties and methods:
|
|
279
|
+
|
|
280
|
+
| Property/Method | Type | Description |
|
|
281
|
+
|-----------------|------|-------------|
|
|
282
|
+
| `canvas` | `MarkupCanvas \| null` | The canvas instance |
|
|
283
|
+
| `initCanvasUtils` | `(canvas: MarkupCanvas) => void` | Initialize function to pass to `onReady` |
|
|
284
|
+
| `transform` | `Transform` | Current canvas transform |
|
|
285
|
+
| `zoom` | `number` | Current zoom level |
|
|
286
|
+
| `pan` | `{ x: number; y: number }` | Current pan position |
|
|
287
|
+
| `isReady` | `boolean` | Whether canvas is ready |
|
|
288
|
+
| `zoomIn` | `(factor?: number) => void` | Zoom in by factor |
|
|
289
|
+
| `zoomOut` | `(factor?: number) => void` | Zoom out by factor |
|
|
290
|
+
| `resetZoom` | `() => void` | Reset zoom to 100% |
|
|
291
|
+
| `panTo` | `(x: number, y: number) => void` | Pan to specific coordinates |
|
|
292
|
+
| `fitToContent` | `() => void` | Fit content to viewport |
|
|
293
|
+
| `centerContent` | `() => void` | Center content on canvas |
|
|
294
|
+
| `setTransitionMode` | `(enabled: boolean) => void` | Enable/disable transitions |
|
|
295
|
+
| `toggleTransitionMode` | `() => boolean` | Toggle transition mode |
|
|
296
|
+
| `themeMode` | `"light" \| "dark"` | Current theme mode |
|
|
297
|
+
| `updateThemeMode` | `(mode: "light" \| "dark") => void` | Update theme mode |
|
|
298
|
+
| `toggleThemeMode` | `() => "light" \| "dark"` | Toggle between themes |
|
|
299
|
+
| `toggleRulers` | `() => void` | Toggle rulers visibility |
|
|
300
|
+
| `showRulers` | `() => void` | Show rulers |
|
|
301
|
+
| `hideRulers` | `() => void` | Hide rulers |
|
|
302
|
+
| `areRulersVisible` | `() => boolean` | Check if rulers are visible |
|
|
303
|
+
| `showRulersState` | `boolean` | Current rulers visibility state |
|
|
304
|
+
| `toggleGrid` | `() => void` | Toggle grid visibility |
|
|
305
|
+
| `showGrid` | `() => void` | Show grid |
|
|
306
|
+
| `hideGrid` | `() => void` | Hide grid |
|
|
307
|
+
| `isGridVisible` | `() => boolean` | Check if grid is visible |
|
|
308
|
+
| `showGridState` | `boolean` | Current grid visibility state |
|
|
309
|
+
|
|
310
|
+
## License
|
|
215
311
|
|
|
216
312
|
**CC BY-NC 4.0** - Creative Commons Attribution-NonCommercial 4.0 International
|
|
217
313
|
|
|
218
|
-
This project is licensed for non-commercial use only. See the [LICENSE](../../LICENSE) file for details.
|
|
219
|
-
|
|
314
|
+
This project is licensed for non-commercial use only. See the [LICENSE](../../LICENSE) file for details.
|
|
@@ -19,4 +19,11 @@ export declare function useMarkupCanvas(canvasRef: RefObject<MarkupCanvasRef | n
|
|
|
19
19
|
centerContent: () => void;
|
|
20
20
|
setTransitionMode: (enabled: boolean) => void;
|
|
21
21
|
toggleTransitionMode: () => boolean;
|
|
22
|
+
themeMode: "light" | "dark";
|
|
23
|
+
updateThemeMode: (mode: "light" | "dark") => void;
|
|
24
|
+
toggleThemeMode: () => "light" | "dark";
|
|
25
|
+
toggleRulers: () => void;
|
|
26
|
+
areRulersVisible: () => boolean;
|
|
27
|
+
toggleGrid: () => void;
|
|
28
|
+
isGridVisible: () => boolean;
|
|
22
29
|
};
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Markup Canvas React
|
|
3
3
|
* React components and hooks for markup-canvas
|
|
4
|
-
* @version 1.0.
|
|
4
|
+
* @version 1.0.8
|
|
5
5
|
*/
|
|
6
6
|
'use strict';
|
|
7
7
|
|
|
@@ -12,6 +12,7 @@ var react = require('react');
|
|
|
12
12
|
const MarkupCanvas = react.forwardRef(({ children, className, style, onTransformChange, onZoomChange, onPanChange, onReady, ...options }, ref) => {
|
|
13
13
|
const containerRef = react.useRef(null);
|
|
14
14
|
const [canvasInstance, setCanvasInstance] = react.useState(null);
|
|
15
|
+
const themeModeRef = react.useRef(options.themeMode);
|
|
15
16
|
react.useImperativeHandle(ref, () => ({
|
|
16
17
|
canvas: canvasInstance,
|
|
17
18
|
zoomIn: (factor = 0.1) => canvasInstance?.zoomIn(factor),
|
|
@@ -22,6 +23,15 @@ const MarkupCanvas = react.forwardRef(({ children, className, style, onTransform
|
|
|
22
23
|
centerContent: () => canvasInstance?.centerContent(),
|
|
23
24
|
getTransform: () => canvasInstance?.transform || { scale: 1, translateX: 0, translateY: 0 },
|
|
24
25
|
getZoom: () => canvasInstance?.transform?.scale || 1,
|
|
26
|
+
updateThemeMode: (mode) => canvasInstance?.updateThemeMode(mode),
|
|
27
|
+
toggleRulers: () => canvasInstance?.toggleRulers(),
|
|
28
|
+
showRulers: () => canvasInstance?.showRulers(),
|
|
29
|
+
hideRulers: () => canvasInstance?.hideRulers(),
|
|
30
|
+
areRulersVisible: () => canvasInstance?.areRulersVisible() ?? false,
|
|
31
|
+
toggleGrid: () => canvasInstance?.toggleGrid(),
|
|
32
|
+
showGrid: () => canvasInstance?.showGrid(),
|
|
33
|
+
hideGrid: () => canvasInstance?.hideGrid(),
|
|
34
|
+
isGridVisible: () => canvasInstance?.isGridVisible() ?? false,
|
|
25
35
|
}), [canvasInstance]);
|
|
26
36
|
const onTransformChangeRef = react.useRef(onTransformChange);
|
|
27
37
|
const onZoomChangeRef = react.useRef(onZoomChange);
|
|
@@ -43,11 +53,15 @@ const MarkupCanvas = react.forwardRef(({ children, className, style, onTransform
|
|
|
43
53
|
const handleReady = react.useCallback((canvas) => {
|
|
44
54
|
onReadyRef.current?.(canvas);
|
|
45
55
|
}, []);
|
|
46
|
-
|
|
56
|
+
// Separate theme mode from other options
|
|
57
|
+
const { themeMode, ...configOptions } = options;
|
|
58
|
+
// Create stable reference for non-theme options using JSON serialization
|
|
59
|
+
const stableConfigJson = react.useMemo(() => JSON.stringify(configOptions), [configOptions]);
|
|
60
|
+
// Handle canvas creation with non-theme options
|
|
47
61
|
react.useEffect(() => {
|
|
48
62
|
if (!containerRef.current)
|
|
49
63
|
return;
|
|
50
|
-
const canvas = new core.MarkupCanvas(containerRef.current,
|
|
64
|
+
const canvas = new core.MarkupCanvas(containerRef.current, configOptions);
|
|
51
65
|
setCanvasInstance(canvas);
|
|
52
66
|
canvas.on("transform", handleTransformChange);
|
|
53
67
|
canvas.on("zoom", handleZoomChange);
|
|
@@ -67,7 +81,14 @@ const MarkupCanvas = react.forwardRef(({ children, className, style, onTransform
|
|
|
67
81
|
canvas.cleanup();
|
|
68
82
|
setCanvasInstance(null);
|
|
69
83
|
};
|
|
70
|
-
}, [
|
|
84
|
+
}, [stableConfigJson, handleTransformChange, handleZoomChange, handlePanChange, handleReady]);
|
|
85
|
+
// Handle theme changes separately without recreating the canvas
|
|
86
|
+
react.useEffect(() => {
|
|
87
|
+
if (!canvasInstance || themeMode === themeModeRef.current)
|
|
88
|
+
return;
|
|
89
|
+
canvasInstance.updateThemeMode(themeMode || "light");
|
|
90
|
+
themeModeRef.current = themeMode;
|
|
91
|
+
}, [canvasInstance, themeMode]);
|
|
71
92
|
return (jsxRuntime.jsx("div", { ref: containerRef, className: className, style: { width: "100%", height: "100%", ...style }, children: children }));
|
|
72
93
|
});
|
|
73
94
|
MarkupCanvas.displayName = "MarkupCanvas";
|
|
@@ -78,6 +99,7 @@ function useMarkupCanvas(canvasRef, options = {}) {
|
|
|
78
99
|
const [zoom, setZoom] = react.useState(1);
|
|
79
100
|
const [pan, setPan] = react.useState({ x: 0, y: 0 });
|
|
80
101
|
const [isReady, setIsReady] = react.useState(false);
|
|
102
|
+
const [themeMode, setThemeModeState] = react.useState("light");
|
|
81
103
|
const optionsRef = react.useRef(options);
|
|
82
104
|
optionsRef.current = options;
|
|
83
105
|
const handleCanvasInstance = react.useCallback((canvas) => {
|
|
@@ -157,6 +179,27 @@ function useMarkupCanvas(canvasRef, options = {}) {
|
|
|
157
179
|
}
|
|
158
180
|
return false;
|
|
159
181
|
}, [canvasRef]);
|
|
182
|
+
const updateThemeMode = react.useCallback((mode) => {
|
|
183
|
+
setThemeModeState(mode);
|
|
184
|
+
canvasRef.current?.updateThemeMode(mode);
|
|
185
|
+
}, [canvasRef]);
|
|
186
|
+
const toggleThemeMode = react.useCallback(() => {
|
|
187
|
+
const newMode = themeMode === "light" ? "dark" : "light";
|
|
188
|
+
updateThemeMode(newMode);
|
|
189
|
+
return newMode;
|
|
190
|
+
}, [themeMode, updateThemeMode]);
|
|
191
|
+
const toggleRulers = react.useCallback(() => {
|
|
192
|
+
canvasRef.current?.toggleRulers();
|
|
193
|
+
}, [canvasRef]);
|
|
194
|
+
const areRulersVisible = react.useCallback(() => {
|
|
195
|
+
return canvasRef.current?.areRulersVisible() ?? false;
|
|
196
|
+
}, [canvasRef]);
|
|
197
|
+
const toggleGrid = react.useCallback(() => {
|
|
198
|
+
canvasRef.current?.toggleGrid();
|
|
199
|
+
}, [canvasRef]);
|
|
200
|
+
const isGridVisible = react.useCallback(() => {
|
|
201
|
+
return canvasRef.current?.isGridVisible() ?? false;
|
|
202
|
+
}, [canvasRef]);
|
|
160
203
|
return {
|
|
161
204
|
canvas: canvasRef.current?.canvas || null,
|
|
162
205
|
initCanvasUtils: handleCanvasInstance,
|
|
@@ -172,6 +215,13 @@ function useMarkupCanvas(canvasRef, options = {}) {
|
|
|
172
215
|
centerContent,
|
|
173
216
|
setTransitionMode,
|
|
174
217
|
toggleTransitionMode,
|
|
218
|
+
themeMode,
|
|
219
|
+
updateThemeMode,
|
|
220
|
+
toggleThemeMode,
|
|
221
|
+
toggleRulers,
|
|
222
|
+
areRulersVisible,
|
|
223
|
+
toggleGrid,
|
|
224
|
+
isGridVisible,
|
|
175
225
|
};
|
|
176
226
|
}
|
|
177
227
|
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/components/MarkupCanvas.tsx","../src/hooks/useMarkupCanvas.ts"],"sourcesContent":[null,null],"names":["forwardRef","useRef","useState","useImperativeHandle","useCallback","useMemo","useEffect","CoreMarkupCanvas","_jsx"],"mappings":";;;;;;;;;;;AAwBO,MAAM,YAAY,GAAGA,gBAAU,CACpC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,KAAI;AACzG,IAAA,MAAM,YAAY,GAAGC,YAAM,CAAiB,IAAI,CAAC;IACjD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAGC,cAAQ,CAA0B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/components/MarkupCanvas.tsx","../src/hooks/useMarkupCanvas.ts"],"sourcesContent":[null,null],"names":["forwardRef","useRef","useState","useImperativeHandle","useCallback","useMemo","useEffect","CoreMarkupCanvas","_jsx"],"mappings":"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"}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Markup Canvas React
|
|
3
3
|
* React components and hooks for markup-canvas
|
|
4
|
-
* @version 1.0.
|
|
4
|
+
* @version 1.0.8
|
|
5
5
|
*/
|
|
6
6
|
import { jsx } from 'react/jsx-runtime';
|
|
7
7
|
import { MarkupCanvas as MarkupCanvas$1 } from '@markup-canvas/core';
|
|
@@ -10,6 +10,7 @@ import { forwardRef, useRef, useState, useImperativeHandle, useCallback, useMemo
|
|
|
10
10
|
const MarkupCanvas = forwardRef(({ children, className, style, onTransformChange, onZoomChange, onPanChange, onReady, ...options }, ref) => {
|
|
11
11
|
const containerRef = useRef(null);
|
|
12
12
|
const [canvasInstance, setCanvasInstance] = useState(null);
|
|
13
|
+
const themeModeRef = useRef(options.themeMode);
|
|
13
14
|
useImperativeHandle(ref, () => ({
|
|
14
15
|
canvas: canvasInstance,
|
|
15
16
|
zoomIn: (factor = 0.1) => canvasInstance?.zoomIn(factor),
|
|
@@ -20,6 +21,15 @@ const MarkupCanvas = forwardRef(({ children, className, style, onTransformChange
|
|
|
20
21
|
centerContent: () => canvasInstance?.centerContent(),
|
|
21
22
|
getTransform: () => canvasInstance?.transform || { scale: 1, translateX: 0, translateY: 0 },
|
|
22
23
|
getZoom: () => canvasInstance?.transform?.scale || 1,
|
|
24
|
+
updateThemeMode: (mode) => canvasInstance?.updateThemeMode(mode),
|
|
25
|
+
toggleRulers: () => canvasInstance?.toggleRulers(),
|
|
26
|
+
showRulers: () => canvasInstance?.showRulers(),
|
|
27
|
+
hideRulers: () => canvasInstance?.hideRulers(),
|
|
28
|
+
areRulersVisible: () => canvasInstance?.areRulersVisible() ?? false,
|
|
29
|
+
toggleGrid: () => canvasInstance?.toggleGrid(),
|
|
30
|
+
showGrid: () => canvasInstance?.showGrid(),
|
|
31
|
+
hideGrid: () => canvasInstance?.hideGrid(),
|
|
32
|
+
isGridVisible: () => canvasInstance?.isGridVisible() ?? false,
|
|
23
33
|
}), [canvasInstance]);
|
|
24
34
|
const onTransformChangeRef = useRef(onTransformChange);
|
|
25
35
|
const onZoomChangeRef = useRef(onZoomChange);
|
|
@@ -41,11 +51,15 @@ const MarkupCanvas = forwardRef(({ children, className, style, onTransformChange
|
|
|
41
51
|
const handleReady = useCallback((canvas) => {
|
|
42
52
|
onReadyRef.current?.(canvas);
|
|
43
53
|
}, []);
|
|
44
|
-
|
|
54
|
+
// Separate theme mode from other options
|
|
55
|
+
const { themeMode, ...configOptions } = options;
|
|
56
|
+
// Create stable reference for non-theme options using JSON serialization
|
|
57
|
+
const stableConfigJson = useMemo(() => JSON.stringify(configOptions), [configOptions]);
|
|
58
|
+
// Handle canvas creation with non-theme options
|
|
45
59
|
useEffect(() => {
|
|
46
60
|
if (!containerRef.current)
|
|
47
61
|
return;
|
|
48
|
-
const canvas = new MarkupCanvas$1(containerRef.current,
|
|
62
|
+
const canvas = new MarkupCanvas$1(containerRef.current, configOptions);
|
|
49
63
|
setCanvasInstance(canvas);
|
|
50
64
|
canvas.on("transform", handleTransformChange);
|
|
51
65
|
canvas.on("zoom", handleZoomChange);
|
|
@@ -65,7 +79,14 @@ const MarkupCanvas = forwardRef(({ children, className, style, onTransformChange
|
|
|
65
79
|
canvas.cleanup();
|
|
66
80
|
setCanvasInstance(null);
|
|
67
81
|
};
|
|
68
|
-
}, [
|
|
82
|
+
}, [stableConfigJson, handleTransformChange, handleZoomChange, handlePanChange, handleReady]);
|
|
83
|
+
// Handle theme changes separately without recreating the canvas
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
if (!canvasInstance || themeMode === themeModeRef.current)
|
|
86
|
+
return;
|
|
87
|
+
canvasInstance.updateThemeMode(themeMode || "light");
|
|
88
|
+
themeModeRef.current = themeMode;
|
|
89
|
+
}, [canvasInstance, themeMode]);
|
|
69
90
|
return (jsx("div", { ref: containerRef, className: className, style: { width: "100%", height: "100%", ...style }, children: children }));
|
|
70
91
|
});
|
|
71
92
|
MarkupCanvas.displayName = "MarkupCanvas";
|
|
@@ -76,6 +97,7 @@ function useMarkupCanvas(canvasRef, options = {}) {
|
|
|
76
97
|
const [zoom, setZoom] = useState(1);
|
|
77
98
|
const [pan, setPan] = useState({ x: 0, y: 0 });
|
|
78
99
|
const [isReady, setIsReady] = useState(false);
|
|
100
|
+
const [themeMode, setThemeModeState] = useState("light");
|
|
79
101
|
const optionsRef = useRef(options);
|
|
80
102
|
optionsRef.current = options;
|
|
81
103
|
const handleCanvasInstance = useCallback((canvas) => {
|
|
@@ -155,6 +177,27 @@ function useMarkupCanvas(canvasRef, options = {}) {
|
|
|
155
177
|
}
|
|
156
178
|
return false;
|
|
157
179
|
}, [canvasRef]);
|
|
180
|
+
const updateThemeMode = useCallback((mode) => {
|
|
181
|
+
setThemeModeState(mode);
|
|
182
|
+
canvasRef.current?.updateThemeMode(mode);
|
|
183
|
+
}, [canvasRef]);
|
|
184
|
+
const toggleThemeMode = useCallback(() => {
|
|
185
|
+
const newMode = themeMode === "light" ? "dark" : "light";
|
|
186
|
+
updateThemeMode(newMode);
|
|
187
|
+
return newMode;
|
|
188
|
+
}, [themeMode, updateThemeMode]);
|
|
189
|
+
const toggleRulers = useCallback(() => {
|
|
190
|
+
canvasRef.current?.toggleRulers();
|
|
191
|
+
}, [canvasRef]);
|
|
192
|
+
const areRulersVisible = useCallback(() => {
|
|
193
|
+
return canvasRef.current?.areRulersVisible() ?? false;
|
|
194
|
+
}, [canvasRef]);
|
|
195
|
+
const toggleGrid = useCallback(() => {
|
|
196
|
+
canvasRef.current?.toggleGrid();
|
|
197
|
+
}, [canvasRef]);
|
|
198
|
+
const isGridVisible = useCallback(() => {
|
|
199
|
+
return canvasRef.current?.isGridVisible() ?? false;
|
|
200
|
+
}, [canvasRef]);
|
|
158
201
|
return {
|
|
159
202
|
canvas: canvasRef.current?.canvas || null,
|
|
160
203
|
initCanvasUtils: handleCanvasInstance,
|
|
@@ -170,6 +213,13 @@ function useMarkupCanvas(canvasRef, options = {}) {
|
|
|
170
213
|
centerContent,
|
|
171
214
|
setTransitionMode,
|
|
172
215
|
toggleTransitionMode,
|
|
216
|
+
themeMode,
|
|
217
|
+
updateThemeMode,
|
|
218
|
+
toggleThemeMode,
|
|
219
|
+
toggleRulers,
|
|
220
|
+
areRulersVisible,
|
|
221
|
+
toggleGrid,
|
|
222
|
+
isGridVisible,
|
|
173
223
|
};
|
|
174
224
|
}
|
|
175
225
|
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/components/MarkupCanvas.tsx","../src/hooks/useMarkupCanvas.ts"],"sourcesContent":[null,null],"names":["CoreMarkupCanvas","_jsx"],"mappings":";;;;;;;;;AAwBO,MAAM,YAAY,GAAG,UAAU,CACpC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,KAAI;AACzG,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC;IACjD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/components/MarkupCanvas.tsx","../src/hooks/useMarkupCanvas.ts"],"sourcesContent":[null,null],"names":["CoreMarkupCanvas","_jsx"],"mappings":";;;;;;;;;AAwBO,MAAM,YAAY,GAAG,UAAU,CACpC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,KAAI;AACzG,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC;IACjD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC;IACnF,MAAM,YAAY,GAAG,MAAM,CAA+B,OAAO,CAAC,SAAS,CAAC;AAE5E,IAAA,mBAAmB,CACjB,GAAG,EACH,OAAO;AACL,QAAA,MAAM,EAAE,cAAc;AACtB,QAAA,MAAM,EAAE,CAAC,MAAM,GAAG,GAAG,KAAK,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC;AACxD,QAAA,OAAO,EAAE,CAAC,MAAM,GAAG,GAAG,KAAK,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC;AAC1D,QAAA,SAAS,EAAE,MAAM,cAAc,EAAE,SAAS,EAAE;AAC5C,QAAA,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;AACpD,QAAA,YAAY,EAAE,MAAM,cAAc,EAAE,WAAW,EAAE;AACjD,QAAA,aAAa,EAAE,MAAM,cAAc,EAAE,aAAa,EAAE;QACpD,YAAY,EAAE,MAAM,cAAc,EAAE,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;QAC3F,OAAO,EAAE,MAAM,cAAc,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;QACpD,eAAe,EAAE,CAAC,IAAsB,KAAK,cAAc,EAAE,eAAe,CAAC,IAAI,CAAC;AAClF,QAAA,YAAY,EAAE,MAAM,cAAc,EAAE,YAAY,EAAE;AAClD,QAAA,UAAU,EAAE,MAAM,cAAc,EAAE,UAAU,EAAE;AAC9C,QAAA,UAAU,EAAE,MAAM,cAAc,EAAE,UAAU,EAAE;QAC9C,gBAAgB,EAAE,MAAM,cAAc,EAAE,gBAAgB,EAAE,IAAI,KAAK;AACnE,QAAA,UAAU,EAAE,MAAM,cAAc,EAAE,UAAU,EAAE;AAC9C,QAAA,QAAQ,EAAE,MAAM,cAAc,EAAE,QAAQ,EAAE;AAC1C,QAAA,QAAQ,EAAE,MAAM,cAAc,EAAE,QAAQ,EAAE;QAC1C,aAAa,EAAE,MAAM,cAAc,EAAE,aAAa,EAAE,IAAI,KAAK;AAC9D,KAAA,CAAC,EACF,CAAC,cAAc,CAAC,CACjB;AAED,IAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtD,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC;AAC5C,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC;AAC1C,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;AAElC,IAAA,oBAAoB,CAAC,OAAO,GAAG,iBAAiB;AAChD,IAAA,eAAe,CAAC,OAAO,GAAG,YAAY;AACtC,IAAA,cAAc,CAAC,OAAO,GAAG,WAAW;AACpC,IAAA,UAAU,CAAC,OAAO,GAAG,OAAO;AAE5B,IAAA,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,SAAoB,KAAI;AACjE,QAAA,oBAAoB,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,IAAY,KAAI;AACpD,QAAA,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,GAA6B,KAAI;AACpE,QAAA,cAAc,CAAC,OAAO,GAAG,GAAG,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,MAAwB,KAAI;AAC3D,QAAA,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC;;IAGN,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO;;AAG/C,IAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;;IAGtF,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE;QAE3B,MAAM,MAAM,GAAG,IAAIA,cAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,aAAmC,CAAC;QAC9F,iBAAiB,CAAC,MAAM,CAAC;AAEzB,QAAA,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,qBAAqB,CAAC;AAC7C,QAAA,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACnC,QAAA,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC;AACjC,QAAA,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;AAE/B,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,WAAW,CAAC,MAAM,CAAC;QACrB;AAEA,QAAA,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE;AACpE,YAAA,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;QAC1B;AAEA,QAAA,OAAO,MAAK;AACV,YAAA,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,qBAAqB,CAAC;AAC9C,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACpC,YAAA,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC;AAClC,YAAA,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC;YAChC,MAAM,CAAC,OAAO,EAAE;YAChB,iBAAiB,CAAC,IAAI,CAAC;AACzB,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;;IAG7F,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,cAAc,IAAI,SAAS,KAAK,YAAY,CAAC,OAAO;YAAE;AAE3D,QAAA,cAAc,CAAC,eAAe,CAAC,SAAS,IAAI,OAAO,CAAC;AACpD,QAAA,YAAY,CAAC,OAAO,GAAG,SAAS;AAClC,IAAA,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;AAE/B,IAAA,QACEC,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,EAAA,QAAA,EAC7F,QAAQ,EAAA,CACL;AAEV,CAAC;AAGH,YAAY,CAAC,WAAW,GAAG,cAAc;;SCjIzB,eAAe,CAAC,SAA4C,EAAE,UAAkC,EAAE,EAAA;IAChH,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC;IAC/E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACjG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;AACnC,IAAA,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7C,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAmB,OAAO,CAAC;AAE1E,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;AAClC,IAAA,UAAU,CAAC,OAAO,GAAG,OAAO;AAE5B,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,MAAoB,KAAI;QAChE,iBAAiB,CAAC,MAAM,CAAC;QACzB,UAAU,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,YAAuB,KAAI;QAC9D,YAAY,CAAC,YAAY,CAAC;QAC1B,UAAU,CAAC,OAAO,CAAC,iBAAiB,GAAG,YAAY,CAAC;IACtD,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,OAAe,KAAI;QACjD,OAAO,CAAC,OAAO,CAAC;QAChB,UAAU,CAAC,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;IAC5C,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,MAAgC,KAAI;QACjE,MAAM,CAAC,MAAM,CAAC;QACd,UAAU,CAAC,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC;IAC1C,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,MAAoB,KAAI;QACvD,UAAU,CAAC,IAAI,CAAC;QAChB,UAAU,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC;IAEN,SAAS,CAAC,MAAK;AACb,QAAA,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC;QAExC,IAAI,CAAC,cAAc,EAAE;YACnB;QACF;AAEA,QAAA,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC;AAC/C,QAAA,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;AACrC,QAAA,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;AACnC,QAAA,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;AAEvC,QAAA,IAAI,cAAc,CAAC,SAAS,EAAE;AAC5B,YAAA,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC;AACtC,YAAA,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC;AACvC,YAAA,MAAM,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC5F;AAEA,QAAA,IAAI,cAAc,CAAC,OAAO,EAAE;YAC1B,UAAU,CAAC,IAAI,CAAC;YAChB,UAAU,CAAC,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC;QAC9C;AAEA,QAAA,OAAO,MAAK;AACV,YAAA,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC;AAChD,YAAA,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;AACtC,YAAA,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;AACpC,YAAA,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC;AAC1C,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IAEpB,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,MAAM,GAAG,GAAG,KAAI;AACf,QAAA,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;AACnC,IAAA,CAAC,EACD,CAAC,SAAS,CAAC,CACZ;IAED,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,MAAM,GAAG,GAAG,KAAI;AACf,QAAA,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;AACpC,IAAA,CAAC,EACD,CAAC,SAAS,CAAC,CACZ;AAED,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,MAAK;AACjC,QAAA,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE;AAChC,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAEf,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,CAAS,EAAE,CAAS,KAAI;QACvB,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAChC,IAAA,CAAC,EACD,CAAC,SAAS,CAAC,CACZ;AAED,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,MAAK;AACpC,QAAA,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE;AACnC,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAEf,IAAA,MAAM,aAAa,GAAG,WAAW,CAAC,MAAK;AACrC,QAAA,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE;AACpC,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAEf,IAAA,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,OAAgB,KAAI;AACnB,QAAA,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE;AAC7B,YAAA,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QACtE;AACF,IAAA,CAAC,EACD,CAAC,SAAS,CAAC,CACZ;AAED,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,MAAK;AAC5C,QAAA,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE;YAC7B,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE;AAC1D,YAAA,MAAM,mBAAmB,GAAG,CAAC,aAAa,CAAC,gBAAgB;AAC3D,YAAA,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;AAChF,YAAA,OAAO,mBAAmB;QAC5B;AACA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAEf,IAAA,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,IAAsB,KAAI;QACzB,iBAAiB,CAAC,IAAI,CAAC;AACvB,QAAA,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC;AAC1C,IAAA,CAAC,EACD,CAAC,SAAS,CAAC,CACZ;AAED,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,MAAK;AACvC,QAAA,MAAM,OAAO,GAAG,SAAS,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO;QACxD,eAAe,CAAC,OAAO,CAAC;AACxB,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAEhC,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,MAAK;AACpC,QAAA,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE;AACnC,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAEf,IAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAK;QACxC,OAAO,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,KAAK;AACvD,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAEf,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAK;AAClC,QAAA,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE;AACjC,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAEf,IAAA,MAAM,aAAa,GAAG,WAAW,CAAC,MAAK;QACrC,OAAO,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,KAAK;AACpD,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAEf,OAAO;AACL,QAAA,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI;AACzC,QAAA,eAAe,EAAE,oBAAoB;QACrC,SAAS;QACT,IAAI;QACJ,GAAG;QACH,OAAO;QACP,MAAM;QACN,OAAO;QACP,SAAS;QACT,KAAK;QACL,YAAY;QACZ,aAAa;QACb,iBAAiB;QACjB,oBAAoB;QACpB,SAAS;QACT,eAAe;QACf,eAAe;QACf,YAAY;QACZ,gBAAgB;QAChB,UAAU;QACV,aAAa;KACd;AACH;;;;"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -9,6 +9,15 @@ export interface MarkupCanvasRef {
|
|
|
9
9
|
centerContent: () => void;
|
|
10
10
|
getTransform: () => Transform;
|
|
11
11
|
getZoom: () => number;
|
|
12
|
+
updateThemeMode: (mode: "light" | "dark") => void;
|
|
13
|
+
toggleRulers: () => void;
|
|
14
|
+
showRulers: () => void;
|
|
15
|
+
hideRulers: () => void;
|
|
16
|
+
areRulersVisible: () => boolean;
|
|
17
|
+
toggleGrid: () => void;
|
|
18
|
+
showGrid: () => void;
|
|
19
|
+
hideGrid: () => void;
|
|
20
|
+
isGridVisible: () => boolean;
|
|
12
21
|
}
|
|
13
22
|
export interface UseMarkupCanvasOptions {
|
|
14
23
|
onTransformChange?: (transform: Transform) => void;
|
|
@@ -28,3 +37,35 @@ export interface CanvasEventHandlers {
|
|
|
28
37
|
onTransform?: (transform: Transform) => void;
|
|
29
38
|
onReady?: (canvas: CoreMarkupCanvas) => void;
|
|
30
39
|
}
|
|
40
|
+
export interface UseMarkupCanvasReturn {
|
|
41
|
+
canvas: CoreMarkupCanvas | null;
|
|
42
|
+
initCanvasUtils: (canvas: CoreMarkupCanvas) => void;
|
|
43
|
+
transform: Transform;
|
|
44
|
+
zoom: number;
|
|
45
|
+
pan: {
|
|
46
|
+
x: number;
|
|
47
|
+
y: number;
|
|
48
|
+
};
|
|
49
|
+
isReady: boolean;
|
|
50
|
+
zoomIn: (factor?: number) => void;
|
|
51
|
+
zoomOut: (factor?: number) => void;
|
|
52
|
+
resetZoom: () => void;
|
|
53
|
+
panTo: (x: number, y: number) => void;
|
|
54
|
+
fitToContent: () => void;
|
|
55
|
+
centerContent: () => void;
|
|
56
|
+
setTransitionMode: (enabled: boolean) => void;
|
|
57
|
+
toggleTransitionMode: () => boolean;
|
|
58
|
+
themeMode: "light" | "dark";
|
|
59
|
+
updateThemeMode: (mode: "light" | "dark") => void;
|
|
60
|
+
toggleThemeMode: () => "light" | "dark";
|
|
61
|
+
toggleRulers: () => void;
|
|
62
|
+
showRulers: () => void;
|
|
63
|
+
hideRulers: () => void;
|
|
64
|
+
areRulersVisible: () => boolean;
|
|
65
|
+
showRulersState: boolean;
|
|
66
|
+
toggleGrid: () => void;
|
|
67
|
+
showGrid: () => void;
|
|
68
|
+
hideGrid: () => void;
|
|
69
|
+
isGridVisible: () => boolean;
|
|
70
|
+
showGridState: boolean;
|
|
71
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@markup-canvas/react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "React components and hooks for markup-canvas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"react": ">=18.0.0",
|
|
24
24
|
"react-dom": ">=18.0.0",
|
|
25
|
-
"@markup-canvas/core": "
|
|
25
|
+
"@markup-canvas/core": "1.0.8"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@biomejs/biome": "2.2.6",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"@types/react-dom": "^19.2.2",
|
|
34
34
|
"react": "^19.2.0",
|
|
35
35
|
"react-dom": "^19.2.0",
|
|
36
|
-
"rollup": "^4.52.
|
|
36
|
+
"rollup": "^4.52.5",
|
|
37
37
|
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
38
38
|
"typescript": "^5.9.3",
|
|
39
39
|
"tslib": "^2.8.1"
|
|
@@ -26,6 +26,7 @@ export const MarkupCanvas = forwardRef<MarkupCanvasRef, MarkupCanvasProps>(
|
|
|
26
26
|
({ children, className, style, onTransformChange, onZoomChange, onPanChange, onReady, ...options }, ref) => {
|
|
27
27
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
28
28
|
const [canvasInstance, setCanvasInstance] = useState<CoreMarkupCanvas | null>(null);
|
|
29
|
+
const themeModeRef = useRef<"light" | "dark" | undefined>(options.themeMode);
|
|
29
30
|
|
|
30
31
|
useImperativeHandle(
|
|
31
32
|
ref,
|
|
@@ -39,6 +40,15 @@ export const MarkupCanvas = forwardRef<MarkupCanvasRef, MarkupCanvasProps>(
|
|
|
39
40
|
centerContent: () => canvasInstance?.centerContent(),
|
|
40
41
|
getTransform: () => canvasInstance?.transform || { scale: 1, translateX: 0, translateY: 0 },
|
|
41
42
|
getZoom: () => canvasInstance?.transform?.scale || 1,
|
|
43
|
+
updateThemeMode: (mode: "light" | "dark") => canvasInstance?.updateThemeMode(mode),
|
|
44
|
+
toggleRulers: () => canvasInstance?.toggleRulers(),
|
|
45
|
+
showRulers: () => canvasInstance?.showRulers(),
|
|
46
|
+
hideRulers: () => canvasInstance?.hideRulers(),
|
|
47
|
+
areRulersVisible: () => canvasInstance?.areRulersVisible() ?? false,
|
|
48
|
+
toggleGrid: () => canvasInstance?.toggleGrid(),
|
|
49
|
+
showGrid: () => canvasInstance?.showGrid(),
|
|
50
|
+
hideGrid: () => canvasInstance?.hideGrid(),
|
|
51
|
+
isGridVisible: () => canvasInstance?.isGridVisible() ?? false,
|
|
42
52
|
}),
|
|
43
53
|
[canvasInstance]
|
|
44
54
|
);
|
|
@@ -69,12 +79,17 @@ export const MarkupCanvas = forwardRef<MarkupCanvasRef, MarkupCanvasProps>(
|
|
|
69
79
|
onReadyRef.current?.(canvas);
|
|
70
80
|
}, []);
|
|
71
81
|
|
|
72
|
-
|
|
82
|
+
// Separate theme mode from other options
|
|
83
|
+
const { themeMode, ...configOptions } = options;
|
|
73
84
|
|
|
85
|
+
// Create stable reference for non-theme options using JSON serialization
|
|
86
|
+
const stableConfigJson = useMemo(() => JSON.stringify(configOptions), [configOptions]);
|
|
87
|
+
|
|
88
|
+
// Handle canvas creation with non-theme options
|
|
74
89
|
useEffect(() => {
|
|
75
90
|
if (!containerRef.current) return;
|
|
76
91
|
|
|
77
|
-
const canvas = new CoreMarkupCanvas(containerRef.current,
|
|
92
|
+
const canvas = new CoreMarkupCanvas(containerRef.current, configOptions as MarkupCanvasConfig);
|
|
78
93
|
setCanvasInstance(canvas);
|
|
79
94
|
|
|
80
95
|
canvas.on("transform", handleTransformChange);
|
|
@@ -98,7 +113,15 @@ export const MarkupCanvas = forwardRef<MarkupCanvasRef, MarkupCanvasProps>(
|
|
|
98
113
|
canvas.cleanup();
|
|
99
114
|
setCanvasInstance(null);
|
|
100
115
|
};
|
|
101
|
-
}, [
|
|
116
|
+
}, [stableConfigJson, handleTransformChange, handleZoomChange, handlePanChange, handleReady]);
|
|
117
|
+
|
|
118
|
+
// Handle theme changes separately without recreating the canvas
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
if (!canvasInstance || themeMode === themeModeRef.current) return;
|
|
121
|
+
|
|
122
|
+
canvasInstance.updateThemeMode(themeMode || "light");
|
|
123
|
+
themeModeRef.current = themeMode;
|
|
124
|
+
}, [canvasInstance, themeMode]);
|
|
102
125
|
|
|
103
126
|
return (
|
|
104
127
|
<div ref={containerRef} className={className} style={{ width: "100%", height: "100%", ...style }}>
|
|
@@ -8,6 +8,7 @@ export function useMarkupCanvas(canvasRef: RefObject<MarkupCanvasRef | null>, op
|
|
|
8
8
|
const [zoom, setZoom] = useState(1);
|
|
9
9
|
const [pan, setPan] = useState({ x: 0, y: 0 });
|
|
10
10
|
const [isReady, setIsReady] = useState(false);
|
|
11
|
+
const [themeMode, setThemeModeState] = useState<"light" | "dark">("light");
|
|
11
12
|
|
|
12
13
|
const optionsRef = useRef(options);
|
|
13
14
|
optionsRef.current = options;
|
|
@@ -120,6 +121,36 @@ export function useMarkupCanvas(canvasRef: RefObject<MarkupCanvasRef | null>, op
|
|
|
120
121
|
return false;
|
|
121
122
|
}, [canvasRef]);
|
|
122
123
|
|
|
124
|
+
const updateThemeMode = useCallback(
|
|
125
|
+
(mode: "light" | "dark") => {
|
|
126
|
+
setThemeModeState(mode);
|
|
127
|
+
canvasRef.current?.updateThemeMode(mode);
|
|
128
|
+
},
|
|
129
|
+
[canvasRef]
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
const toggleThemeMode = useCallback(() => {
|
|
133
|
+
const newMode = themeMode === "light" ? "dark" : "light";
|
|
134
|
+
updateThemeMode(newMode);
|
|
135
|
+
return newMode;
|
|
136
|
+
}, [themeMode, updateThemeMode]);
|
|
137
|
+
|
|
138
|
+
const toggleRulers = useCallback(() => {
|
|
139
|
+
canvasRef.current?.toggleRulers();
|
|
140
|
+
}, [canvasRef]);
|
|
141
|
+
|
|
142
|
+
const areRulersVisible = useCallback(() => {
|
|
143
|
+
return canvasRef.current?.areRulersVisible() ?? false;
|
|
144
|
+
}, [canvasRef]);
|
|
145
|
+
|
|
146
|
+
const toggleGrid = useCallback(() => {
|
|
147
|
+
canvasRef.current?.toggleGrid();
|
|
148
|
+
}, [canvasRef]);
|
|
149
|
+
|
|
150
|
+
const isGridVisible = useCallback(() => {
|
|
151
|
+
return canvasRef.current?.isGridVisible() ?? false;
|
|
152
|
+
}, [canvasRef]);
|
|
153
|
+
|
|
123
154
|
return {
|
|
124
155
|
canvas: canvasRef.current?.canvas || null,
|
|
125
156
|
initCanvasUtils: handleCanvasInstance,
|
|
@@ -135,5 +166,12 @@ export function useMarkupCanvas(canvasRef: RefObject<MarkupCanvasRef | null>, op
|
|
|
135
166
|
centerContent,
|
|
136
167
|
setTransitionMode,
|
|
137
168
|
toggleTransitionMode,
|
|
169
|
+
themeMode,
|
|
170
|
+
updateThemeMode,
|
|
171
|
+
toggleThemeMode,
|
|
172
|
+
toggleRulers,
|
|
173
|
+
areRulersVisible,
|
|
174
|
+
toggleGrid,
|
|
175
|
+
isGridVisible,
|
|
138
176
|
};
|
|
139
177
|
}
|
package/src/types/index.ts
CHANGED
|
@@ -10,6 +10,15 @@ export interface MarkupCanvasRef {
|
|
|
10
10
|
centerContent: () => void;
|
|
11
11
|
getTransform: () => Transform;
|
|
12
12
|
getZoom: () => number;
|
|
13
|
+
updateThemeMode: (mode: "light" | "dark") => void;
|
|
14
|
+
toggleRulers: () => void;
|
|
15
|
+
showRulers: () => void;
|
|
16
|
+
hideRulers: () => void;
|
|
17
|
+
areRulersVisible: () => boolean;
|
|
18
|
+
toggleGrid: () => void;
|
|
19
|
+
showGrid: () => void;
|
|
20
|
+
hideGrid: () => void;
|
|
21
|
+
isGridVisible: () => boolean;
|
|
13
22
|
}
|
|
14
23
|
|
|
15
24
|
export interface UseMarkupCanvasOptions {
|
|
@@ -25,3 +34,33 @@ export interface CanvasEventHandlers {
|
|
|
25
34
|
onTransform?: (transform: Transform) => void;
|
|
26
35
|
onReady?: (canvas: CoreMarkupCanvas) => void;
|
|
27
36
|
}
|
|
37
|
+
|
|
38
|
+
export interface UseMarkupCanvasReturn {
|
|
39
|
+
canvas: CoreMarkupCanvas | null;
|
|
40
|
+
initCanvasUtils: (canvas: CoreMarkupCanvas) => void;
|
|
41
|
+
transform: Transform;
|
|
42
|
+
zoom: number;
|
|
43
|
+
pan: { x: number; y: number };
|
|
44
|
+
isReady: boolean;
|
|
45
|
+
zoomIn: (factor?: number) => void;
|
|
46
|
+
zoomOut: (factor?: number) => void;
|
|
47
|
+
resetZoom: () => void;
|
|
48
|
+
panTo: (x: number, y: number) => void;
|
|
49
|
+
fitToContent: () => void;
|
|
50
|
+
centerContent: () => void;
|
|
51
|
+
setTransitionMode: (enabled: boolean) => void;
|
|
52
|
+
toggleTransitionMode: () => boolean;
|
|
53
|
+
themeMode: "light" | "dark";
|
|
54
|
+
updateThemeMode: (mode: "light" | "dark") => void;
|
|
55
|
+
toggleThemeMode: () => "light" | "dark";
|
|
56
|
+
toggleRulers: () => void;
|
|
57
|
+
showRulers: () => void;
|
|
58
|
+
hideRulers: () => void;
|
|
59
|
+
areRulersVisible: () => boolean;
|
|
60
|
+
showRulersState: boolean;
|
|
61
|
+
toggleGrid: () => void;
|
|
62
|
+
showGrid: () => void;
|
|
63
|
+
hideGrid: () => void;
|
|
64
|
+
isGridVisible: () => boolean;
|
|
65
|
+
showGridState: boolean;
|
|
66
|
+
}
|