@deot/vc 1.0.12 → 1.0.14

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.d.ts CHANGED
@@ -4175,7 +4175,7 @@ export declare const Components: {
4175
4175
  validator: (v: string) => boolean;
4176
4176
  default: string;
4177
4177
  };
4178
- portalClass: (ObjectConstructor | StringConstructor)[];
4178
+ contentClass: (ObjectConstructor | StringConstructor)[];
4179
4179
  width: {
4180
4180
  type: NumberConstructor;
4181
4181
  };
@@ -4223,6 +4223,10 @@ export declare const Components: {
4223
4223
  type: BooleanConstructor;
4224
4224
  default: boolean;
4225
4225
  };
4226
+ border: {
4227
+ type: BooleanConstructor;
4228
+ default: boolean;
4229
+ };
4226
4230
  onOk: {
4227
4231
  type: FunctionConstructor;
4228
4232
  };
@@ -4242,6 +4246,7 @@ export declare const Components: {
4242
4246
  mask: boolean;
4243
4247
  modelValue: boolean;
4244
4248
  closable: boolean;
4249
+ border: boolean;
4245
4250
  content: string | ((props: Record<string, unknown>, context: SetupContext) => any);
4246
4251
  maskClosable: boolean;
4247
4252
  scrollable: boolean;
@@ -4275,7 +4280,7 @@ export declare const Components: {
4275
4280
  validator: (v: string) => boolean;
4276
4281
  default: string;
4277
4282
  };
4278
- portalClass: (ObjectConstructor | StringConstructor)[];
4283
+ contentClass: (ObjectConstructor | StringConstructor)[];
4279
4284
  width: {
4280
4285
  type: NumberConstructor;
4281
4286
  };
@@ -4323,6 +4328,10 @@ export declare const Components: {
4323
4328
  type: BooleanConstructor;
4324
4329
  default: boolean;
4325
4330
  };
4331
+ border: {
4332
+ type: BooleanConstructor;
4333
+ default: boolean;
4334
+ };
4326
4335
  onOk: {
4327
4336
  type: FunctionConstructor;
4328
4337
  };
@@ -4342,6 +4351,7 @@ export declare const Components: {
4342
4351
  mask: boolean;
4343
4352
  modelValue: boolean;
4344
4353
  closable: boolean;
4354
+ border: boolean;
4345
4355
  content: string | ((props: Record<string, unknown>, context: SetupContext) => any);
4346
4356
  maskClosable: boolean;
4347
4357
  scrollable: boolean;
@@ -4372,7 +4382,7 @@ export declare const Components: {
4372
4382
  validator: (v: string) => boolean;
4373
4383
  default: string;
4374
4384
  };
4375
- portalClass: (ObjectConstructor | StringConstructor)[];
4385
+ contentClass: (ObjectConstructor | StringConstructor)[];
4376
4386
  width: {
4377
4387
  type: NumberConstructor;
4378
4388
  };
@@ -4420,6 +4430,10 @@ export declare const Components: {
4420
4430
  type: BooleanConstructor;
4421
4431
  default: boolean;
4422
4432
  };
4433
+ border: {
4434
+ type: BooleanConstructor;
4435
+ default: boolean;
4436
+ };
4423
4437
  onOk: {
4424
4438
  type: FunctionConstructor;
4425
4439
  };
@@ -4439,6 +4453,7 @@ export declare const Components: {
4439
4453
  mask: boolean;
4440
4454
  modelValue: boolean;
4441
4455
  closable: boolean;
4456
+ border: boolean;
4442
4457
  content: string | ((props: Record<string, unknown>, context: SetupContext) => any);
4443
4458
  maskClosable: boolean;
4444
4459
  scrollable: boolean;
@@ -4455,6 +4470,7 @@ export declare const Components: {
4455
4470
  mask: boolean;
4456
4471
  modelValue: boolean;
4457
4472
  closable: boolean;
4473
+ border: boolean;
4458
4474
  content: string | ((props: Record<string, unknown>, context: SetupContext) => any);
4459
4475
  maskClosable: boolean;
4460
4476
  scrollable: boolean;
@@ -4467,10 +4483,10 @@ export declare const Components: {
4467
4483
  title?: string | undefined;
4468
4484
  mode?: "error" | "success" | "info" | "warning" | undefined;
4469
4485
  onCancel?: Function | undefined;
4470
- portalClass?: string | Record<string, any> | undefined;
4471
4486
  width?: number | undefined;
4472
4487
  wrapperStyle?: string | Record<string, any> | undefined;
4473
4488
  onOk?: Function | undefined;
4489
+ contentClass?: string | Record<string, any> | undefined;
4474
4490
  } & {
4475
4491
  onClose: (...args: any[]) => any;
4476
4492
  }>) => PortalLeaf;
@@ -4480,6 +4496,7 @@ export declare const Components: {
4480
4496
  mask: boolean;
4481
4497
  modelValue: boolean;
4482
4498
  closable: boolean;
4499
+ border: boolean;
4483
4500
  content: string | ((props: Record<string, unknown>, context: SetupContext) => any);
4484
4501
  maskClosable: boolean;
4485
4502
  scrollable: boolean;
@@ -4492,10 +4509,10 @@ export declare const Components: {
4492
4509
  title?: string | undefined;
4493
4510
  mode?: "error" | "success" | "info" | "warning" | undefined;
4494
4511
  onCancel?: Function | undefined;
4495
- portalClass?: string | Record<string, any> | undefined;
4496
4512
  width?: number | undefined;
4497
4513
  wrapperStyle?: string | Record<string, any> | undefined;
4498
4514
  onOk?: Function | undefined;
4515
+ contentClass?: string | Record<string, any> | undefined;
4499
4516
  } & {
4500
4517
  onClose: (...args: any[]) => any;
4501
4518
  }>) => PortalLeaf;
@@ -4505,6 +4522,7 @@ export declare const Components: {
4505
4522
  mask: boolean;
4506
4523
  modelValue: boolean;
4507
4524
  closable: boolean;
4525
+ border: boolean;
4508
4526
  content: string | ((props: Record<string, unknown>, context: SetupContext) => any);
4509
4527
  maskClosable: boolean;
4510
4528
  scrollable: boolean;
@@ -4517,10 +4535,10 @@ export declare const Components: {
4517
4535
  title?: string | undefined;
4518
4536
  mode?: "error" | "success" | "info" | "warning" | undefined;
4519
4537
  onCancel?: Function | undefined;
4520
- portalClass?: string | Record<string, any> | undefined;
4521
4538
  width?: number | undefined;
4522
4539
  wrapperStyle?: string | Record<string, any> | undefined;
4523
4540
  onOk?: Function | undefined;
4541
+ contentClass?: string | Record<string, any> | undefined;
4524
4542
  } & {
4525
4543
  onClose: (...args: any[]) => any;
4526
4544
  }>) => PortalLeaf;
@@ -4530,6 +4548,7 @@ export declare const Components: {
4530
4548
  mask: boolean;
4531
4549
  modelValue: boolean;
4532
4550
  closable: boolean;
4551
+ border: boolean;
4533
4552
  content: string | ((props: Record<string, unknown>, context: SetupContext) => any);
4534
4553
  maskClosable: boolean;
4535
4554
  scrollable: boolean;
@@ -4542,10 +4561,10 @@ export declare const Components: {
4542
4561
  title?: string | undefined;
4543
4562
  mode?: "error" | "success" | "info" | "warning" | undefined;
4544
4563
  onCancel?: Function | undefined;
4545
- portalClass?: string | Record<string, any> | undefined;
4546
4564
  width?: number | undefined;
4547
4565
  wrapperStyle?: string | Record<string, any> | undefined;
4548
4566
  onOk?: Function | undefined;
4567
+ contentClass?: string | Record<string, any> | undefined;
4549
4568
  } & {
4550
4569
  onClose: (...args: any[]) => any;
4551
4570
  }>) => PortalLeaf;
@@ -4569,7 +4588,7 @@ export declare const Components: {
4569
4588
  validator: (v: string) => boolean;
4570
4589
  default: string;
4571
4590
  };
4572
- portalClass: (ObjectConstructor | StringConstructor)[];
4591
+ contentClass: (ObjectConstructor | StringConstructor)[];
4573
4592
  width: {
4574
4593
  type: NumberConstructor;
4575
4594
  };
@@ -4617,6 +4636,10 @@ export declare const Components: {
4617
4636
  type: BooleanConstructor;
4618
4637
  default: boolean;
4619
4638
  };
4639
+ border: {
4640
+ type: BooleanConstructor;
4641
+ default: boolean;
4642
+ };
4620
4643
  onOk: {
4621
4644
  type: FunctionConstructor;
4622
4645
  };
@@ -4641,7 +4664,7 @@ export declare const Components: {
4641
4664
  validator: (v: string) => boolean;
4642
4665
  default: string;
4643
4666
  };
4644
- portalClass: (ObjectConstructor | StringConstructor)[];
4667
+ contentClass: (ObjectConstructor | StringConstructor)[];
4645
4668
  width: {
4646
4669
  type: NumberConstructor;
4647
4670
  };
@@ -4689,6 +4712,10 @@ export declare const Components: {
4689
4712
  type: BooleanConstructor;
4690
4713
  default: boolean;
4691
4714
  };
4715
+ border: {
4716
+ type: BooleanConstructor;
4717
+ default: boolean;
4718
+ };
4692
4719
  onOk: {
4693
4720
  type: FunctionConstructor;
4694
4721
  };
@@ -4708,6 +4735,7 @@ export declare const Components: {
4708
4735
  mask: boolean;
4709
4736
  modelValue: boolean;
4710
4737
  closable: boolean;
4738
+ border: boolean;
4711
4739
  content: string | ((props: Record<string, unknown>, context: SetupContext) => any);
4712
4740
  maskClosable: boolean;
4713
4741
  scrollable: boolean;
@@ -24841,7 +24841,7 @@ var Vc = (function (exports, vue) {
24841
24841
  });
24842
24842
  const COMPONENT_NAME$1T = "vc-alert";
24843
24843
  const THEME_MAP = {
24844
- info: ["#5495f6", "#91d5ff", "#e6f7ff"],
24844
+ info: ["#2B72FD", "#91d5ff", "#e6f7ff"],
24845
24845
  success: ["#52c41a", "#b7eb8f", "#f6ffed"],
24846
24846
  error: ["#ed4014", "#ffb08f", "#fbe9e9"],
24847
24847
  warning: ["#ffbf00", "#ffe58f", "#fffbe6"]
@@ -33841,7 +33841,7 @@ var Vc = (function (exports, vue) {
33841
33841
  validator: (v) => /(small|medium|large)/.test(v),
33842
33842
  default: "small"
33843
33843
  },
33844
- portalClass: [Object, String],
33844
+ contentClass: [Object, String],
33845
33845
  width: {
33846
33846
  type: Number
33847
33847
  },
@@ -33890,6 +33890,10 @@ var Vc = (function (exports, vue) {
33890
33890
  type: Boolean,
33891
33891
  default: true
33892
33892
  },
33893
+ border: {
33894
+ type: Boolean,
33895
+ default: false
33896
+ },
33893
33897
  /**
33894
33898
  * 兼容portal设计, 实现Promise方式
33895
33899
  */
@@ -34142,7 +34146,8 @@ var Vc = (function (exports, vue) {
34142
34146
  "class": [{
34143
34147
  "is-drag": props2.draggable,
34144
34148
  "is-large": props2.size === "large" || props2.size === "medium",
34145
- "is-no-footer": !props2.footer || !props2.cancelText && !props2.okText
34149
+ "has-footer": props2.footer && (props2.cancelText || props2.okText),
34150
+ "has-border": props2.border
34146
34151
  }, "vc-modal__container"],
34147
34152
  "style": [basicStyle.value, draggableStyle.value]
34148
34153
  }, [vue.createVNode("div", {
@@ -34174,7 +34179,7 @@ var Vc = (function (exports, vue) {
34174
34179
  "height": isTransitionEnd.value ? row.height : void 0,
34175
34180
  "contentClass": [{
34176
34181
  "is-confirm": props2.mode
34177
- }, props2.portalClass, "vc-modal__content"]
34182
+ }, props2.contentClass, "vc-modal__content"]
34178
34183
  }, {
34179
34184
  default: () => [typeof props2.content === "string" ? vue.createVNode("div", {
34180
34185
  "innerHTML": props2.content
@@ -35558,7 +35563,7 @@ var Vc = (function (exports, vue) {
35558
35563
  color: {
35559
35564
  type: [Object, String],
35560
35565
  default: () => ({
35561
- normal: "#5495f6",
35566
+ normal: "#2B72FD",
35562
35567
  success: "#52c41a",
35563
35568
  error: "#f5222d"
35564
35569
  })
@@ -36705,6 +36710,8 @@ var Vc = (function (exports, vue) {
36705
36710
  });
36706
36711
  if (!originalData.length) {
36707
36712
  rebuildData.value = [];
36713
+ } else {
36714
+ rebuildData.value = originalData.slice();
36708
36715
  }
36709
36716
  offsetPageSize.value = 0;
36710
36717
  await refreshLayout(0, originalData.length);
@@ -37811,17 +37818,24 @@ var Vc = (function (exports, vue) {
37811
37818
  const dataInstanceChanged = this.states._data !== data;
37812
37819
  this.states._data = data;
37813
37820
  this.states.data = data;
37821
+ const caches = /* @__PURE__ */ new Map();
37822
+ this.states.list.forEach((item) => {
37823
+ item.rows.forEach((row) => {
37824
+ caches.set(row.data, row);
37825
+ });
37826
+ });
37814
37827
  this.states.list = data.reduce((pre, row, index) => {
37828
+ const cache = caches.get(row) || { heightMap: {} };
37815
37829
  pre.push({
37816
37830
  rows: [
37817
37831
  {
37818
37832
  index,
37819
37833
  data: row,
37820
- height: "",
37834
+ height: cache.height || "",
37821
37835
  heightMap: {
37822
- left: "",
37823
- main: "",
37824
- right: ""
37836
+ left: cache.heightMap.left || "",
37837
+ main: cache.heightMap.main || "",
37838
+ right: cache.heightMap.right || ""
37825
37839
  }
37826
37840
  }
37827
37841
  ],
@@ -37829,6 +37843,7 @@ var Vc = (function (exports, vue) {
37829
37843
  });
37830
37844
  return pre;
37831
37845
  }, []);
37846
+ caches.clear();
37832
37847
  this.current.update();
37833
37848
  this.expand.update();
37834
37849
  if (!this.states.reserveSelection) {
@@ -37962,12 +37977,12 @@ var Vc = (function (exports, vue) {
37962
37977
  */
37963
37978
  cleanSelection() {
37964
37979
  const { primaryKey } = this.table.props;
37965
- const { selection = [] } = this.states;
37980
+ const { selection = [], data } = this.states;
37966
37981
  let deleted;
37967
37982
  if (primaryKey) {
37968
37983
  deleted = [];
37969
37984
  const selectedMap = getValuesMap(selection, primaryKey);
37970
- const dataMap = getValuesMap(selection, primaryKey);
37985
+ const dataMap = getValuesMap(data, primaryKey);
37971
37986
  for (const key in selectedMap) {
37972
37987
  if (hasOwn$1(selectedMap, key) && !dataMap[key]) {
37973
37988
  deleted.push(selectedMap[key].row);
@@ -38138,8 +38153,10 @@ var Vc = (function (exports, vue) {
38138
38153
  const NormalList = /* @__PURE__ */ vue.defineComponent({
38139
38154
  name: COMPONENT_NAME$h,
38140
38155
  props: {
38141
- data: Array,
38142
- default: () => []
38156
+ data: {
38157
+ type: Array,
38158
+ default: () => []
38159
+ }
38143
38160
  },
38144
38161
  emits: ["row-resize"],
38145
38162
  setup(props2, {
@@ -38180,7 +38197,7 @@ var Vc = (function (exports, vue) {
38180
38197
  expose
38181
38198
  }) {
38182
38199
  const instance = vue.getCurrentInstance();
38183
- const table = getInstance$1("table", "tableId");
38200
+ const table = vue.inject("vc-table");
38184
38201
  const states = useStates({
38185
38202
  data: "data",
38186
38203
  list: "list",
@@ -38304,7 +38321,7 @@ var Vc = (function (exports, vue) {
38304
38321
  column,
38305
38322
  row
38306
38323
  };
38307
- table.exposed.hoverState.value = hoverState;
38324
+ table.hoverState.value = hoverState;
38308
38325
  table.emit("cell-mouse-enter", hoverState.row, hoverState.column, hoverState.cell, e);
38309
38326
  }
38310
38327
  const cellChild = e.target.querySelector(".vc-table__cell");
@@ -38333,7 +38350,7 @@ var Vc = (function (exports, vue) {
38333
38350
  const handleCellMouseLeave = (e) => {
38334
38351
  const cell = getCell(e);
38335
38352
  if (!cell) return;
38336
- const oldHoverState = table.exposed.hoverState.value || {};
38353
+ const oldHoverState = table.hoverState.value || {};
38337
38354
  table.emit("cell-mouse-leave", oldHoverState.row, oldHoverState.column, oldHoverState.cell, e);
38338
38355
  };
38339
38356
  const handleMouseEnter = debounce$1((index) => {
@@ -38371,6 +38388,7 @@ var Vc = (function (exports, vue) {
38371
38388
  columns
38372
38389
  } = states;
38373
38390
  const key = getValueOfRow(row, rowIndex);
38391
+ const selected = props2.store.isSelected(row);
38374
38392
  return vue.createVNode("div", {
38375
38393
  "key": key,
38376
38394
  "class": [getRowClass(row, rowIndex), "vc-table__tr"],
@@ -38391,10 +38409,12 @@ var Vc = (function (exports, vue) {
38391
38409
  };
38392
38410
  if (columnsHidden.value[columnIndex]) {
38393
38411
  return vue.createVNode("div", {
38412
+ "key": column.id,
38394
38413
  "style": [sizeStyle]
38395
38414
  }, null);
38396
38415
  }
38397
38416
  return vue.createVNode("div", {
38417
+ "key": column.id,
38398
38418
  "style": [getCellStyle(rowIndex, columnIndex, row, column), sizeStyle],
38399
38419
  "class": [getCellClass(rowIndex, columnIndex, row, column), "vc-table__td"],
38400
38420
  "onMouseenter": (e) => handleCellMouseEnter(e, row),
@@ -38404,7 +38424,8 @@ var Vc = (function (exports, vue) {
38404
38424
  column,
38405
38425
  rowIndex,
38406
38426
  columnIndex,
38407
- store: props2.store
38427
+ store: props2.store,
38428
+ selected
38408
38429
  })]);
38409
38430
  })]);
38410
38431
  };
@@ -38438,7 +38459,7 @@ var Vc = (function (exports, vue) {
38438
38459
  wrapper,
38439
38460
  getRootElement: () => instance.vnode.el
38440
38461
  });
38441
- const layout = table.exposed.layout;
38462
+ const layout = table.layout;
38442
38463
  return () => {
38443
38464
  return vue.createVNode("div", {
38444
38465
  "class": "vc-table__body"
@@ -38448,7 +38469,7 @@ var Vc = (function (exports, vue) {
38448
38469
  "disabled": true,
38449
38470
  "class": "vc-table__tbody",
38450
38471
  "scrollerOptions": {
38451
- barTo: `.${table.exposed.tableId}`,
38472
+ barTo: `.${table.tableId}`,
38452
38473
  native: false,
38453
38474
  always: false,
38454
38475
  showBar: !props2.fixed,
@@ -38500,7 +38521,7 @@ var Vc = (function (exports, vue) {
38500
38521
  }
38501
38522
  },
38502
38523
  setup(props2) {
38503
- const table = getInstance$1("table", "tableId");
38524
+ const table = vue.inject("vc-table");
38504
38525
  const instance = vue.getCurrentInstance();
38505
38526
  const draggingColumn = vue.ref(null);
38506
38527
  const dragging = vue.ref(false);
@@ -38606,7 +38627,7 @@ var Vc = (function (exports, vue) {
38606
38627
  if (column.children && column.children.length > 0) return;
38607
38628
  if (draggingColumn.value && props2.border) {
38608
38629
  dragging.value = true;
38609
- table.exposed.resizeProxyVisible.value = true;
38630
+ table.resizeProxyVisible.value = true;
38610
38631
  const tableEl = table.vnode.el;
38611
38632
  const tableLeft = tableEl.getBoundingClientRect().left;
38612
38633
  const columnEl = instance.vnode.el.querySelector(`.vc-table__th.${column.id}`);
@@ -38619,7 +38640,7 @@ var Vc = (function (exports, vue) {
38619
38640
  startColumnLeft: columnRect.left - tableLeft,
38620
38641
  tableLeft
38621
38642
  };
38622
- const resizeProxy = table.exposed.resizeProxy.value;
38643
+ const resizeProxy = table.resizeProxy.value;
38623
38644
  resizeProxy.style.left = dragState.value.startLeft + "px";
38624
38645
  document.onselectstart = () => false;
38625
38646
  document.ondragstart = () => false;
@@ -38976,7 +38997,8 @@ var Vc = (function (exports, vue) {
38976
38997
  emits: ["select", "select-all", "selection-change", "cell-mouse-enter", "cell-mouse-leave", "cell-click", "cell-dblclick", "row-click", "row-contextmenu", "row-dblclick", "header-click", "header-contextmenu", "current-change", "header-dragend ", "expand-change", "sort-change"],
38977
38998
  setup(props2, {
38978
38999
  slots,
38979
- expose
39000
+ expose,
39001
+ emit
38980
39002
  }) {
38981
39003
  const instance = vue.getCurrentInstance();
38982
39004
  const store = new Store({
@@ -39088,7 +39110,8 @@ var Vc = (function (exports, vue) {
39088
39110
  };
39089
39111
  }
39090
39112
  return {
39091
- height: layout.states.viewportHeight ? layout.states.viewportHeight + "px" : ""
39113
+ height: layout.states.viewportHeight ? layout.states.viewportHeight + "px" : "",
39114
+ bottom: 0
39092
39115
  };
39093
39116
  }
39094
39117
  });
@@ -39275,8 +39298,8 @@ var Vc = (function (exports, vue) {
39275
39298
  }, {
39276
39299
  immediate: true
39277
39300
  });
39278
- vue.watch(() => props2.data, (v) => {
39279
- store.setData(v);
39301
+ vue.watch(() => [props2.data, props2.data.length], () => {
39302
+ store.setData(props2.data);
39280
39303
  isReady.value && vue.nextTick(refreshLayout);
39281
39304
  }, {
39282
39305
  immediate: true
@@ -39312,7 +39335,7 @@ var Vc = (function (exports, vue) {
39312
39335
  isUnMount = true;
39313
39336
  unbindEvents();
39314
39337
  });
39315
- expose({
39338
+ const exposed = {
39316
39339
  bodyXWrapper,
39317
39340
  bodyYWrapper,
39318
39341
  tableId,
@@ -39334,8 +39357,12 @@ var Vc = (function (exports, vue) {
39334
39357
  isReady,
39335
39358
  hoverState,
39336
39359
  renderExpanded,
39337
- hiddenColumns
39338
- });
39360
+ hiddenColumns,
39361
+ props: props2,
39362
+ emit
39363
+ };
39364
+ expose(exposed);
39365
+ vue.provide("vc-table", exposed);
39339
39366
  return () => {
39340
39367
  return vue.createVNode("div", {
39341
39368
  "class": [classes.value, tableId, "vc-table"],
@@ -39371,7 +39398,9 @@ var Vc = (function (exports, vue) {
39371
39398
  }, null), props2.data.length === 0 && vue.createVNode("div", {
39372
39399
  "ref": emptyBlock,
39373
39400
  "style": bodyWidthStyle.value,
39374
- "class": "vc-table__empty-block"
39401
+ "class": [{
39402
+ "is-absolute": !!props2.height
39403
+ }, "vc-table__empty-wrapper"]
39375
39404
  }, [vue.createVNode("span", {
39376
39405
  "class": "vc-table__empty-text"
39377
39406
  }, [slots.empty ? slots.empty() : props2.emptyText || "暂无数据"])]), slots.append && vue.createVNode("div", {
@@ -39519,10 +39548,11 @@ var Vc = (function (exports, vue) {
39519
39548
  column,
39520
39549
  store,
39521
39550
  rowIndex,
39522
- level
39551
+ level,
39552
+ selected
39523
39553
  }) {
39524
39554
  return vue.withDirectives(vue.createVNode(Checkbox, {
39525
- "modelValue": store.isSelected(row),
39555
+ "modelValue": selected,
39526
39556
  "disabled": column.selectable ? !column.selectable.call(null, row, rowIndex) : false,
39527
39557
  "onChange": () => store.rowSelectedChanged(row),
39528
39558
  "onClick": (e) => e.stopPropagation()
@@ -39690,14 +39720,13 @@ var Vc = (function (exports, vue) {
39690
39720
  tooltip: [String, Function]
39691
39721
  },
39692
39722
  setup(props2, {
39693
- slots,
39694
- expose
39723
+ slots
39695
39724
  }) {
39696
39725
  const instance = vue.getCurrentInstance();
39697
- const table = getInstance$1("table", "tableId");
39698
- const parent = getInstance$1("table-column", "columnId") || table;
39726
+ const table = vue.inject("vc-table");
39727
+ const parent = vue.inject("vc-table-column", table);
39699
39728
  const isSubColumn = table !== parent;
39700
- const columnId = vue.ref((parent.exposed.tableId || parent.exposed.columnId) + getUid("column"));
39729
+ const columnId = vue.ref((parent.tableId || parent.columnId) + getUid("column"));
39701
39730
  const realWidth = vue.computed(() => {
39702
39731
  return parseWidth(props2.width);
39703
39732
  });
@@ -39761,7 +39790,7 @@ var Vc = (function (exports, vue) {
39761
39790
  column.renderCell = (data) => vue.createVNode("div", {
39762
39791
  "class": "vc-table__cell"
39763
39792
  }, [originRenderCell(data)]);
39764
- table.exposed.renderExpanded.value = (data) => {
39793
+ table.renderExpanded.value = (data) => {
39765
39794
  return slots.default ? slots.default(data) : slots.default;
39766
39795
  };
39767
39796
  } else {
@@ -39778,7 +39807,7 @@ var Vc = (function (exports, vue) {
39778
39807
  class: "vc-table__cell",
39779
39808
  style: {}
39780
39809
  };
39781
- if (!isEmpty$1(table.exposed.store.states.treeData) && !prefix2 && data.isExpandColumn) {
39810
+ if (!isEmpty$1(table.store.states.treeData) && !prefix2 && data.isExpandColumn) {
39782
39811
  prefix2 = vue.createVNode("span", {
39783
39812
  "class": "vc-table-un-expand__indent"
39784
39813
  }, null);
@@ -39816,15 +39845,15 @@ var Vc = (function (exports, vue) {
39816
39845
  const registerWatchers = () => {
39817
39846
  Object.keys(props2).forEach((k) => vue.watch(() => props2[k], (v) => columnConfig[k] = v));
39818
39847
  vue.watch(() => props2.fixed, () => {
39819
- table.exposed.store.scheduleLayout(true);
39848
+ table.store.scheduleLayout(true);
39820
39849
  });
39821
39850
  vue.watch(() => realWidth.value, (v) => {
39822
39851
  columnConfig["width"] = v;
39823
39852
  columnConfig["realWidth"] = v;
39824
- table.exposed.store.scheduleLayout(false);
39853
+ table.store.scheduleLayout(false);
39825
39854
  });
39826
39855
  vue.watch(() => realMinWidth.value, () => {
39827
- table.exposed.store.scheduleLayout(false);
39856
+ table.store.scheduleLayout(false);
39828
39857
  });
39829
39858
  };
39830
39859
  vue.onBeforeMount(() => {
@@ -39832,15 +39861,15 @@ var Vc = (function (exports, vue) {
39832
39861
  registerWatchers();
39833
39862
  });
39834
39863
  vue.onMounted(() => {
39835
- const children = isSubColumn ? parent.vnode.el.children : parent.exposed.hiddenColumns.value.children;
39864
+ const children = isSubColumn ? parent.vnode.el.children : parent.hiddenColumns.value.children;
39836
39865
  const columnIndex = [...children].indexOf(instance.vnode.el);
39837
- table.exposed.store.insertColumn(columnConfig, columnIndex, isSubColumn && parent.exposed.columnConfig);
39866
+ table.store.insertColumn(columnConfig, columnIndex, isSubColumn && parent.columnConfig);
39838
39867
  });
39839
39868
  vue.onUnmounted(() => {
39840
39869
  if (!instance.parent) return;
39841
- table.exposed.store.removeColumn(columnConfig, isSubColumn && parent.exposed.columnConfig);
39870
+ table.store.removeColumn(columnConfig, isSubColumn && parent.columnConfig);
39842
39871
  });
39843
- expose({
39872
+ vue.provide("vc-table-column", {
39844
39873
  columnId,
39845
39874
  columnConfig
39846
39875
  });
@@ -40058,7 +40087,7 @@ var Vc = (function (exports, vue) {
40058
40087
  if (!Array.from(items).length) return;
40059
40088
  let offset = 0;
40060
40089
  if (index > 0) {
40061
- const gutter = 16;
40090
+ const gutter = 12;
40062
40091
  for (let i = 0; i < index; i++) {
40063
40092
  offset += parseFloat(items[i].offsetWidth) + gutter;
40064
40093
  }
@@ -40122,7 +40151,7 @@ var Vc = (function (exports, vue) {
40122
40151
  }, [slots.extra?.()]), vue.createVNode("div", {
40123
40152
  "ref": wrapper,
40124
40153
  "style": {
40125
- padding: tabs.scrollable.value && "0 24px"
40154
+ padding: tabs.scrollable.value ? "0 24px" : 0
40126
40155
  },
40127
40156
  "class": "vc-tabs__bar"
40128
40157
  }, [tabs.scrollable.value && vue.createVNode(Icon, {
@@ -24844,7 +24844,7 @@
24844
24844
  });
24845
24845
  const COMPONENT_NAME$1T = "vc-alert";
24846
24846
  const THEME_MAP = {
24847
- info: ["#5495f6", "#91d5ff", "#e6f7ff"],
24847
+ info: ["#2B72FD", "#91d5ff", "#e6f7ff"],
24848
24848
  success: ["#52c41a", "#b7eb8f", "#f6ffed"],
24849
24849
  error: ["#ed4014", "#ffb08f", "#fbe9e9"],
24850
24850
  warning: ["#ffbf00", "#ffe58f", "#fffbe6"]
@@ -33844,7 +33844,7 @@
33844
33844
  validator: (v) => /(small|medium|large)/.test(v),
33845
33845
  default: "small"
33846
33846
  },
33847
- portalClass: [Object, String],
33847
+ contentClass: [Object, String],
33848
33848
  width: {
33849
33849
  type: Number
33850
33850
  },
@@ -33893,6 +33893,10 @@
33893
33893
  type: Boolean,
33894
33894
  default: true
33895
33895
  },
33896
+ border: {
33897
+ type: Boolean,
33898
+ default: false
33899
+ },
33896
33900
  /**
33897
33901
  * 兼容portal设计, 实现Promise方式
33898
33902
  */
@@ -34145,7 +34149,8 @@
34145
34149
  "class": [{
34146
34150
  "is-drag": props2.draggable,
34147
34151
  "is-large": props2.size === "large" || props2.size === "medium",
34148
- "is-no-footer": !props2.footer || !props2.cancelText && !props2.okText
34152
+ "has-footer": props2.footer && (props2.cancelText || props2.okText),
34153
+ "has-border": props2.border
34149
34154
  }, "vc-modal__container"],
34150
34155
  "style": [basicStyle.value, draggableStyle.value]
34151
34156
  }, [vue.createVNode("div", {
@@ -34177,7 +34182,7 @@
34177
34182
  "height": isTransitionEnd.value ? row.height : void 0,
34178
34183
  "contentClass": [{
34179
34184
  "is-confirm": props2.mode
34180
- }, props2.portalClass, "vc-modal__content"]
34185
+ }, props2.contentClass, "vc-modal__content"]
34181
34186
  }, {
34182
34187
  default: () => [typeof props2.content === "string" ? vue.createVNode("div", {
34183
34188
  "innerHTML": props2.content
@@ -35561,7 +35566,7 @@
35561
35566
  color: {
35562
35567
  type: [Object, String],
35563
35568
  default: () => ({
35564
- normal: "#5495f6",
35569
+ normal: "#2B72FD",
35565
35570
  success: "#52c41a",
35566
35571
  error: "#f5222d"
35567
35572
  })
@@ -36708,6 +36713,8 @@
36708
36713
  });
36709
36714
  if (!originalData.length) {
36710
36715
  rebuildData.value = [];
36716
+ } else {
36717
+ rebuildData.value = originalData.slice();
36711
36718
  }
36712
36719
  offsetPageSize.value = 0;
36713
36720
  await refreshLayout(0, originalData.length);
@@ -37814,17 +37821,24 @@
37814
37821
  const dataInstanceChanged = this.states._data !== data;
37815
37822
  this.states._data = data;
37816
37823
  this.states.data = data;
37824
+ const caches = /* @__PURE__ */ new Map();
37825
+ this.states.list.forEach((item) => {
37826
+ item.rows.forEach((row) => {
37827
+ caches.set(row.data, row);
37828
+ });
37829
+ });
37817
37830
  this.states.list = data.reduce((pre, row, index) => {
37831
+ const cache = caches.get(row) || { heightMap: {} };
37818
37832
  pre.push({
37819
37833
  rows: [
37820
37834
  {
37821
37835
  index,
37822
37836
  data: row,
37823
- height: "",
37837
+ height: cache.height || "",
37824
37838
  heightMap: {
37825
- left: "",
37826
- main: "",
37827
- right: ""
37839
+ left: cache.heightMap.left || "",
37840
+ main: cache.heightMap.main || "",
37841
+ right: cache.heightMap.right || ""
37828
37842
  }
37829
37843
  }
37830
37844
  ],
@@ -37832,6 +37846,7 @@
37832
37846
  });
37833
37847
  return pre;
37834
37848
  }, []);
37849
+ caches.clear();
37835
37850
  this.current.update();
37836
37851
  this.expand.update();
37837
37852
  if (!this.states.reserveSelection) {
@@ -37965,12 +37980,12 @@
37965
37980
  */
37966
37981
  cleanSelection() {
37967
37982
  const { primaryKey } = this.table.props;
37968
- const { selection = [] } = this.states;
37983
+ const { selection = [], data } = this.states;
37969
37984
  let deleted;
37970
37985
  if (primaryKey) {
37971
37986
  deleted = [];
37972
37987
  const selectedMap = getValuesMap(selection, primaryKey);
37973
- const dataMap = getValuesMap(selection, primaryKey);
37988
+ const dataMap = getValuesMap(data, primaryKey);
37974
37989
  for (const key in selectedMap) {
37975
37990
  if (hasOwn$1(selectedMap, key) && !dataMap[key]) {
37976
37991
  deleted.push(selectedMap[key].row);
@@ -38141,8 +38156,10 @@
38141
38156
  const NormalList = /* @__PURE__ */ vue.defineComponent({
38142
38157
  name: COMPONENT_NAME$h,
38143
38158
  props: {
38144
- data: Array,
38145
- default: () => []
38159
+ data: {
38160
+ type: Array,
38161
+ default: () => []
38162
+ }
38146
38163
  },
38147
38164
  emits: ["row-resize"],
38148
38165
  setup(props2, {
@@ -38183,7 +38200,7 @@
38183
38200
  expose
38184
38201
  }) {
38185
38202
  const instance = vue.getCurrentInstance();
38186
- const table = getInstance$1("table", "tableId");
38203
+ const table = vue.inject("vc-table");
38187
38204
  const states = useStates({
38188
38205
  data: "data",
38189
38206
  list: "list",
@@ -38307,7 +38324,7 @@
38307
38324
  column,
38308
38325
  row
38309
38326
  };
38310
- table.exposed.hoverState.value = hoverState;
38327
+ table.hoverState.value = hoverState;
38311
38328
  table.emit("cell-mouse-enter", hoverState.row, hoverState.column, hoverState.cell, e);
38312
38329
  }
38313
38330
  const cellChild = e.target.querySelector(".vc-table__cell");
@@ -38336,7 +38353,7 @@
38336
38353
  const handleCellMouseLeave = (e) => {
38337
38354
  const cell = getCell(e);
38338
38355
  if (!cell) return;
38339
- const oldHoverState = table.exposed.hoverState.value || {};
38356
+ const oldHoverState = table.hoverState.value || {};
38340
38357
  table.emit("cell-mouse-leave", oldHoverState.row, oldHoverState.column, oldHoverState.cell, e);
38341
38358
  };
38342
38359
  const handleMouseEnter = debounce$1((index) => {
@@ -38374,6 +38391,7 @@
38374
38391
  columns
38375
38392
  } = states;
38376
38393
  const key = getValueOfRow(row, rowIndex);
38394
+ const selected = props2.store.isSelected(row);
38377
38395
  return vue.createVNode("div", {
38378
38396
  "key": key,
38379
38397
  "class": [getRowClass(row, rowIndex), "vc-table__tr"],
@@ -38394,10 +38412,12 @@
38394
38412
  };
38395
38413
  if (columnsHidden.value[columnIndex]) {
38396
38414
  return vue.createVNode("div", {
38415
+ "key": column.id,
38397
38416
  "style": [sizeStyle]
38398
38417
  }, null);
38399
38418
  }
38400
38419
  return vue.createVNode("div", {
38420
+ "key": column.id,
38401
38421
  "style": [getCellStyle(rowIndex, columnIndex, row, column), sizeStyle],
38402
38422
  "class": [getCellClass(rowIndex, columnIndex, row, column), "vc-table__td"],
38403
38423
  "onMouseenter": (e) => handleCellMouseEnter(e, row),
@@ -38407,7 +38427,8 @@
38407
38427
  column,
38408
38428
  rowIndex,
38409
38429
  columnIndex,
38410
- store: props2.store
38430
+ store: props2.store,
38431
+ selected
38411
38432
  })]);
38412
38433
  })]);
38413
38434
  };
@@ -38441,7 +38462,7 @@
38441
38462
  wrapper,
38442
38463
  getRootElement: () => instance.vnode.el
38443
38464
  });
38444
- const layout = table.exposed.layout;
38465
+ const layout = table.layout;
38445
38466
  return () => {
38446
38467
  return vue.createVNode("div", {
38447
38468
  "class": "vc-table__body"
@@ -38451,7 +38472,7 @@
38451
38472
  "disabled": true,
38452
38473
  "class": "vc-table__tbody",
38453
38474
  "scrollerOptions": {
38454
- barTo: `.${table.exposed.tableId}`,
38475
+ barTo: `.${table.tableId}`,
38455
38476
  native: false,
38456
38477
  always: false,
38457
38478
  showBar: !props2.fixed,
@@ -38503,7 +38524,7 @@
38503
38524
  }
38504
38525
  },
38505
38526
  setup(props2) {
38506
- const table = getInstance$1("table", "tableId");
38527
+ const table = vue.inject("vc-table");
38507
38528
  const instance = vue.getCurrentInstance();
38508
38529
  const draggingColumn = vue.ref(null);
38509
38530
  const dragging = vue.ref(false);
@@ -38609,7 +38630,7 @@
38609
38630
  if (column.children && column.children.length > 0) return;
38610
38631
  if (draggingColumn.value && props2.border) {
38611
38632
  dragging.value = true;
38612
- table.exposed.resizeProxyVisible.value = true;
38633
+ table.resizeProxyVisible.value = true;
38613
38634
  const tableEl = table.vnode.el;
38614
38635
  const tableLeft = tableEl.getBoundingClientRect().left;
38615
38636
  const columnEl = instance.vnode.el.querySelector(`.vc-table__th.${column.id}`);
@@ -38622,7 +38643,7 @@
38622
38643
  startColumnLeft: columnRect.left - tableLeft,
38623
38644
  tableLeft
38624
38645
  };
38625
- const resizeProxy = table.exposed.resizeProxy.value;
38646
+ const resizeProxy = table.resizeProxy.value;
38626
38647
  resizeProxy.style.left = dragState.value.startLeft + "px";
38627
38648
  document.onselectstart = () => false;
38628
38649
  document.ondragstart = () => false;
@@ -38979,7 +39000,8 @@
38979
39000
  emits: ["select", "select-all", "selection-change", "cell-mouse-enter", "cell-mouse-leave", "cell-click", "cell-dblclick", "row-click", "row-contextmenu", "row-dblclick", "header-click", "header-contextmenu", "current-change", "header-dragend ", "expand-change", "sort-change"],
38980
39001
  setup(props2, {
38981
39002
  slots,
38982
- expose
39003
+ expose,
39004
+ emit
38983
39005
  }) {
38984
39006
  const instance = vue.getCurrentInstance();
38985
39007
  const store = new Store({
@@ -39091,7 +39113,8 @@
39091
39113
  };
39092
39114
  }
39093
39115
  return {
39094
- height: layout.states.viewportHeight ? layout.states.viewportHeight + "px" : ""
39116
+ height: layout.states.viewportHeight ? layout.states.viewportHeight + "px" : "",
39117
+ bottom: 0
39095
39118
  };
39096
39119
  }
39097
39120
  });
@@ -39278,8 +39301,8 @@
39278
39301
  }, {
39279
39302
  immediate: true
39280
39303
  });
39281
- vue.watch(() => props2.data, (v) => {
39282
- store.setData(v);
39304
+ vue.watch(() => [props2.data, props2.data.length], () => {
39305
+ store.setData(props2.data);
39283
39306
  isReady.value && vue.nextTick(refreshLayout);
39284
39307
  }, {
39285
39308
  immediate: true
@@ -39315,7 +39338,7 @@
39315
39338
  isUnMount = true;
39316
39339
  unbindEvents();
39317
39340
  });
39318
- expose({
39341
+ const exposed = {
39319
39342
  bodyXWrapper,
39320
39343
  bodyYWrapper,
39321
39344
  tableId,
@@ -39337,8 +39360,12 @@
39337
39360
  isReady,
39338
39361
  hoverState,
39339
39362
  renderExpanded,
39340
- hiddenColumns
39341
- });
39363
+ hiddenColumns,
39364
+ props: props2,
39365
+ emit
39366
+ };
39367
+ expose(exposed);
39368
+ vue.provide("vc-table", exposed);
39342
39369
  return () => {
39343
39370
  return vue.createVNode("div", {
39344
39371
  "class": [classes.value, tableId, "vc-table"],
@@ -39374,7 +39401,9 @@
39374
39401
  }, null), props2.data.length === 0 && vue.createVNode("div", {
39375
39402
  "ref": emptyBlock,
39376
39403
  "style": bodyWidthStyle.value,
39377
- "class": "vc-table__empty-block"
39404
+ "class": [{
39405
+ "is-absolute": !!props2.height
39406
+ }, "vc-table__empty-wrapper"]
39378
39407
  }, [vue.createVNode("span", {
39379
39408
  "class": "vc-table__empty-text"
39380
39409
  }, [slots.empty ? slots.empty() : props2.emptyText || "暂无数据"])]), slots.append && vue.createVNode("div", {
@@ -39522,10 +39551,11 @@
39522
39551
  column,
39523
39552
  store,
39524
39553
  rowIndex,
39525
- level
39554
+ level,
39555
+ selected
39526
39556
  }) {
39527
39557
  return vue.withDirectives(vue.createVNode(Checkbox, {
39528
- "modelValue": store.isSelected(row),
39558
+ "modelValue": selected,
39529
39559
  "disabled": column.selectable ? !column.selectable.call(null, row, rowIndex) : false,
39530
39560
  "onChange": () => store.rowSelectedChanged(row),
39531
39561
  "onClick": (e) => e.stopPropagation()
@@ -39693,14 +39723,13 @@
39693
39723
  tooltip: [String, Function]
39694
39724
  },
39695
39725
  setup(props2, {
39696
- slots,
39697
- expose
39726
+ slots
39698
39727
  }) {
39699
39728
  const instance = vue.getCurrentInstance();
39700
- const table = getInstance$1("table", "tableId");
39701
- const parent = getInstance$1("table-column", "columnId") || table;
39729
+ const table = vue.inject("vc-table");
39730
+ const parent = vue.inject("vc-table-column", table);
39702
39731
  const isSubColumn = table !== parent;
39703
- const columnId = vue.ref((parent.exposed.tableId || parent.exposed.columnId) + getUid("column"));
39732
+ const columnId = vue.ref((parent.tableId || parent.columnId) + getUid("column"));
39704
39733
  const realWidth = vue.computed(() => {
39705
39734
  return parseWidth(props2.width);
39706
39735
  });
@@ -39764,7 +39793,7 @@
39764
39793
  column.renderCell = (data) => vue.createVNode("div", {
39765
39794
  "class": "vc-table__cell"
39766
39795
  }, [originRenderCell(data)]);
39767
- table.exposed.renderExpanded.value = (data) => {
39796
+ table.renderExpanded.value = (data) => {
39768
39797
  return slots.default ? slots.default(data) : slots.default;
39769
39798
  };
39770
39799
  } else {
@@ -39781,7 +39810,7 @@
39781
39810
  class: "vc-table__cell",
39782
39811
  style: {}
39783
39812
  };
39784
- if (!isEmpty$1(table.exposed.store.states.treeData) && !prefix2 && data.isExpandColumn) {
39813
+ if (!isEmpty$1(table.store.states.treeData) && !prefix2 && data.isExpandColumn) {
39785
39814
  prefix2 = vue.createVNode("span", {
39786
39815
  "class": "vc-table-un-expand__indent"
39787
39816
  }, null);
@@ -39819,15 +39848,15 @@
39819
39848
  const registerWatchers = () => {
39820
39849
  Object.keys(props2).forEach((k) => vue.watch(() => props2[k], (v) => columnConfig[k] = v));
39821
39850
  vue.watch(() => props2.fixed, () => {
39822
- table.exposed.store.scheduleLayout(true);
39851
+ table.store.scheduleLayout(true);
39823
39852
  });
39824
39853
  vue.watch(() => realWidth.value, (v) => {
39825
39854
  columnConfig["width"] = v;
39826
39855
  columnConfig["realWidth"] = v;
39827
- table.exposed.store.scheduleLayout(false);
39856
+ table.store.scheduleLayout(false);
39828
39857
  });
39829
39858
  vue.watch(() => realMinWidth.value, () => {
39830
- table.exposed.store.scheduleLayout(false);
39859
+ table.store.scheduleLayout(false);
39831
39860
  });
39832
39861
  };
39833
39862
  vue.onBeforeMount(() => {
@@ -39835,15 +39864,15 @@
39835
39864
  registerWatchers();
39836
39865
  });
39837
39866
  vue.onMounted(() => {
39838
- const children = isSubColumn ? parent.vnode.el.children : parent.exposed.hiddenColumns.value.children;
39867
+ const children = isSubColumn ? parent.vnode.el.children : parent.hiddenColumns.value.children;
39839
39868
  const columnIndex = [...children].indexOf(instance.vnode.el);
39840
- table.exposed.store.insertColumn(columnConfig, columnIndex, isSubColumn && parent.exposed.columnConfig);
39869
+ table.store.insertColumn(columnConfig, columnIndex, isSubColumn && parent.columnConfig);
39841
39870
  });
39842
39871
  vue.onUnmounted(() => {
39843
39872
  if (!instance.parent) return;
39844
- table.exposed.store.removeColumn(columnConfig, isSubColumn && parent.exposed.columnConfig);
39873
+ table.store.removeColumn(columnConfig, isSubColumn && parent.columnConfig);
39845
39874
  });
39846
- expose({
39875
+ vue.provide("vc-table-column", {
39847
39876
  columnId,
39848
39877
  columnConfig
39849
39878
  });
@@ -40061,7 +40090,7 @@
40061
40090
  if (!Array.from(items).length) return;
40062
40091
  let offset = 0;
40063
40092
  if (index > 0) {
40064
- const gutter = 16;
40093
+ const gutter = 12;
40065
40094
  for (let i = 0; i < index; i++) {
40066
40095
  offset += parseFloat(items[i].offsetWidth) + gutter;
40067
40096
  }
@@ -40125,7 +40154,7 @@
40125
40154
  }, [slots.extra?.()]), vue.createVNode("div", {
40126
40155
  "ref": wrapper,
40127
40156
  "style": {
40128
- padding: tabs.scrollable.value && "0 24px"
40157
+ padding: tabs.scrollable.value ? "0 24px" : 0
40129
40158
  },
40130
40159
  "class": "vc-tabs__bar"
40131
40160
  }, [tabs.scrollable.value && vue.createVNode(Icon, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deot/vc",
3
- "version": "1.0.12",
3
+ "version": "1.0.14",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -19,9 +19,9 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "@deot/vc-components": "^1.0.12",
23
- "@deot/vc-hooks": "^1.0.12",
24
- "@deot/vc-shared": "^1.0.12"
22
+ "@deot/vc-components": "^1.0.14",
23
+ "@deot/vc-hooks": "^1.0.14",
24
+ "@deot/vc-shared": "^1.0.14"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "vue": "*"