vue-clean-tabs 1.0.0

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/README.md ADDED
@@ -0,0 +1,450 @@
1
+ # Vue Simple Tabs
2
+
3
+ 🚀 一个轻量级、高度可配置的 Vue 3 简洁标签页组件,专注于简洁设计和灵活定制。
4
+
5
+ ## ✨ 特性
6
+
7
+ - 🪶 **轻量级设计** - 极简的 API 和最小的包体积
8
+ - 🎨 **高度可定制** - 丰富的样式配置和主题选项
9
+ - 📱 **响应式支持** - 完美适配移动端和桌面端
10
+ - 🎯 **多种指示器** - 线条、下划线、圆点、药丸等样式
11
+ - 🔧 **灵活配置** - 尺寸、动画、布局等全面配置
12
+ - ⚡ **TypeScript 支持** - 完整的类型定义
13
+ - 🎪 **丰富功能** - 图标、禁用、滚动、居中等功能
14
+ - 🎭 **无障碍访问** - 支持键盘导航和屏幕阅读器
15
+
16
+ ## 📦 安装
17
+
18
+ ```bash
19
+ npm install vue-simple-tabs
20
+ ```
21
+
22
+ ## 🚀 快速开始
23
+
24
+ ### 基本使用
25
+
26
+ ```vue
27
+ <template>
28
+ <ConfigurableSimpleTabs
29
+ :tabs="tabs"
30
+ defaultActive="home"
31
+ @tab-change="handleTabChange"
32
+ />
33
+ </template>
34
+
35
+ <script setup>
36
+ import { ConfigurableSimpleTabs } from 'vue-simple-tabs';
37
+
38
+ const tabs = [
39
+ { id: 'home', name: '首页' },
40
+ { id: 'about', name: '关于' },
41
+ { id: 'contact', name: '联系' },
42
+ ];
43
+
44
+ const handleTabChange = (tabId, tab) => {
45
+ console.log('切换到:', tab.name);
46
+ };
47
+ </script>
48
+ ```
49
+
50
+ ### 带图标的标签页
51
+
52
+ ```vue
53
+ <template>
54
+ <ConfigurableSimpleTabs :tabs="iconTabs" />
55
+ </template>
56
+
57
+ <script setup>
58
+ const iconTabs = [
59
+ {
60
+ id: 'home',
61
+ name: '首页',
62
+ icon: '<svg>...</svg>' // SVG 图标
63
+ },
64
+ {
65
+ id: 'user',
66
+ name: '用户',
67
+ icon: '<svg>...</svg>'
68
+ },
69
+ ];
70
+ </script>
71
+ ```
72
+
73
+ ### 自定义主题
74
+
75
+ ```vue
76
+ <template>
77
+ <ConfigurableSimpleTabs
78
+ :tabs="tabs"
79
+ :theme="customTheme"
80
+ size="large"
81
+ />
82
+ </template>
83
+
84
+ <script setup>
85
+ const customTheme = {
86
+ activeTextColor: '#3b82f6',
87
+ indicatorColor: '#3b82f6',
88
+ backgroundColor: '#f8fafc',
89
+ };
90
+ </script>
91
+ ```
92
+
93
+ ## 📚 API 文档
94
+
95
+ ### Props
96
+
97
+ #### 必需属性
98
+
99
+ | 属性 | 类型 | 描述 |
100
+ | ------ | ----------- | ---------- |
101
+ | `tabs` | `TabItem[]` | 标签页数组 |
102
+
103
+ #### 可选属性
104
+
105
+ | 属性 | 类型 | 默认值 | 描述 |
106
+ | --------------- | --------------------------- | ------------ | ---------------- |
107
+ | `defaultActive` | `string` | 第一个标签 | 默认激活的标签ID |
108
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | 组件尺寸 |
109
+ | `theme` | `Partial<SimpleTabsTheme>` | `defaultTheme` | 主题配置 |
110
+ | `style` | `Partial<StyleConfig>` | `默认样式` | 样式配置 |
111
+ | `animation` | `Partial<AnimationConfig>` | `默认动画` | 动画配置 |
112
+ | `responsive` | `Partial<ResponsiveConfig>` | `默认响应式` | 响应式配置 |
113
+ | `className` | `string` | `undefined` | 自定义类名 |
114
+ | `customStyle` | `Record<string, any>` | `undefined` | 自定义样式 |
115
+ | `block` | `boolean` | `false` | 块级显示 |
116
+ | `centered` | `boolean` | `false` | 居中对齐 |
117
+ | `scrollable` | `boolean` | `false` | 可滚动 |
118
+
119
+ ### 类型定义
120
+
121
+ #### TabItem
122
+
123
+ ```typescript
124
+ interface TabItem {
125
+ id: string; // 唯一标识符
126
+ name: string; // 显示名称
127
+ disabled?: boolean; // 是否禁用
128
+ route?: string; // 路由地址
129
+ icon?: string; // 图标 HTML (SVG)
130
+ }
131
+ ```
132
+
133
+ #### SimpleTabsTheme
134
+
135
+ ```typescript
136
+ interface SimpleTabsTheme {
137
+ activeTextColor: string; // 激活文字颜色
138
+ inactiveTextColor: string; // 非激活文字颜色
139
+ hoverTextColor: string; // 悬浮文字颜色
140
+ backgroundColor: string; // 背景色
141
+ indicatorColor: string; // 指示器颜色
142
+ fontFamily: string; // 字体系列
143
+ borderColor?: string; // 边框颜色
144
+ boxShadow?: string; // 阴影
145
+ }
146
+ ```
147
+
148
+ #### StyleConfig
149
+
150
+ ```typescript
151
+ interface StyleConfig {
152
+ padding: string; // 内边距
153
+ fontSize: string; // 字体大小
154
+ fontWeight: string; // 字体粗细
155
+ indicatorHeight: string; // 指示器高度
156
+ indicatorStyle: IndicatorStyle; // 指示器样式
157
+ borderRadius?: string; // 圆角
158
+ gap?: string; // 标签间距
159
+ }
160
+ ```
161
+
162
+ #### 指示器样式
163
+
164
+ ```typescript
165
+ type IndicatorStyle = 'line' | 'dot' | 'pill' | 'underline';
166
+ ```
167
+
168
+ - `line` - 底部线条 (默认)
169
+ - `underline` - 完整下划线
170
+ - `dot` - 圆点指示器
171
+ - `pill` - 药丸形状
172
+
173
+ ### 事件
174
+
175
+ | 事件名 | 参数 | 描述 |
176
+ | ------------ | ------------------------------- | ---------------------- |
177
+ | `tab-change` | `(tabId: string, tab: TabItem)` | 标签页切换时触发 |
178
+ | `tab-click` | `(tabId: string, tab: TabItem, event: Event)` | 标签页点击时触发 |
179
+ | `tab-hover` | `(tabId: string, tab: TabItem)` | 鼠标悬浮在标签页时触发 |
180
+ | `tab-leave` | `(tabId: string, tab: TabItem)` | 鼠标离开标签页时触发 |
181
+
182
+ ## 🎨 预设配置
183
+
184
+ ### 尺寸配置
185
+
186
+ ```typescript
187
+ const sizeConfigs = {
188
+ small: {
189
+ padding: '8px 10px',
190
+ fontSize: '14px',
191
+ fontWeight: '500',
192
+ indicatorHeight: '2px',
193
+ },
194
+ medium: {
195
+ padding: '14px 12px',
196
+ fontSize: '16px',
197
+ fontWeight: '600',
198
+ indicatorHeight: '2px',
199
+ },
200
+ large: {
201
+ padding: '16px 16px',
202
+ fontSize: '18px',
203
+ fontWeight: '700',
204
+ indicatorHeight: '3px',
205
+ },
206
+ };
207
+ ```
208
+
209
+ ### 默认主题
210
+
211
+ ```typescript
212
+ const defaultTheme = {
213
+ activeTextColor: 'rgb(20, 23, 26)',
214
+ inactiveTextColor: 'rgb(76, 82, 89)',
215
+ hoverTextColor: 'rgb(55, 65, 81)',
216
+ backgroundColor: '#ffffff',
217
+ indicatorColor: 'rgb(20, 23, 26)',
218
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", "SF Pro Display", "Inter", sans-serif',
219
+ };
220
+ ```
221
+
222
+ ## 📖 更多示例
223
+
224
+ ### 不同指示器样式
225
+
226
+ ```vue
227
+ <!-- 线条指示器 -->
228
+ <ConfigurableSimpleTabs
229
+ :tabs="tabs"
230
+ :style="{ indicatorStyle: 'line' }"
231
+ />
232
+
233
+ <!-- 下划线指示器 -->
234
+ <ConfigurableSimpleTabs
235
+ :tabs="tabs"
236
+ :style="{ indicatorStyle: 'underline' }"
237
+ />
238
+
239
+ <!-- 圆点指示器 -->
240
+ <ConfigurableSimpleTabs
241
+ :tabs="tabs"
242
+ :style="{ indicatorStyle: 'dot' }"
243
+ />
244
+
245
+ <!-- 药丸指示器 -->
246
+ <ConfigurableSimpleTabs
247
+ :tabs="tabs"
248
+ :style="{ indicatorStyle: 'pill' }"
249
+ />
250
+ ```
251
+
252
+ ### 深色主题
253
+
254
+ ```vue
255
+ <ConfigurableSimpleTabs
256
+ :tabs="tabs"
257
+ :theme="{
258
+ activeTextColor: '#f9fafb',
259
+ inactiveTextColor: '#9ca3af',
260
+ hoverTextColor: '#d1d5db',
261
+ backgroundColor: '#1f2937',
262
+ indicatorColor: '#3b82f6'
263
+ }"
264
+ />
265
+ ```
266
+
267
+ ### 滚动标签页
268
+
269
+ ```vue
270
+ <ConfigurableSimpleTabs
271
+ :tabs="manyTabs"
272
+ scrollable
273
+ :style="{ gap: '32px' }"
274
+ />
275
+ ```
276
+
277
+ ### 居中对齐
278
+
279
+ ```vue
280
+ <ConfigurableSimpleTabs
281
+ :tabs="tabs"
282
+ centered
283
+ :theme="{ backgroundColor: '#f8fafc' }"
284
+ />
285
+ ```
286
+
287
+ ### 禁用动画
288
+
289
+ ```vue
290
+ <ConfigurableSimpleTabs
291
+ :tabs="tabs"
292
+ :animation="{ enabled: false }"
293
+ />
294
+ ```
295
+
296
+ ### 自定义响应式
297
+
298
+ ```vue
299
+ <ConfigurableSimpleTabs
300
+ :tabs="tabs"
301
+ :responsive="{
302
+ mobileBreakpoint: 1024,
303
+ mobileStyle: {
304
+ padding: '12px 8px',
305
+ fontSize: '14px'
306
+ }
307
+ }"
308
+ />
309
+ ```
310
+
311
+ ## 🎯 高级用法
312
+
313
+ ### 程序化控制
314
+
315
+ ```vue
316
+ <template>
317
+ <ConfigurableSimpleTabs
318
+ ref="tabsRef"
319
+ :tabs="tabs"
320
+ />
321
+ <button @click="switchTab">切换到联系页</button>
322
+ </template>
323
+
324
+ <script setup>
325
+ import { ref } from 'vue';
326
+
327
+ const tabsRef = ref();
328
+
329
+ const switchTab = () => {
330
+ tabsRef.value.setActiveTab('contact');
331
+ };
332
+ </script>
333
+ ```
334
+
335
+ ### 集成路由
336
+
337
+ ```vue
338
+ <template>
339
+ <ConfigurableSimpleTabs
340
+ :tabs="routeTabs"
341
+ @tab-change="handleTabChange"
342
+ />
343
+ </template>
344
+
345
+ <script setup>
346
+ import { useRouter } from 'vue-router';
347
+
348
+ const router = useRouter();
349
+
350
+ const routeTabs = [
351
+ { id: 'home', name: '首页', route: '/' },
352
+ { id: 'about', name: '关于', route: '/about' },
353
+ ];
354
+
355
+ const handleTabChange = (tabId, tab) => {
356
+ if (tab.route) {
357
+ router.push(tab.route);
358
+ }
359
+ };
360
+ </script>
361
+ ```
362
+
363
+ ### 动态标签页
364
+
365
+ ```vue
366
+ <template>
367
+ <ConfigurableSimpleTabs
368
+ :tabs="dynamicTabs"
369
+ @tab-change="handleTabChange"
370
+ />
371
+ <button @click="addTab">添加标签页</button>
372
+ </template>
373
+
374
+ <script setup>
375
+ import { ref } from 'vue';
376
+
377
+ const dynamicTabs = ref([
378
+ { id: 'tab1', name: '标签1' },
379
+ ]);
380
+
381
+ let tabCounter = 1;
382
+
383
+ const addTab = () => {
384
+ tabCounter++;
385
+ dynamicTabs.value.push({
386
+ id: `tab${tabCounter}`,
387
+ name: `标签${tabCounter}`,
388
+ });
389
+ };
390
+ </script>
391
+ ```
392
+
393
+ ## 🌟 特色功能
394
+
395
+ ### 无障碍访问
396
+
397
+ - 支持键盘导航 (Tab, Enter, 方向键)
398
+ - 兼容屏幕阅读器
399
+ - 符合 ARIA 标准
400
+ - 支持高对比度模式
401
+
402
+ ### 性能优化
403
+
404
+ - CSS `will-change` 属性优化动画性能
405
+ - 响应 `prefers-reduced-motion` 媒体查询
406
+ - 最小重排和重绘
407
+ - 虚拟滚动支持 (可选)
408
+
409
+ ### 浏览器兼容性
410
+
411
+ - Chrome 88+
412
+ - Firefox 85+
413
+ - Safari 14+
414
+ - Edge 88+
415
+
416
+ ## 🛠️ 开发
417
+
418
+ ```bash
419
+ # 克隆项目
420
+ git clone https://github.com/skillharbor/vue-simple-tabs.git
421
+
422
+ # 安装依赖
423
+ npm install
424
+
425
+ # 开发模式
426
+ npm run dev
427
+
428
+ # 构建
429
+ npm run build:lib
430
+
431
+ # 类型检查
432
+ npm run type-check
433
+ ```
434
+
435
+ ## 📄 许可证
436
+
437
+ MIT License
438
+
439
+ ## 🤝 贡献
440
+
441
+ 欢迎提交 Issue 和 Pull Request!
442
+
443
+ ## 🔗 链接
444
+
445
+ - [GitHub](https://github.com/skillharbor/vue-simple-tabs)
446
+ - [npm](https://www.npmjs.com/package/vue-simple-tabs)
447
+
448
+ ---
449
+
450
+ Made with ❤️ by SkillHarbor
@@ -0,0 +1,262 @@
1
+ import { defineComponent as D, useCssVars as F, ref as S, computed as v, onMounted as L, onUnmounted as W, nextTick as E, openBlock as b, createElementBlock as f, normalizeClass as k, normalizeStyle as m, createElementVNode as x, Fragment as I, renderList as N, createCommentVNode as w, toDisplayString as V } from "vue";
2
+ const U = {
3
+ activeTextColor: "rgb(20, 23, 26)",
4
+ inactiveTextColor: "rgb(76, 82, 89)",
5
+ hoverTextColor: "rgb(55, 65, 81)",
6
+ backgroundColor: "#ffffff",
7
+ indicatorColor: "rgb(20, 23, 26)",
8
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", "SF Pro Display", "Inter", sans-serif'
9
+ }, j = {
10
+ small: {
11
+ padding: "8px 10px",
12
+ fontSize: "14px",
13
+ fontWeight: "500",
14
+ indicatorHeight: "2px",
15
+ indicatorStyle: "line",
16
+ gap: "16px"
17
+ },
18
+ medium: {
19
+ padding: "14px 12px",
20
+ fontSize: "16px",
21
+ fontWeight: "600",
22
+ indicatorHeight: "2px",
23
+ indicatorStyle: "line",
24
+ gap: "20px"
25
+ },
26
+ large: {
27
+ padding: "16px 16px",
28
+ fontSize: "18px",
29
+ fontWeight: "700",
30
+ indicatorHeight: "3px",
31
+ indicatorStyle: "line",
32
+ gap: "24px"
33
+ }
34
+ }, q = {
35
+ transitionDuration: "0.2s",
36
+ easing: "ease",
37
+ enabled: !0,
38
+ indicatorTransition: "0.3s ease"
39
+ }, O = {
40
+ mobileBreakpoint: 768,
41
+ enabled: !0,
42
+ mobileStyle: {
43
+ padding: "14px 0",
44
+ gap: "16px"
45
+ }
46
+ }, P = {
47
+ line: (n, o) => ({
48
+ position: "absolute",
49
+ bottom: "0",
50
+ left: "12px",
51
+ right: "12px",
52
+ height: o,
53
+ backgroundColor: n,
54
+ borderRadius: "0"
55
+ }),
56
+ underline: (n, o) => ({
57
+ position: "absolute",
58
+ bottom: "0",
59
+ left: "0",
60
+ right: "0",
61
+ height: o,
62
+ backgroundColor: n,
63
+ borderRadius: "0"
64
+ }),
65
+ dot: (n, o) => ({
66
+ position: "absolute",
67
+ bottom: "4px",
68
+ left: "50%",
69
+ transform: "translateX(-50%)",
70
+ width: o,
71
+ height: o,
72
+ backgroundColor: n,
73
+ borderRadius: "50%"
74
+ }),
75
+ pill: (n, o) => ({
76
+ position: "absolute",
77
+ bottom: "4px",
78
+ left: "8px",
79
+ right: "8px",
80
+ height: o,
81
+ backgroundColor: n,
82
+ borderRadius: o
83
+ })
84
+ }, X = (n, o, l) => P[n](o, l), y = (n, o) => ({ ...n, ...o }), G = (n, o, l) => !n || !l ? o : { ...o, ...l }, J = ["disabled", "onClick", "onMouseenter", "onMouseleave"], K = ["innerHTML"], Q = { class: "tab-text" }, Y = /* @__PURE__ */ D({
85
+ __name: "ConfigurableSimpleTabs",
86
+ props: {
87
+ tabs: {},
88
+ defaultActive: {},
89
+ size: { default: "medium" },
90
+ theme: {},
91
+ style: {},
92
+ animation: {},
93
+ responsive: {},
94
+ className: {},
95
+ customStyle: {},
96
+ block: { type: Boolean, default: !1 },
97
+ centered: { type: Boolean, default: !1 },
98
+ scrollable: { type: Boolean, default: !1 }
99
+ },
100
+ emits: ["tab-change", "tab-click", "tab-hover", "tab-leave"],
101
+ setup(n, { expose: o, emit: l }) {
102
+ var z;
103
+ F((e) => ({
104
+ "4e65487a": i.value.indicatorColor,
105
+ "25a898f4": i.value.backgroundColor
106
+ }));
107
+ const t = n, r = l, d = S(t.defaultActive || ((z = t.tabs[0]) == null ? void 0 : z.id) || ""), p = S(!1), h = S(null), i = v(
108
+ () => y(U, t.theme)
109
+ ), c = v(
110
+ () => y(q, t.animation)
111
+ ), g = v(
112
+ () => y(O, t.responsive)
113
+ ), R = v(
114
+ () => y(j[t.size], t.style)
115
+ ), u = v(
116
+ () => G(
117
+ p.value && g.value.enabled,
118
+ R.value,
119
+ g.value.mobileStyle
120
+ )
121
+ ), T = () => {
122
+ g.value.enabled && (p.value = window.innerWidth <= g.value.mobileBreakpoint);
123
+ }, M = (e) => e.disabled ? i.value.inactiveTextColor : d.value === e.id ? i.value.activeTextColor : h.value === e.id ? i.value.hoverTextColor : i.value.inactiveTextColor, B = () => X(
124
+ u.value.indicatorStyle,
125
+ i.value.indicatorColor,
126
+ u.value.indicatorHeight
127
+ ), H = (e, s) => {
128
+ e.disabled || (d.value = e.id, r("tab-change", e.id, e), r("tab-click", e.id, e, s), e.route && console.log("Navigate to:", e.route));
129
+ }, $ = (e) => {
130
+ e.disabled || (h.value = e.id, r("tab-hover", e.id, e));
131
+ }, A = (e) => {
132
+ e.disabled || (h.value = null, r("tab-leave", e.id, e));
133
+ }, _ = () => {
134
+ T();
135
+ };
136
+ return L(() => {
137
+ T(), window.addEventListener("resize", _);
138
+ }), W(() => {
139
+ window.removeEventListener("resize", _);
140
+ }), o({
141
+ activeTab: d,
142
+ setActiveTab: (e) => {
143
+ const s = t.tabs.find((a) => a.id === e);
144
+ s && !s.disabled && (d.value = e, r("tab-change", e, s));
145
+ },
146
+ getActiveTab: () => t.tabs.find((e) => e.id === d.value),
147
+ scrollToTab: (e) => {
148
+ t.scrollable && E(() => {
149
+ const s = document.querySelector(`[data-tab-id="${e}"]`);
150
+ s && s.scrollIntoView({ behavior: "smooth", inline: "center" });
151
+ });
152
+ }
153
+ }), (e, s) => (b(), f("div", {
154
+ class: k(["simple-tabs-container", [
155
+ `size-${t.size}`,
156
+ {
157
+ "tabs-block": t.block,
158
+ "tabs-centered": t.centered,
159
+ "tabs-scrollable": t.scrollable,
160
+ "is-mobile": p.value
161
+ },
162
+ t.className
163
+ ]]),
164
+ style: m({
165
+ backgroundColor: i.value.backgroundColor,
166
+ boxShadow: i.value.boxShadow,
167
+ flexShrink: 0,
168
+ ...t.customStyle
169
+ })
170
+ }, [
171
+ x("nav", null, [
172
+ x("ul", {
173
+ class: k(["tabs-list", {
174
+ "flex-wrap": t.scrollable && !p.value,
175
+ "overflow-x-auto": t.scrollable && p.value
176
+ }]),
177
+ style: m({
178
+ display: "flex",
179
+ gap: u.value.gap,
180
+ justifyContent: t.centered ? "center" : "flex-start",
181
+ margin: 0,
182
+ padding: 0,
183
+ listStyle: "none"
184
+ })
185
+ }, [
186
+ (b(!0), f(I, null, N(t.tabs, (a) => (b(), f("li", {
187
+ key: a.id,
188
+ class: k(["tab-item", {
189
+ "tab-active": d.value === a.id,
190
+ "tab-disabled": a.disabled
191
+ }])
192
+ }, [
193
+ x("button", {
194
+ class: "tab-button",
195
+ disabled: a.disabled,
196
+ style: m({
197
+ position: "relative",
198
+ display: "flex",
199
+ alignItems: "center",
200
+ background: "none",
201
+ border: "none",
202
+ cursor: a.disabled ? "not-allowed" : "pointer",
203
+ textDecoration: "none",
204
+ transition: c.value.enabled ? `color ${c.value.transitionDuration} ${c.value.easing}` : "none",
205
+ padding: u.value.padding,
206
+ fontSize: u.value.fontSize,
207
+ fontWeight: u.value.fontWeight,
208
+ fontFamily: i.value.fontFamily,
209
+ color: M(a),
210
+ opacity: a.disabled ? 0.5 : 1,
211
+ borderRadius: u.value.borderRadius || "0",
212
+ whiteSpace: "nowrap"
213
+ }),
214
+ onClick: (C) => H(a, C),
215
+ onMouseenter: (C) => $(a),
216
+ onMouseleave: (C) => A(a)
217
+ }, [
218
+ a.icon ? (b(), f("span", {
219
+ key: 0,
220
+ class: "tab-icon",
221
+ style: {
222
+ marginRight: "8px",
223
+ fontSize: "1em",
224
+ lineHeight: 1
225
+ },
226
+ innerHTML: a.icon
227
+ }, null, 8, K)) : w("", !0),
228
+ x("span", Q, V(a.name), 1),
229
+ d.value === a.id ? (b(), f("span", {
230
+ key: 1,
231
+ class: "tab-indicator",
232
+ style: m({
233
+ ...B(),
234
+ transition: c.value.enabled ? `all ${c.value.indicatorTransition || c.value.transitionDuration} ${c.value.easing}` : "none"
235
+ })
236
+ }, null, 4)) : w("", !0)
237
+ ], 44, J)
238
+ ], 2))), 128))
239
+ ], 6)
240
+ ])
241
+ ], 6));
242
+ }
243
+ });
244
+ const Z = (n, o) => {
245
+ const l = n.__vccOpts || n;
246
+ for (const [t, r] of o)
247
+ l[t] = r;
248
+ return l;
249
+ }, te = /* @__PURE__ */ Z(Y, [["__scopeId", "data-v-166844ee"]]);
250
+ export {
251
+ te as ConfigurableSimpleTabs,
252
+ te as default,
253
+ q as defaultAnimation,
254
+ O as defaultResponsive,
255
+ U as defaultTheme,
256
+ X as getIndicatorStyle,
257
+ G as getResponsiveStyle,
258
+ P as indicatorStyles,
259
+ y as mergeConfig,
260
+ j as sizeConfigs
261
+ };
262
+ //# sourceMappingURL=index.esm.js.map