summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-05-30 19:39:20 +0200
committerArmand Philippot <git@armandphilippot.com>2022-05-31 23:15:11 +0200
commitae384aec5084b9fb9f02166890686a37d1260ef2 (patch)
tree59f2b2d53513e5d69bafa1323f64844dd00be28a /src
parent782cc0a31a866519fb7c3e18a523b347d3e40238 (diff)
chore: add a Fieldset component
Diffstat (limited to 'src')
-rw-r--r--src/components/atoms/forms/fieldset.fixture.tsx2
-rw-r--r--src/components/atoms/forms/fieldset.module.scss28
-rw-r--r--src/components/atoms/forms/fieldset.stories.tsx116
-rw-r--r--src/components/atoms/forms/fieldset.test.tsx11
-rw-r--r--src/components/atoms/forms/fieldset.tsx59
5 files changed, 216 insertions, 0 deletions
diff --git a/src/components/atoms/forms/fieldset.fixture.tsx b/src/components/atoms/forms/fieldset.fixture.tsx
new file mode 100644
index 0000000..b533dfb
--- /dev/null
+++ b/src/components/atoms/forms/fieldset.fixture.tsx
@@ -0,0 +1,2 @@
+export const body = 'doloribus magni aut';
+export const legend = 'maiores autem est';
diff --git a/src/components/atoms/forms/fieldset.module.scss b/src/components/atoms/forms/fieldset.module.scss
new file mode 100644
index 0000000..d1b5956
--- /dev/null
+++ b/src/components/atoms/forms/fieldset.module.scss
@@ -0,0 +1,28 @@
+.wrapper {
+ max-width: 100%;
+ padding: 0;
+ border: none;
+
+ &--inline {
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center;
+
+ .legend {
+ float: left;
+ margin-right: var(--spacing-2xs);
+ }
+ }
+
+ &--stacked {
+ .legend {
+ padding: 0 var(--spacing-xs) 0 0;
+ }
+ }
+}
+
+.legend {
+ color: var(--color-primary-darker);
+ font-size: var(--font-size-md);
+ font-weight: 600;
+}
diff --git a/src/components/atoms/forms/fieldset.stories.tsx b/src/components/atoms/forms/fieldset.stories.tsx
new file mode 100644
index 0000000..0353c13
--- /dev/null
+++ b/src/components/atoms/forms/fieldset.stories.tsx
@@ -0,0 +1,116 @@
+import { ComponentMeta, ComponentStory } from '@storybook/react';
+import FieldsetComponent from './fieldset';
+import { body, legend } from './fieldset.fixture';
+
+/**
+ * Fieldset - Storybook Meta
+ */
+export default {
+ title: 'Atoms/Forms/Fieldset',
+ component: FieldsetComponent,
+ args: {
+ legendPosition: 'stacked',
+ role: 'group',
+ },
+ argTypes: {
+ children: {
+ control: {
+ type: null,
+ },
+ description: 'The fieldset body.',
+ type: {
+ name: 'string',
+ required: true,
+ },
+ },
+ className: {
+ control: {
+ type: 'text',
+ },
+ description: 'Set additional classnames to the fieldset.',
+ table: {
+ category: 'Styles',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
+ legend: {
+ control: {
+ type: 'text',
+ },
+ description: 'The fieldset legend.',
+ type: {
+ name: 'string',
+ required: true,
+ },
+ },
+ legendClassName: {
+ control: {
+ type: 'text',
+ },
+ description: 'Set additional classnames to the legend.',
+ table: {
+ category: 'Styles',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
+ legendPosition: {
+ control: {
+ type: 'select',
+ },
+ description: 'Determine the legend position.',
+ options: ['inline', 'stacked'],
+ table: {
+ category: 'Options',
+ defaultValue: { summary: 'inline' },
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
+ role: {
+ control: {
+ type: 'select',
+ },
+ description: 'An accessible role.',
+ table: {
+ category: 'Accessibility',
+ defaultValue: { summary: 'group' },
+ },
+ options: ['group', 'radiogroup', 'presentation', 'none'],
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
+ },
+} as ComponentMeta<typeof FieldsetComponent>;
+
+const Template: ComponentStory<typeof FieldsetComponent> = (args) => (
+ <FieldsetComponent {...args} />
+);
+
+/**
+ * Fieldset Stories - Stacked legend
+ */
+export const StackedLegend = Template.bind({});
+StackedLegend.args = {
+ children: body,
+ legend: legend,
+};
+
+/**
+ * Fieldset Stories - Inlined legend
+ */
+export const InlinedLegend = Template.bind({});
+InlinedLegend.args = {
+ children: body,
+ legend: legend,
+ legendPosition: 'inline',
+};
diff --git a/src/components/atoms/forms/fieldset.test.tsx b/src/components/atoms/forms/fieldset.test.tsx
new file mode 100644
index 0000000..0f84f83
--- /dev/null
+++ b/src/components/atoms/forms/fieldset.test.tsx
@@ -0,0 +1,11 @@
+import { render, screen } from '@test-utils';
+import Fieldset from './fieldset';
+import { body, legend } from './fieldset.fixture';
+
+describe('Fieldset', () => {
+ it('renders a legend and a body', () => {
+ render(<Fieldset legend={legend}>{body}</Fieldset>);
+ expect(screen.findByRole('group', { name: legend })).toBeInTheDocument();
+ expect(screen.findByText(body)).toBeInTheDocument();
+ });
+});
diff --git a/src/components/atoms/forms/fieldset.tsx b/src/components/atoms/forms/fieldset.tsx
new file mode 100644
index 0000000..99d31e7
--- /dev/null
+++ b/src/components/atoms/forms/fieldset.tsx
@@ -0,0 +1,59 @@
+import { FC, ReactNode } from 'react';
+import styles from './fieldset.module.scss';
+
+export type FieldsetProps = {
+ /**
+ * The fieldset body.
+ */
+ children: ReactNode | ReactNode[];
+ /**
+ * Set additional classnames to the fieldset wrapper.
+ */
+ className?: string;
+ /**
+ * The fieldset legend.
+ */
+ legend: string;
+ /**
+ * Set additional classnames to the legend.
+ */
+ legendClassName?: string;
+ /**
+ * The legend position. Default: stacked.
+ */
+ legendPosition?: 'inline' | 'stacked';
+ /**
+ * An accessible role. Default: group.
+ */
+ role?: 'group' | 'radiogroup' | 'presentation' | 'none';
+};
+
+/**
+ * Fieldset component
+ *
+ * Render a fieldset with a legend.
+ */
+const Fieldset: FC<FieldsetProps> = ({
+ children,
+ className = '',
+ legend,
+ legendClassName = '',
+ legendPosition = 'stacked',
+ ...props
+}) => {
+ const wrapperModifier = `wrapper--${legendPosition}`;
+
+ return (
+ <fieldset
+ className={`${styles.wrapper} ${styles[wrapperModifier]} ${className}`}
+ {...props}
+ >
+ <legend className={`${styles.legend} ${legendClassName}`}>
+ {legend}
+ </legend>
+ {children}
+ </fieldset>
+ );
+};
+
+export default Fieldset;