@widgetic/editor 4.0.4 → 4.0.5

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.
@@ -63,6 +63,11 @@
63
63
  export let enableDrag: boolean = false;
64
64
  /** W×H number inputs in the chrome header, live-synced with resize. */
65
65
  export let showDimensionInputs: boolean = false;
66
+ /**
67
+ * concentric — always resize from center (widget-creator / Canvas).
68
+ * corner — opposite corner fixed; hold Alt for concentric (composition page).
69
+ */
70
+ export let resizeMode: 'concentric' | 'corner' = 'concentric';
66
71
  /** Initial / reset placement inside the stage. */
67
72
  export let defaultStageAlign: 'center' | 'right-half' = 'center';
68
73
  /** Observe stage size and fill it (desktop modal) */
@@ -102,7 +107,8 @@
102
107
  const PREVIEW_STROKE_ALT = '#f97316';
103
108
  let isResizing = false;
104
109
  let isDraggingPreview = false;
105
- let isSymmetricalResize = false;
110
+ /** Alt held — keeps orange stroke on composition even after pointerup. */
111
+ let isAltKeyDown = false;
106
112
  let previewShellLeft = 0;
107
113
  let previewShellTop = 0;
108
114
  let previewPositionReady = false;
@@ -116,7 +122,8 @@
116
122
  $: chromeHeaderHeight = showPreviewChrome ? PREVIEW_CHROME_HEADER_H : 0;
117
123
  $: if (resizeWidth != null) widthInputValue = String(Math.round(resizeWidth));
118
124
  $: if (resizeHeight != null) heightInputValue = String(Math.round(resizeHeight));
119
- $: previewStrokeColor = isSymmetricalResize ? PREVIEW_STROKE_ALT : PREVIEW_STROKE;
125
+ $: showSymmetricalStroke = resizeMode === 'corner' && isAltKeyDown;
126
+ $: previewStrokeColor = showSymmetricalStroke ? PREVIEW_STROKE_ALT : PREVIEW_STROKE;
120
127
 
121
128
  export function getResizeLimits(): { maxWidth: number; maxHeight: number } {
122
129
  const stageEl = resizeStageEl ?? contentContainerEl;
@@ -612,7 +619,7 @@
612
619
  event.preventDefault();
613
620
  event.stopPropagation();
614
621
  isResizing = true;
615
- isSymmetricalResize = event.altKey;
622
+ if (event.altKey) isAltKeyDown = true;
616
623
  const startX = event.clientX;
617
624
  const startY = event.clientY;
618
625
  const startLeft = previewShellLeft;
@@ -620,14 +627,15 @@
620
627
  const { maxWidth, maxHeight } = getResizeLimits();
621
628
  const startWidth = resizeWidth ?? maxWidth;
622
629
  const startHeight = resizeHeight ?? maxHeight;
630
+ const alwaysConcentric = resizeMode === 'concentric';
623
631
 
624
632
  function onPointerMove(e: PointerEvent) {
625
- const useAlt = e.altKey;
626
- isSymmetricalResize = useAlt;
633
+ if (e.altKey) isAltKeyDown = true;
634
+ const useConcentric = alwaysConcentric || isAltKeyDown || e.altKey;
627
635
  const dx = e.clientX - startX;
628
636
  const dy = e.clientY - startY;
629
637
 
630
- if (useAlt) {
638
+ if (useConcentric) {
631
639
  const deltaW = signX !== 0 ? dx * signX * 2 : 0;
632
640
  const deltaH = signY !== 0 ? dy * signY * 2 : 0;
633
641
  const nextW = clampDimension(startWidth + deltaW, MIN_WIDTH, maxWidth);
@@ -669,7 +677,7 @@
669
677
 
670
678
  function endResize() {
671
679
  isResizing = false;
672
- isSymmetricalResize = false;
680
+ // Keep orange stroke while Alt remains held (composition corner mode).
673
681
  document.removeEventListener('pointermove', onPointerMove);
674
682
  document.removeEventListener('pointerup', endResize);
675
683
  document.removeEventListener('pointercancel', endResize);
@@ -711,16 +719,25 @@
711
719
  onMount(() => {
712
720
  window.addEventListener('message', handleMessage);
713
721
  const onAltDown = (e: KeyboardEvent) => {
714
- if (e.key === 'Alt') isSymmetricalResize = true;
722
+ if (e.key === 'Alt' || e.code === 'AltLeft' || e.code === 'AltRight') {
723
+ isAltKeyDown = true;
724
+ }
715
725
  };
716
726
  const onAltUp = (e: KeyboardEvent) => {
717
- if (e.key === 'Alt' && !isResizing) isSymmetricalResize = false;
727
+ if (e.key === 'Alt' || e.code === 'AltLeft' || e.code === 'AltRight') {
728
+ isAltKeyDown = false;
729
+ }
730
+ };
731
+ const onWindowBlur = () => {
732
+ isAltKeyDown = false;
718
733
  };
719
734
  window.addEventListener('keydown', onAltDown);
720
735
  window.addEventListener('keyup', onAltUp);
736
+ window.addEventListener('blur', onWindowBlur);
721
737
  return () => {
722
738
  window.removeEventListener('keydown', onAltDown);
723
739
  window.removeEventListener('keyup', onAltUp);
740
+ window.removeEventListener('blur', onWindowBlur);
724
741
  };
725
742
  });
726
743
 
@@ -839,7 +856,7 @@
839
856
  >
840
857
  <div
841
858
  class="preview-iframe-shell relative flex flex-col {enableResize ? 'preview-iframe-shell-positioned' : ''}"
842
- class:preview-iframe-shell-symmetrical={isSymmetricalResize}
859
+ class:preview-iframe-shell-symmetrical={showSymmetricalStroke}
843
860
  style="{enableResize
844
861
  ? `position: absolute; left: ${previewShellLeft}px; top: ${previewShellTop}px; width: ${resizeWidth ? resizeWidth + 'px' : '100%'};`
845
862
  : `width: ${resizeWidth ? resizeWidth + 'px' : '100%'}; height: ${resizeHeight ? resizeHeight + 'px' : '100%'};`} transition: {isResizing || isDraggingPreview ? 'none' : 'width 0.2s, height 0.2s, left 0.15s, top 0.15s'};"
@@ -904,14 +921,6 @@
904
921
  <div class="preview-resize-handle preview-resize-handle-bl" onpointerdown={(e) => startResize(e, -1, 1)}></div>
905
922
  <!-- svelte-ignore a11y-no-static-element-interactions -->
906
923
  <div class="preview-resize-handle preview-resize-handle-br" onpointerdown={(e) => startResize(e, 1, 1)}></div>
907
- <!-- svelte-ignore a11y-no-static-element-interactions -->
908
- <div class="preview-resize-handle preview-resize-handle-t" onpointerdown={(e) => startResize(e, 0, -1)}></div>
909
- <!-- svelte-ignore a11y-no-static-element-interactions -->
910
- <div class="preview-resize-handle preview-resize-handle-r" onpointerdown={(e) => startResize(e, 1, 0)}></div>
911
- <!-- svelte-ignore a11y-no-static-element-interactions -->
912
- <div class="preview-resize-handle preview-resize-handle-b" onpointerdown={(e) => startResize(e, 0, 1)}></div>
913
- <!-- svelte-ignore a11y-no-static-element-interactions -->
914
- <div class="preview-resize-handle preview-resize-handle-l" onpointerdown={(e) => startResize(e, -1, 0)}></div>
915
924
  {/if}
916
925
 
917
926
  {#if (resizeWidth || resizeHeight) && !showDimensionInputs}
@@ -1090,10 +1099,6 @@
1090
1099
  .preview-resize-handle-tr { top: -5px; right: -5px; cursor: nesw-resize; }
1091
1100
  .preview-resize-handle-bl { bottom: -5px; left: -5px; cursor: nesw-resize; }
1092
1101
  .preview-resize-handle-br { bottom: -5px; right: -5px; cursor: nwse-resize; }
1093
- .preview-resize-handle-t { top: -5px; left: 50%; margin-left: -5px; cursor: ns-resize; }
1094
- .preview-resize-handle-b { bottom: -5px; left: 50%; margin-left: -5px; cursor: ns-resize; }
1095
- .preview-resize-handle-l { left: -5px; top: 50%; margin-top: -5px; cursor: ew-resize; }
1096
- .preview-resize-handle-r { right: -5px; top: 50%; margin-top: -5px; cursor: ew-resize; }
1097
1102
 
1098
1103
  .preview-resize-handle:hover {
1099
1104
  background: #eff6ff;
@@ -45,6 +45,10 @@ declare const WidgetPreview: $$__sveltets_2_IsomorphicComponent<{
45
45
  enableResize?: boolean;
46
46
  /** Drag only via the preview chrome header (keeps iframe interactive). */ enableDrag?: boolean;
47
47
  /** W×H number inputs in the chrome header, live-synced with resize. */ showDimensionInputs?: boolean;
48
+ /**
49
+ * concentric — always resize from center (widget-creator / Canvas).
50
+ * corner — opposite corner fixed; hold Alt for concentric (composition page).
51
+ */ resizeMode?: "concentric" | "corner";
48
52
  /** Initial / reset placement inside the stage. */ defaultStageAlign?: "center" | "right-half";
49
53
  /** Observe stage size and fill it (desktop modal) */ autoFitStage?: boolean;
50
54
  /** No padding/border on preview-content-container — matches widget-creator Edit panel */ compactChrome?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@widgetic/editor",
3
- "version": "4.0.4",
3
+ "version": "4.0.5",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",