+
+ display/hidden tab item
+
+
+ Change
+
+
+
+
+
+ label-1slot-title
+ label-1slot-title
+
+
+
+ label-1
+
+
+
+ label-2
+
+ label-3
+ label-4
+
+ {{
+ `name-${i}`
+ }}
+
+
+
+
+
+
+
+ label-1
+
+
+ label-2
+
+ label-3
+ label-4
+
+
+
+
+
+
+ label-1
+
+
+ label-2
+
+
+ label-3
+
+
+ label-4
+
+
+
+
+
+ top
+ right
+ bottom
+ left
+
+
+ label-1
+ label-3
+ label-4
+ label-2
+
+
+
+
+
+
+
+ label-1
+
+ label-1
+
+ label-6
+ label-4
+ label-2
+
+
+
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
+
+ add tab
+
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
diff --git a/packages/tabs/doc/index.stories.ts b/packages/tabs/doc/index.stories.ts
new file mode 100644
index 0000000000..d9615f8236
--- /dev/null
+++ b/packages/tabs/doc/index.stories.ts
@@ -0,0 +1,6 @@
+export { default as BasicUsage } from './basic.vue'
+
+export default {
+ title: 'Tabs',
+}
+
diff --git a/packages/tabs/index.ts b/packages/tabs/index.ts
new file mode 100644
index 0000000000..994759489f
--- /dev/null
+++ b/packages/tabs/index.ts
@@ -0,0 +1,11 @@
+import { App } from 'vue'
+import Tabs from './src/tabs.vue'
+import TabBar from './src/tab-bar.vue'
+import TabNav from './src/tab-nav.vue'
+import TabPane from './src/tab-pane.vue'
+export default (app: App): void => {
+ app.component(Tabs.name, Tabs)
+ app.component(TabBar.name, TabBar)
+ app.component(TabNav.name, TabNav)
+ app.component(TabPane.name, TabPane)
+}
diff --git a/packages/tabs/package.json b/packages/tabs/package.json
new file mode 100644
index 0000000000..6b67ac93a0
--- /dev/null
+++ b/packages/tabs/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "@element-plus/tabs",
+ "version": "0.0.0",
+ "main": "dist/index.js",
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": "^3.0.0-rc.1"
+ },
+ "devDependencies": {
+ "@vue/test-utils": "^2.0.0-beta.0"
+ }
+}
diff --git a/packages/tabs/src/tab-bar.vue b/packages/tabs/src/tab-bar.vue
new file mode 100644
index 0000000000..0c4856a518
--- /dev/null
+++ b/packages/tabs/src/tab-bar.vue
@@ -0,0 +1,78 @@
+