@cadview/react 0.2.0 → 0.3.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.
package/dist/index.cjs CHANGED
@@ -11,6 +11,7 @@ var CadViewer = react.forwardRef(
11
11
  file,
12
12
  theme = "dark",
13
13
  tool = "pan",
14
+ debug,
14
15
  className,
15
16
  style,
16
17
  options,
@@ -27,6 +28,7 @@ var CadViewer = react.forwardRef(
27
28
  const viewer = new core.CadViewer(canvasRef.current, {
28
29
  theme,
29
30
  initialTool: tool,
31
+ debug,
30
32
  formatConverters,
31
33
  ...options
32
34
  });
@@ -42,6 +44,11 @@ var CadViewer = react.forwardRef(
42
44
  react.useEffect(() => {
43
45
  viewerRef.current?.setTool(tool);
44
46
  }, [tool]);
47
+ react.useEffect(() => {
48
+ if (debug !== void 0) {
49
+ viewerRef.current?.setDebug(debug);
50
+ }
51
+ }, [debug]);
45
52
  react.useEffect(() => {
46
53
  const viewer = viewerRef.current;
47
54
  if (!viewer || !file) return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CadViewer.tsx","../src/useCadViewer.ts"],"names":["forwardRef","CadViewer","useRef","useEffect","CoreCadViewer","useImperativeHandle","jsx","useState","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n type CSSProperties,\n} from 'react';\nimport {\n CadViewer as CoreCadViewer,\n type CadViewerOptions,\n type FormatConverter,\n type DxfLayer,\n type SelectEvent,\n type MeasureEvent,\n type ViewTransform,\n type Tool,\n type Theme,\n} from '@cadview/core';\n\nexport interface CadViewerProps {\n file?: File | ArrayBuffer | string | null;\n theme?: Theme;\n tool?: Tool;\n className?: string;\n style?: CSSProperties;\n options?: Omit<CadViewerOptions, 'theme' | 'initialTool'>;\n /** Format converters for non-DXF file formats (e.g. DWG via @cadview/dwg). */\n formatConverters?: FormatConverter[];\n onSelect?: (event: SelectEvent) => void;\n onMeasure?: (event: MeasureEvent) => void;\n onViewChange?: (transform: ViewTransform) => void;\n onLayersLoaded?: (layers: DxfLayer[]) => void;\n}\n\nexport interface CadViewerRef {\n getViewer(): CoreCadViewer | null;\n fitToView(): void;\n getLayers(): DxfLayer[];\n setLayerVisible(name: string, visible: boolean): void;\n}\n\nexport const CadViewer = forwardRef<CadViewerRef, CadViewerProps>(\n function CadViewer(props, ref) {\n const {\n file,\n theme = 'dark',\n tool = 'pan',\n className,\n style,\n options,\n formatConverters,\n onSelect,\n onMeasure,\n onViewChange,\n onLayersLoaded,\n } = props;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const viewerRef = useRef<CoreCadViewer | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const viewer = new CoreCadViewer(canvasRef.current, {\n theme,\n initialTool: tool,\n formatConverters,\n ...options,\n });\n viewerRef.current = viewer;\n\n return () => {\n viewer.destroy();\n viewerRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n viewerRef.current?.setTheme(theme);\n }, [theme]);\n\n useEffect(() => {\n viewerRef.current?.setTool(tool);\n }, [tool]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer || !file) return;\n let cancelled = false;\n\n const load = async () => {\n try {\n if (file instanceof File) {\n await viewer.loadFile(file);\n } else if (file instanceof ArrayBuffer) {\n await viewer.loadBuffer(file);\n } else if (typeof file === 'string') {\n viewer.loadString(file);\n }\n if (!cancelled) {\n onLayersLoaded?.(viewer.getLayers());\n }\n } catch (err) {\n if (!cancelled) {\n console.error('CadViewer: failed to load file', err);\n }\n }\n };\n\n load();\n\n return () => {\n cancelled = true;\n };\n }, [file]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n const handlers: Array<() => void> = [];\n\n if (onSelect) {\n viewer.on('select', onSelect);\n handlers.push(() => viewer.off('select', onSelect));\n }\n if (onMeasure) {\n viewer.on('measure', onMeasure);\n handlers.push(() => viewer.off('measure', onMeasure));\n }\n if (onViewChange) {\n viewer.on('viewchange', onViewChange);\n handlers.push(() => viewer.off('viewchange', onViewChange));\n }\n\n return () => { handlers.forEach((h) => { h(); }); };\n }, [onSelect, onMeasure, onViewChange]);\n\n useImperativeHandle(ref, () => ({\n getViewer: () => viewerRef.current,\n fitToView: () => viewerRef.current?.fitToView(),\n getLayers: () => viewerRef.current?.getLayers() ?? [],\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.current?.setLayerVisible(name, visible),\n }));\n\n return (\n <div\n className={className}\n style={{ position: 'relative', overflow: 'hidden', ...style }}\n >\n <canvas\n ref={canvasRef}\n style={{ display: 'block', width: '100%', height: '100%' }}\n />\n </div>\n );\n },\n);\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport {\n CadViewer,\n type CadViewerOptions,\n type DxfLayer,\n} from '@cadview/core';\n\nexport function useCadViewer(\n canvasRef: React.RefObject<HTMLCanvasElement | null>,\n options?: CadViewerOptions,\n) {\n const viewerRef = useRef<CadViewer | null>(null);\n const [viewer, setViewer] = useState<CadViewer | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current) return;\n const v = new CadViewer(canvasRef.current, options);\n viewerRef.current = v;\n setViewer(v);\n return () => {\n v.destroy();\n viewerRef.current = null;\n setViewer(null);\n };\n }, []);\n\n const loadFile = useCallback(async (file: File) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n await viewerRef.current.loadFile(file);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n const loadBuffer = useCallback(async (buffer: ArrayBuffer) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n await viewerRef.current.loadBuffer(buffer);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n const loadString = useCallback((dxf: string) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n viewerRef.current.loadString(dxf);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n return {\n viewer,\n layers,\n isLoaded,\n error,\n loadFile,\n loadBuffer,\n loadString,\n fitToView: () => viewerRef.current?.fitToView(),\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.current?.setLayerVisible(name, visible),\n setTheme: (theme: 'dark' | 'light') =>\n viewerRef.current?.setTheme(theme),\n setTool: (tool: 'pan' | 'select' | 'measure') =>\n viewerRef.current?.setTool(tool),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/CadViewer.tsx","../src/useCadViewer.ts"],"names":["forwardRef","CadViewer","useRef","useEffect","CoreCadViewer","useImperativeHandle","jsx","useState","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n type CSSProperties,\n} from 'react';\nimport {\n CadViewer as CoreCadViewer,\n type CadViewerOptions,\n type FormatConverter,\n type DebugOptions,\n type DxfLayer,\n type SelectEvent,\n type MeasureEvent,\n type ViewTransform,\n type Tool,\n type Theme,\n} from '@cadview/core';\n\nexport interface CadViewerProps {\n file?: File | ArrayBuffer | string | null;\n theme?: Theme;\n tool?: Tool;\n /** Enable debug overlay. Pass `true` for defaults, or a `DebugOptions` object. */\n debug?: boolean | DebugOptions;\n className?: string;\n style?: CSSProperties;\n options?: Omit<CadViewerOptions, 'theme' | 'initialTool' | 'debug'>;\n /** Format converters for non-DXF file formats (e.g. DWG via @cadview/dwg). */\n formatConverters?: FormatConverter[];\n onSelect?: (event: SelectEvent) => void;\n onMeasure?: (event: MeasureEvent) => void;\n onViewChange?: (transform: ViewTransform) => void;\n onLayersLoaded?: (layers: DxfLayer[]) => void;\n}\n\nexport interface CadViewerRef {\n getViewer(): CoreCadViewer | null;\n fitToView(): void;\n getLayers(): DxfLayer[];\n setLayerVisible(name: string, visible: boolean): void;\n}\n\nexport const CadViewer = forwardRef<CadViewerRef, CadViewerProps>(\n function CadViewer(props, ref) {\n const {\n file,\n theme = 'dark',\n tool = 'pan',\n debug,\n className,\n style,\n options,\n formatConverters,\n onSelect,\n onMeasure,\n onViewChange,\n onLayersLoaded,\n } = props;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const viewerRef = useRef<CoreCadViewer | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const viewer = new CoreCadViewer(canvasRef.current, {\n theme,\n initialTool: tool,\n debug,\n formatConverters,\n ...options,\n });\n viewerRef.current = viewer;\n\n return () => {\n viewer.destroy();\n viewerRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n viewerRef.current?.setTheme(theme);\n }, [theme]);\n\n useEffect(() => {\n viewerRef.current?.setTool(tool);\n }, [tool]);\n\n useEffect(() => {\n if (debug !== undefined) {\n viewerRef.current?.setDebug(debug);\n }\n }, [debug]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer || !file) return;\n let cancelled = false;\n\n const load = async () => {\n try {\n if (file instanceof File) {\n await viewer.loadFile(file);\n } else if (file instanceof ArrayBuffer) {\n await viewer.loadBuffer(file);\n } else if (typeof file === 'string') {\n viewer.loadString(file);\n }\n if (!cancelled) {\n onLayersLoaded?.(viewer.getLayers());\n }\n } catch (err) {\n if (!cancelled) {\n console.error('CadViewer: failed to load file', err);\n }\n }\n };\n\n load();\n\n return () => {\n cancelled = true;\n };\n }, [file]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n const handlers: Array<() => void> = [];\n\n if (onSelect) {\n viewer.on('select', onSelect);\n handlers.push(() => viewer.off('select', onSelect));\n }\n if (onMeasure) {\n viewer.on('measure', onMeasure);\n handlers.push(() => viewer.off('measure', onMeasure));\n }\n if (onViewChange) {\n viewer.on('viewchange', onViewChange);\n handlers.push(() => viewer.off('viewchange', onViewChange));\n }\n\n return () => { handlers.forEach((h) => { h(); }); };\n }, [onSelect, onMeasure, onViewChange]);\n\n useImperativeHandle(ref, () => ({\n getViewer: () => viewerRef.current,\n fitToView: () => viewerRef.current?.fitToView(),\n getLayers: () => viewerRef.current?.getLayers() ?? [],\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.current?.setLayerVisible(name, visible),\n }));\n\n return (\n <div\n className={className}\n style={{ position: 'relative', overflow: 'hidden', ...style }}\n >\n <canvas\n ref={canvasRef}\n style={{ display: 'block', width: '100%', height: '100%' }}\n />\n </div>\n );\n },\n);\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport {\n CadViewer,\n type CadViewerOptions,\n type DxfLayer,\n} from '@cadview/core';\n\nexport function useCadViewer(\n canvasRef: React.RefObject<HTMLCanvasElement | null>,\n options?: CadViewerOptions,\n) {\n const viewerRef = useRef<CadViewer | null>(null);\n const [viewer, setViewer] = useState<CadViewer | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current) return;\n const v = new CadViewer(canvasRef.current, options);\n viewerRef.current = v;\n setViewer(v);\n return () => {\n v.destroy();\n viewerRef.current = null;\n setViewer(null);\n };\n }, []);\n\n const loadFile = useCallback(async (file: File) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n await viewerRef.current.loadFile(file);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n const loadBuffer = useCallback(async (buffer: ArrayBuffer) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n await viewerRef.current.loadBuffer(buffer);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n const loadString = useCallback((dxf: string) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n viewerRef.current.loadString(dxf);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n return {\n viewer,\n layers,\n isLoaded,\n error,\n loadFile,\n loadBuffer,\n loadString,\n fitToView: () => viewerRef.current?.fitToView(),\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.current?.setLayerVisible(name, visible),\n setTheme: (theme: 'dark' | 'light') =>\n viewerRef.current?.setTheme(theme),\n setTool: (tool: 'pan' | 'select' | 'measure') =>\n viewerRef.current?.setTool(tool),\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,15 +1,17 @@
1
1
  import * as react from 'react';
2
2
  import { CSSProperties } from 'react';
3
- import { Theme, Tool, CadViewerOptions, FormatConverter, SelectEvent, MeasureEvent, ViewTransform, DxfLayer, CadViewer as CadViewer$1 } from '@cadview/core';
3
+ import { Theme, Tool, DebugOptions, CadViewerOptions, FormatConverter, SelectEvent, MeasureEvent, ViewTransform, DxfLayer, CadViewer as CadViewer$1 } from '@cadview/core';
4
4
  export { DxfDocument, DxfEntity, DxfLayer, FormatConverter, MeasureEvent, SelectEvent, Theme, Tool, ViewTransform } from '@cadview/core';
5
5
 
6
6
  interface CadViewerProps {
7
7
  file?: File | ArrayBuffer | string | null;
8
8
  theme?: Theme;
9
9
  tool?: Tool;
10
+ /** Enable debug overlay. Pass `true` for defaults, or a `DebugOptions` object. */
11
+ debug?: boolean | DebugOptions;
10
12
  className?: string;
11
13
  style?: CSSProperties;
12
- options?: Omit<CadViewerOptions, 'theme' | 'initialTool'>;
14
+ options?: Omit<CadViewerOptions, 'theme' | 'initialTool' | 'debug'>;
13
15
  /** Format converters for non-DXF file formats (e.g. DWG via @cadview/dwg). */
14
16
  formatConverters?: FormatConverter[];
15
17
  onSelect?: (event: SelectEvent) => void;
package/dist/index.d.ts CHANGED
@@ -1,15 +1,17 @@
1
1
  import * as react from 'react';
2
2
  import { CSSProperties } from 'react';
3
- import { Theme, Tool, CadViewerOptions, FormatConverter, SelectEvent, MeasureEvent, ViewTransform, DxfLayer, CadViewer as CadViewer$1 } from '@cadview/core';
3
+ import { Theme, Tool, DebugOptions, CadViewerOptions, FormatConverter, SelectEvent, MeasureEvent, ViewTransform, DxfLayer, CadViewer as CadViewer$1 } from '@cadview/core';
4
4
  export { DxfDocument, DxfEntity, DxfLayer, FormatConverter, MeasureEvent, SelectEvent, Theme, Tool, ViewTransform } from '@cadview/core';
5
5
 
6
6
  interface CadViewerProps {
7
7
  file?: File | ArrayBuffer | string | null;
8
8
  theme?: Theme;
9
9
  tool?: Tool;
10
+ /** Enable debug overlay. Pass `true` for defaults, or a `DebugOptions` object. */
11
+ debug?: boolean | DebugOptions;
10
12
  className?: string;
11
13
  style?: CSSProperties;
12
- options?: Omit<CadViewerOptions, 'theme' | 'initialTool'>;
14
+ options?: Omit<CadViewerOptions, 'theme' | 'initialTool' | 'debug'>;
13
15
  /** Format converters for non-DXF file formats (e.g. DWG via @cadview/dwg). */
14
16
  formatConverters?: FormatConverter[];
15
17
  onSelect?: (event: SelectEvent) => void;
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ var CadViewer = forwardRef(
9
9
  file,
10
10
  theme = "dark",
11
11
  tool = "pan",
12
+ debug,
12
13
  className,
13
14
  style,
14
15
  options,
@@ -25,6 +26,7 @@ var CadViewer = forwardRef(
25
26
  const viewer = new CadViewer$1(canvasRef.current, {
26
27
  theme,
27
28
  initialTool: tool,
29
+ debug,
28
30
  formatConverters,
29
31
  ...options
30
32
  });
@@ -40,6 +42,11 @@ var CadViewer = forwardRef(
40
42
  useEffect(() => {
41
43
  viewerRef.current?.setTool(tool);
42
44
  }, [tool]);
45
+ useEffect(() => {
46
+ if (debug !== void 0) {
47
+ viewerRef.current?.setDebug(debug);
48
+ }
49
+ }, [debug]);
43
50
  useEffect(() => {
44
51
  const viewer = viewerRef.current;
45
52
  if (!viewer || !file) return;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CadViewer.tsx","../src/useCadViewer.ts"],"names":["CadViewer","CoreCadViewer","useRef","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n type CSSProperties,\n} from 'react';\nimport {\n CadViewer as CoreCadViewer,\n type CadViewerOptions,\n type FormatConverter,\n type DxfLayer,\n type SelectEvent,\n type MeasureEvent,\n type ViewTransform,\n type Tool,\n type Theme,\n} from '@cadview/core';\n\nexport interface CadViewerProps {\n file?: File | ArrayBuffer | string | null;\n theme?: Theme;\n tool?: Tool;\n className?: string;\n style?: CSSProperties;\n options?: Omit<CadViewerOptions, 'theme' | 'initialTool'>;\n /** Format converters for non-DXF file formats (e.g. DWG via @cadview/dwg). */\n formatConverters?: FormatConverter[];\n onSelect?: (event: SelectEvent) => void;\n onMeasure?: (event: MeasureEvent) => void;\n onViewChange?: (transform: ViewTransform) => void;\n onLayersLoaded?: (layers: DxfLayer[]) => void;\n}\n\nexport interface CadViewerRef {\n getViewer(): CoreCadViewer | null;\n fitToView(): void;\n getLayers(): DxfLayer[];\n setLayerVisible(name: string, visible: boolean): void;\n}\n\nexport const CadViewer = forwardRef<CadViewerRef, CadViewerProps>(\n function CadViewer(props, ref) {\n const {\n file,\n theme = 'dark',\n tool = 'pan',\n className,\n style,\n options,\n formatConverters,\n onSelect,\n onMeasure,\n onViewChange,\n onLayersLoaded,\n } = props;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const viewerRef = useRef<CoreCadViewer | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const viewer = new CoreCadViewer(canvasRef.current, {\n theme,\n initialTool: tool,\n formatConverters,\n ...options,\n });\n viewerRef.current = viewer;\n\n return () => {\n viewer.destroy();\n viewerRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n viewerRef.current?.setTheme(theme);\n }, [theme]);\n\n useEffect(() => {\n viewerRef.current?.setTool(tool);\n }, [tool]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer || !file) return;\n let cancelled = false;\n\n const load = async () => {\n try {\n if (file instanceof File) {\n await viewer.loadFile(file);\n } else if (file instanceof ArrayBuffer) {\n await viewer.loadBuffer(file);\n } else if (typeof file === 'string') {\n viewer.loadString(file);\n }\n if (!cancelled) {\n onLayersLoaded?.(viewer.getLayers());\n }\n } catch (err) {\n if (!cancelled) {\n console.error('CadViewer: failed to load file', err);\n }\n }\n };\n\n load();\n\n return () => {\n cancelled = true;\n };\n }, [file]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n const handlers: Array<() => void> = [];\n\n if (onSelect) {\n viewer.on('select', onSelect);\n handlers.push(() => viewer.off('select', onSelect));\n }\n if (onMeasure) {\n viewer.on('measure', onMeasure);\n handlers.push(() => viewer.off('measure', onMeasure));\n }\n if (onViewChange) {\n viewer.on('viewchange', onViewChange);\n handlers.push(() => viewer.off('viewchange', onViewChange));\n }\n\n return () => { handlers.forEach((h) => { h(); }); };\n }, [onSelect, onMeasure, onViewChange]);\n\n useImperativeHandle(ref, () => ({\n getViewer: () => viewerRef.current,\n fitToView: () => viewerRef.current?.fitToView(),\n getLayers: () => viewerRef.current?.getLayers() ?? [],\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.current?.setLayerVisible(name, visible),\n }));\n\n return (\n <div\n className={className}\n style={{ position: 'relative', overflow: 'hidden', ...style }}\n >\n <canvas\n ref={canvasRef}\n style={{ display: 'block', width: '100%', height: '100%' }}\n />\n </div>\n );\n },\n);\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport {\n CadViewer,\n type CadViewerOptions,\n type DxfLayer,\n} from '@cadview/core';\n\nexport function useCadViewer(\n canvasRef: React.RefObject<HTMLCanvasElement | null>,\n options?: CadViewerOptions,\n) {\n const viewerRef = useRef<CadViewer | null>(null);\n const [viewer, setViewer] = useState<CadViewer | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current) return;\n const v = new CadViewer(canvasRef.current, options);\n viewerRef.current = v;\n setViewer(v);\n return () => {\n v.destroy();\n viewerRef.current = null;\n setViewer(null);\n };\n }, []);\n\n const loadFile = useCallback(async (file: File) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n await viewerRef.current.loadFile(file);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n const loadBuffer = useCallback(async (buffer: ArrayBuffer) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n await viewerRef.current.loadBuffer(buffer);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n const loadString = useCallback((dxf: string) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n viewerRef.current.loadString(dxf);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n return {\n viewer,\n layers,\n isLoaded,\n error,\n loadFile,\n loadBuffer,\n loadString,\n fitToView: () => viewerRef.current?.fitToView(),\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.current?.setLayerVisible(name, visible),\n setTheme: (theme: 'dark' | 'light') =>\n viewerRef.current?.setTheme(theme),\n setTool: (tool: 'pan' | 'select' | 'measure') =>\n viewerRef.current?.setTool(tool),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/CadViewer.tsx","../src/useCadViewer.ts"],"names":["CadViewer","CoreCadViewer","useRef","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n type CSSProperties,\n} from 'react';\nimport {\n CadViewer as CoreCadViewer,\n type CadViewerOptions,\n type FormatConverter,\n type DebugOptions,\n type DxfLayer,\n type SelectEvent,\n type MeasureEvent,\n type ViewTransform,\n type Tool,\n type Theme,\n} from '@cadview/core';\n\nexport interface CadViewerProps {\n file?: File | ArrayBuffer | string | null;\n theme?: Theme;\n tool?: Tool;\n /** Enable debug overlay. Pass `true` for defaults, or a `DebugOptions` object. */\n debug?: boolean | DebugOptions;\n className?: string;\n style?: CSSProperties;\n options?: Omit<CadViewerOptions, 'theme' | 'initialTool' | 'debug'>;\n /** Format converters for non-DXF file formats (e.g. DWG via @cadview/dwg). */\n formatConverters?: FormatConverter[];\n onSelect?: (event: SelectEvent) => void;\n onMeasure?: (event: MeasureEvent) => void;\n onViewChange?: (transform: ViewTransform) => void;\n onLayersLoaded?: (layers: DxfLayer[]) => void;\n}\n\nexport interface CadViewerRef {\n getViewer(): CoreCadViewer | null;\n fitToView(): void;\n getLayers(): DxfLayer[];\n setLayerVisible(name: string, visible: boolean): void;\n}\n\nexport const CadViewer = forwardRef<CadViewerRef, CadViewerProps>(\n function CadViewer(props, ref) {\n const {\n file,\n theme = 'dark',\n tool = 'pan',\n debug,\n className,\n style,\n options,\n formatConverters,\n onSelect,\n onMeasure,\n onViewChange,\n onLayersLoaded,\n } = props;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const viewerRef = useRef<CoreCadViewer | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const viewer = new CoreCadViewer(canvasRef.current, {\n theme,\n initialTool: tool,\n debug,\n formatConverters,\n ...options,\n });\n viewerRef.current = viewer;\n\n return () => {\n viewer.destroy();\n viewerRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n viewerRef.current?.setTheme(theme);\n }, [theme]);\n\n useEffect(() => {\n viewerRef.current?.setTool(tool);\n }, [tool]);\n\n useEffect(() => {\n if (debug !== undefined) {\n viewerRef.current?.setDebug(debug);\n }\n }, [debug]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer || !file) return;\n let cancelled = false;\n\n const load = async () => {\n try {\n if (file instanceof File) {\n await viewer.loadFile(file);\n } else if (file instanceof ArrayBuffer) {\n await viewer.loadBuffer(file);\n } else if (typeof file === 'string') {\n viewer.loadString(file);\n }\n if (!cancelled) {\n onLayersLoaded?.(viewer.getLayers());\n }\n } catch (err) {\n if (!cancelled) {\n console.error('CadViewer: failed to load file', err);\n }\n }\n };\n\n load();\n\n return () => {\n cancelled = true;\n };\n }, [file]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n const handlers: Array<() => void> = [];\n\n if (onSelect) {\n viewer.on('select', onSelect);\n handlers.push(() => viewer.off('select', onSelect));\n }\n if (onMeasure) {\n viewer.on('measure', onMeasure);\n handlers.push(() => viewer.off('measure', onMeasure));\n }\n if (onViewChange) {\n viewer.on('viewchange', onViewChange);\n handlers.push(() => viewer.off('viewchange', onViewChange));\n }\n\n return () => { handlers.forEach((h) => { h(); }); };\n }, [onSelect, onMeasure, onViewChange]);\n\n useImperativeHandle(ref, () => ({\n getViewer: () => viewerRef.current,\n fitToView: () => viewerRef.current?.fitToView(),\n getLayers: () => viewerRef.current?.getLayers() ?? [],\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.current?.setLayerVisible(name, visible),\n }));\n\n return (\n <div\n className={className}\n style={{ position: 'relative', overflow: 'hidden', ...style }}\n >\n <canvas\n ref={canvasRef}\n style={{ display: 'block', width: '100%', height: '100%' }}\n />\n </div>\n );\n },\n);\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport {\n CadViewer,\n type CadViewerOptions,\n type DxfLayer,\n} from '@cadview/core';\n\nexport function useCadViewer(\n canvasRef: React.RefObject<HTMLCanvasElement | null>,\n options?: CadViewerOptions,\n) {\n const viewerRef = useRef<CadViewer | null>(null);\n const [viewer, setViewer] = useState<CadViewer | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current) return;\n const v = new CadViewer(canvasRef.current, options);\n viewerRef.current = v;\n setViewer(v);\n return () => {\n v.destroy();\n viewerRef.current = null;\n setViewer(null);\n };\n }, []);\n\n const loadFile = useCallback(async (file: File) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n await viewerRef.current.loadFile(file);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n const loadBuffer = useCallback(async (buffer: ArrayBuffer) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n await viewerRef.current.loadBuffer(buffer);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n const loadString = useCallback((dxf: string) => {\n if (!viewerRef.current) return;\n setError(null);\n try {\n viewerRef.current.loadString(dxf);\n setLayers(viewerRef.current.getLayers());\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, []);\n\n return {\n viewer,\n layers,\n isLoaded,\n error,\n loadFile,\n loadBuffer,\n loadString,\n fitToView: () => viewerRef.current?.fitToView(),\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.current?.setLayerVisible(name, visible),\n setTheme: (theme: 'dark' | 'light') =>\n viewerRef.current?.setTheme(theme),\n setTool: (tool: 'pan' | 'select' | 'measure') =>\n viewerRef.current?.setTool(tool),\n };\n}\n"]}
package/package.json CHANGED
@@ -1,11 +1,18 @@
1
1
  {
2
2
  "name": "@cadview/react",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "React wrapper for @cadview/core — CAD/DXF file viewer component",
7
7
  "author": "Wisnu Wicaksono",
8
- "keywords": ["cad", "dxf", "viewer", "react", "component", "canvas"],
8
+ "keywords": [
9
+ "cad",
10
+ "dxf",
11
+ "viewer",
12
+ "react",
13
+ "component",
14
+ "canvas"
15
+ ],
9
16
  "repository": {
10
17
  "type": "git",
11
18
  "url": "git+https://github.com/wiscaksono/cadview.git",
@@ -33,25 +40,29 @@
33
40
  }
34
41
  }
35
42
  },
36
- "files": ["dist", "LICENSE", "README.md"],
37
- "scripts": {
38
- "build": "tsup",
39
- "dev": "tsup --watch",
40
- "typecheck": "tsc --noEmit"
41
- },
43
+ "files": [
44
+ "dist",
45
+ "LICENSE",
46
+ "README.md"
47
+ ],
42
48
  "peerDependencies": {
43
- "@cadview/core": "workspace:*",
44
49
  "react": "^18.0.0 || ^19.0.0",
45
- "react-dom": "^18.0.0 || ^19.0.0"
50
+ "react-dom": "^18.0.0 || ^19.0.0",
51
+ "@cadview/core": "0.3.0"
46
52
  },
47
53
  "devDependencies": {
48
- "@cadview/core": "workspace:*",
49
54
  "@types/react": "^19.0.0",
50
55
  "@types/react-dom": "^19.0.0",
51
56
  "react": "^19.0.0",
52
57
  "react-dom": "^19.0.0",
53
58
  "tsup": "^8.0.0",
54
- "typescript": "^5.7.0"
59
+ "typescript": "^5.7.0",
60
+ "@cadview/core": "0.3.0"
55
61
  },
56
- "sideEffects": false
57
- }
62
+ "sideEffects": false,
63
+ "scripts": {
64
+ "build": "tsup",
65
+ "dev": "tsup --watch",
66
+ "typecheck": "tsc --noEmit"
67
+ }
68
+ }