@toolpath/viewer 1.1.0 → 1.2.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.
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { Group, Mesh, LineSegments, Box3, Plane, BufferGeometry, Camera, Vector3 } from 'three';
2
+ import { Group, Mesh, LineSegments, Box3, Plane, BufferGeometry, Vector3, Raycaster, Object3D, Intersection, Camera } from 'three';
3
3
 
4
4
  /**
5
5
  * The normalized part — the only thing the renderer consumes.
@@ -175,8 +175,13 @@ interface ViewerTheme {
175
175
  /** `EdgesGeometry` line color and opacity. */
176
176
  readonly edge: number;
177
177
  readonly edgeOpacity: number;
178
- /** The capped face of a section cut, and the cutting plane's outline. */
178
+ /**
179
+ * The capped face of a section cut: its fill, and the hatch lines drawn over
180
+ * it. The cap's edge takes {@link ViewerTheme.sectionHandleOutline}.
181
+ */
179
182
  readonly sectionCap: number;
183
+ readonly sectionHatch: number;
184
+ /** The cutting plane itself — the translucent sheet `<SectionTool>` draws, its outline, and the surface preview. */
180
185
  readonly sectionOutline: number;
181
186
  /**
182
187
  * The arrow that drags the cut, and the shell that outlines it. Hovered it
@@ -184,6 +189,13 @@ interface ViewerTheme {
184
189
  */
185
190
  readonly sectionHandle: number;
186
191
  readonly sectionHandleOutline: number;
192
+ /**
193
+ * A measurement: its lines, end markers, arc and label border, as
194
+ * `<MeasureTool>` draws them. The indicator that shows where the pointer
195
+ * will snap takes {@link ViewerTheme.measureSnap}.
196
+ */
197
+ readonly measure: number;
198
+ readonly measureSnap: number;
187
199
  /**
188
200
  * The view cube's panels, the lines between them, and its face names. A
189
201
  * hovered panel takes {@link ViewerTheme.hover}, the same color the part uses
@@ -397,101 +409,144 @@ interface HighlightLayers {
397
409
  declare function applyHighlightLayers(part: PartObject, layers: HighlightLayers, theme: ViewerTheme): void;
398
410
 
399
411
  /**
400
- * Which modifier keys were down when the pick happened.
401
- *
402
- * Reported rather than interpreted: "hold this to add to the selection" is a
403
- * platform convention — command on a Mac, control everywhere else — and which
404
- * key means what belongs to the app, not to a viewport.
412
+ * Render order. The stencil pass must precede the cap, and the part must draw
413
+ * after both or it overwrites the cap it is supposed to be capped by. The part
414
+ * draws at 3 and its edges at 4, so the handle sits above the cap it stands on.
405
415
  */
406
- interface PickModifiers {
407
- readonly alt: boolean;
408
- readonly ctrl: boolean;
409
- readonly meta: boolean;
410
- readonly shift: boolean;
411
- /** The right button, on a click that did not become a pan. */
412
- readonly secondary: boolean;
413
- }
414
- declare const NO_MODIFIERS: PickModifiers;
416
+ declare const SECTION_RENDER_ORDER: {
417
+ readonly stencil: 1;
418
+ readonly cap: 2;
419
+ readonly handle: 6;
420
+ /** The tool's translucent plane and its outline, over everything but the handle. */
421
+ readonly outline: 5;
422
+ };
423
+ /** The handle's length on screen, in CSS pixels, whatever the zoom. */
424
+ declare const HANDLE_PIXELS = 78;
415
425
  /**
416
- * A pointer event on the part, resolved to the face it landed on and the
417
- * features that own it.
418
- *
419
- * `owners` travels alongside `best` on purpose. A click resolves to five to
420
- * eight readings and the ranking puts one of them up; that is a *default*, not
421
- * a claim of correctness, and a consumer that was handed only the winner could
422
- * not offer the alternatives it silently discarded.
426
+ * The hatch on the cap: stripe pitch and line thickness in CSS pixels, and the
427
+ * outline's width. Screen-space, so the cut reads the same at any zoom.
423
428
  */
424
- interface PartPick {
425
- readonly region: number;
426
- /** Every feature owning the face, in report order. */
427
- readonly owners: readonly FeatureTag[];
428
- /** The same set, ranked for this click. Filtered by an active direction. */
429
- readonly ranked: readonly FeatureTag[];
430
- /** The ranked pick, or `null` when nothing here is reachable that way. */
431
- readonly best: FeatureTag | null;
432
- readonly triangleIndex: number;
433
- readonly point: readonly [number, number, number];
434
- /** The surface's outward normal in world space — the plane under the cursor. */
435
- readonly normal: readonly [number, number, number];
436
- readonly modifiers: PickModifiers;
429
+ declare const CAP_HATCH: {
430
+ readonly pitch: 9;
431
+ readonly line: 1.25;
432
+ readonly outline: 1.5;
433
+ };
434
+ /**
435
+ * The global cutting planes the tool offers: how far outside the part each one
436
+ * stands, and how much larger than the part it is drawn. Both are fractions of
437
+ * the part's largest dimension.
438
+ */
439
+ declare const AXES_PLANE_OFFSET = 0.55;
440
+ declare const AXES_PLANE_SCALE = 1.2;
441
+ /** The surface preview under the pointer, as a fraction of the part's diagonal. */
442
+ declare const PREVIEW_SCALE = 0.125;
443
+ /** How far the tool's translucent plane extends past the part, as a fraction of the diagonal. */
444
+ declare const OUTLINE_SCALE = 1.2;
445
+ interface SectionOptions {
446
+ enabled: boolean;
437
447
  /**
438
- * Whether this click completed a double click on the part.
439
- *
440
- * Reported rather than interpreted, for the same reason the modifiers are:
441
- * what a second click means belongs to the app. A viewer that decided —
442
- * withholding the pick so a double click could not disturb the selection —
443
- * would be right for a list that walks through a face's readings and wrong
444
- * for an editor where clicking a face twice puts it in and takes it out
445
- * again. Both are ordinary, and only the app knows which one it is showing.
446
- *
447
- * The viewport still acts on the gesture itself: `retargetOnDoubleClick`
448
- * re-aims the orbit, which is a question about the view rather than about the
449
- * part, and is nobody else's to answer.
448
+ * The half-space that stays. Defaults to +Z, which keeps the top of the part
449
+ * and eats upward from the bottom as `offset` grows.
450
450
  */
451
- readonly doubled: boolean;
451
+ normal?: Vec3;
452
+ /** Where the sweep sits, 0 (whole part) to 1 (gone). */
453
+ offset?: number;
454
+ /** Key the cut off one surface instead, usually from `sectionFromPick`. */
455
+ plane?: SectionPlacement | null;
456
+ /** How far past that surface to cut, in model units. */
457
+ depth?: number;
452
458
  }
453
- /** A unit vector from the part toward the camera, for the owner ranking. */
454
- declare function viewDirection(camera: Camera, target: Vector3): Vec3;
455
- interface BuildPickInput {
456
- readonly model: PartModel;
457
- readonly region: number;
458
- readonly triangleIndex: number;
459
- readonly point: readonly [number, number, number];
460
- readonly normal: readonly [number, number, number];
461
- readonly modifiers?: PickModifiers;
459
+ interface SectionState {
460
+ readonly enabled: boolean;
461
+ readonly normal: Vec3;
462
+ readonly offset: number;
463
+ readonly constant: number;
464
+ readonly plane: SectionPlacement | null;
465
+ readonly depth: number | null;
462
466
  /**
463
- * The machining direction the pick is scoped to, as an index into
464
- * `candidateDirections`. Narrows the owners to two, one, or **none** — the
465
- * empty case is real, and reads as "nothing here in this direction" rather
466
- * than as a pick that missed.
467
+ * How far the cut can travel from its anchor, in model units, or `null` for a
468
+ * sweep — which is measured as a fraction of the part rather than a distance.
469
+ *
470
+ * Reported because a control that moves the cut has to be bounded by the same
471
+ * numbers the cut is, and only the viewer knows the part's extent along a
472
+ * given normal.
467
473
  */
468
- readonly activeDirection?: number | null;
469
- readonly viewDirection?: Vec3 | null;
470
- /** Whether this click completed a double click. Defaults to `false`. */
471
- readonly doubled?: boolean;
474
+ readonly depthRange: {
475
+ readonly min: number;
476
+ readonly max: number;
477
+ } | null;
478
+ }
479
+ declare const DEFAULT_SECTION_NORMAL: Vec3;
480
+ /**
481
+ * What is reported when a cut goes away.
482
+ *
483
+ * A state rather than `null`, so a consumer that echoes the callback into its
484
+ * own state never has to special-case the absence: `enabled` says it.
485
+ */
486
+ declare const DISABLED_SECTION: SectionState;
487
+ /**
488
+ * The options that would resolve to `state` again.
489
+ *
490
+ * A cut keyed off a surface keeps its anchor and is moved by depth; a sweep is
491
+ * moved by offset. The state carries both descriptions, and which one to keep
492
+ * is what makes a dragged cut stay anchored to the face it was picked from.
493
+ */
494
+ declare function sectionOptionsFromState(state: SectionState): SectionOptions;
495
+ /** One of the three global cutting planes the tool offers. */
496
+ interface AxesPlane {
497
+ /** Which world axis the plane is perpendicular to. */
498
+ readonly axis: 'x' | 'y' | 'z';
499
+ /** Which side of the part the camera is on along that axis, +1 or -1. */
500
+ readonly sign: 1 | -1;
501
+ /** Where to draw it: outside the part, on the side away from the camera. */
502
+ readonly position: Vec3;
503
+ /** Its edge length. */
504
+ readonly size: number;
505
+ /** The sweep a click on it starts: cutting in from the camera's side, halfway through. */
506
+ readonly options: SectionOptions;
472
507
  }
473
- declare function buildPick(input: BuildPickInput): PartPick;
474
508
  /**
475
- * The owner to focus for a click, given what the last click focused.
509
+ * Where the three global planes stand for a camera at `eye`.
476
510
  *
477
- * Clicking the same face again walks its readings — the standard CAD escape
478
- * hatch for an ambiguous click — while a click on a different face starts from
479
- * that face's own best answer.
511
+ * They sit past the part on the side *away* from the camera, like the walls of
512
+ * a room the part is standing in, so the part is never hidden behind them —
513
+ * and each one cuts in from the camera's own side, which is the half of the
514
+ * part somebody looking at it can see into. A camera dead on an axis has no
515
+ * side along the other two; they fall to +1, so the planes still stand
516
+ * somewhere rather than at the part's centre.
480
517
  */
481
- declare function focusForPick(pick: PartPick, previousRegion: number | null, previousFocus: FeatureTag | null): FeatureTag | null;
482
-
518
+ declare function axesPlanes(box: Box3, eye: Vec3): readonly AxesPlane[];
519
+ /** A point on the part under the pointer, with the surface's outward normal in world space. */
520
+ interface SurfaceHit {
521
+ readonly point: Vector3;
522
+ readonly normal: Vector3;
523
+ }
483
524
  /**
484
- * Render order. The stencil pass must precede the cap, and the part must draw
485
- * after both or it overwrites the cap it is supposed to be capped by. The part
486
- * draws at 3 and its edges at 4, so the handle sits above the cap it stands on.
525
+ * The nearest hit on the part along `raycaster`'s ray, or `null`.
526
+ *
527
+ * "The part" is whatever in the scene is a visible mesh outside an overlay —
528
+ * every overlay here marks its outermost group with `EXCLUDE_FROM_FRAME`, the
529
+ * same flag that keeps it out of the camera's framing, and the ones that are
530
+ * not clickable turn their own raycast off besides. What is left is the
531
+ * geometry the consumer put in.
532
+ *
533
+ * A surface a section cut has clipped away is skipped too. three's raycaster
534
+ * knows nothing about clipping planes, so without this a ray through the open
535
+ * half of a cut part lands on a face nobody can see — and a tool that previews
536
+ * or measures there is working on something that is not on screen.
487
537
  */
488
- declare const SECTION_RENDER_ORDER: {
489
- readonly stencil: 1;
490
- readonly cap: 2;
491
- readonly handle: 6;
492
- };
493
- /** The handle's length on screen, in CSS pixels, whatever the zoom. */
494
- declare const HANDLE_PIXELS = 78;
538
+ declare function hitUnderRay(raycaster: Raycaster, root: Object3D): Intersection | null;
539
+ /**
540
+ * The nearest surface of the part along `raycaster`'s ray, or `null`, with the
541
+ * surface's outward normal in world space. Used by the tool to preview a cut
542
+ * on a hovered face without the part having to tell it where the pointer is.
543
+ */
544
+ declare function surfaceUnderRay(raycaster: Raycaster, root: Object3D): SurfaceHit | null;
545
+ /**
546
+ * Where the cut's plane meets the line through the part's centre along its
547
+ * normal — where the cap, the handle and the tool's outline all sit.
548
+ */
549
+ declare function sectionAnchor(box: Box3, plane: Plane, into?: Vector3): Vector3;
495
550
  interface SectionBounds {
496
551
  /** Plane constant at which the whole part is clipped away. */
497
552
  readonly min: number;
@@ -586,68 +641,89 @@ declare function sectionPlane(box: Box3, normal: Vec3, offset: number, into?: Pl
586
641
  */
587
642
  declare function dragPlane(axis: Vector3, view: Vector3, point: Vector3, into?: Plane): Plane;
588
643
 
589
- interface SectionOptions {
590
- enabled: boolean;
591
- /**
592
- * The half-space that stays. Defaults to +Z, which keeps the top of the part
593
- * and eats upward from the bottom as `offset` grows.
594
- */
595
- normal?: Vec3;
596
- /** Where the sweep sits, 0 (whole part) to 1 (gone). */
597
- offset?: number;
598
- /** Key the cut off one surface instead, usually from `sectionFromPick`. */
599
- plane?: SectionPlacement | null;
600
- /** How far past that surface to cut, in model units. */
601
- depth?: number;
644
+ /**
645
+ * Which modifier keys were down when the pick happened.
646
+ *
647
+ * Reported rather than interpreted: "hold this to add to the selection" is a
648
+ * platform convention — command on a Mac, control everywhere else — and which
649
+ * key means what belongs to the app, not to a viewport.
650
+ */
651
+ interface PickModifiers {
652
+ readonly alt: boolean;
653
+ readonly ctrl: boolean;
654
+ readonly meta: boolean;
655
+ readonly shift: boolean;
656
+ /** The right button, on a click that did not become a pan. */
657
+ readonly secondary: boolean;
602
658
  }
603
- interface SectionState {
604
- readonly enabled: boolean;
605
- readonly normal: Vec3;
606
- readonly offset: number;
607
- readonly constant: number;
608
- readonly plane: SectionPlacement | null;
609
- readonly depth: number | null;
659
+ declare const NO_MODIFIERS: PickModifiers;
660
+ /**
661
+ * A pointer event on the part, resolved to the face it landed on and the
662
+ * features that own it.
663
+ *
664
+ * `owners` travels alongside `best` on purpose. A click resolves to five to
665
+ * eight readings and the ranking puts one of them up; that is a *default*, not
666
+ * a claim of correctness, and a consumer that was handed only the winner could
667
+ * not offer the alternatives it silently discarded.
668
+ */
669
+ interface PartPick {
670
+ readonly region: number;
671
+ /** Every feature owning the face, in report order. */
672
+ readonly owners: readonly FeatureTag[];
673
+ /** The same set, ranked for this click. Filtered by an active direction. */
674
+ readonly ranked: readonly FeatureTag[];
675
+ /** The ranked pick, or `null` when nothing here is reachable that way. */
676
+ readonly best: FeatureTag | null;
677
+ readonly triangleIndex: number;
678
+ readonly point: readonly [number, number, number];
679
+ /** The surface's outward normal in world space — the plane under the cursor. */
680
+ readonly normal: readonly [number, number, number];
681
+ readonly modifiers: PickModifiers;
610
682
  /**
611
- * How far the cut can travel from its anchor, in model units, or `null` for a
612
- * sweep — which is measured as a fraction of the part rather than a distance.
683
+ * Whether this click completed a double click on the part.
613
684
  *
614
- * Reported because a control that moves the cut has to be bounded by the same
615
- * numbers the cut is, and only the viewer knows the part's extent along a
616
- * given normal.
685
+ * Reported rather than interpreted, for the same reason the modifiers are:
686
+ * what a second click means belongs to the app. A viewer that decided —
687
+ * withholding the pick so a double click could not disturb the selection —
688
+ * would be right for a list that walks through a face's readings and wrong
689
+ * for an editor where clicking a face twice puts it in and takes it out
690
+ * again. Both are ordinary, and only the app knows which one it is showing.
691
+ *
692
+ * The viewport still acts on the gesture itself: `retargetOnDoubleClick`
693
+ * re-aims the orbit, which is a question about the view rather than about the
694
+ * part, and is nobody else's to answer.
617
695
  */
618
- readonly depthRange: {
619
- readonly min: number;
620
- readonly max: number;
621
- } | null;
696
+ readonly doubled: boolean;
622
697
  }
623
- /** The cut's plane for a set of options, or `null` when there is no cut. */
624
- declare function resolveSectionPlane(options: SectionOptions | undefined, box: Box3): {
625
- plane: Plane;
626
- state: SectionState;
627
- } | null;
628
- interface SectionViewProps {
629
- geometry: BufferGeometry;
630
- box: Box3;
631
- plane: Plane;
632
- theme: ViewerTheme;
633
- showHandle: boolean;
634
- onDrag?: (constant: number) => void;
698
+ /** A unit vector from the part toward the camera, for the owner ranking. */
699
+ declare function viewDirection(camera: Camera, target: Vector3): Vec3;
700
+ interface BuildPickInput {
701
+ readonly model: PartModel;
702
+ readonly region: number;
703
+ readonly triangleIndex: number;
704
+ readonly point: readonly [number, number, number];
705
+ readonly normal: readonly [number, number, number];
706
+ readonly modifiers?: PickModifiers;
707
+ /**
708
+ * The machining direction the pick is scoped to, as an index into
709
+ * `candidateDirections`. Narrows the owners to two, one, or **none** — the
710
+ * empty case is real, and reads as "nothing here in this direction" rather
711
+ * than as a pick that missed.
712
+ */
713
+ readonly activeDirection?: number | null;
714
+ readonly viewDirection?: Vec3 | null;
715
+ /** Whether this click completed a double click. Defaults to `false`. */
716
+ readonly doubled?: boolean;
635
717
  }
718
+ declare function buildPick(input: BuildPickInput): PartPick;
636
719
  /**
637
- * A clipping plane with a solid cap over the cut, and an arrow that drags it.
638
- *
639
- * The cap is the standard two-pass stencil trick: draw the clipped geometry's
640
- * back faces incrementing the stencil and its front faces decrementing it, so a
641
- * non-zero stencil marks exactly where the plane passes through solid material,
642
- * then fill that region with a quad. Without it a section shows the inside of
643
- * the far wall and the part reads as hollow.
720
+ * The owner to focus for a click, given what the last click focused.
644
721
  *
645
- * **The renderer must be created with `stencil: true`.** three defaults it to
646
- * false, and without it every one of those stencil operations is a silent
647
- * no-op — the cut still happens and the part still looks hollow, which is a
648
- * confusing way to find out.
722
+ * Clicking the same face again walks its readings — the standard CAD escape
723
+ * hatch for an ambiguous click — while a click on a different face starts from
724
+ * that face's own best answer.
649
725
  */
650
- declare const SectionView: ({ geometry, box, plane, theme, showHandle, onDrag, }: SectionViewProps) => react.JSX.Element;
726
+ declare function focusForPick(pick: PartPick, previousRegion: number | null, previousFocus: FeatureTag | null): FeatureTag | null;
651
727
 
652
728
  interface PartMeshProps {
653
729
  /** The normalized report. `engine/normalize.ts` produces it. */
@@ -692,17 +768,23 @@ interface PartMeshProps {
692
768
  */
693
769
  activeDirection?: number | null;
694
770
  /**
695
- * The section cut. Omit, or pass `enabled: false`, for none.
771
+ * The section cut. Pass `enabled: false` for none.
696
772
  *
697
773
  * Either sweep an axis — `normal` points into the half that stays and
698
774
  * `offset` runs 0 (whole) to 1 (gone) — or key the cut off one surface with
699
775
  * `plane`, which `depth` then moves in model units. `sectionFromPick` turns a
700
776
  * pick into that placement with the normal the right way round.
777
+ *
778
+ * **Omit it** and the part follows the cut the viewer holds for itself — the
779
+ * one `<SectionTool>` places and `ViewerHandle.setSection` sets — and shows
780
+ * the handle whenever there is one. Passing it takes that over: the cut is
781
+ * then the consumer's, and the viewer's own is ignored.
701
782
  */
702
783
  section?: SectionOptions;
703
784
  /**
704
785
  * The cut changed, including when the handle was dragged. Emitted only on a
705
- * real change, so echoing it into state is safe.
786
+ * real change, so echoing it into state is safe. A cut going away is
787
+ * reported as `enabled: false`, once.
706
788
  */
707
789
  onSectionChange?: (state: SectionState) => void;
708
790
  /**
@@ -818,4 +900,4 @@ declare function normalizePartReport(report: unknown): PartModel;
818
900
  */
819
901
  declare function assertSupportedKernelVersion(kernelVersion: string): void;
820
902
 
821
- export { focusForPick as $, type SectionBounds as A, type BuildPickInput as B, CANDIDATE_WEIGHT as C, DEFAULT_THEME as D, EnginePart as E, type FeatureTag as F, type SectionOptions as G, HANDLE_PIXELS as H, type SectionPlacement as I, type SectionState as J, type KnownFeatureType as K, SectionView as L, MIN_KERNEL_VERSION as M, NO_MODIFIERS as N, type ShapeKind as O, type PartModel as P, applyHighlightLayers as Q, type RegionIndex as R, SECTION_RENDER_ORDER as S, type TriangleRange as T, buildPick as U, type Vec3 as V, buildRegionAttribute as W, buildRegionTexels as X, createPart as Y, directionColor as Z, dragPlane as _, type PartMeshRefs as a, pickedStartDepth as a0, resolveSectionPlane as a1, resolveTheme as a2, sectionBounds as a3, sectionConstant as a4, sectionDepth as a5, sectionDepthConstant as a6, sectionDepthRange as a7, sectionFromPick as a8, sectionOffset as a9, sectionPlane as aa, themesEqual as ab, viewDirection as ac, type EnginePartProps as b, assertSupportedKernelVersion as c, type ViewerTheme as d, type PartModelRegion as e, type PartModelFeature as f, type FeatureType as g, DIRECTION_COLORS as h, type FeatureHighlight as i, HIGHLIGHT_COLORS as j, HIGHLIGHT_WEIGHT as k, HOVER_WEIGHT as l, type HighlightLayers as m, normalizePartReport as n, type KnownShapeKind as o, PICKED_SURFACE_LABEL as p, PartMesh as q, type PartMeshProps as r, smoothRegionNormals as s, type PartObject as t, type PartPick as u, type PickModifiers as v, REGION_ATTRIBUTE as w, type RegionHighlight as x, type RegionPaint as y, type SectionAnchor as z };
903
+ export { type SurfaceHit as $, AXES_PLANE_OFFSET as A, type BuildPickInput as B, CANDIDATE_WEIGHT as C, DEFAULT_SECTION_NORMAL as D, EnginePart as E, type FeatureTag as F, type PartObject as G, HANDLE_PIXELS as H, type PartPick as I, type PickModifiers as J, type KnownFeatureType as K, REGION_ATTRIBUTE as L, MIN_KERNEL_VERSION as M, NO_MODIFIERS as N, OUTLINE_SCALE as O, type PartModel as P, type RegionHighlight as Q, type RegionIndex as R, type SectionOptions as S, type TriangleRange as T, type RegionPaint as U, type Vec3 as V, SECTION_RENDER_ORDER as W, type SectionAnchor as X, type SectionBounds as Y, type SectionPlacement as Z, type ShapeKind as _, type PartMeshRefs as a, applyHighlightLayers as a0, axesPlanes as a1, buildPick as a2, buildRegionAttribute as a3, buildRegionTexels as a4, createPart as a5, directionColor as a6, dragPlane as a7, focusForPick as a8, hitUnderRay as a9, pickedStartDepth as aa, resolveTheme as ab, sectionAnchor as ac, sectionBounds as ad, sectionConstant as ae, sectionDepth as af, sectionDepthConstant as ag, sectionDepthRange as ah, sectionFromPick as ai, sectionOffset as aj, sectionOptionsFromState as ak, sectionPlane as al, surfaceUnderRay as am, themesEqual as an, viewDirection as ao, type EnginePartProps as b, assertSupportedKernelVersion as c, type ViewerTheme as d, type SectionState as e, type PartModelRegion as f, type PartModelFeature as g, type FeatureType as h, AXES_PLANE_SCALE as i, type AxesPlane as j, CAP_HATCH as k, DEFAULT_THEME as l, DIRECTION_COLORS as m, normalizePartReport as n, DISABLED_SECTION as o, type FeatureHighlight as p, HIGHLIGHT_COLORS as q, HIGHLIGHT_WEIGHT as r, smoothRegionNormals as s, HOVER_WEIGHT as t, type HighlightLayers as u, type KnownShapeKind as v, PICKED_SURFACE_LABEL as w, PREVIEW_SCALE as x, PartMesh as y, type PartMeshProps as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toolpath/viewer",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "React Three Fiber viewer for Toolpath Engine part reports",
5
5
  "license": "MIT",
6
6
  "engines": {