@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
|
-
|
|
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
|
-
$:
|
|
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
|
-
|
|
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
|
-
|
|
626
|
-
|
|
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 (
|
|
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
|
-
|
|
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'
|
|
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'
|
|
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={
|
|
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;
|