import type { ForwardedRef, HTMLAttributes } from 'react';
import React, { forwardRef, useMemo } from 'react';
import classNames from 'classnames';
import type { SafeExtract, Spacing } from '../../types';
import type { DataListContextType } from './context';
import { DataListContext } from './context';
import { DataListEmpty } from './DataListEmpty';
import { DataListItem } from './DataListItem';
import { DataListSection } from './DataListSection';
/** @inheritdoc */
export interface DataListOwnProps extends Partial {
/**
* Gap space between items.
* @default false
*/
gap?: boolean | SafeExtract;
/**
* If true, eliminates the default paddings by adding negative margins.
* @default false
*/
inset?: boolean;
}
/** @inheritdoc */
export interface DataListProps extends DataListOwnProps, Omit, 'className'> {}
const DEFAULT_DENSE = false;
const DEFAULT_GAP = false;
export function getDataListProps<
P extends DataListOwnProps & {
className?: string;
},
>({ className, dense = DEFAULT_DENSE, gap = DEFAULT_GAP, inset = false, disabled = false, ...rest }: P) {
return {
'data-disabled': disabled === true ? true : undefined,
'aria-disabled': disabled === true ? true : undefined,
...rest,
className: classNames(className, 'dataList', {
'dataList--dense': dense,
'dataList--inset': inset,
['dataList--gap']: gap === true,
['dataList--gapXxs']: gap === 'xxs',
['dataList--gapXs']: gap === 'xs',
['dataList--gapSm']: gap === 'sm',
['dataList--gapMd']: gap === 'md',
['dataList--noGap']: gap === false,
}),
};
}
/**
* DataList component
* **⚠️ INTERNAL UI KIT USE ONLY**
*/
export const DataList = Object.assign(
forwardRef(function DataList(
{ dense = DEFAULT_DENSE, divider = true, disabled = false, gap = DEFAULT_GAP, ...props }: DataListProps,
forwardedRef: ForwardedRef
) {
return (
({ dense, divider, disabled }), [dense, divider, disabled])}>
);
}),
{
Item: DataListItem,
Section: DataListSection,
Empty: DataListEmpty,
}
);