@pooder/kit 5.4.0 → 6.0.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.
Files changed (69) hide show
  1. package/.test-dist/src/coordinate.js +74 -0
  2. package/.test-dist/src/extensions/background.js +547 -0
  3. package/.test-dist/src/extensions/bridgeSelection.js +20 -0
  4. package/.test-dist/src/extensions/constraints.js +237 -0
  5. package/.test-dist/src/extensions/dieline.js +935 -0
  6. package/.test-dist/src/extensions/dielineShape.js +66 -0
  7. package/.test-dist/src/extensions/edgeScale.js +12 -0
  8. package/.test-dist/src/extensions/feature.js +910 -0
  9. package/.test-dist/src/extensions/featureComplete.js +32 -0
  10. package/.test-dist/src/extensions/film.js +226 -0
  11. package/.test-dist/src/extensions/geometry.js +609 -0
  12. package/.test-dist/src/extensions/image.js +1788 -0
  13. package/.test-dist/src/extensions/index.js +28 -0
  14. package/.test-dist/src/extensions/maskOps.js +334 -0
  15. package/.test-dist/src/extensions/mirror.js +104 -0
  16. package/.test-dist/src/extensions/ruler.js +442 -0
  17. package/.test-dist/src/extensions/sceneLayout.js +96 -0
  18. package/.test-dist/src/extensions/sceneLayoutModel.js +202 -0
  19. package/.test-dist/src/extensions/sceneVisibility.js +55 -0
  20. package/.test-dist/src/extensions/size.js +331 -0
  21. package/.test-dist/src/extensions/tracer.js +709 -0
  22. package/.test-dist/src/extensions/white-ink.js +1200 -0
  23. package/.test-dist/src/extensions/wrappedOffsets.js +33 -0
  24. package/.test-dist/src/index.js +18 -0
  25. package/.test-dist/src/services/CanvasService.js +1032 -0
  26. package/.test-dist/src/services/ViewportSystem.js +76 -0
  27. package/.test-dist/src/services/index.js +25 -0
  28. package/.test-dist/src/services/renderSpec.js +2 -0
  29. package/.test-dist/src/services/visibility.js +57 -0
  30. package/.test-dist/src/units.js +30 -0
  31. package/.test-dist/tests/run.js +150 -0
  32. package/CHANGELOG.md +12 -0
  33. package/dist/index.d.mts +164 -62
  34. package/dist/index.d.ts +164 -62
  35. package/dist/index.js +2433 -1719
  36. package/dist/index.mjs +2442 -1723
  37. package/package.json +1 -1
  38. package/src/coordinate.ts +106 -106
  39. package/src/extensions/background.ts +716 -323
  40. package/src/extensions/bridgeSelection.ts +17 -17
  41. package/src/extensions/constraints.ts +322 -322
  42. package/src/extensions/dieline.ts +1173 -1149
  43. package/src/extensions/dielineShape.ts +109 -109
  44. package/src/extensions/edgeScale.ts +19 -19
  45. package/src/extensions/feature.ts +1140 -1137
  46. package/src/extensions/featureComplete.ts +46 -46
  47. package/src/extensions/film.ts +270 -266
  48. package/src/extensions/geometry.ts +851 -885
  49. package/src/extensions/image.ts +2240 -2054
  50. package/src/extensions/index.ts +10 -11
  51. package/src/extensions/maskOps.ts +283 -283
  52. package/src/extensions/mirror.ts +128 -128
  53. package/src/extensions/ruler.ts +664 -654
  54. package/src/extensions/sceneLayout.ts +140 -140
  55. package/src/extensions/sceneLayoutModel.ts +364 -364
  56. package/src/extensions/size.ts +389 -389
  57. package/src/extensions/tracer.ts +1019 -1019
  58. package/src/extensions/white-ink.ts +1508 -1575
  59. package/src/extensions/wrappedOffsets.ts +33 -33
  60. package/src/index.ts +2 -2
  61. package/src/services/CanvasService.ts +1317 -832
  62. package/src/services/ViewportSystem.ts +95 -95
  63. package/src/services/index.ts +4 -3
  64. package/src/services/renderSpec.ts +85 -53
  65. package/src/services/visibility.ts +83 -0
  66. package/src/units.ts +27 -27
  67. package/tests/run.ts +258 -118
  68. package/tsconfig.test.json +15 -15
  69. package/src/extensions/sceneVisibility.ts +0 -64
package/dist/index.d.mts CHANGED
@@ -1,33 +1,58 @@
1
- import { Extension, ExtensionContext, ContributionPointIds, ConfigurationContribution, CommandContribution, Service, EventBus, ServiceContext } from '@pooder/core';
2
- import { Canvas, Group, FabricObject } from 'fabric';
1
+ import { Extension, ExtensionContext, ContributionPointIds, ConfigurationContribution, CommandContribution, Service, ServiceContext, EventBus } from '@pooder/core';
2
+ import { Canvas, FabricObject } from 'fabric';
3
3
 
4
+ type BackgroundLayerKind = "color" | "image";
5
+ type BackgroundFitMode = "cover" | "contain" | "stretch";
6
+ interface BackgroundLayer {
7
+ id: string;
8
+ kind: BackgroundLayerKind;
9
+ anchor: string;
10
+ fit: BackgroundFitMode;
11
+ opacity: number;
12
+ order: number;
13
+ enabled: boolean;
14
+ exportable: boolean;
15
+ color?: string;
16
+ src?: string;
17
+ }
18
+ interface BackgroundConfig {
19
+ version: number;
20
+ layers: BackgroundLayer[];
21
+ }
4
22
  declare class BackgroundTool implements Extension {
5
23
  id: string;
6
24
  metadata: {
7
25
  name: string;
8
26
  };
9
- private color;
10
- private url;
27
+ private config;
11
28
  private canvasService?;
29
+ private configService?;
12
30
  private specs;
13
31
  private renderProducerDisposable?;
32
+ private configChangeDisposable?;
14
33
  private renderSeq;
15
- private renderImageUrl;
34
+ private latestSceneLayout;
16
35
  private sourceSizeBySrc;
17
36
  private pendingSizeBySrc;
18
37
  private onCanvasResized;
19
- constructor(options?: Partial<{
20
- color: string;
21
- url: string;
22
- }>);
38
+ private onSceneLayoutChanged;
39
+ constructor(options?: Partial<BackgroundConfig>);
23
40
  activate(context: ExtensionContext): void;
24
41
  deactivate(context: ExtensionContext): void;
25
42
  contribute(): {
26
43
  [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
27
44
  [ContributionPointIds.COMMANDS]: CommandContribution[];
28
45
  };
29
- private getViewportSize;
46
+ private commitConfig;
47
+ private getViewportRect;
48
+ private resolveSceneLayout;
49
+ private resolveFocusRect;
50
+ private resolveAnchorRect;
51
+ private resolveImagePlacement;
52
+ private buildColorLayerSpec;
53
+ private buildImageLayerSpec;
30
54
  private buildBackgroundSpecs;
55
+ private collectActiveImageUrls;
31
56
  private ensureImageSize;
32
57
  private loadImageSize;
33
58
  private updateBackground;
@@ -66,8 +91,10 @@ declare class ImageTool implements Extension {
66
91
  private cropShapeHatchPattern?;
67
92
  private cropShapeHatchPatternColor?;
68
93
  private cropShapeHatchPatternKey?;
94
+ private imageSpecs;
69
95
  private overlaySpecs;
70
96
  private renderProducerDisposable?;
97
+ private imageControlsByCapabilityKey;
71
98
  activate(context: ExtensionContext): void;
72
99
  deactivate(context: ExtensionContext): void;
73
100
  private onToolActivated;
@@ -77,6 +104,11 @@ declare class ImageTool implements Extension {
77
104
  private onSceneGeometryChanged;
78
105
  private syncToolActiveFromWorkbench;
79
106
  private isImageEditingVisible;
107
+ private getEnabledImageControlCapabilities;
108
+ private getImageControls;
109
+ private getImageControlVisualConfig;
110
+ private applyImageObjectInteractionState;
111
+ private refreshImageObjectInteractionState;
80
112
  private isDebugEnabled;
81
113
  private debug;
82
114
  contribute(): {
@@ -122,6 +154,7 @@ declare class ImageTool implements Extension {
122
154
  private purgeSourceSizeCacheForItem;
123
155
  private rememberSourceSize;
124
156
  private getSourceSize;
157
+ private ensureSourceSize;
125
158
  private getCoverScale;
126
159
  private getFrameVisualConfig;
127
160
  private toSceneGeometryLike;
@@ -131,12 +164,9 @@ declare class ImageTool implements Extension {
131
164
  private buildCropShapeOverlaySpecs;
132
165
  private resolveRenderImageState;
133
166
  private computeCanvasProps;
134
- private toScreenObjectProps;
135
167
  private toSceneObjectScale;
136
168
  private getCurrentSrc;
137
- private applyImageControlVisibility;
138
- private upsertImageObject;
139
- private syncImageZOrder;
169
+ private buildImageSpecs;
140
170
  private buildOverlaySpecs;
141
171
  private updateImages;
142
172
  private updateImagesAsync;
@@ -245,7 +275,6 @@ interface DielineState {
245
275
  mainLine: LineStyle;
246
276
  offsetLine: LineStyle;
247
277
  insideColor: string;
248
- outsideColor: string;
249
278
  showBleedLines: boolean;
250
279
  features: DielineFeature[];
251
280
  pathData?: string;
@@ -261,6 +290,7 @@ declare class DielineTool implements Extension {
261
290
  private canvasService?;
262
291
  private context?;
263
292
  private specs;
293
+ private effects;
264
294
  private renderSeq;
265
295
  private renderProducerDisposable?;
266
296
  private onCanvasResized;
@@ -282,10 +312,10 @@ declare class DielineTool implements Extension {
282
312
  };
283
313
  private createHatchPattern;
284
314
  private getConfigService;
315
+ private hasImageItems;
285
316
  private syncSizeState;
286
- private bringFeatureMarkersToFront;
287
- private ensureLayerStacking;
288
317
  private buildDielineSpecs;
318
+ private buildImageClipEffects;
289
319
  updateDieline(_emitEvent?: boolean): void;
290
320
  private updateDielineAsync;
291
321
  getGeometry(): DielineGeometry | null;
@@ -372,7 +402,6 @@ declare class FeatureTool implements Extension {
372
402
  private syncGroupFromCanvas;
373
403
  private redraw;
374
404
  private redrawAsync;
375
- private syncOverlayOrder;
376
405
  private buildFeatureSpecs;
377
406
  private appendMarkerSpecs;
378
407
  private buildMarkerData;
@@ -587,11 +616,8 @@ declare class WhiteInkTool implements Extension {
587
616
  private computeCoverOpacity;
588
617
  private buildCloneImageSpec;
589
618
  private buildFrameSpecs;
590
- private applyImageVisibilityForWhiteInk;
591
619
  private resolveRenderItems;
592
620
  private resolveRenderSources;
593
- private resolveDefaultInsertIndex;
594
- private syncZOrder;
595
621
  private clearRenderedWhiteInks;
596
622
  private purgeSourceCaches;
597
623
  private updateWhiteInks;
@@ -677,17 +703,56 @@ interface RenderObjectSpec {
677
703
  space?: RenderCoordinateSpace;
678
704
  layout?: RenderObjectLayoutSpec;
679
705
  }
680
- interface RenderLayerSpec {
706
+ type LayerObjectCountComparator = ">" | ">=" | "==" | "<" | "<=";
707
+ type VisibilityExpr = {
708
+ op: "const";
709
+ value: boolean;
710
+ } | {
711
+ op: "activeToolIn";
712
+ ids: string[];
713
+ } | {
714
+ op: "sessionActive";
715
+ toolId: string;
716
+ } | {
717
+ op: "anySessionActive";
718
+ } | {
719
+ op: "layerExists";
720
+ layerId: string;
721
+ } | {
722
+ op: "layerObjectCount";
723
+ layerId: string;
724
+ cmp: LayerObjectCountComparator;
725
+ value: number;
726
+ } | {
727
+ op: "not";
728
+ expr: VisibilityExpr;
729
+ } | {
730
+ op: "all";
731
+ exprs: VisibilityExpr[];
732
+ } | {
733
+ op: "any";
734
+ exprs: VisibilityExpr[];
735
+ };
736
+ interface RenderClipPathEffectSpec {
737
+ type: "clipPath";
738
+ id?: string;
739
+ visibility?: VisibilityExpr;
740
+ source: RenderObjectSpec;
741
+ targetPassIds: string[];
742
+ }
743
+ type RenderEffectSpec = RenderClipPathEffectSpec;
744
+ interface RenderPassSpec {
681
745
  id: string;
746
+ stack?: number;
747
+ order?: number;
748
+ replace?: boolean;
749
+ visibility?: VisibilityExpr;
750
+ effects?: RenderEffectSpec[];
682
751
  objects: RenderObjectSpec[];
683
- props?: RenderProps;
684
752
  }
685
753
 
686
754
  interface RenderProducerResult {
687
- layerSpecs?: Record<string, RenderObjectSpec[]>;
688
- rootLayerSpecs?: Record<string, RenderObjectSpec[]>;
689
- replaceLayerIds?: string[];
690
- replaceRootLayerIds?: string[];
755
+ passes?: RenderPassSpec[];
691
756
  }
692
757
  type RenderProducer = () => RenderProducerResult | undefined | Promise<RenderProducerResult | undefined>;
693
758
  interface RegisterRenderProducerOptions {
@@ -702,15 +767,34 @@ interface RectLike {
702
767
  declare class CanvasService implements Service {
703
768
  canvas: Canvas;
704
769
  viewport: ViewportSystem;
770
+ private context?;
705
771
  private eventBus?;
772
+ private workbenchService?;
773
+ private toolSessionService?;
706
774
  private renderProducers;
707
775
  private producerOrder;
708
776
  private producerFlushRequested;
709
777
  private producerLoopPending;
710
778
  private producerLoopPromise;
711
- private managedProducerLayerIds;
712
- private managedProducerRootLayerIds;
779
+ private producerApplyInProgress;
780
+ private visibilityRefreshScheduled;
781
+ private managedProducerPassIds;
782
+ private managedPassMetas;
783
+ private managedPassEffects;
784
+ private canvasForwardersBound;
785
+ private readonly forwardSelectionCreated;
786
+ private readonly forwardSelectionUpdated;
787
+ private readonly forwardSelectionCleared;
788
+ private readonly forwardObjectModified;
789
+ private readonly forwardObjectAdded;
790
+ private readonly forwardObjectRemoved;
791
+ private readonly onToolActivated;
792
+ private readonly onToolSessionChanged;
793
+ private readonly onCanvasObjectChanged;
713
794
  constructor(el: HTMLCanvasElement | string | Canvas, options?: any);
795
+ init(context: ServiceContext): void;
796
+ private attachContextEvents;
797
+ private detachContextEvents;
714
798
  setEventBus(eventBus: EventBus): void;
715
799
  private setupEvents;
716
800
  dispose(): void;
@@ -723,21 +807,25 @@ declare class CanvasService implements Service {
723
807
  private scheduleProducerLoop;
724
808
  private runProducerLoop;
725
809
  private sortedRenderProducerEntries;
726
- private appendLayerSpecMap;
810
+ private normalizePassSpecValue;
811
+ private normalizeClipPathEffectSpec;
812
+ private mergePassSpec;
813
+ private comparePassMeta;
814
+ private getPassObjectOrder;
815
+ private getPassCanvasObjects;
816
+ getPassObjects(passId: string): FabricObject[];
817
+ getRootLayerObjects(layerId: string): FabricObject[];
818
+ private isManagedPassObject;
819
+ private syncManagedPassStacking;
820
+ private getPassRuntimeState;
821
+ private isSessionActive;
822
+ private hasAnyActiveSession;
823
+ private buildVisibilityEvalContext;
824
+ private applyManagedPassVisibility;
825
+ private scheduleManagedPassVisibilityRefresh;
727
826
  private collectAndApplyProducerSpecs;
728
- /**
729
- * Get a layer (Group) by its ID.
730
- * We assume layers are Groups directly on the canvas with a data.id property.
731
- */
732
- getLayer(id: string): Group | undefined;
733
- /**
734
- * Create a layer (Group) with the given ID if it doesn't exist.
735
- */
736
- createLayer(id: string, options?: any): Group;
737
- /**
738
- * Find an object by ID, optionally within a specific layer.
739
- */
740
- getObject(id: string, layerId?: string): FabricObject | undefined;
827
+ private applyManagedPassEffects;
828
+ getObject(id: string, passId?: string): FabricObject | undefined;
741
829
  requestRenderAll(): void;
742
830
  resize(width: number, height: number): void;
743
831
  getSceneScale(): number;
@@ -799,23 +887,48 @@ declare class CanvasService implements Service {
799
887
  private normalizeOriginY;
800
888
  private originFactor;
801
889
  private resolveLayoutProps;
802
- setLayerVisibility(layerId: string, visible: boolean): void;
890
+ setPassVisibility(passId: string, visible: boolean): boolean;
891
+ setLayerVisibility(layerId: string, visible: boolean): boolean;
892
+ bringPassToFront(passId: string): void;
803
893
  bringLayerToFront(layerId: string): void;
804
- applyLayerSpec(spec: RenderLayerSpec): Promise<void>;
805
- applyObjectSpecsToLayer(layerId: string, objects: RenderObjectSpec[], options?: {
894
+ applyPassSpec(spec: RenderPassSpec, options?: {
806
895
  render?: boolean;
807
896
  }): Promise<void>;
808
- getRootLayerObjects(layerId: string): FabricObject[];
809
- applyObjectSpecsToRootLayer(layerId: string, specs: RenderObjectSpec[], options?: {
897
+ applyObjectSpecsToRootLayer(passId: string, specs: RenderObjectSpec[], options?: {
898
+ render?: boolean;
899
+ }): Promise<void>;
900
+ private normalizeObjectSpecs;
901
+ private cloneFabricObject;
902
+ private createClipPathTemplate;
903
+ private isClipPathEffectManaged;
904
+ private clearClipPathEffectFromObject;
905
+ private applyClipPathEffectToObject;
906
+ applyObjectSpecsToPass(passId: string, specs: RenderObjectSpec[], options?: {
810
907
  render?: boolean;
908
+ replace?: boolean;
811
909
  }): Promise<void>;
812
- private applyObjectSpecsToContainer;
813
910
  private patchFabricObject;
911
+ private readPathDataFromSpec;
912
+ private hashText;
913
+ private getSpecRenderSourceKey;
914
+ private shouldRecreateObject;
814
915
  private resolveFabricProps;
815
- private moveObjectInContainer;
916
+ private moveObjectInCanvas;
816
917
  private createFabricObject;
817
918
  }
818
919
 
920
+ interface VisibilityLayerState {
921
+ exists: boolean;
922
+ objectCount: number;
923
+ }
924
+ interface VisibilityEvalContext {
925
+ activeToolId?: string | null;
926
+ isSessionActive?: (toolId: string) => boolean;
927
+ hasAnyActiveSession?: () => boolean;
928
+ layers: Map<string, VisibilityLayerState>;
929
+ }
930
+ declare function evaluateVisibilityExpr(expr: VisibilityExpr | undefined, context: VisibilityEvalContext): boolean;
931
+
819
932
  type CutMode = "trim" | "outset" | "inset";
820
933
  interface SceneRect {
821
934
  left: number;
@@ -872,15 +985,4 @@ declare class SceneLayoutService implements Service {
872
985
  getGeometry(forceRefresh?: boolean): SceneGeometrySnapshot | null;
873
986
  }
874
987
 
875
- declare class SceneVisibilityService implements Service {
876
- private context?;
877
- private activeToolId;
878
- private canvasService?;
879
- init(context: ServiceContext): void;
880
- dispose(context: ServiceContext): void;
881
- private onToolActivated;
882
- private onObjectAdded;
883
- private apply;
884
- }
885
-
886
- export { BackgroundTool, CanvasService, type DielineGeometry, type DielineState, DielineTool, FeatureTool, FilmTool, type ImageItem, ImageTool, type LineStyle, MirrorTool, type RenderCoordinateSpace, type RenderLayerSpec, type RenderLayoutAlign, type RenderLayoutInsets, type RenderLayoutLength, type RenderLayoutRect, type RenderLayoutReference, type RenderObjectLayoutSpec, type RenderObjectSpec, type RenderObjectType, type RenderProps, RulerTool, SceneLayoutService, SceneVisibilityService, SizeTool, ViewportSystem, type WhiteInkItem, WhiteInkTool };
988
+ export { type BackgroundConfig, type BackgroundFitMode, type BackgroundLayer, type BackgroundLayerKind, BackgroundTool, CanvasService, type DielineGeometry, type DielineState, DielineTool, FeatureTool, FilmTool, type ImageItem, ImageTool, type LayerObjectCountComparator, type LineStyle, MirrorTool, type RenderClipPathEffectSpec, type RenderCoordinateSpace, type RenderEffectSpec, type RenderLayoutAlign, type RenderLayoutInsets, type RenderLayoutLength, type RenderLayoutRect, type RenderLayoutReference, type RenderObjectLayoutSpec, type RenderObjectSpec, type RenderObjectType, type RenderPassSpec, type RenderProps, RulerTool, SceneLayoutService, SizeTool, ViewportSystem, type VisibilityEvalContext, type VisibilityExpr, type VisibilityLayerState, type WhiteInkItem, WhiteInkTool, evaluateVisibilityExpr };