@shijiu/jsview-vue 2.2.35 → 2.2.128

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 (77) hide show
  1. package/bin/browser/BrowserApic.vue.mjs +2 -1
  2. package/bin/browser/BrowserApic2.vue.mjs +2 -1
  3. package/bin/browser/BrowserApicLib.mjs +2 -1
  4. package/bin/browser/BrowserQrcode.vue.mjs +3 -1
  5. package/bin/browser/BrowserTextureAnim.vue.mjs +7 -6
  6. package/bin/jsview-vue.mjs +1557 -894
  7. package/bin/types/JsViewEngineWidget/MetroWidget/Slide.d.ts +21 -0
  8. package/bin/types/JsViewEngineWidget/TemplateParser/MetroTemplate.d.ts +2 -8
  9. package/bin/types/JsViewEngineWidget/WidgetCommon.d.ts +9 -3
  10. package/bin/types/JsViewVueTools/ConstSymbol.d.ts +2 -0
  11. package/bin/types/JsViewVueTools/ForgeConstDefine.d.ts +11 -0
  12. package/bin/types/JsViewVueTools/JsvRuntimeBridge.d.ts +113 -57
  13. package/bin/types/JsViewVueTools/JsvTextureStore/CapturedTexture/CapturedTexture.d.ts +11 -0
  14. package/bin/types/JsViewVueTools/JsvTextureStore/Texture.d.ts +8 -0
  15. package/bin/types/JsViewVueWidget/JsvConnectLine/JsvConnectLine.vue.d.ts +1 -1
  16. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.d.ts +4 -0
  17. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActorControl.d.ts +65 -0
  18. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActorState.d.ts +6 -0
  19. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/CallbackManager.d.ts +11 -0
  20. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.d.ts +15 -0
  21. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue.d.ts +6 -0
  22. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetAction.d.ts +71 -0
  23. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetCondition.d.ts +95 -0
  24. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetState.d.ts +62 -0
  25. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/index.d.ts +2 -1
  26. package/bin/types/JsViewVueWidget/JsvLine/JsvLine.vue.d.ts +1 -1
  27. package/bin/types/JsViewVueWidget/JsvNativeSharedDiv.vue.d.ts +66 -28
  28. package/bin/types/JsViewVueWidget/JsvNinePatch.vue.d.ts +1 -0
  29. package/bin/types/JsViewVueWidget/JsvScrollBox/JsvScrollBox.vue.d.ts +176 -0
  30. package/bin/types/JsViewVueWidget/JsvScrollBox/ScrollSymbol.d.ts +7 -0
  31. package/bin/types/JsViewVueWidget/JsvScrollBox/index.d.ts +1 -0
  32. package/bin/types/JsViewVueWidget/JsvTextBox.vue.d.ts +3 -3
  33. package/bin/types/JsViewVueWidget/index.d.ts +1 -0
  34. package/package.json +1 -1
  35. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +10 -1
  36. package/utils/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.js +398 -309
  37. package/utils/JsViewEngineWidget/MetroWidget/RenderItem.ts +2 -1
  38. package/utils/JsViewEngineWidget/MetroWidget/Slide.ts +56 -0
  39. package/utils/JsViewEngineWidget/MetroWidget/TaskManager.ts +51 -10
  40. package/utils/JsViewEngineWidget/MetroWidget/TokenGenerator.ts +10 -0
  41. package/utils/JsViewEngineWidget/TemplateParser/ListMetroTemplate.ts +9 -3
  42. package/utils/JsViewEngineWidget/TemplateParser/MetroTemplate.ts +25 -35
  43. package/utils/JsViewEngineWidget/WidgetCommon.ts +20 -7
  44. package/utils/JsViewPlugin/JsvPlayer/BrowserJsvPlayer.vue +13 -1
  45. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +470 -338
  46. package/utils/JsViewVueTools/ConstSymbol.ts +3 -0
  47. package/utils/JsViewVueTools/ForgeConstDefine.ts +11 -0
  48. package/utils/JsViewVueTools/JsvRuntimeBridge.js +172 -50
  49. package/utils/JsViewVueTools/JsvTextureStore/CapturedTexture/CapturedTexture.ts +62 -0
  50. package/utils/JsViewVueTools/JsvTextureStore/JsvTextureStore.ts +41 -7
  51. package/utils/JsViewVueTools/JsvTextureStore/Texture.ts +15 -1
  52. package/utils/JsViewVueTools/index.js +2 -0
  53. package/utils/JsViewVueWidget/JsvApic/JsvApic/BrowserApic.vue +6 -6
  54. package/utils/JsViewVueWidget/JsvApic/JsvApic2/BrowserApic2.vue +5 -6
  55. package/utils/JsViewVueWidget/JsvApic/JsvBrowserApicLib/ApicDataBase.js +5 -1
  56. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.ts +1 -1
  57. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts +23 -1
  58. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorState.ts +4 -4
  59. package/utils/JsViewVueWidget/JsvFreeMoveActor/CallbackManager.ts +6 -6
  60. package/utils/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.ts +1 -1
  61. package/utils/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue +43 -9
  62. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.ts +24 -0
  63. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.ts +50 -1
  64. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.ts +56 -0
  65. package/utils/JsViewVueWidget/JsvFreeMoveActor/index.js +3 -0
  66. package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +6 -1
  67. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +121 -68
  68. package/utils/JsViewVueWidget/JsvNinePatch.vue +4 -1
  69. package/utils/JsViewVueWidget/JsvPosterImage.vue +22 -9
  70. package/utils/JsViewVueWidget/JsvQrcode/BrowserQrcode.vue +6 -2
  71. package/utils/JsViewVueWidget/JsvScrollBox/JsvScrollBox.vue +309 -0
  72. package/utils/JsViewVueWidget/JsvScrollBox/ScrollSymbol.ts +15 -0
  73. package/utils/JsViewVueWidget/JsvScrollBox/index.js +2 -0
  74. package/utils/JsViewVueWidget/JsvTextBox.vue +12 -4
  75. package/utils/JsViewVueWidget/JsvTextureAnim/BrowserTextureAnim.vue +9 -6
  76. package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +2 -0
  77. package/utils/JsViewVueWidget/index.js +1 -0
@@ -1,6 +1,7 @@
1
1
  import { ref, computed } from "vue";
2
2
  import type { Ref } from "vue";
3
3
  import { TemplateItem } from "../TemplateParser/MetroTemplate"
4
+ import { ForgeConst } from "../../JsViewVueTools/ForgeConstDefine";
4
5
 
5
6
  interface RenderItemStyle {
6
7
  zIndex: number,
@@ -154,7 +155,7 @@ export class RenderItem {
154
155
  this.divMountedCallback.clear();
155
156
  if (this.enableTap && this.rootDiv) {
156
157
  const divView = (this.rootDiv as any).jsvGetProxyView();
157
- divView.DragEnables?.(0x01); // 只激活tap
158
+ divView.DragEnables?.(ForgeConst.DragFlags.TOUCH_RECV_CLICK_BIT); // 只激活tap
158
159
  }
159
160
  }
160
161
 
@@ -0,0 +1,56 @@
1
+ import { getCurFrameCount } from "../WidgetCommon";
2
+
3
+ export interface TargetRectInfo {
4
+ left: number,
5
+ top: number,
6
+ width: number,
7
+ height: number,
8
+ frameCount: number,
9
+ }
10
+
11
+ export class RectCache {
12
+ private preRect: TargetRectInfo | null = null;
13
+ private curRect: TargetRectInfo | null = null;
14
+
15
+ public cache(rect: TargetRectInfo) {
16
+ if (this.curRect && this.curRect.frameCount < rect?.frameCount) {
17
+ this.preRect = this.curRect;
18
+ }
19
+ this.curRect = rect;
20
+ }
21
+
22
+ public cacheManually() {
23
+ if (this.curRect && this.curRect.frameCount < getCurFrameCount()) {
24
+ this.preRect = this.curRect;
25
+ this.curRect = null;
26
+ }
27
+ }
28
+
29
+ public getCurRect(): TargetRectInfo | null {
30
+ return this.curRect ? { ...this.curRect } : null;
31
+ }
32
+
33
+ public getPreRect(): TargetRectInfo | null {
34
+ return this.preRect ? { ...this.preRect } : null;
35
+ }
36
+
37
+ public updatePre(key: "left" | "top" | "width" | "height", value: number) {
38
+ if (this.preRect) {
39
+ let p = this.preRect[key];
40
+ this.preRect[key] = value;
41
+ }
42
+ }
43
+
44
+ public clean() {
45
+ this.preRect = null;
46
+ this.curRect = null;
47
+ }
48
+ }
49
+
50
+ export const getDirectionByRect = (curRect: TargetRectInfo, preRect: TargetRectInfo) => {
51
+ if (!preRect || !curRect) return { horizontal: 0, vertical: 0 };
52
+ return {
53
+ horizontal: curRect.left < preRect.left ? -1 : (curRect.left > preRect.left ? 1 : 0),
54
+ vertical: curRect.top < preRect.top ? -1 : (curRect.top > preRect.top ? 1 : 0),
55
+ }
56
+ }
@@ -107,7 +107,7 @@ export type TaskRunner = () => CancelFunc;
107
107
  class CancellableRunner {
108
108
  private cancelHandler: CancelFunc | null = null;
109
109
  private runner: TaskRunner | null = null;
110
- constructor(r: TaskRunner) {
110
+ constructor(r: TaskRunner) {
111
111
  this.runner = r;
112
112
  }
113
113
 
@@ -126,29 +126,55 @@ class CancellableRunner {
126
126
 
127
127
 
128
128
  export enum TaskType {
129
- RESIZE_ITEM,
129
+ RESIZE_ITEM = 1,
130
130
  SLIDE,
131
131
  ON_FOCUS_CHANGE,
132
132
  }
133
133
 
134
+ export enum SlideTaskType {
135
+ SLIDE_BY_POS = 1,
136
+ SLIDE_BY_ITEM,
137
+ SLIDE_BY_DIV,
138
+ SLIDE_BY_RECT,
139
+ }
140
+
141
+ type SubType = SlideTaskType | null;
142
+
134
143
  interface Task {
135
144
  frameCount: number,
136
145
  type: TaskType,
146
+ subType: SubType,
137
147
  params: any,
138
148
  }
139
149
 
140
- export type AddTaskCallback = (taskList: Array<object>) => void;
141
-
150
+ export interface AllTaskList {
151
+ slide: Array<Task>,
152
+ focus: Array<Task>,
153
+ resize: Array<Task>,
154
+ }
155
+ export type AddTaskCallback = (taskList: AllTaskList) => void;
142
156
  export class TaskManager {
143
157
  private frameCount: number = -1;
144
- private widgetTaskCacheList: Array<Task> = [];
145
158
  private cancellableRunnerList: Array<CancellableRunner> = [];
146
159
 
160
+ //三类task: 1.slide, 2.resize, 3.focus
161
+ private allTaskList: AllTaskList = {
162
+ slide: [],
163
+ focus: [],
164
+ resize: [],
165
+ }
166
+
147
167
  constructor(private onAddTask: AddTaskCallback) { }
148
168
 
149
- public addTask(type: TaskType, params: any) {
169
+ private cleanTaskCache(): void {
170
+ this.allTaskList.slide = [];
171
+ this.allTaskList.focus = [];
172
+ this.allTaskList.resize = [];
173
+ }
174
+
175
+ public addTask(type: TaskType, params: any, subtype: SubType = null) {
150
176
  if (this.frameCount != Forge.sFrameCount.count) {
151
- this.widgetTaskCacheList = [];
177
+ this.cleanTaskCache();
152
178
  this.cancellableRunnerList = [];
153
179
  this.frameCount = Forge.sFrameCount.count;
154
180
  }
@@ -157,12 +183,27 @@ export class TaskManager {
157
183
  t.cancel();
158
184
  });
159
185
 
160
- this.widgetTaskCacheList.push({
186
+ const tObj = {
161
187
  type,
188
+ subType: subtype,
162
189
  params,
163
190
  frameCount: Forge.sFrameCount.count,
164
- });
165
- this.onAddTask(this.widgetTaskCacheList);
191
+ }
192
+ switch (type) {
193
+ case TaskType.SLIDE:
194
+ this.allTaskList.slide.push(tObj)
195
+ break;
196
+ case TaskType.ON_FOCUS_CHANGE:
197
+ this.allTaskList.focus.push(tObj)
198
+ break;
199
+ case TaskType.RESIZE_ITEM:
200
+ this.allTaskList.resize.push(tObj)
201
+ break;
202
+ default:
203
+ console.error("undefined type")
204
+ break;
205
+ }
206
+ this.onAddTask(this.allTaskList);
166
207
  }
167
208
 
168
209
  public run(func: TaskRunner) {
@@ -0,0 +1,10 @@
1
+ const MaxNumber = Math.round(Number.MAX_SAFE_INTEGER / 2);
2
+ export class TokenGenerator {
3
+ private token = 0;
4
+ public get(): number {
5
+ if (this.token + 1 > MaxNumber) {
6
+ this.token = 1;
7
+ }
8
+ return ++this.token;
9
+ }
10
+ }
@@ -1,5 +1,5 @@
1
1
  import { MetroTemplate, TemplateItem, MeasureInfo } from "./MetroTemplate"
2
- import { VERTICAL, HORIZONTAL, FocusMoveType } from "../WidgetCommon";
2
+ import { VERTICAL, HORIZONTAL, FocusMoveType, getCurFrameCount } from "../WidgetCommon";
3
3
 
4
4
  const TAG = "ListMetroTemplate";
5
5
 
@@ -123,8 +123,6 @@ class ListMetroTemplate extends MetroTemplate {
123
123
  return [-1, -1]
124
124
  }
125
125
 
126
-
127
-
128
126
  let item = this.getItemById(baseId);
129
127
  const startIndex = item ? item.index : Math.round(this.size / 2);
130
128
  let start = -1, end = -1;
@@ -173,8 +171,16 @@ class ListMetroTemplate extends MetroTemplate {
173
171
  break;
174
172
  }
175
173
  }
174
+ //TODO 不是一次性加载全部, 可视区域外的懒惰加载
176
175
  for (let i of needChangeList) {
177
176
  this._addTemplateItem(i);
177
+ i.layoutCache.cache({
178
+ left: i.left,
179
+ top: i.top,
180
+ width: i.width,
181
+ height: i.height,
182
+ frameCount: getCurFrameCount(),
183
+ })
178
184
  }
179
185
  }
180
186
  }
@@ -1,6 +1,7 @@
1
1
  import { checkType, toRawType, getTypeName } from "../CheckType.js";
2
2
  import { METRO_WIDGET } from "../MetroWidget/Const";
3
- import { VERTICAL } from "../WidgetCommon";
3
+ import { VERTICAL, getCurFrameCount } from "../WidgetCommon";
4
+ import { RectCache } from "../MetroWidget/Slide";
4
5
 
5
6
  const TAG = "MetroTemplate";
6
7
 
@@ -160,7 +161,7 @@ interface TemplateItem {
160
161
  bottom: number,
161
162
  }
162
163
  findNextAnchor: FindNextAnchor | null,
163
- layoutCache: { top: number, left: number, width: number, height: number } | null,
164
+ layoutCache: RectCache,
164
165
  uid?: string,
165
166
  }
166
167
 
@@ -266,6 +267,14 @@ abstract class MetroTemplate {
266
267
  if (itemObj.uid) {
267
268
  (this.uidMap as any)[itemObj.uid] = item;
268
269
  }
270
+ //初次缓存rect, 为resize准备
271
+ item.layoutCache.cache({
272
+ left: item.left,
273
+ top: item.top,
274
+ width: item.width,
275
+ height: item.height,
276
+ frameCount: getCurFrameCount(),
277
+ })
269
278
  return item;
270
279
  }
271
280
 
@@ -278,15 +287,22 @@ abstract class MetroTemplate {
278
287
 
279
288
  public getBoundingBoxSize() {
280
289
  const lastItem = this.templateList[this.templateList.length - 1];
281
- if (this.direction == VERTICAL) {
282
- return {
283
- width: this.lineMax,
284
- height: lastItem.height + lastItem.top - 1,
290
+ if (lastItem) {
291
+ if (this.direction == VERTICAL) {
292
+ return {
293
+ width: this.lineMax,
294
+ height: lastItem.height + lastItem.top - 1,
295
+ }
296
+ } else {
297
+ return {
298
+ height: this.lineMax,
299
+ width: lastItem.width + lastItem.left - 1,
300
+ }
285
301
  }
286
302
  } else {
287
303
  return {
288
- height: this.lineMax,
289
- width: lastItem.width + lastItem.left - 1,
304
+ width: 0,
305
+ height: 0,
290
306
  }
291
307
  }
292
308
  }
@@ -295,32 +311,6 @@ abstract class MetroTemplate {
295
311
  return this.tailItemIndex;
296
312
  }
297
313
 
298
- public cacheLayout(start: number, end: number) {
299
- if (typeof end == "undefined") {
300
- end = this.templateList.length;
301
- }
302
- end = Math.min(end, this.templateList.length);
303
- for (let i = start; i < end; ++i) {
304
- let item = this.templateList[i];
305
- item.layoutCache = {
306
- left: item.left,
307
- top: item.top,
308
- width: item.width,
309
- height: item.height,
310
- }
311
- }
312
- this.cachedLayoutRange.push([start, end]);
313
- }
314
-
315
- public cleanLayoutCache() {
316
- for (let r of this.cachedLayoutRange) {
317
- for (let i = r[0]; i < r[1]; ++i) {
318
- this.templateList[i].layoutCache = null;
319
- }
320
- }
321
- this.cachedLayoutRange = [];
322
- }
323
-
324
314
  protected static getTemplateItem(itemObj: MeasureInfo): TemplateItem {
325
315
  const valid = this.checkMeasureObject(itemObj);
326
316
  if (!valid) {
@@ -362,7 +352,7 @@ abstract class MetroTemplate {
362
352
  top: -1,
363
353
  bottom: -1,
364
354
  },
365
- layoutCache: null,
355
+ layoutCache: new RectCache(),
366
356
  }
367
357
  }
368
358
 
@@ -5,6 +5,12 @@
5
5
  * @LastEditTime: 2022-12-01 16:49:21
6
6
  * @Description: file content
7
7
  */
8
+ import { Forge } from "@shijiu/jsview/dom/jsv-forge-define.mjs";
9
+
10
+ export const getCurFrameCount = () => {
11
+ return Forge.sFrameCount.count;
12
+ }
13
+
8
14
  export class BaseDispatcher {
9
15
  private _Component: any;
10
16
 
@@ -92,8 +98,7 @@ export const SlideStyle = {
92
98
  endBoundaryProtect: 2,
93
99
  };
94
100
 
95
- export const VERTICAL = Symbol("vertical");
96
- export const HORIZONTAL = Symbol("horizontal");
101
+ export { VERTICAL, HORIZONTAL } from "../JsViewVueTools/ConstSymbol";
97
102
 
98
103
  const defaultSpeed = 1.5;
99
104
  const defaultEasing = "";
@@ -159,6 +164,8 @@ export class WholePageSlide extends SlideSetting {
159
164
  * endPercennt: 右/下侧触发滚动的比例 0-1
160
165
  * headRange: 左/上按键触发滚动的区域比例 0-1
161
166
  * tailRange: 右/下按键触发滚动的区域比例 0-1
167
+ * headSafeArea: 保证头部item完整显示的安全区域大小
168
+ * tailSafeArea: 保证尾部item完整显示的安全区域大小
162
169
  * speed: 滚动速度, 像素/毫秒
163
170
  * easing: 滚动动画的easing
164
171
  * boundaryProtect: 确定滚动位置能否小于0或者大于最大长度
@@ -169,12 +176,16 @@ export class SeamlessSlide extends SlideSetting {
169
176
  public readonly StartPercent: number;
170
177
  public readonly EndPercent: number;
171
178
  public readonly FixFirstPage: boolean;
179
+ public readonly HeadSafeArea: number;
180
+ public readonly TailSafeArea: number;
172
181
 
173
182
  constructor({
174
183
  startPercent = 0.2,
175
184
  endPercent = 0.8,
176
185
  headRange = undefined,
177
186
  tailRange = undefined,
187
+ headSafeArea = 0.1,
188
+ tailSafeArea = 0.1,
178
189
  speed = defaultSpeed,
179
190
  duration = null,
180
191
  easing = defaultEasing,
@@ -188,14 +199,16 @@ export class SeamlessSlide extends SlideSetting {
188
199
  this.StartPercent = headRange;
189
200
  }
190
201
  if (typeof tailRange !== "undefined") {
191
- this.EndPercent = tailRange;
202
+ this.EndPercent = 1 - tailRange;
192
203
  }
193
-
204
+
194
205
  if (this.StartPercent < 0 || this.StartPercent > 1 || this.EndPercent < 0 || this.EndPercent > 1) {
195
206
  console.error(`SeamlessSlideSetting error: invalide value, startPercent(${this.StartPercent}) and endPercent(${this.EndPercent}) must between 0 and 1.`);
196
- this.StartPercent = 0.2;
197
- this.EndPercent = 0.8;
207
+ this.StartPercent = 0.3;
208
+ this.EndPercent = 0.7;
198
209
  }
210
+ this.HeadSafeArea = headSafeArea;
211
+ this.TailSafeArea = tailSafeArea;
199
212
  this.FixFirstPage = fixFirstPage;
200
213
  }
201
214
  }
@@ -240,4 +253,4 @@ export const FocusMoveType = {
240
253
  ROW_FIND_NEAR: 0x00000001 << 3,
241
254
  };
242
255
 
243
- export const RENDER_ITEM_BREAK_KEY = "__QcodeJsviewMetroWidgetSlot";
256
+ export const RENDER_ITEM_BREAK_KEY = "__QcodeJsviewMetroWidgetSlot";
@@ -270,6 +270,11 @@ export default {
270
270
  * 视频显示在活跃JsvPlayer设置的显示区域内,事件通知也只会送给活跃的JsvPlayer组件注册的回调函数。
271
271
  */
272
272
  active: { type: Boolean, default: true },
273
+
274
+ /**
275
+ * 属性,Number,视频播放窗的圆角设置
276
+ */
277
+ corner: { type: Number, default: 0 },
273
278
  },
274
279
  components: {},
275
280
  watch: {
@@ -366,6 +371,7 @@ export default {
366
371
  // 创建PC版本的video标签
367
372
  this.video = window.originDocument.createElement("video");
368
373
  this._extendsApi(this.video);
374
+ this.video.style.borderRadius = this.corner + "px";
369
375
  } else {
370
376
  this.video.setRef();
371
377
  first_create = false;
@@ -489,7 +495,13 @@ export default {
489
495
  </script>
490
496
 
491
497
  <template>
492
- <div :style="holeStyle" backgroundColor="rgba(0,0,0,1)">
498
+ <div
499
+ :style="{
500
+ ...holeStyle,
501
+ backgroundColor: 'rgba(0,0,0,1)',
502
+ borderRadius: corner,
503
+ }"
504
+ >
493
505
  <div
494
506
  :style="{
495
507
  left: holeStyle.left,