{
- tabs = [
- { title: 'Aurum', id: 'tab-1' },
- { title: 'Bercelium', id: 'tab-2' },
- { title: 'Curium', id: 'tab-3' },
- { title: 'Neptunium', id: 'tab-4' },
- { title: 'Plutonuim', id: 'tab-5' },
- { title: 'Rubidium', id: 'tab-6' },
- { title: 'Californium', id: 'tab-7' },
- ];
+ const [selectedId, setSelectedId] = React.useState(TABS[0].id);
- const [selectedId, setSelectedId] = React.useState('tab-1');
- const [title, setTitle] = React.useState('Aurum');
+ const [count, setCount] = React.useState('3');
+ const [overflowType, setOverflowType] = React.useState('scrollable');
const handleChange = (event, { selectedId }) => {
- const currentTab = tabs.filter((tab) => tab.id === selectedId)[0];
setSelectedId(selectedId);
- setTitle(currentTab.title);
};
+ const TabsComponent = overflowType === 'collapsible' ? TabsCollapsible : TabsDesktop;
+
return (
<>
-
-
-
-
-
-
-
-
-
+
+ {TABS.slice(0, Number(count)).map((item) => (
+
+ ))}
+
-
Выбран таб: {title}
+
+ Выбран таб: {TABS.find((tab) => tab.id === selectedId).title}
+
+
+
+
+
+ {
+ setCount(e.target.value);
+ setSelectedId(TABS[0].id);
+ }}
+ >
+
+
+
+
+ setOverflowType(e.target.value)}
+ >
+
+
+
+
>
);
});
//MOBILE
+const TABS = [
+ { title: 'Aurum', id: 'tab-1' },
+ { title: 'Bercelium', id: 'tab-2' },
+ { title: 'Curium', id: 'tab-3' },
+ { title: 'Neptunium', id: 'tab-4' },
+ { title: 'Plutonuim', id: 'tab-5' },
+ { title: 'Rubidium', id: 'tab-6' },
+ { title: 'Californium', id: 'tab-7' },
+ { title: 'Hydrogenium', id: 'tab-8' },
+ { title: 'Helium', id: 'tab-9' },
+ { title: 'Lithium', id: 'tab-10' },
+ { title: 'Beryllium', id: 'tab-11' },
+ { title: 'Borum', id: 'tab-12' },
+ { title: 'Carboneum', id: 'tab-13' },
+ { title: 'Nitrogenium', id: 'tab-14' },
+ { title: 'Oxygenium', id: 'tab-15' },
+];
+
render(() => {
- tabs = [
- { title: 'Aurum', id: 'tab-1' },
- { title: 'Bercelium', id: 'tab-2' },
- { title: 'Curium', id: 'tab-3' },
- { title: 'Neptunium', id: 'tab-4' },
- { title: 'Plutonuim', id: 'tab-5' },
- { title: 'Rubidium', id: 'tab-6' },
- { title: 'Californium', id: 'tab-7' },
- ];
+ const [selectedId, setSelectedId] = React.useState(TABS[0].id);
- const [selectedId, setSelectedId] = React.useState('tab-1');
- const [title, setTitle] = React.useState('Aurum');
+ const [count, setCount] = React.useState('3');
const handleChange = (event, { selectedId }) => {
- const currentTab = tabs.filter((tab) => tab.id === selectedId)[0];
setSelectedId(selectedId);
- setTitle(currentTab.title);
};
return (
<>
-
-
-
-
-
-
-
-
-
-
-
Выбран таб: {title}
- >
- );
-});
-```
-
-## TabsSecondary
-
-Для переключения контента внутри блока рекомендуется использовать второстепенный вид табов.
-Для десктопа рекомендуется использовать S и XS размер табов и XXS размер для мобильной версии интерфейса.
-
-```jsx live
-render(() => {
- tabs = [
- { title: 'Aurum', id: 'tab-1' },
- { title: 'Bercelium', id: 'tab-2' },
- { title: 'Curium', id: 'tab-3' },
- { title: 'Neptunium', id: 'tab-4' },
- { title: 'Plutonuim', id: 'tab-5' },
- { title: 'Rubidium', id: 'tab-6' },
- { title: 'Californium', id: 'tab-7' },
- ];
-
- const [selectSecondaryId, setSelectedSecondaryId] = React.useState('tab-1');
- const [title, setTitle] = React.useState('Aurum');
-
- const handleSecondaryChange = (event, { selectedId }) => {
- const currentTab = tabs.filter((tab) => tab.id === selectedId)[0];
- setSelectedSecondaryId(selectedId);
- setTitle(currentTab.title);
- };
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
Выбран таб: {title}
-
- );
-});
-//MOBILE
-render(() => {
- tabs = [
- { title: 'Aurum', id: 'tab-1' },
- { title: 'Bercelium', id: 'tab-2' },
- { title: 'Curium', id: 'tab-3' },
- { title: 'Neptunium', id: 'tab-4' },
- { title: 'Plutonuim', id: 'tab-5' },
- { title: 'Rubidium', id: 'tab-6' },
- { title: 'Californium', id: 'tab-7' },
- ];
-
- const [selectSecondaryId, setSelectedSecondaryId] = React.useState('tab-1');
- const [title, setTitle] = React.useState('Aurum');
-
- const handleSecondaryChange = (event, { selectedId }) => {
- const currentTab = tabs.filter((tab) => tab.id === selectedId)[0];
- setSelectedSecondaryId(selectedId);
- setTitle(currentTab.title);
- };
-
- return (
-
-
-
-
-
-
-
-
+ {TABS.slice(0, Number(count)).map((item) => (
+
+ ))}
-
Выбран таб: {title}
-
+
+ Выбран таб: {TABS.find((tab) => tab.id === selectedId).title}
+
+
+
+
+
+ {
+ setCount(e.target.value);
+ setSelectedId(TABS[0].id);
+ }}
+ >
+
+
+
+
+ >
);
});
```
-## Переполнение
-
-Если табов больше, чем может отобразиться на экране, можно воспользоваться одной из двух опций, горизонтальный скролл или скрытие табов в кнопку `Eщё`.
-Для второстепенных табов опция Collapsible недоступна.
+При необходимости часть табов можно скрыть в таб Ещё. Данная механика доступна только на десктопных устройствах.
-```jsx live
-const tabs = [
+```jsx live desktopOnly
+const TABS = [
{ title: 'Aurum', id: 'tab-1' },
{ title: 'Bercelium', id: 'tab-2' },
{ title: 'Curium', id: 'tab-3' },
@@ -183,181 +159,186 @@ const tabs = [
{ title: 'Plutonuim', id: 'tab-5' },
{ title: 'Rubidium', id: 'tab-6' },
{ title: 'Californium', id: 'tab-7' },
- { title: 'Einsteinium', id: 'tab-8', rightAddons:
},
- { title: 'Fermium', id: 'tab-9' },
- { title: 'Mendelevium', id: 'tab-10' },
+ { title: 'Hydrogenium', id: 'tab-8' },
+ { title: 'Helium', id: 'tab-9' },
+ { title: 'Lithium', id: 'tab-10' },
+ { title: 'Beryllium', id: 'tab-11' },
+ { title: 'Borum', id: 'tab-12' },
+ { title: 'Carboneum', id: 'tab-13' },
+ { title: 'Nitrogenium', id: 'tab-14' },
+ { title: 'Oxygenium', id: 'tab-15' },
];
+
render(() => {
- const [selectedId, setSelectedId] = React.useState('tab-1');
- const [title, setTitle] = React.useState('Aurum');
- const [view, setView] = React.useState('primary');
- const [overflow, setOverflow] = React.useState('scrollable');
- const [collapsibleTabsIds, setCollapsibleTabsIds] = React.useState({ 'tab-1': true });
+ const [selectedId, setSelectedId] = React.useState(TABS[0].id);
+ const [collapsibleTabsIds, setCollapsibleTabsIds] = React.useState([]);
const handleChange = (event, { selectedId }) => {
- const currentTab = tabs.filter((tab) => tab.id === selectedId)[0];
setSelectedId(selectedId);
- setTitle(currentTab.title);
};
- const handleViewChange = (event, { value }) => setView(value);
- const handleOverflowChange = (event, { value }) => setOverflow(value);
- const handleCollapsedTabsChange = (event, payload) => {
- setCollapsibleTabsIds({ ...collapsibleTabsIds, [payload.name]: payload.checked });
+ const handleCollapsibleChange = (e, { name, checked }) => {
+ if (checked) {
+ setCollapsibleTabsIds((p) => [...p, name]);
+ } else {
+ setCollapsibleTabsIds((p) => p.filter((id) => id !== name));
+ }
};
- const manuallyCollapsedTabs = React.useMemo(() => {
- const v = Object.keys(collapsibleTabsIds).filter((k) => !!collapsibleTabsIds[k]);
- return v.length ? v : undefined;
- }, [collapsibleTabsIds]);
-
return (
-
- {overflow === 'scrollable' ? (
-
- {tabs.map((tab) => (
-
- ))}
-
- ) : (
-
- {tabs.map((tab) => (
-
- ))}
-
- )}
-
-
Выбран таб: {title}
-
+ <>
+
+ {TABS.map((item) => (
+
+ ))}
+
-
-
-
-
-
-
-
-
-
-
- {overflow === 'collapsible' && (
-
- {tabs.map((t) => (
-
- ))}
-
- )}
-
-
-
+
+ Выбран таб: {TABS.find((tab) => tab.id === selectedId).title}
+
+
+
+
+
+ {TABS.slice(4, 7).map((t) => (
+
+ ))}
+
+ >
);
});
-//MOBILE
-const tabs = [
+```
+
+## TabsSecondary
+
+Для переключения контента внутри блока рекомендуется использовать второстепенный вид табов.
+Для десктопа рекомендуется использовать S и XS размер табов и XXS размер для мобильной версии интерфейса.
+
+```jsx live
+const TABS = [
{ title: 'Aurum', id: 'tab-1' },
{ title: 'Bercelium', id: 'tab-2' },
- { title: 'Curium', id: 'tab-3', rightAddons:
},
+ { title: 'Curium', id: 'tab-3' },
{ title: 'Neptunium', id: 'tab-4' },
{ title: 'Plutonuim', id: 'tab-5' },
{ title: 'Rubidium', id: 'tab-6' },
{ title: 'Californium', id: 'tab-7' },
- { title: 'Einsteinium', id: 'tab-8' },
- { title: 'Fermium', id: 'tab-9' },
- { title: 'Mendelevium', id: 'tab-10' },
+ { title: 'Hydrogenium', id: 'tab-8' },
+ { title: 'Helium', id: 'tab-9' },
+ { title: 'Lithium', id: 'tab-10' },
+ { title: 'Beryllium', id: 'tab-11' },
+ { title: 'Borum', id: 'tab-12' },
+ { title: 'Carboneum', id: 'tab-13' },
+ { title: 'Nitrogenium', id: 'tab-14' },
+ { title: 'Oxygenium', id: 'tab-15' },
];
+
+const IS_MOBILE = document.body.clientWidth < 450;
+
render(() => {
- const [selectedId, setSelectedId] = React.useState('tab-1');
- const [title, setTitle] = React.useState('Aurum');
- const [view, setView] = React.useState('primary');
- const [overflow, setOverflow] = React.useState('scrollable');
+ const [selectedId, setSelectedId] = React.useState(TABS[0].id);
+
+ const [count, setCount] = React.useState('3');
+ const [size, setSize] = React.useState(IS_MOBILE ? 'xs' : 's');
+ const [shape, setShape] = React.useState('rounded');
+ const [tagView, setTagView] = React.useState('outlined');
const handleChange = (event, { selectedId }) => {
- const currentTab = tabs.filter((tab) => tab.id === selectedId)[0];
setSelectedId(selectedId);
- setTitle(currentTab.title);
};
- const handleViewChange = (event, { value }) => setView(value);
- const handleOverflowChange = (event, { value }) => setOverflow(value);
return (
-
-
+
- {tabs.map((tab) => (
-
+ {TABS.slice(0, Number(count)).map((item) => (
+
))}
-
-
-
Выбран таб: {title}
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ Выбран таб: {TABS.find((tab) => tab.id === selectedId).title}
+
+
+
+
+
+ {
+ setCount(e.target.value);
+ setSelectedId(TABS[0].id);
+ }}
+ >
+
+
+
+
+ setSize(e.target.value)}
+ >
+ {!IS_MOBILE && }
+
+
+
+
+ setShape(e.target.value)}
+ >
+
+
+
+
+ setTagView(e.target.value)}
+ >
+
+
+
+
+ >
);
});
```
## Анатомия
-С помощью слота `RightAddons` можно кастомизировать тэг. Например, добавить иконку.
+С помощью слота `RightAddons` можно кастомизировать таб. Например, добавить иконку.
```jsx live
render(() => {
@@ -453,8 +434,10 @@ render(() => {
## Состояния
-Таб может находиться в активном и неактивном состоянии. Взаимодействие может быть ограничено с помощью свойства `disabled`.
-Дисейблить активный таб недопустимо.
+Таб может находиться в активном и неактивном состоянии.
+
+Взаимодействие может быть ограничено с помощью свойства `disabled`.
+Допускается ограничивать взаимодействие только с неактивными табами.
```jsx live
render(() => {
diff --git a/packages/tabs/src/typings.ts b/packages/tabs/src/typings.ts
index 9dc3a45517..bfb32e9a68 100644
--- a/packages/tabs/src/typings.ts
+++ b/packages/tabs/src/typings.ts
@@ -85,6 +85,16 @@ export type TabsProps = {
* @default 1024
*/
breakpoint?: number;
+
+ /**
+ * Форма тега (для view secondary только)
+ */
+ tagShape?: TagProps['shape'];
+
+ /**
+ * Стиль тега (для view secondary только)
+ */
+ tagView?: TagProps['view'];
};
export type TabProps = {
@@ -163,6 +173,8 @@ export type TabListProps = Pick<
| 'onChange'
| 'dataTestId'
| 'fullWidthScroll'
+ | 'tagShape'
+ | 'tagView'
> & {
/**
* Заголовки табов
@@ -185,3 +197,7 @@ export type UseTabsProps = TabListProps;
export type Styles = {
styles?: { [key: string]: string };
};
+
+export type PlatformProps = {
+ platform: 'desktop' | 'mobile';
+};