@pooder/kit 5.0.3 → 5.1.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 (34) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/index.d.mts +239 -269
  3. package/dist/index.d.ts +239 -269
  4. package/dist/index.js +6485 -5833
  5. package/dist/index.mjs +6587 -5923
  6. package/package.json +2 -2
  7. package/src/{background.ts → extensions/background.ts} +1 -1
  8. package/src/{dieline.ts → extensions/dieline.ts} +39 -17
  9. package/src/{feature.ts → extensions/feature.ts} +80 -67
  10. package/src/{film.ts → extensions/film.ts} +1 -1
  11. package/src/{geometry.ts → extensions/geometry.ts} +151 -105
  12. package/src/{image.ts → extensions/image.ts} +190 -192
  13. package/src/extensions/index.ts +11 -0
  14. package/src/{maskOps.ts → extensions/maskOps.ts} +28 -10
  15. package/src/{mirror.ts → extensions/mirror.ts} +1 -1
  16. package/src/{ruler.ts → extensions/ruler.ts} +5 -3
  17. package/src/extensions/sceneLayout.ts +140 -0
  18. package/src/{sceneLayoutModel.ts → extensions/sceneLayoutModel.ts} +17 -10
  19. package/src/extensions/sceneVisibility.ts +71 -0
  20. package/src/{size.ts → extensions/size.ts} +23 -13
  21. package/src/{tracer.ts → extensions/tracer.ts} +374 -45
  22. package/src/{white-ink.ts → extensions/white-ink.ts} +620 -236
  23. package/src/index.ts +2 -14
  24. package/src/{ViewportSystem.ts → services/ViewportSystem.ts} +5 -2
  25. package/src/services/index.ts +3 -0
  26. package/src/sceneLayout.ts +0 -121
  27. package/src/sceneVisibility.ts +0 -49
  28. /package/src/{bridgeSelection.ts → extensions/bridgeSelection.ts} +0 -0
  29. /package/src/{constraints.ts → extensions/constraints.ts} +0 -0
  30. /package/src/{edgeScale.ts → extensions/edgeScale.ts} +0 -0
  31. /package/src/{featureComplete.ts → extensions/featureComplete.ts} +0 -0
  32. /package/src/{wrappedOffsets.ts → extensions/wrappedOffsets.ts} +0 -0
  33. /package/src/{CanvasService.ts → services/CanvasService.ts} +0 -0
  34. /package/src/{renderSpec.ts → services/renderSpec.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @pooder/kit
2
2
 
3
+ ## 5.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - service
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @pooder/core@2.2.0
13
+
14
+ ## 5.0.4
15
+
16
+ ### Patch Changes
17
+
18
+ - bugfix
19
+
3
20
  ## 5.0.3
4
21
 
5
22
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Extension, ExtensionContext, ContributionPointIds, ConfigurationContribution, CommandContribution, Service, EventBus, ConfigurationService } from '@pooder/core';
1
+ import { Extension, ExtensionContext, ContributionPointIds, ConfigurationContribution, CommandContribution, Service, EventBus, ServiceContext } from '@pooder/core';
2
2
  import { Canvas, Group, FabricObject } from 'fabric';
3
3
 
4
4
  declare class BackgroundTool implements Extension {
@@ -23,6 +23,137 @@ declare class BackgroundTool implements Extension {
23
23
  private updateBackground;
24
24
  }
25
25
 
26
+ interface ImageItem {
27
+ id: string;
28
+ url: string;
29
+ opacity: number;
30
+ scale?: number;
31
+ angle?: number;
32
+ left?: number;
33
+ top?: number;
34
+ sourceUrl?: string;
35
+ committedUrl?: string;
36
+ }
37
+ declare class ImageTool implements Extension {
38
+ id: string;
39
+ metadata: {
40
+ name: string;
41
+ };
42
+ private items;
43
+ private workingItems;
44
+ private hasWorkingChanges;
45
+ private loadResolvers;
46
+ private sourceSizeBySrc;
47
+ private canvasService?;
48
+ private context?;
49
+ private isUpdatingConfig;
50
+ private isToolActive;
51
+ private isImageSelectionActive;
52
+ private focusedImageId;
53
+ private renderSeq;
54
+ private dirtyTrackerDisposable?;
55
+ activate(context: ExtensionContext): void;
56
+ deactivate(context: ExtensionContext): void;
57
+ private onToolActivated;
58
+ private onSelectionChanged;
59
+ private onSelectionCleared;
60
+ private onSceneLayoutChanged;
61
+ private syncToolActiveFromWorkbench;
62
+ private isImageEditingVisible;
63
+ private isDebugEnabled;
64
+ private debug;
65
+ contribute(): {
66
+ [ContributionPointIds.TOOLS]: {
67
+ id: string;
68
+ name: string;
69
+ interaction: string;
70
+ commands: {
71
+ begin: string;
72
+ commit: string;
73
+ rollback: string;
74
+ };
75
+ session: {
76
+ autoBegin: boolean;
77
+ leavePolicy: string;
78
+ };
79
+ }[];
80
+ [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
81
+ [ContributionPointIds.COMMANDS]: CommandContribution[];
82
+ };
83
+ private normalizeItem;
84
+ private normalizeItems;
85
+ private cloneItems;
86
+ private emitWorkingChange;
87
+ private generateId;
88
+ private hasImageItem;
89
+ private setImageFocus;
90
+ private addImageEntry;
91
+ private upsertImageEntry;
92
+ private addItemToWorkingSessionIfNeeded;
93
+ private updateImage;
94
+ private getConfig;
95
+ private updateConfig;
96
+ private getFrameRect;
97
+ private resolveDefaultFitArea;
98
+ private fitImageToDefaultArea;
99
+ private getImageObjects;
100
+ private getOverlayObjects;
101
+ private getImageObject;
102
+ private clearRenderedImages;
103
+ private purgeSourceSizeCacheForItem;
104
+ private rememberSourceSize;
105
+ private getSourceSize;
106
+ private getCoverScale;
107
+ private getFrameVisualConfig;
108
+ private resolveRenderImageState;
109
+ private computeCanvasProps;
110
+ private getCurrentSrc;
111
+ private upsertImageObject;
112
+ private syncImageZOrder;
113
+ private buildOverlaySpecs;
114
+ private updateImages;
115
+ private updateImagesAsync;
116
+ private clampNormalized;
117
+ private onObjectModified;
118
+ private updateImageInWorking;
119
+ private updateImageInConfig;
120
+ private waitImageLoaded;
121
+ private refitImageToFrame;
122
+ private fitImageToArea;
123
+ private commitWorkingImagesAsCropped;
124
+ private exportCroppedImageByIds;
125
+ private exportUserCroppedImage;
126
+ }
127
+
128
+ declare class SizeTool implements Extension {
129
+ id: string;
130
+ metadata: {
131
+ name: string;
132
+ };
133
+ private context?;
134
+ private canvasService?;
135
+ activate(context: ExtensionContext): void;
136
+ deactivate(_context: ExtensionContext): void;
137
+ contribute(): {
138
+ [ContributionPointIds.TOOLS]: {
139
+ id: string;
140
+ name: string;
141
+ interaction: string;
142
+ }[];
143
+ [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
144
+ [ContributionPointIds.COMMANDS]: CommandContribution[];
145
+ };
146
+ private getConfigService;
147
+ private ensureDefaults;
148
+ private emitStateChanged;
149
+ private getStateForUI;
150
+ private updateDimensions;
151
+ private setConstraintMode;
152
+ private setUnit;
153
+ private setCut;
154
+ private getSelectedImageSize;
155
+ }
156
+
26
157
  interface Point {
27
158
  x: number;
28
159
  y: number;
@@ -138,28 +269,6 @@ declare class DielineTool implements Extension {
138
269
  }): Promise<string | null>;
139
270
  }
140
271
 
141
- declare class FilmTool implements Extension {
142
- id: string;
143
- metadata: {
144
- name: string;
145
- };
146
- private url;
147
- private opacity;
148
- private canvasService?;
149
- constructor(options?: Partial<{
150
- url: string;
151
- opacity: number;
152
- }>);
153
- activate(context: ExtensionContext): void;
154
- deactivate(context: ExtensionContext): void;
155
- contribute(): {
156
- [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
157
- [ContributionPointIds.COMMANDS]: CommandContribution[];
158
- };
159
- private initLayer;
160
- private updateFilm;
161
- }
162
-
163
272
  interface ConstraintFeature extends DielineFeature {
164
273
  constraints?: Array<{
165
274
  type: string;
@@ -233,108 +342,83 @@ declare class FeatureTool implements Extension {
233
342
  private enforceConstraints;
234
343
  }
235
344
 
236
- interface ImageItem {
345
+ declare class FilmTool implements Extension {
237
346
  id: string;
238
- url: string;
239
- opacity: number;
240
- scale?: number;
241
- angle?: number;
242
- left?: number;
243
- top?: number;
244
- sourceUrl?: string;
245
- committedUrl?: string;
347
+ metadata: {
348
+ name: string;
349
+ };
350
+ private url;
351
+ private opacity;
352
+ private canvasService?;
353
+ constructor(options?: Partial<{
354
+ url: string;
355
+ opacity: number;
356
+ }>);
357
+ activate(context: ExtensionContext): void;
358
+ deactivate(context: ExtensionContext): void;
359
+ contribute(): {
360
+ [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
361
+ [ContributionPointIds.COMMANDS]: CommandContribution[];
362
+ };
363
+ private initLayer;
364
+ private updateFilm;
246
365
  }
247
- declare class ImageTool implements Extension {
366
+
367
+ declare class MirrorTool implements Extension {
248
368
  id: string;
249
369
  metadata: {
250
370
  name: string;
251
371
  };
252
- private items;
253
- private workingItems;
254
- private hasWorkingChanges;
255
- private loadResolvers;
256
- private sourceSizeBySrc;
372
+ private enabled;
373
+ private canvasService?;
374
+ constructor(options?: Partial<{
375
+ enabled: boolean;
376
+ }>);
377
+ toJSON(): {
378
+ enabled: boolean;
379
+ };
380
+ loadFromJSON(json: any): void;
381
+ activate(context: ExtensionContext): void;
382
+ deactivate(context: ExtensionContext): void;
383
+ contribute(): {
384
+ [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
385
+ [ContributionPointIds.COMMANDS]: CommandContribution[];
386
+ };
387
+ private applyMirror;
388
+ }
389
+
390
+ declare class RulerTool implements Extension {
391
+ id: string;
392
+ metadata: {
393
+ name: string;
394
+ };
395
+ private thickness;
396
+ private gap;
397
+ private backgroundColor;
398
+ private textColor;
399
+ private lineColor;
400
+ private fontSize;
257
401
  private canvasService?;
258
402
  private context?;
259
- private isUpdatingConfig;
260
- private isToolActive;
261
- private isImageSelectionActive;
262
- private focusedImageId;
263
- private suppressSelectionClearUntil;
264
- private renderSeq;
265
- private dirtyTrackerDisposable?;
403
+ private onCanvasResized;
404
+ constructor(options?: Partial<{
405
+ thickness: number;
406
+ backgroundColor: string;
407
+ textColor: string;
408
+ lineColor: string;
409
+ fontSize: number;
410
+ }>);
266
411
  activate(context: ExtensionContext): void;
267
412
  deactivate(context: ExtensionContext): void;
268
- private onToolActivated;
269
- private onSelectionChanged;
270
- private onSelectionCleared;
271
- private onSceneLayoutChanged;
272
- private syncToolActiveFromWorkbench;
273
- private isImageEditingVisible;
274
- private isDebugEnabled;
275
- private debug;
276
413
  contribute(): {
277
- [ContributionPointIds.TOOLS]: {
278
- id: string;
279
- name: string;
280
- interaction: string;
281
- commands: {
282
- begin: string;
283
- commit: string;
284
- rollback: string;
285
- };
286
- session: {
287
- autoBegin: boolean;
288
- leavePolicy: string;
289
- };
290
- }[];
291
414
  [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
292
415
  [ContributionPointIds.COMMANDS]: CommandContribution[];
293
416
  };
294
- private normalizeItem;
295
- private normalizeItems;
296
- private cloneItems;
297
- private emitWorkingChange;
298
- private generateId;
299
- private getImageIdFromActiveObject;
300
- private resolveReplaceTargetId;
301
- private addImageEntry;
302
- private upsertImageEntry;
303
- private addItemToWorkingSessionIfNeeded;
304
- private updateImage;
305
- private getConfig;
306
- private updateConfig;
307
- private getFrameRect;
308
- private resolveDefaultFitArea;
309
- private fitImageToDefaultArea;
310
- private getImageObjects;
311
- private getOverlayObjects;
312
- private getImageObject;
313
- private clearRenderedImages;
314
- private purgeSourceSizeCacheForItem;
315
- private rememberSourceSize;
316
- private getSourceSize;
317
- private getCoverScale;
318
- private getFrameVisualConfig;
319
- private resolveRenderImageState;
320
- private computeCanvasProps;
321
- private getCurrentSrc;
322
- private upsertImageObject;
323
- private syncImageZOrder;
324
- private buildOverlaySpecs;
325
- private updateImages;
326
- private updateImagesAsync;
327
- private clampNormalized;
328
- private onObjectModified;
329
- private updateImageInWorking;
330
- private updateImageInConfig;
331
- private waitImageLoaded;
332
- private refitImageToFrame;
333
- private focusImageSelection;
334
- private fitImageToArea;
335
- private commitWorkingImagesAsCropped;
336
- private exportCroppedImageByIds;
337
- private exportImageFrameUrl;
417
+ private getLayer;
418
+ private createLayer;
419
+ private destroyLayer;
420
+ private createArrowLine;
421
+ private updateRuler;
338
422
  }
339
423
 
340
424
  interface WhiteInkItem {
@@ -385,16 +469,19 @@ declare class WhiteInkTool implements Extension {
385
469
  private onToolActivated;
386
470
  private onSceneLayoutChanged;
387
471
  private onObjectAdded;
472
+ private onObjectModified;
473
+ private onObjectRemoved;
474
+ private onImageWorkingChanged;
388
475
  private migrateLegacyConfigIfNeeded;
389
476
  private syncToolActiveFromWorkbench;
390
477
  private isPreviewActive;
391
478
  private isDebugEnabled;
392
479
  private debug;
393
480
  private resolveSourceUrl;
394
- private clampOpacity;
395
481
  private normalizeItem;
396
482
  private normalizeItems;
397
483
  private cloneItems;
484
+ private getEffectiveWhiteInkItem;
398
485
  private generateId;
399
486
  private getConfig;
400
487
  private resolveReplaceTargetId;
@@ -409,134 +496,34 @@ declare class WhiteInkTool implements Extension {
409
496
  private clearWhiteInks;
410
497
  private completeWhiteInks;
411
498
  private getFrameRect;
412
- private getWhiteInkObjects;
413
- private getWhiteInkObject;
414
- private clearRenderedWhiteInks;
415
- private purgeSourceCaches;
499
+ private getImageObjects;
500
+ private getPrimaryImageObject;
501
+ private getPrimaryImageSource;
502
+ private getCurrentSrc;
503
+ private getImageSnapshot;
504
+ private getImageElementFromObject;
416
505
  private rememberSourceSize;
417
506
  private getSourceSize;
418
- private getCoverScale;
419
- private resolveRenderState;
420
- private computeCanvasProps;
421
- private getCurrentSrc;
422
- private upsertWhiteInkObject;
507
+ private computeWhiteScaleAdjust;
508
+ private computeCoverOpacity;
509
+ private buildCloneImageSpec;
510
+ private buildFrameSpecs;
511
+ private applyImageVisibilityForWhiteInk;
512
+ private resolveRenderItems;
513
+ private resolveRenderSources;
514
+ private resolveDefaultInsertIndex;
423
515
  private syncZOrder;
424
- private applyImagePreviewVisibility;
516
+ private clearRenderedWhiteInks;
517
+ private purgeSourceCaches;
425
518
  private updateWhiteInks;
426
519
  private updateWhiteInksAsync;
520
+ private getMaskCacheKey;
427
521
  private getPreviewMaskSource;
522
+ private getElementSize;
428
523
  private createOpaqueMaskSource;
429
524
  private loadImageElement;
430
525
  }
431
526
 
432
- declare class RulerTool implements Extension {
433
- id: string;
434
- metadata: {
435
- name: string;
436
- };
437
- private thickness;
438
- private gap;
439
- private backgroundColor;
440
- private textColor;
441
- private lineColor;
442
- private fontSize;
443
- private canvasService?;
444
- private context?;
445
- private onCanvasResized;
446
- constructor(options?: Partial<{
447
- thickness: number;
448
- backgroundColor: string;
449
- textColor: string;
450
- lineColor: string;
451
- fontSize: number;
452
- }>);
453
- activate(context: ExtensionContext): void;
454
- deactivate(context: ExtensionContext): void;
455
- contribute(): {
456
- [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
457
- [ContributionPointIds.COMMANDS]: CommandContribution[];
458
- };
459
- private getLayer;
460
- private createLayer;
461
- private destroyLayer;
462
- private createArrowLine;
463
- private updateRuler;
464
- }
465
-
466
- declare class MirrorTool implements Extension {
467
- id: string;
468
- metadata: {
469
- name: string;
470
- };
471
- private enabled;
472
- private canvasService?;
473
- constructor(options?: Partial<{
474
- enabled: boolean;
475
- }>);
476
- toJSON(): {
477
- enabled: boolean;
478
- };
479
- loadFromJSON(json: any): void;
480
- activate(context: ExtensionContext): void;
481
- deactivate(context: ExtensionContext): void;
482
- contribute(): {
483
- [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
484
- [ContributionPointIds.COMMANDS]: CommandContribution[];
485
- };
486
- private applyMirror;
487
- }
488
-
489
- declare class SizeTool implements Extension {
490
- id: string;
491
- metadata: {
492
- name: string;
493
- };
494
- private context?;
495
- private canvasService?;
496
- activate(context: ExtensionContext): void;
497
- deactivate(_context: ExtensionContext): void;
498
- contribute(): {
499
- [ContributionPointIds.TOOLS]: {
500
- id: string;
501
- name: string;
502
- interaction: string;
503
- }[];
504
- [ContributionPointIds.CONFIGURATIONS]: ConfigurationContribution[];
505
- [ContributionPointIds.COMMANDS]: CommandContribution[];
506
- };
507
- private getConfigService;
508
- private ensureDefaults;
509
- private emitStateChanged;
510
- private getStateForUI;
511
- private updateDimensions;
512
- private setConstraintMode;
513
- private setUnit;
514
- private setCut;
515
- private getSelectedImageSize;
516
- }
517
-
518
- declare class SceneLayoutService implements Extension {
519
- id: string;
520
- metadata: {
521
- name: string;
522
- };
523
- private context?;
524
- private canvasService?;
525
- private configService?;
526
- private lastLayout;
527
- private lastGeometry;
528
- private onConfigChange?;
529
- activate(context: ExtensionContext): void;
530
- deactivate(context: ExtensionContext): void;
531
- contribute(): {
532
- [ContributionPointIds.COMMANDS]: CommandContribution[];
533
- };
534
- private onCanvasResized;
535
- private refresh;
536
- private getLayout;
537
- private getGeometry;
538
- }
539
-
540
527
  declare class ViewportSystem {
541
528
  private _containerSize;
542
529
  private _physicalSize;
@@ -604,21 +591,7 @@ declare class CanvasService implements Service {
604
591
  private createFabricObject;
605
592
  }
606
593
 
607
- type SizeConstraintMode = "free" | "lockAspect" | "equal";
608
594
  type CutMode = "trim" | "outset" | "inset";
609
- interface SizeState {
610
- unit: Unit;
611
- actualWidthMm: number;
612
- actualHeightMm: number;
613
- constraintMode: SizeConstraintMode;
614
- aspectRatio: number;
615
- cutMode: CutMode;
616
- cutMarginMm: number;
617
- viewPadding: number | string;
618
- minMm: number;
619
- maxMm: number;
620
- stepMm: number;
621
- }
622
595
  interface SceneRect {
623
596
  left: number;
624
597
  top: number;
@@ -654,36 +627,33 @@ interface SceneGeometrySnapshot {
654
627
  scale: number;
655
628
  pathData?: string;
656
629
  }
657
- declare function sanitizeMmValue(valueMm: number, limits: {
658
- minMm: number;
659
- maxMm: number;
660
- stepMm: number;
661
- }): number;
662
- declare function normalizeUnit(value: unknown): Unit;
663
- declare function normalizeConstraintMode(value: unknown): SizeConstraintMode;
664
- declare function normalizeCutMode(value: unknown): CutMode;
665
- declare function toMm(value: number, fromUnit: Unit): number;
666
- declare function fromMm(valueMm: number, toUnit: Unit): number;
667
- declare function resolvePaddingPx(raw: number | string, containerWidth: number, containerHeight: number): number;
668
- declare function readSizeState(configService: ConfigurationService): SizeState;
669
- declare function computeSceneLayout(canvasService: CanvasService, size: SizeState): SceneLayoutSnapshot | null;
670
- declare function buildSceneGeometry(configService: ConfigurationService, layout: SceneLayoutSnapshot): SceneGeometrySnapshot;
671
630
 
672
- declare class SceneVisibilityService implements Extension {
673
- id: string;
674
- metadata: {
675
- name: string;
676
- };
631
+ declare class SceneLayoutService implements Service {
632
+ private context?;
677
633
  private canvasService?;
634
+ private configService?;
635
+ private lastLayout;
636
+ private lastGeometry;
637
+ private onConfigChange?;
638
+ private commandDisposables;
639
+ init(context: ServiceContext): void;
640
+ dispose(context: ServiceContext): void;
641
+ private onCanvasResized;
642
+ private onConfigChanged;
643
+ private refresh;
644
+ getLayout(forceRefresh?: boolean): SceneLayoutSnapshot | null;
645
+ getGeometry(forceRefresh?: boolean): SceneGeometrySnapshot | null;
646
+ }
647
+
648
+ declare class SceneVisibilityService implements Service {
649
+ private context?;
678
650
  private activeToolId;
679
- activate(context: ExtensionContext): void;
680
- deactivate(context: ExtensionContext): void;
651
+ private canvasService?;
652
+ init(context: ServiceContext): void;
653
+ dispose(context: ServiceContext): void;
681
654
  private onToolActivated;
682
655
  private onObjectAdded;
683
656
  private apply;
684
657
  }
685
658
 
686
- declare function parseLengthToMm(input: number | string, defaultUnit: Unit): number;
687
- declare function formatMm(valueMm: number, displayUnit: Unit, fractionDigits?: number): string;
688
-
689
- export { BackgroundTool, CanvasService, type CutMode, type DielineGeometry, type DielineState, DielineTool, FeatureTool, FilmTool, type ImageItem, ImageTool, type LineStyle, MirrorTool, RulerTool, type SceneGeometrySnapshot, SceneLayoutService, type SceneLayoutSnapshot, type SceneRect, SceneVisibilityService, type SizeConstraintMode, type SizeState, SizeTool, type WhiteInkItem, WhiteInkTool, buildSceneGeometry, computeSceneLayout, formatMm, fromMm, normalizeConstraintMode, normalizeCutMode, normalizeUnit, parseLengthToMm, readSizeState, resolvePaddingPx, sanitizeMmValue, toMm };
659
+ export { BackgroundTool, CanvasService, type DielineGeometry, type DielineState, DielineTool, FeatureTool, FilmTool, type ImageItem, ImageTool, type LineStyle, MirrorTool, type RenderLayerSpec, type RenderObjectSpec, type RenderObjectType, type RenderProps, RulerTool, SceneLayoutService, SceneVisibilityService, SizeTool, ViewportSystem, type WhiteInkItem, WhiteInkTool };