@canvus/core 0.1.4 → 0.1.6

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.
@@ -5,6 +5,14 @@ import type { DropTarget } from "./drop-zone.js";
5
5
  import type { Guide, OverlayStyle, SpacingAdjusterType } from "./renderer.js";
6
6
  import { OverlayRenderer } from "./renderer.js";
7
7
  import type { InteractionHandler, KeyboardHandler, InteractionDetail } from "./handlers/types.js";
8
+ export interface ViewportConfig {
9
+ /** Width of the viewport (frame/card). */
10
+ width: number;
11
+ /** Height of the viewport (frame/card). */
12
+ height: number;
13
+ /** Whether to scale viewport units. @default true if viewport is defined */
14
+ scaleViewportUnits?: boolean;
15
+ }
8
16
  /** Configuration options for the workspace. */
9
17
  export interface WorkspaceConfig {
10
18
  /** Partial overlay style overrides. */
@@ -15,6 +23,8 @@ export interface WorkspaceConfig {
15
23
  minResizeSize?: number;
16
24
  /** Enable snap-to-align guides during drag/resize. @default true */
17
25
  enableSnapGuides?: boolean;
26
+ /** Optional viewport configuration for scaling relative CSS units (vh, vw). */
27
+ viewport?: ViewportConfig;
18
28
  }
19
29
  /** Callback signatures for workspace lifecycle events. */
20
30
  export interface WorkspaceCallbacks {
@@ -109,6 +119,7 @@ export declare class Workspace {
109
119
  readonly snapThreshold: number;
110
120
  readonly minResizeSize: number;
111
121
  readonly enableSnapGuides: boolean;
122
+ viewportConfig?: ViewportConfig;
112
123
  private viewport;
113
124
  private readonly tree;
114
125
  private readonly selectedIds;
@@ -235,6 +246,10 @@ export declare class Workspace {
235
246
  setViewport(vp: ViewportMatrix): void;
236
247
  /** Resets viewport to 1:1 scale, zero offset. */
237
248
  resetViewport(): void;
249
+ /** Updates the viewport dimensions and re-evaluates viewport units. */
250
+ updateViewportSize(width: number, height: number): void;
251
+ /** Updates the viewport configuration and re-evaluates viewport units. */
252
+ updateViewportConfig(config: Partial<ViewportConfig>): void;
238
253
  /** Sets whether the workspace is in Preview Mode (disables editing overlays and events). */
239
254
  setPreviewMode(enabled: boolean): void;
240
255
  /** Returns whether the workspace is currently in Preview Mode. */
@@ -314,6 +329,9 @@ export declare class Workspace {
314
329
  * to read the current semantic HTML string.
315
330
  */
316
331
  extractHTML(id: string): string | null;
332
+ private handleUpdateStyleOp;
333
+ private handleUpdateClassesOp;
334
+ private handleUpdateTextOp;
317
335
  /**
318
336
  * Programmatically replays an Operation (mutation payload) onto the workspace.
319
337
  * This is the core API used for Undo/Redo replay and collaboration sync.
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
package/dist/workspace.js CHANGED
@@ -72,6 +72,7 @@ export class Workspace {
72
72
  snapThreshold;
73
73
  minResizeSize;
74
74
  enableSnapGuides;
75
+ viewportConfig;
75
76
  // ── Workspace State ─────────────────────────────
76
77
  viewport;
77
78
  tree = new NodeTree();
@@ -164,6 +165,12 @@ export class Workspace {
164
165
  this.minResizeSize = config.minResizeSize ?? 40;
165
166
  this.enableSnapGuides = config.enableSnapGuides ?? true;
166
167
  this.viewport = createDefaultViewport();
168
+ if (config.viewport) {
169
+ this.viewportConfig = {
170
+ ...config.viewport,
171
+ scaleViewportUnits: config.viewport.scaleViewportUnits ?? true,
172
+ };
173
+ }
167
174
  // ── Ensure container is positioned ────────────
168
175
  const pos = getComputedStyle(container).position;
169
176
  if (pos === "static") {
@@ -182,10 +189,26 @@ export class Workspace {
182
189
  const node = this.tree.get(id);
183
190
  if (node) {
184
191
  node.currentRect = rect;
192
+ // Dynamically update viewport variables if a root frame node is resized.
193
+ if (node.parentId === null &&
194
+ this.viewportConfig &&
195
+ this.viewportConfig.scaleViewportUnits !== false) {
196
+ // Safety check: prevent feedback loop if the root node itself uses viewport units.
197
+ const usesViewportUnits = /v(h|w)\b/i.test(node.rawMarkup);
198
+ if (!usesViewportUnits) {
199
+ this.viewportConfig.width = rect.width;
200
+ this.viewportConfig.height = rect.height;
201
+ this.mount.updateViewportSize(rect.width, rect.height);
202
+ }
203
+ }
185
204
  this.callbacks.onNodeRectChange?.(id, rect);
186
205
  this.render();
187
206
  }
188
- });
207
+ }, this.viewportConfig?.scaleViewportUnits ?? false);
208
+ // Set initial size of the viewport variables in the mount if scaleViewportUnits is enabled.
209
+ if (this.viewportConfig && this.viewportConfig.scaleViewportUnits !== false) {
210
+ this.mount.updateViewportSize(this.viewportConfig.width, this.viewportConfig.height);
211
+ }
189
212
  this.mount.applyViewportTransform(this.viewport);
190
213
  // Intercept and prevent click and submit events inside Shadow DOM when in Edit Mode
191
214
  const shadowRoot = this.mount.getShadowRoot();
@@ -493,6 +516,39 @@ export class Workspace {
493
516
  resetViewport() {
494
517
  this.setViewport(createDefaultViewport());
495
518
  }
519
+ /** Updates the viewport dimensions and re-evaluates viewport units. */
520
+ updateViewportSize(width, height) {
521
+ if (this.viewportConfig) {
522
+ this.viewportConfig.width = width;
523
+ this.viewportConfig.height = height;
524
+ if (this.viewportConfig.scaleViewportUnits !== false) {
525
+ this.mount.updateViewportSize(width, height);
526
+ }
527
+ }
528
+ }
529
+ /** Updates the viewport configuration and re-evaluates viewport units. */
530
+ updateViewportConfig(config) {
531
+ if (!this.viewportConfig) {
532
+ this.viewportConfig = {
533
+ width: config.width ?? 0,
534
+ height: config.height ?? 0,
535
+ scaleViewportUnits: config.scaleViewportUnits ?? true,
536
+ };
537
+ }
538
+ else {
539
+ if (config.width !== undefined)
540
+ this.viewportConfig.width = config.width;
541
+ if (config.height !== undefined)
542
+ this.viewportConfig.height = config.height;
543
+ if (config.scaleViewportUnits !== undefined) {
544
+ this.viewportConfig.scaleViewportUnits = config.scaleViewportUnits;
545
+ }
546
+ }
547
+ this.mount.scaleViewportUnits = this.viewportConfig.scaleViewportUnits ?? false;
548
+ if (this.viewportConfig.scaleViewportUnits) {
549
+ this.mount.updateViewportSize(this.viewportConfig.width, this.viewportConfig.height);
550
+ }
551
+ }
496
552
  // ── Public API: Preview Mode ────────────────────
497
553
  /** Sets whether the workspace is in Preview Mode (disables editing overlays and events). */
498
554
  setPreviewMode(enabled) {
@@ -703,6 +759,77 @@ export class Workspace {
703
759
  extractHTML(id) {
704
760
  return this.mount.extractHTML(id);
705
761
  }
762
+ handleUpdateStyleOp(nodeId, styles, node) {
763
+ const contentRoot = this.mount.getContentRoot(nodeId);
764
+ if (!contentRoot)
765
+ return;
766
+ const stylesToApply = {};
767
+ for (const [prop, val] of Object.entries(styles)) {
768
+ const value = val;
769
+ // Check if it's wrapper geometric positioning styles for root elements
770
+ if (node.parentId === null && (prop === "left" || prop === "top" || prop === "width" || prop === "height")) {
771
+ if (prop === "left" || prop === "top") {
772
+ const currentX = node.currentRect ? node.currentRect.x : 0;
773
+ const currentY = node.currentRect ? node.currentRect.y : 0;
774
+ const parsedVal = value ? parseFloat(value) : 0;
775
+ const newX = prop === "left" ? parsedVal : currentX;
776
+ const newY = prop === "top" ? parsedVal : currentY;
777
+ this.mount.setNodePosition(nodeId, newX, newY);
778
+ }
779
+ else {
780
+ const parsedVal = value ? (value === "auto" ? "auto" : parseFloat(value)) : "auto";
781
+ const newW = prop === "width" ? parsedVal : null;
782
+ const newH = prop === "height" ? parsedVal : null;
783
+ this.mount.setNodeSize(nodeId, newW, newH);
784
+ }
785
+ }
786
+ else {
787
+ // Apply property directly to content root stylesheet
788
+ stylesToApply[prop] = value;
789
+ }
790
+ }
791
+ if (Object.keys(stylesToApply).length > 0) {
792
+ this.mount.setNodeStyles(nodeId, stylesToApply);
793
+ }
794
+ this.remeasureSubtree(nodeId);
795
+ if (node.parentId) {
796
+ this.remeasureSubtree(node.parentId);
797
+ }
798
+ }
799
+ handleUpdateClassesOp(nodeId, payload, node) {
800
+ const contentRoot = this.mount.getContentRoot(nodeId);
801
+ if (!contentRoot)
802
+ return;
803
+ const { add, remove } = payload;
804
+ if (Array.isArray(remove)) {
805
+ for (const cls of remove) {
806
+ contentRoot.classList.remove(cls);
807
+ }
808
+ }
809
+ if (Array.isArray(add)) {
810
+ for (const cls of add) {
811
+ contentRoot.classList.add(cls);
812
+ }
813
+ }
814
+ this.remeasureSubtree(nodeId);
815
+ if (node.parentId) {
816
+ this.remeasureSubtree(node.parentId);
817
+ }
818
+ }
819
+ handleUpdateTextOp(nodeId, payload, node) {
820
+ const contentRoot = this.mount.getContentRoot(nodeId);
821
+ if (!contentRoot)
822
+ return;
823
+ const { path, html } = payload;
824
+ const targetEl = getDOMElementByPath(contentRoot, path);
825
+ if (targetEl) {
826
+ targetEl.innerHTML = html;
827
+ }
828
+ this.remeasureSubtree(nodeId);
829
+ if (node.parentId) {
830
+ this.remeasureSubtree(node.parentId);
831
+ }
832
+ }
706
833
  /**
707
834
  * Programmatically replays an Operation (mutation payload) onto the workspace.
708
835
  * This is the core API used for Undo/Redo replay and collaboration sync.
@@ -726,95 +853,23 @@ export class Workspace {
726
853
  if (!node)
727
854
  return;
728
855
  switch (op.type) {
729
- case "reparent": {
730
- const { newParentId, index } = op.payload;
731
- this.reparentNode(op.nodeId, newParentId, index);
856
+ case "reparent":
857
+ this.reparentNode(op.nodeId, op.payload.newParentId, op.payload.index);
732
858
  break;
733
- }
734
- case "reorder": {
735
- const { index } = op.payload;
736
- this.reorderChild(op.nodeId, index);
859
+ case "reorder":
860
+ this.reorderChild(op.nodeId, op.payload.index);
737
861
  break;
738
- }
739
- case "update-style": {
740
- const styles = op.payload;
741
- const contentRoot = this.mount.getContentRoot(op.nodeId);
742
- if (!contentRoot)
743
- break;
744
- const stylesToApply = {};
745
- for (const [prop, val] of Object.entries(styles)) {
746
- const value = val;
747
- // Check if it's wrapper geometric positioning styles for root elements
748
- if (node.parentId === null && (prop === "left" || prop === "top" || prop === "width" || prop === "height")) {
749
- if (prop === "left" || prop === "top") {
750
- const currentX = node.currentRect ? node.currentRect.x : 0;
751
- const currentY = node.currentRect ? node.currentRect.y : 0;
752
- const parsedVal = value ? parseFloat(value) : 0;
753
- const newX = prop === "left" ? parsedVal : currentX;
754
- const newY = prop === "top" ? parsedVal : currentY;
755
- this.mount.setNodePosition(op.nodeId, newX, newY);
756
- }
757
- else {
758
- const parsedVal = value ? (value === "auto" ? "auto" : parseFloat(value)) : "auto";
759
- const newW = prop === "width" ? parsedVal : null;
760
- const newH = prop === "height" ? parsedVal : null;
761
- this.mount.setNodeSize(op.nodeId, newW, newH);
762
- }
763
- }
764
- else {
765
- // Apply property directly to content root stylesheet
766
- stylesToApply[prop] = value;
767
- }
768
- }
769
- if (Object.keys(stylesToApply).length > 0) {
770
- this.mount.setNodeStyles(op.nodeId, stylesToApply);
771
- }
772
- this.remeasureSubtree(op.nodeId);
773
- if (node.parentId) {
774
- this.remeasureSubtree(node.parentId);
775
- }
776
- this.render();
862
+ case "update-style":
863
+ this.handleUpdateStyleOp(op.nodeId, op.payload, node);
777
864
  break;
778
- }
779
- case "update-classes": {
780
- const { add, remove } = op.payload;
781
- const contentRoot = this.mount.getContentRoot(op.nodeId);
782
- if (!contentRoot)
783
- break;
784
- if (Array.isArray(remove)) {
785
- for (const cls of remove) {
786
- contentRoot.classList.remove(cls);
787
- }
788
- }
789
- if (Array.isArray(add)) {
790
- for (const cls of add) {
791
- contentRoot.classList.add(cls);
792
- }
793
- }
794
- this.remeasureSubtree(op.nodeId);
795
- if (node.parentId) {
796
- this.remeasureSubtree(node.parentId);
797
- }
798
- this.render();
865
+ case "update-classes":
866
+ this.handleUpdateClassesOp(op.nodeId, op.payload, node);
799
867
  break;
800
- }
801
- case "update-text": {
802
- const { path, html } = op.payload;
803
- const contentRoot = this.mount.getContentRoot(op.nodeId);
804
- if (!contentRoot)
805
- break;
806
- const targetEl = getDOMElementByPath(contentRoot, path);
807
- if (targetEl) {
808
- targetEl.innerHTML = html;
809
- }
810
- this.remeasureSubtree(op.nodeId);
811
- if (node.parentId) {
812
- this.remeasureSubtree(node.parentId);
813
- }
814
- this.render();
868
+ case "update-text":
869
+ this.handleUpdateTextOp(op.nodeId, op.payload, node);
815
870
  break;
816
- }
817
871
  }
872
+ this.render();
818
873
  }
819
874
  /** Adds a CSS class name directly to the content root of a node. */
820
875
  addClass(id, className) {