@chestnutlabs/gcode-preview-vue 0.4.0 → 0.5.1

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.
@@ -10,7 +10,8 @@
10
10
  * and staying pure TypeScript keeps the package on the plain tsc build with typed props/emits.
11
11
  */
12
12
  import { type PropType } from 'vue';
13
- import type { BuildVolumeDef, CameraMode, ColorMode, QualityMode, Theme, TubeOptions } from '@chestnutlabs/gcode-renderer-three';
13
+ import type { BuildVolumeDef, CameraMode, CameraState, CameraView, ColorMode, QualityMode, Theme, TubeOptions } from '@chestnutlabs/gcode-renderer-three';
14
+ import type { Confidence, Warning } from '@chestnutlabs/toolpath-core';
14
15
  import type { MachineGeometry, ProgressObservation } from '@chestnutlabs/toolpath-core';
15
16
  import type { WireParseOptions, WorkerLike } from '@chestnutlabs/gcode-parser';
16
17
  import { type RendererMode, type UseGcodePreviewOptions } from './use-gcode-preview.js';
@@ -49,6 +50,16 @@ export declare const GcodePreview: import("vue").DefineComponent<import("vue").E
49
50
  type: PropType<CameraMode>;
50
51
  default: string;
51
52
  };
53
+ /** #268/#275/M6: snap to a preset orientation (top/front/iso/…). */
54
+ view: {
55
+ type: PropType<CameraView>;
56
+ default: undefined;
57
+ };
58
+ /** #268/#275/M6: restore a saved camera pose. Pair with `@camera-change` for a two-way binding. */
59
+ cameraState: {
60
+ type: PropType<CameraState | null>;
61
+ default: undefined;
62
+ };
52
63
  /** #153 (DD-009 D4): bounded declarative theme. */
53
64
  theme: {
54
65
  type: PropType<Theme>;
@@ -114,7 +125,10 @@ export declare const GcodePreview: import("vue").DefineComponent<import("vue").E
114
125
  segments: number;
115
126
  layers: number;
116
127
  complete: boolean;
128
+ capabilities: Record<string, Confidence>;
129
+ warnings: readonly Warning[];
117
130
  }) => true;
131
+ 'camera-change': (_state: CameraState) => true;
118
132
  'parse-error': (_e: {
119
133
  code: string;
120
134
  message: string;
@@ -178,6 +192,16 @@ export declare const GcodePreview: import("vue").DefineComponent<import("vue").E
178
192
  type: PropType<CameraMode>;
179
193
  default: string;
180
194
  };
195
+ /** #268/#275/M6: snap to a preset orientation (top/front/iso/…). */
196
+ view: {
197
+ type: PropType<CameraView>;
198
+ default: undefined;
199
+ };
200
+ /** #268/#275/M6: restore a saved camera pose. Pair with `@camera-change` for a two-way binding. */
201
+ cameraState: {
202
+ type: PropType<CameraState | null>;
203
+ default: undefined;
204
+ };
181
205
  /** #153 (DD-009 D4): bounded declarative theme. */
182
206
  theme: {
183
207
  type: PropType<Theme>;
@@ -246,7 +270,10 @@ export declare const GcodePreview: import("vue").DefineComponent<import("vue").E
246
270
  segments: number;
247
271
  layers: number;
248
272
  complete: boolean;
273
+ capabilities: Record<string, Confidence>;
274
+ warnings: readonly Warning[];
249
275
  }) => any) | undefined;
276
+ "onCamera-change"?: ((_state: CameraState) => any) | undefined;
250
277
  "onParse-error"?: ((_e: {
251
278
  code: string;
252
279
  message: string;
@@ -282,6 +309,8 @@ export declare const GcodePreview: import("vue").DefineComponent<import("vue").E
282
309
  tube: TubeOptions;
283
310
  adjacentLayers: number;
284
311
  parseOptions: WireParseOptions;
312
+ view: CameraView;
313
+ cameraState: CameraState | null;
285
314
  layerRange: [number, number] | null;
286
315
  scrub: number | null;
287
316
  scrubTime: number | null;
@@ -1 +1 @@
1
- {"version":3,"file":"gcode-preview-component.d.ts","sourceRoot":"","sources":["../src/gcode-preview-component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gcode-preview-component.d.ts","sourceRoot":"","sources":["../src/gcode-preview-component.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,10 @@ export const GcodePreview = defineComponent({
26
26
  quality: { type: String, default: 'auto' },
27
27
  /** #150 (DD-009 D3): camera projection. */
28
28
  cameraMode: { type: String, default: 'perspective' },
29
+ /** #268/#275/M6: snap to a preset orientation (top/front/iso/…). */
30
+ view: { type: String, default: undefined },
31
+ /** #268/#275/M6: restore a saved camera pose. Pair with `@camera-change` for a two-way binding. */
32
+ cameraState: { type: Object, default: undefined },
29
33
  /** #153 (DD-009 D4): bounded declarative theme. */
30
34
  theme: { type: Object, default: undefined },
31
35
  colorMode: { type: Object, default: undefined },
@@ -58,6 +62,7 @@ export const GcodePreview = defineComponent({
58
62
  emits: {
59
63
  /* eslint-disable @typescript-eslint/no-unused-vars -- emit validators document payloads */
60
64
  ready: (_summary) => true,
65
+ 'camera-change': (_state) => true,
61
66
  'parse-error': (_e) => true,
62
67
  'parse-cancelled': () => true,
63
68
  'parse-progress': (_p) => true,
@@ -95,7 +100,16 @@ export const GcodePreview = defineComponent({
95
100
  preview.onEvent((e) => {
96
101
  switch (e.type) {
97
102
  case 'parse-complete':
98
- emit('ready', { segments: e.segments, layers: e.layers, complete: e.complete });
103
+ emit('ready', {
104
+ segments: e.segments,
105
+ layers: e.layers,
106
+ complete: e.complete,
107
+ capabilities: e.capabilities,
108
+ warnings: e.warnings
109
+ });
110
+ break;
111
+ case 'camera-changed':
112
+ emit('camera-change', e.state);
99
113
  break;
100
114
  case 'parse-error':
101
115
  emit('parse-error', { code: e.code, message: e.message });
@@ -130,6 +144,17 @@ export const GcodePreview = defineComponent({
130
144
  }
131
145
  });
132
146
  // ---- prop wiring: each prop is a thin call into the composable (D1 shell rule) ----
147
+ //
148
+ // `{ immediate: true }` on every RUNTIME-ONLY prop watcher: Vue's `watch` does not fire on mount
149
+ // by default, so a runtime control prop set at mount time (`:show-travel="false"`, `:layer-range`,
150
+ // `:scrub`, `:view`, …) would otherwise be dropped and only take effect on a later *change* — the
151
+ // initial-state desync the other three adapters don't have (React's `useEffect`, Svelte's `$:`,
152
+ // and Element's `applyRuntimeState()` all apply the initial value on mount). Controls issued before
153
+ // the renderer resolves are queued and replayed, so firing at mount is safe.
154
+ //
155
+ // The CONSTRUCTION-covered props (`colorMode`, `quality`, `cameraMode`, `theme`, and a plain
156
+ // `buildVolume`) are already applied as renderer options at controller creation above, so their
157
+ // watchers stay change-only — making them immediate would just re-apply the same value redundantly.
133
158
  watch(() => props.source, (source) => {
134
159
  if (source !== null)
135
160
  void preview.parse(source, props.parseOptions);
@@ -139,18 +164,26 @@ export const GcodePreview = defineComponent({
139
164
  preview.controls.setLayerRange(0, Number.POSITIVE_INFINITY);
140
165
  else
141
166
  preview.controls.setLayerRange(range[0], range[1]);
142
- });
143
- watch(() => props.scrub, (scrub) => preview.controls.setScrubPosition(scrub));
144
- watch(() => props.scrubTime, (t) => preview.controls.setScrubTime(t));
145
- watch(() => props.showTravel, (visible) => preview.controls.setKindVisible('travel', visible));
146
- watch(() => props.showWipe, (visible) => preview.controls.setKindVisible('wipe', visible));
147
- watch(() => props.showRetractions, (visible) => preview.controls.setShowRetractions(visible));
167
+ }, { immediate: true });
168
+ watch(() => props.scrub, (scrub) => preview.controls.setScrubPosition(scrub), { immediate: true });
169
+ watch(() => props.scrubTime, (t) => preview.controls.setScrubTime(t), { immediate: true });
170
+ watch(() => props.showTravel, (visible) => preview.controls.setKindVisible('travel', visible), { immediate: true });
171
+ watch(() => props.showWipe, (visible) => preview.controls.setKindVisible('wipe', visible), { immediate: true });
172
+ watch(() => props.showRetractions, (visible) => preview.controls.setShowRetractions(visible), { immediate: true });
148
173
  watch(() => props.colorMode, (mode) => {
149
174
  if (mode !== undefined)
150
175
  preview.controls.setColorMode(mode);
151
176
  });
152
177
  watch(() => props.quality, (quality) => preview.controls.setQuality(quality));
153
178
  watch(() => props.cameraMode, (mode) => preview.controls.setCameraMode(mode));
179
+ watch(() => props.view, (view) => {
180
+ if (view !== undefined)
181
+ preview.controls.setView(view);
182
+ }, { immediate: true });
183
+ watch(() => props.cameraState, (state) => {
184
+ if (state !== undefined && state !== null)
185
+ preview.controls.setCameraState(state);
186
+ }, { immediate: true });
154
187
  watch(() => props.theme, (theme) => {
155
188
  if (theme !== undefined)
156
189
  preview.controls.setTheme(theme);
@@ -164,7 +197,7 @@ export const GcodePreview = defineComponent({
164
197
  preview.clearProgress();
165
198
  else
166
199
  preview.observeProgress(obs);
167
- });
200
+ }, { immediate: true });
168
201
  // Template-ref access to the full handle (defineExpose per §4.1).
169
202
  expose({ preview });
170
203
  const canvasEl = ref(null);
@@ -174,6 +207,7 @@ export const GcodePreview = defineComponent({
174
207
  return () => h('canvas', {
175
208
  ref: canvasEl,
176
209
  style: { width: '100%', height: '100%', display: 'block', touchAction: 'none' },
210
+ tabindex: '0', // focusable → keyboard camera (DD-004 a11y, #275/M4)
177
211
  'aria-label': '3D G-code toolpath preview'
178
212
  });
179
213
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chestnutlabs/gcode-preview-vue",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "Thin Vue 3 integration for the Chestnut Labs G-code viewer (DD-007): useGcodePreview composable + GcodePreview component over the framework-neutral parser/renderer/progress packages.",
5
5
  "keywords": [
6
6
  "gcode",
@@ -50,10 +50,10 @@
50
50
  "test": "vitest run"
51
51
  },
52
52
  "dependencies": {
53
- "@chestnutlabs/gcode-parser": "0.4.0",
54
- "@chestnutlabs/gcode-renderer-three": "0.4.0",
55
- "@chestnutlabs/toolpath-core": "0.4.0",
56
- "@chestnutlabs/gcode-preview-core": "0.4.0"
53
+ "@chestnutlabs/gcode-parser": "0.5.1",
54
+ "@chestnutlabs/gcode-renderer-three": "0.5.1",
55
+ "@chestnutlabs/toolpath-core": "0.5.1",
56
+ "@chestnutlabs/gcode-preview-core": "0.5.1"
57
57
  },
58
58
  "peerDependencies": {
59
59
  "vue": "^3.4.0"