# Tabs Набор компонентов для создания вкладок. Структура для вкладок похожа на структуру маркированных списков. ## Tabs Props (свойства) для компонента Tabs: [{"name":"clip","type":{"name":"enum","raw":"\"scroll\" | \"showAll\"","value":[{"value":"\"scroll\""},{"value":"\"showAll\""}]}},{"name":"disabled","type":{"name":"boolean"}},{"name":"index","type":{"name":"number"}},{"name":"orientation","type":{"name":"enum","raw":"\"horizontal\" | \"vertical\"","value":[{"value":"\"horizontal\""},{"value":"\"vertical\""}]}},{"name":"hasDivider","type":{"name":"boolean"}},{"name":"stretch","type":{"name":"boolean"}},{"name":"pilled","type":{"name":"boolean"}},{"name":"view","type":{"name":"enum","raw":"\"clear\" | \"filled\" | \"divider\"","value":[{"value":"\"clear\""},{"value":"\"filled\""},{"value":"\"divider\""}]}},{"name":"size","type":{"name":"enum","raw":"\"m\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"s\" | \"l\" | \"xs\"","value":[{"value":"\"m\""},{"value":"\"h1\""},{"value":"\"h2\""},{"value":"\"h3\""},{"value":"\"h4\""},{"value":"\"h5\""},{"value":"\"s\""},{"value":"\"l\""},{"value":"\"xs\""}]}},{"name":"outsideScroll","type":{"name":"boolean | { left?: string; right?: string; } | undefined"}}] ## TabItem Props (свойства) для компонента TabItem: [{"name":"view","type":{"name":"enum","raw":"\"clear\" | \"default\" | \"secondary\" | \"divider\"","value":[{"value":"\"clear\""},{"value":"\"default\""},{"value":"\"secondary\""},{"value":"\"divider\""}]}},{"name":"size","type":{"name":"enum","raw":"\"m\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"s\" | \"l\" | \"xs\"","value":[{"value":"\"m\""},{"value":"\"h1\""},{"value":"\"h2\""},{"value":"\"h3\""},{"value":"\"h4\""},{"value":"\"h5\""},{"value":"\"s\""},{"value":"\"l\""},{"value":"\"xs\""}]}},{"name":"disabled","type":{"name":"boolean"}},{"name":"pilled","type":{"name":"boolean"}},{"name":"truncate","type":{"name":"boolean"}},{"name":"selected","type":{"name":"boolean"}},{"name":"contentRight","type":{"name":"ReactNode"}},{"name":"actionContent","type":{"name":"ReactNode"}},{"name":"onIndexChange","type":{"name":"((index: number) => void)"}},{"name":"itemIndex","type":{"name":"number"}},{"name":"maxItemWidth","type":{"name":"Width"}},{"name":"orientation","type":{"name":"enum","raw":"\"horizontal\" | \"vertical\"","value":[{"value":"\"horizontal\""},{"value":"\"vertical\""}]}},{"name":"contentLeft","type":{"name":"ReactNode"}},{"name":"animated","type":{"name":"boolean"}},{"name":"isActive","type":{"name":"boolean"}},{"name":"value","type":{"name":"string | number"}}] :::caution Взаимоисключающие свойства Свойство `value` - это значение Tab. Оно отображается справа от основного текста. `value` и `contentRight` взаимоисключающие: если передано одно, второе передать нельзя. ::: ## IconTabItem Props (свойства) для компонента IconTabItem: [{"name":"view","type":{"name":"enum","raw":"\"clear\" | \"default\" | \"secondary\" | \"divider\"","value":[{"value":"\"clear\""},{"value":"\"default\""},{"value":"\"secondary\""},{"value":"\"divider\""}]}},{"name":"size","type":{"name":"enum","raw":"\"m\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"s\" | \"l\" | \"xs\"","value":[{"value":"\"m\""},{"value":"\"h1\""},{"value":"\"h2\""},{"value":"\"h3\""},{"value":"\"h4\""},{"value":"\"h5\""},{"value":"\"s\""},{"value":"\"l\""},{"value":"\"xs\""}]}},{"name":"disabled","type":{"name":"boolean"}},{"name":"selected","type":{"name":"boolean"}},{"name":"onIndexChange","type":{"name":"((index: number) => void)"}},{"name":"actionContent","type":{"name":"ReactNode"}},{"name":"itemIndex","type":{"name":"number"}},{"name":"orientation","type":{"name":"enum","raw":"\"horizontal\" | \"vertical\"","value":[{"value":"\"horizontal\""},{"value":"\"vertical\""}]}},{"name":"animated","type":{"name":"boolean"}},{"name":"isActive","type":{"name":"boolean"}}] ## TabsController (deprecated) Вместо этого используйте Tabs, TabItem, указав параметры index, itemIndex, onIndexChange. Props (свойства) для компонента TabsController: [{"name":"items","type":{"name":"({ label: string; } & HorizontalTabItemProps)[]"}},{"name":"index","type":{"name":"number"}},{"name":"onIndexChange","type":{"name":"(index: number) => void"}},{"name":"autoscroll","type":{"name":"boolean"}},{"name":"clip","type":{"name":"enum","raw":"\"scroll\" | \"showAll\"","value":[{"value":"\"scroll\""},{"value":"\"showAll\""}]}},{"name":"disabled","type":{"name":"boolean"}},{"name":"orientation","type":{"name":"enum","raw":"\"horizontal\"","value":[{"value":"\"horizontal\""}]}},{"name":"hasDivider","type":{"name":"boolean"}},{"name":"stretch","type":{"name":"boolean"}},{"name":"pilled","type":{"name":"boolean"}},{"name":"view","type":{"name":"string"}},{"name":"size","type":{"name":"enum","raw":"\"m\" | \"s\" | \"l\" | \"xs\"","value":[{"value":"\"m\""},{"value":"\"s\""},{"value":"\"l\""},{"value":"\"xs\""}]}},{"name":"outsideScroll","type":{"name":"boolean | { left?: string; right?: string; } | undefined"}}] ## Использование ### Стандартное подключение, без клавиатурной навигации ```tsx import React, { useState } from 'react'; import { Tabs, TabItem } from '@salutejs/plasma-web'; import { IconClock } from '@salutejs/plasma-icons'; export function App() { const items = Array(4).fill(0); const [index, setIndex] = useState(0); return (
{items.map((_, i) => ( } onClick={() => setIndex(i)} > {`Label${i + 1}`} ))}
); } ``` ### Пример с прокруткой При выборе таба происходит прокрутка до выбранного таба. ```tsx import React, { useState } from 'react'; import { Tabs, TabItem, Button } from '@salutejs/plasma-web'; import { IconClock } from '@salutejs/plasma-icons'; export function App() { const items = Array(8).fill(0); const [index, setIndex] = useState(0); const specificIndex = 6; return (
{items.map((_, i) => ( } onClick={() => setIndex(i)} > {`Label${i + 1}`} ))}
); } ``` ### Расположение табов Табы могут быть горизонтальными (по умолчанию) и вертикальными. За это отвечает свойство `orientation` . ```tsx import React, { useState } from 'react'; import { Tabs, TabItem, IconTabItem } from '@salutejs/plasma-web'; import { IconClock } from '@salutejs/plasma-icons'; export function App() { const items = Array(8).fill(0); const [index, setIndex] = useState(0); return (
{items.map((_, i) => ( } onClick={() => setIndex(i)} > {`Label${i + 1}`} ))} {items.map((_, i) => ( setIndex(i)} > ))}
); } ``` ### Пример с прокруткой При выборе Tab происходит прокрутка до выбранного TabItem. ```tsx import React, { useState } from 'react'; import { Tabs, TabItem, IconTabItem, Button } from '@salutejs/plasma-web'; import { IconClock } from '@salutejs/plasma-icons'; export function App() { const items = Array(8).fill(0); const [index, setIndex] = useState(0); const specificIndex = 6; return (
{items.map((_, i) => ( } onClick={() => setIndex(i)} > {`Label${i + 1}`} ))} {items.map((_, i) => ( setIndex(i)} > ))}
); } ``` ### Пример с Dropdown ```tsx import React, { useState } from 'react'; import { Tabs, TabItem, Dropdown } from '@salutejs/plasma-web'; import { IconClock } from '@salutejs/plasma-icons'; export function App() { const items = Array(8).fill(0); const [index, setIndex] = useState(0); const maxItemQuantity = 3; const visibleItems = items.slice(0, maxItemQuantity); const otherItems = items.slice(maxItemQuantity); const dropdownItems = otherItems.map((_, i) => { const itemIndex = maxItemQuantity + i; return { label: `Label${itemIndex + 1}`, value: itemIndex, }; }); return (
{visibleItems.map((_, i) => ( setIndex(i)} tabIndex={0} size="xs" > {`Label${i + 1}`} ))} {dropdownItems.length > 0 && (
setIndex(item.value)}> ShowAll
)}
{visibleItems.map((_, i) => ( setIndex(i)} tabIndex={0} size="xs" > ))} {dropdownItems.length > 0 && (
setIndex(item.value)}>
)}
); } ``` ### Слот дополнительного действия в `TabItem` Для задания дополнительного действия используется свойство `actionContent` ```tsx import React, { useState } from 'react'; import { Tabs, TabItem } from '@salutejs/plasma-web'; import { IconClose } from '@salutejs/plasma-icons'; export function App() { const items = Array(4).fill(0); const [index, setIndex] = useState(0); return (
{items.map((_, i) => ( } onClick={() => setIndex(i)} > {`Label${i + 1}`} ))}
); } ``` ### Подключение клавиатурной навигации Для этого необходимо дополнительно прокинуть свойства `index, itemIndex, onIndexChange` . Для горизонтальных табов: клавиши ArrowLeft, ArrowRight, Home, End для навигации по вкладкам. Для вертикальных табов: клавиши ArrowUp, ArrowDown, Home, End для навигации по вкладкам. ```tsx import React, { useState } from 'react'; import { Tabs, TabItem } from '@salutejs/plasma-web'; import { IconClock } from '@salutejs/plasma-icons'; export function App() { const items = Array(4).fill(0); const [horizontalIndex, setHorizontalIndex] = useState(0); const [verticalIndex, setVerticalIndex] = useState(0); return (
{items.map((_, i) => ( setHorizontalIndex(i)} selected={i === horizontalIndex} tabIndex={0} contentLeft={} onClick={() => setHorizontalIndex(i)} > {`Label${i + 1}`} ))}
{items.map((_, i) => ( setVerticalIndex(i)} selected={i === verticalIndex} tabIndex={0} contentLeft={} onClick={() => setVerticalIndex(i)} > {`Label${i + 1}`} ))}
); } ```