@touchvue/ui 1.0.0-beta.51 → 1.0.0-beta.53

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 (146) hide show
  1. package/es/components/form/src/form.vue.d.ts +0 -3
  2. package/es/components/index.d.ts +3 -1
  3. package/es/components/input/src/input.vue.d.ts +1 -10
  4. package/es/components/rate/index.d.ts +4 -0
  5. package/es/components/rate/src/instance.d.ts +2 -0
  6. package/es/components/rate/src/rate.vue.d.ts +77 -0
  7. package/es/components/select/src/select.d.ts +0 -8
  8. package/es/components/select/src/select.vue.d.ts +0 -9
  9. package/es/components/slide/src/slide.vue.d.ts +4 -0
  10. package/es/components/switch/src/switch.vue.d.ts +3 -3
  11. package/es/components/tab/src/tab.d.ts +1 -1
  12. package/es/components/tab/src/tab.vue.d.ts +17 -4
  13. package/es/index.d.mjs +1 -0
  14. package/es/index.d.mjs.map +1 -1
  15. package/es/index.mjs +1 -0
  16. package/es/index.mjs.map +1 -1
  17. package/es/packages/components/cascader/src/cascader.vue2.mjs +1 -1
  18. package/es/packages/components/cascader/src/cascader.vue2.mjs.map +1 -1
  19. package/es/packages/components/checkbox/src/Checkbox.vue2.mjs +1 -1
  20. package/es/packages/components/checkbox/src/Checkbox.vue2.mjs.map +1 -1
  21. package/es/packages/components/checkboxes/src/Checkboxes.vue2.mjs.map +1 -1
  22. package/es/packages/components/datepicker/src/DatePicker.vue2.mjs +2 -3
  23. package/es/packages/components/datepicker/src/DatePicker.vue2.mjs.map +1 -1
  24. package/es/packages/components/daterange/src/date-range.vue2.mjs +18 -6
  25. package/es/packages/components/daterange/src/date-range.vue2.mjs.map +1 -1
  26. package/es/packages/components/form/src/form.vue2.mjs +1 -2
  27. package/es/packages/components/form/src/form.vue2.mjs.map +1 -1
  28. package/es/packages/components/index.d.mjs +1 -0
  29. package/es/packages/components/index.d.mjs.map +1 -1
  30. package/es/packages/components/index.mjs +1 -0
  31. package/es/packages/components/index.mjs.map +1 -1
  32. package/es/packages/components/input/src/input.vue2.mjs +63 -62
  33. package/es/packages/components/input/src/input.vue2.mjs.map +1 -1
  34. package/es/packages/components/page/src/page.vue2.mjs +6 -3
  35. package/es/packages/components/page/src/page.vue2.mjs.map +1 -1
  36. package/es/packages/components/rate/index.d.mjs +2 -0
  37. package/es/packages/components/rate/index.d.mjs.map +1 -0
  38. package/es/packages/components/rate/index.mjs +7 -0
  39. package/es/packages/components/rate/index.mjs.map +1 -0
  40. package/es/packages/components/rate/src/instance.d.mjs +2 -0
  41. package/es/packages/components/rate/src/instance.d.mjs.map +1 -0
  42. package/es/packages/components/rate/src/instance.mjs +2 -0
  43. package/es/packages/components/rate/src/instance.mjs.map +1 -0
  44. package/es/packages/components/rate/src/rate.vue.mjs +7 -0
  45. package/es/packages/components/rate/src/rate.vue.mjs.map +1 -0
  46. package/es/packages/components/rate/src/rate.vue2.mjs +153 -0
  47. package/es/packages/components/rate/src/rate.vue2.mjs.map +1 -0
  48. package/es/packages/components/segment/src/segment.vue.mjs +1 -4
  49. package/es/packages/components/segment/src/segment.vue.mjs.map +1 -1
  50. package/es/packages/components/select/src/hooks/use-select-class-style.mjs +1 -1
  51. package/es/packages/components/select/src/hooks/use-select-class-style.mjs.map +1 -1
  52. package/es/packages/components/select/src/select.mjs +0 -8
  53. package/es/packages/components/select/src/select.mjs.map +1 -1
  54. package/es/packages/components/select/src/select.vue2.mjs +2 -2
  55. package/es/packages/components/select/src/select.vue2.mjs.map +1 -1
  56. package/es/packages/components/slide/src/slide.vue2.mjs +3 -1
  57. package/es/packages/components/slide/src/slide.vue2.mjs.map +1 -1
  58. package/es/packages/components/switch/src/switch.vue2.mjs +4 -4
  59. package/es/packages/components/switch/src/switch.vue2.mjs.map +1 -1
  60. package/es/packages/components/tab/src/tab.vue2.mjs +401 -47
  61. package/es/packages/components/tab/src/tab.vue2.mjs.map +1 -1
  62. package/es/packages/components/transfer/src/transfer.vue2.mjs.map +1 -1
  63. package/es/packages/components/tree/src/tree.vue2.mjs +2 -0
  64. package/es/packages/components/tree/src/tree.vue2.mjs.map +1 -1
  65. package/es/packages/components/upload/src/upload.vue2.mjs +2 -2
  66. package/es/packages/components/upload/src/upload.vue2.mjs.map +1 -1
  67. package/es/packages/utils/disabledArea.mjs +2 -2
  68. package/es/packages/utils/disabledArea.mjs.map +1 -1
  69. package/es/packages/utils/validate.mjs +18 -11
  70. package/es/packages/utils/validate.mjs.map +1 -1
  71. package/global.d.ts +1 -0
  72. package/lib/components/form/src/form.vue.d.ts +0 -3
  73. package/lib/components/index.d.ts +3 -1
  74. package/lib/components/input/src/input.vue.d.ts +1 -10
  75. package/lib/components/rate/index.d.ts +4 -0
  76. package/lib/components/rate/src/instance.d.ts +2 -0
  77. package/lib/components/rate/src/rate.vue.d.ts +77 -0
  78. package/lib/components/select/src/select.d.ts +0 -8
  79. package/lib/components/select/src/select.vue.d.ts +0 -9
  80. package/lib/components/slide/src/slide.vue.d.ts +4 -0
  81. package/lib/components/switch/src/switch.vue.d.ts +3 -3
  82. package/lib/components/tab/src/tab.d.ts +1 -1
  83. package/lib/components/tab/src/tab.vue.d.ts +17 -4
  84. package/lib/index.d.js +8 -6
  85. package/lib/index.d.js.map +1 -1
  86. package/lib/index.js +13 -11
  87. package/lib/index.js.map +1 -1
  88. package/lib/packages/components/cascader/src/cascader.vue2.js +1 -1
  89. package/lib/packages/components/cascader/src/cascader.vue2.js.map +1 -1
  90. package/lib/packages/components/checkbox/src/Checkbox.vue2.js +1 -1
  91. package/lib/packages/components/checkbox/src/Checkbox.vue2.js.map +1 -1
  92. package/lib/packages/components/checkboxes/src/Checkboxes.vue2.js.map +1 -1
  93. package/lib/packages/components/datepicker/src/DatePicker.vue2.js +2 -3
  94. package/lib/packages/components/datepicker/src/DatePicker.vue2.js.map +1 -1
  95. package/lib/packages/components/daterange/src/date-range.vue2.js +18 -6
  96. package/lib/packages/components/daterange/src/date-range.vue2.js.map +1 -1
  97. package/lib/packages/components/form/src/form.vue2.js +1 -2
  98. package/lib/packages/components/form/src/form.vue2.js.map +1 -1
  99. package/lib/packages/components/index.d.js +2 -0
  100. package/lib/packages/components/index.d.js.map +1 -1
  101. package/lib/packages/components/index.js +2 -0
  102. package/lib/packages/components/index.js.map +1 -1
  103. package/lib/packages/components/input/src/input.vue2.js +63 -62
  104. package/lib/packages/components/input/src/input.vue2.js.map +1 -1
  105. package/lib/packages/components/page/src/page.vue2.js +6 -3
  106. package/lib/packages/components/page/src/page.vue2.js.map +1 -1
  107. package/lib/packages/components/rate/index.d.js +3 -0
  108. package/lib/packages/components/rate/index.d.js.map +1 -0
  109. package/lib/packages/components/rate/index.js +9 -0
  110. package/lib/packages/components/rate/index.js.map +1 -0
  111. package/lib/packages/components/rate/src/instance.d.js +3 -0
  112. package/lib/packages/components/rate/src/instance.d.js.map +1 -0
  113. package/lib/packages/components/rate/src/instance.js +3 -0
  114. package/lib/packages/components/rate/src/instance.js.map +1 -0
  115. package/lib/packages/components/rate/src/rate.vue.js +11 -0
  116. package/lib/packages/components/rate/src/rate.vue.js.map +1 -0
  117. package/lib/packages/components/rate/src/rate.vue2.js +157 -0
  118. package/lib/packages/components/rate/src/rate.vue2.js.map +1 -0
  119. package/lib/packages/components/segment/src/segment.vue.js +1 -4
  120. package/lib/packages/components/segment/src/segment.vue.js.map +1 -1
  121. package/lib/packages/components/select/src/hooks/use-select-class-style.js +1 -1
  122. package/lib/packages/components/select/src/hooks/use-select-class-style.js.map +1 -1
  123. package/lib/packages/components/select/src/select.js +0 -8
  124. package/lib/packages/components/select/src/select.js.map +1 -1
  125. package/lib/packages/components/select/src/select.vue2.js +2 -2
  126. package/lib/packages/components/select/src/select.vue2.js.map +1 -1
  127. package/lib/packages/components/slide/src/slide.vue2.js +3 -1
  128. package/lib/packages/components/slide/src/slide.vue2.js.map +1 -1
  129. package/lib/packages/components/switch/src/switch.vue2.js +4 -4
  130. package/lib/packages/components/switch/src/switch.vue2.js.map +1 -1
  131. package/lib/packages/components/tab/src/tab.vue2.js +400 -46
  132. package/lib/packages/components/tab/src/tab.vue2.js.map +1 -1
  133. package/lib/packages/components/transfer/src/transfer.vue2.js.map +1 -1
  134. package/lib/packages/components/tree/src/tree.vue2.js +2 -0
  135. package/lib/packages/components/tree/src/tree.vue2.js.map +1 -1
  136. package/lib/packages/components/upload/src/upload.vue2.js +2 -2
  137. package/lib/packages/components/upload/src/upload.vue2.js.map +1 -1
  138. package/lib/packages/utils/disabledArea.js +2 -2
  139. package/lib/packages/utils/disabledArea.js.map +1 -1
  140. package/lib/packages/utils/validate.js +24 -17
  141. package/lib/packages/utils/validate.js.map +1 -1
  142. package/package.json +1 -1
  143. package/theme/components/index.css +313 -122
  144. package/theme/index.css +313 -122
  145. package/theme/skin/default.css +313 -122
  146. package/types/global.d.ts +1 -0
@@ -6,6 +6,7 @@ var vue = require('vue');
6
6
  var index$1 = require('../../icon/index.js');
7
7
  var index$2 = require('../../float/index.js');
8
8
  var index = require('../../../locale/index.js');
9
+ var useDevice = require('../../../hooks/useDevice.js');
9
10
 
10
11
  const __default__ = vue.defineComponent({
11
12
  name: "ToTab"
@@ -21,7 +22,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
21
22
  removable: { type: Boolean, default: false },
22
23
  position: { default: "" },
23
24
  itemDir: { default: "" },
24
- over: { default: "control" },
25
+ over: { default: "" },
25
26
  event: { default: "click" },
26
27
  contentType: { default: "" },
27
28
  title: { default: "" },
@@ -38,17 +39,37 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
38
39
  const selectValue = vue.ref("");
39
40
  const _data = vue.ref([]);
40
41
  const floatRef = vue.ref(null);
42
+ const overflowFloatRef = vue.ref(null);
43
+ const overflowIconRef = vue.ref(null);
44
+ const overflowTabs = vue.ref([]);
45
+ const overflowFloatShow = vue.computed(() => props.over === "float" && overflowTabs.value.length > 0);
41
46
  const ul = vue.ref(null);
42
47
  const list = vue.ref(null);
48
+ const tabScrollRef = vue.ref(null);
49
+ const tabScrollWidth = vue.ref(0);
50
+ const tabScrollLeft = vue.ref(0);
51
+ const tabScrollable = vue.ref(false);
52
+ const tabScrollDragging = vue.ref(false);
53
+ const activeOver = vue.ref("");
43
54
  let scrollTimer = null;
44
55
  const controlShow = vue.ref(false);
45
56
  let stopChange = false;
57
+ let activeOverVersion = 0;
46
58
  const slot = vue.useSlots();
59
+ const { isPc } = useDevice.useDevice();
60
+ const tabScrollShow = vue.computed(() => isPc.value && tabScrollable.value);
61
+ const tabScrollStyle = vue.computed(() => {
62
+ return {
63
+ width: `${tabScrollWidth.value}px`,
64
+ left: `${tabScrollLeft.value}px`
65
+ };
66
+ });
47
67
  vue.watch(
48
68
  () => props.modelValue,
49
69
  (val, old) => {
50
70
  if (val || val === 0) {
51
71
  selectValue.value = val;
72
+ scrollSelectTabIntoView();
52
73
  } else {
53
74
  emit("update:modelValue", old);
54
75
  }
@@ -64,8 +85,26 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
64
85
  },
65
86
  { deep: true }
66
87
  );
88
+ vue.watch(
89
+ () => isPc.value,
90
+ () => {
91
+ updateTabLayout();
92
+ }
93
+ );
94
+ vue.watch(
95
+ () => props.over,
96
+ () => {
97
+ updateTabLayout();
98
+ }
99
+ );
67
100
  vue.onMounted(() => {
68
101
  initData();
102
+ window.addEventListener("resize", updateTabLayout);
103
+ });
104
+ vue.onBeforeUnmount(() => {
105
+ window.removeEventListener("resize", updateTabLayout);
106
+ stopTabScrollDrag();
107
+ scrollStop();
69
108
  });
70
109
  function initData() {
71
110
  if (props.data && props.data.length) {
@@ -86,6 +125,11 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
86
125
  setLayout();
87
126
  });
88
127
  }
128
+ if (props.over === "float") {
129
+ updateOverflowTabs();
130
+ }
131
+ updateTabScroll();
132
+ updateActiveOver();
89
133
  }
90
134
  const setTabStyle = vue.computed(() => {
91
135
  let obj = {};
@@ -122,12 +166,8 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
122
166
  if (props.align) {
123
167
  arr.push(`align-${props.align}`);
124
168
  }
125
- return arr;
126
- });
127
- const setUlClass = vue.computed(() => {
128
- let arr = [];
129
- if (props.over) {
130
- arr.push(`over-${props.over}`);
169
+ if (activeOver.value) {
170
+ arr.push(`over-${activeOver.value}`);
131
171
  }
132
172
  return arr;
133
173
  });
@@ -142,8 +182,8 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
142
182
  }
143
183
  return obj;
144
184
  });
145
- async function changeTab(item, index, event) {
146
- if (props.event !== event)
185
+ async function changeTab(item, index, event, force = false) {
186
+ if (!force && props.event !== event)
147
187
  return false;
148
188
  if (item.disabled)
149
189
  return false;
@@ -167,9 +207,11 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
167
207
  selectValue.value = item.value;
168
208
  emit("update:modelValue", item.value);
169
209
  emit("change", item.value, item, index);
210
+ scrollTabIntoView(index);
170
211
  setTimeout(() => {
171
212
  stopChange = false;
172
213
  }, 10);
214
+ return true;
173
215
  }
174
216
  async function removePTab(item, idx) {
175
217
  let flag = true;
@@ -198,6 +240,11 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
198
240
  if (props.over === "control") {
199
241
  setLayout();
200
242
  }
243
+ if (props.over === "float") {
244
+ updateOverflowTabs();
245
+ }
246
+ updateTabScroll();
247
+ updateActiveOver();
201
248
  emit("remove", item.value, item, idx);
202
249
  setTimeout(() => {
203
250
  stopChange = false;
@@ -221,6 +268,11 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
221
268
  setLayout();
222
269
  });
223
270
  }
271
+ if (props.over === "float") {
272
+ updateOverflowTabs();
273
+ }
274
+ updateTabScroll();
275
+ updateActiveOver();
224
276
  }
225
277
  setTimeout(() => {
226
278
  stopChange = false;
@@ -230,6 +282,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
230
282
  let idx = _data.value.findIndex((item) => item.label === oldLabel);
231
283
  if (idx !== -1) {
232
284
  _data.value[idx].label = label;
285
+ updateTabLayout();
233
286
  }
234
287
  }
235
288
  function getPicOn(pic) {
@@ -255,31 +308,229 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
255
308
  function contextmenu(item, idx) {
256
309
  emit("contextmenu", item.value, item, idx);
257
310
  }
311
+ function updateTabLayout() {
312
+ if (props.over === "control") {
313
+ setLayout();
314
+ }
315
+ updateActiveOver();
316
+ updateOverflowTabs();
317
+ updateTabScroll();
318
+ }
319
+ function handleListScroll() {
320
+ setOverflowTabs();
321
+ setTabScroll();
322
+ }
323
+ function updateOverflowTabs() {
324
+ vue.nextTick(() => {
325
+ setOverflowTabs();
326
+ });
327
+ }
328
+ function setOverflowTabs() {
329
+ if (props.over !== "float" || !list.value || !ul.value) {
330
+ overflowTabs.value = [];
331
+ return;
332
+ }
333
+ const listRect = list.value.getBoundingClientRect();
334
+ if (!listRect.width || !listRect.height) {
335
+ overflowTabs.value = [];
336
+ return;
337
+ }
338
+ const hiddenIndexes = /* @__PURE__ */ new Set();
339
+ const itemNodes = Array.from(ul.value.querySelectorAll(".to-tab-item"));
340
+ itemNodes.forEach((node) => {
341
+ const index = Number(node.dataset.tabIndex);
342
+ if (Number.isNaN(index))
343
+ return;
344
+ const rect = node.getBoundingClientRect();
345
+ const isHidden = rect.left < listRect.left - 1 || rect.right > listRect.right + 1 || rect.top < listRect.top - 1 || rect.bottom > listRect.bottom + 1;
346
+ if (isHidden) {
347
+ hiddenIndexes.add(index);
348
+ }
349
+ });
350
+ const oldShow = overflowTabs.value.length > 0;
351
+ overflowTabs.value = _data.value.map((item, index) => ({ item, index })).filter((tab) => hiddenIndexes.has(tab.index));
352
+ if (oldShow !== overflowTabs.value.length > 0) {
353
+ updateOverflowTabs();
354
+ }
355
+ }
356
+ function updateTabScroll() {
357
+ vue.nextTick(() => {
358
+ setTabScroll();
359
+ });
360
+ }
361
+ function setTabScroll() {
362
+ if (!isPc.value || !list.value || !ul.value) {
363
+ tabScrollable.value = false;
364
+ return;
365
+ }
366
+ const listWidth = list.value.clientWidth;
367
+ const scrollWidth = ul.value.scrollWidth;
368
+ const scrollRange = scrollWidth - listWidth;
369
+ if (listWidth <= 0 || scrollRange <= 1) {
370
+ tabScrollable.value = false;
371
+ tabScrollWidth.value = 0;
372
+ tabScrollLeft.value = 0;
373
+ list.value.scrollLeft = 0;
374
+ return;
375
+ }
376
+ const scrollLeft = Math.max(0, Math.min(scrollRange, list.value.scrollLeft));
377
+ if (scrollLeft !== list.value.scrollLeft) {
378
+ list.value.scrollLeft = scrollLeft;
379
+ }
380
+ tabScrollable.value = true;
381
+ tabScrollWidth.value = Math.max(listWidth * listWidth / scrollWidth, 16);
382
+ const trackRange = Math.max(listWidth - tabScrollWidth.value, 0);
383
+ const scrollRatio = scrollLeft / scrollRange;
384
+ tabScrollLeft.value = scrollLeft + scrollRatio * trackRange;
385
+ }
386
+ function getTabScrollRange() {
387
+ if (!list.value || !ul.value)
388
+ return 0;
389
+ return Math.max(ul.value.scrollWidth - list.value.clientWidth, 0);
390
+ }
391
+ async function updateActiveOver() {
392
+ const version = ++activeOverVersion;
393
+ const over = props.over;
394
+ if (over !== "avg" && over !== "wrap") {
395
+ activeOver.value = over;
396
+ return;
397
+ }
398
+ activeOver.value = "";
399
+ await vue.nextTick();
400
+ if (version !== activeOverVersion || props.over !== over || !list.value || !ul.value)
401
+ return;
402
+ activeOver.value = getTabScrollRange() > 1 ? over : "";
403
+ await vue.nextTick();
404
+ if (version !== activeOverVersion)
405
+ return;
406
+ setTabScroll();
407
+ }
408
+ function setTabScrollLeft(scrollLeft) {
409
+ if (!list.value)
410
+ return;
411
+ const scrollRange = getTabScrollRange();
412
+ list.value.scrollLeft = Math.max(0, Math.min(scrollRange, scrollLeft));
413
+ setTabScroll();
414
+ setOverflowTabs();
415
+ }
416
+ function startTabScrollDrag(event) {
417
+ if (!tabScrollShow.value || !list.value || !ul.value)
418
+ return;
419
+ event.preventDefault();
420
+ tabScrollDragging.value = true;
421
+ const startX = event.clientX;
422
+ const startScrollLeft = list.value.scrollLeft;
423
+ const listWidth = list.value.clientWidth;
424
+ const scrollRange = getTabScrollRange();
425
+ const trackRange = Math.max(listWidth - tabScrollWidth.value, 1);
426
+ const move = (moveEvent) => {
427
+ moveEvent.preventDefault();
428
+ const nextScrollLeft = startScrollLeft + (moveEvent.clientX - startX) / trackRange * scrollRange;
429
+ setTabScrollLeft(nextScrollLeft);
430
+ };
431
+ const up = () => {
432
+ stopTabScrollDrag();
433
+ };
434
+ window.addEventListener("mousemove", move);
435
+ window.addEventListener("mouseup", up, { once: true });
436
+ tabScrollMove = move;
437
+ tabScrollUp = up;
438
+ }
439
+ let tabScrollMove = null;
440
+ let tabScrollUp = null;
441
+ function stopTabScrollDrag() {
442
+ tabScrollDragging.value = false;
443
+ if (tabScrollMove) {
444
+ window.removeEventListener("mousemove", tabScrollMove);
445
+ tabScrollMove = null;
446
+ }
447
+ if (tabScrollUp) {
448
+ window.removeEventListener("mouseup", tabScrollUp);
449
+ tabScrollUp = null;
450
+ }
451
+ }
452
+ async function toggleOverflowFloat() {
453
+ var _a, _b, _c, _d;
454
+ updateOverflowTabs();
455
+ await vue.nextTick();
456
+ if (overflowTabs.value.length) {
457
+ (_b = (_a = overflowFloatRef.value) == null ? void 0 : _a.toggle) == null ? void 0 : _b.call(_a, overflowIconRef.value);
458
+ } else {
459
+ (_d = (_c = overflowFloatRef.value) == null ? void 0 : _c.close) == null ? void 0 : _d.call(_c);
460
+ }
461
+ }
462
+ async function changeOverflowTab(tab) {
463
+ var _a, _b;
464
+ const changed = await changeTab(tab.item, tab.index, "click", true);
465
+ if (changed !== false) {
466
+ (_b = (_a = overflowFloatRef.value) == null ? void 0 : _a.close) == null ? void 0 : _b.call(_a);
467
+ scrollTabIntoView(tab.index);
468
+ }
469
+ }
470
+ async function removeOverflowTab(tab) {
471
+ var _a, _b;
472
+ await removePTab(tab.item, tab.index);
473
+ updateOverflowTabs();
474
+ await vue.nextTick();
475
+ if (!overflowTabs.value.length) {
476
+ (_b = (_a = overflowFloatRef.value) == null ? void 0 : _a.close) == null ? void 0 : _b.call(_a);
477
+ }
478
+ }
479
+ function scrollTabIntoView(index) {
480
+ vue.nextTick(() => {
481
+ if (!list.value || !ul.value)
482
+ return;
483
+ const node = ul.value.querySelector(`.to-tab-item[data-tab-index="${index}"]`);
484
+ if (!node)
485
+ return;
486
+ const listRect = list.value.getBoundingClientRect();
487
+ const nodeRect = node.getBoundingClientRect();
488
+ if (nodeRect.right > listRect.right) {
489
+ setTabScrollLeft(list.value.scrollLeft + nodeRect.right - listRect.right);
490
+ } else if (nodeRect.left < listRect.left) {
491
+ setTabScrollLeft(list.value.scrollLeft + nodeRect.left - listRect.left);
492
+ } else {
493
+ updateOverflowTabs();
494
+ updateTabScroll();
495
+ }
496
+ });
497
+ }
498
+ function scrollSelectTabIntoView() {
499
+ const index = _data.value.findIndex((item) => item.value === selectValue.value);
500
+ if (index !== -1) {
501
+ scrollTabIntoView(index);
502
+ }
503
+ }
258
504
  function controlLeftScroll() {
259
505
  scrollTimer = setInterval(() => {
260
- ul.value.scrollTo({
261
- left: ul.value.scrollLeft - 3
262
- // behavior: 'smooth' // 平滑滚动效果
263
- });
506
+ var _a;
507
+ setTabScrollLeft((((_a = list.value) == null ? void 0 : _a.scrollLeft) || 0) - 3);
264
508
  }, 1);
265
509
  }
266
510
  function controlRightScroll() {
267
511
  scrollTimer = setInterval(() => {
268
- ul.value.scrollTo({
269
- left: ul.value.scrollLeft + 3
270
- // behavior: 'smooth' // 平滑滚动效果
271
- });
512
+ var _a;
513
+ setTabScrollLeft((((_a = list.value) == null ? void 0 : _a.scrollLeft) || 0) + 3);
272
514
  }, 1);
273
515
  }
274
516
  function scrollStop() {
275
- clearInterval(scrollTimer);
517
+ if (scrollTimer) {
518
+ clearInterval(scrollTimer);
519
+ scrollTimer = null;
520
+ }
276
521
  }
277
522
  function setLayout() {
278
- if (ul.value.clientWidth < ul.value.scrollWidth) {
279
- controlShow.value = true;
280
- } else {
281
- controlShow.value = false;
282
- }
523
+ vue.nextTick(() => {
524
+ if (!list.value || !ul.value) {
525
+ controlShow.value = false;
526
+ return;
527
+ }
528
+ controlShow.value = getTabScrollRange() > 1;
529
+ if (!controlShow.value) {
530
+ list.value.scrollLeft = 0;
531
+ }
532
+ setTabScroll();
533
+ });
283
534
  }
284
535
  vue.provide("TabProvide", {
285
536
  addTab,
@@ -289,6 +540,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
289
540
  });
290
541
  return (_ctx, _cache) => {
291
542
  const _component_to_pic = vue.resolveComponent("to-pic");
543
+ const _component_to_scroll = vue.resolveComponent("to-scroll");
292
544
  return vue.openBlock(), vue.createElementBlock("div", {
293
545
  key: vue.unref(index.langKey),
294
546
  class: vue.normalizeClass(["to-tab", setClass.value]),
@@ -315,7 +567,8 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
315
567
  {
316
568
  ref_key: "list",
317
569
  ref: list,
318
- class: "to-tab-list"
570
+ class: "to-tab-list",
571
+ onScroll: handleListScroll
319
572
  },
320
573
  [
321
574
  vue.createElementVNode(
@@ -323,7 +576,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
323
576
  {
324
577
  ref_key: "ul",
325
578
  ref: ul,
326
- class: vue.normalizeClass(["to-tab-wrapper", setUlClass.value])
579
+ class: "to-tab-wrapper"
327
580
  },
328
581
  [
329
582
  (vue.openBlock(true), vue.createElementBlock(
@@ -339,6 +592,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
339
592
  ])) : (vue.openBlock(), vue.createElementBlock("div", {
340
593
  key: 1,
341
594
  class: vue.normalizeClass(["to-tab-item", { "is-on": item.value === selectValue.value, "is-disabled": item.disabled }]),
595
+ "data-tab-index": index,
342
596
  style: vue.normalizeStyle(setTabStyle.value),
343
597
  onClick: ($event) => changeTab(item, index, "click"),
344
598
  onMouseover: ($event) => changeTab(item, index, "hover"),
@@ -356,16 +610,13 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
356
610
  class: "to-tab-item-pic",
357
611
  src: item.value === selectValue.value ? getPicOn(item.pic) : item.pic
358
612
  }, null, 8, ["src"])) : vue.createCommentVNode("v-if", true),
359
- item.icon ? (vue.openBlock(), vue.createElementBlock("span", {
613
+ item.icon ? (vue.openBlock(), vue.createBlock(vue.unref(index$1.ToIcon), {
360
614
  key: 1,
361
- class: "to-tab-item-icon"
362
- }, [
363
- vue.createVNode(vue.unref(index$1.ToIcon), {
364
- value: item.icon,
365
- type: item.value === selectValue.value ? "fill" : "",
366
- mode: "tab-icon"
367
- }, null, 8, ["value", "type"])
368
- ])) : vue.createCommentVNode("v-if", true),
615
+ value: item.icon,
616
+ class: "to-tab-item-icon",
617
+ type: item.value === selectValue.value ? "fill" : "",
618
+ mode: "tab-icon"
619
+ }, null, 8, ["value", "type"])) : vue.createCommentVNode("v-if", true),
369
620
  vue.createElementVNode("div", { class: "to-tab-item-label" }, [
370
621
  vue.renderSlot(_ctx.$slots, "label", vue.mergeProps({ ref_for: true }, item), () => [
371
622
  vue.createTextVNode(
@@ -387,7 +638,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
387
638
  ]),
388
639
  vue.createElementVNode("div", { class: "to-tab-indicator" })
389
640
  ])
390
- ], 46, ["onClick", "onMouseover", "onContextmenu"]))
641
+ ], 46, ["data-tab-index", "onClick", "onMouseover", "onContextmenu"]))
391
642
  ],
392
643
  64
393
644
  /* STABLE_FRAGMENT */
@@ -397,14 +648,30 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
397
648
  /* KEYED_FRAGMENT */
398
649
  ))
399
650
  ],
400
- 2
401
- /* CLASS */
402
- )
651
+ 512
652
+ /* NEED_PATCH */
653
+ ),
654
+ tabScrollShow.value ? (vue.openBlock(), vue.createElementBlock(
655
+ "div",
656
+ {
657
+ key: 0,
658
+ ref_key: "tabScrollRef",
659
+ ref: tabScrollRef,
660
+ class: vue.normalizeClass(["to-tab-list-scroll", { "is-dragging": tabScrollDragging.value }]),
661
+ style: vue.normalizeStyle(tabScrollStyle.value),
662
+ onMousedown: startTabScrollDrag
663
+ },
664
+ [
665
+ vue.createElementVNode("div", { class: "to-tab-list-scroll-bar" })
666
+ ],
667
+ 38
668
+ /* CLASS, STYLE, NEED_HYDRATION */
669
+ )) : vue.createCommentVNode("v-if", true)
403
670
  ],
404
- 512
405
- /* NEED_PATCH */
671
+ 544
672
+ /* NEED_HYDRATION, NEED_PATCH */
406
673
  ),
407
- controlShow.value || __props.over === "float" || vue.unref(slot).fn ? (vue.openBlock(), vue.createElementBlock("div", {
674
+ controlShow.value || overflowFloatShow.value || vue.unref(slot).fn ? (vue.openBlock(), vue.createElementBlock("div", {
408
675
  key: 1,
409
676
  class: "to-tab-fn"
410
677
  }, [
@@ -427,11 +694,98 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
427
694
  onMouseleave: scrollStop
428
695
  })) : vue.createCommentVNode("v-if", true),
429
696
  vue.renderSlot(_ctx.$slots, "fn"),
430
- __props.over === "float" ? (vue.openBlock(), vue.createBlock(vue.unref(index$1.ToIcon), {
431
- key: 2,
432
- value: "menu",
433
- link: ""
434
- })) : vue.createCommentVNode("v-if", true)
697
+ overflowFloatShow.value ? (vue.openBlock(), vue.createBlock(
698
+ vue.unref(index$1.ToIcon),
699
+ {
700
+ key: 2,
701
+ ref_key: "overflowIconRef",
702
+ ref: overflowIconRef,
703
+ value: "more",
704
+ link: "",
705
+ onClick: toggleOverflowFloat
706
+ },
707
+ null,
708
+ 512
709
+ /* NEED_PATCH */
710
+ )) : vue.createCommentVNode("v-if", true),
711
+ overflowFloatShow.value ? (vue.openBlock(), vue.createBlock(vue.Teleport, {
712
+ key: 3,
713
+ to: "body"
714
+ }, [
715
+ vue.createElementVNode("div", { class: "to-tab" }, [
716
+ vue.createVNode(
717
+ vue.unref(index$2.ToFloat),
718
+ {
719
+ ref_key: "overflowFloatRef",
720
+ ref: overflowFloatRef,
721
+ align: "right",
722
+ global: false,
723
+ class: "to-tab-over-float",
724
+ lazy: false,
725
+ width: "12"
726
+ },
727
+ {
728
+ default: vue.withCtx(() => [
729
+ vue.createVNode(_component_to_scroll, { class: "to-tab-over-scroll" }, {
730
+ default: vue.withCtx(() => [
731
+ vue.createElementVNode("div", { class: "to-tab-over-list" }, [
732
+ (vue.openBlock(true), vue.createElementBlock(
733
+ vue.Fragment,
734
+ null,
735
+ vue.renderList(overflowTabs.value, (tab) => {
736
+ return vue.openBlock(), vue.createElementBlock("div", {
737
+ key: tab.index,
738
+ class: vue.normalizeClass(["to-tab-over-item", { "is-on": tab.item.value === selectValue.value, "is-disabled": tab.item.disabled }]),
739
+ onClick: ($event) => changeOverflowTab(tab),
740
+ onContextmenu: ($event) => contextmenu(tab.item, tab.index)
741
+ }, [
742
+ tab.item.pic ? (vue.openBlock(), vue.createBlock(_component_to_pic, {
743
+ key: 0,
744
+ class: "to-tab-over-item-pic",
745
+ src: tab.item.value === selectValue.value ? getPicOn(tab.item.pic) : tab.item.pic
746
+ }, null, 8, ["src"])) : vue.createCommentVNode("v-if", true),
747
+ tab.item.icon ? (vue.openBlock(), vue.createBlock(vue.unref(index$1.ToIcon), {
748
+ key: 1,
749
+ value: tab.item.icon,
750
+ class: "to-tab-over-item-icon",
751
+ type: tab.item.value === selectValue.value ? "fill" : "",
752
+ mode: "tab-icon"
753
+ }, null, 8, ["value", "type"])) : vue.createCommentVNode("v-if", true),
754
+ vue.createElementVNode("div", { class: "to-tab-over-item-label" }, [
755
+ vue.renderSlot(_ctx.$slots, "label", vue.mergeProps({ ref_for: true }, tab.item), () => [
756
+ vue.createTextVNode(
757
+ vue.toDisplayString(tab.item.label),
758
+ 1
759
+ /* TEXT */
760
+ )
761
+ ])
762
+ ]),
763
+ __props.removable ? (vue.openBlock(), vue.createBlock(vue.unref(index$1.ToIcon), {
764
+ key: 2,
765
+ value: "close",
766
+ link: "",
767
+ class: "to-tab-over-item-remove",
768
+ onClick: vue.withModifiers(($event) => removeOverflowTab(tab), ["stop"])
769
+ }, null, 8, ["onClick"])) : vue.createCommentVNode("v-if", true)
770
+ ], 42, ["onClick", "onContextmenu"]);
771
+ }),
772
+ 128
773
+ /* KEYED_FRAGMENT */
774
+ ))
775
+ ])
776
+ ]),
777
+ _: 3
778
+ /* FORWARDED */
779
+ })
780
+ ]),
781
+ _: 3
782
+ /* FORWARDED */
783
+ },
784
+ 512
785
+ /* NEED_PATCH */
786
+ )
787
+ ])
788
+ ])) : vue.createCommentVNode("v-if", true)
435
789
  ])) : vue.createCommentVNode("v-if", true),
436
790
  vue.createElementVNode("div", { class: "to-tab-divider" })
437
791
  ]),