Skip to content

Commit 7320765

Browse files
eirikbackermimarz
andcommitted
feat: relative sizing (#2541)
Work on #2508 Minor adjustments will be done in #2665 --------- Co-authored-by: Michael Marszalek <mimarz@gmail.com>
1 parent 7106da8 commit 7320765

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1431
-904
lines changed

.changeset/fair-beds-destroy.md

+6
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+
CSS: base sizing on font-size so all components can have all sizes, and naturally inherits size from context

packages/css/accordion.css

+8-7
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
--dsc-accordion-heading-background--hover: var(--ds-color-neutral-surface-default);
99
--dsc-accordion-heading-background--open: var(--ds-color-neutral-background-subtle);
1010
--dsc-accordion-heading-background: var(--ds-color-neutral-background-default);
11-
--dsc-accordion-padding: var(--ds-spacing-4);
11+
--dsc-accordion-padding: var(--ds-spacing-2) var(--ds-spacing-4);
12+
--dsc-accordion-size: var(--ds-sizing-14);
1213

1314
&[data-border] > * {
1415
border: var(--dsc-accordion-border);
@@ -65,16 +66,18 @@
6566
box-sizing: border-box;
6667

6768
& > :is(summary, u-summary) {
69+
align-items: center;
6870
background: var(--dsc-accordion-heading-background);
6971
box-sizing: border-box;
7072
cursor: pointer;
73+
display: flex;
7174
list-style: none;
75+
min-height: var(--dsc-accordion-size);
76+
gap: var(--dsc-accordion-chevron-gap);
7277
outline: none;
73-
padding-block: var(--dsc-accordion-padding);
74-
padding-inline: calc(var(--dsc-accordion-padding) + var(--dsc-accordion-chevron-size) + var(--dsc-accordion-chevron-gap)) var(--dsc-accordion-padding);
78+
padding: var(--dsc-accordion-padding);
7579

7680
@composes ds-focus from './base/base.css';
77-
@composes ds-body-text--sm from './base/base.css';
7881

7982
&:focus-visible {
8083
position: relative; /* Ensure foucs outline renders on top */
@@ -84,11 +87,9 @@
8487
background: currentcolor;
8588
border-radius: var(--ds-border-radius-md);
8689
content: '';
90+
flex-shrink: 0;
8791
height: var(--dsc-accordion-chevron-size);
8892
mask: 50% / contain no-repeat var(--dsc-accordion-chevron-url);
89-
position: absolute;
90-
margin-inline: calc((var(--dsc-accordion-chevron-size) + var(--dsc-accordion-chevron-gap)) * -1); /* Using margin instead of top/left to avoid position: relative and to support dir="rtl" */
91-
9293
width: var(--dsc-accordion-chevron-size);
9394
}
9495
}

packages/css/alert.css

-19
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
padding-inline: calc(var(--dsc-alert-padding) + var(--dsc-alert-icon-size) + var(--dsc-alert-gap)) var(--dsc-alert-padding);
1919
position: relative;
2020

21-
@composes ds-body-text--md from './base/base.css';
22-
2321
& > :is(h1, h2, h3, h4, h5, h6):first-child::before /* If Alert starts with Heading, align icon to this */,
2422
&:not(:has(> :is(h1, h2, h3, h4, h5, h6):first-child))::before /* If there is no Heading, align icon to Alert itself */ {
2523
background: var(--dsc-alert-icon-color);
@@ -55,21 +53,4 @@
5553
--dsc-alert-icon-color: var(--ds-color-danger-text-subtle);
5654
--dsc-alert-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill-rule='evenodd' d='M7.74 2.47a.75.75 0 0 1 .53-.22h7.46a.75.75 0 0 1 .53.22l5.27 5.27c.14.14.22.33.22.53v7.46a.75.75 0 0 1-.22.53l-5.27 5.27a.75.75 0 0 1-.53.22H8.27a.75.75 0 0 1-.53-.22l-5.27-5.27a.75.75 0 0 1-.22-.53V8.27a.75.75 0 0 1 .22-.53zm1.29 5.5a.75.75 0 0 0-1.06 1.06L10.94 12l-2.97 2.97a.75.75 0 1 0 1.06 1.06L12 13.06l2.97 2.97a.75.75 0 1 0 1.06-1.06L13.06 12l2.97-2.97a.75.75 0 0 0-1.06-1.06L12 10.94z'/%3E%3C/svg%3E");
5755
}
58-
59-
/**
60-
* Sizes
61-
*/
62-
&[data-size='sm'] {
63-
--dsc-alert-icon-size: var(--ds-sizing-6);
64-
--dsc-alert-padding: var(--ds-spacing-5);
65-
66-
@composes ds-body-text--sm from './base/base.css';
67-
}
68-
69-
&[data-size='lg'] {
70-
--dsc-alert-icon-size: var(--ds-sizing-8);
71-
--dsc-alert-padding: var(--ds-spacing-7);
72-
73-
@composes ds-body-text--lg from './base/base.css';
74-
}
7556
}

packages/css/avatar.css

+3-15
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@
1212
box-sizing: border-box;
1313
color: var(--dsc-avatar-color);
1414
display: inline-flex;
15+
font-weight: var(--ds-font-weight-medium);
1516
height: var(--dsc-avatar-size);
1617
justify-content: center;
1718
overflow: hidden;
1819
text-decoration: none;
1920
text-transform: uppercase;
2021
user-select: none;
2122

22-
@composes ds-body-text--xs from './base/base.css';
23-
2423
&:not(:has(> img)) {
2524
padding: var(--dsc-avatar-padding);
2625
}
@@ -79,31 +78,20 @@
7978
--dsc-avatar-color: var(--ds-color-brand3-contrast-default);
8079
}
8180

81+
/* TODO: Sizes */
8282
&[data-size='xs'] {
83-
--dsc-avatar-size: var(--ds-sizing-7);
84-
--dsc-avatar-padding: var(--ds-spacing-1);
85-
86-
@composes ds-body-text--xs from './base/base.css';
83+
font-size: var(--ds-body-xs-font-size);
8784
}
8885

8986
&[data-size='sm'] {
90-
--dsc-avatar-size: var(--ds-sizing-9);
91-
--dsc-avatar-padding: var(--ds-spacing-1);
92-
9387
@composes ds-heading-text--2xs from './base/base.css';
9488
}
9589

9690
&[data-size='md'] {
97-
--dsc-avatar-size: var(--ds-sizing-12);
98-
--dsc-avatar-padding: var(--ds-spacing-2);
99-
10091
@composes ds-heading-text--sm from './base/base.css';
10192
}
10293

10394
&[data-size='lg'] {
104-
--dsc-avatar-size: var(--ds-sizing-15);
105-
--dsc-avatar-padding: var(--ds-spacing-2);
106-
10795
@composes ds-heading-text--md from './base/base.css';
10896
}
10997
}

packages/css/badge.css

+3-22
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66

77
box-sizing: border-box;
88
display: inline-flex;
9+
line-height: var(--ds-line-height-sm);
910
position: relative;
1011

11-
@composes ds-body-text--short-sm from './base/base.css';
12-
1312
&::before {
1413
content: attr(data-count);
1514
background: var(--dsc-badge-background);
@@ -23,26 +22,8 @@
2322
place-items: center;
2423
}
2524

26-
&[data-size='sm'] {
27-
--dsc-badge-size: var(--ds-sizing-3);
28-
--dsc-badge-padding: 0 var(--ds-spacing-1);
29-
30-
@composes ds-body-text--short-xs from './base/base.css';
31-
32-
&[data-count] {
33-
--dsc-badge-size: var(--ds-sizing-5);
34-
}
35-
}
36-
37-
&[data-size='lg'] {
38-
--dsc-badge-size: var(--ds-sizing-4);
39-
--dsc-badge-padding: 0 var(--ds-spacing-2);
40-
41-
@composes ds-body-text--short-md from './base/base.css';
42-
43-
&[data-count] {
44-
--dsc-badge-size: var(--ds-sizing-7);
45-
}
25+
&:not([data-size]) {
26+
font-size: var(--ds-font-size-minus-1); /* Default to small when size is not defined */
4627
}
4728

4829
&[data-color='info'] {

packages/css/base/base.css

+17-77
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@
1717
--dsc-focus-border-width: 3px; /* Default focus border width */
1818
--dsc-focus-boxShadow: 0 0 0 var(--dsc-focus-border-width) var(--ds-color-focus-inner);
1919
--dsc-focus-outline: var(--ds-color-focus-outer) solid var(--dsc-focus-border-width);
20+
--ds-font-size-minus-1: max(.9em, .875rem); /* Default to 90% of font-size, but minimum 14px */
21+
--ds-font-size-plus-1: 1.1em; /* Default to 110% */
22+
23+
/* font-size adjustments if supporting round() */
24+
@supports (width: round(down, .1em, 1px)) {
25+
--ds-font-size-minus-1: round(down, max(.9em, .875rem), 0.0625rem); /* Default to 90% of font-size, but minimum 14px */
26+
--ds-font-size-plus-1: round(down, 1.1em, 0.0625rem); /* Default to 110% */
27+
}
2028

2129
color: var(--ds-color-neutral-text-default);
2230
background-color: var(--ds-color-neutral-background-default);
@@ -42,114 +50,44 @@
4250
outline-offset: var(--dsc-focus-border-width);
4351
}
4452

45-
/** Body typography */
46-
.ds-body-text--xs {
53+
[data-size='xs'] {
4754
font-weight: var(--ds-body-xs-font-weight);
4855
line-height: var(--ds-body-xs-line-height);
4956
font-size: var(--ds-body-xs-font-size);
5057
letter-spacing: var(--ds-body-xs-letter-spacing);
5158
}
5259

53-
.ds-body-text--sm {
60+
[data-size='sm'] {
5461
font-weight: var(--ds-body-sm-font-weight);
5562
line-height: var(--ds-body-sm-line-height);
5663
font-size: var(--ds-body-sm-font-size);
5764
letter-spacing: var(--ds-body-sm-letter-spacing);
5865
}
5966

60-
.ds-body-text--md {
67+
/* Setting default font on <body> not :root/<html> to ensure 1rem is still 16px */
68+
body,
69+
[data-size='md'] {
6170
font-weight: var(--ds-body-md-font-weight);
6271
line-height: var(--ds-body-md-line-height);
6372
font-size: var(--ds-body-md-font-size);
6473
letter-spacing: var(--ds-body-md-letter-spacing);
6574
}
6675

67-
.ds-body-text--lg {
76+
[data-size='lg'] {
6877
font-weight: var(--ds-body-lg-font-weight);
6978
line-height: var(--ds-body-lg-line-height);
7079
font-size: var(--ds-body-lg-font-size);
7180
letter-spacing: var(--ds-body-lg-letter-spacing);
7281
}
7382

74-
.ds-body-text--xl {
83+
[data-size='xl'] {
7584
font-weight: var(--ds-body-xl-font-weight);
7685
line-height: var(--ds-body-xl-line-height);
7786
font-size: var(--ds-body-xl-font-size);
7887
letter-spacing: var(--ds-body-xl-letter-spacing);
7988
}
8089

81-
.ds-body-text--long-xs {
82-
font-weight: var(--ds-body-long-xs-font-weight);
83-
line-height: var(--ds-body-long-xs-line-height);
84-
font-size: var(--ds-body-long-xs-font-size);
85-
letter-spacing: var(--ds-body-long-xs-letter-spacing);
86-
}
87-
88-
.ds-body-text--long-sm {
89-
font-weight: var(--ds-body-long-sm-font-weight);
90-
line-height: var(--ds-body-long-sm-line-height);
91-
font-size: var(--ds-body-long-sm-font-size);
92-
letter-spacing: var(--ds-body-long-sm-letter-spacing);
93-
}
94-
95-
.ds-body-text--long-md {
96-
font-weight: var(--ds-body-long-md-font-weight);
97-
line-height: var(--ds-body-long-md-line-height);
98-
font-size: var(--ds-body-long-md-font-size);
99-
letter-spacing: var(--ds-body-long-md-letter-spacing);
100-
}
101-
102-
.ds-body-text--long-lg {
103-
font-weight: var(--ds-body-long-lg-font-weight);
104-
line-height: var(--ds-body-long-lg-line-height);
105-
font-size: var(--ds-body-long-lg-font-size);
106-
letter-spacing: var(--ds-body-long-lg-letter-spacing);
107-
}
108-
109-
.ds-body-text--long-xl {
110-
font-weight: var(--ds-body-long-xl-font-weight);
111-
line-height: var(--ds-body-long-xl-line-height);
112-
font-size: var(--ds-body-long-xl-font-size);
113-
letter-spacing: var(--ds-body-long-xl-letter-spacing);
114-
}
115-
116-
.ds-body-text--short-xs {
117-
font-weight: var(--ds-body-short-xs-font-weight);
118-
line-height: var(--ds-body-short-xs-line-height);
119-
font-size: var(--ds-body-short-xs-font-size);
120-
letter-spacing: var(--ds-body-short-xs-letter-spacing);
121-
}
122-
123-
.ds-body-text--short-sm {
124-
font-weight: var(--ds-body-short-sm-font-weight);
125-
line-height: var(--ds-body-short-sm-line-height);
126-
font-size: var(--ds-body-short-sm-font-size);
127-
letter-spacing: var(--ds-body-short-sm-letter-spacing);
128-
}
129-
130-
.ds-body-text--short-md {
131-
font-weight: var(--ds-body-short-md-font-weight);
132-
line-height: var(--ds-body-short-md-line-height);
133-
font-size: var(--ds-body-short-md-font-size);
134-
letter-spacing: var(--ds-body-short-md-letter-spacing);
135-
}
136-
137-
.ds-body-text--short-lg {
138-
font-weight: var(--ds-body-short-lg-font-weight);
139-
line-height: var(--ds-body-short-lg-line-height);
140-
font-size: var(--ds-body-short-lg-font-size);
141-
letter-spacing: var(--ds-body-short-lg-letter-spacing);
142-
}
143-
144-
.ds-body-text--short-xl {
145-
font-weight: var(--ds-body-short-xl-font-weight);
146-
line-height: var(--ds-body-short-xl-line-height);
147-
font-size: var(--ds-body-short-xl-font-size);
148-
letter-spacing: var(--ds-body-short-xl-letter-spacing);
149-
}
150-
15190
/** Heading */
152-
15391
.ds-heading-text--2xs {
15492
font-weight: var(--ds-heading-2xs-font-weight);
15593
line-height: var(--ds-heading-2xs-line-height);
@@ -199,6 +137,7 @@
199137
letter-spacing: var(--ds-heading-2xl-letter-spacing);
200138
}
201139

140+
/* TODO: Maybe remove label sizes after sync with design */
202141
.ds-label--md {
203142
font-size: var(--ds-label-md-font-size);
204143
font-weight: var(--ds-label-md-font-weight);
@@ -227,6 +166,7 @@
227166
letter-spacing: var(--ds-label-lg-letter-spacing);
228167
}
229168

169+
/* TODO: Maybe remove validation sizes after sync with design */
230170
.ds-validation-message--xs {
231171
font-weight: var(--ds-validation-message-xs-font-weight);
232172
line-height: var(--ds-validation-message-xs-line-height);

packages/css/breadcrumbs.css

-16
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,6 @@
33
--dsc-breadcrumbs-chevron-size: var(--ds-sizing-6);
44
--dsc-breadcrumbs-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24'%3E%3Cpath d='M9.47 5.97a.75.75 0 0 1 1.06 0l5.5 5.5a.75.75 0 0 1 0 1.06l-5.5 5.5a.75.75 0 1 1-1.06-1.06L14.44 12 9.47 7.03a.75.75 0 0 1 0-1.06'/%3E%3C/svg%3E");
55

6-
@composes ds-body-text--md from './base/base.css';
7-
8-
&[data-size='sm'] {
9-
--dsc-breadcrumbs-spacing: var(--ds-spacing-1);
10-
--dsc-breadcrumbs-chevron-size: var(--ds-sizing-5);
11-
12-
@composes ds-body-text--sm from './base/base.css';
13-
}
14-
15-
&[data-size='lg'] {
16-
--dsc-breadcrumbs-spacing: var(--ds-spacing-3);
17-
--dsc-breadcrumbs-chevron-size: var(--ds-sizing-7);
18-
19-
@composes ds-body-text--lg from './base/base.css';
20-
}
21-
226
& > :is(ol, ul) {
237
display: flex;
248
flex-wrap: wrap;

0 commit comments

Comments
 (0)