/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ import type { ReactNode, FC } from 'react'; import { createContext, useId } from 'react'; import { A11yLiveRegion } from 'mastodon/components/a11y_live_region'; import type { FieldStatus } from 'mastodon/components/callout_inline'; import { CalloutInline } from 'mastodon/components/callout_inline'; import classes from './fieldset.module.scss'; import { getFieldStatus } from './form_field_wrapper'; import formFieldWrapperClasses from './form_field_wrapper.module.scss'; interface FieldsetProps { legend: ReactNode; hint?: ReactNode; name?: string; status?: FieldStatus | FieldStatus['variant']; layout?: 'vertical' | 'horizontal'; children: ReactNode; } export const FieldsetNameContext = createContext(undefined); /** * A fieldset suitable for wrapping a group of checkboxes, * radio buttons, or other grouped form controls. */ export const Fieldset: FC = ({ legend, hint, name, status, layout, children, }) => { const uniqueId = useId(); const labelId = `${uniqueId}-label`; const hintId = `${uniqueId}-hint`; const statusId = `${uniqueId}-status`; const fieldsetName = name || `${uniqueId}-fieldset-name`; const hasHint = !!hint; const fieldStatus = getFieldStatus(status); const hasStatusMessage = !!fieldStatus?.message; const descriptionIds = [ hasHint ? hintId : '', hasStatusMessage ? statusId : '', ] .filter((id) => !!id) .join(' '); return (
{legend}
{hasHint && (

{hint}

)}
{children}
{/* Live region must be rendered even when empty */} {hasStatusMessage && }
); };