Skip to content

Commit 181ea10

Browse files
authored
feat: input with select and textbox (#2571)
- Adds `select` and `textarea` to #2550 - Part of #2311 - Select chevron adjustments are verified by Lasse
1 parent 20cc30d commit 181ea10

File tree

19 files changed

+340
-667
lines changed

19 files changed

+340
-667
lines changed

.changeset/smooth-wombats-grab.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@digdir/designsystemet-css": patch
3+
"@digdir/designsystemet-react": patch
4+
---
5+
6+
Select + Textarea:
7+
- Remove `label`, `hideLabel`, `description`, `characterLimit` and `error` as these will be part of `Field` API

apps/theme/components/Previews/Components/Components.tsx

+5-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
Fieldset,
1111
Heading,
1212
HelpText,
13+
Label,
1314
Link,
1415
Pagination,
1516
Paragraph,
@@ -95,7 +96,7 @@ export const Components = () => {
9596
</Heading>
9697
<div className={classes.tableHeader}>
9798
<div className={classes.tableAction}>
98-
<Select label='Velg handling' size='sm' hideLabel>
99+
<Select size='sm' aria-label='Velg handling'>
99100
<Select.Option value='blank'>Velg handling</Select.Option>
100101
<Select.Option value='everest'>Dupliser</Select.Option>
101102
<Select.Option value='aconcagua'>Slett</Select.Option>
@@ -299,15 +300,13 @@ export const Components = () => {
299300
<Combobox.Option value='bergen'>Bergen</Combobox.Option>
300301
<Combobox.Option value='moirana'>Mo i Rana</Combobox.Option>
301302
</Combobox>
303+
<Label htmlFor='my-textarea'>Ekstra informasjon</Label>
302304
<Textarea
305+
className={classes.textarea}
303306
cols={40}
307+
id='my-textarea'
304308
rows={3}
305-
description=''
306-
placeholder='Skriv her...'
307-
error=''
308-
label='Ekstra informasjon'
309309
size='sm'
310-
className={classes.textarea}
311310
/>
312311
</div>
313312
<div className={cl(classes.card, classes.tabs)}>

apps/theme/components/ThemeToolbar/ThemeToolbar.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { CssColor } from '@adobe/leonardo-contrast-colors';
2-
import { Button, Select, Tooltip } from '@digdir/designsystemet-react';
2+
import { Button, Label, Select, Tooltip } from '@digdir/designsystemet-react';
33
import type {
44
ColorError,
55
ContrastMode,
@@ -107,8 +107,9 @@ export const ThemeToolbar = ({
107107
/>
108108

109109
<div className={classes.dropdown}>
110+
<Label htmlFor='select-contrast'>Kontrastnivå</Label>
110111
<Select
111-
label='Kontrastnivå'
112+
id='select-contrast'
112113
size='md'
113114
className={classes.contrastSelect}
114115
value={contrastMode}
@@ -121,8 +122,9 @@ export const ThemeToolbar = ({
121122
</Select>
122123
</div>
123124
<div className={classes.borderRadii}>
125+
<Label htmlFor='select-border-radius'>Border radius</Label>
124126
<Select
125-
label='Border radius'
127+
id='select-border-radius'
126128
size='md'
127129
className={classes.borderRadiiSelect}
128130
value={borderRadius}

packages/css/index.css

-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@
1818
@import url('./checkbox.css') layer(ds.components);
1919
@import url('./radio.css') layer(ds.components);
2020
@import url('./search.css') layer(ds.components);
21-
@import url('./select.css') layer(ds.components);
2221
@import url('./textfield.css') layer(ds.components);
2322
@import url('./input.css') layer(ds.components);
24-
@import url('./textarea.css') layer(ds.components);
2523
@import url('./helptext.css') layer(ds.components);
2624
@import url('./modal.css') layer(ds.components);
2725
@import url('./list.css') layer(ds.components);

packages/css/input.css

+34-28
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,34 @@
11
.ds-input {
2-
--dsc-input-border-color--checked: var(--ds-color-accent-base-default);
3-
--dsc-input-border-color--invalid: var(--ds-color-danger-border-default);
4-
--dsc-input-border-color--readonly: var(--ds-color-neutral-border-subtle);
5-
--dsc-input-border-color: var(--ds-color-neutral-border-default);
62
--dsc-input-background--checked: var(--dsc-input-border-color--checked);
73
--dsc-input-background--invalid: var(--dsc-input-border-color--invalid);
84
--dsc-input-background--readonly: var(--ds-color-neutral-background-subtle);
95
--dsc-input-background--switch: var(--ds-color-neutral-border-default);
106
--dsc-input-background: var(--ds-color-neutral-background-default);
7+
--dsc-input-border-color--checked: var(--ds-color-accent-base-default);
8+
--dsc-input-border-color--invalid: var(--ds-color-danger-border-default);
9+
--dsc-input-border-color--readonly: var(--ds-color-neutral-border-subtle);
10+
--dsc-input-border-color: var(--ds-color-neutral-border-default);
1111
--dsc-input-border-width--toggle: 2px;
1212
--dsc-input-border-width: 1px;
1313
--dsc-input-color--checked: var(--ds-color-accent-contrast-default);
1414
--dsc-input-color--invalid: var(--ds-color-danger-contrast-default);
1515
--dsc-input-color--readonly: var(--ds-color-neutral-border-default);
1616
--dsc-input-color: var(--ds-color-neutral-text-default);
17-
--dsc-input-stroke: 0.05em;
1817
--dsc-input-padding: var(--ds-spacing-2) var(--ds-spacing-3);
1918
--dsc-input-size--switch: var(--ds-sizing-7);
2019
--dsc-input-size--toggle: var(--ds-sizing-6);
2120
--dsc-input-size: var(--ds-sizing-12);
21+
--dsc-input-stroke: 0.05em;
2222

2323
/* Checkmark with antialiasing is achieved by percentages 48% / 50% / 52% */
24+
--diagonal-1: transparent calc(50% - var(--dsc-input-stroke));
25+
--diagonal-2: currentcolor calc(48% - var(--dsc-input-stroke));
26+
--diagonal-3: currentcolor calc(50% + var(--dsc-input-stroke));
27+
--diagonal-4: transparent calc(52% + var(--dsc-input-stroke));
2428
--check-left: calc(var(--dsc-input-stroke) / 2) calc(66.66% + var(--dsc-input-stroke) / 2) / 33.33% 33.33% no-repeat content-box
25-
linear-gradient(
26-
45deg,
27-
transparent calc(50% - var(--dsc-input-stroke)),
28-
currentcolor calc(48% - var(--dsc-input-stroke)),
29-
currentcolor calc(50% + var(--dsc-input-stroke)),
30-
transparent calc(52% + var(--dsc-input-stroke))
31-
);
29+
linear-gradient(45deg, var(--diagonal-1), var(--diagonal-2), var(--diagonal-3), var(--diagonal-4));
3230
--check-right: calc(100% - var(--dsc-input-stroke) / 2) / 66.66% 66.66% no-repeat content-box
33-
linear-gradient(
34-
-45deg,
35-
transparent calc(50% - var(--dsc-input-stroke)),
36-
currentcolor calc(48% - var(--dsc-input-stroke)),
37-
currentcolor calc(50% + var(--dsc-input-stroke)),
38-
transparent calc(52% + var(--dsc-input-stroke))
39-
);
31+
linear-gradient(-45deg, var(--diagonal-1), var(--diagonal-2), var(--diagonal-3), var(--diagonal-4));
4032

4133
appearance: none;
4234
background: var(--dsc-input-background);
@@ -46,7 +38,9 @@
4638
box-sizing: border-box;
4739
color: var(--dsc-input-color);
4840
font-family: inherit;
41+
height: var(--dsc-input-size);
4942
margin: 0; /* Reset native margin on checkbox and radio */
43+
max-width: 100%; /* Ensure input does not grow outside bounds even with a high value in size="" or cols="" */
5044
padding: var(--dsc-input-padding);
5145
position: relative; /* Ensure foucs outline renders on top */
5246

@@ -58,21 +52,34 @@
5852
--dsc-input-background: var(--dsc-input-background--switch);
5953
}
6054

61-
&:not(textarea) {
62-
height: var(--dsc-input-size);
55+
&:is(select) {
56+
padding-right: 2.4em;
57+
background: linear-gradient(45deg, var(--diagonal-1), var(--diagonal-2), var(--diagonal-3), var(--diagonal-4)) calc(100% - 1.2em + var(--dsc-input-stroke))
58+
/ 0.4em 0.4em no-repeat, linear-gradient(-45deg, var(--diagonal-1), var(--diagonal-2), var(--diagonal-3), var(--diagonal-4)) calc(100% - 0.8em) / 0.4em
59+
0.4em no-repeat, var(--dsc-input-background);
6360
}
6461

65-
&:not([size]) {
62+
&:is(textarea) {
63+
height: auto; /* Allow rows="" to set height */
64+
min-height: calc(var(--dsc-input-size) * 1.5); /* Set a min-height to indicate this is a <textarea> and not an <input> */
65+
resize: vertical; /* Allow resizing vertically only */
66+
67+
&:not([rows]) {
68+
field-sizing: content;
69+
}
70+
}
71+
72+
&:not([size], [cols], select) {
6673
width: 100%;
6774
}
6875

6976
/**
7077
* States
7178
*/
7279
&:checked,
73-
&:indeterminate {
74-
--dsc-input-border-color: var(--dsc-input-border-color--checked);
80+
&:indeterminate:where([type='checkbox']) {
7581
--dsc-input-background: var(--dsc-input-background--checked);
82+
--dsc-input-border-color: var(--dsc-input-border-color--checked);
7683
--dsc-input-color: var(--dsc-input-color--checked);
7784
}
7885

@@ -83,15 +90,15 @@
8390
}
8491

8592
&[aria-invalid='true'] {
86-
--dsc-input-border-color: var(--dsc-input-border-color--invalid);
8793
--dsc-input-background--checked: var(--dsc-input-background--invalid);
94+
--dsc-input-border-color: var(--dsc-input-border-color--invalid);
8895
--dsc-input-color--checked: var(--dsc-input-color--invalid);
8996
}
9097

9198
/* Using attribute [readonly] since pseudo selector :read-only is always true for checkbox, radio and select */
9299
&[readonly] {
93-
--dsc-input-border-color: var(--dsc-input-border-color--readonly);
94100
--dsc-input-background: var(--dsc-input-background--readonly);
101+
--dsc-input-border-color: var(--dsc-input-border-color--readonly);
95102
--dsc-input-color: var(--dsc-input-color--readonly);
96103
}
97104

@@ -192,13 +199,12 @@ label:has(input:is([type='checkbox'], [type='radio']):not(:disabled, [aria-disab
192199
* Affix
193200
*/
194201
.ds-input-affix {
195-
--dsc-input-affix-border-radius: var(--ds-border-radius-md);
196202
--dsc-input-affix-border: 1px solid var(--ds-color-neutral-border-default);
197203
--dsc-input-affix-padding-inline: var(--ds-spacing-4);
198204

199205
align-items: center;
200206
background: var(--ds-color-neutral-background-subtle);
201-
border-radius: var(--dsc-input-affix-border-radius);
207+
border-radius: var(--ds-border-radius-md);
202208
box-sizing: border-box;
203209
color: var(--ds-color-neutral-text-subtle);
204210
display: inline-flex; /* Using inline-flex to match native inline-block behaviour of <input> */

packages/css/select.css

-106
This file was deleted.

0 commit comments

Comments
 (0)