@sepveneto/free-dom 0.7.3 → 0.8.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.
package/dist/index.css CHANGED
@@ -1,4 +1,4 @@
1
- /* ../../../../../../../tmp/tmp-1856-S6Jzdx5ptFBo/core/src/style/index.css */
1
+ /* ../../../../../../../tmp/tmp-1883-O1p5mboxRMKz/core/src/style/index.css */
2
2
  :root {
3
3
  --vv-free-dom--theme: #4089ef;
4
4
  --vv-free-dom--line: var(--vv-free-dom--theme);
package/dist/index.d.ts CHANGED
@@ -113,6 +113,10 @@ declare const FreeScene: vue_demi.DefineComponent<{
113
113
  type: BooleanConstructor;
114
114
  default: boolean;
115
115
  };
116
+ handle: {
117
+ type: StringConstructor;
118
+ default: undefined;
119
+ };
116
120
  minWidth: {
117
121
  type: NumberConstructor;
118
122
  default: number;
@@ -155,6 +159,10 @@ declare const FreeScene: vue_demi.DefineComponent<{
155
159
  type: BooleanConstructor;
156
160
  default: boolean;
157
161
  };
162
+ handle: {
163
+ type: StringConstructor;
164
+ default: undefined;
165
+ };
158
166
  minWidth: {
159
167
  type: NumberConstructor;
160
168
  default: number;
@@ -176,6 +184,7 @@ declare const FreeScene: vue_demi.DefineComponent<{
176
184
  height: number;
177
185
  diff: number;
178
186
  showLine: boolean;
187
+ handle: string;
179
188
  minWidth: number;
180
189
  minHeight: number;
181
190
  lockAspectRatio: boolean;
@@ -341,6 +350,10 @@ declare const FreeDom: vue_demi.DefineComponent<{
341
350
  type: NumberConstructor;
342
351
  default: undefined;
343
352
  };
353
+ handle: {
354
+ type: StringConstructor;
355
+ default: undefined;
356
+ };
344
357
  lockAspectRatio: BooleanConstructor;
345
358
  dragStartFn: {
346
359
  type: vue_demi.PropType<CoreFnCallback>;
@@ -350,7 +363,7 @@ declare const FreeDom: vue_demi.DefineComponent<{
350
363
  type: vue_demi.PropType<CoreFnCallback>;
351
364
  default: () => void;
352
365
  };
353
- dargFn: {
366
+ dragFn: {
354
367
  type: vue_demi.PropType<CoreFnCallback>;
355
368
  default: () => void;
356
369
  };
@@ -538,6 +551,7 @@ declare const FreeDom: vue_demi.DefineComponent<{
538
551
  }>;
539
552
  onDragStop: CoreFnCallback;
540
553
  onDrag: CoreFnCallback;
554
+ onDragStart: CoreFnCallback;
541
555
  resizeNode: () => vue_demi.VNode<vue_demi.RendererNode, vue_demi.RendererElement, {
542
556
  [key: string]: any;
543
557
  }>;
@@ -568,6 +582,10 @@ declare const FreeDom: vue_demi.DefineComponent<{
568
582
  type: NumberConstructor;
569
583
  default: undefined;
570
584
  };
585
+ handle: {
586
+ type: StringConstructor;
587
+ default: undefined;
588
+ };
571
589
  lockAspectRatio: BooleanConstructor;
572
590
  dragStartFn: {
573
591
  type: vue_demi.PropType<CoreFnCallback>;
@@ -577,7 +595,7 @@ declare const FreeDom: vue_demi.DefineComponent<{
577
595
  type: vue_demi.PropType<CoreFnCallback>;
578
596
  default: () => void;
579
597
  };
580
- dargFn: {
598
+ dragFn: {
581
599
  type: vue_demi.PropType<CoreFnCallback>;
582
600
  default: () => void;
583
601
  };
@@ -621,8 +639,10 @@ declare const FreeDom: vue_demi.DefineComponent<{
621
639
  }, {
622
640
  x: number;
623
641
  y: number;
642
+ dragFn: CoreFnCallback;
624
643
  width: number;
625
644
  height: number;
645
+ handle: string;
626
646
  minWidth: number;
627
647
  minHeight: number;
628
648
  lockAspectRatio: boolean;
@@ -638,11 +658,159 @@ declare const FreeDom: vue_demi.DefineComponent<{
638
658
  }>;
639
659
  dragStartFn: CoreFnCallback;
640
660
  dragStopFn: CoreFnCallback;
641
- dargFn: CoreFnCallback;
642
661
  resizeStartFn: (evt: MouseEvent, resizeData: ResizeData) => void;
643
662
  resizeFn: (evt: MouseEvent, resizeData: ResizeData) => void;
644
663
  resizeStopFn: (evt: MouseEvent, resizeData: ResizeData) => void;
645
664
  autoSize: boolean;
646
665
  }, {}>;
666
+ declare const FreeDomCore: vue_demi.DefineComponent<{
667
+ userSelectHack: {
668
+ type: BooleanConstructor;
669
+ default: boolean;
670
+ };
671
+ startFn: {
672
+ type: vue_demi.PropType<CoreFnCallback>;
673
+ default: () => void;
674
+ };
675
+ stopFn: {
676
+ type: vue_demi.PropType<CoreFnCallback>;
677
+ default: () => void;
678
+ };
679
+ dragFn: {
680
+ type: vue_demi.PropType<CoreFnCallback>;
681
+ default: () => void;
682
+ };
683
+ disabled: BooleanConstructor;
684
+ }, {
685
+ only: vue_demi.ComputedRef<vue_demi.VNode<vue_demi.RendererNode, vue_demi.RendererElement, {
686
+ [key: string]: any;
687
+ }> | undefined>;
688
+ coreRef: vue_demi.Ref<any>;
689
+ mousedownFn: (evt: MouseEvent) => void;
690
+ mouseupFn: (evt: MouseEvent) => void;
691
+ }, unknown, {}, {}, vue_demi.ComponentOptionsMixin, vue_demi.ComponentOptionsMixin, {}, string, vue_demi.VNodeProps & vue_demi.AllowedComponentProps & vue_demi.ComponentCustomProps, Readonly<vue_demi.ExtractPropTypes<{
692
+ userSelectHack: {
693
+ type: BooleanConstructor;
694
+ default: boolean;
695
+ };
696
+ startFn: {
697
+ type: vue_demi.PropType<CoreFnCallback>;
698
+ default: () => void;
699
+ };
700
+ stopFn: {
701
+ type: vue_demi.PropType<CoreFnCallback>;
702
+ default: () => void;
703
+ };
704
+ dragFn: {
705
+ type: vue_demi.PropType<CoreFnCallback>;
706
+ default: () => void;
707
+ };
708
+ disabled: BooleanConstructor;
709
+ }>>, {
710
+ userSelectHack: boolean;
711
+ startFn: CoreFnCallback;
712
+ stopFn: CoreFnCallback;
713
+ dragFn: CoreFnCallback;
714
+ disabled: boolean;
715
+ }, {}>;
716
+ declare const ResizeDomCore: vue_demi.DefineComponent<{
717
+ dragOpts: {
718
+ type: vue_demi.PropType<Partial<FreeDomCoreProps>>;
719
+ default: () => {};
720
+ };
721
+ width: {
722
+ type: NumberConstructor;
723
+ default: number;
724
+ };
725
+ height: {
726
+ type: NumberConstructor;
727
+ default: number;
728
+ };
729
+ scale: {
730
+ type: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
731
+ default: undefined;
732
+ };
733
+ startFn: {
734
+ type: vue_demi.PropType<ResizeFnCallback>;
735
+ default: () => void;
736
+ };
737
+ stopFn: {
738
+ type: vue_demi.PropType<ResizeFnCallback>;
739
+ default: () => void;
740
+ };
741
+ resizeFn: {
742
+ type: vue_demi.PropType<ResizeFnCallback>;
743
+ default: () => void;
744
+ };
745
+ minWidth: {
746
+ type: NumberConstructor;
747
+ default: number;
748
+ };
749
+ minHeight: {
750
+ type: NumberConstructor;
751
+ default: number;
752
+ };
753
+ lockAspectRatio: BooleanConstructor;
754
+ }, {
755
+ dots: vue_demi.ComputedRef<readonly ["t", "r", "l", "b", "lt", "lb", "rt", "rb"] | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
756
+ children: vue_demi.ComputedRef<vue_demi.VNode<vue_demi.RendererNode, vue_demi.RendererElement, {
757
+ [key: string]: any;
758
+ }>[] | undefined>;
759
+ handleResize: (handleName: "resize" | "start" | "stop", axis: "t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb") => CoreFnCallback;
760
+ renderResizehandler: (axis: "t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb") => (() => vue_demi.VNode<vue_demi.RendererNode, vue_demi.RendererElement, {
761
+ [key: string]: any;
762
+ }>) | (() => vue_demi.VNode<vue_demi.RendererNode, vue_demi.RendererElement, {
763
+ [key: string]: any;
764
+ }>[] | undefined);
765
+ }, unknown, {}, {}, vue_demi.ComponentOptionsMixin, vue_demi.ComponentOptionsMixin, {}, string, vue_demi.VNodeProps & vue_demi.AllowedComponentProps & vue_demi.ComponentCustomProps, Readonly<vue_demi.ExtractPropTypes<{
766
+ dragOpts: {
767
+ type: vue_demi.PropType<Partial<FreeDomCoreProps>>;
768
+ default: () => {};
769
+ };
770
+ width: {
771
+ type: NumberConstructor;
772
+ default: number;
773
+ };
774
+ height: {
775
+ type: NumberConstructor;
776
+ default: number;
777
+ };
778
+ scale: {
779
+ type: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
780
+ default: undefined;
781
+ };
782
+ startFn: {
783
+ type: vue_demi.PropType<ResizeFnCallback>;
784
+ default: () => void;
785
+ };
786
+ stopFn: {
787
+ type: vue_demi.PropType<ResizeFnCallback>;
788
+ default: () => void;
789
+ };
790
+ resizeFn: {
791
+ type: vue_demi.PropType<ResizeFnCallback>;
792
+ default: () => void;
793
+ };
794
+ minWidth: {
795
+ type: NumberConstructor;
796
+ default: number;
797
+ };
798
+ minHeight: {
799
+ type: NumberConstructor;
800
+ default: number;
801
+ };
802
+ lockAspectRatio: BooleanConstructor;
803
+ }>>, {
804
+ startFn: ResizeFnCallback;
805
+ stopFn: ResizeFnCallback;
806
+ width: number;
807
+ height: number;
808
+ minWidth: number;
809
+ minHeight: number;
810
+ lockAspectRatio: boolean;
811
+ scale: boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[];
812
+ resizeFn: ResizeFnCallback;
813
+ dragOpts: Partial<FreeDomCoreProps>;
814
+ }, {}>;
647
815
 
648
- export { FreeDom, FreeScene, GridLayout };
816
+ export { FreeDom, FreeDomCore, FreeScene, GridLayout, ResizeDomCore };
package/dist/index.js CHANGED
@@ -21,8 +21,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  FreeDom: () => FreeDom,
24
+ FreeDomCore: () => FreeDomCore,
24
25
  FreeScene: () => FreeScene,
25
- GridLayout: () => GridLayout2
26
+ GridLayout: () => GridLayout2,
27
+ ResizeDomCore: () => ResizeDomCore
26
28
  });
27
29
  module.exports = __toCommonJS(src_exports);
28
30
 
@@ -312,12 +314,15 @@ function useDraggableData(props) {
312
314
  (0, import_vue_demi6.watchEffect)(() => {
313
315
  y.value = props.y || props.modelValue.y || 0;
314
316
  });
317
+ const handleDragStart = (evt, data) => {
318
+ props.dragStartFn(evt, data);
319
+ };
315
320
  const handleDrag = (evt, data) => {
316
321
  x.value = data.x;
317
322
  y.value = data.y;
318
323
  deltaX.value = data.deltaX;
319
324
  deltaY.value = data.deltaY;
320
- props.dargFn(evt, data);
325
+ props.dragFn(evt, data);
321
326
  };
322
327
  const handleDragStop = (evt, coreData) => {
323
328
  const data = dragData.value = create(coreData);
@@ -340,6 +345,7 @@ function useDraggableData(props) {
340
345
  deltaX,
341
346
  deltaY,
342
347
  create,
348
+ handleDragStart,
343
349
  handleDrag,
344
350
  handleDragStop
345
351
  };
@@ -351,6 +357,7 @@ var id = 0;
351
357
  function useSceneContext(context, props) {
352
358
  const SceneContext = (0, import_vue_demi7.inject)(SceneToken, void 0);
353
359
  const uuid = id++;
360
+ const handle = (0, import_vue_demi7.computed)(() => SceneContext?.handle || props.handle);
354
361
  const lockAspectRatio = (0, import_vue_demi7.computed)(() => SceneContext?.lockAspectRatio || props.lockAspectRatio);
355
362
  const minWidth = (0, import_vue_demi7.computed)(() => SceneContext?.minWidth || props.minWidth);
356
363
  const minHeight = (0, import_vue_demi7.computed)(() => SceneContext?.minHeight || props.minHeight);
@@ -374,6 +381,7 @@ function useSceneContext(context, props) {
374
381
  width: SceneContext?.width,
375
382
  height: SceneContext?.height,
376
383
  scale,
384
+ handle,
377
385
  lockAspectRatio,
378
386
  minWidth,
379
387
  minHeight,
@@ -1147,6 +1155,10 @@ var freeDomProps = {
1147
1155
  type: Number,
1148
1156
  default: void 0
1149
1157
  },
1158
+ handle: {
1159
+ type: String,
1160
+ default: void 0
1161
+ },
1150
1162
  lockAspectRatio: Boolean,
1151
1163
  dragStartFn: {
1152
1164
  type: Function,
@@ -1156,7 +1168,7 @@ var freeDomProps = {
1156
1168
  type: Function,
1157
1169
  default: noop3
1158
1170
  },
1159
- dargFn: {
1171
+ dragFn: {
1160
1172
  type: Function,
1161
1173
  default: noop3
1162
1174
  },
@@ -1201,6 +1213,7 @@ var freeDom = (0, import_vue_demi13.defineComponent)({
1201
1213
  deltaX,
1202
1214
  deltaY,
1203
1215
  create,
1216
+ handleDragStart,
1204
1217
  handleDrag,
1205
1218
  handleDragStop
1206
1219
  } = useDraggableData(props);
@@ -1225,6 +1238,7 @@ var freeDom = (0, import_vue_demi13.defineComponent)({
1225
1238
  sceneContext.minHeight.value
1226
1239
  );
1227
1240
  };
1241
+ const canDrag = (0, import_vue_demi13.ref)(false);
1228
1242
  (0, import_vue_demi13.onMounted)(() => {
1229
1243
  props.autoSize && syncSize();
1230
1244
  });
@@ -1235,6 +1249,8 @@ var freeDom = (0, import_vue_demi13.defineComponent)({
1235
1249
  transform: `translate(${x.value}px, ${y.value}px)`
1236
1250
  }));
1237
1251
  const onDrag = (evt, coreData) => {
1252
+ if (!canDrag.value)
1253
+ return;
1238
1254
  const data = create(coreData);
1239
1255
  const newPos = {
1240
1256
  x: data.x,
@@ -1249,6 +1265,8 @@ var freeDom = (0, import_vue_demi13.defineComponent)({
1249
1265
  sceneContext.emit("move");
1250
1266
  };
1251
1267
  const onDragStop = (evt, coreData) => {
1268
+ if (!canDrag.value)
1269
+ return;
1252
1270
  const newPos = {
1253
1271
  x: x.value,
1254
1272
  y: y.value,
@@ -1266,6 +1284,22 @@ var freeDom = (0, import_vue_demi13.defineComponent)({
1266
1284
  emit("update:y", y.value);
1267
1285
  emit("update:modelValue", { x: x.value, y: y.value, w: width.value, h: height.value });
1268
1286
  };
1287
+ const onDragStart = (evt, coreData) => {
1288
+ const handle = sceneContext.handle.value;
1289
+ if (handle) {
1290
+ if (handle.startsWith(".")) {
1291
+ canDrag.value = evt.target.classList.contains(handle.slice(1));
1292
+ } else if (handle.startsWith("#")) {
1293
+ canDrag.value = evt.target.id === handle.slice(1);
1294
+ } else {
1295
+ console.warn(`[free-dom] can not find element with ${handle}`);
1296
+ canDrag.value = true;
1297
+ }
1298
+ } else {
1299
+ canDrag.value = true;
1300
+ }
1301
+ canDrag.value && handleDragStart(evt, coreData);
1302
+ };
1269
1303
  const onResize = (evt, { node, width: w, height: h5, handle: axis }) => {
1270
1304
  const offsetW = -(w - width.value);
1271
1305
  const offsetH = -(h5 - height.value);
@@ -1289,23 +1323,28 @@ var freeDom = (0, import_vue_demi13.defineComponent)({
1289
1323
  props.resizeFn(evt, { node, width: w, height: h5, handle: axis });
1290
1324
  sceneContext?.emit("move");
1291
1325
  };
1292
- const onResizeStop = () => {
1326
+ const onResizeStop = (evt, data) => {
1293
1327
  const isValid = sceneContext.check?.({ x: x.value, y: y.value, width: width.value, height: height.value });
1294
1328
  if (!isValid) {
1295
1329
  x.value = clamp(x.value, 0, sceneContext.width);
1296
1330
  y.value = clamp(y.value, 0, sceneContext.height);
1297
1331
  }
1332
+ props.resizeStopFn(evt, data);
1298
1333
  emit("update:width", width.value);
1299
1334
  emit("update:height", height.value);
1300
1335
  emit("update:modelValue", { x: x.value, y: y.value, w: width.value, h: height.value });
1301
1336
  sceneContext.emit("moveup");
1302
1337
  };
1338
+ const onResizeStart = (evt, data) => {
1339
+ props.resizeStartFn(evt, data);
1340
+ };
1303
1341
  const resizeNode = () => {
1304
1342
  const props2 = {
1305
1343
  width: width.value,
1306
1344
  height: height.value,
1307
1345
  lockAspectRatio: sceneContext.lockAspectRatio.value,
1308
1346
  dragOpts: { disabled: sceneContext.disabledResize.value },
1347
+ startFn: onResizeStart,
1309
1348
  resizeFn: onResize,
1310
1349
  stopFn: onResizeStop,
1311
1350
  minHeight: sceneContext.minHeight.value,
@@ -1322,12 +1361,14 @@ var freeDom = (0, import_vue_demi13.defineComponent)({
1322
1361
  style,
1323
1362
  onDragStop,
1324
1363
  onDrag,
1364
+ onDragStart,
1325
1365
  resizeNode,
1326
1366
  disabled: sceneContext.disabledDrag
1327
1367
  };
1328
1368
  },
1329
1369
  render() {
1330
1370
  const props = {
1371
+ startFn: this.onDragStart,
1331
1372
  stopFn: this.onDragStop,
1332
1373
  dragFn: this.onDrag,
1333
1374
  disabled: this.disabled
@@ -1364,6 +1405,7 @@ var freeDomWrapProps = {
1364
1405
  type: Boolean,
1365
1406
  default: true
1366
1407
  },
1408
+ handle: freeDomProps.handle,
1367
1409
  minWidth: freeDomProps.minWidth,
1368
1410
  minHeight: freeDomProps.minHeight,
1369
1411
  lockAspectRatio: freeDomProps.lockAspectRatio,
@@ -1745,9 +1787,13 @@ var gridLayout_default = GridLayout;
1745
1787
  var FreeScene = FreeDomWrap;
1746
1788
  var GridLayout2 = gridLayout_default;
1747
1789
  var FreeDom = freeDom_default;
1790
+ var FreeDomCore = freeDomCore_default;
1791
+ var ResizeDomCore = resizeDomCore_default;
1748
1792
  // Annotate the CommonJS export names for ESM import in node:
1749
1793
  0 && (module.exports = {
1750
1794
  FreeDom,
1795
+ FreeDomCore,
1751
1796
  FreeScene,
1752
- GridLayout
1797
+ GridLayout,
1798
+ ResizeDomCore
1753
1799
  });
package/dist/index.mjs CHANGED
@@ -284,12 +284,15 @@ function useDraggableData(props) {
284
284
  watchEffect(() => {
285
285
  y.value = props.y || props.modelValue.y || 0;
286
286
  });
287
+ const handleDragStart = (evt, data) => {
288
+ props.dragStartFn(evt, data);
289
+ };
287
290
  const handleDrag = (evt, data) => {
288
291
  x.value = data.x;
289
292
  y.value = data.y;
290
293
  deltaX.value = data.deltaX;
291
294
  deltaY.value = data.deltaY;
292
- props.dargFn(evt, data);
295
+ props.dragFn(evt, data);
293
296
  };
294
297
  const handleDragStop = (evt, coreData) => {
295
298
  const data = dragData.value = create(coreData);
@@ -312,6 +315,7 @@ function useDraggableData(props) {
312
315
  deltaX,
313
316
  deltaY,
314
317
  create,
318
+ handleDragStart,
315
319
  handleDrag,
316
320
  handleDragStop
317
321
  };
@@ -323,6 +327,7 @@ var id = 0;
323
327
  function useSceneContext(context, props) {
324
328
  const SceneContext = inject2(SceneToken, void 0);
325
329
  const uuid = id++;
330
+ const handle = computed2(() => SceneContext?.handle || props.handle);
326
331
  const lockAspectRatio = computed2(() => SceneContext?.lockAspectRatio || props.lockAspectRatio);
327
332
  const minWidth = computed2(() => SceneContext?.minWidth || props.minWidth);
328
333
  const minHeight = computed2(() => SceneContext?.minHeight || props.minHeight);
@@ -346,6 +351,7 @@ function useSceneContext(context, props) {
346
351
  width: SceneContext?.width,
347
352
  height: SceneContext?.height,
348
353
  scale,
354
+ handle,
349
355
  lockAspectRatio,
350
356
  minWidth,
351
357
  minHeight,
@@ -1119,6 +1125,10 @@ var freeDomProps = {
1119
1125
  type: Number,
1120
1126
  default: void 0
1121
1127
  },
1128
+ handle: {
1129
+ type: String,
1130
+ default: void 0
1131
+ },
1122
1132
  lockAspectRatio: Boolean,
1123
1133
  dragStartFn: {
1124
1134
  type: Function,
@@ -1128,7 +1138,7 @@ var freeDomProps = {
1128
1138
  type: Function,
1129
1139
  default: noop3
1130
1140
  },
1131
- dargFn: {
1141
+ dragFn: {
1132
1142
  type: Function,
1133
1143
  default: noop3
1134
1144
  },
@@ -1173,6 +1183,7 @@ var freeDom = defineComponent4({
1173
1183
  deltaX,
1174
1184
  deltaY,
1175
1185
  create,
1186
+ handleDragStart,
1176
1187
  handleDrag,
1177
1188
  handleDragStop
1178
1189
  } = useDraggableData(props);
@@ -1197,6 +1208,7 @@ var freeDom = defineComponent4({
1197
1208
  sceneContext.minHeight.value
1198
1209
  );
1199
1210
  };
1211
+ const canDrag = ref9(false);
1200
1212
  onMounted2(() => {
1201
1213
  props.autoSize && syncSize();
1202
1214
  });
@@ -1207,6 +1219,8 @@ var freeDom = defineComponent4({
1207
1219
  transform: `translate(${x.value}px, ${y.value}px)`
1208
1220
  }));
1209
1221
  const onDrag = (evt, coreData) => {
1222
+ if (!canDrag.value)
1223
+ return;
1210
1224
  const data = create(coreData);
1211
1225
  const newPos = {
1212
1226
  x: data.x,
@@ -1221,6 +1235,8 @@ var freeDom = defineComponent4({
1221
1235
  sceneContext.emit("move");
1222
1236
  };
1223
1237
  const onDragStop = (evt, coreData) => {
1238
+ if (!canDrag.value)
1239
+ return;
1224
1240
  const newPos = {
1225
1241
  x: x.value,
1226
1242
  y: y.value,
@@ -1238,6 +1254,22 @@ var freeDom = defineComponent4({
1238
1254
  emit("update:y", y.value);
1239
1255
  emit("update:modelValue", { x: x.value, y: y.value, w: width.value, h: height.value });
1240
1256
  };
1257
+ const onDragStart = (evt, coreData) => {
1258
+ const handle = sceneContext.handle.value;
1259
+ if (handle) {
1260
+ if (handle.startsWith(".")) {
1261
+ canDrag.value = evt.target.classList.contains(handle.slice(1));
1262
+ } else if (handle.startsWith("#")) {
1263
+ canDrag.value = evt.target.id === handle.slice(1);
1264
+ } else {
1265
+ console.warn(`[free-dom] can not find element with ${handle}`);
1266
+ canDrag.value = true;
1267
+ }
1268
+ } else {
1269
+ canDrag.value = true;
1270
+ }
1271
+ canDrag.value && handleDragStart(evt, coreData);
1272
+ };
1241
1273
  const onResize = (evt, { node, width: w, height: h5, handle: axis }) => {
1242
1274
  const offsetW = -(w - width.value);
1243
1275
  const offsetH = -(h5 - height.value);
@@ -1261,23 +1293,28 @@ var freeDom = defineComponent4({
1261
1293
  props.resizeFn(evt, { node, width: w, height: h5, handle: axis });
1262
1294
  sceneContext?.emit("move");
1263
1295
  };
1264
- const onResizeStop = () => {
1296
+ const onResizeStop = (evt, data) => {
1265
1297
  const isValid = sceneContext.check?.({ x: x.value, y: y.value, width: width.value, height: height.value });
1266
1298
  if (!isValid) {
1267
1299
  x.value = clamp(x.value, 0, sceneContext.width);
1268
1300
  y.value = clamp(y.value, 0, sceneContext.height);
1269
1301
  }
1302
+ props.resizeStopFn(evt, data);
1270
1303
  emit("update:width", width.value);
1271
1304
  emit("update:height", height.value);
1272
1305
  emit("update:modelValue", { x: x.value, y: y.value, w: width.value, h: height.value });
1273
1306
  sceneContext.emit("moveup");
1274
1307
  };
1308
+ const onResizeStart = (evt, data) => {
1309
+ props.resizeStartFn(evt, data);
1310
+ };
1275
1311
  const resizeNode = () => {
1276
1312
  const props2 = {
1277
1313
  width: width.value,
1278
1314
  height: height.value,
1279
1315
  lockAspectRatio: sceneContext.lockAspectRatio.value,
1280
1316
  dragOpts: { disabled: sceneContext.disabledResize.value },
1317
+ startFn: onResizeStart,
1281
1318
  resizeFn: onResize,
1282
1319
  stopFn: onResizeStop,
1283
1320
  minHeight: sceneContext.minHeight.value,
@@ -1294,12 +1331,14 @@ var freeDom = defineComponent4({
1294
1331
  style,
1295
1332
  onDragStop,
1296
1333
  onDrag,
1334
+ onDragStart,
1297
1335
  resizeNode,
1298
1336
  disabled: sceneContext.disabledDrag
1299
1337
  };
1300
1338
  },
1301
1339
  render() {
1302
1340
  const props = {
1341
+ startFn: this.onDragStart,
1303
1342
  stopFn: this.onDragStop,
1304
1343
  dragFn: this.onDrag,
1305
1344
  disabled: this.disabled
@@ -1336,6 +1375,7 @@ var freeDomWrapProps = {
1336
1375
  type: Boolean,
1337
1376
  default: true
1338
1377
  },
1378
+ handle: freeDomProps.handle,
1339
1379
  minWidth: freeDomProps.minWidth,
1340
1380
  minHeight: freeDomProps.minHeight,
1341
1381
  lockAspectRatio: freeDomProps.lockAspectRatio,
@@ -1717,8 +1757,12 @@ var gridLayout_default = GridLayout;
1717
1757
  var FreeScene = FreeDomWrap;
1718
1758
  var GridLayout2 = gridLayout_default;
1719
1759
  var FreeDom = freeDom_default;
1760
+ var FreeDomCore = freeDomCore_default;
1761
+ var ResizeDomCore = resizeDomCore_default;
1720
1762
  export {
1721
1763
  FreeDom,
1764
+ FreeDomCore,
1722
1765
  FreeScene,
1723
- GridLayout2 as GridLayout
1766
+ GridLayout2 as GridLayout,
1767
+ ResizeDomCore
1724
1768
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sepveneto/free-dom",
3
- "version": "0.7.3",
3
+ "version": "0.8.0",
4
4
  "description": "",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",