diff --git a/src/App.vue b/src/App.vue
index 2a240da5..69d96733 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -11,6 +11,12 @@ body {
overflow-y: overlay;
background: #eff4f9;
}
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
*::-webkit-scrollbar-track-piece {
background-color: #f8f8f8;
-webkit-border-radius: 2em;
diff --git a/src/components/base/tabs/TabItem.vue b/src/components/base/tabs/TabItem.vue
new file mode 100644
index 00000000..4be8a44f
--- /dev/null
+++ b/src/components/base/tabs/TabItem.vue
@@ -0,0 +1,5 @@
+
+
+ tab item
+
+
diff --git a/src/components/base/tabs/Tabbar.story.vue b/src/components/base/tabs/Tabbar.story.vue
new file mode 100644
index 00000000..b033864f
--- /dev/null
+++ b/src/components/base/tabs/Tabbar.story.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/base/tabs/Tabbar.vue b/src/components/base/tabs/Tabbar.vue
new file mode 100644
index 00000000..d45b0754
--- /dev/null
+++ b/src/components/base/tabs/Tabbar.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+ {{ item[labelKey] }}
+
+
+
+
+
+
diff --git a/src/components/base/tabs/Tabs.vue b/src/components/base/tabs/Tabs.vue
new file mode 100644
index 00000000..0787e95b
--- /dev/null
+++ b/src/components/base/tabs/Tabs.vue
@@ -0,0 +1,5 @@
+
+
+ tabs
+
+
diff --git a/src/components/base/tabs/__tests__/TabItem.spec.ts b/src/components/base/tabs/__tests__/TabItem.spec.ts
new file mode 100644
index 00000000..669ffbf7
--- /dev/null
+++ b/src/components/base/tabs/__tests__/TabItem.spec.ts
@@ -0,0 +1,8 @@
+import { describe, expect, it } from "vitest";
+import { VTabItem } from "../index";
+
+describe("TabItem", () => {
+ it("should render", () => {
+ expect(VTabItem).toBeDefined();
+ });
+});
diff --git a/src/components/base/tabs/__tests__/Tabbar.spec.ts b/src/components/base/tabs/__tests__/Tabbar.spec.ts
new file mode 100644
index 00000000..7acf7cc7
--- /dev/null
+++ b/src/components/base/tabs/__tests__/Tabbar.spec.ts
@@ -0,0 +1,8 @@
+import { describe, expect, it } from "vitest";
+import { VTabbar } from "../index";
+
+describe("Tabbar", () => {
+ it("should render", () => {
+ expect(VTabbar).toBeDefined();
+ });
+});
diff --git a/src/components/base/tabs/__tests__/Tabs.spec.ts b/src/components/base/tabs/__tests__/Tabs.spec.ts
new file mode 100644
index 00000000..eb38acca
--- /dev/null
+++ b/src/components/base/tabs/__tests__/Tabs.spec.ts
@@ -0,0 +1,8 @@
+import { describe, expect, it } from "vitest";
+import { VTabs } from "../index";
+
+describe("Tabs", () => {
+ it("should render", () => {
+ expect(VTabs).toBeDefined();
+ });
+});
diff --git a/src/components/base/tabs/index.ts b/src/components/base/tabs/index.ts
new file mode 100644
index 00000000..17d18818
--- /dev/null
+++ b/src/components/base/tabs/index.ts
@@ -0,0 +1,3 @@
+export { default as VTabs } from "./Tabs.vue";
+export { default as VTabItem } from "./TabItem.vue";
+export { default as VTabbar } from "./Tabbar.vue";
diff --git a/src/components/base/tabs/interface.ts b/src/components/base/tabs/interface.ts
new file mode 100644
index 00000000..628a586b
--- /dev/null
+++ b/src/components/base/tabs/interface.ts
@@ -0,0 +1 @@
+export type Type = "default" | "pills" | "outline";