diff --git a/content/navigation/tabs/index-en-US.md b/content/navigation/tabs/index-en-US.md
index 75416c35f4..2b1bf769d5 100644
--- a/content/navigation/tabs/index-en-US.md
+++ b/content/navigation/tabs/index-en-US.md
@@ -18,7 +18,7 @@ import { Tabs, TabPane } from '@douyinfe/semi-ui';
### Basic Usage
-Tbs supports three types of styles: `line`, `button`, and `card`. By default, the first tab is selected.
+Tbs supports three types of styles: `line`, `button`, `card`, and `slash`. By default, the first tab is selected.
Tabs supports two declare ways, and the rendering process of the two is different:
@@ -168,6 +168,44 @@ class TabDemo extends React.Component {
}
```
+```jsx live=true
+import React from 'react';
+import { Tabs } from '@douyinfe/semi-ui';
+
+class TabDemo extends React.Component {
+ constructor() {
+ super();
+ this.state = { key: '1' };
+ this.onTabClick = this.onTabClick.bind(this);
+ }
+
+ onTabClick(key, type) {
+ this.setState({ [type]: key });
+ }
+
+ render() {
+ // eslint-disable-next-line react/jsx-key
+ const contentList = [
Document
, Quick Start
, Help
];
+ const tabList = [
+ { tab: 'Document', itemKey: '1' },
+ { tab: 'Quick Start', itemKey: '2' },
+ { tab: 'Help', itemKey: '3' },
+ ];
+ return (
+ {
+ this.onTabClick(key, 'key');
+ }}
+ >
+ {contentList[this.state.key - 1]}
+
+ );
+ }
+}
+```
+
### With Icon
```jsx live=true
@@ -274,7 +312,7 @@ function Demo() {
### Vertical mode
-Support two positions: `tabPosition='left|top'`
+When `type` is `line`, `card`, or `button`, horizontal and vertical modes are supported, `tabPosition='left|top'`,default is top. When `type` is `slash`, only horizontal mode is supported.
```jsx live=true
import React from 'react';
@@ -381,7 +419,9 @@ class App extends React.Component {
**Modify the scrolling rendering Arrow**
-`renderArrow` modifies the Arrow, with the input parameters being the overflowed items and position
+`renderArrow` modifies the Arrow, with the input parameters being the overflowed items, position, click function, and defaultNode.
+
+**Attention**: The first three parameters of renderArrow are supported since 2.61.0,while defaultNode parameter is supported since 2.66.0.
```jsx live=true dir="column"
import React from 'react';
@@ -701,6 +741,7 @@ class App extends React.Component {
| activeKey | The itemKey value of the currently active tab page | string | None |
| className | class name | string | None |
| collapsible | collapsed Tabs, **>=1.1.0** | boolean | false |
+| dropdownProps | In collapsible mode, It is used to transparently transmit parameters to the Dropdown component of the drop-down menu, support since 2.66.0 | DropDownProps | { start: DropdownProps, end: DropdownProps } |
| visibleTabsStyle | Overall scrolling area style **>=2.61.0** | style: CSSProperties | None |
| contentStyle | The outer style object of the content area | CSSProperties | None |
| defaultActiveKey | Initialize the key value of the selected tab page | string | '1' |
@@ -708,7 +749,7 @@ class App extends React.Component {
| lazyRender | Lazy rendering, only when the panel is activated will it be rendered in the DOM tree, **>=1.0.0** | boolean | false |
| more | Render a portion of the Tab into a drop-down menu ** >= 2.59.0** | number \| {count:number,render:()=>ReactNode,dropdownProps:DropDownProps} | - |
| renderTabBar | Used for secondary packaging tab bar | (tabBarProps: object, defaultTabBar: React.ComponentType) => ReactNode | None |
-| renderArrow | Customize how overflow items indicator are rendered externally. By default, the overflow items are expanded when the arrow button is hovered. **>=2.61.0** | (items: OverflowItem[],pos:"start"\|"end", handleArrowClick:()=>void)=> ReactNode | None |
+| renderArrow | Customize how overflow items indicator are rendered externally. By default, the overflow items are expanded when the arrow button is hovered. The first three parameters of renderArrow are supported since **>=2.61.0**, defaultNode is supported since **>=2.66.0** | (items: OverflowItem[],pos:"start"\|"end", handleArrowClick:()=>void, defaultNode: ReactNode)=> ReactNode | None |
| preventScroll | Indicates whether the browser should scroll the document to display the newly focused element, acting on the focus method inside the component, excluding the component passed in by the user | boolean |
| showRestInDropdown | Whether to display the collapsed Tab in the drop-down menu (only effective when collapsible is true) **>= 2.61.0** | boolean | true |
| size | Size, providing three types of `large`, `medium`, and `small`, **>=1.11.0, currently only supports linear Tabs** | string | `large` |
diff --git a/content/navigation/tabs/index.md b/content/navigation/tabs/index.md
index f0dff2d265..76e2b5061f 100644
--- a/content/navigation/tabs/index.md
+++ b/content/navigation/tabs/index.md
@@ -17,7 +17,7 @@ import { Tabs, TabPane } from '@douyinfe/semi-ui';
### 基本用法
-标签栏支持三种样式的显示:线条式,按钮式,卡片式。默认选中第一项。
+标签栏支持三种样式的显示:线条式,按钮式,卡片式,斜线式。默认选中第一项。
标签页支持两种传入方式,两者渲染流程上有所区别:
- 通过 `tabList` 传入标签页对象的数组,当使用 `tabList` 时每次只渲染当前传入的节点
@@ -153,6 +153,44 @@ class TabDemo extends React.Component {
}
```
+```jsx live=true
+import React from 'react';
+import { Tabs } from '@douyinfe/semi-ui';
+
+class TabDemo extends React.Component {
+ constructor() {
+ super();
+ this.state = { key: '1' };
+ this.onTabClick = this.onTabClick.bind(this);
+ }
+
+ onTabClick(key, type) {
+ this.setState({ [type]: key });
+ }
+
+ render() {
+ // eslint-disable-next-line react/jsx-key
+ const contentList = [文档
, 快速起步
, 帮助
];
+ const tabList = [
+ { tab: '文档', itemKey: '1' },
+ { tab: '快速起步', itemKey: '2' },
+ { tab: '帮助', itemKey: '3' },
+ ];
+ return (
+ {
+ this.onTabClick(key, 'key');
+ }}
+ >
+ {contentList[this.state.key - 1]}
+
+ );
+ }
+}
+```
+
### 带图标的
有图标的标签栏。
@@ -257,7 +295,7 @@ function Demo() {
### 垂直的标签栏
-支持水平和垂直两种模式, `tabPosition='left|top'`
+`type` 为 `line`, `card`, `button` 支持水平和垂直两种模式,`tabPosition='left|top'`, 默认为 `top`。`type` 为 `slash` 仅支持水平模式,无需设置。
```jsx live=true
import React from 'react';
@@ -404,7 +442,9 @@ class App extends React.Component {
**自定义滚动箭头渲染**
-通过 renderArrow 修改滚动折叠模式下,左右切换箭头的渲染,入参为溢出的 items 和 位置
+通过 renderArrow 修改滚动折叠模式下,左右切换箭头的渲染,入参为溢出的 items 和 位置, 点击处理函数,以及 defaultNode。
+
+**注**:renderArrow 的前三个参数自 2.61.0 支持,defaultNode 自 2.66.0 支持。
```jsx live=true dir="column"
import React from 'react';
@@ -412,7 +452,7 @@ import { Tabs, TabPane, Dropdown } from '@douyinfe/semi-ui';
() => {
const [activeKey, setActiveKey] = useState('Tab-0');
- const renderArrow = (items, pos, handleArrowClick) => {
+ const renderArrow = (items, pos, handleArrowClick, defaultNode) => {
const style = {
width: 32,
height: 32,
@@ -718,6 +758,7 @@ class App extends React.Component {
| arrowPosition | 折叠模式下,左右切换箭头渲染位置 **>=2.61.0** | "start" "end" "both" | 无 |
| className | 类名 | string | 无 |
| collapsible | 折叠的 Tabs,**>=1.1.0** | boolean | false |
+| dropdownProps | 用于在折叠模式下透传参数到下拉菜单的 Dropdown 组件 | { start: DropdownProps, end: DropdownProps } | 无 |
| visibleTabsStyle | 整体滚动区域 Style **>=2.61.0** | style: CSSProperties | 无 |
| contentStyle | 内容区域外层样式对象 | CSSProperties | 无 |
| defaultActiveKey | 初始化选中的 tab 页的 key 值 | string | '1' |
@@ -725,7 +766,7 @@ class App extends React.Component {
| lazyRender | 懒渲染,仅当面板激活过才被渲染在 DOM 树中 | boolean | false |
| more | 将一部分 Tab 渲染到下拉菜单中 ** >= 2.59.0** | number \| {count:number,render:()=>ReactNode,dropdownProps:DropDownProps} | - |
| renderTabBar | 用于二次封装标签栏 | (tabBarProps: object, defaultTabBar: React.ComponentType) => ReactNode | 无 |
-| renderArrow | 折叠滚动模式下,自定义左右切换箭头如何渲染,默认为箭头按钮 hover 时展开溢出项 **>=2.61.0** | (items: OverflowItem[],pos:"start"\|"end", handleArrowClick:()=>void)=> ReactNode | 无 |
+| renderArrow | 折叠滚动模式下,自定义左右切换箭头如何渲染,默认为箭头按钮 hover 时展开溢出项。前三个参数自 **>=2.61.0** 支持,defaultNode 参数自 **>=2.66.0** 支持| (items: OverflowItem[],pos:"start"\|"end", handleArrowClick:()=>void, defaultNode: ReactNode)=> ReactNode | 无 |
| preventScroll | 指示浏览器是否应滚动文档以显示新聚焦的元素,作用于组件内的 focus 方法 | boolean | | |
| showRestInDropdown | 是否将收起的 Tab 展示在下拉菜单中(仅当 collapsible 为 true 时生效) **>= 2.61.0** | boolean | true |
| size | 大小,提供 `large`、`medium`、`small` 三种类型,**>=1.11.0,目前仅支持线性 Tabs** | string | `large` |
@@ -734,7 +775,7 @@ class App extends React.Component {
| tabList | 标签页对象组成的数组,该对象支持 itemKey(对应 activeKey,tab(标签页文字)及 icon(标签页图标) | TabPane[] | 无 |
| tabPaneMotion | 是否使用动画切换 tabs | boolean | true |
| tabPosition | tab 的位置,支持`top`(水平), `left`(垂直) | string | `top` |
-| type | 标签栏的样式,可选`line`、 `card`、 `button` | string | `line` |
+| type | 标签栏的样式,可选`line`、 `card`、 `button`、`slash` | string | `line` |
| onChange | 切换 tab 页时的回调函数 | function(activeKey: string) | 无 |
| onTabClick | 单击事件 | function(key: string, e: Event) | 无 |
| onTabClose | 关闭 tab 页时的回调函数 **>=2.1.0** | function(tabKey: string) | 无 |
diff --git a/cypress/e2e/tabs.spec.js b/cypress/e2e/tabs.spec.js
index cad357daa2..2269fbb85f 100644
--- a/cypress/e2e/tabs.spec.js
+++ b/cypress/e2e/tabs.spec.js
@@ -74,13 +74,13 @@ describe('tabs', () => {
cy.get('[id=semiTab1]').should('be.focused');
});
- it('keyboard test when the tabs is closable', () => {
+ it.only('keyboard test when the tabs is closable', () => {
cy.visit('http://127.0.0.1:6006/iframe.html?id=tabs--tab-closable&args=&viewMode=story');
- cy.get('[id=semiTab1]').click();
- cy.get('[id=semiTab1]').should('be.focused');
+ cy.get('[data-tabkey=semiTab1]').eq(0).click();
+ cy.get('[data-tabkey=semiTab1]').eq(0).should('be.focused');
- cy.get('[id=semiTab1]').type('{backspace}');
- cy.get('[id=semiTab1]').should('not.exist');
+ cy.get('[data-tabkey=semiTab1]').eq(0).type('{backspace}');
+ cy.get('[data-tabkey=semiTab1]').should('not.exist');
});
it('collapsible', () => {
diff --git a/packages/semi-foundation/tabs/constants.ts b/packages/semi-foundation/tabs/constants.ts
index 21bde96111..c83852dfc8 100644
--- a/packages/semi-foundation/tabs/constants.ts
+++ b/packages/semi-foundation/tabs/constants.ts
@@ -6,6 +6,7 @@ const cssClasses = {
TABS_BAR_LINE: `${BASE_CLASS_PREFIX}-tabs-bar-line`,
TABS_BAR_CARD: `${BASE_CLASS_PREFIX}-tabs-bar-card`,
TABS_BAR_BUTTON: `${BASE_CLASS_PREFIX}-tabs-bar-button`,
+ TABS_BAR_SLASH: `${BASE_CLASS_PREFIX}-tabs-bar-slash`,
TABS_BAR_EXTRA: `${BASE_CLASS_PREFIX}-tabs-bar-extra`,
TABS_TAB: `${BASE_CLASS_PREFIX}-tabs-tab`,
TABS_TAB_ACTIVE: `${BASE_CLASS_PREFIX}-tabs-tab-active`,
@@ -29,7 +30,7 @@ const numbers = {
};
const strings = {
- TYPE_MAP: ['line', 'card', 'button'],
+ TYPE_MAP: ['line', 'card', 'button', 'slash'],
SIZE: ['small', 'medium', 'large'],
POSITION_MAP: ['top', 'left']
};
diff --git a/packages/semi-foundation/tabs/tabs.scss b/packages/semi-foundation/tabs/tabs.scss
index 81380c48dd..2561694250 100644
--- a/packages/semi-foundation/tabs/tabs.scss
+++ b/packages/semi-foundation/tabs/tabs.scss
@@ -174,6 +174,10 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
color: var(--semi-color-text-2);
margin-left: 10px;
cursor: pointer;
+
+ &.#{$prefix}-icon-close:hover {
+ color: var(--semi-color-text-0);
+ }
}
&:hover {
@@ -182,6 +186,10 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
.#{$prefix}-icon:not(#{$ignoreIcon}) {
color: $color-tabs_tab-icon-hover;
}
+
+ .#{$prefix}-icon.#{$module}-tab-icon-close {
+ color: var(--semi-color-text-2);
+ }
}
&:active {
@@ -190,6 +198,10 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
.#{$prefix}-icon:not(#{$ignoreIcon}) {
color: $color-tabs_tab-icon-active;
}
+
+ .#{$prefix}-icon.#{$module}-tab-icon-close {
+ color: var(--semi-color-text-2);
+ }
}
}
@@ -583,6 +595,36 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
}
}
+ &-bar-slash {
+
+ .#{$module}-tab {
+ padding: $spacing-tabs_bar_slash_tab-paddingY $spacing-tabs_bar_slash_tab-paddingX;
+
+ &:nth-of-type(1) {
+ padding-left: 0;
+ }
+
+ &:not(:last-of-type) {
+ margin-right: $spacing-tabs_bar_slash-marginRight;
+
+ &:after {
+ content: "";
+ margin-left: $spacing-tabs_bar_slash_line_marginLeft;
+ display: inline-block;
+ height: $height-tabs_tab_slash_line;
+ width: $width-tabs_tab_slash_line;
+ margin-top: $spacing-tabs_bar_slash_line_marginTop;
+ margin-bottom: $spacing-tabs_bar_slash_line_marginBottom;
+ vertical-align: bottom;
+ // Get diagonal slash
+ background: linear-gradient(to bottom right, transparent 0%,
+ transparent calc(50% - 1px), $color-tabs_tab_slash_line 50%,
+ transparent calc(50% + 1px), transparent 100%);
+ }
+ }
+ }
+ }
+
&-content {
width: 100%;
padding: $spacing-tabs_content-paddingY $spacing-tabs_content-paddingX;
diff --git a/packages/semi-foundation/tabs/variables.scss b/packages/semi-foundation/tabs/variables.scss
index 5229b74c80..13f54642f3 100644
--- a/packages/semi-foundation/tabs/variables.scss
+++ b/packages/semi-foundation/tabs/variables.scss
@@ -65,6 +65,8 @@ $color-tabs_tab-pane_arrow_disabled-bg-hover: transparent;
$color-tabs_tab-pane_arrow_disabled-text-default: var(--semi-color-disabled-text);
$color-tabs_tab-pane_arrow_disabled-text-hover: var(--semi-color-disabled-text);
+$color-tabs_tab_slash_line: var(--semi-color-text-2); //斜线式页签分割线颜色
+
$font-tabs_tab-fontWeight: $font-weight-regular; // 页签文本字重 - 默认
$font-tabs_tab_active-fontWeight: $font-weight-bold; // 页签文本字重 - 选中
@@ -79,6 +81,9 @@ $width-tabs-outline-offset: -2px; // 聚焦轮廓偏移宽度
$width-tabs_bar_line-outline-offset: -1px; // 线条式页签聚焦轮廓偏移宽度
$width-tabs_tab-pane_arrow-border:0px; // 滚动折叠箭头边框宽度
+$width-tabs_tab_slash_line: 8px; // 斜线式页签分割线宽度
+$height-tabs_tab_slash_line: 14px; // 斜线式页签分割线高度
+
$height-tabs_bar_extra_large: 50px; // 大尺寸页签高度
$font-tabs_bar_extra_large-lineHeight: $height-tabs_bar_extra_large; // 大尺寸页签文字行高
@@ -118,6 +123,13 @@ $spacing-tabs_bar_line_tab_left-padding: 12px; // 垂直线条式页签左侧内
$spacing-tabs_bar_line_tab_left_small-padding: $spacing-tight - 2px; // 小尺寸垂直线条式页签左侧内边距
$spacing-tabs_bar_line_tab_left_medium-padding: $spacing-base-tight - 2px; // 中等尺寸垂直线条式页签左侧内边距
+$spacing-tabs_bar_slash_tab-paddingY: 12px; // 斜线式页签上下内边距
+$spacing-tabs_bar_slash_tab-paddingX: 0px; // 斜线式页签水平内边距
+$spacing-tabs_bar_slash-marginRight: 16px; // 斜线式页签右侧外边距
+$spacing-tabs_bar_slash_line_marginLeft: 16px; // 斜线式页签斜线左侧外边距
+$spacing-tabs_bar_slash_line_marginTop: 3px; // 斜线式页签斜线顶部外边距
+$spacing-tabs_bar_slash_line_marginBottom: 3px; // 斜线式页签斜线底部外边距
+
$spacing-tabs_content-paddingY: 5px; // 页签内容区垂直方向内边距
$spacing-tabs_content-paddingX: 0; // 页签内容区水平方向内边距
diff --git a/packages/semi-ui/tabs/TabBar.tsx b/packages/semi-ui/tabs/TabBar.tsx
index 750058e074..ba5f53a2cc 100644
--- a/packages/semi-ui/tabs/TabBar.tsx
+++ b/packages/semi-ui/tabs/TabBar.tsx
@@ -161,7 +161,7 @@ class TabBar extends React.Component {
);
}
- const { dropdownClassName, dropdownStyle, showRestInDropdown } = this.props;
+ const { dropdownClassName, dropdownStyle, showRestInDropdown, dropdownProps } = this.props;
const { rePosKey } = this.state;
const disabled = !items.length;
const menu = (
@@ -197,6 +197,8 @@ class TabBar extends React.Component {
[`${cssClasses.TABS_BAR}-dropdown`]: true,
});
+ const customDropdownProps = dropdownProps?.[pos] ?? {};
+
return (
<>
{showRestInDropdown ? (
@@ -211,6 +213,7 @@ class TabBar extends React.Component {
style={dropdownStyle}
trigger={'hover'}
disableFocusListener // prevent the panel from popping up again after clicking
+ {...customDropdownProps}
>
{button}
@@ -221,11 +224,12 @@ class TabBar extends React.Component {
renderOverflow = (items: any[]): Array => items.map((item, index) => {
const pos = index === 0 ? 'start' : 'end';
+ const icon = index === 0 ? : ;
+ const overflowNode = this.renderCollapse(item, icon, pos);
if (this.props.renderArrow) {
- return this.props.renderArrow(item, pos, ()=>this.handleArrowClick(item, pos));
+ return this.props.renderArrow(item, pos, ()=>this.handleArrowClick(item, pos), overflowNode);
}
- const icon = index === 0 ? : ;
- return this.renderCollapse(item, icon, pos);
+ return overflowNode;
});
@@ -318,6 +322,7 @@ class TabBar extends React.Component {
[cssClasses.TABS_BAR_LINE]: type === 'line',
[cssClasses.TABS_BAR_CARD]: type === 'card',
[cssClasses.TABS_BAR_BUTTON]: type === 'button',
+ [cssClasses.TABS_BAR_SLASH]: type === 'slash',
[`${cssClasses.TABS_BAR}-${tabPosition}`]: tabPosition,
[`${cssClasses.TABS_BAR}-collapse`]: collapsible,
});
diff --git a/packages/semi-ui/tabs/TabItem.tsx b/packages/semi-ui/tabs/TabItem.tsx
index ffb74465c4..8c0530b8a8 100644
--- a/packages/semi-ui/tabs/TabItem.tsx
+++ b/packages/semi-ui/tabs/TabItem.tsx
@@ -37,7 +37,7 @@ const TabItem = (props: TabItemProps, ref: LegacyRef) => {
} = props;
const closableIcon = useMemo(() => {
- return (type === 'card' && closable) ?
+ return closable ?
{
+ return (
+ <>
+
+ 文档
+ 快速起步
+ 帮助
+ 关于
+ 资源工具
+
+
+
+
+ 文档} itemKey="1">文档
+ 快速起步} itemKey="2" disabled>快速起步
+ 帮助} itemKey="3">帮助
+
+
+
+ {['文档', "快速起步", "帮助", "关于", "资源工具", "主页"].map((i, index) => (
+
+ Content of card tab {i}
+
+ ))}
+
+ >)
+}
+
export const Level3ButtonTab = () => (
文档
-
+
快速起步
@@ -889,11 +917,35 @@ class TabClosableDemo extends React.Component {
render() {
return (
-
+ <>
+
+
{
- this.state.tabList.map(t=>{t.text})
+ this.state.tabList.map(t=>{t.text})
}
-
+
+
+
+
+ {
+ this.state.tabList.map(t=>{t.text})
+ }
+
+
+
+
+ {
+ this.state.tabList.map(t=>{t.text})
+ }
+
+
+
+
+ {
+ this.state.tabList.map(t=>{t.text})
+ }
+
+ >
);
}
}
@@ -1070,4 +1122,37 @@ export const Fix2415 = () => {
))}
)
-}
\ No newline at end of file
+}
+export const DynamicShowArrow = () => {
+ const [hidden, setHidden] = useState(true);
+ const renderArrow = (items, pos, handleArrowClick, defaultNode) => {
+ const style = { visibility: hidden ? 'hidden': 'visible'};
+ return
+ {defaultNode}
+
+ };
+ const onVisibleTabsChange = useCallback((visibleState) => {
+ let values = Object.values(Object.fromEntries(visibleState));
+ if (values.includes(false)) {
+ setHidden(false);
+ } else {
+ setHidden(true);
+ }
+ }, []);
+ return (
+
+ {[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(i => (
+
+ Content of card tab {i}
+
+ ))}
+
+ );
+};
diff --git a/packages/semi-ui/tabs/index.tsx b/packages/semi-ui/tabs/index.tsx
index 7fc3b89c1f..44c5a1203c 100644
--- a/packages/semi-ui/tabs/index.tsx
+++ b/packages/semi-ui/tabs/index.tsx
@@ -56,6 +56,7 @@ class Tabs extends BaseComponent {
more: PropTypes.oneOfType([PropTypes.number, PropTypes.object]),
arrowPosition: PropTypes.string,
renderArrow: PropTypes.func,
+ dropdownProps: PropTypes.object,
};
static __SemiComponentName__ = "Tabs";
static defaultProps: TabsProps = getDefaultPropsFromGlobalConfig(Tabs.__SemiComponentName__, {
@@ -265,6 +266,7 @@ class Tabs extends BaseComponent {
visibleTabsStyle,
arrowPosition,
renderArrow,
+ dropdownProps,
...restProps
} = this.props;
const { panes, activeKey } = this.state;
@@ -296,7 +298,8 @@ class Tabs extends BaseComponent {
onVisibleTabsChange,
visibleTabsStyle,
arrowPosition,
- renderArrow
+ renderArrow,
+ dropdownProps,
} as TabBarProps;
const tabBar = renderTabBar ? renderTabBar(tabBarProps, TabBar) : ;
diff --git a/packages/semi-ui/tabs/interface.ts b/packages/semi-ui/tabs/interface.ts
index 9057c04cbe..5f68a4aa0c 100644
--- a/packages/semi-ui/tabs/interface.ts
+++ b/packages/semi-ui/tabs/interface.ts
@@ -4,7 +4,7 @@ import TabBar, { OverflowItem } from './TabBar';
import { DropdownProps } from "../dropdown";
import { OverflowListProps } from "../overflowList";
-export type TabType = 'line' | 'card' | 'button';
+export type TabType = 'line' | 'card' | 'button' | 'slash';
export type TabSize = 'small' | 'medium' | 'large';
export type TabPosition = 'top' | 'left';
@@ -16,6 +16,10 @@ export interface PlainTab {
closable?: boolean
}
+interface TabsDropDownProps {
+ start: DropdownProps;
+ end: DropdownProps
+}
export interface TabsProps {
activeKey?: string;
@@ -45,7 +49,8 @@ export interface TabsProps {
onVisibleTabsChange?: TabBarProps["onVisibleTabsChange"];
visibleTabsStyle?: TabBarProps['visibleTabsStyle'];
arrowPosition?: TabBarProps['arrowPosition'];
- renderArrow?: TabBarProps['renderArrow']
+ renderArrow?: TabBarProps['renderArrow'];
+ dropdownProps?: TabsDropDownProps
}
export interface TabBarProps {
@@ -69,8 +74,8 @@ export interface TabBarProps {
onVisibleTabsChange?: (visibleState: Map) => void;
visibleTabsStyle?: CSSProperties;
arrowPosition?: OverflowListProps['overflowRenderDirection'];
- renderArrow?: (items: OverflowItem[], pos: "start"|"end", handleArrowClick: () => void) => ReactNode
-
+ renderArrow?: (items: OverflowItem[], pos: "start"|"end", handleArrowClick: () => void, defaultNode: ReactNode) => ReactNode;
+ dropdownProps?: TabsDropDownProps
}
export interface TabPaneProps {