diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-09-22 19:34:01 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-10-24 12:23:48 +0200 |
| commit | a6ff5eee45215effb3344cb5d631a27a7c0369aa (patch) | |
| tree | 5051747acf72318b4fc5c18d603e3757fbefdfdb /src/components/atoms/forms/fieldset/fieldset.tsx | |
| parent | 651ea4fc992e77d2f36b3c68f8e7a70644246067 (diff) | |
refactor(components): rewrite form components
Diffstat (limited to 'src/components/atoms/forms/fieldset/fieldset.tsx')
| -rw-r--r-- | src/components/atoms/forms/fieldset/fieldset.tsx | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/components/atoms/forms/fieldset/fieldset.tsx b/src/components/atoms/forms/fieldset/fieldset.tsx new file mode 100644 index 0000000..eb42961 --- /dev/null +++ b/src/components/atoms/forms/fieldset/fieldset.tsx @@ -0,0 +1,68 @@ +import { + forwardRef, + type FieldsetHTMLAttributes, + ForwardRefRenderFunction, + ReactElement, +} from 'react'; +import styles from './fieldset.module.scss'; +import { LegendProps } from '../legend'; + +export type FieldsetProps = Omit< + FieldsetHTMLAttributes<HTMLFieldSetElement>, + 'disabled' | 'hidden' +> & { + /** + * Should the fieldset be disabled? + * + * @default false + */ + isDisabled?: boolean; + /** + * Should the fieldset contents be inlined? + * + * @default false + */ + isInline?: boolean; + /** + * The fieldset legend. + */ + legend?: ReactElement<LegendProps>; +}; + +/** + * Fieldset component. + */ +const FieldsetWithRef: ForwardRefRenderFunction< + HTMLFieldSetElement, + FieldsetProps +> = ( + { + children, + className = '', + isDisabled = false, + isInline = false, + legend, + ...props + }, + ref +) => { + const layoutModifier = isInline + ? styles['fieldset--inline'] + : styles['fieldset--stack']; + const legendModifier = legend ? styles['fieldset--has-legend'] : ''; + const fieldsetClass = `${styles.fieldset} ${legendModifier} ${layoutModifier} ${className}`; + + return ( + <fieldset + {...props} + className={fieldsetClass} + disabled={isDisabled} + ref={ref} + > + {legend} + {children} + </fieldset> + ); +}; + +export const Fieldset = forwardRef(FieldsetWithRef); |
