import * as React from 'react'; import { classNames, hasReactNode } from '@vkontakte/vkjs'; import { mergeStyle } from '../../helpers/mergeStyle'; import type { CSSCustomProperties, HasRef, HasRootRef, LiteralUnion } from '../../types'; import { Avatar } from '../Avatar/Avatar'; import { Tappable, type TappableOmitProps } from '../Tappable/Tappable'; import { Caption } from '../Typography/Caption/Caption'; import { Footnote } from '../Typography/Footnote/Footnote'; import { Subhead } from '../Typography/Subhead/Subhead'; import styles from './HorizontalCell.module.css'; export const CUSTOM_CSS_TOKEN_FOR_CELL_WIDTH = '--vkui_internal--cell_width'; const stylesSize = { s: styles.sizeS, m: styles.sizeM, l: styles.sizeL, xl: styles.sizeXL, auto: styles.sizeAuto, }; const textAlignClassNames = { center: styles.textAlignCenter, end: styles.textAlignEnd, }; type HorizontalCellSizes = 's' | 'm' | 'l' | 'xl' | 'auto'; export interface HorizontalCellProps extends Omit, HasRootRef, HasRef { /** * Ширина компонента. * * Значения `'s' | 'm' | 'l' | 'xl'` определяются дизайн-системой. * Значение `auto` позволяет задать динамическую ширину, определяемую контентом. * Пользовательскую ширину можно задать через числовое значение. */ size?: LiteralUnion; /** * Заголовок. */ title?: React.ReactNode; /** * Дополнительная строка текста под `children`. */ subtitle?: React.ReactNode; /** * Дополнительная строка текста под `children` и `subtitle`. */ extraSubtitle?: React.ReactNode; /** * Задает выравнивание типографики. По умолчанию `center` для `size=s`, иначе `start`. */ textAlign?: 'start' | 'center' | 'end'; /** * Отключает формирование отступов у крайних элементов. * * Актуально для использования в многострочных списках. */ noPadding?: boolean; /** * Позволяет передать типографический компонент, используемый для `title`. * По умолчанию `Caption` для `size=s`, иначе `Subhead`. */ TitleComponent?: React.ElementType; } /** * @see https://vkui.io/components/horizontal-cell */ export const HorizontalCell = ({ className, title, style, subtitle, size = 's', children = , getRootRef, getRef, extraSubtitle, textAlign = size === 's' ? 'center' : 'start', noPadding = false, TitleComponent = size === 's' ? Caption : Subhead, ...restProps }: HorizontalCellProps): React.ReactNode => { const hasTypography = hasReactNode(title) || hasReactNode(subtitle) || hasReactNode(extraSubtitle); const customProperties: CSSCustomProperties | undefined = typeof size === 'number' ? { [CUSTOM_CSS_TOKEN_FOR_CELL_WIDTH]: `${size}px` } : undefined; return (
{hasReactNode(children) &&
{children}
} {hasTypography && (
{hasReactNode(title) && {title}} {hasReactNode(subtitle) && {subtitle}} {hasReactNode(extraSubtitle) && ( {extraSubtitle} )}
)}
); };