@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.
- package/es/components/form/src/form.vue.d.ts +0 -3
- package/es/components/index.d.ts +3 -1
- package/es/components/input/src/input.vue.d.ts +1 -10
- package/es/components/rate/index.d.ts +4 -0
- package/es/components/rate/src/instance.d.ts +2 -0
- package/es/components/rate/src/rate.vue.d.ts +77 -0
- package/es/components/select/src/select.d.ts +0 -8
- package/es/components/select/src/select.vue.d.ts +0 -9
- package/es/components/slide/src/slide.vue.d.ts +4 -0
- package/es/components/switch/src/switch.vue.d.ts +3 -3
- package/es/components/tab/src/tab.d.ts +1 -1
- package/es/components/tab/src/tab.vue.d.ts +17 -4
- package/es/index.d.mjs +1 -0
- package/es/index.d.mjs.map +1 -1
- package/es/index.mjs +1 -0
- package/es/index.mjs.map +1 -1
- package/es/packages/components/cascader/src/cascader.vue2.mjs +1 -1
- package/es/packages/components/cascader/src/cascader.vue2.mjs.map +1 -1
- package/es/packages/components/checkbox/src/Checkbox.vue2.mjs +1 -1
- package/es/packages/components/checkbox/src/Checkbox.vue2.mjs.map +1 -1
- package/es/packages/components/checkboxes/src/Checkboxes.vue2.mjs.map +1 -1
- package/es/packages/components/datepicker/src/DatePicker.vue2.mjs +2 -3
- package/es/packages/components/datepicker/src/DatePicker.vue2.mjs.map +1 -1
- package/es/packages/components/daterange/src/date-range.vue2.mjs +18 -6
- package/es/packages/components/daterange/src/date-range.vue2.mjs.map +1 -1
- package/es/packages/components/form/src/form.vue2.mjs +1 -2
- package/es/packages/components/form/src/form.vue2.mjs.map +1 -1
- package/es/packages/components/index.d.mjs +1 -0
- package/es/packages/components/index.d.mjs.map +1 -1
- package/es/packages/components/index.mjs +1 -0
- package/es/packages/components/index.mjs.map +1 -1
- package/es/packages/components/input/src/input.vue2.mjs +63 -62
- package/es/packages/components/input/src/input.vue2.mjs.map +1 -1
- package/es/packages/components/page/src/page.vue2.mjs +6 -3
- package/es/packages/components/page/src/page.vue2.mjs.map +1 -1
- package/es/packages/components/rate/index.d.mjs +2 -0
- package/es/packages/components/rate/index.d.mjs.map +1 -0
- package/es/packages/components/rate/index.mjs +7 -0
- package/es/packages/components/rate/index.mjs.map +1 -0
- package/es/packages/components/rate/src/instance.d.mjs +2 -0
- package/es/packages/components/rate/src/instance.d.mjs.map +1 -0
- package/es/packages/components/rate/src/instance.mjs +2 -0
- package/es/packages/components/rate/src/instance.mjs.map +1 -0
- package/es/packages/components/rate/src/rate.vue.mjs +7 -0
- package/es/packages/components/rate/src/rate.vue.mjs.map +1 -0
- package/es/packages/components/rate/src/rate.vue2.mjs +153 -0
- package/es/packages/components/rate/src/rate.vue2.mjs.map +1 -0
- package/es/packages/components/segment/src/segment.vue.mjs +1 -4
- package/es/packages/components/segment/src/segment.vue.mjs.map +1 -1
- package/es/packages/components/select/src/hooks/use-select-class-style.mjs +1 -1
- package/es/packages/components/select/src/hooks/use-select-class-style.mjs.map +1 -1
- package/es/packages/components/select/src/select.mjs +0 -8
- package/es/packages/components/select/src/select.mjs.map +1 -1
- package/es/packages/components/select/src/select.vue2.mjs +2 -2
- package/es/packages/components/select/src/select.vue2.mjs.map +1 -1
- package/es/packages/components/slide/src/slide.vue2.mjs +3 -1
- package/es/packages/components/slide/src/slide.vue2.mjs.map +1 -1
- package/es/packages/components/switch/src/switch.vue2.mjs +4 -4
- package/es/packages/components/switch/src/switch.vue2.mjs.map +1 -1
- package/es/packages/components/tab/src/tab.vue2.mjs +401 -47
- package/es/packages/components/tab/src/tab.vue2.mjs.map +1 -1
- package/es/packages/components/transfer/src/transfer.vue2.mjs.map +1 -1
- package/es/packages/components/tree/src/tree.vue2.mjs +2 -0
- package/es/packages/components/tree/src/tree.vue2.mjs.map +1 -1
- package/es/packages/components/upload/src/upload.vue2.mjs +2 -2
- package/es/packages/components/upload/src/upload.vue2.mjs.map +1 -1
- package/es/packages/utils/disabledArea.mjs +2 -2
- package/es/packages/utils/disabledArea.mjs.map +1 -1
- package/es/packages/utils/validate.mjs +18 -11
- package/es/packages/utils/validate.mjs.map +1 -1
- package/global.d.ts +1 -0
- package/lib/components/form/src/form.vue.d.ts +0 -3
- package/lib/components/index.d.ts +3 -1
- package/lib/components/input/src/input.vue.d.ts +1 -10
- package/lib/components/rate/index.d.ts +4 -0
- package/lib/components/rate/src/instance.d.ts +2 -0
- package/lib/components/rate/src/rate.vue.d.ts +77 -0
- package/lib/components/select/src/select.d.ts +0 -8
- package/lib/components/select/src/select.vue.d.ts +0 -9
- package/lib/components/slide/src/slide.vue.d.ts +4 -0
- package/lib/components/switch/src/switch.vue.d.ts +3 -3
- package/lib/components/tab/src/tab.d.ts +1 -1
- package/lib/components/tab/src/tab.vue.d.ts +17 -4
- package/lib/index.d.js +8 -6
- package/lib/index.d.js.map +1 -1
- package/lib/index.js +13 -11
- package/lib/index.js.map +1 -1
- package/lib/packages/components/cascader/src/cascader.vue2.js +1 -1
- package/lib/packages/components/cascader/src/cascader.vue2.js.map +1 -1
- package/lib/packages/components/checkbox/src/Checkbox.vue2.js +1 -1
- package/lib/packages/components/checkbox/src/Checkbox.vue2.js.map +1 -1
- package/lib/packages/components/checkboxes/src/Checkboxes.vue2.js.map +1 -1
- package/lib/packages/components/datepicker/src/DatePicker.vue2.js +2 -3
- package/lib/packages/components/datepicker/src/DatePicker.vue2.js.map +1 -1
- package/lib/packages/components/daterange/src/date-range.vue2.js +18 -6
- package/lib/packages/components/daterange/src/date-range.vue2.js.map +1 -1
- package/lib/packages/components/form/src/form.vue2.js +1 -2
- package/lib/packages/components/form/src/form.vue2.js.map +1 -1
- package/lib/packages/components/index.d.js +2 -0
- package/lib/packages/components/index.d.js.map +1 -1
- package/lib/packages/components/index.js +2 -0
- package/lib/packages/components/index.js.map +1 -1
- package/lib/packages/components/input/src/input.vue2.js +63 -62
- package/lib/packages/components/input/src/input.vue2.js.map +1 -1
- package/lib/packages/components/page/src/page.vue2.js +6 -3
- package/lib/packages/components/page/src/page.vue2.js.map +1 -1
- package/lib/packages/components/rate/index.d.js +3 -0
- package/lib/packages/components/rate/index.d.js.map +1 -0
- package/lib/packages/components/rate/index.js +9 -0
- package/lib/packages/components/rate/index.js.map +1 -0
- package/lib/packages/components/rate/src/instance.d.js +3 -0
- package/lib/packages/components/rate/src/instance.d.js.map +1 -0
- package/lib/packages/components/rate/src/instance.js +3 -0
- package/lib/packages/components/rate/src/instance.js.map +1 -0
- package/lib/packages/components/rate/src/rate.vue.js +11 -0
- package/lib/packages/components/rate/src/rate.vue.js.map +1 -0
- package/lib/packages/components/rate/src/rate.vue2.js +157 -0
- package/lib/packages/components/rate/src/rate.vue2.js.map +1 -0
- package/lib/packages/components/segment/src/segment.vue.js +1 -4
- package/lib/packages/components/segment/src/segment.vue.js.map +1 -1
- package/lib/packages/components/select/src/hooks/use-select-class-style.js +1 -1
- package/lib/packages/components/select/src/hooks/use-select-class-style.js.map +1 -1
- package/lib/packages/components/select/src/select.js +0 -8
- package/lib/packages/components/select/src/select.js.map +1 -1
- package/lib/packages/components/select/src/select.vue2.js +2 -2
- package/lib/packages/components/select/src/select.vue2.js.map +1 -1
- package/lib/packages/components/slide/src/slide.vue2.js +3 -1
- package/lib/packages/components/slide/src/slide.vue2.js.map +1 -1
- package/lib/packages/components/switch/src/switch.vue2.js +4 -4
- package/lib/packages/components/switch/src/switch.vue2.js.map +1 -1
- package/lib/packages/components/tab/src/tab.vue2.js +400 -46
- package/lib/packages/components/tab/src/tab.vue2.js.map +1 -1
- package/lib/packages/components/transfer/src/transfer.vue2.js.map +1 -1
- package/lib/packages/components/tree/src/tree.vue2.js +2 -0
- package/lib/packages/components/tree/src/tree.vue2.js.map +1 -1
- package/lib/packages/components/upload/src/upload.vue2.js +2 -2
- package/lib/packages/components/upload/src/upload.vue2.js.map +1 -1
- package/lib/packages/utils/disabledArea.js +2 -2
- package/lib/packages/utils/disabledArea.js.map +1 -1
- package/lib/packages/utils/validate.js +24 -17
- package/lib/packages/utils/validate.js.map +1 -1
- package/package.json +1 -1
- package/theme/components/index.css +313 -122
- package/theme/index.css +313 -122
- package/theme/skin/default.css +313 -122
- 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: "
|
|
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
|
-
|
|
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
|
-
|
|
261
|
-
|
|
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
|
-
|
|
269
|
-
|
|
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
|
-
|
|
517
|
+
if (scrollTimer) {
|
|
518
|
+
clearInterval(scrollTimer);
|
|
519
|
+
scrollTimer = null;
|
|
520
|
+
}
|
|
276
521
|
}
|
|
277
522
|
function setLayout() {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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:
|
|
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.
|
|
613
|
+
item.icon ? (vue.openBlock(), vue.createBlock(vue.unref(index$1.ToIcon), {
|
|
360
614
|
key: 1,
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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
|
-
|
|
401
|
-
/*
|
|
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
|
-
|
|
405
|
-
/* NEED_PATCH */
|
|
671
|
+
544
|
|
672
|
+
/* NEED_HYDRATION, NEED_PATCH */
|
|
406
673
|
),
|
|
407
|
-
controlShow.value ||
|
|
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
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
]),
|