@tmagic/editor 1.8.0-beta.16 → 1.8.0-beta.17

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.
@@ -82,6 +82,11 @@ export interface EditorProps {
82
82
  containerHighlightDuration?: number;
83
83
  /** 拖入画布中容器时,识别容器的操作类型 */
84
84
  containerHighlightType?: ContainerHighlightType;
85
+ /**
86
+ * 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
87
+ * 开启后在画布中拖动已有组件不会识别容器,默认 false
88
+ */
89
+ containerHighlightAddOnly?: boolean;
85
90
  /** 画布大小 */
86
91
  stageRect?: StageRect;
87
92
  /** monaco editor 的配置 */
@@ -163,6 +168,7 @@ export const defaultEditorProps = {
163
168
  containerHighlightClassName: CONTAINER_HIGHLIGHT_CLASS_NAME,
164
169
  containerHighlightDuration: 800,
165
170
  containerHighlightType: ContainerHighlightType.DEFAULT,
171
+ containerHighlightAddOnly: false,
166
172
  disabledShowSrc: false,
167
173
  disabledDataSource: false,
168
174
  disabledCodeBlock: false,
@@ -37,13 +37,12 @@
37
37
  :model="entry.cardItem"
38
38
  :last-values="entry.lastCardItem"
39
39
  :is-compare="isCompareMode"
40
- :hide-expand="true"
40
+ :hide-expand="false"
41
41
  :label-width="config.labelWidth || '100px'"
42
42
  @change="onChangeHandler"
43
43
  >
44
44
  <template #header>
45
45
  <div class="event-item-header">
46
- <div class="event-item-title">事件{{ Number(entry.index) + 1 }}</div>
47
46
  <MFormContainer
48
47
  class="fullWidth"
49
48
  :config="eventNameConfig"
@@ -210,6 +209,12 @@ const actionTypeConfig = computed(() => {
210
209
  trigger: 'blur',
211
210
  },
212
211
  ],
212
+ onChange: (_mForm: FormState, _v: string, { setModel }: any) => {
213
+ setModel('to', '');
214
+ setModel('method', '');
215
+ setModel('codeId', '');
216
+ setModel('dataSourceMethod', []);
217
+ },
213
218
  };
214
219
  return { ...defaultActionTypeConfig, ...props.config.actionTypeConfig };
215
220
  });
@@ -222,7 +227,7 @@ const targetCompConfig = computed(() => {
222
227
  type: 'ui-select',
223
228
  labelPosition: 'left',
224
229
  display: (_mForm, { model }) => model.actionType === ActionType.COMP,
225
- onChange: (_MForm, _v, { setModel }) => {
230
+ onChange: (_mForm, _v, { setModel }) => {
226
231
  setModel('method', '');
227
232
  },
228
233
  rules: [
@@ -28,6 +28,7 @@ export const useStage = (stageOptions: StageOptions) => {
28
28
  containerHighlightClassName: stageOptions.containerHighlightClassName,
29
29
  containerHighlightDuration: stageOptions.containerHighlightDuration,
30
30
  containerHighlightType: stageOptions.containerHighlightType,
31
+ containerHighlightAddOnly: stageOptions.containerHighlightAddOnly,
31
32
  disabledDragStart: stageOptions.disabledDragStart,
32
33
  renderType: stageOptions.renderType,
33
34
  canSelect: (el, event, stop) => {
@@ -333,11 +333,11 @@ export const initServiceEvents = (
333
333
  Promise.all(
334
334
  nodes.map((node) => {
335
335
  if (node.type === NodeType.ROOT) {
336
- return Promise.resolve();
336
+ return Promise.resolve(true);
337
337
  }
338
338
  return depService.collectIdle([node], { pageId: getPageIdByNode(node) }, deep, type);
339
339
  }),
340
- );
340
+ ).then((results) => results.every(Boolean));
341
341
 
342
342
  watch(
343
343
  () => editorService.get('stage'),
@@ -351,7 +351,7 @@ export const initServiceEvents = (
351
351
 
352
352
  if (!node) return;
353
353
 
354
- await collectIdle([node], true, DepTargetType.DATA_SOURCE);
354
+ if (!(await collectIdle([node], true, DepTargetType.DATA_SOURCE))) return;
355
355
  updateStageNode(node);
356
356
  });
357
357
  },
@@ -494,8 +494,10 @@ export const initServiceEvents = (
494
494
 
495
495
  // 新增节点,收集依赖
496
496
  const nodeAddHandler = (nodes: MComponent[]) => {
497
- collectIdle(nodes, true).then(() => {
498
- updateStageNodes(nodes);
497
+ collectIdle(nodes, true).then((completed) => {
498
+ if (completed) {
499
+ updateStageNodes(nodes);
500
+ }
499
501
  });
500
502
  };
501
503
 
@@ -549,8 +551,8 @@ export const initServiceEvents = (
549
551
  if (needRecollectNodes.length) {
550
552
  // 有数据源依赖,需要等依赖重新收集完才更新stage
551
553
  const handler = async () => {
552
- await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE);
553
- await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND);
554
+ if (!(await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE))) return;
555
+ if (!(await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND))) return;
554
556
  updateStageNodes(needRecollectNodes);
555
557
  };
556
558
  handler();
@@ -572,8 +574,10 @@ export const initServiceEvents = (
572
574
 
573
575
  // 历史记录变化时,需要重新收集依赖
574
576
  const historyChangeHandler = (page: MPage | MPageFragment) => {
575
- collectIdle([page], true).then(() => {
576
- updateStageNode(page);
577
+ collectIdle([page], true).then((completed) => {
578
+ if (completed) {
579
+ updateStageNode(page);
580
+ }
577
581
  });
578
582
  };
579
583
 
@@ -654,7 +658,7 @@ export const initServiceEvents = (
654
658
  if (Array.isArray(root?.items)) {
655
659
  depService.clearIdleTasks();
656
660
 
657
- let collectIdlePromises: Promise<void[]>[] = [];
661
+ let collectIdlePromises: Promise<boolean>[] = [];
658
662
  if (isModifyField) {
659
663
  depService.removeTarget(config.id, DepTargetType.DATA_SOURCE);
660
664
  depService.removeTarget(config.id, DepTargetType.DATA_SOURCE_COND);
@@ -679,10 +683,15 @@ export const initServiceEvents = (
679
683
 
680
684
  collectIdlePromises = [collectIdle(root.items, true, DepTargetType.DATA_SOURCE_METHOD)];
681
685
  }
682
- Promise.all(collectIdlePromises)
683
- .then(() => updateDataSourceSchema())
684
- .then(() => updateDsData())
685
- .then(() => updateStageNodes(root.items));
686
+ const handler = async () => {
687
+ const results = await Promise.all(collectIdlePromises);
688
+ if (!results.every(Boolean)) return;
689
+
690
+ updateDataSourceSchema();
691
+ await updateDsData();
692
+ updateStageNodes(root.items);
693
+ };
694
+ handler();
686
695
  }
687
696
  } else if (root?.dataSources) {
688
697
  updateDsData();
@@ -706,11 +715,12 @@ export const initServiceEvents = (
706
715
  const nodeIds = Object.keys(root.dataSourceDeps?.[id] || {});
707
716
  const nodes = getNodes(nodeIds, root.items);
708
717
 
709
- await Promise.all([
718
+ const results = await Promise.all([
710
719
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE),
711
720
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE_COND),
712
721
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE_METHOD),
713
722
  ]);
723
+ if (!results.every(Boolean)) return;
714
724
 
715
725
  updateDataSourceSchema();
716
726
 
@@ -145,6 +145,6 @@ const dragHandler = (e: DragEvent) => {
145
145
 
146
146
  if (timeout || !stage.value) return;
147
147
 
148
- timeout = stage.value.delayedMarkContainer(e);
148
+ timeout = stage.value.delayedMarkContainer(e, [], true);
149
149
  };
150
150
  </script>
@@ -42,6 +42,21 @@ interface State {
42
42
 
43
43
  type StateKey = keyof State;
44
44
 
45
+ /**
46
+ * 一次 collectIdle 调用对应一个批次。批次自行统计入队/完成的任务数,在自身任务全部完成或被中断时
47
+ * 结算对应的 Promise,避免多次快速触发时共用 idleTask 的 finish 事件造成的串扰、提前 resolve,
48
+ * 以及 clearTasks 后 Promise 永不 resolve(collecting 卡死、监听器泄漏)。
49
+ */
50
+ interface CollectBatch {
51
+ nodes: MNode[];
52
+ deep: boolean;
53
+ pending: number;
54
+ dsPending: number;
55
+ collectedEmitted: boolean;
56
+ dsSettled: boolean;
57
+ resolve: (completed: boolean) => void;
58
+ }
59
+
45
60
  class Dep extends BaseService {
46
61
  private state = shallowReactive<State>({
47
62
  collecting: false,
@@ -54,6 +69,12 @@ class Dep extends BaseService {
54
69
 
55
70
  private waitingWorker?: Promise<void>;
56
71
 
72
+ private resolveWaitingWorker?: () => void;
73
+
74
+ private workerGeneration = 0;
75
+
76
+ private activeBatches = new Set<CollectBatch>();
77
+
57
78
  constructor() {
58
79
  super();
59
80
 
@@ -137,38 +158,44 @@ class Dep extends BaseService {
137
158
  await this.waitingWorker;
138
159
  }
139
160
 
140
- this.set('collecting', true);
141
- let startTask = false;
142
- this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
143
- startTask = true;
161
+ const batch: CollectBatch = {
162
+ nodes,
163
+ deep,
164
+ pending: 0,
165
+ dsPending: 0,
166
+ collectedEmitted: false,
167
+ dsSettled: false,
168
+ resolve: () => {},
169
+ };
144
170
 
145
- this.enqueueTask(node, target, depExtendedData, deep);
171
+ this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
172
+ this.enqueueTask(node, target, depExtendedData, deep, batch);
146
173
  });
147
174
 
148
- return new Promise<void>((resolve) => {
149
- if (!startTask) {
150
- this.emit('collected', nodes, deep);
151
- this.set('collecting', false);
152
- resolve();
153
- return;
154
- }
155
- this.idleTask.once('finish', () => {
156
- this.emit('collected', nodes, deep);
157
- this.set('collecting', false);
158
- });
159
- this.idleTask.once('hight-level-finish', () => {
160
- this.emit('ds-collected', nodes, deep);
161
- resolve();
162
- });
175
+ // 没有命中任何 target,无需收集,直接完成
176
+ if (batch.pending === 0) {
177
+ this.emit('collected', nodes, deep);
178
+ this.updateCollectingState();
179
+ return true;
180
+ }
181
+
182
+ this.activeBatches.add(batch);
183
+ this.set('collecting', true);
184
+
185
+ return new Promise<boolean>((resolve) => {
186
+ batch.resolve = resolve;
163
187
  });
164
188
  }
165
189
 
166
190
  public collectByWorker(dsl: MApp) {
167
191
  this.set('collecting', true);
192
+ this.workerGeneration += 1;
193
+ const generation = this.workerGeneration;
168
194
 
169
195
  const { promise, resolve: waitingResolve } = Promise.withResolvers<void>();
170
196
 
171
197
  this.waitingWorker = promise;
198
+ this.resolveWaitingWorker = waitingResolve;
172
199
 
173
200
  return new Promise<Record<string, Record<string, DepData>>>((resolve) => {
174
201
  const worker = new Work();
@@ -182,6 +209,11 @@ class Dep extends BaseService {
182
209
  resolve({});
183
210
  };
184
211
  }).then((depsData) => {
212
+ if (generation !== this.workerGeneration) {
213
+ waitingResolve();
214
+ return depsData;
215
+ }
216
+
185
217
  traverseTarget(this.watcher.getTargetsList(), (target) => {
186
218
  if (depsData[target.type]?.[target.id]) {
187
219
  target.deps = reactive(depsData[target.type][target.id]);
@@ -200,6 +232,10 @@ class Dep extends BaseService {
200
232
  this.emit('collected', dsl.items, true);
201
233
  this.emit('ds-collected', dsl.items, true);
202
234
  waitingResolve();
235
+ if (this.waitingWorker === promise) {
236
+ this.waitingWorker = undefined;
237
+ this.resolveWaitingWorker = undefined;
238
+ }
203
239
 
204
240
  return depsData;
205
241
  });
@@ -233,6 +269,7 @@ class Dep extends BaseService {
233
269
  }
234
270
 
235
271
  public clearIdleTasks() {
272
+ this.abortActiveBatches();
236
273
  this.idleTask.clearTasks();
237
274
  }
238
275
 
@@ -251,6 +288,11 @@ class Dep extends BaseService {
251
288
  }
252
289
 
253
290
  public reset() {
291
+ this.abortActiveBatches();
292
+ this.workerGeneration += 1;
293
+ this.resolveWaitingWorker?.();
294
+ this.resolveWaitingWorker = undefined;
295
+ this.waitingWorker = undefined;
254
296
  this.idleTask.clearTasks();
255
297
 
256
298
  for (const type of Object.keys(this.watcher.getTargetsList())) {
@@ -286,25 +328,99 @@ class Dep extends BaseService {
286
328
  }
287
329
  }
288
330
 
289
- private enqueueTask(node: MNode, target: Target, depExtendedData: DepExtendedData, deep: boolean) {
331
+ private enqueueTask(
332
+ node: MNode,
333
+ target: Target,
334
+ depExtendedData: DepExtendedData,
335
+ deep: boolean,
336
+ batch: CollectBatch,
337
+ ) {
338
+ const isDataSource = target.type === DepTargetType.DATA_SOURCE;
339
+
340
+ batch.pending += 1;
341
+ if (isDataSource) {
342
+ batch.dsPending += 1;
343
+ }
344
+
290
345
  this.idleTask.enqueueTask(
291
346
  ({ node, deep, target }) => {
292
- this.collectNode(node, target, depExtendedData, deep);
347
+ try {
348
+ this.collectNode(node, target, depExtendedData, deep);
349
+ } finally {
350
+ this.onBatchTaskDone(batch, isDataSource);
351
+ }
293
352
  },
294
353
  {
295
354
  node,
296
355
  deep: false,
297
356
  target,
298
357
  },
299
- target.type === DepTargetType.DATA_SOURCE,
358
+ isDataSource,
300
359
  );
301
360
 
302
361
  if (deep && Array.isArray(node.items) && node.items.length) {
303
362
  node.items.forEach((item) => {
304
- this.enqueueTask(item, target, depExtendedData, deep);
363
+ this.enqueueTask(item, target, depExtendedData, deep, batch);
305
364
  });
306
365
  }
307
366
  }
367
+
368
+ private onBatchTaskDone(batch: CollectBatch, isDataSource: boolean) {
369
+ if (isDataSource) {
370
+ batch.dsPending -= 1;
371
+ // 数据源依赖收集完先 resolve,让 stage 尽快更新,其余依赖继续在后台收集
372
+ if (batch.dsPending === 0) {
373
+ this.settleBatchDs(batch);
374
+ }
375
+ }
376
+
377
+ batch.pending -= 1;
378
+ if (batch.pending === 0) {
379
+ this.finishBatch(batch);
380
+ }
381
+ }
382
+
383
+ private settleBatchDs(batch: CollectBatch) {
384
+ if (batch.dsSettled) return;
385
+ batch.dsSettled = true;
386
+ this.emit('ds-collected', batch.nodes, batch.deep);
387
+ batch.resolve(true);
388
+ }
389
+
390
+ private finishBatch(batch: CollectBatch) {
391
+ if (!batch.collectedEmitted) {
392
+ batch.collectedEmitted = true;
393
+ this.emit('collected', batch.nodes, batch.deep);
394
+ }
395
+ // 没有数据源任务的批次在此结算 Promise
396
+ this.settleBatchDs(batch);
397
+ this.activeBatches.delete(batch);
398
+ this.updateCollectingState();
399
+ }
400
+
401
+ /**
402
+ * idleTask 被清空时,在途批次的任务不会再执行,必须主动结算,
403
+ * 否则对应的 collectIdle Promise 永远不会 resolve(collecting 卡在 true、once 监听器泄漏)。
404
+ * 收集被中断(通常紧跟一次全量重新收集),因此不再 emit collected/ds-collected,仅结算 Promise。
405
+ */
406
+ private abortActiveBatches() {
407
+ if (!this.activeBatches.size) {
408
+ return;
409
+ }
410
+
411
+ const batches = [...this.activeBatches];
412
+ this.activeBatches.clear();
413
+
414
+ for (const batch of batches) {
415
+ batch.resolve(false);
416
+ }
417
+
418
+ this.updateCollectingState();
419
+ }
420
+
421
+ private updateCollectingState() {
422
+ this.set('collecting', this.activeBatches.size > 0);
423
+ }
308
424
  }
309
425
 
310
426
  export type DepService = Dep;
@@ -26,7 +26,7 @@
26
26
  > .m-fields-group-list {
27
27
  > .tmagic-design-card--flat {
28
28
  > .el-card__header {
29
- padding: 16px 0;
29
+ padding: 8px 0;
30
30
  }
31
31
  }
32
32
  }
@@ -34,7 +34,7 @@
34
34
  .create-button {
35
35
  &.fullWidth {
36
36
  width: 100%;
37
- margin: 0 0 16px 0;
37
+ margin: 0 0 8px 0;
38
38
  }
39
39
  }
40
40
  }
@@ -1,8 +1,11 @@
1
1
  .m-fields-event-select {
2
2
  width: 100%;
3
3
  .fullWidth {
4
- width: 100%;
4
+ width: calc(100% - 32px);
5
5
  box-sizing: border-box;
6
+ &.create-button {
7
+ width: 100%;
8
+ }
6
9
  }
7
10
  .event-select-container {
8
11
  padding: 0 16px;
@@ -11,7 +14,7 @@
11
14
  border-bottom: 1px solid #ebeef5;
12
15
  }
13
16
  > .el-card__body {
14
- padding-bottom: 16px;
17
+ padding-bottom: 8px;
15
18
  .m-fields-group-list-footer {
16
19
  div {
17
20
  justify-content: flex-start !important;
@@ -19,7 +22,7 @@
19
22
  }
20
23
  .el-card.tmagic-design-card--flat {
21
24
  > .el-card__header {
22
- padding: 16px 0;
25
+ padding: 8px 0;
23
26
  }
24
27
  }
25
28
  }
@@ -76,17 +79,18 @@
76
79
  .event-item-header {
77
80
  position: relative;
78
81
  width: 100%;
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: space-between;
79
85
  .event-item-title {
80
86
  color: #0f1113;
81
87
  font-size: 16px;
82
88
  font-weight: 500;
83
89
  line-height: 24px;
84
- margin-bottom: 16px;
90
+ margin-bottom: 8px;
85
91
  }
86
92
  .event-item-delete-button {
87
- position: absolute;
88
- right: 0;
89
- top: 0;
93
+ color: #0f1113;
90
94
  }
91
95
 
92
96
  .el-form-item {
package/src/type.ts CHANGED
@@ -178,6 +178,11 @@ export interface StageOptions {
178
178
  containerHighlightClassName?: string;
179
179
  containerHighlightDuration?: number;
180
180
  containerHighlightType?: ContainerHighlightType;
181
+ /**
182
+ * 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
183
+ * 开启后在画布中拖动已有组件不会识别容器,默认 false
184
+ */
185
+ containerHighlightAddOnly?: boolean;
181
186
  disabledDragStart?: boolean;
182
187
  render?: (stage: StageCore) => HTMLDivElement | void | Promise<HTMLDivElement | void>;
183
188
  moveableOptions?: CustomizeMoveableOptions;
@@ -25,6 +25,12 @@ globalThis.requestIdleCallback =
25
25
  }, 1);
26
26
  };
27
27
 
28
+ globalThis.cancelIdleCallback =
29
+ globalThis.cancelIdleCallback ||
30
+ function (handle) {
31
+ clearTimeout(handle as unknown as ReturnType<typeof setTimeout>);
32
+ };
33
+
28
34
  export class IdleTask<T = any> extends EventEmitter {
29
35
  private taskList: TaskList<T> = [];
30
36
 
package/types/index.d.ts CHANGED
@@ -520,6 +520,9 @@ declare class Dep extends BaseService {
520
520
  private idleTask;
521
521
  private watcher;
522
522
  private waitingWorker?;
523
+ private resolveWaitingWorker?;
524
+ private workerGeneration;
525
+ private activeBatches;
523
526
  constructor();
524
527
  set<K extends StateKey, T extends State$1[K]>(name: K, value: T): void;
525
528
  get<K extends StateKey>(name: K): State$1[K];
@@ -533,7 +536,7 @@ declare class Dep extends BaseService {
533
536
  removeTarget(id: Id, type?: string): void;
534
537
  clearTargets(): void;
535
538
  collect(nodes: MNode[], depExtendedData?: DepExtendedData, deep?: boolean, type?: DepTargetType$1): void;
536
- collectIdle(nodes: MNode[], depExtendedData?: DepExtendedData, deep?: boolean, type?: DepTargetType$1): Promise<void>;
539
+ collectIdle(nodes: MNode[], depExtendedData?: DepExtendedData, deep?: boolean, type?: DepTargetType$1): Promise<boolean>;
537
540
  collectByWorker(dsl: MApp): Promise<Record<string, Record<string, DepData>>>;
538
541
  collectNode(node: MNode, target: Target, depExtendedData?: DepExtendedData, deep?: boolean): void;
539
542
  clear(nodes?: MNode[]): void;
@@ -552,6 +555,16 @@ declare class Dep extends BaseService {
552
555
  */
553
556
  private removePageDep;
554
557
  private enqueueTask;
558
+ private onBatchTaskDone;
559
+ private settleBatchDs;
560
+ private finishBatch;
561
+ /**
562
+ * idleTask 被清空时,在途批次的任务不会再执行,必须主动结算,
563
+ * 否则对应的 collectIdle Promise 永远不会 resolve(collecting 卡在 true、once 监听器泄漏)。
564
+ * 收集被中断(通常紧跟一次全量重新收集),因此不再 emit collected/ds-collected,仅结算 Promise。
565
+ */
566
+ private abortActiveBatches;
567
+ private updateCollectingState;
555
568
  }
556
569
  type DepService = Dep;
557
570
  declare const _default$44: Dep;
@@ -1700,6 +1713,11 @@ interface StageOptions {
1700
1713
  containerHighlightClassName?: string;
1701
1714
  containerHighlightDuration?: number;
1702
1715
  containerHighlightType?: ContainerHighlightType;
1716
+ /**
1717
+ * 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
1718
+ * 开启后在画布中拖动已有组件不会识别容器,默认 false
1719
+ */
1720
+ containerHighlightAddOnly?: boolean;
1703
1721
  disabledDragStart?: boolean;
1704
1722
  render?: (stage: StageCore$1) => HTMLDivElement | void | Promise<HTMLDivElement | void>;
1705
1723
  moveableOptions?: CustomizeMoveableOptions;
@@ -3657,6 +3675,11 @@ interface EditorProps {
3657
3675
  containerHighlightDuration?: number;
3658
3676
  /** 拖入画布中容器时,识别容器的操作类型 */
3659
3677
  containerHighlightType?: ContainerHighlightType;
3678
+ /**
3679
+ * 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
3680
+ * 开启后在画布中拖动已有组件不会识别容器,默认 false
3681
+ */
3682
+ containerHighlightAddOnly?: boolean;
3660
3683
  /** 画布大小 */
3661
3684
  stageRect?: StageRect;
3662
3685
  /** monaco editor 的配置 */
@@ -4720,6 +4743,7 @@ declare const __VLS_base$12: import("@vue/runtime-core").DefineComponent<EditorP
4720
4743
  datasourceConfigs: Record<string, import("@tmagic/form-schema").FormConfig>;
4721
4744
  containerHighlightDuration: number;
4722
4745
  containerHighlightType: import("@tmagic/stage").ContainerHighlightType;
4746
+ containerHighlightAddOnly: boolean;
4723
4747
  canSelect: (el: HTMLElement) => boolean | Promise<boolean>;
4724
4748
  }, {}, {}, {}, string, import("@vue/runtime-core").ComponentProvideOptions, false, {}, any>;
4725
4749
  declare const __VLS_export$39: __VLS_WithSlots$12<typeof __VLS_base$12, __VLS_Slots$12>;