@sepveneto/free-dom 0.0.6

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/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # free-dom
2
+
3
+ [在线预览](https://sepveneto.github.io/free-dom/)
4
+
5
+ vue2/3通用的自由拖拽dom的组件
6
+
7
+ 支持独立使用和组合使用
8
+
9
+ 独立使用可以提供最基本的位置移动及缩放功能
10
+
11
+ 组合使用额外提供了拖拽区域的限制以及标线自动吸附功能
12
+
13
+ ## 使用
14
+
15
+ 1. 独立使用
16
+ vue2.6及以下
17
+ ```html
18
+ <template>
19
+ <free-dom
20
+ :custom-style.sync="style"
21
+ move
22
+ scale
23
+ >测试文本</free-dom>
24
+ </template>
25
+ <script>
26
+ import { freeDom } from 'free-dom'
27
+ import 'free-dom/dist/theme.css'
28
+ export default {
29
+ component: {
30
+ freeDom
31
+ },
32
+ data() {
33
+ return {
34
+ style: { transform: 'translate(50px, 50px)' }
35
+ }
36
+ }
37
+ }
38
+ </script>
39
+ ```
40
+
41
+ vue2.7及以上
42
+ ```html
43
+ <template>
44
+ <free-dom
45
+ v-model:custom-style="style"
46
+ move
47
+ scale
48
+ >测试文本</free-dom>
49
+ </template>
50
+ <script setup>
51
+ import { freeDom } from 'free-dom'
52
+ import 'free-dom/dist/theme.css'
53
+ import { ref } from 'vue'
54
+
55
+ const style = ref({ tranform: 'translate(50px, 50px)' })
56
+ </script>
57
+ ```
58
+
59
+ 2. 组合使用
60
+ vue2.6及以下
61
+ ```html
62
+ <template>
63
+ <free-scene style="width: 600px; height: 400px;" move scale>
64
+ <free-dom :custom-style.sync="style">测试文本</free-dom>
65
+ </free-scene>
66
+ </template>
67
+ <script>
68
+ import { freeDom, freeScene } from 'free-dom'
69
+ import 'free-dom/dist/theme.css'
70
+ export default {
71
+ components: {
72
+ freeDom,
73
+ freeScene,
74
+ },
75
+ data() {
76
+ return {
77
+ style: {}
78
+ }
79
+ }
80
+ }
81
+ </script>
82
+ ```
83
+
84
+ vue2.7及以上
85
+ ```html
86
+ <template>
87
+ <free-scene style="width: 600px; height: 400px;" move scale>
88
+ <free-dom v-model:custom-style="style">测试文本</free-dom>
89
+ </free-scene>
90
+ </template>
91
+ <script setup>
92
+ import { freeDom, freeScene } from 'free-dom'
93
+ import 'free-dom/dist/theme.css'
94
+ import { ref } from 'vue'
95
+
96
+ const style = ref({ tranform: 'translate(50px, 50px)' })
97
+ </script>
98
+ ```
99
+
100
+ ## 组件说明
101
+
102
+ ### FreeScene
103
+ | 属性 | 类型 | 默认值 | 说明 |
104
+ | ---- | ----- | --- | ----- |
105
+ | move | boolean | false | 是否允许移动 |
106
+ | scale | boolean,Array | false | 是否允许缩放,可以通过数组控制缩放的方向 |
107
+ | preview | boolean | false | 屏蔽移动和缩放操作 |
108
+ | diff | number | 3 | 自动吸附的像素距离 |
109
+
110
+ ### FreeDom
111
+ | 属性 | 类型 | 默认值 | 说明 |
112
+ | ---- | ----- | --- | ----- |
113
+ | custom-style | css properties | - | 通过`translate`,`width`,`height`控制dom的位置和大小 |
114
+ | limitWidth | number | - | 限制dom的可操作区域 |
115
+ | limitHeight | number | - | 限制dom的可操作区域 |
116
+ | move | boolean | false | 是否允许移动 |
117
+ | scale | boolean,Array | false | 是否允许缩放,可以通过数组控制缩放的方向 |
118
+ | preview | boolean | false | 屏蔽移动和缩放操作 |
119
+ | diff | number | 3 | 自动吸附的像素距离 |
120
+
121
+ | 事件 | 参数 | 说明 |
122
+ | --- | ---- | ---- |
123
+ | update:custom-style | css properties | 直接返回样式,不需要做转换 |
124
+ | select | \{ x: number, y: number, width: number, height: number \} | 当dom被选中时触发,参数包含相关的位置大小信息(`preview`时不会触发)
125
+
126
+ ## 注意事项
127
+
128
+ 1. `vue@2.6.14`及以下需要安装`@vue/composition-api`才可以正常使用
129
+ 2. `custom-style`本身就是一个样式,只不过组件会通过`transform`的`translate`以及`width`和`height`控制插槽内容的位置及大小
130
+ 3. 组合使用时,操作区域由`scene`决定,会自动忽略`limitHeight`和`limitWidth`
131
+ 4. `limitHeight`和`limitWidth`必须同时设置
132
+ 5. `preview`的优先级比其它操作属性要高
133
+ 6. 不同的`vue`版本双向绑定的语法糖不一样,具体可以参考上面的使用说明
package/dist/index.css ADDED
@@ -0,0 +1,51 @@
1
+ /* ../../../../../../tmp/tmp-25584-BFeSsuSa8BkS/core/src/style/index.css */
2
+ :root {
3
+ --free-dom-theme: #4089ef;
4
+ --free-dom-line: var(--free-dom-theme);
5
+ --free-dom-dot-border: var(--free-dom-theme);
6
+ --free-dom-line-border: var(--free-dom-theme);
7
+ --free-dom-dot-size: 10px;
8
+ }
9
+ .free-dom__line {
10
+ background: var(--free-dom-line-border);
11
+ position: absolute;
12
+ z-index: 1000;
13
+ }
14
+ .free-dom__xline {
15
+ left: 0;
16
+ width: 100%;
17
+ height: 1px;
18
+ }
19
+ .free-dom__yline {
20
+ top: 0;
21
+ width: 1px;
22
+ height: 100%;
23
+ }
24
+ .free-dom__widget-wrapper {
25
+ display: inline-block;
26
+ position: absolute;
27
+ border: 1px dashed transparent;
28
+ transition: border-color 0.3s;
29
+ box-sizing: content-box;
30
+ user-select: none;
31
+ }
32
+ .free-dom__widget-wrapper.is-active,
33
+ .free-dom__widget-wrapper.can-move:hover {
34
+ border: 1px dashed var(--free-dom-dot-border);
35
+ cursor: move;
36
+ }
37
+ .free-dom__widget-wrapper.is-active .free-dom__widget-dot,
38
+ .free-dom__widget-wrapper:hover .free-dom__widget-dot {
39
+ opacity: 1;
40
+ }
41
+ .free-dom__widget-dot {
42
+ opacity: 0;
43
+ position: absolute;
44
+ margin-left: calc(var(--free-dom-dot-size) / -2);
45
+ margin-top: calc(var(--free-dom-dot-size) / -2);
46
+ width: var(--free-dom-dot-size);
47
+ height: var(--free-dom-dot-size);
48
+ border-radius: 50%;
49
+ border: 1px solid var(--free-dom-dot-border);
50
+ background-color: var(--free-dom-dot-border);
51
+ }
@@ -0,0 +1,87 @@
1
+ import * as vue_demi from 'vue-demi';
2
+
3
+ declare const freeDom: vue_demi.DefineComponent<{
4
+ customStyle: {
5
+ type: vue_demi.PropType<Partial<vue_demi.CSSProperties>>;
6
+ required: true;
7
+ };
8
+ scale: {
9
+ type: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
10
+ default: undefined;
11
+ };
12
+ move: BooleanConstructor;
13
+ preview: BooleanConstructor;
14
+ limitWidth: {
15
+ type: NumberConstructor;
16
+ default: undefined;
17
+ };
18
+ limitHeight: {
19
+ type: NumberConstructor;
20
+ default: undefined;
21
+ };
22
+ }, {
23
+ widgetRef: vue_demi.ShallowRef<any>;
24
+ canMove: vue_demi.ComputedRef<boolean>;
25
+ wrapStyle: vue_demi.Ref<{
26
+ transition: string;
27
+ }>;
28
+ canScale: vue_demi.ComputedRef<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[] | undefined>;
29
+ dots: vue_demi.ComputedRef<readonly ["t", "r", "l", "b", "lt", "lb", "rt", "rb"] | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
30
+ active: vue_demi.Ref<boolean>;
31
+ getDotPos: (dot: string) => vue_demi.CSSProperties;
32
+ onMousedown: (evt: MouseEvent) => void;
33
+ onMousedownDot: (evt: MouseEvent, dot: string) => void;
34
+ }, unknown, {}, {}, vue_demi.ComponentOptionsMixin, vue_demi.ComponentOptionsMixin, ("update:customStyle" | "select")[], "update:customStyle" | "select", vue_demi.VNodeProps & vue_demi.AllowedComponentProps & vue_demi.ComponentCustomProps, Readonly<vue_demi.ExtractPropTypes<{
35
+ customStyle: {
36
+ type: vue_demi.PropType<Partial<vue_demi.CSSProperties>>;
37
+ required: true;
38
+ };
39
+ scale: {
40
+ type: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
41
+ default: undefined;
42
+ };
43
+ move: BooleanConstructor;
44
+ preview: BooleanConstructor;
45
+ limitWidth: {
46
+ type: NumberConstructor;
47
+ default: undefined;
48
+ };
49
+ limitHeight: {
50
+ type: NumberConstructor;
51
+ default: undefined;
52
+ };
53
+ }>> & {
54
+ "onUpdate:customStyle"?: ((...args: any[]) => any) | undefined;
55
+ onSelect?: ((...args: any[]) => any) | undefined;
56
+ }, {
57
+ scale: boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[];
58
+ move: boolean;
59
+ preview: boolean;
60
+ limitWidth: number;
61
+ limitHeight: number;
62
+ }>;
63
+ declare const freeScene: vue_demi.DefineComponent<{
64
+ preview: BooleanConstructor;
65
+ move: BooleanConstructor;
66
+ scale: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
67
+ diff: {
68
+ type: NumberConstructor;
69
+ default: number;
70
+ };
71
+ }, {
72
+ rectRef: vue_demi.ShallowRef<null>;
73
+ }, unknown, {}, {}, vue_demi.ComponentOptionsMixin, vue_demi.ComponentOptionsMixin, {}, string, vue_demi.VNodeProps & vue_demi.AllowedComponentProps & vue_demi.ComponentCustomProps, Readonly<vue_demi.ExtractPropTypes<{
74
+ preview: BooleanConstructor;
75
+ move: BooleanConstructor;
76
+ scale: vue_demi.PropType<boolean | ("t" | "r" | "l" | "b" | "lt" | "lb" | "rt" | "rb")[]>;
77
+ diff: {
78
+ type: NumberConstructor;
79
+ default: number;
80
+ };
81
+ }>>, {
82
+ move: boolean;
83
+ preview: boolean;
84
+ diff: number;
85
+ }>;
86
+
87
+ export { freeDom, freeScene };