Skip to content

Commit d3229a0

Browse files
authored
fix(Fieldset): css alignments (#2447)
Part of #2295
1 parent ed179a1 commit d3229a0

File tree

4 files changed

+59
-101
lines changed

4 files changed

+59
-101
lines changed

.changeset/three-ducks-chew.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@digdir/designsystemet-css": patch
3+
"@digdir/designsystemet-react": patch
4+
---
5+
6+
Fieldset: Style using css attributes

packages/css/fieldset.css

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,44 @@
11
.ds-fieldset {
2+
--dsc-fieldset-icon-size: 1.2em;
3+
--dsc-fieldset-gap: var(--ds-spacing-2);
4+
25
margin: 0;
36
padding: 0;
47
border: 0;
58
min-width: 0;
6-
}
7-
8-
.ds-fieldset--spacing {
9-
display: flex;
10-
flex-direction: column;
11-
gap: var(--ds-spacing-2);
12-
}
13-
14-
.ds-fieldset__description {
15-
color: var(--ds-color-neutral-text-subtle);
16-
margin-bottom: var(--ds-spacing-2);
17-
}
18-
19-
.ds-fieldset__legend {
20-
display: contents;
21-
}
22-
23-
.ds-fieldset--readonly .ds-fieldset__legend__content {
24-
display: inline-flex;
25-
}
26-
27-
.ds-fieldset:not(:has(.ds-fieldset__description)) .ds-fieldset__legend__content {
28-
margin-bottom: var(--ds-spacing-2);
29-
}
30-
31-
.ds-fieldset--readonly .ds-fieldset__readonly__icon {
32-
height: 1.2em;
33-
width: 1.2em;
34-
}
35-
36-
.ds-fieldset:disabled .ds-fieldset__legend,
37-
.ds-fieldset:disabled .ds-fieldset__description {
38-
color: var(--ds-color-neutral-border-subtle);
39-
}
409

41-
.ds-fieldset__error-message {
42-
display: contents;
10+
& > :not(:last-child) {
11+
margin-bottom: var(--ds-spacing-2); /* Use margin as fieldset does not play nice with display: flex */
12+
}
13+
14+
& > legend {
15+
display: inline-flex;
16+
}
17+
18+
& > legend:empty {
19+
display: none;
20+
}
21+
22+
&[data-hidelegend] > legend,
23+
&[data-hidelegend] > legend + p {
24+
@composes ds-sr-only from '../css/utilities.css';
25+
}
26+
27+
&[data-readonly] > legend::before {
28+
content: '';
29+
background: currentcolor;
30+
height: var(--dsc-fieldset-icon-size);
31+
mask: center/contain no-repeat
32+
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' viewBox='0 0 24 24'%3E%3Cpath fill-rule='evenodd' d='M12 2.25A4.75 4.75 0 0 0 7.25 7v2.25H7A1.75 1.75 0 0 0 5.25 11v9c0 .41.34.75.75.75h12a.75.75 0 0 0 .75-.75v-9A1.75 1.75 0 0 0 17 9.25h-.25V7A4.75 4.75 0 0 0 12 2.25m3.25 7V7a3.25 3.25 0 0 0-6.5 0v2.25zM12 13a1.5 1.5 0 0 0-.75 2.8V17a.75.75 0 0 0 1.5 0v-1.2A1.5 1.5 0 0 0 12 13'/%3E%3C/svg%3E");
33+
width: var(--dsc-fieldset-icon-size);
34+
}
35+
36+
& > legend + p {
37+
color: var(--ds-color-neutral-text-subtle);
38+
}
39+
40+
&:disabled > legend,
41+
&:disabled > legend + p {
42+
color: var(--ds-color-neutral-border-subtle);
43+
}
4344
}
Lines changed: 16 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
import { PadlockLockedFillIcon } from '@navikt/aksel-icons';
21
import cl from 'clsx/lite';
32
import type { FieldsetHTMLAttributes, ReactNode } from 'react';
43
import { forwardRef, useContext } from 'react';
54

65
import { ErrorMessage, Label, Paragraph } from '../../Typography';
7-
import type { FormFieldProps } from '../useFormField';
6+
import { type FormFieldProps, useFormField } from '../useFormField';
87

98
import { FieldsetContext } from './FieldsetContext';
10-
import { useFieldset } from './useFieldset';
119

1210
export type FieldsetProps = {
1311
/** A description of the fieldset. This will appear below the legend. */
@@ -27,7 +25,7 @@ export type FieldsetProps = {
2725
FieldsetHTMLAttributes<HTMLFieldSetElement>;
2826

2927
export const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(
30-
(props, ref) => {
28+
function Fieldset(props, ref) {
3129
const {
3230
children,
3331
legend,
@@ -38,71 +36,43 @@ export const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(
3836
...rest
3937
} = props;
4038

41-
const { fieldsetProps, size, readOnly, errorId, hasError, descriptionId } =
42-
useFieldset(props);
43-
4439
const fieldset = useContext(FieldsetContext);
40+
const { inputProps, size, readOnly, errorId, hasError, descriptionId } =
41+
useFormField(props, 'fieldset');
4542

4643
return (
4744
<FieldsetContext.Provider
4845
value={{
46+
disabled: props?.disabled,
4947
error: error ?? fieldset?.error,
5048
errorId: hasError ? errorId : undefined,
51-
size,
52-
disabled: props?.disabled,
5349
readOnly,
50+
size,
5451
}}
5552
>
5653
<fieldset
57-
{...fieldsetProps}
58-
className={cl(
59-
'ds-fieldset',
60-
!hideLegend && 'ds-fieldset--spacing',
61-
readOnly && 'ds-fieldset--readonly',
62-
className,
63-
)}
54+
aria-describedby={inputProps['aria-describedby']}
55+
aria-invalid={inputProps['aria-invalid']}
56+
className={cl('ds-fieldset', className)}
57+
data-hidelegend={hideLegend || undefined}
58+
data-readonly={readOnly || undefined}
6459
disabled={props?.disabled}
6560
ref={ref}
6661
{...rest}
6762
>
6863
<Label asChild size={size}>
69-
<legend className={'ds-fieldset__legend'}>
70-
<span
71-
className={cl(
72-
'ds-fieldset__legend__content',
73-
hideLegend && `ds-sr-only`,
74-
)}
75-
>
76-
{readOnly && (
77-
<PadlockLockedFillIcon
78-
className={'ds-fieldset__readonly__icon'}
79-
aria-hidden
80-
/>
81-
)}
82-
{legend}
83-
</span>
84-
</legend>
64+
<legend>{legend}</legend>
8565
</Label>
86-
{description && (
87-
<Paragraph size={size} variant='short' asChild>
88-
<div
89-
id={descriptionId}
90-
className={cl(
91-
'ds-fieldset__description',
92-
'ds-font-weight--regular',
93-
hideLegend && `ds-sr-only`,
94-
)}
95-
>
96-
{description}
97-
</div>
66+
{!!description && (
67+
<Paragraph id={descriptionId} size={size} variant='short'>
68+
{description}
9869
</Paragraph>
9970
)}
10071
{children}
10172
<div
102-
id={errorId}
10373
aria-live='polite'
10474
aria-relevant='additions removals'
105-
className={'ds-fieldset__error-message'}
75+
id={errorId}
10676
>
10777
{hasError && <ErrorMessage size={size}>{error}</ErrorMessage>}
10878
</div>
@@ -111,5 +81,3 @@ export const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(
11181
);
11282
},
11383
);
114-
115-
Fieldset.displayName = 'Fieldset';

packages/react/src/components/form/Fieldset/useFieldset.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)