aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/atoms/forms/fieldset/fieldset.tsx
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2023-09-22 19:34:01 +0200
committerArmand Philippot <git@armandphilippot.com>2023-10-24 12:23:48 +0200
commita6ff5eee45215effb3344cb5d631a27a7c0369aa (patch)
tree5051747acf72318b4fc5c18d603e3757fbefdfdb /src/components/atoms/forms/fieldset/fieldset.tsx
parent651ea4fc992e77d2f36b3c68f8e7a70644246067 (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.tsx68
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);