@sepveneto/free-dom 0.11.3 → 0.11.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.
- package/dist/index.css +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +121 -62
- package/dist/index.mjs +123 -65
- package/package.json +1 -1
package/dist/index.css
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -114,6 +114,7 @@ declare const FreeScene: vue_demi.DefineComponent<{
|
|
|
114
114
|
default: number;
|
|
115
115
|
};
|
|
116
116
|
keyboard: BooleanConstructor;
|
|
117
|
+
disabledBatch: BooleanConstructor;
|
|
117
118
|
handle: {
|
|
118
119
|
type: StringConstructor;
|
|
119
120
|
default: undefined;
|
|
@@ -129,6 +130,7 @@ declare const FreeScene: vue_demi.DefineComponent<{
|
|
|
129
130
|
lockAspectRatio: BooleanConstructor;
|
|
130
131
|
disabledDrag: BooleanConstructor;
|
|
131
132
|
disabledResize: BooleanConstructor;
|
|
133
|
+
disabledSelect: BooleanConstructor;
|
|
132
134
|
scale: {
|
|
133
135
|
type: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
|
|
134
136
|
default: undefined;
|
|
@@ -167,6 +169,7 @@ declare const FreeScene: vue_demi.DefineComponent<{
|
|
|
167
169
|
default: number;
|
|
168
170
|
};
|
|
169
171
|
keyboard: BooleanConstructor;
|
|
172
|
+
disabledBatch: BooleanConstructor;
|
|
170
173
|
handle: {
|
|
171
174
|
type: StringConstructor;
|
|
172
175
|
default: undefined;
|
|
@@ -182,6 +185,7 @@ declare const FreeScene: vue_demi.DefineComponent<{
|
|
|
182
185
|
lockAspectRatio: BooleanConstructor;
|
|
183
186
|
disabledDrag: BooleanConstructor;
|
|
184
187
|
disabledResize: BooleanConstructor;
|
|
188
|
+
disabledSelect: BooleanConstructor;
|
|
185
189
|
scale: {
|
|
186
190
|
type: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
|
|
187
191
|
default: undefined;
|
|
@@ -193,12 +197,14 @@ declare const FreeScene: vue_demi.DefineComponent<{
|
|
|
193
197
|
showLine: boolean;
|
|
194
198
|
transformScale: number;
|
|
195
199
|
keyboard: boolean;
|
|
200
|
+
disabledBatch: boolean;
|
|
196
201
|
handle: string;
|
|
197
202
|
minWidth: number;
|
|
198
203
|
minHeight: number;
|
|
199
204
|
lockAspectRatio: boolean;
|
|
200
205
|
disabledDrag: boolean;
|
|
201
206
|
disabledResize: boolean;
|
|
207
|
+
disabledSelect: boolean;
|
|
202
208
|
fixNonMonospaced: boolean;
|
|
203
209
|
}, {}>;
|
|
204
210
|
declare const GridLayout: vue_demi.DefineComponent<{
|
|
@@ -402,6 +408,7 @@ declare const FreeDom: vue_demi.DefineComponent<{
|
|
|
402
408
|
};
|
|
403
409
|
disabledDrag: BooleanConstructor;
|
|
404
410
|
disabledResize: BooleanConstructor;
|
|
411
|
+
disabledSelect: BooleanConstructor;
|
|
405
412
|
scale: {
|
|
406
413
|
type: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
|
|
407
414
|
default: undefined;
|
|
@@ -594,6 +601,7 @@ declare const FreeDom: vue_demi.DefineComponent<{
|
|
|
594
601
|
};
|
|
595
602
|
disabledDrag: BooleanConstructor;
|
|
596
603
|
disabledResize: BooleanConstructor;
|
|
604
|
+
disabledSelect: BooleanConstructor;
|
|
597
605
|
scale: {
|
|
598
606
|
type: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
|
|
599
607
|
default: undefined;
|
|
@@ -622,6 +630,7 @@ declare const FreeDom: vue_demi.DefineComponent<{
|
|
|
622
630
|
lockAspectRatio: boolean;
|
|
623
631
|
disabledDrag: boolean;
|
|
624
632
|
disabledResize: boolean;
|
|
633
|
+
disabledSelect: boolean;
|
|
625
634
|
fixNonMonospaced: boolean;
|
|
626
635
|
modelValue: Partial<{
|
|
627
636
|
x: number;
|
package/dist/index.js
CHANGED
|
@@ -40,13 +40,15 @@ var import_vue_demi = require("vue-demi");
|
|
|
40
40
|
function createRender(comp, attrs = {}, props = {}, listeners = {}) {
|
|
41
41
|
if (!comp)
|
|
42
42
|
return () => null;
|
|
43
|
+
const _listeners = normalizeListeners(listeners);
|
|
43
44
|
const options = import_vue_demi.isVue2 ? {
|
|
44
|
-
...attrs,
|
|
45
|
+
...normalizeAttrs(attrs),
|
|
45
46
|
props,
|
|
46
|
-
|
|
47
|
+
..._listeners
|
|
47
48
|
} : {
|
|
48
49
|
...attrs,
|
|
49
|
-
...props
|
|
50
|
+
...props,
|
|
51
|
+
..._listeners
|
|
50
52
|
};
|
|
51
53
|
if (import_vue_demi.isVue2 && typeof comp === "object" && !("render" in comp)) {
|
|
52
54
|
(0, import_lodash_unified.merge)(comp.data, options);
|
|
@@ -64,6 +66,50 @@ function createRender(comp, attrs = {}, props = {}, listeners = {}) {
|
|
|
64
66
|
}
|
|
65
67
|
};
|
|
66
68
|
}
|
|
69
|
+
var NATIVE_ON_REGEXP = /^nativeOn([A-Z]\S*)/;
|
|
70
|
+
var ON_REGEXP = /^on([A-Z]\S*)/;
|
|
71
|
+
function normalizeListeners(listeners) {
|
|
72
|
+
const on = {};
|
|
73
|
+
const nativeOn = {};
|
|
74
|
+
let needOn = false;
|
|
75
|
+
let needNativeOn = false;
|
|
76
|
+
Object.entries(listeners).forEach(([key, fn]) => {
|
|
77
|
+
if (import_vue_demi.isVue2) {
|
|
78
|
+
const onName = key.match(ON_REGEXP)?.[1];
|
|
79
|
+
if (onName) {
|
|
80
|
+
needOn = true;
|
|
81
|
+
const name = onName.replace(/\S/, (letter) => letter.toLowerCase());
|
|
82
|
+
on[name] = fn;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const nativeName = key.match(NATIVE_ON_REGEXP)?.[1];
|
|
86
|
+
if (nativeName) {
|
|
87
|
+
needNativeOn = true;
|
|
88
|
+
const name = nativeName.replace(/\S/, (letter) => letter.toLowerCase());
|
|
89
|
+
nativeOn[name] = fn;
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
needOn = true;
|
|
93
|
+
const name = key.replace(NATIVE_ON_REGEXP, (_, $1) => `on${$1}`);
|
|
94
|
+
on[name] = fn;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const res = {};
|
|
98
|
+
if (needOn)
|
|
99
|
+
res.on = on;
|
|
100
|
+
if (needNativeOn)
|
|
101
|
+
res.nativeOn = nativeOn;
|
|
102
|
+
return import_vue_demi.isVue2 ? res : res.on;
|
|
103
|
+
}
|
|
104
|
+
function normalizeAttrs(attrs) {
|
|
105
|
+
const { ref: ref15, class: _class, style, ..._attrs } = attrs;
|
|
106
|
+
return {
|
|
107
|
+
ref: ref15,
|
|
108
|
+
class: _class,
|
|
109
|
+
style,
|
|
110
|
+
attrs: _attrs
|
|
111
|
+
};
|
|
112
|
+
}
|
|
67
113
|
|
|
68
114
|
// src/util/index.ts
|
|
69
115
|
var isProduction = process.env.NODE_ENV === "production";
|
|
@@ -379,7 +425,7 @@ function useDraggableData(props) {
|
|
|
379
425
|
// src/hooks/use-scene-context.ts
|
|
380
426
|
var import_vue_demi7 = require("vue-demi");
|
|
381
427
|
var id = 0;
|
|
382
|
-
function useSceneContext(context, props) {
|
|
428
|
+
function useSceneContext(elm, context, props) {
|
|
383
429
|
const SceneContext = (0, import_vue_demi7.inject)(SceneToken, void 0);
|
|
384
430
|
const uuid = id++;
|
|
385
431
|
const handle = (0, import_vue_demi7.computed)(() => SceneContext?.handle || props.handle);
|
|
@@ -388,6 +434,7 @@ function useSceneContext(context, props) {
|
|
|
388
434
|
const minHeight = (0, import_vue_demi7.computed)(() => SceneContext?.minHeight || props.minHeight);
|
|
389
435
|
const disabledDrag = (0, import_vue_demi7.computed)(() => SceneContext?.disabledDrag || props.disabledDrag);
|
|
390
436
|
const disabledResize = (0, import_vue_demi7.computed)(() => SceneContext?.disabledResize || props.disabledResize);
|
|
437
|
+
const disabledSelect = (0, import_vue_demi7.computed)(() => SceneContext?.disabledSelect || props.disabledSelect);
|
|
391
438
|
const scale = (0, import_vue_demi7.computed)(() => SceneContext?.scale || props.scale);
|
|
392
439
|
const transformScale = (0, import_vue_demi7.computed)(() => SceneContext?.transformScale || props.transformScale);
|
|
393
440
|
const fixNonMonospaced = (0, import_vue_demi7.computed)(() => {
|
|
@@ -395,7 +442,12 @@ function useSceneContext(context, props) {
|
|
|
395
442
|
});
|
|
396
443
|
const keyboard = (0, import_vue_demi7.computed)(() => SceneContext?.keyboard || props.keyboard);
|
|
397
444
|
(0, import_vue_demi7.onMounted)(() => {
|
|
398
|
-
|
|
445
|
+
const node = elm.value;
|
|
446
|
+
if (!node) {
|
|
447
|
+
console.warn("[free-dom] mounted failed: element not found");
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
SceneContext?.register(node.$el, uuid, context);
|
|
399
451
|
});
|
|
400
452
|
(0, import_vue_demi7.onUnmounted)(() => {
|
|
401
453
|
SceneContext?.remove(uuid);
|
|
@@ -427,6 +479,7 @@ function useSceneContext(context, props) {
|
|
|
427
479
|
minHeight,
|
|
428
480
|
disabledDrag,
|
|
429
481
|
disabledResize,
|
|
482
|
+
disabledSelect,
|
|
430
483
|
fixNonMonospaced,
|
|
431
484
|
transformScale,
|
|
432
485
|
keyboard
|
|
@@ -1190,7 +1243,7 @@ var DEFAULT_UNITS = [
|
|
|
1190
1243
|
];
|
|
1191
1244
|
|
|
1192
1245
|
// src/hooks/use-mask.ts
|
|
1193
|
-
function useMask(target, nodes) {
|
|
1246
|
+
function useMask(target, props, nodes) {
|
|
1194
1247
|
const eventBus = useEventBus();
|
|
1195
1248
|
const startX = (0, import_vue_demi13.ref)(0);
|
|
1196
1249
|
const startY = (0, import_vue_demi13.ref)(0);
|
|
@@ -1216,8 +1269,12 @@ function useMask(target, nodes) {
|
|
|
1216
1269
|
const selecting = (0, import_vue_demi13.ref)(false);
|
|
1217
1270
|
const rect = useElementBounding(target);
|
|
1218
1271
|
const ownerDoc = (0, import_vue_demi13.computed)(() => unrefElement(target)?.ownerDocument);
|
|
1272
|
+
const activeNodes = (0, import_vue_demi13.computed)(() => nodes.value.filter((node) => {
|
|
1273
|
+
return !(props.disabledSelect || node.node.disabledSelect);
|
|
1274
|
+
}));
|
|
1219
1275
|
function checkNode() {
|
|
1220
|
-
|
|
1276
|
+
let selectedNode;
|
|
1277
|
+
activeNodes.value.forEach((node) => {
|
|
1221
1278
|
const rect2 = node.node._rect;
|
|
1222
1279
|
if (rect2.x == void 0 || // eslint-disable-next-line eqeqeq
|
|
1223
1280
|
rect2.y == void 0 || // eslint-disable-next-line eqeqeq
|
|
@@ -1228,8 +1285,13 @@ function useMask(target, nodes) {
|
|
|
1228
1285
|
const y1 = rect2.y;
|
|
1229
1286
|
const x2 = x1 + rect2.width;
|
|
1230
1287
|
const y2 = y1 + rect2.height;
|
|
1231
|
-
|
|
1288
|
+
const isSelected = inArea(x1, y1, x2, y2);
|
|
1289
|
+
node.node.selected = isSelected;
|
|
1290
|
+
if (isSelected) {
|
|
1291
|
+
selectedNode = node;
|
|
1292
|
+
}
|
|
1232
1293
|
});
|
|
1294
|
+
selectedNode?.el.focus();
|
|
1233
1295
|
}
|
|
1234
1296
|
function inArea(x1, y1, x2, y2) {
|
|
1235
1297
|
const areaStartX = Math.min(startX.value, lastX.value);
|
|
@@ -1252,6 +1314,8 @@ function useMask(target, nodes) {
|
|
|
1252
1314
|
};
|
|
1253
1315
|
}
|
|
1254
1316
|
function handleMousedown(evt) {
|
|
1317
|
+
if (props.disabledBatch)
|
|
1318
|
+
return;
|
|
1255
1319
|
addUserSelectStyle(ownerDoc.value);
|
|
1256
1320
|
const { x: offsetX, y: offsetY } = offsetFormat(evt);
|
|
1257
1321
|
selecting.value = true;
|
|
@@ -1447,30 +1511,20 @@ var freeDomCore = (0, import_vue_demi15.defineComponent)({
|
|
|
1447
1511
|
},
|
|
1448
1512
|
render() {
|
|
1449
1513
|
const { only } = useDefaultSlot();
|
|
1450
|
-
const vue2Props = {
|
|
1451
|
-
on: {
|
|
1452
|
-
mousedown: (evt) => {
|
|
1453
|
-
evt.stopPropagation();
|
|
1454
|
-
this.mousedownFn(evt);
|
|
1455
|
-
},
|
|
1456
|
-
mouseup: this.mouseupFn
|
|
1457
|
-
}
|
|
1458
|
-
};
|
|
1459
|
-
const vue3Props = {
|
|
1460
|
-
onMousedown: (evt) => {
|
|
1461
|
-
evt.stopPropagation();
|
|
1462
|
-
this.mousedownFn(evt);
|
|
1463
|
-
},
|
|
1464
|
-
onMouseup: this.mouseupFn
|
|
1465
|
-
};
|
|
1466
1514
|
const res = createRender(
|
|
1467
1515
|
// @ts-expect-error: maybe vue2
|
|
1468
1516
|
only,
|
|
1469
1517
|
{ ref: (el) => {
|
|
1470
1518
|
this.coreRef = el;
|
|
1471
1519
|
} },
|
|
1472
|
-
|
|
1473
|
-
|
|
1520
|
+
{},
|
|
1521
|
+
{
|
|
1522
|
+
onMousedown: (evt) => {
|
|
1523
|
+
evt.stopPropagation();
|
|
1524
|
+
this.mousedownFn(evt);
|
|
1525
|
+
},
|
|
1526
|
+
onMouseup: this.mouseupFn
|
|
1527
|
+
}
|
|
1474
1528
|
);
|
|
1475
1529
|
if (typeof res === "function") {
|
|
1476
1530
|
return res();
|
|
@@ -1540,16 +1594,17 @@ var resizeDomCore = (0, import_vue_demi16.defineComponent)({
|
|
|
1540
1594
|
return [width, height];
|
|
1541
1595
|
if (lockAspectRatio) {
|
|
1542
1596
|
const ratio = props.width / props.height;
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
if (Math.abs(deltaW) > Math.abs(deltaH * ratio)) {
|
|
1546
|
-
height = width / ratio;
|
|
1547
|
-
} else {
|
|
1597
|
+
if (ratio > 1) {
|
|
1598
|
+
height = Math.max(height, props.minHeight);
|
|
1548
1599
|
width = height * ratio;
|
|
1600
|
+
} else {
|
|
1601
|
+
width = Math.max(width, props.minWidth);
|
|
1602
|
+
height = width / ratio;
|
|
1549
1603
|
}
|
|
1604
|
+
} else {
|
|
1605
|
+
width = Math.max(width, props.minWidth);
|
|
1606
|
+
height = Math.max(height, props.minHeight);
|
|
1550
1607
|
}
|
|
1551
|
-
width = Math.max(width, props.minWidth);
|
|
1552
|
-
height = Math.max(height, props.minHeight);
|
|
1553
1608
|
return [width, height];
|
|
1554
1609
|
}
|
|
1555
1610
|
function handleResize(handleName, axis) {
|
|
@@ -1685,6 +1740,7 @@ var freeDomProps = {
|
|
|
1685
1740
|
minHeight: resizeDomCoreProps.minHeight,
|
|
1686
1741
|
disabledDrag: Boolean,
|
|
1687
1742
|
disabledResize: Boolean,
|
|
1743
|
+
disabledSelect: Boolean,
|
|
1688
1744
|
scale: resizeDomCoreProps.scale,
|
|
1689
1745
|
transformScale: {
|
|
1690
1746
|
type: Number,
|
|
@@ -1722,6 +1778,7 @@ var freeDom = (0, import_vue_demi17.defineComponent)({
|
|
|
1722
1778
|
const { width, height, syncSize: _syncSize } = useResizableData(props, domRef);
|
|
1723
1779
|
const selected = (0, import_vue_demi17.ref)(false);
|
|
1724
1780
|
const context = (0, import_vue_demi17.reactive)({
|
|
1781
|
+
disabledSelect: (0, import_vue_demi17.toRef)(props, "disabledSelect"),
|
|
1725
1782
|
selected,
|
|
1726
1783
|
_rect: (0, import_vue_demi17.reactive)({
|
|
1727
1784
|
x,
|
|
@@ -1735,7 +1792,7 @@ var freeDom = (0, import_vue_demi17.defineComponent)({
|
|
|
1735
1792
|
emit("update:modelValue", pos);
|
|
1736
1793
|
}
|
|
1737
1794
|
});
|
|
1738
|
-
const sceneContext = useSceneContext(context, props);
|
|
1795
|
+
const sceneContext = useSceneContext(domRef, context, props);
|
|
1739
1796
|
onClickOutside(domRef, () => {
|
|
1740
1797
|
if (!selected.value || isBatchSelecting.value)
|
|
1741
1798
|
return;
|
|
@@ -1868,6 +1925,8 @@ var freeDom = (0, import_vue_demi17.defineComponent)({
|
|
|
1868
1925
|
return createRender(resizeDomCore_default, {}, props2)(slots);
|
|
1869
1926
|
};
|
|
1870
1927
|
function handleSelect(evt) {
|
|
1928
|
+
if (sceneContext.disabledSelect.value)
|
|
1929
|
+
return;
|
|
1871
1930
|
if (evt.ctrlKey) {
|
|
1872
1931
|
selected.value = !selected.value;
|
|
1873
1932
|
sceneContext.history?.push({ type: "select" });
|
|
@@ -1878,23 +1937,32 @@ var freeDom = (0, import_vue_demi17.defineComponent)({
|
|
|
1878
1937
|
}
|
|
1879
1938
|
}
|
|
1880
1939
|
function handleKeyboard(evt) {
|
|
1881
|
-
if (
|
|
1940
|
+
if (sceneContext.disabledDrag.value || !sceneContext.keyboard.value)
|
|
1882
1941
|
return;
|
|
1883
1942
|
evt.preventDefault();
|
|
1884
1943
|
switch (evt.key) {
|
|
1885
1944
|
case "ArrowUp":
|
|
1886
|
-
|
|
1945
|
+
deltaY.value = -1;
|
|
1946
|
+
deltaX.value = 0;
|
|
1887
1947
|
break;
|
|
1888
1948
|
case "ArrowDown":
|
|
1889
|
-
|
|
1949
|
+
deltaY.value = 1;
|
|
1950
|
+
deltaX.value = 0;
|
|
1890
1951
|
break;
|
|
1891
1952
|
case "ArrowLeft":
|
|
1892
|
-
|
|
1953
|
+
deltaX.value = -1;
|
|
1954
|
+
deltaY.value = 0;
|
|
1893
1955
|
break;
|
|
1894
1956
|
case "ArrowRight":
|
|
1895
|
-
|
|
1957
|
+
deltaX.value = 1;
|
|
1958
|
+
deltaY.value = 0;
|
|
1896
1959
|
break;
|
|
1960
|
+
default:
|
|
1961
|
+
deltaX.value = 0;
|
|
1962
|
+
deltaY.value = 0;
|
|
1897
1963
|
}
|
|
1964
|
+
x.value += deltaX.value;
|
|
1965
|
+
y.value += deltaY.value;
|
|
1898
1966
|
const newPos = {
|
|
1899
1967
|
x: x.value,
|
|
1900
1968
|
y: y.value,
|
|
@@ -1934,19 +2002,7 @@ var freeDom = (0, import_vue_demi17.defineComponent)({
|
|
|
1934
2002
|
stopFn: this.onDragStop,
|
|
1935
2003
|
dragFn: this.onDrag,
|
|
1936
2004
|
disabled: this.disabled,
|
|
1937
|
-
scale: this.scale
|
|
1938
|
-
keyboard: this.keyboard
|
|
1939
|
-
};
|
|
1940
|
-
const vue2Listener = {
|
|
1941
|
-
on: {
|
|
1942
|
-
click: this.handleSelect,
|
|
1943
|
-
keydown: this.handleKeyboard
|
|
1944
|
-
}
|
|
1945
|
-
};
|
|
1946
|
-
const vue3Props = {
|
|
1947
|
-
...props,
|
|
1948
|
-
onClick: this.handleSelect,
|
|
1949
|
-
onKeydown: this.handleKeyboard
|
|
2005
|
+
scale: this.scale
|
|
1950
2006
|
};
|
|
1951
2007
|
const slots = () => this.resizeNode();
|
|
1952
2008
|
return createRender(
|
|
@@ -1961,8 +2017,11 @@ var freeDom = (0, import_vue_demi17.defineComponent)({
|
|
|
1961
2017
|
],
|
|
1962
2018
|
style: this.style
|
|
1963
2019
|
},
|
|
1964
|
-
|
|
1965
|
-
|
|
2020
|
+
props,
|
|
2021
|
+
{
|
|
2022
|
+
nativeOnClick: this.handleSelect,
|
|
2023
|
+
nativeOnKeydown: this.handleKeyboard
|
|
2024
|
+
}
|
|
1966
2025
|
)?.(slots);
|
|
1967
2026
|
}
|
|
1968
2027
|
});
|
|
@@ -1983,12 +2042,14 @@ var freeDomWrapProps = {
|
|
|
1983
2042
|
default: 1
|
|
1984
2043
|
},
|
|
1985
2044
|
keyboard: Boolean,
|
|
2045
|
+
disabledBatch: Boolean,
|
|
1986
2046
|
handle: freeDomProps.handle,
|
|
1987
2047
|
minWidth: freeDomProps.minWidth,
|
|
1988
2048
|
minHeight: freeDomProps.minHeight,
|
|
1989
2049
|
lockAspectRatio: freeDomProps.lockAspectRatio,
|
|
1990
2050
|
disabledDrag: freeDomProps.disabledDrag,
|
|
1991
2051
|
disabledResize: freeDomProps.disabledResize,
|
|
2052
|
+
disabledSelect: freeDomProps.disabledSelect,
|
|
1992
2053
|
scale: freeDomProps.scale,
|
|
1993
2054
|
fixNonMonospaced: freeDomProps.fixNonMonospaced
|
|
1994
2055
|
};
|
|
@@ -2028,7 +2089,7 @@ var FreeDomWrap = (0, import_vue_demi18.defineComponent)({
|
|
|
2028
2089
|
});
|
|
2029
2090
|
});
|
|
2030
2091
|
const selecting = (0, import_vue_demi18.ref)(false);
|
|
2031
|
-
const mask = useMask(rectRef, nodes);
|
|
2092
|
+
const mask = useMask(rectRef, props, nodes);
|
|
2032
2093
|
function runCorrect() {
|
|
2033
2094
|
nodes.value.forEach((pos) => {
|
|
2034
2095
|
const { x, y, width: width2, height: height2 } = correct(pos.node._rect);
|
|
@@ -2039,8 +2100,9 @@ var FreeDomWrap = (0, import_vue_demi18.defineComponent)({
|
|
|
2039
2100
|
pos.node.trigger({ x, y, w: width2, h: height2 });
|
|
2040
2101
|
});
|
|
2041
2102
|
}
|
|
2042
|
-
function register(uuid, node) {
|
|
2103
|
+
function register(el, uuid, node) {
|
|
2043
2104
|
nodes.value.push({
|
|
2105
|
+
el,
|
|
2044
2106
|
uuid,
|
|
2045
2107
|
node
|
|
2046
2108
|
});
|
|
@@ -2123,14 +2185,11 @@ var FreeDomWrap = (0, import_vue_demi18.defineComponent)({
|
|
|
2123
2185
|
ref: "rectRef",
|
|
2124
2186
|
class: "vv-free-dom--scene"
|
|
2125
2187
|
},
|
|
2126
|
-
|
|
2188
|
+
{},
|
|
2189
|
+
{
|
|
2127
2190
|
onMousedown: this.mask.handleMousedown,
|
|
2128
2191
|
onMousemove: this.mask.handleMousemove
|
|
2129
|
-
}
|
|
2130
|
-
import_vue_demi18.isVue2 ? {
|
|
2131
|
-
mousedown: this.mask.handleMousedown,
|
|
2132
|
-
mousemove: this.mask.handleMousemove
|
|
2133
|
-
} : {}
|
|
2192
|
+
}
|
|
2134
2193
|
)(slotList);
|
|
2135
2194
|
}
|
|
2136
2195
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
import {
|
|
3
3
|
computed as computed11,
|
|
4
4
|
defineComponent as defineComponent6,
|
|
5
|
-
isVue2 as isVue26,
|
|
6
5
|
provide as provide2,
|
|
7
6
|
reactive as reactive5,
|
|
8
7
|
ref as ref13,
|
|
@@ -20,13 +19,15 @@ import { h, isVue2 } from "vue-demi";
|
|
|
20
19
|
function createRender(comp, attrs = {}, props = {}, listeners = {}) {
|
|
21
20
|
if (!comp)
|
|
22
21
|
return () => null;
|
|
22
|
+
const _listeners = normalizeListeners(listeners);
|
|
23
23
|
const options = isVue2 ? {
|
|
24
|
-
...attrs,
|
|
24
|
+
...normalizeAttrs(attrs),
|
|
25
25
|
props,
|
|
26
|
-
|
|
26
|
+
..._listeners
|
|
27
27
|
} : {
|
|
28
28
|
...attrs,
|
|
29
|
-
...props
|
|
29
|
+
...props,
|
|
30
|
+
..._listeners
|
|
30
31
|
};
|
|
31
32
|
if (isVue2 && typeof comp === "object" && !("render" in comp)) {
|
|
32
33
|
merge(comp.data, options);
|
|
@@ -44,6 +45,50 @@ function createRender(comp, attrs = {}, props = {}, listeners = {}) {
|
|
|
44
45
|
}
|
|
45
46
|
};
|
|
46
47
|
}
|
|
48
|
+
var NATIVE_ON_REGEXP = /^nativeOn([A-Z]\S*)/;
|
|
49
|
+
var ON_REGEXP = /^on([A-Z]\S*)/;
|
|
50
|
+
function normalizeListeners(listeners) {
|
|
51
|
+
const on = {};
|
|
52
|
+
const nativeOn = {};
|
|
53
|
+
let needOn = false;
|
|
54
|
+
let needNativeOn = false;
|
|
55
|
+
Object.entries(listeners).forEach(([key, fn]) => {
|
|
56
|
+
if (isVue2) {
|
|
57
|
+
const onName = key.match(ON_REGEXP)?.[1];
|
|
58
|
+
if (onName) {
|
|
59
|
+
needOn = true;
|
|
60
|
+
const name = onName.replace(/\S/, (letter) => letter.toLowerCase());
|
|
61
|
+
on[name] = fn;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const nativeName = key.match(NATIVE_ON_REGEXP)?.[1];
|
|
65
|
+
if (nativeName) {
|
|
66
|
+
needNativeOn = true;
|
|
67
|
+
const name = nativeName.replace(/\S/, (letter) => letter.toLowerCase());
|
|
68
|
+
nativeOn[name] = fn;
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
needOn = true;
|
|
72
|
+
const name = key.replace(NATIVE_ON_REGEXP, (_, $1) => `on${$1}`);
|
|
73
|
+
on[name] = fn;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
const res = {};
|
|
77
|
+
if (needOn)
|
|
78
|
+
res.on = on;
|
|
79
|
+
if (needNativeOn)
|
|
80
|
+
res.nativeOn = nativeOn;
|
|
81
|
+
return isVue2 ? res : res.on;
|
|
82
|
+
}
|
|
83
|
+
function normalizeAttrs(attrs) {
|
|
84
|
+
const { ref: ref15, class: _class, style, ..._attrs } = attrs;
|
|
85
|
+
return {
|
|
86
|
+
ref: ref15,
|
|
87
|
+
class: _class,
|
|
88
|
+
style,
|
|
89
|
+
attrs: _attrs
|
|
90
|
+
};
|
|
91
|
+
}
|
|
47
92
|
|
|
48
93
|
// src/util/index.ts
|
|
49
94
|
var isProduction = process.env.NODE_ENV === "production";
|
|
@@ -359,7 +404,7 @@ function useDraggableData(props) {
|
|
|
359
404
|
// src/hooks/use-scene-context.ts
|
|
360
405
|
import { computed as computed2, inject as inject2, onMounted, onUnmounted } from "vue-demi";
|
|
361
406
|
var id = 0;
|
|
362
|
-
function useSceneContext(context, props) {
|
|
407
|
+
function useSceneContext(elm, context, props) {
|
|
363
408
|
const SceneContext = inject2(SceneToken, void 0);
|
|
364
409
|
const uuid = id++;
|
|
365
410
|
const handle = computed2(() => SceneContext?.handle || props.handle);
|
|
@@ -368,6 +413,7 @@ function useSceneContext(context, props) {
|
|
|
368
413
|
const minHeight = computed2(() => SceneContext?.minHeight || props.minHeight);
|
|
369
414
|
const disabledDrag = computed2(() => SceneContext?.disabledDrag || props.disabledDrag);
|
|
370
415
|
const disabledResize = computed2(() => SceneContext?.disabledResize || props.disabledResize);
|
|
416
|
+
const disabledSelect = computed2(() => SceneContext?.disabledSelect || props.disabledSelect);
|
|
371
417
|
const scale = computed2(() => SceneContext?.scale || props.scale);
|
|
372
418
|
const transformScale = computed2(() => SceneContext?.transformScale || props.transformScale);
|
|
373
419
|
const fixNonMonospaced = computed2(() => {
|
|
@@ -375,7 +421,12 @@ function useSceneContext(context, props) {
|
|
|
375
421
|
});
|
|
376
422
|
const keyboard = computed2(() => SceneContext?.keyboard || props.keyboard);
|
|
377
423
|
onMounted(() => {
|
|
378
|
-
|
|
424
|
+
const node = elm.value;
|
|
425
|
+
if (!node) {
|
|
426
|
+
console.warn("[free-dom] mounted failed: element not found");
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
SceneContext?.register(node.$el, uuid, context);
|
|
379
430
|
});
|
|
380
431
|
onUnmounted(() => {
|
|
381
432
|
SceneContext?.remove(uuid);
|
|
@@ -407,6 +458,7 @@ function useSceneContext(context, props) {
|
|
|
407
458
|
minHeight,
|
|
408
459
|
disabledDrag,
|
|
409
460
|
disabledResize,
|
|
461
|
+
disabledSelect,
|
|
410
462
|
fixNonMonospaced,
|
|
411
463
|
transformScale,
|
|
412
464
|
keyboard
|
|
@@ -1170,7 +1222,7 @@ var DEFAULT_UNITS = [
|
|
|
1170
1222
|
];
|
|
1171
1223
|
|
|
1172
1224
|
// src/hooks/use-mask.ts
|
|
1173
|
-
function useMask(target, nodes) {
|
|
1225
|
+
function useMask(target, props, nodes) {
|
|
1174
1226
|
const eventBus = useEventBus();
|
|
1175
1227
|
const startX = ref9(0);
|
|
1176
1228
|
const startY = ref9(0);
|
|
@@ -1196,8 +1248,12 @@ function useMask(target, nodes) {
|
|
|
1196
1248
|
const selecting = ref9(false);
|
|
1197
1249
|
const rect = useElementBounding(target);
|
|
1198
1250
|
const ownerDoc = computed6(() => unrefElement(target)?.ownerDocument);
|
|
1251
|
+
const activeNodes = computed6(() => nodes.value.filter((node) => {
|
|
1252
|
+
return !(props.disabledSelect || node.node.disabledSelect);
|
|
1253
|
+
}));
|
|
1199
1254
|
function checkNode() {
|
|
1200
|
-
|
|
1255
|
+
let selectedNode;
|
|
1256
|
+
activeNodes.value.forEach((node) => {
|
|
1201
1257
|
const rect2 = node.node._rect;
|
|
1202
1258
|
if (rect2.x == void 0 || // eslint-disable-next-line eqeqeq
|
|
1203
1259
|
rect2.y == void 0 || // eslint-disable-next-line eqeqeq
|
|
@@ -1208,8 +1264,13 @@ function useMask(target, nodes) {
|
|
|
1208
1264
|
const y1 = rect2.y;
|
|
1209
1265
|
const x2 = x1 + rect2.width;
|
|
1210
1266
|
const y2 = y1 + rect2.height;
|
|
1211
|
-
|
|
1267
|
+
const isSelected = inArea(x1, y1, x2, y2);
|
|
1268
|
+
node.node.selected = isSelected;
|
|
1269
|
+
if (isSelected) {
|
|
1270
|
+
selectedNode = node;
|
|
1271
|
+
}
|
|
1212
1272
|
});
|
|
1273
|
+
selectedNode?.el.focus();
|
|
1213
1274
|
}
|
|
1214
1275
|
function inArea(x1, y1, x2, y2) {
|
|
1215
1276
|
const areaStartX = Math.min(startX.value, lastX.value);
|
|
@@ -1232,6 +1293,8 @@ function useMask(target, nodes) {
|
|
|
1232
1293
|
};
|
|
1233
1294
|
}
|
|
1234
1295
|
function handleMousedown(evt) {
|
|
1296
|
+
if (props.disabledBatch)
|
|
1297
|
+
return;
|
|
1235
1298
|
addUserSelectStyle(ownerDoc.value);
|
|
1236
1299
|
const { x: offsetX, y: offsetY } = offsetFormat(evt);
|
|
1237
1300
|
selecting.value = true;
|
|
@@ -1312,10 +1375,10 @@ function useOperateHistory(nodes) {
|
|
|
1312
1375
|
}
|
|
1313
1376
|
|
|
1314
1377
|
// src/components/freeDom.ts
|
|
1315
|
-
import { computed as computed10, defineComponent as defineComponent5,
|
|
1378
|
+
import { computed as computed10, defineComponent as defineComponent5, onMounted as onMounted4, reactive as reactive4, ref as ref12, toRef as toRef2 } from "vue-demi";
|
|
1316
1379
|
|
|
1317
1380
|
// src/components/freeDomCore.ts
|
|
1318
|
-
import { computed as computed8, defineComponent as defineComponent3,
|
|
1381
|
+
import { computed as computed8, defineComponent as defineComponent3, onUnmounted as onUnmounted3, ref as ref11 } from "vue-demi";
|
|
1319
1382
|
function noop2() {
|
|
1320
1383
|
}
|
|
1321
1384
|
var freeDomCoreProps = {
|
|
@@ -1427,30 +1490,20 @@ var freeDomCore = defineComponent3({
|
|
|
1427
1490
|
},
|
|
1428
1491
|
render() {
|
|
1429
1492
|
const { only } = useDefaultSlot();
|
|
1430
|
-
const vue2Props = {
|
|
1431
|
-
on: {
|
|
1432
|
-
mousedown: (evt) => {
|
|
1433
|
-
evt.stopPropagation();
|
|
1434
|
-
this.mousedownFn(evt);
|
|
1435
|
-
},
|
|
1436
|
-
mouseup: this.mouseupFn
|
|
1437
|
-
}
|
|
1438
|
-
};
|
|
1439
|
-
const vue3Props = {
|
|
1440
|
-
onMousedown: (evt) => {
|
|
1441
|
-
evt.stopPropagation();
|
|
1442
|
-
this.mousedownFn(evt);
|
|
1443
|
-
},
|
|
1444
|
-
onMouseup: this.mouseupFn
|
|
1445
|
-
};
|
|
1446
1493
|
const res = createRender(
|
|
1447
1494
|
// @ts-expect-error: maybe vue2
|
|
1448
1495
|
only,
|
|
1449
1496
|
{ ref: (el) => {
|
|
1450
1497
|
this.coreRef = el;
|
|
1451
1498
|
} },
|
|
1452
|
-
|
|
1453
|
-
|
|
1499
|
+
{},
|
|
1500
|
+
{
|
|
1501
|
+
onMousedown: (evt) => {
|
|
1502
|
+
evt.stopPropagation();
|
|
1503
|
+
this.mousedownFn(evt);
|
|
1504
|
+
},
|
|
1505
|
+
onMouseup: this.mouseupFn
|
|
1506
|
+
}
|
|
1454
1507
|
);
|
|
1455
1508
|
if (typeof res === "function") {
|
|
1456
1509
|
return res();
|
|
@@ -1520,16 +1573,17 @@ var resizeDomCore = defineComponent4({
|
|
|
1520
1573
|
return [width, height];
|
|
1521
1574
|
if (lockAspectRatio) {
|
|
1522
1575
|
const ratio = props.width / props.height;
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
if (Math.abs(deltaW) > Math.abs(deltaH * ratio)) {
|
|
1526
|
-
height = width / ratio;
|
|
1527
|
-
} else {
|
|
1576
|
+
if (ratio > 1) {
|
|
1577
|
+
height = Math.max(height, props.minHeight);
|
|
1528
1578
|
width = height * ratio;
|
|
1579
|
+
} else {
|
|
1580
|
+
width = Math.max(width, props.minWidth);
|
|
1581
|
+
height = width / ratio;
|
|
1529
1582
|
}
|
|
1583
|
+
} else {
|
|
1584
|
+
width = Math.max(width, props.minWidth);
|
|
1585
|
+
height = Math.max(height, props.minHeight);
|
|
1530
1586
|
}
|
|
1531
|
-
width = Math.max(width, props.minWidth);
|
|
1532
|
-
height = Math.max(height, props.minHeight);
|
|
1533
1587
|
return [width, height];
|
|
1534
1588
|
}
|
|
1535
1589
|
function handleResize(handleName, axis) {
|
|
@@ -1665,6 +1719,7 @@ var freeDomProps = {
|
|
|
1665
1719
|
minHeight: resizeDomCoreProps.minHeight,
|
|
1666
1720
|
disabledDrag: Boolean,
|
|
1667
1721
|
disabledResize: Boolean,
|
|
1722
|
+
disabledSelect: Boolean,
|
|
1668
1723
|
scale: resizeDomCoreProps.scale,
|
|
1669
1724
|
transformScale: {
|
|
1670
1725
|
type: Number,
|
|
@@ -1702,6 +1757,7 @@ var freeDom = defineComponent5({
|
|
|
1702
1757
|
const { width, height, syncSize: _syncSize } = useResizableData(props, domRef);
|
|
1703
1758
|
const selected = ref12(false);
|
|
1704
1759
|
const context = reactive4({
|
|
1760
|
+
disabledSelect: toRef2(props, "disabledSelect"),
|
|
1705
1761
|
selected,
|
|
1706
1762
|
_rect: reactive4({
|
|
1707
1763
|
x,
|
|
@@ -1715,7 +1771,7 @@ var freeDom = defineComponent5({
|
|
|
1715
1771
|
emit("update:modelValue", pos);
|
|
1716
1772
|
}
|
|
1717
1773
|
});
|
|
1718
|
-
const sceneContext = useSceneContext(context, props);
|
|
1774
|
+
const sceneContext = useSceneContext(domRef, context, props);
|
|
1719
1775
|
onClickOutside(domRef, () => {
|
|
1720
1776
|
if (!selected.value || isBatchSelecting.value)
|
|
1721
1777
|
return;
|
|
@@ -1848,6 +1904,8 @@ var freeDom = defineComponent5({
|
|
|
1848
1904
|
return createRender(resizeDomCore_default, {}, props2)(slots);
|
|
1849
1905
|
};
|
|
1850
1906
|
function handleSelect(evt) {
|
|
1907
|
+
if (sceneContext.disabledSelect.value)
|
|
1908
|
+
return;
|
|
1851
1909
|
if (evt.ctrlKey) {
|
|
1852
1910
|
selected.value = !selected.value;
|
|
1853
1911
|
sceneContext.history?.push({ type: "select" });
|
|
@@ -1858,23 +1916,32 @@ var freeDom = defineComponent5({
|
|
|
1858
1916
|
}
|
|
1859
1917
|
}
|
|
1860
1918
|
function handleKeyboard(evt) {
|
|
1861
|
-
if (
|
|
1919
|
+
if (sceneContext.disabledDrag.value || !sceneContext.keyboard.value)
|
|
1862
1920
|
return;
|
|
1863
1921
|
evt.preventDefault();
|
|
1864
1922
|
switch (evt.key) {
|
|
1865
1923
|
case "ArrowUp":
|
|
1866
|
-
|
|
1924
|
+
deltaY.value = -1;
|
|
1925
|
+
deltaX.value = 0;
|
|
1867
1926
|
break;
|
|
1868
1927
|
case "ArrowDown":
|
|
1869
|
-
|
|
1928
|
+
deltaY.value = 1;
|
|
1929
|
+
deltaX.value = 0;
|
|
1870
1930
|
break;
|
|
1871
1931
|
case "ArrowLeft":
|
|
1872
|
-
|
|
1932
|
+
deltaX.value = -1;
|
|
1933
|
+
deltaY.value = 0;
|
|
1873
1934
|
break;
|
|
1874
1935
|
case "ArrowRight":
|
|
1875
|
-
|
|
1936
|
+
deltaX.value = 1;
|
|
1937
|
+
deltaY.value = 0;
|
|
1876
1938
|
break;
|
|
1939
|
+
default:
|
|
1940
|
+
deltaX.value = 0;
|
|
1941
|
+
deltaY.value = 0;
|
|
1877
1942
|
}
|
|
1943
|
+
x.value += deltaX.value;
|
|
1944
|
+
y.value += deltaY.value;
|
|
1878
1945
|
const newPos = {
|
|
1879
1946
|
x: x.value,
|
|
1880
1947
|
y: y.value,
|
|
@@ -1914,19 +1981,7 @@ var freeDom = defineComponent5({
|
|
|
1914
1981
|
stopFn: this.onDragStop,
|
|
1915
1982
|
dragFn: this.onDrag,
|
|
1916
1983
|
disabled: this.disabled,
|
|
1917
|
-
scale: this.scale
|
|
1918
|
-
keyboard: this.keyboard
|
|
1919
|
-
};
|
|
1920
|
-
const vue2Listener = {
|
|
1921
|
-
on: {
|
|
1922
|
-
click: this.handleSelect,
|
|
1923
|
-
keydown: this.handleKeyboard
|
|
1924
|
-
}
|
|
1925
|
-
};
|
|
1926
|
-
const vue3Props = {
|
|
1927
|
-
...props,
|
|
1928
|
-
onClick: this.handleSelect,
|
|
1929
|
-
onKeydown: this.handleKeyboard
|
|
1984
|
+
scale: this.scale
|
|
1930
1985
|
};
|
|
1931
1986
|
const slots = () => this.resizeNode();
|
|
1932
1987
|
return createRender(
|
|
@@ -1941,8 +1996,11 @@ var freeDom = defineComponent5({
|
|
|
1941
1996
|
],
|
|
1942
1997
|
style: this.style
|
|
1943
1998
|
},
|
|
1944
|
-
|
|
1945
|
-
|
|
1999
|
+
props,
|
|
2000
|
+
{
|
|
2001
|
+
nativeOnClick: this.handleSelect,
|
|
2002
|
+
nativeOnKeydown: this.handleKeyboard
|
|
2003
|
+
}
|
|
1946
2004
|
)?.(slots);
|
|
1947
2005
|
}
|
|
1948
2006
|
});
|
|
@@ -1963,12 +2021,14 @@ var freeDomWrapProps = {
|
|
|
1963
2021
|
default: 1
|
|
1964
2022
|
},
|
|
1965
2023
|
keyboard: Boolean,
|
|
2024
|
+
disabledBatch: Boolean,
|
|
1966
2025
|
handle: freeDomProps.handle,
|
|
1967
2026
|
minWidth: freeDomProps.minWidth,
|
|
1968
2027
|
minHeight: freeDomProps.minHeight,
|
|
1969
2028
|
lockAspectRatio: freeDomProps.lockAspectRatio,
|
|
1970
2029
|
disabledDrag: freeDomProps.disabledDrag,
|
|
1971
2030
|
disabledResize: freeDomProps.disabledResize,
|
|
2031
|
+
disabledSelect: freeDomProps.disabledSelect,
|
|
1972
2032
|
scale: freeDomProps.scale,
|
|
1973
2033
|
fixNonMonospaced: freeDomProps.fixNonMonospaced
|
|
1974
2034
|
};
|
|
@@ -2008,7 +2068,7 @@ var FreeDomWrap = defineComponent6({
|
|
|
2008
2068
|
});
|
|
2009
2069
|
});
|
|
2010
2070
|
const selecting = ref13(false);
|
|
2011
|
-
const mask = useMask(rectRef, nodes);
|
|
2071
|
+
const mask = useMask(rectRef, props, nodes);
|
|
2012
2072
|
function runCorrect() {
|
|
2013
2073
|
nodes.value.forEach((pos) => {
|
|
2014
2074
|
const { x, y, width: width2, height: height2 } = correct(pos.node._rect);
|
|
@@ -2019,8 +2079,9 @@ var FreeDomWrap = defineComponent6({
|
|
|
2019
2079
|
pos.node.trigger({ x, y, w: width2, h: height2 });
|
|
2020
2080
|
});
|
|
2021
2081
|
}
|
|
2022
|
-
function register(uuid, node) {
|
|
2082
|
+
function register(el, uuid, node) {
|
|
2023
2083
|
nodes.value.push({
|
|
2084
|
+
el,
|
|
2024
2085
|
uuid,
|
|
2025
2086
|
node
|
|
2026
2087
|
});
|
|
@@ -2103,14 +2164,11 @@ var FreeDomWrap = defineComponent6({
|
|
|
2103
2164
|
ref: "rectRef",
|
|
2104
2165
|
class: "vv-free-dom--scene"
|
|
2105
2166
|
},
|
|
2106
|
-
|
|
2167
|
+
{},
|
|
2168
|
+
{
|
|
2107
2169
|
onMousedown: this.mask.handleMousedown,
|
|
2108
2170
|
onMousemove: this.mask.handleMousemove
|
|
2109
|
-
}
|
|
2110
|
-
isVue26 ? {
|
|
2111
|
-
mousedown: this.mask.handleMousedown,
|
|
2112
|
-
mousemove: this.mask.handleMousemove
|
|
2113
|
-
} : {}
|
|
2171
|
+
}
|
|
2114
2172
|
)(slotList);
|
|
2115
2173
|
}
|
|
2116
2174
|
});
|