@pooder/kit 6.0.0 → 6.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 (99) hide show
  1. package/.test-dist/src/extensions/background/BackgroundTool.js +524 -0
  2. package/.test-dist/src/extensions/background/index.js +17 -0
  3. package/.test-dist/src/extensions/background.js +1 -1
  4. package/.test-dist/src/extensions/dieline/DielineTool.js +748 -0
  5. package/.test-dist/src/extensions/dieline/commands.js +127 -0
  6. package/.test-dist/src/extensions/dieline/config.js +107 -0
  7. package/.test-dist/src/extensions/dieline/index.js +21 -0
  8. package/.test-dist/src/extensions/dieline/model.js +2 -0
  9. package/.test-dist/src/extensions/dieline/renderer.js +2 -0
  10. package/.test-dist/src/extensions/dieline.js +4 -0
  11. package/.test-dist/src/extensions/feature/FeatureTool.js +914 -0
  12. package/.test-dist/src/extensions/feature/index.js +17 -0
  13. package/.test-dist/src/extensions/film/FilmTool.js +207 -0
  14. package/.test-dist/src/extensions/film/index.js +17 -0
  15. package/.test-dist/src/extensions/image/ImageTool.js +1499 -0
  16. package/.test-dist/src/extensions/image/commands.js +162 -0
  17. package/.test-dist/src/extensions/image/config.js +129 -0
  18. package/.test-dist/src/extensions/image/index.js +21 -0
  19. package/.test-dist/src/extensions/image/model.js +2 -0
  20. package/.test-dist/src/extensions/image/renderer.js +5 -0
  21. package/.test-dist/src/extensions/image.js +182 -7
  22. package/.test-dist/src/extensions/mirror/MirrorTool.js +104 -0
  23. package/.test-dist/src/extensions/mirror/index.js +17 -0
  24. package/.test-dist/src/extensions/ruler/RulerTool.js +442 -0
  25. package/.test-dist/src/extensions/ruler/index.js +17 -0
  26. package/.test-dist/src/extensions/sceneLayout.js +2 -93
  27. package/.test-dist/src/extensions/sceneLayoutModel.js +15 -200
  28. package/.test-dist/src/extensions/size/SizeTool.js +332 -0
  29. package/.test-dist/src/extensions/size/index.js +17 -0
  30. package/.test-dist/src/extensions/white-ink/WhiteInkTool.js +1003 -0
  31. package/.test-dist/src/extensions/white-ink/commands.js +148 -0
  32. package/.test-dist/src/extensions/white-ink/config.js +31 -0
  33. package/.test-dist/src/extensions/white-ink/index.js +21 -0
  34. package/.test-dist/src/extensions/white-ink/model.js +2 -0
  35. package/.test-dist/src/extensions/white-ink/renderer.js +5 -0
  36. package/.test-dist/src/services/CanvasService.js +34 -13
  37. package/.test-dist/src/services/SceneLayoutService.js +96 -0
  38. package/.test-dist/src/services/index.js +1 -0
  39. package/.test-dist/src/services/visibility.js +3 -0
  40. package/.test-dist/src/shared/constants/layers.js +25 -0
  41. package/.test-dist/src/shared/imaging/sourceSizeCache.js +82 -0
  42. package/.test-dist/src/shared/index.js +22 -0
  43. package/.test-dist/src/shared/runtime/sessionState.js +74 -0
  44. package/.test-dist/src/shared/runtime/subscriptions.js +30 -0
  45. package/.test-dist/src/shared/scene/frame.js +34 -0
  46. package/.test-dist/src/shared/scene/sceneLayoutModel.js +202 -0
  47. package/.test-dist/tests/run.js +118 -0
  48. package/CHANGELOG.md +12 -0
  49. package/dist/index.d.mts +403 -366
  50. package/dist/index.d.ts +403 -366
  51. package/dist/index.js +5172 -4752
  52. package/dist/index.mjs +1410 -2027
  53. package/dist/tracer-PO7CRBYY.mjs +1016 -0
  54. package/package.json +1 -1
  55. package/src/extensions/{background.ts → background/BackgroundTool.ts} +33 -50
  56. package/src/extensions/background/index.ts +1 -0
  57. package/src/extensions/{dieline.ts → dieline/DielineTool.ts} +18 -218
  58. package/src/extensions/dieline/commands.ts +109 -0
  59. package/src/extensions/dieline/config.ts +106 -0
  60. package/src/extensions/dieline/index.ts +5 -0
  61. package/src/extensions/dieline/model.ts +1 -0
  62. package/src/extensions/dieline/renderer.ts +1 -0
  63. package/src/extensions/{feature.ts → feature/FeatureTool.ts} +27 -21
  64. package/src/extensions/feature/index.ts +1 -0
  65. package/src/extensions/{film.ts → film/FilmTool.ts} +36 -48
  66. package/src/extensions/film/index.ts +1 -0
  67. package/src/extensions/{image.ts → image/ImageTool.ts} +289 -335
  68. package/src/extensions/image/commands.ts +176 -0
  69. package/src/extensions/image/config.ts +128 -0
  70. package/src/extensions/image/index.ts +5 -0
  71. package/src/extensions/image/model.ts +1 -0
  72. package/src/extensions/image/renderer.ts +1 -0
  73. package/src/extensions/{mirror.ts → mirror/MirrorTool.ts} +1 -1
  74. package/src/extensions/mirror/index.ts +1 -0
  75. package/src/extensions/{ruler.ts → ruler/RulerTool.ts} +4 -5
  76. package/src/extensions/ruler/index.ts +1 -0
  77. package/src/extensions/sceneLayout.ts +1 -140
  78. package/src/extensions/sceneLayoutModel.ts +1 -364
  79. package/src/extensions/{size.ts → size/SizeTool.ts} +7 -6
  80. package/src/extensions/size/index.ts +1 -0
  81. package/src/extensions/{white-ink.ts → white-ink/WhiteInkTool.ts} +130 -317
  82. package/src/extensions/white-ink/commands.ts +157 -0
  83. package/src/extensions/white-ink/config.ts +30 -0
  84. package/src/extensions/white-ink/index.ts +5 -0
  85. package/src/extensions/white-ink/model.ts +1 -0
  86. package/src/extensions/white-ink/renderer.ts +1 -0
  87. package/src/services/CanvasService.ts +43 -12
  88. package/src/services/SceneLayoutService.ts +139 -0
  89. package/src/services/index.ts +1 -0
  90. package/src/services/renderSpec.ts +2 -0
  91. package/src/services/visibility.ts +5 -0
  92. package/src/shared/constants/layers.ts +23 -0
  93. package/src/shared/imaging/sourceSizeCache.ts +103 -0
  94. package/src/shared/index.ts +6 -0
  95. package/src/shared/runtime/sessionState.ts +105 -0
  96. package/src/shared/runtime/subscriptions.ts +45 -0
  97. package/src/shared/scene/frame.ts +46 -0
  98. package/src/shared/scene/sceneLayoutModel.ts +367 -0
  99. package/tests/run.ts +151 -0
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWhiteInkCommands = createWhiteInkCommands;
4
+ const WHITE_INK_PREVIEW_IMAGE_VISIBLE_KEY = "whiteInk.previewImageVisible";
5
+ const WHITE_INK_DEFAULT_OPACITY = 0.85;
6
+ function createWhiteInkCommands(tool) {
7
+ return [
8
+ {
9
+ command: "addWhiteInk",
10
+ id: "addWhiteInk",
11
+ title: "Add White Ink",
12
+ handler: async (url, options) => {
13
+ return await tool.addWhiteInkEntry(url, options);
14
+ },
15
+ },
16
+ {
17
+ command: "upsertWhiteInk",
18
+ id: "upsertWhiteInk",
19
+ title: "Upsert White Ink",
20
+ handler: async (url, options = {}) => {
21
+ return await tool.upsertWhiteInkEntry(url, options);
22
+ },
23
+ },
24
+ {
25
+ command: "getWhiteInks",
26
+ id: "getWhiteInks",
27
+ title: "Get White Inks",
28
+ handler: () => tool.cloneItems(tool.items),
29
+ },
30
+ {
31
+ command: "getWhiteInkSettings",
32
+ id: "getWhiteInkSettings",
33
+ title: "Get White Ink Settings",
34
+ handler: () => {
35
+ const first = tool.getEffectiveWhiteInkItem(tool.items);
36
+ const primarySource = tool.getPrimaryImageSource();
37
+ const sourceUrl = tool.resolveSourceUrl(first) || primarySource;
38
+ return {
39
+ id: first?.id || null,
40
+ url: sourceUrl,
41
+ sourceUrl,
42
+ opacity: WHITE_INK_DEFAULT_OPACITY,
43
+ printWithWhiteInk: tool.printWithWhiteInk,
44
+ previewImageVisible: tool.previewImageVisible,
45
+ };
46
+ },
47
+ },
48
+ {
49
+ command: "setWhiteInkPrintEnabled",
50
+ id: "setWhiteInkPrintEnabled",
51
+ title: "Set White Ink Preview Enabled",
52
+ handler: (enabled) => {
53
+ tool.printWithWhiteInk = !!enabled;
54
+ const configService = tool.context?.services.get("ConfigurationService");
55
+ configService?.update("whiteInk.printWithWhiteInk", tool.printWithWhiteInk);
56
+ tool.updateWhiteInks();
57
+ return { ok: true };
58
+ },
59
+ },
60
+ {
61
+ command: "setWhiteInkPreviewImageVisible",
62
+ id: "setWhiteInkPreviewImageVisible",
63
+ title: "Set White Ink Cover Visible",
64
+ handler: (visible) => {
65
+ tool.previewImageVisible = !!visible;
66
+ const configService = tool.context?.services.get("ConfigurationService");
67
+ configService?.update(WHITE_INK_PREVIEW_IMAGE_VISIBLE_KEY, tool.previewImageVisible);
68
+ tool.updateWhiteInks();
69
+ return { ok: true };
70
+ },
71
+ },
72
+ {
73
+ command: "getWorkingWhiteInks",
74
+ id: "getWorkingWhiteInks",
75
+ title: "Get Working White Inks",
76
+ handler: () => tool.cloneItems(tool.workingItems),
77
+ },
78
+ {
79
+ command: "setWorkingWhiteInk",
80
+ id: "setWorkingWhiteInk",
81
+ title: "Set Working White Ink",
82
+ handler: (id, updates) => {
83
+ tool.updateWhiteInkInWorking(id, updates);
84
+ },
85
+ },
86
+ {
87
+ command: "updateWhiteInk",
88
+ id: "updateWhiteInk",
89
+ title: "Update White Ink",
90
+ handler: async (id, updates, options = {}) => {
91
+ await tool.updateWhiteInkItem(id, updates, options);
92
+ },
93
+ },
94
+ {
95
+ command: "removeWhiteInk",
96
+ id: "removeWhiteInk",
97
+ title: "Remove White Ink",
98
+ handler: (id) => {
99
+ tool.removeWhiteInk(id);
100
+ },
101
+ },
102
+ {
103
+ command: "clearWhiteInks",
104
+ id: "clearWhiteInks",
105
+ title: "Clear White Inks",
106
+ handler: () => {
107
+ tool.clearWhiteInks();
108
+ },
109
+ },
110
+ {
111
+ command: "resetWorkingWhiteInks",
112
+ id: "resetWorkingWhiteInks",
113
+ title: "Reset Working White Inks",
114
+ handler: () => {
115
+ tool.workingItems = tool.cloneItems(tool.items);
116
+ tool.hasWorkingChanges = false;
117
+ tool.updateWhiteInks();
118
+ },
119
+ },
120
+ {
121
+ command: "completeWhiteInks",
122
+ id: "completeWhiteInks",
123
+ title: "Complete White Inks",
124
+ handler: async () => {
125
+ return await tool.completeWhiteInks();
126
+ },
127
+ },
128
+ {
129
+ command: "setWhiteInkImage",
130
+ id: "setWhiteInkImage",
131
+ title: "Set White Ink Image",
132
+ handler: async (url) => {
133
+ if (!url) {
134
+ tool.clearWhiteInks();
135
+ return { ok: true };
136
+ }
137
+ const targetId = tool.resolveReplaceTargetId(null);
138
+ const upsertResult = await tool.upsertWhiteInkEntry(url, {
139
+ id: targetId || undefined,
140
+ mode: targetId ? "replace" : "add",
141
+ createIfMissing: true,
142
+ addOptions: {},
143
+ });
144
+ return { ok: true, id: upsertResult.id };
145
+ },
146
+ },
147
+ ];
148
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWhiteInkConfigurations = createWhiteInkConfigurations;
4
+ function createWhiteInkConfigurations() {
5
+ return [
6
+ {
7
+ id: "whiteInk.items",
8
+ type: "array",
9
+ label: "White Ink Images",
10
+ default: [],
11
+ },
12
+ {
13
+ id: "whiteInk.printWithWhiteInk",
14
+ type: "boolean",
15
+ label: "Preview White Ink",
16
+ default: true,
17
+ },
18
+ {
19
+ id: "whiteInk.previewImageVisible",
20
+ type: "boolean",
21
+ label: "Show Cover During White Ink Preview",
22
+ default: true,
23
+ },
24
+ {
25
+ id: "whiteInk.debug",
26
+ type: "boolean",
27
+ label: "White Ink Debug Log",
28
+ default: false,
29
+ },
30
+ ];
31
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./WhiteInkTool"), exports);
18
+ __exportStar(require("./commands"), exports);
19
+ __exportStar(require("./config"), exports);
20
+ __exportStar(require("./model"), exports);
21
+ __exportStar(require("./renderer"), exports);
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeWhiteInkCoverScale = void 0;
4
+ var sourceSizeCache_1 = require("../../shared/imaging/sourceSizeCache");
5
+ Object.defineProperty(exports, "computeWhiteInkCoverScale", { enumerable: true, get: function () { return sourceSizeCache_1.getCoverScale; } });
@@ -15,6 +15,7 @@ class CanvasService {
15
15
  this.visibilityRefreshScheduled = false;
16
16
  this.managedProducerPassIds = new Set();
17
17
  this.managedPassMetas = new Map();
18
+ this.managedPassEffects = [];
18
19
  this.canvasForwardersBound = false;
19
20
  this.forwardSelectionCreated = (e) => {
20
21
  this.eventBus?.emit("selection:created", e);
@@ -36,9 +37,11 @@ class CanvasService {
36
37
  };
37
38
  this.onToolActivated = () => {
38
39
  this.applyManagedPassVisibility();
40
+ void this.applyManagedPassEffects(undefined, { render: true });
39
41
  };
40
42
  this.onToolSessionChanged = () => {
41
43
  this.applyManagedPassVisibility();
44
+ void this.applyManagedPassEffects(undefined, { render: true });
42
45
  };
43
46
  this.onCanvasObjectChanged = () => {
44
47
  if (this.producerApplyInProgress)
@@ -106,6 +109,7 @@ class CanvasService {
106
109
  this.renderProducers.clear();
107
110
  this.managedProducerPassIds.clear();
108
111
  this.managedPassMetas.clear();
112
+ this.managedPassEffects = [];
109
113
  this.context = undefined;
110
114
  this.workbenchService = undefined;
111
115
  this.toolSessionService = undefined;
@@ -226,6 +230,7 @@ class CanvasService {
226
230
  return {
227
231
  type: "clipPath",
228
232
  key,
233
+ visibility: effect.visibility,
229
234
  source: {
230
235
  ...source,
231
236
  id: sourceId,
@@ -337,23 +342,30 @@ class CanvasService {
337
342
  });
338
343
  return state;
339
344
  }
345
+ isSessionActive(toolId) {
346
+ if (!this.toolSessionService)
347
+ return false;
348
+ return this.toolSessionService.getState(toolId).status === "active";
349
+ }
350
+ hasAnyActiveSession() {
351
+ return this.toolSessionService?.hasAnyActiveSession() ?? false;
352
+ }
353
+ buildVisibilityEvalContext(layers) {
354
+ return {
355
+ activeToolId: this.workbenchService?.activeToolId ?? null,
356
+ isSessionActive: (toolId) => this.isSessionActive(toolId),
357
+ hasAnyActiveSession: () => this.hasAnyActiveSession(),
358
+ layers,
359
+ };
360
+ }
340
361
  applyManagedPassVisibility(options = {}) {
341
362
  if (!this.managedPassMetas.size)
342
363
  return false;
343
364
  const layers = this.getPassRuntimeState();
344
- const activeToolId = this.workbenchService?.activeToolId ?? null;
345
- const isSessionActive = (toolId) => {
346
- if (!this.toolSessionService)
347
- return false;
348
- return this.toolSessionService.getState(toolId).status === "active";
349
- };
365
+ const context = this.buildVisibilityEvalContext(layers);
350
366
  let changed = false;
351
367
  this.managedPassMetas.forEach((meta) => {
352
- const visible = (0, visibility_1.evaluateVisibilityExpr)(meta.visibility, {
353
- activeToolId,
354
- isSessionActive,
355
- layers,
356
- });
368
+ const visible = (0, visibility_1.evaluateVisibilityExpr)(meta.visibility, context);
357
369
  changed = this.setPassVisibility(meta.id, visible) || changed;
358
370
  });
359
371
  if (changed && options.render !== false) {
@@ -419,8 +431,9 @@ class CanvasService {
419
431
  }
420
432
  this.managedProducerPassIds = nextPassIds;
421
433
  this.managedPassMetas = nextManagedPassMetas;
434
+ this.managedPassEffects = nextEffects;
422
435
  this.syncManagedPassStacking(Array.from(nextManagedPassMetas.values()));
423
- await this.applyManagedPassEffects(nextEffects);
436
+ await this.applyManagedPassEffects(nextEffects, { render: false });
424
437
  this.applyManagedPassVisibility({ render: false });
425
438
  }
426
439
  finally {
@@ -428,11 +441,16 @@ class CanvasService {
428
441
  }
429
442
  this.requestRenderAll();
430
443
  }
431
- async applyManagedPassEffects(effects) {
444
+ async applyManagedPassEffects(effects = this.managedPassEffects, options = {}) {
432
445
  const effectTargetMap = new Map();
446
+ const layers = this.getPassRuntimeState();
447
+ const visibilityContext = this.buildVisibilityEvalContext(layers);
433
448
  for (const effect of effects) {
434
449
  if (effect.type !== "clipPath")
435
450
  continue;
451
+ if (!(0, visibility_1.evaluateVisibilityExpr)(effect.visibility, visibilityContext)) {
452
+ continue;
453
+ }
436
454
  effect.targetPassIds.forEach((targetPassId) => {
437
455
  this.getPassCanvasObjects(targetPassId).forEach((obj) => {
438
456
  effectTargetMap.set(obj, effect);
@@ -458,6 +476,9 @@ class CanvasService {
458
476
  }
459
477
  await this.applyClipPathEffectToObject(obj, template, targetEffect.key);
460
478
  }
479
+ if (options.render !== false) {
480
+ this.requestRenderAll();
481
+ }
461
482
  }
462
483
  getObject(id, passId) {
463
484
  const normalizedId = String(id || "").trim();
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SceneLayoutService = void 0;
4
+ const core_1 = require("@pooder/core");
5
+ const sceneLayoutModel_1 = require("../shared/scene/sceneLayoutModel");
6
+ const subscriptions_1 = require("../shared/runtime/subscriptions");
7
+ const CONFIG_WATCH_PREFIXES = ["size.", "dieline."];
8
+ const CANVAS_SERVICE_ID = "CanvasService";
9
+ const GET_SCENE_LAYOUT_COMMAND = "getSceneLayout";
10
+ const GET_SCENE_GEOMETRY_COMMAND = "getSceneGeometry";
11
+ class SceneLayoutService {
12
+ constructor() {
13
+ this.lastLayout = null;
14
+ this.lastGeometry = null;
15
+ this.subscriptions = new subscriptions_1.SubscriptionBag();
16
+ this.commandDisposables = [];
17
+ this.onCanvasResized = () => {
18
+ this.refresh();
19
+ };
20
+ this.onConfigChanged = (e) => {
21
+ if (CONFIG_WATCH_PREFIXES.some((prefix) => e.key.startsWith(prefix))) {
22
+ this.refresh();
23
+ }
24
+ };
25
+ }
26
+ init(context) {
27
+ if (this.context) {
28
+ this.dispose(this.context);
29
+ }
30
+ const canvasService = context.get(CANVAS_SERVICE_ID);
31
+ const configService = context.get(core_1.CONFIGURATION_SERVICE);
32
+ const commandService = context.get(core_1.COMMAND_SERVICE);
33
+ if (!canvasService || !configService || !commandService) {
34
+ throw new Error("[SceneLayoutService] CanvasService, ConfigurationService and CommandService are required.");
35
+ }
36
+ this.context = context;
37
+ this.canvasService = canvasService;
38
+ this.configService = configService;
39
+ this.commandDisposables.push(commandService.registerCommand(GET_SCENE_LAYOUT_COMMAND, () => this.getLayout()), commandService.registerCommand(GET_SCENE_GEOMETRY_COMMAND, () => this.getGeometry()));
40
+ this.subscriptions.disposeAll();
41
+ this.subscriptions.onConfigChange(configService, this.onConfigChanged);
42
+ this.subscriptions.on(context.eventBus, "canvas:resized", this.onCanvasResized);
43
+ this.refresh();
44
+ }
45
+ dispose(context) {
46
+ this.subscriptions.disposeAll();
47
+ this.commandDisposables.forEach((item) => item.dispose());
48
+ this.commandDisposables = [];
49
+ this.context = undefined;
50
+ this.canvasService = undefined;
51
+ this.configService = undefined;
52
+ this.lastLayout = null;
53
+ this.lastGeometry = null;
54
+ }
55
+ refresh() {
56
+ const layout = this.getLayout(true);
57
+ if (!layout) {
58
+ this.lastGeometry = null;
59
+ return;
60
+ }
61
+ this.context?.eventBus.emit("scene:layout:change", layout);
62
+ const geometry = this.getGeometry(true);
63
+ if (geometry) {
64
+ this.context?.eventBus.emit("scene:geometry:change", geometry);
65
+ }
66
+ }
67
+ getLayout(forceRefresh = false) {
68
+ if (!this.canvasService || !this.configService)
69
+ return null;
70
+ if (!forceRefresh && this.lastLayout)
71
+ return this.lastLayout;
72
+ const state = (0, sceneLayoutModel_1.readSizeState)(this.configService);
73
+ const layout = (0, sceneLayoutModel_1.computeSceneLayout)(this.canvasService, state);
74
+ if (!layout) {
75
+ this.lastLayout = null;
76
+ return null;
77
+ }
78
+ this.lastLayout = layout;
79
+ return layout;
80
+ }
81
+ getGeometry(forceRefresh = false) {
82
+ if (!this.configService)
83
+ return null;
84
+ const layout = this.getLayout(forceRefresh);
85
+ if (!layout) {
86
+ this.lastGeometry = null;
87
+ return null;
88
+ }
89
+ if (!forceRefresh && this.lastGeometry)
90
+ return this.lastGeometry;
91
+ const geometry = (0, sceneLayoutModel_1.buildSceneGeometry)(this.configService, layout);
92
+ this.lastGeometry = geometry;
93
+ return geometry;
94
+ }
95
+ }
96
+ exports.SceneLayoutService = SceneLayoutService;
@@ -20,6 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.CanvasService = void 0;
21
21
  var CanvasService_1 = require("./CanvasService");
22
22
  Object.defineProperty(exports, "CanvasService", { enumerable: true, get: function () { return __importDefault(CanvasService_1).default; } });
23
+ __exportStar(require("./SceneLayoutService"), exports);
23
24
  __exportStar(require("./renderSpec"), exports);
24
25
  __exportStar(require("./visibility"), exports);
25
26
  __exportStar(require("./ViewportSystem"), exports);
@@ -31,6 +31,9 @@ function evaluateVisibilityExpr(expr, context) {
31
31
  return false;
32
32
  return context.isSessionActive ? context.isSessionActive(toolId) : false;
33
33
  }
34
+ if (expr.op === "anySessionActive") {
35
+ return context.hasAnyActiveSession ? context.hasAnyActiveSession() : false;
36
+ }
34
37
  if (expr.op === "layerExists") {
35
38
  return layerState(context, expr.layerId).exists === true;
36
39
  }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LAYER_IDS = exports.FILM_LAYER_ID = exports.RULER_LAYER_ID = exports.FEATURE_OVERLAY_LAYER_ID = exports.DIELINE_LAYER_ID = exports.WHITE_INK_OVERLAY_LAYER_ID = exports.WHITE_INK_COVER_LAYER_ID = exports.WHITE_INK_OBJECT_LAYER_ID = exports.IMAGE_OVERLAY_LAYER_ID = exports.IMAGE_OBJECT_LAYER_ID = exports.BACKGROUND_LAYER_ID = void 0;
4
+ exports.BACKGROUND_LAYER_ID = "background";
5
+ exports.IMAGE_OBJECT_LAYER_ID = "image.user";
6
+ exports.IMAGE_OVERLAY_LAYER_ID = "image-overlay";
7
+ exports.WHITE_INK_OBJECT_LAYER_ID = "white-ink.user";
8
+ exports.WHITE_INK_COVER_LAYER_ID = "white-ink.cover";
9
+ exports.WHITE_INK_OVERLAY_LAYER_ID = "white-ink.overlay";
10
+ exports.DIELINE_LAYER_ID = "dieline-overlay";
11
+ exports.FEATURE_OVERLAY_LAYER_ID = "feature-overlay";
12
+ exports.RULER_LAYER_ID = "ruler-overlay";
13
+ exports.FILM_LAYER_ID = "overlay";
14
+ exports.LAYER_IDS = {
15
+ background: exports.BACKGROUND_LAYER_ID,
16
+ imageObject: exports.IMAGE_OBJECT_LAYER_ID,
17
+ imageOverlay: exports.IMAGE_OVERLAY_LAYER_ID,
18
+ whiteInkObject: exports.WHITE_INK_OBJECT_LAYER_ID,
19
+ whiteInkCover: exports.WHITE_INK_COVER_LAYER_ID,
20
+ whiteInkOverlay: exports.WHITE_INK_OVERLAY_LAYER_ID,
21
+ dieline: exports.DIELINE_LAYER_ID,
22
+ featureOverlay: exports.FEATURE_OVERLAY_LAYER_ID,
23
+ rulerOverlay: exports.RULER_LAYER_ID,
24
+ filmOverlay: exports.FILM_LAYER_ID,
25
+ };
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeSourceSize = normalizeSourceSize;
4
+ exports.getCoverScale = getCoverScale;
5
+ exports.createSourceSizeCache = createSourceSizeCache;
6
+ function normalizeSourceSize(size) {
7
+ const width = Number(size.width || 0);
8
+ const height = Number(size.height || 0);
9
+ if (!Number.isFinite(width) || !Number.isFinite(height))
10
+ return null;
11
+ if (width <= 0 || height <= 0)
12
+ return null;
13
+ return { width, height };
14
+ }
15
+ function getCoverScale(frame, source) {
16
+ const frameWidth = Math.max(1, Number(frame.width || 0));
17
+ const frameHeight = Math.max(1, Number(frame.height || 0));
18
+ const sourceWidth = Math.max(1, Number(source.width || 0));
19
+ const sourceHeight = Math.max(1, Number(source.height || 0));
20
+ return Math.max(frameWidth / sourceWidth, frameHeight / sourceHeight);
21
+ }
22
+ function createSourceSizeCache(loadSize) {
23
+ const sizesBySrc = new Map();
24
+ const pendingBySrc = new Map();
25
+ const rememberSourceSize = (src, size) => {
26
+ const normalized = normalizeSourceSize(size);
27
+ if (!src || !normalized)
28
+ return null;
29
+ sizesBySrc.set(src, normalized);
30
+ return normalized;
31
+ };
32
+ const getSourceSize = (src) => {
33
+ if (!src)
34
+ return null;
35
+ const cached = sizesBySrc.get(src);
36
+ if (!cached)
37
+ return null;
38
+ return { width: cached.width, height: cached.height };
39
+ };
40
+ const ensureImageSize = async (src) => {
41
+ if (!src)
42
+ return null;
43
+ const cached = sizesBySrc.get(src);
44
+ if (cached)
45
+ return { width: cached.width, height: cached.height };
46
+ const pending = pendingBySrc.get(src);
47
+ if (pending) {
48
+ return pending;
49
+ }
50
+ const task = loadSize(src);
51
+ pendingBySrc.set(src, task);
52
+ try {
53
+ const size = await task;
54
+ if (size) {
55
+ rememberSourceSize(src, size);
56
+ }
57
+ return size;
58
+ }
59
+ finally {
60
+ if (pendingBySrc.get(src) === task) {
61
+ pendingBySrc.delete(src);
62
+ }
63
+ }
64
+ };
65
+ const deleteSourceSize = (src) => {
66
+ if (!src)
67
+ return;
68
+ sizesBySrc.delete(src);
69
+ pendingBySrc.delete(src);
70
+ };
71
+ const clear = () => {
72
+ sizesBySrc.clear();
73
+ pendingBySrc.clear();
74
+ };
75
+ return {
76
+ ensureImageSize,
77
+ rememberSourceSize,
78
+ getSourceSize,
79
+ deleteSourceSize,
80
+ clear,
81
+ };
82
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./constants/layers"), exports);
18
+ __exportStar(require("./imaging/sourceSizeCache"), exports);
19
+ __exportStar(require("./runtime/sessionState"), exports);
20
+ __exportStar(require("./runtime/subscriptions"), exports);
21
+ __exportStar(require("./scene/frame"), exports);
22
+ __exportStar(require("./scene/sceneLayoutModel"), exports);
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkingSessionState = void 0;
4
+ exports.cloneWithJson = cloneWithJson;
5
+ exports.applyCommittedSnapshot = applyCommittedSnapshot;
6
+ exports.runDeferredConfigUpdate = runDeferredConfigUpdate;
7
+ function cloneWithJson(value) {
8
+ return JSON.parse(JSON.stringify(value));
9
+ }
10
+ function applyCommittedSnapshot(session, nextCommitted, options) {
11
+ const clone = options.clone;
12
+ session.committed = clone(nextCommitted);
13
+ const shouldPreserveDirtyWorking = options.toolActive &&
14
+ options.preserveDirtyWorking !== false &&
15
+ session.hasWorkingChanges;
16
+ if (!shouldPreserveDirtyWorking) {
17
+ session.working = clone(session.committed);
18
+ session.hasWorkingChanges = false;
19
+ }
20
+ }
21
+ function runDeferredConfigUpdate(state, action, cooldownMs = 0) {
22
+ state.isUpdatingConfig = true;
23
+ action();
24
+ if (cooldownMs <= 0) {
25
+ state.isUpdatingConfig = false;
26
+ return;
27
+ }
28
+ setTimeout(() => {
29
+ state.isUpdatingConfig = false;
30
+ }, cooldownMs);
31
+ }
32
+ class WorkingSessionState {
33
+ constructor(initial, clone) {
34
+ this.hasWorkingChanges = false;
35
+ this.isUpdatingConfig = false;
36
+ this.clone = clone;
37
+ this.committed = this.clone(initial);
38
+ this.working = this.clone(initial);
39
+ }
40
+ setCommitted(next, options = {}) {
41
+ this.committed = this.clone(next);
42
+ const shouldPreserveDirtyWorking = options.toolActive === true &&
43
+ options.preserveDirtyWorking !== false &&
44
+ this.hasWorkingChanges;
45
+ if (!shouldPreserveDirtyWorking) {
46
+ this.working = this.clone(this.committed);
47
+ this.hasWorkingChanges = false;
48
+ }
49
+ }
50
+ setWorking(next, options = {}) {
51
+ this.working = this.clone(next);
52
+ if (options.markDirty !== false) {
53
+ this.hasWorkingChanges = true;
54
+ }
55
+ }
56
+ resetWorkingFromCommitted() {
57
+ this.working = this.clone(this.committed);
58
+ this.hasWorkingChanges = false;
59
+ }
60
+ commitWorkingToCommitted() {
61
+ this.committed = this.clone(this.working);
62
+ this.hasWorkingChanges = false;
63
+ }
64
+ runConfigUpdate(action) {
65
+ this.isUpdatingConfig = true;
66
+ try {
67
+ action();
68
+ }
69
+ finally {
70
+ this.isUpdatingConfig = false;
71
+ }
72
+ }
73
+ }
74
+ exports.WorkingSessionState = WorkingSessionState;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubscriptionBag = void 0;
4
+ class SubscriptionBag {
5
+ constructor() {
6
+ this.disposables = [];
7
+ }
8
+ add(disposable) {
9
+ if (disposable) {
10
+ this.disposables.push(disposable);
11
+ }
12
+ return disposable;
13
+ }
14
+ on(eventBus, event, handler) {
15
+ eventBus.on(event, handler);
16
+ this.disposables.push({
17
+ dispose: () => eventBus.off(event, handler),
18
+ });
19
+ }
20
+ onConfigChange(configService, handler) {
21
+ this.add(configService.onAnyChange(handler));
22
+ }
23
+ disposeAll() {
24
+ while (this.disposables.length > 0) {
25
+ const disposable = this.disposables.pop();
26
+ disposable?.dispose();
27
+ }
28
+ }
29
+ }
30
+ exports.SubscriptionBag = SubscriptionBag;