import type { ReactNode } from 'react'; import { Badge } from './Badge'; import { decodeHtmlEntities, toElementArray } from './utils'; type FieldValue = string | number | boolean | null | undefined; export interface PropertiesTableRowProps { name: string; type?: FieldValue; default?: FieldValue; required?: boolean; deprecated?: boolean; details?: ReactNode; children?: ReactNode; } export interface PropertiesTableProps { children?: ReactNode; } function displayValue(value: PropertiesTableRowProps['type']): string | undefined { if (typeof value === 'string') { return decodeHtmlEntities(value); } return value === undefined || value === null ? undefined : String(value); } export function PropertiesTable({ children }: PropertiesTableProps) { const rows = toElementArray(children); if (!rows.length) { return null; } // Rendered as a plain table so the .docs-markdown table rules in global.css // style it exactly like a GFM table; only column widths are set here. return (
{rows}
Name Type Description
); } function PropertiesTableRow({ name, type, required, deprecated, default: value, children, details, }: PropertiesTableRowProps) { const defaultValue = displayValue(value); return ( <> {name} {required ? ( required ) : null} {deprecated ? deprecated : null} {displayValue(type)} {children} {defaultValue ? ( Default: {defaultValue} ) : null} {details && ( {details} )} ); } PropertiesTable.Row = PropertiesTableRow;