diff --git a/README.md b/README.md
index 8bbb06c..906aa45 100644
--- a/README.md
+++ b/README.md
@@ -90,7 +90,7 @@ async function loadFile(file) {
- **Error display** — parse/render/fetch errors shown in the viewer with retry support
- **Debug overlay** — FPS, draw calls, lines, triangles
- **Zoom level** — percentage display relative to fit-to-view
-- **TAA anti-aliasing** — smooth edges after idle accumulation
+- **Configurable antialiasing** — choose between MSAA (default, hardware), SMAA, FXAA, TAA, SSAA, or none
- **TypeScript** — strict types, full `.d.ts` declarations
## Acknowledgements
diff --git a/demo/App.vue b/demo/App.vue
index 5fd4ae4..134b65e 100644
--- a/demo/App.vue
+++ b/demo/App.vue
@@ -89,6 +89,41 @@
+
+
Antialiasing:
+
+
{{ aaDescription }}
+
+
+
+
+ Overlays — click an empty cell to position, click the active (blue) cell to hide
+
+
+
+
{{ row.label }}
+
+
+
+
+
+
+
{{ isTouchDevice ? "Pinch to zoom · Drag to pan" : "Scroll to zoom · Drag to pan" }}
@@ -113,16 +148,27 @@
+
@@ -155,11 +202,13 @@
+
+
+
+
+```
+
+## Accessibility
+
+- **`prefers-reduced-motion`** — when the user has enabled "reduce motion" in their OS, the TAA antialiasing mode renders a single frame without the 32-frame jitter accumulation animation. Other AA modes are unaffected.
+
## Composables
| Composable | Description |
|------------|-------------|
| `useDXFRenderer` | Main orchestrator: parsing, display, resize, layer visibility, dark theme |
-| `useThreeScene` | Three.js scene/renderer init with TAA anti-aliasing |
+| `useThreeScene` | Three.js scene/renderer init with configurable antialiasing (MSAA/SMAA/FXAA/TAA/SSAA/none) |
| `useLayers` | Layer visibility state management |
## Re-exports
diff --git a/packages/dxf-vuer/package.json b/packages/dxf-vuer/package.json
index 8f4875f..8f9702b 100644
--- a/packages/dxf-vuer/package.json
+++ b/packages/dxf-vuer/package.json
@@ -1,6 +1,6 @@
{
"name": "dxf-vuer",
- "version": "2.3.1",
+ "version": "2.4.0",
"description": "Vue 3 DXF file viewer — render AutoCAD DXF drawings in the browser with Three.js. Built-in parser, vector text rendering, TypeScript support.",
"type": "module",
"license": "MIT",
@@ -61,7 +61,7 @@
"test": "vitest run"
},
"peerDependencies": {
- "dxf-render": "^1.2.0",
+ "dxf-render": "^1.3.0",
"three": ">=0.160.0",
"vue": "^3.4.0"
},
diff --git a/packages/dxf-vuer/src/components/DXFViewer.vue b/packages/dxf-vuer/src/components/DXFViewer.vue
index 0654538..8be05d1 100644
--- a/packages/dxf-vuer/src/components/DXFViewer.vue
+++ b/packages/dxf-vuer/src/components/DXFViewer.vue
@@ -83,7 +83,7 @@
(), {
showDebugInfo: false,
showFileName: true,
showExportButton: false,
+ showLayerPanel: true,
allowDrop: false,
darkTheme: false,
fontUrl: "",
+ antialiasing: "msaa",
fileNamePosition: "top-left",
toolbarPosition: "top-right",
coordinatesPosition: "bottom-left",
@@ -482,6 +487,29 @@ const loadDXFFromData = async (dxfData: DxfData) => {
}
};
+const decodeBuffer = (buffer: ArrayBuffer): string => {
+ const view = new Uint8Array(buffer);
+ // UTF-16 LE BOM (DXF files saved by AutoCAD with non-ASCII content)
+ if (view.length >= 2 && view[0] === 0xff && view[1] === 0xfe) {
+ return new TextDecoder("utf-16le").decode(buffer);
+ }
+ // UTF-16 BE BOM
+ if (view.length >= 2 && view[0] === 0xfe && view[1] === 0xff) {
+ return new TextDecoder("utf-16be").decode(buffer);
+ }
+ // UTF-8 (with or without BOM — TextDecoder strips it automatically)
+ return new TextDecoder("utf-8").decode(buffer);
+};
+
+const loadDXFFromBuffer = async (buffer: ArrayBuffer) => {
+ await loadDXFFromText(decodeBuffer(buffer));
+};
+
+const loadDXFFromBlob = async (blob: Blob) => {
+ const buffer = await blob.arrayBuffer();
+ await loadDXFFromBuffer(buffer);
+};
+
const loadDXFFromUrl = async (url: string) => {
clearError();
isLoading.value = true;
@@ -545,7 +573,7 @@ onMounted(() => {
document.addEventListener("fullscreenchange", onFullscreenChange);
nextTick(() => {
if (dxfContainer.value) {
- initThreeJS(dxfContainer.value, { enableControls: true });
+ initThreeJS(dxfContainer.value, { enableControls: true, aaMode: props.antialiasing });
if (props.url) {
loadDXFFromUrl(props.url);
@@ -575,6 +603,8 @@ defineExpose({
loadDXFFromText,
loadDXFFromData,
loadDXFFromUrl,
+ loadDXFFromBuffer,
+ loadDXFFromBlob,
resize,
resetView,
exportToPNG,
diff --git a/packages/dxf-vuer/src/components/LayerPanel.vue b/packages/dxf-vuer/src/components/LayerPanel.vue
index 0e91fa1..4df34cc 100644
--- a/packages/dxf-vuer/src/components/LayerPanel.vue
+++ b/packages/dxf-vuer/src/components/LayerPanel.vue
@@ -13,9 +13,27 @@
+
+
+
+
+
+
No layers match "{{ filter }}"