diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-05-30 19:39:20 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-05-31 23:15:11 +0200 |
| commit | ae384aec5084b9fb9f02166890686a37d1260ef2 (patch) | |
| tree | 59f2b2d53513e5d69bafa1323f64844dd00be28a /src | |
| parent | 782cc0a31a866519fb7c3e18a523b347d3e40238 (diff) | |
chore: add a Fieldset component
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/atoms/forms/fieldset.fixture.tsx | 2 | ||||
| -rw-r--r-- | src/components/atoms/forms/fieldset.module.scss | 28 | ||||
| -rw-r--r-- | src/components/atoms/forms/fieldset.stories.tsx | 116 | ||||
| -rw-r--r-- | src/components/atoms/forms/fieldset.test.tsx | 11 | ||||
| -rw-r--r-- | src/components/atoms/forms/fieldset.tsx | 59 |
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; |
