@sepveneto/free-dom 0.2.0 → 0.4.0-beta.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-1770-kjBys2smNgfg/core/src/style/index.css */
1
+ /* ../../../../../../../tmp/tmp-1773-CH54J03asN0x/core/src/style/index.css */
2
2
  :root {
3
3
  --free-dom-theme: #4089ef;
4
4
  --free-dom-line: var(--free-dom-theme);
@@ -23,10 +23,12 @@
23
23
  }
24
24
  .free-dom__widget-wrapper {
25
25
  display: inline-block;
26
+ box-sizing: border-box;
26
27
  border: 1px dashed transparent;
27
28
  transition: border-color 0.3s;
28
29
  box-sizing: content-box;
29
30
  user-select: none;
31
+ overflow: hidden;
30
32
  }
31
33
  .free-dom__widget-wrapper.is-absolute {
32
34
  position: absolute;
package/dist/index.d.ts CHANGED
@@ -43,6 +43,10 @@ declare const freeDom: vue_demi.DefineComponent<{
43
43
  type: BooleanConstructor;
44
44
  default: undefined;
45
45
  };
46
+ grid: {
47
+ type: vue_demi.PropType<[number, number]>;
48
+ default: undefined;
49
+ };
46
50
  }, {
47
51
  widgetRef: vue_demi.ShallowRef<any>;
48
52
  canMove: vue_demi.ComputedRef<boolean>;
@@ -101,6 +105,10 @@ declare const freeDom: vue_demi.DefineComponent<{
101
105
  type: BooleanConstructor;
102
106
  default: undefined;
103
107
  };
108
+ grid: {
109
+ type: vue_demi.PropType<[number, number]>;
110
+ default: undefined;
111
+ };
104
112
  }>> & {
105
113
  "onUpdate:x"?: ((...args: any[]) => any) | undefined;
106
114
  "onUpdate:y"?: ((...args: any[]) => any) | undefined;
@@ -120,6 +128,7 @@ declare const freeDom: vue_demi.DefineComponent<{
120
128
  limitHeight: number;
121
129
  handler: "dot" | "mark";
122
130
  diagonal: boolean;
131
+ grid: [number, number];
123
132
  }>;
124
133
  declare const freeScene: vue_demi.DefineComponent<{
125
134
  absolute: {
@@ -141,6 +150,10 @@ declare const freeScene: vue_demi.DefineComponent<{
141
150
  type: BooleanConstructor;
142
151
  default: undefined;
143
152
  };
153
+ grid: {
154
+ type: vue_demi.PropType<[number, number]>;
155
+ default: undefined;
156
+ };
144
157
  }, {
145
158
  rectRef: vue_demi.ShallowRef<null>;
146
159
  }, unknown, {}, {}, vue_demi.ComponentOptionsMixin, vue_demi.ComponentOptionsMixin, {}, string, vue_demi.VNodeProps & vue_demi.AllowedComponentProps & vue_demi.ComponentCustomProps, Readonly<vue_demi.ExtractPropTypes<{
@@ -163,12 +176,17 @@ declare const freeScene: vue_demi.DefineComponent<{
163
176
  type: BooleanConstructor;
164
177
  default: undefined;
165
178
  };
179
+ grid: {
180
+ type: vue_demi.PropType<[number, number]>;
181
+ default: undefined;
182
+ };
166
183
  }>>, {
167
184
  absolute: boolean;
168
185
  move: boolean;
169
186
  preview: boolean;
170
187
  handler: "dot" | "mark";
171
188
  diagonal: boolean;
189
+ grid: [number, number];
172
190
  diff: number;
173
191
  }>;
174
192
 
package/dist/index.js CHANGED
@@ -85,10 +85,15 @@ var SceneToken = Symbol("Scene");
85
85
  function clamp(value, min, max = Infinity) {
86
86
  return Math.max(Math.min(value, max), min);
87
87
  }
88
+ function snapToGrid(grid, pendingX, pendingY) {
89
+ const x = Math.round(pendingX / grid[0]) * grid[0];
90
+ const y = Math.round(pendingY / grid[1]) * grid[1];
91
+ return [x, y];
92
+ }
88
93
 
89
94
  // src/hooks/use-resize.ts
90
95
  var MIN_SIZE = 20;
91
- function useResize(startX, startY, rect, dot, diagonal, callbacks) {
96
+ function useResize(startX, startY, rect, dot, diagonal, snapGrid, callbacks) {
92
97
  const isT = dot ? /t/.test(dot) : false;
93
98
  const isL = dot ? /l/.test(dot) : false;
94
99
  const isB = dot ? /b/.test(dot) : false;
@@ -97,8 +102,11 @@ function useResize(startX, startY, rect, dot, diagonal, callbacks) {
97
102
  const { width: cWidth, height: cHeight, x, y } = rect;
98
103
  const move = (mouseEvt) => {
99
104
  const { clientX, clientY } = mouseEvt;
100
- const deltaX = clientX - startX;
101
- const deltaY = clientY - startY;
105
+ let deltaX = clientX - startX;
106
+ let deltaY = clientY - startY;
107
+ if (Array.isArray(snapGrid)) {
108
+ [deltaX, deltaY] = snapToGrid(snapGrid, deltaX, deltaY);
109
+ }
102
110
  const rate = cWidth / cHeight;
103
111
  const newWidth = cWidth + (isL ? -deltaX : isR ? deltaX : 0);
104
112
  const newHeight = cHeight + (isT ? -deltaY : isB ? deltaY : 0);
@@ -177,6 +185,10 @@ var FreeDom = (0, import_vue_demi2.defineComponent)({
177
185
  diagonal: {
178
186
  type: Boolean,
179
187
  default: void 0
188
+ },
189
+ grid: {
190
+ type: Object,
191
+ default: void 0
180
192
  }
181
193
  },
182
194
  emits: ["update:x", "update:y", "update:width", "update:height", "select"],
@@ -188,6 +200,7 @@ var FreeDom = (0, import_vue_demi2.defineComponent)({
188
200
  const canMove = (0, import_vue_demi2.computed)(() => !_preview.value && (SceneContext?.move || props.move));
189
201
  const isAbsolute = (0, import_vue_demi2.computed)(() => props.absolute ?? SceneContext?.absolute ?? true);
190
202
  const handlerType = (0, import_vue_demi2.computed)(() => props.handler ?? SceneContext?.handler ?? "dot");
203
+ const snapGrid = (0, import_vue_demi2.computed)(() => props.grid ?? SceneContext?.grid);
191
204
  const diagonal = (0, import_vue_demi2.computed)(() => props.diagonal ?? SceneContext?.diagonal ?? true);
192
205
  const widgetRef = (0, import_vue_demi2.shallowRef)();
193
206
  const _style = (0, import_vue_demi2.ref)({});
@@ -263,7 +276,7 @@ var FreeDom = (0, import_vue_demi2.defineComponent)({
263
276
  isScale.value = true;
264
277
  active.value = true;
265
278
  const { clientX, clientY } = evt;
266
- useResize(clientX, clientY, _rect, dot, diagonal.value, {
279
+ useResize(clientX, clientY, _rect, dot, diagonal.value, snapGrid.value, {
267
280
  onMove() {
268
281
  if (!checkValid(_rect))
269
282
  return;
@@ -403,10 +416,25 @@ var FreeDom = (0, import_vue_demi2.defineComponent)({
403
416
  onMousedown: (evt) => this.onMousedownDot(evt, dot)
404
417
  });
405
418
  }) : null;
406
- const defaultSlot = typeof this.$slots.default === "function" ? this.$slots.default() : this.$slots.default;
419
+ const defaultSlots = typeof this.$slots.default === "function" ? this.$slots.default() : this.$slots.default;
420
+ if (!defaultSlots) {
421
+ console.error("[free-dom] must have a default slot");
422
+ return null;
423
+ }
424
+ if (defaultSlots.length > 1) {
425
+ console.error("[free-dom] must have only one default slot");
426
+ return null;
427
+ }
428
+ const defaultSlot = defaultSlots[0];
429
+ const node = (0, import_vue_demi2.cloneVNode)(defaultSlot);
430
+ if (Array.isArray(node.children)) {
431
+ node.children = [...node.children, ...dots];
432
+ } else {
433
+ console.error("[free-dom] generate resiable handles failed");
434
+ }
407
435
  if (import_vue_demi2.isVue2) {
408
436
  return (0, import_vue_demi2.h)(
409
- "section",
437
+ node,
410
438
  {
411
439
  class: [
412
440
  "free-dom__widget-wrapper",
@@ -420,12 +448,11 @@ var FreeDom = (0, import_vue_demi2.defineComponent)({
420
448
  on: {
421
449
  mousedown: this.onMousedown
422
450
  }
423
- },
424
- [dots, defaultSlot]
451
+ }
425
452
  );
426
453
  }
427
454
  return (0, import_vue_demi2.h)(
428
- "section",
455
+ node,
429
456
  {
430
457
  ref: "widgetRef",
431
458
  class: [
@@ -437,8 +464,7 @@ var FreeDom = (0, import_vue_demi2.defineComponent)({
437
464
  ],
438
465
  style: this.wrapStyle,
439
466
  onMousedown: this.onMousedown
440
- },
441
- [defaultSlot, dots]
467
+ }
442
468
  );
443
469
  }
444
470
  });
@@ -628,6 +654,10 @@ var freeDomWrapProps = {
628
654
  diagonal: {
629
655
  type: Boolean,
630
656
  default: void 0
657
+ },
658
+ grid: {
659
+ type: Object,
660
+ default: void 0
631
661
  }
632
662
  };
633
663
  var FreeDomWrap = (0, import_vue_demi4.defineComponent)({
package/dist/index.mjs CHANGED
@@ -17,7 +17,8 @@ import {
17
17
  reactive,
18
18
  isVue2,
19
19
  shallowRef,
20
- watchEffect
20
+ watchEffect,
21
+ cloneVNode
21
22
  } from "vue-demi";
22
23
 
23
24
  // src/hooks/use-normalize-style.ts
@@ -72,10 +73,15 @@ var SceneToken = Symbol("Scene");
72
73
  function clamp(value, min, max = Infinity) {
73
74
  return Math.max(Math.min(value, max), min);
74
75
  }
76
+ function snapToGrid(grid, pendingX, pendingY) {
77
+ const x = Math.round(pendingX / grid[0]) * grid[0];
78
+ const y = Math.round(pendingY / grid[1]) * grid[1];
79
+ return [x, y];
80
+ }
75
81
 
76
82
  // src/hooks/use-resize.ts
77
83
  var MIN_SIZE = 20;
78
- function useResize(startX, startY, rect, dot, diagonal, callbacks) {
84
+ function useResize(startX, startY, rect, dot, diagonal, snapGrid, callbacks) {
79
85
  const isT = dot ? /t/.test(dot) : false;
80
86
  const isL = dot ? /l/.test(dot) : false;
81
87
  const isB = dot ? /b/.test(dot) : false;
@@ -84,8 +90,11 @@ function useResize(startX, startY, rect, dot, diagonal, callbacks) {
84
90
  const { width: cWidth, height: cHeight, x, y } = rect;
85
91
  const move = (mouseEvt) => {
86
92
  const { clientX, clientY } = mouseEvt;
87
- const deltaX = clientX - startX;
88
- const deltaY = clientY - startY;
93
+ let deltaX = clientX - startX;
94
+ let deltaY = clientY - startY;
95
+ if (Array.isArray(snapGrid)) {
96
+ [deltaX, deltaY] = snapToGrid(snapGrid, deltaX, deltaY);
97
+ }
89
98
  const rate = cWidth / cHeight;
90
99
  const newWidth = cWidth + (isL ? -deltaX : isR ? deltaX : 0);
91
100
  const newHeight = cHeight + (isT ? -deltaY : isB ? deltaY : 0);
@@ -164,6 +173,10 @@ var FreeDom = defineComponent({
164
173
  diagonal: {
165
174
  type: Boolean,
166
175
  default: void 0
176
+ },
177
+ grid: {
178
+ type: Object,
179
+ default: void 0
167
180
  }
168
181
  },
169
182
  emits: ["update:x", "update:y", "update:width", "update:height", "select"],
@@ -175,6 +188,7 @@ var FreeDom = defineComponent({
175
188
  const canMove = computed(() => !_preview.value && (SceneContext?.move || props.move));
176
189
  const isAbsolute = computed(() => props.absolute ?? SceneContext?.absolute ?? true);
177
190
  const handlerType = computed(() => props.handler ?? SceneContext?.handler ?? "dot");
191
+ const snapGrid = computed(() => props.grid ?? SceneContext?.grid);
178
192
  const diagonal = computed(() => props.diagonal ?? SceneContext?.diagonal ?? true);
179
193
  const widgetRef = shallowRef();
180
194
  const _style = ref2({});
@@ -250,7 +264,7 @@ var FreeDom = defineComponent({
250
264
  isScale.value = true;
251
265
  active.value = true;
252
266
  const { clientX, clientY } = evt;
253
- useResize(clientX, clientY, _rect, dot, diagonal.value, {
267
+ useResize(clientX, clientY, _rect, dot, diagonal.value, snapGrid.value, {
254
268
  onMove() {
255
269
  if (!checkValid(_rect))
256
270
  return;
@@ -390,10 +404,25 @@ var FreeDom = defineComponent({
390
404
  onMousedown: (evt) => this.onMousedownDot(evt, dot)
391
405
  });
392
406
  }) : null;
393
- const defaultSlot = typeof this.$slots.default === "function" ? this.$slots.default() : this.$slots.default;
407
+ const defaultSlots = typeof this.$slots.default === "function" ? this.$slots.default() : this.$slots.default;
408
+ if (!defaultSlots) {
409
+ console.error("[free-dom] must have a default slot");
410
+ return null;
411
+ }
412
+ if (defaultSlots.length > 1) {
413
+ console.error("[free-dom] must have only one default slot");
414
+ return null;
415
+ }
416
+ const defaultSlot = defaultSlots[0];
417
+ const node = cloneVNode(defaultSlot);
418
+ if (Array.isArray(node.children)) {
419
+ node.children = [...node.children, ...dots];
420
+ } else {
421
+ console.error("[free-dom] generate resiable handles failed");
422
+ }
394
423
  if (isVue2) {
395
424
  return h(
396
- "section",
425
+ node,
397
426
  {
398
427
  class: [
399
428
  "free-dom__widget-wrapper",
@@ -407,12 +436,11 @@ var FreeDom = defineComponent({
407
436
  on: {
408
437
  mousedown: this.onMousedown
409
438
  }
410
- },
411
- [dots, defaultSlot]
439
+ }
412
440
  );
413
441
  }
414
442
  return h(
415
- "section",
443
+ node,
416
444
  {
417
445
  ref: "widgetRef",
418
446
  class: [
@@ -424,8 +452,7 @@ var FreeDom = defineComponent({
424
452
  ],
425
453
  style: this.wrapStyle,
426
454
  onMousedown: this.onMousedown
427
- },
428
- [defaultSlot, dots]
455
+ }
429
456
  );
430
457
  }
431
458
  });
@@ -615,6 +642,10 @@ var freeDomWrapProps = {
615
642
  diagonal: {
616
643
  type: Boolean,
617
644
  default: void 0
645
+ },
646
+ grid: {
647
+ type: Object,
648
+ default: void 0
618
649
  }
619
650
  };
620
651
  var FreeDomWrap = defineComponent3({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sepveneto/free-dom",
3
- "version": "0.2.0",
3
+ "version": "0.4.0-beta.0",
4
4
  "description": "",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -15,6 +15,12 @@
15
15
  },
16
16
  "./css": "./dist/index.css"
17
17
  },
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "vue-demi-switch 3 && vitepress dev docs",
21
+ "release": "bumpp package.json --commit --push --tag",
22
+ "test": "vitest"
23
+ },
18
24
  "keywords": [],
19
25
  "author": "",
20
26
  "license": "ISC",
@@ -35,11 +41,5 @@
35
41
  "repository": {
36
42
  "type": "git",
37
43
  "url": "https://github.com/SepVeneto/free-dom"
38
- },
39
- "scripts": {
40
- "build": "tsup",
41
- "dev": "vue-demi-switch 3 && vitepress dev docs",
42
- "release": "bumpp package.json --commit --push --tag",
43
- "test": "vitest"
44
44
  }
45
- }
45
+ }