Skip to content

Commit a13fc28

Browse files
Split out separate Legend component
1 parent 13137fe commit a13fc28

File tree

8 files changed

+77
-55
lines changed

8 files changed

+77
-55
lines changed

src/__tests__/index.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ describe('Index', () => {
3838
'InsetText',
3939
'Label',
4040
'LedeText',
41+
'Legend',
4142
'NavAZ',
4243
'Pagination',
4344
'Panel',

src/components/form-elements/fieldset/Fieldset.tsx

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,9 @@
1-
import React, { FC, HTMLProps, MutableRefObject } from 'react';
1+
import React, { HTMLProps, MutableRefObject } from 'react';
22
import classNames from 'classnames';
3-
import { NHSUKSize } from '@util/types/NHSUKTypes';
4-
import HeadingLevel, { HeadingLevelType } from '@components/utils/HeadingLevel';
5-
import FormGroup from '@components/utils/FormGroup';
3+
import Legend from '../legend/Legend';
4+
import FormGroup from '../../utils/FormGroup';
65

7-
interface LegendProps extends Omit<HTMLProps<HTMLLegendElement>, 'size'> {
8-
isPageHeading?: boolean;
9-
headingLevel?: HeadingLevelType;
10-
size?: NHSUKSize;
11-
}
12-
13-
const Legend: FC<LegendProps> = ({
14-
className,
15-
children,
16-
isPageHeading,
17-
headingLevel = 'h1',
18-
size,
19-
...rest
20-
}) => (
21-
<legend
22-
className={classNames(
23-
'nhsuk-fieldset__legend',
24-
{
25-
'nhsuk-fieldset__legend--xl': isPageHeading && !size,
26-
},
27-
{ [`nhsuk-fieldset__legend--${size}`]: size },
28-
className,
29-
)}
30-
{...rest}
31-
>
32-
{isPageHeading ? (
33-
<HeadingLevel className="nhsuk-fieldset__heading" headingLevel={headingLevel}>
34-
{children}
35-
</HeadingLevel>
36-
) : (
37-
children
38-
)}
39-
</legend>
40-
);
41-
42-
interface FieldsetProps extends HTMLProps<HTMLFieldSetElement> {
6+
export interface FieldsetProps extends HTMLProps<HTMLFieldSetElement> {
437
fieldsetRef?: MutableRefObject<HTMLFieldSetElement | null>;
448
disableErrorLine?: boolean;
459
}

src/components/form-elements/fieldset/__tests__/Fieldset.test.tsx

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,4 @@ describe('Fieldset', () => {
2929

3030
expect(container.firstChild).toHaveClass('nhsuk-form-group');
3131
});
32-
33-
describe('Fieldset.Legend', () => {
34-
it('matches snapshot', () => {
35-
const { container } = render(<Fieldset.Legend>Text</Fieldset.Legend>);
36-
37-
expect(container).toMatchSnapshot('FieldsetLegend');
38-
});
39-
40-
it('renders as page heading', () => {
41-
const { container } = render(<Fieldset.Legend isPageHeading>Text</Fieldset.Legend>);
42-
43-
expect(container.querySelector('.nhsuk-fieldset__legend--xl')).toBeTruthy();
44-
expect(container.querySelector('.nhsuk-fieldset__heading')?.textContent).toBe('Text');
45-
});
46-
});
4732
});
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import React, { FC, HTMLProps } from 'react';
2+
import classNames from 'classnames';
3+
import { NHSUKSize } from '@util/types/NHSUKTypes';
4+
import HeadingLevel, { HeadingLevelType } from '@components/utils/HeadingLevel';
5+
6+
export interface LegendProps extends Omit<HTMLProps<HTMLLegendElement>, 'size'> {
7+
isPageHeading?: boolean;
8+
headingLevel?: HeadingLevelType;
9+
size?: NHSUKSize;
10+
}
11+
12+
const LegendComponent: FC<LegendProps> = ({
13+
className,
14+
children,
15+
isPageHeading,
16+
headingLevel = 'h1',
17+
size,
18+
...rest
19+
}) => (
20+
<legend
21+
className={classNames(
22+
'nhsuk-fieldset__legend',
23+
{
24+
'nhsuk-fieldset__legend--xl': isPageHeading && !size,
25+
},
26+
{ [`nhsuk-fieldset__legend--${size}`]: size },
27+
className,
28+
)}
29+
{...rest}
30+
>
31+
{isPageHeading ? (
32+
<HeadingLevel className="nhsuk-fieldset__heading" headingLevel={headingLevel}>
33+
{children}
34+
</HeadingLevel>
35+
) : (
36+
children
37+
)}
38+
</legend>
39+
);
40+
41+
export default LegendComponent;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import React from 'react';
2+
import { render } from '@testing-library/react';
3+
import Legend from '..';
4+
5+
describe('Legend', () => {
6+
it('matches snapshot', () => {
7+
const { container } = render(<Legend>Text</Legend>);
8+
9+
expect(container).toMatchSnapshot('Legend');
10+
});
11+
12+
it('renders as page heading', () => {
13+
const { container } = render(<Legend isPageHeading>Text</Legend>);
14+
15+
expect(container.querySelector('.nhsuk-fieldset__legend--xl')).toBeTruthy();
16+
expect(container.querySelector('.nhsuk-fieldset__heading')?.textContent).toBe('Text');
17+
});
18+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Legend matches snapshot: Legend 1`] = `
4+
<div>
5+
<legend
6+
class="nhsuk-fieldset__legend"
7+
>
8+
Text
9+
</legend>
10+
</div>
11+
`;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './Legend';

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export { default as Form, useFormContext } from './components/form-elements/form
1717
export { default as Header } from './components/navigation/header';
1818
export { default as Hero } from './components/content-presentation/hero';
1919
export { default as HintText } from './components/form-elements/hint-text';
20+
export { default as Legend } from './components/form-elements/legend';
2021
export {
2122
ArrowLeft as ArrowLeftIcon,
2223
ArrowRight as ArrowRightIcon,

0 commit comments

Comments
 (0)