@ibiz-template/vue3-util 0.7.41-alpha.2 → 0.7.41-alpha.21

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.
Files changed (128) hide show
  1. package/dist/index.min.css +1 -1
  2. package/dist/index.system.min.js +1 -1
  3. package/es/common/badge/badge.css +1 -1
  4. package/es/common/control-base/control-base.css +1 -1
  5. package/es/common/control-base/control-base.d.ts +1 -0
  6. package/es/common/control-base/control-base.d.ts.map +1 -1
  7. package/es/common/control-base/control-base.mjs +38 -4
  8. package/es/common/custom-render/custom-render.d.ts.map +1 -1
  9. package/es/common/custom-render/custom-render.mjs +2 -2
  10. package/es/common/index.d.ts +1 -0
  11. package/es/common/index.d.ts.map +1 -1
  12. package/es/common/index.mjs +1 -0
  13. package/es/common/signature-pad/signature-pad.css +1 -0
  14. package/es/common/signature-pad/signature-pad.d.ts +19 -0
  15. package/es/common/signature-pad/signature-pad.d.ts.map +1 -0
  16. package/es/common/signature-pad/signature-pad.mjs +165 -0
  17. package/es/common/signature-pad/util/bezier.d.ts +58 -0
  18. package/es/common/signature-pad/util/bezier.d.ts.map +1 -0
  19. package/es/common/signature-pad/util/bezier.mjs +109 -0
  20. package/es/common/signature-pad/util/point.d.ts +55 -0
  21. package/es/common/signature-pad/util/point.d.ts.map +1 -0
  22. package/es/common/signature-pad/util/point.mjs +51 -0
  23. package/es/common/signature-pad/util/signature_pad.d.ts +593 -0
  24. package/es/common/signature-pad/util/signature_pad.d.ts.map +1 -0
  25. package/es/common/signature-pad/util/signature_pad.mjs +1018 -0
  26. package/es/common/view-shell/view-shell.d.ts +8 -1
  27. package/es/common/view-shell/view-shell.d.ts.map +1 -1
  28. package/es/common/view-shell/view-shell.mjs +13 -2
  29. package/es/control/panel/panel/panel.d.ts.map +1 -1
  30. package/es/control/panel/panel/panel.mjs +12 -1
  31. package/es/control/panel/view-layout-panel/view-layout-panel.d.ts +1 -1
  32. package/es/control/panel/view-layout-panel/view-layout-panel.d.ts.map +1 -1
  33. package/es/control/panel/view-layout-panel/view-layout-panel.mjs +12 -1
  34. package/es/index.mjs +3 -1
  35. package/es/locale/en/index.d.ts +1 -0
  36. package/es/locale/en/index.d.ts.map +1 -1
  37. package/es/locale/en/index.mjs +2 -1
  38. package/es/locale/zh-CN/index.d.ts +1 -0
  39. package/es/locale/zh-CN/index.d.ts.map +1 -1
  40. package/es/locale/zh-CN/index.mjs +2 -1
  41. package/es/panel-component/multi-data-container/multi-data-container.controller.d.ts.map +1 -1
  42. package/es/panel-component/multi-data-container/multi-data-container.controller.mjs +10 -3
  43. package/es/panel-component/multi-data-container/multi-data-container.d.ts +1 -1
  44. package/es/panel-component/multi-data-container/multi-data-container.d.ts.map +1 -1
  45. package/es/panel-component/multi-data-container-raw/multi-data-container-raw.d.ts +1 -1
  46. package/es/panel-component/multi-data-container-raw/multi-data-container-raw.d.ts.map +1 -1
  47. package/es/panel-component/nav-pos/nav-pos.controller.d.ts +1 -1
  48. package/es/panel-component/nav-pos/nav-pos.d.ts +1 -1
  49. package/es/panel-component/panel-container/panel-container.d.ts.map +1 -1
  50. package/es/panel-component/panel-container/panel-container.mjs +30 -2
  51. package/es/panel-component/panel-field/panel-field.controller.mjs +1 -1
  52. package/es/panel-component/panel-tab-page/panel-tab-page.d.ts +1 -1
  53. package/es/panel-component/single-data-container/single-data-container.d.ts +1 -1
  54. package/es/panel-component/single-data-container/single-data-container.d.ts.map +1 -1
  55. package/es/panel-component/teleport-placeholder/teleport-placeholder.d.ts +1 -0
  56. package/es/panel-component/teleport-placeholder/teleport-placeholder.d.ts.map +1 -1
  57. package/es/panel-component/teleport-placeholder/teleport-placeholder.state.d.ts +1 -1
  58. package/es/panel-component/teleport-placeholder/teleport-placeholder.state.mjs +1 -1
  59. package/es/plugin/plugin-factory/plugin-factory.d.ts +13 -12
  60. package/es/plugin/plugin-factory/plugin-factory.d.ts.map +1 -1
  61. package/es/plugin/plugin-factory/plugin-factory.mjs +24 -18
  62. package/es/use/index.d.ts +1 -0
  63. package/es/use/index.d.ts.map +1 -1
  64. package/es/use/index.mjs +3 -1
  65. package/es/use/popover/popover.d.ts +7 -0
  66. package/es/use/popover/popover.d.ts.map +1 -1
  67. package/es/use/popover/popover.mjs +9 -2
  68. package/es/use/storage/index.d.ts +4 -6
  69. package/es/use/storage/index.d.ts.map +1 -1
  70. package/es/use/storage/index.mjs +16 -11
  71. package/es/use/vue-use/computed-async.d.ts +51 -0
  72. package/es/use/vue-use/computed-async.d.ts.map +1 -0
  73. package/es/use/vue-use/computed-async.mjs +66 -0
  74. package/es/use/vue-use/index.d.ts +2 -0
  75. package/es/use/vue-use/index.d.ts.map +1 -0
  76. package/es/use/vue-use/index.mjs +3 -0
  77. package/es/util/install.d.ts.map +1 -1
  78. package/es/util/overlay-container/overlay-container.d.ts +1 -1
  79. package/es/util/overlay-container/overlay-container.d.ts.map +1 -1
  80. package/es/util/overlay-container/overlay-container.mjs +7 -2
  81. package/es/util/overlay-view-util/overlay-view-util.d.ts +2 -2
  82. package/es/util/overlay-view-util/overlay-view-util.d.ts.map +1 -1
  83. package/es/util/overlay-view-util/overlay-view-util.mjs +2 -1
  84. package/es/util/render/render.d.ts.map +1 -1
  85. package/es/util/render/render.mjs +4 -1
  86. package/es/util/route/route.d.ts.map +1 -1
  87. package/es/util/route/route.mjs +18 -3
  88. package/es/view/common/index.d.ts.map +1 -1
  89. package/es/view/common/index.mjs +2 -0
  90. package/es/view/common/view.d.ts.map +1 -1
  91. package/es/view/common/view.mjs +14 -1
  92. package/es/view/md-custom-view/md-custom-view.provider.d.ts +13 -0
  93. package/es/view/md-custom-view/md-custom-view.provider.d.ts.map +1 -0
  94. package/es/view/md-custom-view/md-custom-view.provider.mjs +13 -0
  95. package/lib/common/badge/badge.css +1 -1
  96. package/lib/common/control-base/control-base.cjs +37 -3
  97. package/lib/common/control-base/control-base.css +1 -1
  98. package/lib/common/custom-render/custom-render.cjs +1 -1
  99. package/lib/common/index.cjs +2 -0
  100. package/lib/common/signature-pad/signature-pad.cjs +167 -0
  101. package/lib/common/signature-pad/signature-pad.css +1 -0
  102. package/lib/common/signature-pad/util/bezier.cjs +111 -0
  103. package/lib/common/signature-pad/util/point.cjs +53 -0
  104. package/lib/common/signature-pad/util/signature_pad.cjs +1022 -0
  105. package/lib/common/view-shell/view-shell.cjs +13 -2
  106. package/lib/control/panel/panel/panel.cjs +12 -1
  107. package/lib/control/panel/view-layout-panel/view-layout-panel.cjs +12 -1
  108. package/lib/index.cjs +5 -0
  109. package/lib/locale/en/index.cjs +2 -1
  110. package/lib/locale/zh-CN/index.cjs +2 -1
  111. package/lib/panel-component/multi-data-container/multi-data-container.controller.cjs +10 -3
  112. package/lib/panel-component/panel-container/panel-container.cjs +29 -1
  113. package/lib/panel-component/panel-field/panel-field.controller.cjs +1 -1
  114. package/lib/panel-component/teleport-placeholder/teleport-placeholder.state.cjs +1 -1
  115. package/lib/plugin/plugin-factory/plugin-factory.cjs +24 -18
  116. package/lib/use/index.cjs +4 -0
  117. package/lib/use/popover/popover.cjs +8 -0
  118. package/lib/use/storage/index.cjs +16 -11
  119. package/lib/use/vue-use/computed-async.cjs +68 -0
  120. package/lib/use/vue-use/index.cjs +7 -0
  121. package/lib/util/overlay-container/overlay-container.cjs +7 -2
  122. package/lib/util/overlay-view-util/overlay-view-util.cjs +2 -1
  123. package/lib/util/render/render.cjs +4 -1
  124. package/lib/util/route/route.cjs +18 -3
  125. package/lib/view/common/index.cjs +2 -0
  126. package/lib/view/common/view.cjs +13 -0
  127. package/lib/view/md-custom-view/md-custom-view.provider.cjs +15 -0
  128. package/package.json +7 -7
@@ -0,0 +1,13 @@
1
+ import { MDCustomViewController } from '@ibiz-template/runtime';
2
+
3
+ "use strict";
4
+ class MDCustomViewProvider {
5
+ constructor() {
6
+ this.component = "IBizView";
7
+ }
8
+ createController(model, context, params, ctx) {
9
+ return new MDCustomViewController(model, context, params, ctx);
10
+ }
11
+ }
12
+
13
+ export { MDCustomViewProvider };
@@ -1 +1 @@
1
- .ibiz-badge{display:inline-block;width:var(--ibiz-width-icon-large);height:var(--ibiz-width-icon-large);line-height:var(--ibiz-width-icon-large);color:var(--ibiz-color-danger-text);background-color:var(--ibiz-badge-bg-color);border-radius:var(--ibiz-border-radius-circle)}.ibiz-badge--danger{--ibiz-badge-bg-color:var(--ibiz-color-danger)}.ibiz-badge--success{--ibiz-badge-bg-color:var(--ibiz-color-success)}.ibiz-badge--warning{--ibiz-badge-bg-color:var(--ibiz-color-warning)}.ibiz-badge--info{--ibiz-badge-bg-color:var(--ibiz-color-info)}.ibiz-badge--primary{--ibiz-badge-bg-color:var(--ibiz-color-primary)}
1
+ .ibiz-badge{--ibiz-badge-bg-color:var(--ibiz-color-danger);--ibiz-badge-height:18px;--ibiz-badge-border-radius:10px;display:inline-flex;align-items:center;justify-content:center;width:auto;height:var(--ibiz-badge-height);padding:var(--ibiz-spacing-extra-tight);font-size:var(--ibiz-font-size-small);line-height:normal;color:var(--ibiz-color-danger-text);white-space:nowrap;background-color:var(--ibiz-badge-bg-color);border:1px solid transparent;border-radius:var(--ibiz-badge-border-radius)}.ibiz-badge--danger{--ibiz-badge-bg-color:var(--ibiz-color-danger)}.ibiz-badge--success{--ibiz-badge-bg-color:var(--ibiz-color-success)}.ibiz-badge--warning{--ibiz-badge-bg-color:var(--ibiz-color-warning)}.ibiz-badge--info{--ibiz-badge-bg-color:var(--ibiz-color-info)}.ibiz-badge--primary{--ibiz-badge-bg-color:var(--ibiz-color-primary)}
@@ -5,6 +5,7 @@ var runtime = require('@ibiz-template/runtime');
5
5
  var core = require('@ibiz-template/core');
6
6
  var ramda = require('ramda');
7
7
  require('../../use/index.cjs');
8
+ require('./control-base.css');
8
9
  var namespace = require('../../use/namespace/namespace.cjs');
9
10
 
10
11
  "use strict";
@@ -74,7 +75,7 @@ const IBizControlBase = /* @__PURE__ */ vue.defineComponent({
74
75
  };
75
76
  const getControlRender = (data) => {
76
77
  var _a, _b;
77
- const controlRenders = model.controlRenders ? model.controlRenders.filter((item) => item.id !== "emptypanel") : void 0;
78
+ const controlRenders = model.controlRenders ? model.controlRenders.filter((item) => !Object.values(runtime.PredefinedControlRender).includes(item.id)) : void 0;
78
79
  if (!controlRenders || controlRenders.length === 0) {
79
80
  return void 0;
80
81
  }
@@ -107,6 +108,36 @@ const IBizControlBase = /* @__PURE__ */ vue.defineComponent({
107
108
  const data = props.controller.data || props.controller.items;
108
109
  return getControlRender(data);
109
110
  });
111
+ const disableMaskInfoRender = () => {
112
+ const disableRender = model.controlRenders ? model.controlRenders.find((item) => item.id === runtime.PredefinedControlRender.DISABLEPANEL) : void 0;
113
+ if (!disableRender) {
114
+ return vue.createVNode("div", {
115
+ "innerHTML": props.controller.state.maskOption.maskInfo || "",
116
+ "class": [ns.e("disable-mask-text")]
117
+ }, null);
118
+ }
119
+ if (disableRender.renderType === "LAYOUTPANEL_MODEL" && disableRender.layoutPanelModel) {
120
+ const htmlCode = runtime.ScriptFactory.execScriptFn({
121
+ ...props.controller.getEventArgs()
122
+ }, disableRender.layoutPanelModel, {
123
+ isAsync: false,
124
+ singleRowReturn: true
125
+ });
126
+ return vue.createVNode("div", {
127
+ "innerHTML": htmlCode,
128
+ "class": [ns.e("disable-mask-text")]
129
+ }, null);
130
+ }
131
+ if (disableRender.renderType === "LAYOUTPANEL" && disableRender.layoutPanel) {
132
+ return vue.createVNode(vue.resolveComponent("iBizControlShell"), {
133
+ "class": [ns.e("disable-mask-text")],
134
+ "data": {},
135
+ "params": props.controller.params,
136
+ "context": props.controller.context,
137
+ "modelData": disableRender.layoutPanel
138
+ }, null);
139
+ }
140
+ };
110
141
  return {
111
142
  ns,
112
143
  typeClass,
@@ -115,6 +146,7 @@ const IBizControlBase = /* @__PURE__ */ vue.defineComponent({
115
146
  codeName,
116
147
  controls,
117
148
  customRender,
149
+ disableMaskInfoRender,
118
150
  onLayoutPanelCreated
119
151
  };
120
152
  },
@@ -164,9 +196,11 @@ const IBizControlBase = /* @__PURE__ */ vue.defineComponent({
164
196
  }, slots);
165
197
  }
166
198
  return vue.createVNode("div", {
167
- "class": [this.ns.b(), this.ns.b(this.typeClass), this.ns.m(this.codeName), this.sysCssName],
199
+ "class": [this.ns.b(), this.ns.b(this.typeClass), this.ns.m(this.codeName), this.sysCssName, this.ns.is("disabled", state.disabled)],
168
200
  "style": this.inlineStyle
169
- }, [layoutPanel || this.customRender || ((_c = (_b = this.$slots).default) == null ? void 0 : _c.call(_b))]);
201
+ }, [layoutPanel || this.customRender || ((_c = (_b = this.$slots).default) == null ? void 0 : _c.call(_b)), state.disabled && vue.createVNode("div", {
202
+ "class": [this.ns.e("mask-container"), this.ns.m(state.maskOption.mode.toLowerCase())]
203
+ }, [state.maskOption.mode === "MASK" && this.disableMaskInfoRender()])]);
170
204
  }
171
205
  });
172
206
 
@@ -1 +1 @@
1
- .ibiz-control{width:100%;height:100%}.ibiz-control__control-render{width:100%;height:100%}
1
+ .ibiz-control{--ibiz-control-base-scrollbar-width:0px;--ibiz-control-base-mask-text-color:var(--ibiz-color-primary-text);--ibiz-control-base-mask-background-color-blank:transparent;--ibiz-control-base-mask-background-color-mask:rgba(0, 0, 0, 0.5);width:100%;height:100%}.ibiz-control__control-render{width:100%;height:100%}.ibiz-control.is-disabled{position:relative}.ibiz-control__mask-container{position:absolute;top:0;left:0;z-index:10;width:calc(100% - var(--ibiz-control-base-scrollbar-width));height:100%}.ibiz-control--blank{background-color:var(--ibiz-control-base-mask-background-color-blank)}.ibiz-control--mask{color:var(--ibiz-control-base-mask-text-color);background-color:var(--ibiz-control-base-mask-background-color-mask);display:flex;align-items:center;justify-content:center}
@@ -49,7 +49,7 @@ const IBizCustomRender = /* @__PURE__ */ vue.defineComponent({
49
49
  if (!controlRenders || controlRenders.length === 0) {
50
50
  return void 0;
51
51
  }
52
- const noDataRender = controlRenders.find((item) => item.id === "emptypanel");
52
+ const noDataRender = controlRenders.find((item) => item.id === runtime.PredefinedControlRender.EMPTYPANEL);
53
53
  if (!noDataRender)
54
54
  return void 0;
55
55
  if (noDataRender.renderType === "LAYOUTPANEL_MODEL" && noDataRender.layoutPanelModel) {
@@ -9,6 +9,7 @@ var codeList = require('./code-list/code-list.cjs');
9
9
  var controlLoadingPlaceholder = require('./control-loading-placeholder/control-loading-placeholder.cjs');
10
10
  var badge = require('./badge/badge.cjs');
11
11
  var customRender = require('./custom-render/custom-render.cjs');
12
+ var signaturePad = require('./signature-pad/signature-pad.cjs');
12
13
 
13
14
  "use strict";
14
15
 
@@ -21,3 +22,4 @@ exports.IBizCodeList = codeList.IBizCodeList;
21
22
  exports.ControlLoadingPlaceholder = controlLoadingPlaceholder.ControlLoadingPlaceholder;
22
23
  exports.IBizBadge = badge.IBizBadge;
23
24
  exports.IBizCustomRender = customRender.IBizCustomRender;
25
+ exports.IBizSignaturePad = signaturePad.IBizSignaturePad;
@@ -0,0 +1,167 @@
1
+ 'use strict';
2
+
3
+ var vue = require('vue');
4
+ var lodashEs = require('lodash-es');
5
+ require('../../use/index.cjs');
6
+ var signature_pad = require('./util/signature_pad.cjs');
7
+ require('./signature-pad.css');
8
+ var namespace = require('../../use/namespace/namespace.cjs');
9
+
10
+ "use strict";
11
+ const IBizSignaturePad = /* @__PURE__ */ vue.defineComponent({
12
+ name: "IBizSignaturePad",
13
+ props: {
14
+ options: {
15
+ type: Object
16
+ }
17
+ },
18
+ setup(props) {
19
+ const ns = namespace.useNamespace("signature-pad");
20
+ const signaturePadRef = vue.ref();
21
+ const canvasRef = vue.ref();
22
+ const signaturePad = vue.ref();
23
+ const getSignatureOptions = () => {
24
+ const _options = {};
25
+ if (props.options) {
26
+ const {
27
+ dotsize,
28
+ minwidth,
29
+ maxwidth,
30
+ pencolor,
31
+ velocityfilterweight,
32
+ compositeoperation,
33
+ mindistance,
34
+ backgroundcolor,
35
+ throttle,
36
+ canvascontextoptions
37
+ } = props.options;
38
+ if (dotsize) {
39
+ Object.assign(_options, {
40
+ dotSize: Number(dotsize)
41
+ });
42
+ }
43
+ if (minwidth) {
44
+ Object.assign(_options, {
45
+ minWidth: Number(minwidth)
46
+ });
47
+ }
48
+ if (maxwidth) {
49
+ Object.assign(_options, {
50
+ maxWidth: Number(maxwidth)
51
+ });
52
+ }
53
+ if (velocityfilterweight) {
54
+ Object.assign(_options, {
55
+ velocityFilterWeight: Number(velocityfilterweight)
56
+ });
57
+ }
58
+ if (mindistance) {
59
+ Object.assign(_options, {
60
+ minDistance: Number(mindistance)
61
+ });
62
+ }
63
+ if (throttle) {
64
+ Object.assign(_options, {
65
+ throttle: Number(throttle)
66
+ });
67
+ }
68
+ if (pencolor) {
69
+ Object.assign(_options, {
70
+ penColor: String(pencolor)
71
+ });
72
+ }
73
+ if (compositeoperation) {
74
+ Object.assign(_options, {
75
+ compositeOperation: String(compositeoperation)
76
+ });
77
+ }
78
+ if (backgroundcolor) {
79
+ Object.assign(_options, {
80
+ backgroundColor: String(backgroundcolor)
81
+ });
82
+ }
83
+ if (canvascontextoptions) {
84
+ let canvasContextOptions = canvascontextoptions;
85
+ if (lodashEs.isString(canvascontextoptions)) {
86
+ try {
87
+ canvasContextOptions = JSON.parse(canvascontextoptions);
88
+ } catch (error) {
89
+ ibiz.log.error(error);
90
+ canvasContextOptions = void 0;
91
+ }
92
+ }
93
+ Object.assign(_options, {
94
+ canvasContextOptions: {
95
+ ...canvasContextOptions
96
+ }
97
+ });
98
+ }
99
+ }
100
+ return _options;
101
+ };
102
+ const preventScroll = (_e) => {
103
+ _e.preventDefault();
104
+ };
105
+ const initSignaturePad = (_callback) => {
106
+ vue.nextTick(() => {
107
+ const canvas = canvasRef.value;
108
+ const signatures = signaturePadRef.value;
109
+ if (!canvas)
110
+ return;
111
+ const dpr = window.devicePixelRatio || 1;
112
+ const rect = signatures.getBoundingClientRect();
113
+ const canvasWidth = rect.width < 300 ? 300 : rect.width;
114
+ const canvasHeight = rect.height < 150 ? 150 : rect.height;
115
+ canvas.width = canvasWidth * dpr;
116
+ canvas.height = canvasHeight * dpr;
117
+ canvas.style.width = "".concat(canvasWidth, "px");
118
+ canvas.style.height = "".concat(canvasHeight, "px");
119
+ signaturePad.value = new signature_pad.default(canvas, {
120
+ ...getSignatureOptions()
121
+ });
122
+ const ctx = canvas.getContext("2d");
123
+ ctx.scale(dpr, dpr);
124
+ canvas.addEventListener("touchstart", preventScroll, {
125
+ passive: false
126
+ });
127
+ canvas.addEventListener("touchmove", preventScroll, {
128
+ passive: false
129
+ });
130
+ _callback == null ? void 0 : _callback();
131
+ });
132
+ };
133
+ const updateSignaturePad = (_callback) => initSignaturePad(_callback);
134
+ const handleResize = () => {
135
+ if (signaturePad.value) {
136
+ signaturePad.value.off();
137
+ updateSignaturePad();
138
+ }
139
+ };
140
+ vue.onMounted(() => {
141
+ initSignaturePad();
142
+ window.addEventListener("resize", handleResize);
143
+ });
144
+ vue.onUnmounted(() => {
145
+ window.removeEventListener("resize", handleResize);
146
+ });
147
+ return {
148
+ ns,
149
+ canvasRef,
150
+ signaturePadRef,
151
+ signaturePad,
152
+ updateSignaturePad
153
+ };
154
+ },
155
+ render() {
156
+ return vue.createVNode("div", {
157
+ "class": this.ns.b(),
158
+ "ref": "signaturePadRef"
159
+ }, [vue.createVNode("div", {
160
+ "class": this.ns.e("container")
161
+ }, [vue.createVNode("canvas", {
162
+ "ref": "canvasRef"
163
+ }, null)])]);
164
+ }
165
+ });
166
+
167
+ exports.IBizSignaturePad = IBizSignaturePad;
@@ -0,0 +1 @@
1
+ .ibiz-signature-pad{width:100%;height:100%}.ibiz-signature-pad__container{width:100%;height:100%;background-color:var(--ibiz-color-bg-1)}
@@ -0,0 +1,111 @@
1
+ 'use strict';
2
+
3
+ var point = require('./point.cjs');
4
+
5
+ "use strict";
6
+ class Bezier {
7
+ /**
8
+ * 贝塞尔曲线构造函数
9
+ * @param startPoint 起始点
10
+ * @param control2 第二个控制点
11
+ * @param control1 第一个控制点
12
+ * @param endPoint 结束点
13
+ * @param startWidth 起始点宽度
14
+ * @param endWidth 结束点宽度
15
+ */
16
+ constructor(startPoint, control2, control1, endPoint, startWidth, endWidth) {
17
+ this.startPoint = startPoint;
18
+ this.control2 = control2;
19
+ this.control1 = control1;
20
+ this.endPoint = endPoint;
21
+ this.startWidth = startWidth;
22
+ this.endWidth = endWidth;
23
+ }
24
+ /**
25
+ * 从点数组创建贝塞尔曲线
26
+ * @param points 点数组,至少需要4个点来计算曲线
27
+ * @param widths 包含起点和终点宽度的对象
28
+ * @returns 新创建的贝塞尔曲线实例
29
+ */
30
+ static fromPoints(points, widths) {
31
+ const c2 = this.calculateControlPoints(points[0], points[1], points[2]).c2;
32
+ const c3 = this.calculateControlPoints(points[1], points[2], points[3]).c1;
33
+ return new Bezier(points[1], c2, c3, points[2], widths.start, widths.end);
34
+ }
35
+ /**
36
+ * 计算贝塞尔曲线的控制点
37
+ * @param s1 第一个点
38
+ * @param s2 第二个点(中间点)
39
+ * @param s3 第三个点
40
+ * @returns 包含两个控制点的对象
41
+ */
42
+ static calculateControlPoints(s1, s2, s3) {
43
+ const dx1 = s1.x - s2.x;
44
+ const dy1 = s1.y - s2.y;
45
+ const dx2 = s2.x - s3.x;
46
+ const dy2 = s2.y - s3.y;
47
+ const m1 = { x: (s1.x + s2.x) / 2, y: (s1.y + s2.y) / 2 };
48
+ const m2 = { x: (s2.x + s3.x) / 2, y: (s2.y + s3.y) / 2 };
49
+ const l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);
50
+ const l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);
51
+ const dxm = m1.x - m2.x;
52
+ const dym = m1.y - m2.y;
53
+ const k = l1 + l2 === 0 ? 0 : l2 / (l1 + l2);
54
+ const cm = { x: m2.x + dxm * k, y: m2.y + dym * k };
55
+ const tx = s2.x - cm.x;
56
+ const ty = s2.y - cm.y;
57
+ return {
58
+ c1: new point.Point(m1.x + tx, m1.y + ty),
59
+ c2: new point.Point(m2.x + tx, m2.y + ty)
60
+ };
61
+ }
62
+ /**
63
+ * 计算贝塞尔曲线的近似长度
64
+ * @returns 曲线的近似长度
65
+ */
66
+ length() {
67
+ const steps = 10;
68
+ let length = 0;
69
+ let px;
70
+ let py;
71
+ for (let i = 0; i <= steps; i += 1) {
72
+ const t = i / steps;
73
+ const cx = this.point(
74
+ t,
75
+ this.startPoint.x,
76
+ this.control1.x,
77
+ this.control2.x,
78
+ this.endPoint.x
79
+ );
80
+ const cy = this.point(
81
+ t,
82
+ this.startPoint.y,
83
+ this.control1.y,
84
+ this.control2.y,
85
+ this.endPoint.y
86
+ );
87
+ if (i > 0) {
88
+ const xdiff = cx - px;
89
+ const ydiff = cy - py;
90
+ length += Math.sqrt(xdiff * xdiff + ydiff * ydiff);
91
+ }
92
+ px = cx;
93
+ py = cy;
94
+ }
95
+ return length;
96
+ }
97
+ /**
98
+ * 计算三次贝塞尔曲线在参数t处的x或y坐标值
99
+ * @param t 参数t,范围0到1
100
+ * @param start 起始点的坐标值(x或y)
101
+ * @param c1 第一个控制点的坐标值(x或y)
102
+ * @param c2 第二个控制点的坐标值(x或y)
103
+ * @param end 结束点的坐标值(x或y)
104
+ * @returns 计算得到的坐标值
105
+ */
106
+ point(t, start, c1, c2, end) {
107
+ return start * (1 - t) * (1 - t) * (1 - t) + 3 * c1 * (1 - t) * (1 - t) * t + 3 * c2 * (1 - t) * t * t + end * t * t * t;
108
+ }
109
+ }
110
+
111
+ exports.Bezier = Bezier;
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ "use strict";
4
+ class Point {
5
+ /**
6
+ * 构造函数,创建一个Point实例
7
+ * @param x X坐标
8
+ * @param y Y坐标
9
+ * @param pressure 压力值,可选,默认为0
10
+ * @param time 时间戳,可选,默认为当前时间
11
+ * @throws 如果x或y是NaN,抛出错误
12
+ */
13
+ constructor(x, y, pressure, time) {
14
+ if (Number.isNaN(x) || Number.isNaN(y)) {
15
+ throw new Error(
16
+ ibiz.i18n.t("vue3Util.common.invalidPointCoordinates", {
17
+ x,
18
+ y
19
+ })
20
+ );
21
+ }
22
+ this.x = +x;
23
+ this.y = +y;
24
+ this.pressure = pressure || 0;
25
+ this.time = time || Date.now();
26
+ }
27
+ /**
28
+ * 计算当前点到另一个点的直线距离
29
+ * @param start 起始点(另一个点)
30
+ * @returns 两点之间的距离
31
+ */
32
+ distanceTo(start) {
33
+ return Math.sqrt((this.x - start.x) ** 2 + (this.y - start.y) ** 2);
34
+ }
35
+ /**
36
+ * 判断当前点是否与另一个点相等
37
+ * @param other 要比较的另一个点
38
+ * @returns 如果所有属性都相等则返回true,否则返回false
39
+ */
40
+ equals(other) {
41
+ return this.x === other.x && this.y === other.y && this.pressure === other.pressure && this.time === other.time;
42
+ }
43
+ /**
44
+ * 计算从起始点到当前点的移动速度
45
+ * @param start 起始点
46
+ * @returns 速度值(距离/时间),如果时间相同则返回0
47
+ */
48
+ velocityFrom(start) {
49
+ return this.time !== start.time ? this.distanceTo(start) / (this.time - start.time) : 0;
50
+ }
51
+ }
52
+
53
+ exports.Point = Point;