@chestnutlabs/gcode-preview-svelte 0.4.0 → 0.5.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.
@@ -22,6 +22,10 @@
22
22
  export let quality = 'auto';
23
23
  /** #150 (DD-009 D3): camera projection ('perspective' | 'orthographic'). */
24
24
  export let cameraMode = 'perspective';
25
+ /** #268/#275/M6: snap to a preset orientation (top/front/iso/…). */
26
+ export let view = undefined;
27
+ /** #268/#275/M6: restore a saved camera pose. Pair with the `camerachange` event for two-way. */
28
+ export let cameraState = undefined;
25
29
  /** #153 (DD-009 D4): bounded declarative theme. */
26
30
  export let theme = undefined;
27
31
  export let colorMode = undefined;
@@ -68,12 +72,19 @@
68
72
  parseDefaults: parseOptions
69
73
  });
70
74
 
71
- if (isMachine) preview.controls.setBuildVolume(buildVolume);
72
-
73
75
  preview.onEvent((e) => {
74
76
  switch (e.type) {
75
77
  case 'parse-complete':
76
- dispatch('ready', { segments: e.segments, layers: e.layers, complete: e.complete });
78
+ dispatch('ready', {
79
+ segments: e.segments,
80
+ layers: e.layers,
81
+ complete: e.complete,
82
+ capabilities: e.capabilities,
83
+ warnings: e.warnings
84
+ });
85
+ break;
86
+ case 'camera-changed':
87
+ dispatch('camerachange', e.state);
77
88
  break;
78
89
  case 'parse-error':
79
90
  dispatch('parseerror', { code: e.code, message: e.message });
@@ -111,6 +122,10 @@
111
122
  });
112
123
 
113
124
  // ---- prop wiring: each prop is a thin reactive call into the handle (D1 shell rule) ----
125
+ // buildVolume must be reactive too (#274) — matching Vue's watch and React's useEffect. A machine
126
+ // geometry is (re)applied via the handle; a plain BuildVolumeDef is an init-time renderer option
127
+ // (above) that a post-mount change re-applies here as well.
128
+ $: if (buildVolume !== undefined) preview.controls.setBuildVolume(buildVolume);
114
129
  $: if (source !== null && source !== undefined) void preview.parse(source, parseOptions);
115
130
  $: if (layerRange === null || layerRange === undefined) preview.controls.setLayerRange(0, Number.POSITIVE_INFINITY);
116
131
  else preview.controls.setLayerRange(layerRange[0], layerRange[1]);
@@ -122,6 +137,8 @@
122
137
  $: if (colorMode !== undefined) preview.controls.setColorMode(colorMode);
123
138
  $: preview.controls.setQuality(quality);
124
139
  $: preview.controls.setCameraMode(cameraMode);
140
+ $: if (view !== undefined) preview.controls.setView(view);
141
+ $: if (cameraState !== undefined && cameraState !== null) preview.controls.setCameraState(cameraState);
125
142
  $: if (theme !== undefined) preview.controls.setTheme(theme);
126
143
  $: if (progress === null || progress === undefined) preview.clearProgress();
127
144
  else preview.observeProgress(progress);
@@ -129,8 +146,10 @@
129
146
  onDestroy(() => preview.dispose());
130
147
  </script>
131
148
 
149
+ <!-- tabindex makes the canvas focusable → keyboard camera (DD-004 a11y, #275/M4) -->
132
150
  <canvas
133
151
  use:preview.canvas
152
+ tabindex="0"
134
153
  style="width: 100%; height: 100%; display: block; touch-action: none;"
135
154
  aria-label="3D G-code toolpath preview"
136
155
  ></canvas>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chestnutlabs/gcode-preview-svelte",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Thin Svelte integration for the Chestnut Labs G-code viewer (DD-007 D1 amendment): createGcodePreview store/action API + GcodePreview component as a reactivity bridge over @chestnutlabs/gcode-preview-core.",
5
5
  "keywords": [
6
6
  "gcode",
@@ -55,10 +55,10 @@
55
55
  "test": "vitest run"
56
56
  },
57
57
  "dependencies": {
58
- "@chestnutlabs/gcode-parser": "0.4.0",
59
- "@chestnutlabs/gcode-preview-core": "0.4.0",
60
- "@chestnutlabs/gcode-renderer-three": "0.4.0",
61
- "@chestnutlabs/toolpath-core": "0.4.0"
58
+ "@chestnutlabs/gcode-parser": "0.5.0",
59
+ "@chestnutlabs/gcode-preview-core": "0.5.0",
60
+ "@chestnutlabs/gcode-renderer-three": "0.5.0",
61
+ "@chestnutlabs/toolpath-core": "0.5.0"
62
62
  },
63
63
  "peerDependencies": {
64
64
  "svelte": "^4.0.0 || ^5.0.0"