vft 0.0.8 → 0.0.11

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.
@@ -183,86 +183,28 @@ export declare const VftTabs: import("vft/es/utils").SFCWithInstall<import("vue"
183
183
  onTabRemove?: ((name: Numberish) => any) | undefined;
184
184
  onTabAdd?: (() => any) | undefined;
185
185
  }, {}>> & {
186
- new (...args: any[]): {
187
- $: import("vue").ComponentInternalInstance;
188
- $data: {};
189
- $props: Partial<{}> & Omit<Readonly<import("vue").ExtractPropTypes<{
190
- label: {
191
- type: import("vue").PropType<string | undefined>;
192
- required: false;
193
- };
194
- name: {
195
- type: import("vue").PropType<Numberish | undefined>;
196
- required: false;
197
- };
198
- closable: {
199
- type: import("vue").PropType<boolean | undefined>;
200
- required: false;
201
- };
202
- disabled: {
203
- type: import("vue").PropType<boolean | undefined>;
204
- required: false;
205
- };
206
- lazy: {
207
- type: import("vue").PropType<boolean | undefined>;
208
- required: false;
209
- };
210
- }>> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>;
211
- $attrs: {
212
- [x: string]: unknown;
186
+ TabPane: import("vue").DefineComponent<{
187
+ label: {
188
+ type: import("vue").PropType<string | undefined>;
189
+ required: false;
213
190
  };
214
- $refs: {
215
- [x: string]: unknown;
191
+ name: {
192
+ type: import("vue").PropType<Numberish | undefined>;
193
+ required: false;
216
194
  };
217
- $slots: Readonly<{
218
- [name: string]: import("vue").Slot | undefined;
219
- }>;
220
- $root: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null;
221
- $parent: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null;
222
- $emit: (event: string, ...args: any[]) => void;
223
- $el: any;
224
- $options: import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<{
225
- label: {
226
- type: import("vue").PropType<string | undefined>;
227
- required: false;
228
- };
229
- name: {
230
- type: import("vue").PropType<Numberish | undefined>;
231
- required: false;
232
- };
233
- closable: {
234
- type: import("vue").PropType<boolean | undefined>;
235
- required: false;
236
- };
237
- disabled: {
238
- type: import("vue").PropType<boolean | undefined>;
239
- required: false;
240
- };
241
- lazy: {
242
- type: import("vue").PropType<boolean | undefined>;
243
- required: false;
244
- };
245
- }>>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {}, {}, string> & {
246
- beforeCreate?: ((() => void) | (() => void)[]) | undefined;
247
- created?: ((() => void) | (() => void)[]) | undefined;
248
- beforeMount?: ((() => void) | (() => void)[]) | undefined;
249
- mounted?: ((() => void) | (() => void)[]) | undefined;
250
- beforeUpdate?: ((() => void) | (() => void)[]) | undefined;
251
- updated?: ((() => void) | (() => void)[]) | undefined;
252
- activated?: ((() => void) | (() => void)[]) | undefined;
253
- deactivated?: ((() => void) | (() => void)[]) | undefined;
254
- beforeDestroy?: ((() => void) | (() => void)[]) | undefined;
255
- beforeUnmount?: ((() => void) | (() => void)[]) | undefined;
256
- destroyed?: ((() => void) | (() => void)[]) | undefined;
257
- unmounted?: ((() => void) | (() => void)[]) | undefined;
258
- renderTracked?: (((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[]) | undefined;
259
- renderTriggered?: (((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[]) | undefined;
260
- errorCaptured?: (((err: unknown, instance: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null, info: string) => boolean | void) | ((err: unknown, instance: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null, info: string) => boolean | void)[]) | undefined;
195
+ closable: {
196
+ type: import("vue").PropType<boolean | undefined>;
197
+ required: false;
198
+ };
199
+ disabled: {
200
+ type: import("vue").PropType<boolean | undefined>;
201
+ required: false;
261
202
  };
262
- $forceUpdate: () => void;
263
- $nextTick: typeof import("vue").nextTick;
264
- $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (args_0: R, args_1: R) => any : (...args: any) => any, options?: import("vue").WatchOptions<boolean> | undefined): import("vue").WatchStopHandle;
265
- } & Readonly<import("vue").ExtractPropTypes<{
203
+ lazy: {
204
+ type: import("vue").PropType<boolean | undefined>;
205
+ required: false;
206
+ };
207
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
266
208
  label: {
267
209
  type: import("vue").PropType<string | undefined>;
268
210
  required: false;
@@ -283,32 +225,8 @@ export declare const VftTabs: import("vft/es/utils").SFCWithInstall<import("vue"
283
225
  type: import("vue").PropType<boolean | undefined>;
284
226
  required: false;
285
227
  };
286
- }>> & import("vue").ShallowUnwrapRef<{}> & {} & import("vue").ComponentCustomProperties & {};
287
- __isFragment?: undefined;
288
- __isTeleport?: undefined;
289
- __isSuspense?: undefined;
290
- } & import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<{
291
- label: {
292
- type: import("vue").PropType<string | undefined>;
293
- required: false;
294
- };
295
- name: {
296
- type: import("vue").PropType<Numberish | undefined>;
297
- required: false;
298
- };
299
- closable: {
300
- type: import("vue").PropType<boolean | undefined>;
301
- required: false;
302
- };
303
- disabled: {
304
- type: import("vue").PropType<boolean | undefined>;
305
- required: false;
306
- };
307
- lazy: {
308
- type: import("vue").PropType<boolean | undefined>;
309
- required: false;
310
- };
311
- }>>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {}, {}, string> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps;
228
+ }>>, {}>;
229
+ };
312
230
  export declare const VftTabPane: import("vft/es/utils").SFCWithInstall<import("vue").DefineComponent<{
313
231
  label: {
314
232
  type: import("vue").PropType<string | undefined>;
@@ -1,13 +1,13 @@
1
- import { withInstall as o, withNoopInstall as m } from "../../utils/vue/install.mjs";
1
+ import { withInstall as o, withNoopInstall as a } from "../../utils/vue/install.mjs";
2
2
  import "vue";
3
3
  import "@vue/shared";
4
4
  import "@vft/utils";
5
- import r from "./tabs.vue2.mjs";
5
+ import m from "./tabs.vue2.mjs";
6
6
  import t from "./tab-pane.vue2.mjs";
7
- import { TabsRootContextKey as b } from "./types.mjs";
8
- const e = o(r, t), l = m(t);
7
+ import { TabsRootContextKey as T } from "./types.mjs";
8
+ const e = o(m, { TabPane: t }), l = a(t);
9
9
  export {
10
- b as TabsRootContextKey,
10
+ T as TabsRootContextKey,
11
11
  l as VftTabPane,
12
12
  e as VftTabs,
13
13
  e as default
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../packages/components/tabs/index.ts"],"sourcesContent":["import { withInstall, withNoopInstall } from '@vft-ui/utils'\nimport Tabs from './tabs.vue';\nimport TabPane from './tab-pane.vue';\n\nexport const VftTabs = withInstall(Tabs, TabPane)\nexport const VftTabPane = withNoopInstall(TabPane)\nexport default VftTabs\n\nexport * from './types';\n"],"names":["VftTabs","withInstall","Tabs","TabPane","VftTabPane","withNoopInstall"],"mappings":";;;;;;;AAIa,MAAAA,IAAUC,EAAYC,GAAMC,CAAO,GACnCC,IAAaC,EAAgBF,CAAO;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../packages/components/tabs/index.ts"],"sourcesContent":["import { withInstall, withNoopInstall } from '@vft-ui/utils'\nimport Tabs from './tabs.vue';\nimport TabPane from './tab-pane.vue';\n\nexport const VftTabs = withInstall(Tabs, { TabPane })\nexport const VftTabPane = withNoopInstall(TabPane)\nexport default VftTabs\n\nexport * from './types';\n"],"names":["VftTabs","withInstall","Tabs","TabPane","VftTabPane","withNoopInstall"],"mappings":";;;;;;;AAIO,MAAMA,IAAUC,EAAYC,GAAM,EAAA,SAAEC,GAAS,GACvCC,IAAaC,EAAgBF,CAAO;"}
@@ -1,4 +1,6 @@
1
- import { defineComponent as G, getCurrentInstance as J, inject as Q, ref as g, computed as I, watch as O, onMounted as Z, onUpdated as _, createVNode as c, nextTick as ee } from "vue";
1
+ import { defineComponent as E, getCurrentInstance as Z, inject as _, ref as p, computed as I, watch as O, onMounted as ee, onUpdated as te, createVNode as c, nextTick as oe } from "vue";
2
+ import "@vue/shared";
3
+ import { throwError as ne } from "../../utils/error.mjs";
2
4
  import "../divider/index.mjs";
3
5
  import { VftIcon as T } from "../icon/index.mjs";
4
6
  import "../avatar/index.mjs";
@@ -6,15 +8,19 @@ import "../empty/index.mjs";
6
8
  import "../result/index.mjs";
7
9
  import "../exception/index.mjs";
8
10
  import "./index.mjs";
9
- import { useNamespace as te } from "../../hooks/use-namespace/index.mjs";
10
- import "@vue/shared";
11
+ import { useNamespace as K } from "../../hooks/use-namespace/index.mjs";
11
12
  import { capitalize as y } from "@vft/utils";
12
13
  import { EVENT_CODE as k } from "@vft/constants";
13
- import { TabsRootContextKey as oe } from "./types.mjs";
14
- import { useDocumentVisibility as ne, useWindowFocus as le, useResizeObserver as ae } from "@vueuse/core";
15
- import se from "./tab-bar.vue2.mjs";
16
- const ye = /* @__PURE__ */ G({
17
- __name: "tab-nav",
14
+ import { TabsRootContextKey as le } from "./types.mjs";
15
+ import { useDocumentVisibility as ae, useWindowFocus as se, useResizeObserver as ie } from "@vueuse/core";
16
+ import ce from "./tab-bar.vue2.mjs";
17
+ const V = (
18
+ /* hoist-static*/
19
+ K("tab-nav")
20
+ ), re = E({
21
+ name: V.b()
22
+ }), ke = /* @__PURE__ */ E({
23
+ ...re,
18
24
  props: {
19
25
  panes: null,
20
26
  editable: {
@@ -34,18 +40,20 @@ const ye = /* @__PURE__ */ G({
34
40
  },
35
41
  emits: ["tabClick", "tabRemove", "tabAdd", "tabContextmenu"],
36
42
  setup(l, {
37
- expose: K,
38
- emit: p
43
+ expose: D,
44
+ emit: C
39
45
  }) {
40
46
  var A;
41
- const V = J(), C = Q(oe), o = te("tabs"), D = ne(), E = le(), $ = g(), b = g(), h = g(), f = g(!1), v = g(0), S = g(!1), x = g(!0), w = I(() => ["top", "bottom"].includes(C.props.tabPosition) ? "width" : "height"), M = I(() => ({
47
+ const M = Z(), m = _(le);
48
+ m || ne(V.b(), "<vft-tabs><tab-nav /></vft-tabs>");
49
+ const o = K("tabs"), q = ae(), H = se(), $ = p(), b = p(), h = p(), f = p(!1), v = p(0), S = p(!1), x = p(!0), w = I(() => ["top", "bottom"].includes(m.props.tabPosition) ? "width" : "height"), W = I(() => ({
42
50
  transform: `translate${w.value === "width" ? "X" : "Y"}(-${v.value}px)`
43
- })), q = () => {
51
+ })), j = () => {
44
52
  if (!b.value)
45
53
  return;
46
54
  const t = b.value[`offset${y(w.value)}`], e = v.value;
47
55
  e && (v.value = e > t ? e - t : 0);
48
- }, H = () => {
56
+ }, U = () => {
49
57
  if (!b.value || !h.value)
50
58
  return;
51
59
  const t = h.value[`offset${y(w.value)}`], e = b.value[`offset${y(w.value)}`], n = v.value;
@@ -54,114 +62,114 @@ const ye = /* @__PURE__ */ G({
54
62
  const t = h.value;
55
63
  if (!f.value || !$.value || !b.value || !t)
56
64
  return;
57
- await ee();
65
+ await oe();
58
66
  const e = $.value.querySelector(".is-active");
59
67
  if (!e)
60
68
  return;
61
- const n = b.value, m = ["top", "bottom"].includes(C.props.tabPosition), i = e.getBoundingClientRect(), a = n.getBoundingClientRect(), r = m ? t.offsetWidth - a.width : t.offsetHeight - a.height, u = v.value;
62
- let s = u;
63
- m ? (i.left < a.left && (s = u - (a.left - i.left)), i.right > a.right && (s = u + i.right - a.right)) : (i.top < a.top && (s = u - (a.top - i.top)), i.bottom > a.bottom && (s = u + (i.bottom - a.bottom))), s = Math.max(s, 0), v.value = Math.min(s, r);
69
+ const n = b.value, g = ["top", "bottom"].includes(m.props.tabPosition), i = e.getBoundingClientRect(), a = n.getBoundingClientRect(), u = g ? t.offsetWidth - a.width : t.offsetHeight - a.height, r = v.value;
70
+ let s = r;
71
+ g ? (i.left < a.left && (s = r - (a.left - i.left)), i.right > a.right && (s = r + i.right - a.right)) : (i.top < a.top && (s = r - (a.top - i.top)), i.bottom > a.bottom && (s = r + (i.bottom - a.bottom))), s = Math.max(s, 0), v.value = Math.min(s, u);
64
72
  }, z = () => {
65
73
  if (!h.value || !b.value)
66
74
  return;
67
75
  const t = h.value[`offset${y(w.value)}`], e = b.value[`offset${y(w.value)}`], n = v.value;
68
76
  e < t ? (f.value = f.value || {}, f.value.prev = n, f.value.next = n + e < t, t - n < e && (v.value = t - e)) : (f.value = !1, n > 0 && (v.value = 0));
69
- }, W = (t) => {
77
+ }, X = (t) => {
70
78
  const e = t.code, {
71
79
  up: n,
72
- down: m,
80
+ down: g,
73
81
  left: i,
74
82
  right: a
75
83
  } = k;
76
- if (![n, m, i, a].includes(e))
84
+ if (![n, g, i, a].includes(e))
77
85
  return;
78
- const r = Array.from(t.currentTarget.querySelectorAll("[role=tab]:not(.is-disabled)")), u = r.indexOf(t.target);
86
+ const u = Array.from(t.currentTarget.querySelectorAll("[role=tab]:not(.is-disabled)")), r = u.indexOf(t.target);
79
87
  let s;
80
- e === i || e === n ? u === 0 ? s = r.length - 1 : s = u - 1 : u < r.length - 1 ? s = u + 1 : s = 0, r[s].focus(), r[s].click(), P();
88
+ e === i || e === n ? r === 0 ? s = u.length - 1 : s = r - 1 : r < u.length - 1 ? s = r + 1 : s = 0, u[s].focus(), u[s].click(), P();
81
89
  }, P = () => {
82
90
  x.value && (S.value = !0);
83
91
  }, B = () => S.value = !1;
84
- O(D, (t) => {
92
+ O(q, (t) => {
85
93
  t === "hidden" ? x.value = !1 : t === "visible" && setTimeout(() => x.value = !0, 50);
86
- }), O(E, (t) => {
94
+ }), O(H, (t) => {
87
95
  t ? setTimeout(() => x.value = !0, 50) : x.value = !1;
88
- }), ae($, z), Z(() => setTimeout(() => R(), 0)), _(() => z()), K({
96
+ }), ie($, z), ee(() => setTimeout(() => R(), 0)), te(() => z()), D({
89
97
  scrollToActiveTab: R,
90
98
  removeFocus: B
91
- }), O(() => l.panes, () => V.update(), {
99
+ }), O(() => l.panes, () => M.update(), {
92
100
  flush: "post"
93
101
  });
94
- const j = I(() => {
102
+ const Y = I(() => {
95
103
  var t, e;
96
104
  return f.value ? [c("span", {
97
105
  class: [o.e("nav-prev"), o.is("disabled", !f.value.prev)],
98
- onClick: q
106
+ onClick: j
99
107
  }, [(t = l.arrowLeftIconCfg) != null && t.icon ? c(T, l.arrowLeftIconCfg, null) : null]), c("span", {
100
108
  class: [o.e("nav-next"), o.is("disabled", !f.value.next)],
101
- onClick: H
109
+ onClick: U
102
110
  }, [(e = l.arrowRightIconCfg) != null && e.icon ? c(T, l.arrowRightIconCfg, null) : null])] : null;
103
- }), U = I(() => {
111
+ }), G = I(() => {
104
112
  var t;
105
113
  return (t = l.panes) == null ? void 0 : t.map((e, n) => {
106
114
  var N, F, L;
107
- const m = e.uid, i = e.props.disabled, a = e.props.name ?? e.index ?? `${n}`, r = !i && (e.isClosable || l.editable);
115
+ const g = e.uid, i = e.props.disabled, a = e.props.name ?? e.index ?? `${n}`, u = !i && (e.isClosable || l.editable);
108
116
  e.index = `${n}`;
109
- const u = r ? c("span", {
117
+ const r = u ? c("span", {
110
118
  class: "is-icon-close",
111
- onClick: (d) => p("tabRemove", e, d)
112
- }, [(N = l.closeIconCfg) != null && N.icon ? c(T, l.closeIconCfg, null) : null]) : null, s = ((L = (F = e.slots).label) == null ? void 0 : L.call(F)) || e.props.label, Y = !i && e.active ? 0 : -1;
119
+ onClick: (d) => C("tabRemove", e, d)
120
+ }, [(N = l.closeIconCfg) != null && N.icon ? c(T, l.closeIconCfg, null) : null]) : null, s = ((L = (F = e.slots).label) == null ? void 0 : L.call(F)) || e.props.label, Q = !i && e.active ? 0 : -1;
113
121
  return c("div", {
114
- ref: `tab-${m}`,
115
- class: [o.e("item"), o.is(C.props.tabPosition), o.is("active", e.active), o.is("disabled", i), o.is("closable", r), o.is("focus", S.value)],
122
+ ref: `tab-${g}`,
123
+ class: [o.e("item"), o.is(m.props.tabPosition), o.is("active", e.active), o.is("disabled", i), o.is("closable", u), o.is("focus", S.value)],
116
124
  id: `tab-${a}`,
117
- key: `tab-${m}`,
125
+ key: `tab-${g}`,
118
126
  "aria-controls": `pane-${a}`,
119
127
  role: "tab",
120
128
  "aria-selected": e.active,
121
- tabindex: Y,
129
+ tabindex: Q,
122
130
  onFocus: () => P(),
123
131
  onBlur: () => B(),
124
132
  onClick: (d) => {
125
- B(), p("tabClick", e, a, d);
133
+ B(), C("tabClick", e, a, d);
126
134
  },
127
135
  onContextmenu: (d) => {
128
- d.preventDefault(), p("tabContextmenu", {
136
+ d.preventDefault(), C("tabContextmenu", {
129
137
  pane: e,
130
138
  index: n,
131
139
  event: d
132
140
  });
133
141
  },
134
142
  onKeydown: (d) => {
135
- r && (d.code === k.delete || d.code === k.backspace) && p("tabRemove", e, d);
143
+ u && (d.code === k.delete || d.code === k.backspace) && C("tabRemove", e, d);
136
144
  }
137
- }, [s, u]);
145
+ }, [s, r]);
138
146
  });
139
- }), X = l.editable || l.addable ? c("span", {
147
+ }), J = l.editable || l.addable ? c("span", {
140
148
  class: o.e("new-tab"),
141
149
  tabindex: "0",
142
- onClick: () => p("tabAdd"),
150
+ onClick: () => C("tabAdd"),
143
151
  onKeydown: (t) => {
144
- t.code === k.enter && p("tabAdd");
152
+ t.code === k.enter && C("tabAdd");
145
153
  }
146
154
  }, [(A = l.addIconCfg) != null && A.icon ? c(T, l.addIconCfg, null) : null]) : null;
147
155
  return () => c("div", {
148
156
  ref: $,
149
- class: [o.e("nav-wrap"), o.is("scrollable", !!f.value), o.is(C.props.tabPosition)]
150
- }, [j.value, c("div", {
157
+ class: [o.e("nav-wrap"), o.is("scrollable", !!f.value), o.is(m.props.tabPosition)]
158
+ }, [Y.value, c("div", {
151
159
  class: o.e("nav-scroll"),
152
160
  ref: b
153
161
  }, [c("div", {
154
- class: [o.e("nav"), o.is(C.props.tabPosition), o.is("stretch", l.stretch && ["top", "bottom"].includes(C.props.tabPosition))],
162
+ class: [o.e("nav"), o.is(m.props.tabPosition), o.is("stretch", l.stretch && ["top", "bottom"].includes(m.props.tabPosition))],
155
163
  ref: h,
156
- style: M.value,
164
+ style: W.value,
157
165
  role: "tablist",
158
- onKeydown: W
159
- }, [l.type ? null : c(se, {
166
+ onKeydown: X
167
+ }, [l.type ? null : c(ce, {
160
168
  tabs: [...l.panes]
161
- }, null), U.value]), X])]);
169
+ }, null), G.value]), J])]);
162
170
  }
163
171
  });
164
172
  export {
165
- ye as default
173
+ ke as default
166
174
  };
167
175
  //# sourceMappingURL=tab-nav.vue2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tab-nav.vue2.mjs","sources":["../../../../../packages/components/tabs/tab-nav.vue"],"sourcesContent":["<script lang=\"tsx\" setup>\nimport {\n computed,\n type CSSProperties,\n getCurrentInstance,\n inject,\n nextTick,\n onMounted,\n onUpdated,\n ref,\n watch\n} from 'vue';\nimport { type IconProps, VftIcon } from '@vft-ui/components';\nimport { useNamespace } from '@vft-ui/hooks';\nimport { capitalize } from '@vft/utils';\nimport { EVENT_CODE } from '@vft/constants';\nimport { TabsRootContextKey } from './types';\nimport type { TabsPaneContext, TabsType, Scrollable } from './types';\nimport { useDocumentVisibility, useResizeObserver, useWindowFocus } from '@vueuse/core';\nimport TabBar from './tab-bar.vue';\n\ninterface TabNavProps {\n panes: TabsPaneContext[];\n /** 标签是否同时可增加和关闭 */\n editable?: boolean;\n /** 标签是否可增加 */\n addable?: boolean;\n /** tab 类型 */\n type?: TabsType;\n stretch?: boolean;\n /** 图标配置 */\n closeIconCfg?: IconProps;\n addIconCfg?: IconProps;\n arrowLeftIconCfg?: IconProps;\n arrowRightIconCfg?: IconProps;\n}\n\ndefineProps({\n \"panes\": null,\n \"editable\": { type: Boolean, },\n \"addable\": { type: Boolean, },\n \"type\": null,\n \"stretch\": { type: Boolean, },\n \"closeIconCfg\": null,\n \"addIconCfg\": null,\n \"arrowLeftIconCfg\": null,\n \"arrowRightIconCfg\": null\n})\n\nconst emit = defineEmits(['tabClick', 'tabRemove', 'tabAdd', 'tabContextmenu']);\n\nconst vm = getCurrentInstance()!;\n\n// 获取从 index.vue 提供的数据信息\nconst rootTabs = inject(TabsRootContextKey)!;\n\nconst ns = useNamespace('tabs');\nconst visibility = useDocumentVisibility();\nconst focused = useWindowFocus();\n\n// 整个 nav dom 包含前进后退 btn (vri-tabs__nav-wrap)\nconst el$ = ref<HTMLDivElement>();\n// el$ 子节点 包含 newButton (vri-tabs__nav-scroll)\nconst navScroll$ = ref<HTMLDivElement>();\n// navScroll$ 子节点 (vri-tabs__nav)\nconst nav$ = ref<HTMLDivElement>();\n\n/** 是否展示左右滚动 */\nconst scrollable = ref<false | Scrollable>(false);\n// 记录滚动时的偏移量\nconst navOffset = ref(0);\nconst isFocus = ref(false);\nconst focusable = ref(true);\n\n// 根据 tabPosition 确定 sizeName 是 width or height\nconst sizeName = computed(() => ['top', 'bottom'].includes(rootTabs.props.tabPosition!) ? 'width' : 'height');\n\n// 设置 tab 导航栏的 translateX or translateY 的偏移量\nconst navStyle = computed<CSSProperties>(() => {\n const dir = sizeName.value === 'width' ? 'X' : 'Y';\n return {\n transform: `translate${dir}(-${navOffset.value}px)`\n };\n});\n\n// 向前滚动\nconst scrollPrev = () => {\n if (!navScroll$.value) return;\n const containerSize =\n navScroll$.value[`offset${capitalize(sizeName.value)}`];\n const currentOffset = navOffset.value;\n\n if (!currentOffset) return;\n\n navOffset.value = currentOffset > containerSize ? currentOffset - containerSize : 0;\n};\n\n// 向后滚动\nconst scrollNext = () => {\n if (!navScroll$.value || !nav$.value) return;\n\n const navSize = nav$.value[`offset${capitalize(sizeName.value)}`];\n const containerSize =\n navScroll$.value[`offset${capitalize(sizeName.value)}`];\n const currentOffset = navOffset.value;\n\n if (navSize - currentOffset <= containerSize) return;\n\n navOffset.value = navSize - currentOffset > containerSize * 2\n ? currentOffset + containerSize\n : navSize - containerSize;\n};\n\n// 滚动到激活的 tab 主要是获取 navOffset 的值\nconst scrollToActiveTab = async() => {\n const nav = nav$.value;\n if (!scrollable.value || !el$.value || !navScroll$.value || !nav) return;\n\n await nextTick();\n\n const activeTab = el$.value.querySelector('.is-active');\n if (!activeTab) return;\n\n const navScroll = navScroll$.value;\n const isHorizontal = ['top', 'bottom'].includes(\n rootTabs.props.tabPosition!\n );\n const activeTabBounding = activeTab.getBoundingClientRect();\n // vri-tabs__nav-scroll\n const navScrollBounding = navScroll.getBoundingClientRect();\n const maxOffset = isHorizontal\n ? nav.offsetWidth - navScrollBounding.width\n : nav.offsetHeight - navScrollBounding.height;\n\n const currentOffset = navOffset.value;\n\n let newOffset = currentOffset;\n\n if (isHorizontal) {\n if (activeTabBounding.left < navScrollBounding.left) {\n newOffset =\n currentOffset - (navScrollBounding.left - activeTabBounding.left);\n }\n if (activeTabBounding.right > navScrollBounding.right) {\n newOffset =\n currentOffset + activeTabBounding.right - navScrollBounding.right;\n }\n } else {\n if (activeTabBounding.top < navScrollBounding.top) {\n newOffset =\n currentOffset - (navScrollBounding.top - activeTabBounding.top);\n }\n if (activeTabBounding.bottom > navScrollBounding.bottom) {\n newOffset =\n currentOffset +\n (activeTabBounding.bottom - navScrollBounding.bottom);\n }\n }\n newOffset = Math.max(newOffset, 0);\n navOffset.value = Math.min(newOffset, maxOffset);\n};\n\nconst update = () => {\n if (!nav$.value || !navScroll$.value) return;\n // 根据 position 的不同 获取 nav$(vri-tabs__nav) 的 offsetWidth or offsetHeight\n const navSize = nav$.value[`offset${capitalize(sizeName.value)}`];\n // 获取到 navScroll$ 的 offsetWidth or offsetHeight\n const containerSize = navScroll$.value[`offset${capitalize(sizeName.value)}`];\n // 获取到当前的偏移量\n const currentOffset = navOffset.value;\n // 由于 navScroll$ 的 overflow 是 hidden,所以当 vri-tabs__nav 撑开时其宽度可能会超过 vri-tabs__nav-scroll\n if (containerSize < navSize) {\n scrollable.value = scrollable.value || {};\n scrollable.value.prev = currentOffset;\n scrollable.value.next = currentOffset + containerSize < navSize;\n if (navSize - currentOffset < containerSize) {\n navOffset.value = navSize - containerSize;\n }\n } else {\n scrollable.value = false;\n if (currentOffset > 0) {\n navOffset.value = 0;\n }\n }\n};\n\nconst changeTab = (e: KeyboardEvent) => {\n const code = e.code;\n\n const { up, down, left, right } = EVENT_CODE;\n if (![up, down, left, right].includes(code)) return;\n\n // 左右上下键更换tab\n const tabList = Array.from(\n (e.currentTarget as HTMLDivElement).querySelectorAll<HTMLDivElement>(\n '[role=tab]:not(.is-disabled)'\n )\n );\n const currentIndex = tabList.indexOf(e.target as HTMLDivElement);\n\n let nextIndex: number;\n if (code === left || code === up) {\n // left\n if (currentIndex === 0) {\n // first\n nextIndex = tabList.length - 1;\n } else {\n nextIndex = currentIndex - 1;\n }\n } else {\n // right\n if (currentIndex < tabList.length - 1) {\n // not last\n nextIndex = currentIndex + 1;\n } else {\n nextIndex = 0;\n }\n }\n tabList[nextIndex].focus(); // 改变焦点元素\n tabList[nextIndex].click(); // 选中下一个tab\n setFocus();\n};\n\nconst setFocus = () => {\n if (focusable.value) isFocus.value = true;\n};\nconst removeFocus = () => (isFocus.value = false);\n\nwatch(visibility, (visibility) => {\n if (visibility === 'hidden') {\n focusable.value = false;\n } else if (visibility === 'visible') {\n setTimeout(() => (focusable.value = true), 50);\n }\n});\n\nwatch(focused, (focused) => {\n if (focused) {\n setTimeout(() => (focusable.value = true), 50);\n } else {\n focusable.value = false;\n }\n});\n\n// 监听 resize 触发 update\nuseResizeObserver(el$, update);\n\nonMounted(() => setTimeout(() => scrollToActiveTab(), 0));\nonUpdated(() => update());\n\ndefineExpose({\n scrollToActiveTab,\n removeFocus\n});\n\nwatch(\n () => __props.panes,\n () => vm.update(),\n { flush: 'post' }\n);\n\n// 前进后退标签\nconst scrollBtn = computed(() => {\n return scrollable.value\n ? [\n <span\n class={[\n ns.e('nav-prev'),\n ns.is('disabled', !scrollable.value.prev)\n ]}\n onClick={scrollPrev}\n >\n {__props.arrowLeftIconCfg?.icon ? <VftIcon {...__props.arrowLeftIconCfg}></VftIcon> : null}\n </span>,\n <span\n class={[\n ns.e('nav-next'),\n ns.is('disabled', !scrollable.value.next)\n ]}\n onClick={scrollNext}\n >\n {__props.arrowRightIconCfg?.icon ? <VftIcon {...__props.arrowRightIconCfg}></VftIcon> : null}\n </span>\n ]\n : null;\n});\n\n// 渲染 tab-pane\nconst tabs = computed(() => {\n return __props.panes?.map((pane, index) => {\n const uid = pane.uid;\n const disabled = pane.props.disabled;\n const tabName = pane.props.name ?? pane.index ?? `${index}`;\n const closable = !disabled && (pane.isClosable || __props.editable);\n pane.index = `${index}`;\n\n // 关闭标签图标\n const btnClose = closable ? (\n <span class=\"is-icon-close\" onClick={(ev: MouseEvent) => emit('tabRemove', pane, ev)}>\n {__props.closeIconCfg?.icon ? <VftIcon {...__props.closeIconCfg}></VftIcon> : null}\n </span>\n ) : null;\n\n const tabLabelContent = pane.slots.label?.() || pane.props.label;\n const tabindex = !disabled && pane.active ? 0 : -1;\n\n return (\n <div\n ref={`tab-${uid}`}\n class={[\n ns.e('item'),\n ns.is(rootTabs.props.tabPosition!),\n ns.is('active', pane.active),\n ns.is('disabled', disabled),\n ns.is('closable', closable),\n ns.is('focus', isFocus.value)\n ]}\n id={`tab-${tabName}`}\n key={`tab-${uid}`}\n aria-controls={`pane-${tabName}`}\n role=\"tab\"\n aria-selected={pane.active}\n tabindex={tabindex}\n onFocus={() => setFocus()}\n onBlur={() => removeFocus()}\n onClick={(ev: MouseEvent) => {\n removeFocus();\n emit('tabClick', pane, tabName, ev);\n }}\n onContextmenu={(event) => {\n event.preventDefault();\n emit('tabContextmenu', { pane, index, event });\n }}\n onKeydown={(ev: KeyboardEvent) => {\n if (\n closable &&\n (ev.code === EVENT_CODE.delete ||\n ev.code === EVENT_CODE.backspace)\n ) {\n emit('tabRemove', pane, ev);\n }\n }}\n >\n {...[tabLabelContent, btnClose]}\n </div>\n );\n });\n});\n\n// 增加 tab 的 dom\nconst newButton =\n __props.editable || __props.addable ? (\n <span\n class={ns.e('new-tab')}\n tabindex=\"0\"\n onClick={() => emit('tabAdd')}\n onKeydown={(ev: KeyboardEvent) => {\n if (ev.code === EVENT_CODE.enter) emit('tabAdd');\n }}\n >\n {__props.addIconCfg?.icon ? <VftIcon {...__props.addIconCfg}></VftIcon> : null}\n </span>\n ) : null;\n\ndefineRender(() => {\n return (\n <div\n ref={el$}\n class={[\n ns.e('nav-wrap'),\n ns.is('scrollable', !!scrollable.value),\n ns.is(rootTabs.props.tabPosition!)\n ]}\n >\n {scrollBtn.value}\n <div class={ns.e('nav-scroll')} ref={navScroll$}>\n <div\n class={[\n ns.e('nav'),\n ns.is(rootTabs.props.tabPosition!),\n ns.is(\n 'stretch',\n __props.stretch &&\n ['top', 'bottom'].includes(rootTabs.props.tabPosition!)\n )\n ]}\n ref={nav$}\n style={navStyle.value}\n role=\"tablist\"\n onKeydown={changeTab}\n >\n {...[\n !__props.type ? <TabBar tabs={[...__props.panes]} /> : null,\n tabs.value\n ]}\n </div>\n {newButton}\n </div>\n </div>\n );\n});\n</script>\n"],"names":["vm","getCurrentInstance","rootTabs","inject","TabsRootContextKey","ns","useNamespace","visibility","useDocumentVisibility","focused","useWindowFocus","el$","ref","navScroll$","nav$","scrollable","navOffset","isFocus","focusable","sizeName","computed","includes","props","tabPosition","navStyle","transform","value","scrollPrev","containerSize","capitalize","currentOffset","scrollNext","navSize","scrollToActiveTab","nav","nextTick","activeTab","querySelector","navScroll","isHorizontal","activeTabBounding","getBoundingClientRect","navScrollBounding","maxOffset","offsetWidth","width","offsetHeight","height","newOffset","left","right","top","bottom","Math","max","min","update","prev","next","changeTab","e","code","up","down","EVENT_CODE","tabList","Array","from","currentTarget","querySelectorAll","currentIndex","indexOf","target","nextIndex","length","focus","click","setFocus","removeFocus","watch","setTimeout","useResizeObserver","onMounted","onUpdated","expose","__props","panes","flush","scrollBtn","_createVNode","is","arrowLeftIconCfg","icon","VftIcon","arrowRightIconCfg","tabs","map","pane","index","uid","disabled","tabName","name","closable","isClosable","editable","btnClose","ev","emit","closeIconCfg","tabLabelContent","slots","label","tabindex","active","onFocus","onBlur","event","preventDefault","delete","backspace","newButton","addable","onClick","enter","addIconCfg","stretch","type","TabBar"],"mappings":"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"}
1
+ {"version":3,"file":"tab-nav.vue2.mjs","sources":["../../../../../packages/components/tabs/tab-nav.vue"],"sourcesContent":["<script lang=\"tsx\">\nconst ns_nav = /* hoist-static*/ useNamespace('tab-nav')\n\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({\n\tname: ns_nav.b()\n});</script>\n<script lang=\"tsx\" setup>\nimport { throwError } from '@vft-ui/utils';\nimport {\n computed,\n type CSSProperties,\n getCurrentInstance,\n inject,\n nextTick,\n onMounted,\n onUpdated,\n ref,\n watch\n} from 'vue';\nimport { type IconProps, VftIcon } from '@vft-ui/components';\nimport { useNamespace } from '@vft-ui/hooks';\nimport { capitalize } from '@vft/utils';\nimport { EVENT_CODE } from '@vft/constants';\nimport { TabsRootContextKey } from './types';\nimport type { TabsPaneContext, TabsType, Scrollable } from './types';\nimport { useDocumentVisibility, useResizeObserver, useWindowFocus } from '@vueuse/core';\nimport TabBar from './tab-bar.vue';\n\ninterface TabNavProps {\n panes: TabsPaneContext[];\n /** 标签是否同时可增加和关闭 */\n editable?: boolean;\n /** 标签是否可增加 */\n addable?: boolean;\n /** tab 类型 */\n type?: TabsType;\n stretch?: boolean;\n /** 图标配置 */\n closeIconCfg?: IconProps;\n addIconCfg?: IconProps;\n arrowLeftIconCfg?: IconProps;\n arrowRightIconCfg?: IconProps;\n}\n\ndefineProps({\n \"panes\": null,\n \"editable\": { type: Boolean, },\n \"addable\": { type: Boolean, },\n \"type\": null,\n \"stretch\": { type: Boolean, },\n \"closeIconCfg\": null,\n \"addIconCfg\": null,\n \"arrowLeftIconCfg\": null,\n \"arrowRightIconCfg\": null\n})\n\nconst emit = defineEmits(['tabClick', 'tabRemove', 'tabAdd', 'tabContextmenu']);\n\n\n\n;\n\nconst vm = getCurrentInstance()!;\n\n// 获取从 index.vue 提供的数据信息\nconst rootTabs = inject(TabsRootContextKey)!;\nif (!rootTabs) throwError(ns_nav.b(), `<vft-tabs><tab-nav /></vft-tabs>`)\n\nconst ns = useNamespace('tabs');\nconst visibility = useDocumentVisibility();\nconst focused = useWindowFocus();\n\n// 整个 nav dom 包含前进后退 btn (vri-tabs__nav-wrap)\nconst el$ = ref<HTMLDivElement>();\n// el$ 子节点 包含 newButton (vri-tabs__nav-scroll)\nconst navScroll$ = ref<HTMLDivElement>();\n// navScroll$ 子节点 (vri-tabs__nav)\nconst nav$ = ref<HTMLDivElement>();\n\n/** 是否展示左右滚动 */\nconst scrollable = ref<false | Scrollable>(false);\n// 记录滚动时的偏移量\nconst navOffset = ref(0);\nconst isFocus = ref(false);\nconst focusable = ref(true);\n\n// 根据 tabPosition 确定 sizeName 是 width or height\nconst sizeName = computed(() => ['top', 'bottom'].includes(rootTabs.props.tabPosition!) ? 'width' : 'height');\n\n// 设置 tab 导航栏的 translateX or translateY 的偏移量\nconst navStyle = computed<CSSProperties>(() => {\n const dir = sizeName.value === 'width' ? 'X' : 'Y';\n return {\n transform: `translate${dir}(-${navOffset.value}px)`\n };\n});\n\n// 向前滚动\nconst scrollPrev = () => {\n if (!navScroll$.value) return;\n const containerSize =\n navScroll$.value[`offset${capitalize(sizeName.value)}`];\n const currentOffset = navOffset.value;\n\n if (!currentOffset) return;\n\n navOffset.value = currentOffset > containerSize ? currentOffset - containerSize : 0;\n};\n\n// 向后滚动\nconst scrollNext = () => {\n if (!navScroll$.value || !nav$.value) return;\n\n const navSize = nav$.value[`offset${capitalize(sizeName.value)}`];\n const containerSize =\n navScroll$.value[`offset${capitalize(sizeName.value)}`];\n const currentOffset = navOffset.value;\n\n if (navSize - currentOffset <= containerSize) return;\n\n navOffset.value = navSize - currentOffset > containerSize * 2\n ? currentOffset + containerSize\n : navSize - containerSize;\n};\n\n// 滚动到激活的 tab 主要是获取 navOffset 的值\nconst scrollToActiveTab = async() => {\n const nav = nav$.value;\n if (!scrollable.value || !el$.value || !navScroll$.value || !nav) return;\n\n await nextTick();\n\n const activeTab = el$.value.querySelector('.is-active');\n if (!activeTab) return;\n\n const navScroll = navScroll$.value;\n const isHorizontal = ['top', 'bottom'].includes(\n rootTabs.props.tabPosition!\n );\n const activeTabBounding = activeTab.getBoundingClientRect();\n // vri-tabs__nav-scroll\n const navScrollBounding = navScroll.getBoundingClientRect();\n const maxOffset = isHorizontal\n ? nav.offsetWidth - navScrollBounding.width\n : nav.offsetHeight - navScrollBounding.height;\n\n const currentOffset = navOffset.value;\n\n let newOffset = currentOffset;\n\n if (isHorizontal) {\n if (activeTabBounding.left < navScrollBounding.left) {\n newOffset =\n currentOffset - (navScrollBounding.left - activeTabBounding.left);\n }\n if (activeTabBounding.right > navScrollBounding.right) {\n newOffset =\n currentOffset + activeTabBounding.right - navScrollBounding.right;\n }\n } else {\n if (activeTabBounding.top < navScrollBounding.top) {\n newOffset =\n currentOffset - (navScrollBounding.top - activeTabBounding.top);\n }\n if (activeTabBounding.bottom > navScrollBounding.bottom) {\n newOffset =\n currentOffset +\n (activeTabBounding.bottom - navScrollBounding.bottom);\n }\n }\n newOffset = Math.max(newOffset, 0);\n navOffset.value = Math.min(newOffset, maxOffset);\n};\n\nconst update = () => {\n if (!nav$.value || !navScroll$.value) return;\n // 根据 position 的不同 获取 nav$(vri-tabs__nav) 的 offsetWidth or offsetHeight\n const navSize = nav$.value[`offset${capitalize(sizeName.value)}`];\n // 获取到 navScroll$ 的 offsetWidth or offsetHeight\n const containerSize = navScroll$.value[`offset${capitalize(sizeName.value)}`];\n // 获取到当前的偏移量\n const currentOffset = navOffset.value;\n // 由于 navScroll$ 的 overflow 是 hidden,所以当 vri-tabs__nav 撑开时其宽度可能会超过 vri-tabs__nav-scroll\n if (containerSize < navSize) {\n scrollable.value = scrollable.value || {};\n scrollable.value.prev = currentOffset;\n scrollable.value.next = currentOffset + containerSize < navSize;\n if (navSize - currentOffset < containerSize) {\n navOffset.value = navSize - containerSize;\n }\n } else {\n scrollable.value = false;\n if (currentOffset > 0) {\n navOffset.value = 0;\n }\n }\n};\n\nconst changeTab = (e: KeyboardEvent) => {\n const code = e.code;\n\n const { up, down, left, right } = EVENT_CODE;\n if (![up, down, left, right].includes(code)) return;\n\n // 左右上下键更换tab\n const tabList = Array.from(\n (e.currentTarget as HTMLDivElement).querySelectorAll<HTMLDivElement>(\n '[role=tab]:not(.is-disabled)'\n )\n );\n const currentIndex = tabList.indexOf(e.target as HTMLDivElement);\n\n let nextIndex: number;\n if (code === left || code === up) {\n // left\n if (currentIndex === 0) {\n // first\n nextIndex = tabList.length - 1;\n } else {\n nextIndex = currentIndex - 1;\n }\n } else {\n // right\n if (currentIndex < tabList.length - 1) {\n // not last\n nextIndex = currentIndex + 1;\n } else {\n nextIndex = 0;\n }\n }\n tabList[nextIndex].focus(); // 改变焦点元素\n tabList[nextIndex].click(); // 选中下一个tab\n setFocus();\n};\n\nconst setFocus = () => {\n if (focusable.value) isFocus.value = true;\n};\nconst removeFocus = () => (isFocus.value = false);\n\nwatch(visibility, (visibility) => {\n if (visibility === 'hidden') {\n focusable.value = false;\n } else if (visibility === 'visible') {\n setTimeout(() => (focusable.value = true), 50);\n }\n});\n\nwatch(focused, (focused) => {\n if (focused) {\n setTimeout(() => (focusable.value = true), 50);\n } else {\n focusable.value = false;\n }\n});\n\n// 监听 resize 触发 update\nuseResizeObserver(el$, update);\n\nonMounted(() => setTimeout(() => scrollToActiveTab(), 0));\nonUpdated(() => update());\n\ndefineExpose({\n scrollToActiveTab,\n removeFocus\n});\n\nwatch(\n () => __props.panes,\n () => vm.update(),\n { flush: 'post' }\n);\n\n// 前进后退标签\nconst scrollBtn = computed(() => {\n return scrollable.value\n ? [\n <span\n class={[\n ns.e('nav-prev'),\n ns.is('disabled', !scrollable.value.prev)\n ]}\n onClick={scrollPrev}\n >\n {__props.arrowLeftIconCfg?.icon ? <VftIcon {...__props.arrowLeftIconCfg}></VftIcon> : null}\n </span>,\n <span\n class={[\n ns.e('nav-next'),\n ns.is('disabled', !scrollable.value.next)\n ]}\n onClick={scrollNext}\n >\n {__props.arrowRightIconCfg?.icon ? <VftIcon {...__props.arrowRightIconCfg}></VftIcon> : null}\n </span>\n ]\n : null;\n});\n\n// 渲染 tab-pane\nconst tabs = computed(() => {\n return __props.panes?.map((pane, index) => {\n const uid = pane.uid;\n const disabled = pane.props.disabled;\n const tabName = pane.props.name ?? pane.index ?? `${index}`;\n const closable = !disabled && (pane.isClosable || __props.editable);\n pane.index = `${index}`;\n\n // 关闭标签图标\n const btnClose = closable ? (\n <span class=\"is-icon-close\" onClick={(ev: MouseEvent) => emit('tabRemove', pane, ev)}>\n {__props.closeIconCfg?.icon ? <VftIcon {...__props.closeIconCfg}></VftIcon> : null}\n </span>\n ) : null;\n\n const tabLabelContent = pane.slots.label?.() || pane.props.label;\n const tabindex = !disabled && pane.active ? 0 : -1;\n\n return (\n <div\n ref={`tab-${uid}`}\n class={[\n ns.e('item'),\n ns.is(rootTabs.props.tabPosition!),\n ns.is('active', pane.active),\n ns.is('disabled', disabled),\n ns.is('closable', closable),\n ns.is('focus', isFocus.value)\n ]}\n id={`tab-${tabName}`}\n key={`tab-${uid}`}\n aria-controls={`pane-${tabName}`}\n role=\"tab\"\n aria-selected={pane.active}\n tabindex={tabindex}\n onFocus={() => setFocus()}\n onBlur={() => removeFocus()}\n onClick={(ev: MouseEvent) => {\n removeFocus();\n emit('tabClick', pane, tabName, ev);\n }}\n onContextmenu={(event) => {\n event.preventDefault();\n emit('tabContextmenu', { pane, index, event });\n }}\n onKeydown={(ev: KeyboardEvent) => {\n if (\n closable &&\n (ev.code === EVENT_CODE.delete ||\n ev.code === EVENT_CODE.backspace)\n ) {\n emit('tabRemove', pane, ev);\n }\n }}\n >\n {...[tabLabelContent, btnClose]}\n </div>\n );\n });\n});\n\n// 增加 tab 的 dom\nconst newButton =\n __props.editable || __props.addable ? (\n <span\n class={ns.e('new-tab')}\n tabindex=\"0\"\n onClick={() => emit('tabAdd')}\n onKeydown={(ev: KeyboardEvent) => {\n if (ev.code === EVENT_CODE.enter) emit('tabAdd');\n }}\n >\n {__props.addIconCfg?.icon ? <VftIcon {...__props.addIconCfg}></VftIcon> : null}\n </span>\n ) : null;\n\ndefineRender(() => {\n return (\n <div\n ref={el$}\n class={[\n ns.e('nav-wrap'),\n ns.is('scrollable', !!scrollable.value),\n ns.is(rootTabs.props.tabPosition!)\n ]}\n >\n {scrollBtn.value}\n <div class={ns.e('nav-scroll')} ref={navScroll$}>\n <div\n class={[\n ns.e('nav'),\n ns.is(rootTabs.props.tabPosition!),\n ns.is(\n 'stretch',\n __props.stretch &&\n ['top', 'bottom'].includes(rootTabs.props.tabPosition!)\n )\n ]}\n ref={nav$}\n style={navStyle.value}\n role=\"tablist\"\n onKeydown={changeTab}\n >\n {...[\n !__props.type ? <TabBar tabs={[...__props.panes]} /> : null,\n tabs.value\n ]}\n </div>\n {newButton}\n </div>\n </div>\n );\n});\n</script>\n"],"names":["ns_nav","useNamespace","__default__","DO_defineComponent","name","b","vm","getCurrentInstance","rootTabs","inject","TabsRootContextKey","throwError","ns","visibility","useDocumentVisibility","focused","useWindowFocus","el$","ref","navScroll$","nav$","scrollable","navOffset","isFocus","focusable","sizeName","computed","includes","props","tabPosition","navStyle","transform","value","scrollPrev","containerSize","capitalize","currentOffset","scrollNext","navSize","scrollToActiveTab","nav","nextTick","activeTab","querySelector","navScroll","isHorizontal","activeTabBounding","getBoundingClientRect","navScrollBounding","maxOffset","offsetWidth","width","offsetHeight","height","newOffset","left","right","top","bottom","Math","max","min","update","prev","next","changeTab","e","code","up","down","EVENT_CODE","tabList","Array","from","currentTarget","querySelectorAll","currentIndex","indexOf","target","nextIndex","length","focus","click","setFocus","removeFocus","watch","setTimeout","useResizeObserver","onMounted","onUpdated","expose","__props","panes","flush","scrollBtn","_createVNode","is","arrowLeftIconCfg","icon","VftIcon","arrowRightIconCfg","tabs","map","pane","index","uid","disabled","tabName","closable","isClosable","editable","btnClose","ev","emit","closeIconCfg","tabLabelContent","slots","label","tabindex","active","onFocus","onBlur","event","preventDefault","delete","backspace","newButton","addable","onClick","enter","addIconCfg","stretch","type","TabBar"],"mappings":";;;;;;;;;;;;;;;;AACA,MAAMA;AAAAA;AAAAA,EAA2BC,EAAa,SAAS;AAAA,GAGvDC,KAA6BC,EAAmB;AAAA,EAC/CC,MAAMJ,EAAOK,EAAC;AACf,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AAyDD,UAAMC,IAAKC,KAGLC,IAAWC,EAAOC,EAAkB;AAC1C,IAAKF,KAAUG,GAAWX,EAAOK,KAAM,kCAAiC;AAExE,UAAMO,IAAKX,EAAa,MAAM,GACxBY,IAAaC,MACbC,IAAUC,MAGVC,IAAMC,KAENC,IAAaD,KAEbE,IAAOF,KAGPG,IAAaH,EAAwB,EAAK,GAE1CI,IAAYJ,EAAI,CAAC,GACjBK,IAAUL,EAAI,EAAK,GACnBM,IAAYN,EAAI,EAAI,GAGpBO,IAAWC,EAAS,MAAM,CAAC,OAAO,QAAQ,EAAEC,SAASnB,EAASoB,MAAMC,WAAW,IAAK,UAAU,QAAQ,GAGtGC,IAAWJ,EAAwB,OAEhC;AAAA,MACLK,WAAY,YAFFN,EAASO,UAAU,UAAU,MAAM,QAEdV,EAAUU;AAAAA,MAE5C,GAGKC,IAAaA,MAAM;AACvB,UAAI,CAACd,EAAWa;AAAO;AACvB,YAAME,IACJf,EAAWa,MAAO,SAAQG,EAAWV,EAASO,KAAK,GAAG,GAClDI,IAAgBd,EAAUU;AAEhC,MAAKI,MAELd,EAAUU,QAAQI,IAAgBF,IAAgBE,IAAgBF,IAAgB;AAAA,OAI9EG,IAAaA,MAAM;AACvB,UAAI,CAAClB,EAAWa,SAAS,CAACZ,EAAKY;AAAO;AAEtC,YAAMM,IAAUlB,EAAKY,MAAO,SAAQG,EAAWV,EAASO,KAAK,GAAG,GAC1DE,IACJf,EAAWa,MAAO,SAAQG,EAAWV,EAASO,KAAK,GAAG,GAClDI,IAAgBd,EAAUU;AAEhC,MAAIM,IAAUF,KAAiBF,MAE/BZ,EAAUU,QAAQM,IAAUF,IAAgBF,IAAgB,IACxDE,IAAgBF,IAChBI,IAAUJ;AAAAA,OAIVK,IAAoB,YAAW;AACnC,YAAMC,IAAMpB,EAAKY;AACjB,UAAI,CAACX,EAAWW,SAAS,CAACf,EAAIe,SAAS,CAACb,EAAWa,SAAS,CAACQ;AAAK;AAElE,YAAMC,GAAQ;AAEd,YAAMC,IAAYzB,EAAIe,MAAMW,cAAc,YAAY;AACtD,UAAI,CAACD;AAAW;AAEhB,YAAME,IAAYzB,EAAWa,OACvBa,IAAe,CAAC,OAAO,QAAQ,EAAElB,SACrCnB,EAASoB,MAAMC,WAAW,GAEtBiB,IAAoBJ,EAAUK,yBAE9BC,IAAoBJ,EAAUG,yBAC9BE,IAAYJ,IACdL,EAAIU,cAAcF,EAAkBG,QACpCX,EAAIY,eAAeJ,EAAkBK,QAEnCjB,IAAgBd,EAAUU;AAEhC,UAAIsB,IAAYlB;AAEhB,MAAIS,KACEC,EAAkBS,OAAOP,EAAkBO,SAC7CD,IACElB,KAAiBY,EAAkBO,OAAOT,EAAkBS,QAE5DT,EAAkBU,QAAQR,EAAkBQ,UAC9CF,IACElB,IAAgBU,EAAkBU,QAAQR,EAAkBQ,WAG5DV,EAAkBW,MAAMT,EAAkBS,QAC5CH,IACElB,KAAiBY,EAAkBS,MAAMX,EAAkBW,OAE3DX,EAAkBY,SAASV,EAAkBU,WAC/CJ,IACElB,KACCU,EAAkBY,SAASV,EAAkBU,WAGpDJ,IAAYK,KAAKC,IAAIN,GAAW,CAAC,GACjChC,EAAUU,QAAQ2B,KAAKE,IAAIP,GAAWL,CAAS;AAAA,OAG3Ca,IAASA,MAAM;AACnB,UAAI,CAAC1C,EAAKY,SAAS,CAACb,EAAWa;AAAO;AAEtC,YAAMM,IAAUlB,EAAKY,MAAO,SAAQG,EAAWV,EAASO,KAAK,GAAG,GAE1DE,IAAgBf,EAAWa,MAAO,SAAQG,EAAWV,EAASO,KAAK,GAAG,GAEtEI,IAAgBd,EAAUU;AAEhC,MAAIE,IAAgBI,KAClBjB,EAAWW,QAAQX,EAAWW,SAAS,CAAA,GACvCX,EAAWW,MAAM+B,OAAO3B,GACxBf,EAAWW,MAAMgC,OAAO5B,IAAgBF,IAAgBI,GACpDA,IAAUF,IAAgBF,MAC5BZ,EAAUU,QAAQM,IAAUJ,OAG9Bb,EAAWW,QAAQ,IACfI,IAAgB,MAClBd,EAAUU,QAAQ;AAAA,OAKlBiC,IAAaC,CAAAA,MAAqB;AACtC,YAAMC,IAAOD,EAAEC,MAET;AAAA,QAAEC,IAAAA;AAAAA,QAAIC,MAAAA;AAAAA,QAAMd,MAAAA;AAAAA,QAAMC,OAAAA;AAAAA,MAAO,IAAGc;AAClC,UAAI,CAAC,CAACF,GAAIC,GAAMd,GAAMC,CAAK,EAAE7B,SAASwC,CAAI;AAAG;AAG7C,YAAMI,IAAUC,MAAMC,KACnBP,EAAEQ,cAAiCC,iBAClC,8BAA8B,CAC/B,GAEGC,IAAeL,EAAQM,QAAQX,EAAEY,MAAM;AAE7C,UAAIC;AACJ,MAAIZ,MAASZ,KAAQY,MAASC,IAExBQ,MAAiB,IAEnBG,IAAYR,EAAQS,SAAS,IAE7BD,IAAYH,IAAe,IAIzBA,IAAeL,EAAQS,SAAS,IAElCD,IAAYH,IAAe,IAE3BG,IAAY,GAGhBR,EAAQQ,CAAS,EAAEE,SACnBV,EAAQQ,CAAS,EAAEG,SACnBC;OAGIA,IAAWA,MAAM;AACrB,MAAI3D,EAAUQ,UAAOT,EAAQS,QAAQ;AAAA,OAEjCoD,IAAcA,MAAO7D,EAAQS,QAAQ;AAE3CqD,IAAAA,EAAMxE,GAAaA,CAAAA,MAAe;AAChC,MAAIA,MAAe,WACjBW,EAAUQ,QAAQ,KACTnB,MAAe,aACxByE,WAAW,MAAO9D,EAAUQ,QAAQ,IAAO,EAAE;AAAA,IAEjD,CAAC,GAEDqD,EAAMtE,GAAUA,CAAAA,MAAY;AAC1B,MAAIA,IACFuE,WAAW,MAAO9D,EAAUQ,QAAQ,IAAO,EAAE,IAE7CR,EAAUQ,QAAQ;AAAA,IAEtB,CAAC,GAGDuD,GAAkBtE,GAAK6C,CAAM,GAE7B0B,GAAU,MAAMF,WAAW,MAAM/C,EAAiB,GAAI,CAAC,CAAC,GACxDkD,GAAU,MAAM3B,EAAM,CAAE,GAExB4B,EAAa;AAAA,MACXnD,mBAAAA;AAAAA,MACA6C,aAAAA;AAAAA,IACF,CAAC,GAEDC,EACE,MAAMM,EAAQC,OACd,MAAMtF,EAAGwD,OAAM,GACf;AAAA,MAAE+B,OAAO;AAAA,IAAO,CAAC;AAInB,UAAMC,IAAYpE,EAAS,MAAM;;AAC/B,aAAOL,EAAWW,QACd,CAAA+D,EAAA,QAAA;AAAA,QAAA,OAES,CACLnF,EAAGsD,EAAE,UAAU,GACftD,EAAGoF,GAAG,YAAY,CAAC3E,EAAWW,MAAM+B,IAAI,CAAC;AAAA,QAC1C,SACQ9B;AAAAA,MAAU,GAAA,EAElB0D,IAAAA,EAAQM,qBAARN,QAAAA,EAA0BO,OAAIH,EAAAI,GAAgBR,EAAQM,kBAA+B,IAAA,IAAA,IAAI,IAAAF,EAAA,QAAA;AAAA,QAAA,OAGnF,CACLnF,EAAGsD,EAAE,UAAU,GACftD,EAAGoF,GAAG,YAAY,CAAC3E,EAAWW,MAAMgC,IAAI,CAAC;AAAA,QAC1C,SACQ3B;AAAAA,MAAU,GAAA,EAEjBsD,IAAAA,EAAQS,sBAART,QAAAA,EAA2BO,OAAIH,EAAAI,GAAgBR,EAAQS,2BAAgC,IAAI,CAAA,CAAA,IAG/F;AAAA,IACN,CAAC,GAGKC,IAAO3E,EAAS,MAAM;;AAC1B,cAAOiE,IAAAA,EAAQC,UAARD,gBAAAA,EAAeW,IAAI,CAACC,GAAMC,MAAU;;AACzC,cAAMC,IAAMF,EAAKE,KACXC,IAAWH,EAAK3E,MAAM8E,UACtBC,IAAUJ,EAAK3E,MAAMxB,QAAQmG,EAAKC,SAAU,GAAEA,KAC9CI,IAAW,CAACF,MAAaH,EAAKM,cAAclB,EAAQmB;AAC1DP,QAAAA,EAAKC,QAAS,GAAEA;AAGhB,cAAMO,IAAWH,IAAQb,EAAA,QAAA;AAAA,UAAA,OACX;AAAA,UAAe,SAAWiB,CAAAA,MAAmBC,EAAK,aAAaV,GAAMS,CAAE;AAAA,QAAC,GAAA,EACjFrB,IAAAA,EAAQuB,iBAARvB,QAAAA,EAAsBO,OAAIH,EAAAI,GAAgBR,EAAQuB,cAA2B,IAAA,IAAA,IAAI,KAElF,MAEEC,MAAkBZ,KAAAA,IAAAA,EAAKa,OAAMC,UAAXd,gBAAAA,EAAAA,KAAAA,OAAwBA,EAAK3E,MAAMyF,OACrDC,IAAW,CAACZ,KAAYH,EAAKgB,SAAS,IAAI;AAEhD,eAAAxB,EAAA,OAAA;AAAA,UAAA,KAEU,OAAMU;AAAAA,UAAK,OACV,CACL7F,EAAGsD,EAAE,MAAM,GACXtD,EAAGoF,GAAGxF,EAASoB,MAAMC,WAAW,GAChCjB,EAAGoF,GAAG,UAAUO,EAAKgB,MAAM,GAC3B3G,EAAGoF,GAAG,YAAYU,CAAQ,GAC1B9F,EAAGoF,GAAG,YAAYY,CAAQ,GAC1BhG,EAAGoF,GAAG,SAASzE,EAAQS,KAAK,CAAC;AAAA,UAC9B,IACI,OAAM2E;AAAAA,UAAS,KACd,OAAMF;AAAAA,UAAK,iBACD,QAAOE;AAAAA,UAAS,MAC3B;AAAA,UAAK,iBACKJ,EAAKgB;AAAAA,UAAM,UAChBD;AAAAA,UAAQ,SACTE,MAAMrC,EAAU;AAAA,UAAA,QACjBsC,MAAMrC,EAAa;AAAA,UAAA,SACjB4B,CAAAA,MAAmB;AAC3B5B,YAAAA,KACA6B,EAAK,YAAYV,GAAMI,GAASK,CAAE;AAAA,UACnC;AAAA,UAAA,eACeU,CAAAA,MAAU;AACxBA,YAAAA,EAAMC,eAAc,GACpBV,EAAK,kBAAkB;AAAA,cAAEV,MAAAA;AAAAA,cAAMC,OAAAA;AAAAA,cAAOkB,OAAAA;AAAAA,YAAM,CAAC;AAAA,UAC9C;AAAA,UAAA,WACWV,CAAAA,MAAsB;AAChC,YACEJ,MACCI,EAAG7C,SAASG,EAAWsD,UACtBZ,EAAG7C,SAASG,EAAWuD,cAEzBZ,EAAK,aAAaV,GAAMS,CAAE;AAAA,UAE9B;AAAA,QAAC,GAAA,CAEIG,GAAiBJ,CAAS,CAAA;AAAA,MAGrC;AAAA,IACF,CAAC,GAGKe,IACJnC,EAAQmB,YAAYnB,EAAQoC,UAAOhC,EAAA,QAAA;AAAA,MAAA,OAExBnF,EAAGsD,EAAE,SAAS;AAAA,MAAC,UACb;AAAA,MAAG,SACH8D,MAAMf,EAAK,QAAQ;AAAA,MAAC,WACjBD,CAAAA,MAAsB;AAChC,QAAIA,EAAG7C,SAASG,EAAW2D,SAAOhB,EAAK,QAAQ;AAAA,MACjD;AAAA,IAAC,GAAA,EAEAtB,IAAAA,EAAQuC,eAARvC,QAAAA,EAAoBO,OAAIH,EAAAI,GAAgBR,EAAQuC,YAAyB,IAAA,IAAA,IAAI,KAE9E;AAEO,WAAA,MACXnC,EAAA,OAAA;AAAA,MAAA,KAES9E;AAAAA,MAAG,OACD,CACLL,EAAGsD,EAAE,UAAU,GACftD,EAAGoF,GAAG,cAAc,CAAC,CAAC3E,EAAWW,KAAK,GACtCpB,EAAGoF,GAAGxF,EAASoB,MAAMC,WAAW,CAAE;AAAA,IACnC,GAAA,CAEAiE,EAAU9D,OAAK+D,EAAA,OAAA;AAAA,MAAA,OACJnF,EAAGsD,EAAE,YAAY;AAAA,MAAC,KAAO/C;AAAAA,IAAU,GAAA,CAAA4E,EAAA,OAAA;AAAA,MAAA,OAEpC,CACLnF,EAAGsD,EAAE,KAAK,GACVtD,EAAGoF,GAAGxF,EAASoB,MAAMC,WAAW,GAChCjB,EAAGoF,GACD,WACAL,EAAQwC,WACR,CAAC,OAAO,QAAQ,EAAExG,SAASnB,EAASoB,MAAMC,WAAW,CAAE,CACxD;AAAA,MACF,KACIT;AAAAA,MAAI,OACFU,EAASE;AAAAA,MAAK,MAChB;AAAA,MAAS,WACHiC;AAAAA,OAEP,CACD0B,EAAQyC,OAA8C,OAA1CrC,EAAAsC,IAAA;AAAA,MAAA,MAAiB,CAAC,GAAG1C,EAAQC,KAAK;AAAA,IAAC,GAAA,IAAA,GAChDS,EAAKrE,KACN,IAEF8F,CAAS,CAAA,CAAA,CAAA;AAAA;;"}
@@ -1,16 +1,16 @@
1
- import { defineComponent as p, getCurrentInstance as h, useSlots as C, inject as B, ref as u, computed as d, watch as g, reactive as N, onMounted as k, onUnmounted as w, unref as t, withDirectives as x, openBlock as z, createElementBlock as R, normalizeClass as S, renderSlot as _, vShow as $, createCommentVNode as P } from "vue";
1
+ import { defineComponent as b, getCurrentInstance as y, useSlots as C, inject as B, ref as d, computed as m, watch as g, reactive as w, onMounted as N, onUnmounted as k, unref as t, withDirectives as x, openBlock as z, createElementBlock as R, normalizeClass as S, renderSlot as _, vShow as $, createCommentVNode as E } from "vue";
2
+ import "@vue/shared";
3
+ import { throwError as P } from "../../utils/error.mjs";
2
4
  import { TabsRootContextKey as j } from "./types.mjs";
3
5
  import { useNamespace as D } from "../../hooks/use-namespace/index.mjs";
4
- import "@vue/shared";
5
- import "@vft/utils";
6
- import { eagerComputed as m } from "@vueuse/core";
7
- const E = ["id", "aria-hidden", "aria-labelledby"], b = (
6
+ import { eagerComputed as p } from "@vueuse/core";
7
+ const I = ["id", "aria-hidden", "aria-labelledby"], i = (
8
8
  /* hoist-static*/
9
9
  D("tab-pane")
10
- ), I = p({
11
- name: b.b()
12
- }), F = /* @__PURE__ */ p({
13
- ...I,
10
+ ), K = b({
11
+ name: i.b()
12
+ }), G = /* @__PURE__ */ b({
13
+ ...K,
14
14
  props: {
15
15
  label: null,
16
16
  name: null,
@@ -18,40 +18,42 @@ const E = ["id", "aria-hidden", "aria-labelledby"], b = (
18
18
  disabled: { type: Boolean },
19
19
  lazy: { type: Boolean }
20
20
  },
21
- setup(a) {
22
- const n = h(), v = C(), o = B(j), l = u(), f = d(() => a.closable || o.props.closable), e = m(() => o.currentName.value === (a.name ?? l.value)), c = u(e.value), r = d(() => a.name ?? l.value), y = m(() => !a.lazy || c.value || e.value);
21
+ setup(o) {
22
+ const n = y(), v = C(), a = B(j);
23
+ a || P(i.b(), "usage: <vri-tabs><vri-tab-pane /></vri-tabs/>");
24
+ const r = d(), f = m(() => o.closable || a.props.closable), e = p(() => a.currentName.value === (o.name ?? r.value)), c = d(e.value), l = m(() => o.name ?? r.value), h = p(() => !o.lazy || c.value || e.value);
23
25
  g(e, (s) => {
24
26
  s && (c.value = !0);
25
27
  });
26
- const i = N({
28
+ const u = w({
27
29
  uid: n.uid,
28
30
  slots: v,
29
31
  props: n.props,
30
- paneName: r,
32
+ paneName: l,
31
33
  active: e,
32
- index: l,
34
+ index: r,
33
35
  isClosable: f,
34
36
  attrs: n.attrs
35
37
  });
36
- return k(() => {
37
- o.registerPane(i);
38
- }), w(() => {
39
- o.unregisterPane(i.uid);
40
- }), (s, K) => t(y) ? x((z(), R("div", {
38
+ return N(() => {
39
+ a.registerPane(u);
40
+ }), k(() => {
41
+ a.unregisterPane(u.uid);
42
+ }), (s, M) => t(h) ? x((z(), R("div", {
41
43
  key: 0,
42
- id: `pane-${t(r)}`,
43
- class: S(t(b).b()),
44
+ id: `pane-${t(l)}`,
45
+ class: S(t(i).b()),
44
46
  role: "tabpanel",
45
47
  "aria-hidden": !t(e),
46
- "aria-labelledby": `tab-${t(r)}`
48
+ "aria-labelledby": `tab-${t(l)}`
47
49
  }, [
48
50
  _(s.$slots, "default")
49
- ], 10, E)), [
51
+ ], 10, I)), [
50
52
  [$, t(e)]
51
- ]) : P("", !0);
53
+ ]) : E("", !0);
52
54
  }
53
55
  });
54
56
  export {
55
- F as default
57
+ G as default
56
58
  };
57
59
  //# sourceMappingURL=tab-pane.vue2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tab-pane.vue2.mjs","sources":["../../../../../packages/components/tabs/tab-pane.vue"],"sourcesContent":["<script lang=\"ts\">\nconst ns = /* hoist-static*/ useNamespace('tab-pane')\n\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({\n name: ns.b()\n});</script>\n<script lang=\"ts\" setup>\nimport { type TabsPaneContext, TabsRootContextKey } from './types';\nimport { useNamespace } from '@vft-ui/hooks';\nimport {\n computed,\n getCurrentInstance,\n inject,\n onMounted,\n onUnmounted,\n reactive,\n ref,\n useSlots,\n watch\n} from 'vue';\nimport { eagerComputed } from '@vueuse/core';\n\ninterface TabPaneProps {\n /** 选项卡标题 */\n label?: string;\n /** 与选项卡绑定值 value 对应的标识符,表示选项卡别名 */\n name?: Numberish;\n /** 标签是否可关闭 */\n closable?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 标签是否延迟渲染 */\n lazy?: boolean;\n}\n\ndefineProps({\n \"label\": null,\n \"name\": null,\n \"closable\": { type: Boolean, },\n \"disabled\": { type: Boolean, },\n \"lazy\": { type: Boolean, }\n})\n\nconst vm = getCurrentInstance()!;\n\nconst slots = useSlots();\n\nconst tabsRoot = inject(TabsRootContextKey)!;\n\n\n\n;\n\nconst index = ref<string>();\n// 可关闭\nconst isClosable = computed(() => __props.closable || tabsRoot.props.closable);\n// 激活\nconst active = eagerComputed(() => {\n return tabsRoot.currentName.value === (__props.name ?? index.value);\n});\n\nconst loaded = ref(active.value);\n\nconst paneName = computed(() => __props.name ?? index.value);\n\nconst shouldBeRender = eagerComputed(() => {\n return !__props.lazy || loaded.value || active.value;\n});\n\nwatch(active, (val) => {\n if (val) loaded.value = true;\n});\n\nconst pane = reactive({\n uid: vm.uid,\n slots,\n props: vm.props as unknown as TabPaneProps,\n paneName,\n active,\n index,\n isClosable,\n attrs: vm.attrs\n});\n\n\nonMounted(() => {\n tabsRoot.registerPane(pane as TabsPaneContext);\n});\n\nonUnmounted(() => {\n tabsRoot.unregisterPane(pane.uid);\n});\n</script>\n\n<template>\n <div v-if=\"shouldBeRender\" v-show=\"active\" :id=\"`pane-${paneName}`\" :class=\"ns.b()\"\n role=\"tabpanel\" :aria-hidden=\"!active\" :aria-labelledby=\"`tab-${paneName}`\">\n <slot />\n </div>\n</template>\n"],"names":["ns","useNamespace","__default__","DO_defineComponent","vm","getCurrentInstance","slots","useSlots","tabsRoot","inject","TabsRootContextKey","index","ref","isClosable","computed","__props","active","eagerComputed","loaded","paneName","shouldBeRender","watch","val","pane","reactive","onMounted","onUnmounted"],"mappings":";;;;;;oDACMA;AAAA;AAAA,EAAuBC,EAAa,UAAU;AAAA,GAGpDC,IAA6BC,EAAmB;AAAA,EAC9C,MAAMH,EAAG,EAAE;AACb,CAAC;;;;;;;;;;AAsCD,UAAMI,IAAKC,KAELC,IAAQC,KAERC,IAAWC,EAAOC,CAAkB,GAMpCC,IAAQC,KAERC,IAAaC,EAAS,MAAMC,EAAQ,YAAYP,EAAS,MAAM,QAAQ,GAEvEQ,IAASC,EAAc,MACpBT,EAAS,YAAY,WAAWO,EAAQ,QAAQJ,EAAM,MAC9D,GAEKO,IAASN,EAAII,EAAO,KAAK,GAEzBG,IAAWL,EAAS,MAAMC,EAAQ,QAAQJ,EAAM,KAAK,GAErDS,IAAiBH,EAAc,MAC5B,CAACF,EAAQ,QAAQG,EAAO,SAASF,EAAO,KAChD;AAEK,IAAAK,EAAAL,GAAQ,CAACM,MAAQ;AACjB,MAAAA,MAAKJ,EAAO,QAAQ;AAAA,IAAA,CACzB;AAED,UAAMK,IAAOC,EAAS;AAAA,MACpB,KAAKpB,EAAG;AAAA,MACR,OAAAE;AAAA,MACA,OAAOF,EAAG;AAAA,MACV,UAAAe;AAAA,MACA,QAAAH;AAAA,MACA,OAAAL;AAAA,MACA,YAAAE;AAAA,MACA,OAAOT,EAAG;AAAA,IAAA,CACX;AAGD,WAAAqB,EAAU,MAAM;AACd,MAAAjB,EAAS,aAAae,CAAuB;AAAA,IAAA,CAC9C,GAEDG,EAAY,MAAM;AACP,MAAAlB,EAAA,eAAee,EAAK,GAAG;AAAA,IAAA,CACjC;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"tab-pane.vue2.mjs","sources":["../../../../../packages/components/tabs/tab-pane.vue"],"sourcesContent":["<script lang=\"ts\">\nconst ns = /* hoist-static*/ useNamespace('tab-pane')\n\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({\n name: ns.b()\n});</script>\n<script lang=\"ts\" setup>\nimport { throwError } from '@vft-ui/utils';\nimport { type TabsPaneContext, TabsRootContextKey } from './types';\nimport { useNamespace } from '@vft-ui/hooks';\nimport {\n computed,\n getCurrentInstance,\n inject,\n onMounted,\n onUnmounted,\n reactive,\n ref,\n useSlots,\n watch\n} from 'vue';\nimport { eagerComputed } from '@vueuse/core';\n\ninterface TabPaneProps {\n /** 选项卡标题 */\n label?: string;\n /** 与选项卡绑定值 value 对应的标识符,表示选项卡别名 */\n name?: Numberish;\n /** 标签是否可关闭 */\n closable?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 标签是否延迟渲染 */\n lazy?: boolean;\n}\n\ndefineProps({\n \"label\": null,\n \"name\": null,\n \"closable\": { type: Boolean, },\n \"disabled\": { type: Boolean, },\n \"lazy\": { type: Boolean, }\n})\n\n\n\n;\n\nconst vm = getCurrentInstance()!;\n\nconst slots = useSlots();\n\nconst tabsRoot = inject(TabsRootContextKey)!;\n\nif (!tabsRoot)\n\tthrowError(ns.b(), 'usage: <vri-tabs><vri-tab-pane /></vri-tabs/>')\n\nconst index = ref<string>();\n// 可关闭\nconst isClosable = computed(() => __props.closable || tabsRoot.props.closable);\n// 激活\nconst active = eagerComputed(() => {\n return tabsRoot.currentName.value === (__props.name ?? index.value);\n});\n\nconst loaded = ref(active.value);\n\nconst paneName = computed(() => __props.name ?? index.value);\n\nconst shouldBeRender = eagerComputed(() => {\n return !__props.lazy || loaded.value || active.value;\n});\n\nwatch(active, (val) => {\n if (val) loaded.value = true;\n});\n\nconst pane = reactive({\n uid: vm.uid,\n slots,\n props: vm.props as unknown as TabPaneProps,\n paneName,\n active,\n index,\n isClosable,\n attrs: vm.attrs\n});\n\n\nonMounted(() => {\n tabsRoot.registerPane(pane as TabsPaneContext);\n});\n\nonUnmounted(() => {\n tabsRoot.unregisterPane(pane.uid);\n});\n</script>\n\n<template>\n <div v-if=\"shouldBeRender\" v-show=\"active\" :id=\"`pane-${paneName}`\" :class=\"ns.b()\"\n role=\"tabpanel\" :aria-hidden=\"!active\" :aria-labelledby=\"`tab-${paneName}`\">\n <slot />\n </div>\n</template>\n"],"names":["ns","useNamespace","__default__","DO_defineComponent","vm","getCurrentInstance","slots","useSlots","tabsRoot","inject","TabsRootContextKey","throwError","index","ref","isClosable","computed","__props","active","eagerComputed","loaded","paneName","shouldBeRender","watch","val","pane","reactive","onMounted","onUnmounted"],"mappings":";;;;;;oDACMA;AAAA;AAAA,EAAuBC,EAAa,UAAU;AAAA,GAGpDC,IAA6BC,EAAmB;AAAA,EAC9C,MAAMH,EAAG,EAAE;AACb,CAAC;;;;;;;;;;AA2CD,UAAMI,IAAKC,KAELC,IAAQC,KAERC,IAAWC,EAAOC,CAAkB;AAE1C,IAAKF,KACOG,EAAAX,EAAG,EAAE,GAAG,+CAA+C;AAEnE,UAAMY,IAAQC,KAERC,IAAaC,EAAS,MAAMC,EAAQ,YAAYR,EAAS,MAAM,QAAQ,GAEvES,IAASC,EAAc,MACpBV,EAAS,YAAY,WAAWQ,EAAQ,QAAQJ,EAAM,MAC9D,GAEKO,IAASN,EAAII,EAAO,KAAK,GAEzBG,IAAWL,EAAS,MAAMC,EAAQ,QAAQJ,EAAM,KAAK,GAErDS,IAAiBH,EAAc,MAC5B,CAACF,EAAQ,QAAQG,EAAO,SAASF,EAAO,KAChD;AAEK,IAAAK,EAAAL,GAAQ,CAACM,MAAQ;AACjB,MAAAA,MAAKJ,EAAO,QAAQ;AAAA,IAAA,CACzB;AAED,UAAMK,IAAOC,EAAS;AAAA,MACpB,KAAKrB,EAAG;AAAA,MACR,OAAAE;AAAA,MACA,OAAOF,EAAG;AAAA,MACV,UAAAgB;AAAA,MACA,QAAAH;AAAA,MACA,OAAAL;AAAA,MACA,YAAAE;AAAA,MACA,OAAOV,EAAG;AAAA,IAAA,CACX;AAGD,WAAAsB,EAAU,MAAM;AACd,MAAAlB,EAAS,aAAagB,CAAuB;AAAA,IAAA,CAC9C,GAEDG,EAAY,MAAM;AACP,MAAAnB,EAAA,eAAegB,EAAK,GAAG;AAAA,IAAA,CACjC;;;;;;;;;;;;;;"}
@@ -89,7 +89,7 @@ const r = (
89
89
  children: P,
90
90
  addChild: k,
91
91
  removeChild: A
92
- } = U(g(), "vri-tab-pane");
92
+ } = U(g(), "vft-tab-pane");
93
93
  F(S, {
94
94
  props: T.props,
95
95
  currentName: c,