import type { CSSProperties } from 'react'; import { useEffect } from 'react'; import { AlignGroup, useBBoxObserver } from 'react-d3-utils'; import { usePlotContext, usePlotDispatchContext, } from '../contexts/plotContext.js'; import type { VerticalPosition } from '../types.js'; export interface HeadingProps { title: string; titleStyle?: CSSProperties; titleClass?: string; subtitle?: string; subtitleStyle?: CSSProperties; subtitleClass?: string; position?: VerticalPosition; } export function Heading({ title, titleStyle, titleClass, subtitle, subtitleStyle, subtitleClass, position = 'top', }: HeadingProps) { const { width, height } = usePlotContext(); const dispatch = usePlotDispatchContext(); const defaultTitleStyle: CSSProperties = { dominantBaseline: 'hanging', textAnchor: 'middle', fontSize: '16px', fontWeight: 'bold', }; const defaultSubtitleStyle: CSSProperties = { dominantBaseline: 'hanging', textAnchor: 'middle', fontSize: '14px', color: 'gray', }; const headingBbox = useBBoxObserver(); useEffect(() => { dispatch({ type: 'addHeading', payload: { position } }); // Delete information on unmount return () => dispatch({ type: 'removeHeading' }); }, [dispatch, position]); return ( {title} {subtitle && ( {subtitle} )} ); }