import * as React from 'react'; import { Icon16Chevron } from '@vkontakte/icons'; import { classNames, hasReactNode } from '@vkontakte/vkjs'; import { type RootComponentProps } from '../RootComponent/RootComponent'; import { Tappable, type TappableOmitProps } from '../Tappable/Tappable'; import { Paragraph } from '../Typography/Paragraph/Paragraph'; import styles from './MiniInfoCell.module.css'; const stylesMode = { add: styles.modeAdd, accent: styles.modeAccent, more: styles.modeMore, }; const stylesTextWrap = { nowrap: styles.textWrapNowrap, full: styles.textWrapFull, short: styles.textWrapShort, }; export interface MiniInfoCellProps extends Pick< TappableOmitProps, 'hoverMode' | 'activeMode' | 'hovered' | 'activated' | 'hasHover' | 'hasActive' >, RootComponentProps { /** * Иконка слева.
* Рекомендуется использовать иконки размера 20. */ before?: React.ReactNode; /** * Содержимое справа.
* `` или ``. */ after?: React.ReactNode; /** * Тип ячейки: * * - `base` – базовая ячейка с серой иконкой и серым текстом.
* В компонент можно передать `Link`, чтобы визуально сделать часть текста ссылкой. * - `add` – тип ячейки, который показывает, что взаимодействие с ней должно вызывать действие добавления чего-то. * - `more` – взаимодействие с такой ячейкой должно открывать какую-то подробную информацию. */ mode?: 'base' | 'accent' | 'add' | 'more'; /** * Тип отображения текста: * * - `nowrap` – в одну строку, текст не переносится и обрезается. * - `short` – максимально отображается 3 строки, остальное обрезается. * - `full` – текст отображается полностью. В дизайне это свойство `multiline`. */ textWrap?: 'nowrap' | 'short' | 'full'; /** * Передавать `true`, если предполагается переход при нажатии на ячейку. */ chevron?: boolean; } /** * @see https://vkui.io/components/mini-info-cell */ export const MiniInfoCell = ({ before, after, children, mode = 'base', textWrap = 'nowrap', chevron = false, ...restProps }: MiniInfoCellProps): React.ReactNode => { const cellClasses = classNames( styles.host, stylesTextWrap[textWrap], mode !== 'base' && stylesMode[mode], ); const cellContent = ( {hasReactNode(before) && {before}}
{children} {chevron && }
{hasReactNode(after) && {after}}
); return ( {cellContent} ); };