@pooder/kit 5.3.1 → 6.0.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.
Files changed (65) hide show
  1. package/.test-dist/src/extensions/background.js +475 -131
  2. package/.test-dist/src/extensions/dieline.js +283 -180
  3. package/.test-dist/src/extensions/dielineShape.js +66 -0
  4. package/.test-dist/src/extensions/feature.js +388 -303
  5. package/.test-dist/src/extensions/film.js +133 -74
  6. package/.test-dist/src/extensions/geometry.js +120 -56
  7. package/.test-dist/src/extensions/image.js +296 -212
  8. package/.test-dist/src/extensions/index.js +1 -3
  9. package/.test-dist/src/extensions/maskOps.js +75 -20
  10. package/.test-dist/src/extensions/ruler.js +312 -215
  11. package/.test-dist/src/extensions/sceneLayoutModel.js +9 -3
  12. package/.test-dist/src/extensions/sceneVisibility.js +3 -10
  13. package/.test-dist/src/extensions/tracer.js +229 -58
  14. package/.test-dist/src/extensions/white-ink.js +139 -129
  15. package/.test-dist/src/services/CanvasService.js +888 -126
  16. package/.test-dist/src/services/index.js +1 -0
  17. package/.test-dist/src/services/visibility.js +54 -0
  18. package/.test-dist/tests/run.js +58 -4
  19. package/CHANGELOG.md +12 -0
  20. package/dist/index.d.mts +377 -82
  21. package/dist/index.d.ts +377 -82
  22. package/dist/index.js +3920 -2178
  23. package/dist/index.mjs +3992 -2247
  24. package/package.json +1 -1
  25. package/src/extensions/background.ts +631 -145
  26. package/src/extensions/dieline.ts +280 -187
  27. package/src/extensions/dielineShape.ts +109 -0
  28. package/src/extensions/feature.ts +485 -366
  29. package/src/extensions/film.ts +152 -76
  30. package/src/extensions/geometry.ts +203 -104
  31. package/src/extensions/image.ts +319 -238
  32. package/src/extensions/index.ts +0 -1
  33. package/src/extensions/ruler.ts +481 -268
  34. package/src/extensions/sceneLayoutModel.ts +18 -6
  35. package/src/extensions/white-ink.ts +157 -171
  36. package/src/services/CanvasService.ts +1126 -140
  37. package/src/services/index.ts +1 -0
  38. package/src/services/renderSpec.ts +69 -4
  39. package/src/services/visibility.ts +78 -0
  40. package/tests/run.ts +139 -4
  41. package/.test-dist/src/CanvasService.js +0 -249
  42. package/.test-dist/src/ViewportSystem.js +0 -75
  43. package/.test-dist/src/background.js +0 -203
  44. package/.test-dist/src/bridgeSelection.js +0 -20
  45. package/.test-dist/src/constraints.js +0 -237
  46. package/.test-dist/src/dieline.js +0 -818
  47. package/.test-dist/src/edgeScale.js +0 -12
  48. package/.test-dist/src/feature.js +0 -826
  49. package/.test-dist/src/featureComplete.js +0 -32
  50. package/.test-dist/src/film.js +0 -167
  51. package/.test-dist/src/geometry.js +0 -506
  52. package/.test-dist/src/image.js +0 -1250
  53. package/.test-dist/src/maskOps.js +0 -270
  54. package/.test-dist/src/mirror.js +0 -104
  55. package/.test-dist/src/renderSpec.js +0 -2
  56. package/.test-dist/src/ruler.js +0 -343
  57. package/.test-dist/src/sceneLayout.js +0 -99
  58. package/.test-dist/src/sceneLayoutModel.js +0 -196
  59. package/.test-dist/src/sceneView.js +0 -40
  60. package/.test-dist/src/sceneVisibility.js +0 -42
  61. package/.test-dist/src/size.js +0 -332
  62. package/.test-dist/src/tracer.js +0 -544
  63. package/.test-dist/src/white-ink.js +0 -829
  64. package/.test-dist/src/wrappedOffsets.js +0 -33
  65. package/src/extensions/sceneVisibility.ts +0 -71
@@ -7,7 +7,6 @@ const WHITE_INK_OBJECT_LAYER_ID = "white-ink.user";
7
7
  const WHITE_INK_COVER_LAYER_ID = "white-ink.cover";
8
8
  const WHITE_INK_OVERLAY_LAYER_ID = "white-ink.overlay";
9
9
  const IMAGE_OBJECT_LAYER_ID = "image.user";
10
- const IMAGE_OVERLAY_LAYER_ID = "image-overlay";
11
10
  const WHITE_INK_DEBUG_KEY = "whiteInk.debug";
12
11
  const WHITE_INK_PREVIEW_IMAGE_VISIBLE_KEY = "whiteInk.previewImageVisible";
13
12
  const WHITE_INK_DEFAULT_OPACITY = 0.85;
@@ -34,6 +33,9 @@ class WhiteInkTool {
34
33
  this.printWithWhiteInk = true;
35
34
  this.previewImageVisible = true;
36
35
  this.renderSeq = 0;
36
+ this.whiteSpecs = [];
37
+ this.coverSpecs = [];
38
+ this.overlaySpecs = [];
37
39
  this.onToolActivated = (event) => {
38
40
  const before = this.isToolActive;
39
41
  this.syncToolActiveFromWorkbench(event.id);
@@ -77,6 +79,29 @@ class WhiteInkTool {
77
79
  console.warn("CanvasService not found for WhiteInkTool");
78
80
  return;
79
81
  }
82
+ this.renderProducerDisposable?.dispose();
83
+ this.renderProducerDisposable = this.canvasService.registerRenderProducer(this.id, () => ({
84
+ passes: [
85
+ {
86
+ id: WHITE_INK_COVER_LAYER_ID,
87
+ stack: 220,
88
+ order: 0,
89
+ objects: this.coverSpecs,
90
+ },
91
+ {
92
+ id: WHITE_INK_OBJECT_LAYER_ID,
93
+ stack: 221,
94
+ order: 0,
95
+ objects: this.whiteSpecs,
96
+ },
97
+ {
98
+ id: WHITE_INK_OVERLAY_LAYER_ID,
99
+ stack: 790,
100
+ order: 0,
101
+ objects: this.overlaySpecs,
102
+ },
103
+ ],
104
+ }), { priority: 260 });
80
105
  context.eventBus.on("tool:activated", this.onToolActivated);
81
106
  context.eventBus.on("scene:layout:change", this.onSceneLayoutChanged);
82
107
  context.eventBus.on("object:added", this.onObjectAdded);
@@ -139,7 +164,11 @@ class WhiteInkTool {
139
164
  this.dirtyTrackerDisposable?.dispose();
140
165
  this.dirtyTrackerDisposable = undefined;
141
166
  this.clearRenderedWhiteInks();
142
- this.applyImageVisibilityForWhiteInk(false);
167
+ this.renderProducerDisposable?.dispose();
168
+ this.renderProducerDisposable = undefined;
169
+ if (this.canvasService) {
170
+ void this.canvasService.flushRenderFromProducers();
171
+ }
143
172
  this.canvasService = undefined;
144
173
  this.context = undefined;
145
174
  }
@@ -557,11 +586,20 @@ class WhiteInkTool {
557
586
  if (!layout) {
558
587
  return { left: 0, top: 0, width: 0, height: 0 };
559
588
  }
560
- return {
589
+ return this.canvasService.toSceneRect({
561
590
  left: layout.cutRect.left,
562
591
  top: layout.cutRect.top,
563
592
  width: layout.cutRect.width,
564
593
  height: layout.cutRect.height,
594
+ });
595
+ }
596
+ toLayoutSceneRect(rect) {
597
+ return {
598
+ left: rect.left,
599
+ top: rect.top,
600
+ width: rect.width,
601
+ height: rect.height,
602
+ space: "scene",
565
603
  };
566
604
  }
567
605
  getImageObjects() {
@@ -594,14 +632,20 @@ class WhiteInkTool {
594
632
  const width = Number(obj?.width || 0);
595
633
  const height = Number(obj?.height || 0);
596
634
  this.rememberSourceSize(src, { width, height });
635
+ const sceneScale = this.canvasService?.getSceneScale() || 1;
636
+ const leftScreen = Number.isFinite(obj?.left) ? Number(obj.left) : 0;
637
+ const topScreen = Number.isFinite(obj?.top) ? Number(obj.top) : 0;
638
+ const scenePoint = this.canvasService
639
+ ? this.canvasService.toScenePoint({ x: leftScreen, y: topScreen })
640
+ : { x: leftScreen, y: topScreen };
597
641
  return {
598
642
  id: String(obj?.data?.id || "image"),
599
643
  src,
600
644
  element,
601
- left: Number.isFinite(obj?.left) ? Number(obj.left) : 0,
602
- top: Number.isFinite(obj?.top) ? Number(obj.top) : 0,
603
- scaleX: Number.isFinite(obj?.scaleX) ? Number(obj.scaleX) : 1,
604
- scaleY: Number.isFinite(obj?.scaleY) ? Number(obj.scaleY) : 1,
645
+ left: scenePoint.x,
646
+ top: scenePoint.y,
647
+ scaleX: (Number.isFinite(obj?.scaleX) ? Number(obj.scaleX) : 1) / sceneScale,
648
+ scaleY: (Number.isFinite(obj?.scaleY) ? Number(obj.scaleY) : 1) / sceneScale,
605
649
  angle: Number.isFinite(obj?.angle) ? Number(obj.angle) : 0,
606
650
  originX: typeof obj?.originX === "string" ? obj.originX : "center",
607
651
  originY: typeof obj?.originY === "string" ? obj.originY : "center",
@@ -799,8 +843,11 @@ class WhiteInkTool {
799
843
  return [];
800
844
  if (frame.width <= 0 || frame.height <= 0)
801
845
  return [];
802
- const canvasW = this.canvasService.canvas.width || 0;
803
- const canvasH = this.canvasService.canvas.height || 0;
846
+ const viewport = this.canvasService.getSceneViewportRect();
847
+ const canvasW = viewport.width || 0;
848
+ const canvasH = viewport.height || 0;
849
+ const canvasLeft = viewport.left || 0;
850
+ const canvasTop = viewport.top || 0;
804
851
  const strokeColor = this.getConfig("image.frame.strokeColor", "#808080") || "#808080";
805
852
  const strokeWidthRaw = Number(this.getConfig("image.frame.strokeWidth", 2) ?? 2);
806
853
  const dashLengthRaw = Number(this.getConfig("image.frame.dashLength", 8) ?? 8);
@@ -814,15 +861,30 @@ class WhiteInkTool {
814
861
  const dashLength = Number.isFinite(dashLengthRaw)
815
862
  ? Math.max(1, dashLengthRaw)
816
863
  : 8;
817
- const frameLeft = Math.max(0, Math.min(canvasW, frame.left));
818
- const frameTop = Math.max(0, Math.min(canvasH, frame.top));
819
- const frameRight = Math.max(frameLeft, Math.min(canvasW, frame.left + frame.width));
820
- const frameBottom = Math.max(frameTop, Math.min(canvasH, frame.top + frame.height));
864
+ const strokeWidthScene = this.canvasService.toSceneLength(strokeWidth);
865
+ const dashLengthScene = this.canvasService.toSceneLength(dashLength);
866
+ const frameLeft = Math.max(canvasLeft, Math.min(canvasLeft + canvasW, frame.left));
867
+ const frameTop = Math.max(canvasTop, Math.min(canvasTop + canvasH, frame.top));
868
+ const frameRight = Math.max(frameLeft, Math.min(canvasLeft + canvasW, frame.left + frame.width));
869
+ const frameBottom = Math.max(frameTop, Math.min(canvasTop + canvasH, frame.top + frame.height));
821
870
  const visibleFrameH = Math.max(0, frameBottom - frameTop);
822
- const topH = frameTop;
823
- const bottomH = Math.max(0, canvasH - frameBottom);
824
- const leftW = frameLeft;
825
- const rightW = Math.max(0, canvasW - frameRight);
871
+ const topH = Math.max(0, frameTop - canvasTop);
872
+ const bottomH = Math.max(0, canvasTop + canvasH - frameBottom);
873
+ const leftW = Math.max(0, frameLeft - canvasLeft);
874
+ const rightW = Math.max(0, canvasLeft + canvasW - frameRight);
875
+ const viewportRect = this.toLayoutSceneRect({
876
+ left: canvasLeft,
877
+ top: canvasTop,
878
+ width: canvasW,
879
+ height: canvasH,
880
+ });
881
+ const visibleFrameBandRect = this.toLayoutSceneRect({
882
+ left: canvasLeft,
883
+ top: frameTop,
884
+ width: canvasW,
885
+ height: visibleFrameH,
886
+ });
887
+ const frameRect = this.toLayoutSceneRect(frame);
826
888
  const maskSpecs = [
827
889
  {
828
890
  id: "white-ink.cropMask.top",
@@ -832,13 +894,17 @@ class WhiteInkTool {
832
894
  layerId: WHITE_INK_OVERLAY_LAYER_ID,
833
895
  type: "white-ink-mask",
834
896
  },
835
- props: {
836
- left: canvasW / 2,
837
- top: topH / 2,
838
- width: canvasW,
897
+ layout: {
898
+ reference: "custom",
899
+ referenceRect: viewportRect,
900
+ alignX: "start",
901
+ alignY: "start",
902
+ width: "100%",
839
903
  height: topH,
840
- originX: "center",
841
- originY: "center",
904
+ },
905
+ props: {
906
+ originX: "left",
907
+ originY: "top",
842
908
  fill: outerBackground,
843
909
  selectable: false,
844
910
  evented: false,
@@ -853,13 +919,17 @@ class WhiteInkTool {
853
919
  layerId: WHITE_INK_OVERLAY_LAYER_ID,
854
920
  type: "white-ink-mask",
855
921
  },
856
- props: {
857
- left: canvasW / 2,
858
- top: frameBottom + bottomH / 2,
859
- width: canvasW,
922
+ layout: {
923
+ reference: "custom",
924
+ referenceRect: viewportRect,
925
+ alignX: "start",
926
+ alignY: "end",
927
+ width: "100%",
860
928
  height: bottomH,
861
- originX: "center",
862
- originY: "center",
929
+ },
930
+ props: {
931
+ originX: "left",
932
+ originY: "top",
863
933
  fill: outerBackground,
864
934
  selectable: false,
865
935
  evented: false,
@@ -874,13 +944,17 @@ class WhiteInkTool {
874
944
  layerId: WHITE_INK_OVERLAY_LAYER_ID,
875
945
  type: "white-ink-mask",
876
946
  },
877
- props: {
878
- left: leftW / 2,
879
- top: frameTop + visibleFrameH / 2,
947
+ layout: {
948
+ reference: "custom",
949
+ referenceRect: visibleFrameBandRect,
950
+ alignX: "start",
951
+ alignY: "start",
880
952
  width: leftW,
881
- height: visibleFrameH,
882
- originX: "center",
883
- originY: "center",
953
+ height: "100%",
954
+ },
955
+ props: {
956
+ originX: "left",
957
+ originY: "top",
884
958
  fill: outerBackground,
885
959
  selectable: false,
886
960
  evented: false,
@@ -895,13 +969,17 @@ class WhiteInkTool {
895
969
  layerId: WHITE_INK_OVERLAY_LAYER_ID,
896
970
  type: "white-ink-mask",
897
971
  },
898
- props: {
899
- left: frameRight + rightW / 2,
900
- top: frameTop + visibleFrameH / 2,
972
+ layout: {
973
+ reference: "custom",
974
+ referenceRect: visibleFrameBandRect,
975
+ alignX: "end",
976
+ alignY: "start",
901
977
  width: rightW,
902
- height: visibleFrameH,
903
- originX: "center",
904
- originY: "center",
978
+ height: "100%",
979
+ },
980
+ props: {
981
+ originX: "left",
982
+ originY: "top",
905
983
  fill: outerBackground,
906
984
  selectable: false,
907
985
  evented: false,
@@ -919,17 +997,21 @@ class WhiteInkTool {
919
997
  layerId: WHITE_INK_OVERLAY_LAYER_ID,
920
998
  type: "white-ink-frame",
921
999
  },
1000
+ layout: {
1001
+ reference: "custom",
1002
+ referenceRect: frameRect,
1003
+ alignX: "start",
1004
+ alignY: "start",
1005
+ width: "100%",
1006
+ height: "100%",
1007
+ },
922
1008
  props: {
923
- left: frame.left + frame.width / 2,
924
- top: frame.top + frame.height / 2,
925
- width: frame.width,
926
- height: frame.height,
927
- originX: "center",
928
- originY: "center",
1009
+ originX: "left",
1010
+ originY: "top",
929
1011
  fill: innerBackground,
930
1012
  stroke: strokeColor,
931
- strokeWidth,
932
- strokeDashArray: [dashLength, dashLength],
1013
+ strokeWidth: strokeWidthScene,
1014
+ strokeDashArray: [dashLengthScene, dashLengthScene],
933
1015
  selectable: false,
934
1016
  evented: false,
935
1017
  excludeFromExport: true,
@@ -937,24 +1019,6 @@ class WhiteInkTool {
937
1019
  },
938
1020
  ];
939
1021
  }
940
- applyImageVisibilityForWhiteInk(previewActive) {
941
- if (!this.canvasService)
942
- return;
943
- const visible = !previewActive;
944
- let changed = false;
945
- this.canvasService.canvas.getObjects().forEach((obj) => {
946
- if (obj?.data?.layerId !== IMAGE_OBJECT_LAYER_ID)
947
- return;
948
- if (obj.visible === visible)
949
- return;
950
- obj.set({ visible });
951
- obj.setCoords?.();
952
- changed = true;
953
- });
954
- if (changed) {
955
- this.canvasService.requestRenderAll();
956
- }
957
- }
958
1022
  resolveRenderItems() {
959
1023
  if (this.isToolActive) {
960
1024
  return this.cloneItems(this.workingItems);
@@ -980,66 +1044,13 @@ class WhiteInkTool {
980
1044
  whiteScaleAdjustY: scaleAdjust.y,
981
1045
  };
982
1046
  }
983
- resolveDefaultInsertIndex(objects) {
984
- if (!this.canvasService)
985
- return 0;
986
- const backgroundLayer = this.canvasService.getLayer("background");
987
- if (!backgroundLayer)
988
- return 0;
989
- const bgIndex = objects.indexOf(backgroundLayer);
990
- if (bgIndex < 0)
991
- return 0;
992
- return bgIndex + 1;
993
- }
994
- syncZOrder() {
995
- if (!this.canvasService)
996
- return;
997
- const canvas = this.canvasService.canvas;
998
- const whiteObjects = this.canvasService.getRootLayerObjects(WHITE_INK_OBJECT_LAYER_ID);
999
- const coverObjects = this.canvasService.getRootLayerObjects(WHITE_INK_COVER_LAYER_ID);
1000
- const frameObjects = this.canvasService.getRootLayerObjects(WHITE_INK_OVERLAY_LAYER_ID);
1001
- const currentObjects = canvas.getObjects();
1002
- const imageIndexes = currentObjects
1003
- .map((obj, index) => obj?.data?.layerId === IMAGE_OBJECT_LAYER_ID ? index : -1)
1004
- .filter((index) => index >= 0);
1005
- let whiteInsertIndex = imageIndexes.length
1006
- ? Math.min(...imageIndexes)
1007
- : this.resolveDefaultInsertIndex(currentObjects);
1008
- whiteObjects.forEach((obj) => {
1009
- canvas.moveObjectTo(obj, whiteInsertIndex);
1010
- whiteInsertIndex += 1;
1011
- });
1012
- const afterWhiteObjects = canvas.getObjects();
1013
- const afterImageIndexes = afterWhiteObjects
1014
- .map((obj, index) => obj?.data?.layerId === IMAGE_OBJECT_LAYER_ID ? index : -1)
1015
- .filter((index) => index >= 0);
1016
- let coverInsertIndex = afterImageIndexes.length
1017
- ? Math.max(...afterImageIndexes) + 1
1018
- : whiteInsertIndex;
1019
- coverObjects.forEach((obj) => {
1020
- canvas.moveObjectTo(obj, coverInsertIndex);
1021
- coverInsertIndex += 1;
1022
- });
1023
- frameObjects.forEach((obj) => canvas.bringObjectToFront(obj));
1024
- canvas
1025
- .getObjects()
1026
- .filter((obj) => obj?.data?.layerId === IMAGE_OVERLAY_LAYER_ID)
1027
- .forEach((obj) => canvas.bringObjectToFront(obj));
1028
- const dielineOverlay = this.canvasService.getLayer("dieline-overlay");
1029
- if (dielineOverlay) {
1030
- canvas.bringObjectToFront(dielineOverlay);
1031
- }
1032
- const rulerOverlay = this.canvasService.getLayer("ruler-overlay");
1033
- if (rulerOverlay) {
1034
- canvas.bringObjectToFront(rulerOverlay);
1035
- }
1036
- }
1037
1047
  clearRenderedWhiteInks() {
1038
1048
  if (!this.canvasService)
1039
1049
  return;
1040
- void this.canvasService.applyObjectSpecsToRootLayer(WHITE_INK_OBJECT_LAYER_ID, []);
1041
- void this.canvasService.applyObjectSpecsToRootLayer(WHITE_INK_COVER_LAYER_ID, []);
1042
- void this.canvasService.applyObjectSpecsToRootLayer(WHITE_INK_OVERLAY_LAYER_ID, []);
1050
+ this.whiteSpecs = [];
1051
+ this.coverSpecs = [];
1052
+ this.overlaySpecs = [];
1053
+ this.canvasService.requestRenderFromProducers();
1043
1054
  }
1044
1055
  purgeSourceCaches(item) {
1045
1056
  const sourceUrl = this.resolveSourceUrl(item);
@@ -1067,7 +1078,6 @@ class WhiteInkTool {
1067
1078
  this.syncToolActiveFromWorkbench();
1068
1079
  const seq = ++this.renderSeq;
1069
1080
  const previewActive = this.isPreviewActive();
1070
- this.applyImageVisibilityForWhiteInk(previewActive);
1071
1081
  const frame = this.getFrameRect();
1072
1082
  const frameSpecs = this.buildFrameSpecs(frame);
1073
1083
  let whiteSpecs = [];
@@ -1094,16 +1104,16 @@ class WhiteInkTool {
1094
1104
  }
1095
1105
  }
1096
1106
  }
1097
- await this.canvasService.applyObjectSpecsToRootLayer(WHITE_INK_OBJECT_LAYER_ID, whiteSpecs);
1107
+ this.whiteSpecs = whiteSpecs;
1098
1108
  if (seq !== this.renderSeq)
1099
1109
  return;
1100
- await this.canvasService.applyObjectSpecsToRootLayer(WHITE_INK_COVER_LAYER_ID, coverSpecs);
1110
+ this.coverSpecs = coverSpecs;
1101
1111
  if (seq !== this.renderSeq)
1102
1112
  return;
1103
- await this.canvasService.applyObjectSpecsToRootLayer(WHITE_INK_OVERLAY_LAYER_ID, frameSpecs);
1113
+ this.overlaySpecs = frameSpecs;
1114
+ await this.canvasService.flushRenderFromProducers();
1104
1115
  if (seq !== this.renderSeq)
1105
1116
  return;
1106
- this.syncZOrder();
1107
1117
  this.canvasService.requestRenderAll();
1108
1118
  }
1109
1119
  getMaskCacheKey(sourceUrl, tint) {