@digdir/designsystemet-css 1.0.0-next.34 → 1.0.0-next.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +4 -3
  2. package/accordion.css +62 -52
  3. package/alert.css +23 -37
  4. package/avatar.css +31 -57
  5. package/badge.css +16 -43
  6. package/breadcrumbs.css +5 -15
  7. package/button.css +54 -102
  8. package/card.css +91 -161
  9. package/chip.css +85 -151
  10. package/combobox.css +22 -16
  11. package/dist/accordion.css +1 -1
  12. package/dist/alert.css +1 -1
  13. package/dist/avatar.css +1 -1
  14. package/dist/badge.css +1 -1
  15. package/dist/breadcrumbs.css +1 -1
  16. package/dist/button.css +1 -1
  17. package/dist/card.css +1 -1
  18. package/dist/chip.css +1 -1
  19. package/dist/combobox.css +1 -1
  20. package/dist/divider.css +1 -1
  21. package/dist/dropdown.css +1 -1
  22. package/dist/error-summary.css +1 -1
  23. package/dist/field.css +1 -0
  24. package/dist/fieldset.css +1 -1
  25. package/dist/heading.css +1 -0
  26. package/dist/helptext.css +1 -1
  27. package/dist/index.css +1 -1
  28. package/dist/input.css +1 -0
  29. package/dist/label.css +1 -0
  30. package/dist/link.css +1 -1
  31. package/dist/list.css +1 -1
  32. package/dist/modal.css +1 -1
  33. package/dist/pagination.css +1 -1
  34. package/dist/paragraph.css +1 -0
  35. package/dist/popover.css +1 -1
  36. package/dist/search.css +1 -1
  37. package/dist/skeleton.css +1 -1
  38. package/dist/skiplink.css +1 -1
  39. package/dist/spinner.css +1 -1
  40. package/dist/table.css +1 -1
  41. package/dist/tabs.css +1 -1
  42. package/dist/tag.css +1 -1
  43. package/dist/textfield.css +1 -1
  44. package/dist/togglegroup.css +1 -1
  45. package/dist/tooltip.css +1 -1
  46. package/dist/validation-message.css +1 -0
  47. package/divider.css +2 -1
  48. package/dropdown.css +24 -24
  49. package/error-summary.css +6 -3
  50. package/field.css +124 -0
  51. package/fieldset.css +10 -28
  52. package/heading.css +55 -0
  53. package/helptext.css +3 -14
  54. package/index.css +114 -10
  55. package/input.css +186 -0
  56. package/label.css +30 -0
  57. package/link.css +18 -12
  58. package/list.css +8 -16
  59. package/modal.css +53 -77
  60. package/package.json +1 -1
  61. package/pagination.css +28 -33
  62. package/paragraph.css +11 -0
  63. package/popover.css +14 -28
  64. package/search.css +82 -153
  65. package/skeleton.css +18 -8
  66. package/skiplink.css +12 -12
  67. package/spinner.css +20 -21
  68. package/table.css +23 -21
  69. package/tabs.css +27 -27
  70. package/tag.css +8 -47
  71. package/textfield.css +2 -2
  72. package/togglegroup.css +6 -1
  73. package/tooltip.css +21 -6
  74. package/validation-message.css +25 -0
  75. package/checkbox.css +0 -223
  76. package/dist/checkbox.css +0 -1
  77. package/dist/radio.css +0 -1
  78. package/dist/select.css +0 -1
  79. package/dist/switch.css +0 -1
  80. package/dist/textarea.css +0 -1
  81. package/dist/utilities.css +0 -1
  82. package/radio.css +0 -200
  83. package/select.css +0 -106
  84. package/switch.css +0 -246
  85. package/textarea.css +0 -80
  86. package/utilities.css +0 -41
package/index.css CHANGED
@@ -1,23 +1,22 @@
1
- @charset "UTF-8";
1
+ @charset 'UTF-8';
2
2
 
3
- @layer ds.reset, ds.theme, ds.base, ds.components;
3
+ @layer ds.base, ds.typography, ds.theme, ds.components;
4
4
 
5
5
  /** Import order defines ordinal specificity for layers */
6
- @import url('./baseline/ds-reset.css') layer(ds.reset);
7
- @import url('./baseline/typography.css') layer(ds.base.typography);
8
- @import url('./utilities.css') layer(ds.base.utilities);
6
+ @import url('./base/base.css') layer(ds.base);
7
+ @import url('./heading.css') layer(ds.typography);
8
+ @import url('./label.css') layer(ds.typography);
9
+ @import url('./paragraph.css') layer(ds.typography);
10
+ @import url('./validation-message.css') layer(ds.typography);
9
11
  @import url('./button.css') layer(ds.components);
12
+ @import url('./field.css') layer(ds.components);
13
+ @import url('./input.css') layer(ds.components);
10
14
  @import url('./alert.css') layer(ds.components);
11
15
  @import url('./popover.css') layer(ds.components);
12
16
  @import url('./skiplink.css') layer(ds.components);
13
17
  @import url('./accordion.css') layer(ds.components);
14
- @import url('./switch.css') layer(ds.components);
15
- @import url('./checkbox.css') layer(ds.components);
16
- @import url('./radio.css') layer(ds.components);
17
18
  @import url('./search.css') layer(ds.components);
18
- @import url('./select.css') layer(ds.components);
19
19
  @import url('./textfield.css') layer(ds.components);
20
- @import url('./textarea.css') layer(ds.components);
21
20
  @import url('./helptext.css') layer(ds.components);
22
21
  @import url('./modal.css') layer(ds.components);
23
22
  @import url('./list.css') layer(ds.components);
@@ -40,3 +39,108 @@
40
39
  @import url('./breadcrumbs.css') layer(ds.components);
41
40
  @import url('./badge.css') layer(ds.components);
42
41
  @import url('./avatar.css') layer(ds.components);
42
+
43
+ /* TODO: Will move to tokens as part of #2508 */
44
+ :root {
45
+ --ds-sizing-base: 18; /* Unitless base font-size 18px */
46
+ --ds-sizing-step: 4; /* Unitless step size 4px */
47
+ --ds-sizing-scale: var(--ds-sizing-step) / var(--ds-sizing-base);
48
+
49
+ /* Sizing when not supporting round() */
50
+ --ds-sizing-1: calc(var(--ds-sizing-scale) * 1em);
51
+ --ds-sizing-2: calc(var(--ds-sizing-scale) * 2em);
52
+ --ds-sizing-3: calc(var(--ds-sizing-scale) * 3em);
53
+ --ds-sizing-4: calc(var(--ds-sizing-scale) * 4em);
54
+ --ds-sizing-5: calc(var(--ds-sizing-scale) * 5em);
55
+ --ds-sizing-6: calc(var(--ds-sizing-scale) * 6em);
56
+ --ds-sizing-7: calc(var(--ds-sizing-scale) * 7em);
57
+ --ds-sizing-8: calc(var(--ds-sizing-scale) * 8em);
58
+ --ds-sizing-9: calc(var(--ds-sizing-scale) * 9em);
59
+ --ds-sizing-10: calc(var(--ds-sizing-scale) * 10em);
60
+ --ds-sizing-11: calc(var(--ds-sizing-scale) * 11em);
61
+ --ds-sizing-12: calc(var(--ds-sizing-scale) * 12em);
62
+ --ds-sizing-13: calc(var(--ds-sizing-scale) * 13em);
63
+ --ds-sizing-14: calc(var(--ds-sizing-scale) * 14em);
64
+ --ds-sizing-15: calc(var(--ds-sizing-scale) * 15em);
65
+ --ds-sizing-16: calc(var(--ds-sizing-scale) * 16em);
66
+ --ds-sizing-17: calc(var(--ds-sizing-scale) * 17em);
67
+ --ds-sizing-18: calc(var(--ds-sizing-scale) * 18em);
68
+ --ds-sizing-19: calc(var(--ds-sizing-scale) * 19em);
69
+ --ds-sizing-20: calc(var(--ds-sizing-scale) * 20em);
70
+ --ds-sizing-21: calc(var(--ds-sizing-scale) * 21em);
71
+ --ds-sizing-22: calc(var(--ds-sizing-scale) * 22em);
72
+ --ds-sizing-23: calc(var(--ds-sizing-scale) * 23em);
73
+ --ds-sizing-24: calc(var(--ds-sizing-scale) * 24em);
74
+ --ds-sizing-25: calc(var(--ds-sizing-scale) * 25em);
75
+ --ds-sizing-26: calc(var(--ds-sizing-scale) * 26em);
76
+ --ds-sizing-27: calc(var(--ds-sizing-scale) * 27em);
77
+ --ds-sizing-28: calc(var(--ds-sizing-scale) * 28em);
78
+ --ds-sizing-29: calc(var(--ds-sizing-scale) * 29em);
79
+ --ds-sizing-30: calc(var(--ds-sizing-scale) * 30em);
80
+
81
+ /* Sizing when supporting round() */
82
+ @supports (width: round(down, .1em, 1px)) {
83
+ --ds-sizing-1: round(down, calc(var(--ds-sizing-scale) * 1em), 0.0625rem);
84
+ --ds-sizing-2: round(down, calc(var(--ds-sizing-scale) * 2em), 0.0625rem);
85
+ --ds-sizing-3: round(down, calc(var(--ds-sizing-scale) * 3em), 0.0625rem);
86
+ --ds-sizing-4: round(down, calc(var(--ds-sizing-scale) * 4em), 0.0625rem);
87
+ --ds-sizing-5: round(down, calc(var(--ds-sizing-scale) * 5em), 0.0625rem);
88
+ --ds-sizing-6: round(down, calc(var(--ds-sizing-scale) * 6em), 0.0625rem);
89
+ --ds-sizing-7: round(down, calc(var(--ds-sizing-scale) * 7em), 0.0625rem);
90
+ --ds-sizing-8: round(down, calc(var(--ds-sizing-scale) * 8em), 0.0625rem);
91
+ --ds-sizing-9: round(down, calc(var(--ds-sizing-scale) * 9em), 0.0625rem);
92
+ --ds-sizing-10: round(down, calc(var(--ds-sizing-scale) * 10em), 0.0625rem);
93
+ --ds-sizing-11: round(down, calc(var(--ds-sizing-scale) * 11em), 0.0625rem);
94
+ --ds-sizing-12: round(down, calc(var(--ds-sizing-scale) * 12em), 0.0625rem);
95
+ --ds-sizing-13: round(down, calc(var(--ds-sizing-scale) * 13em), 0.0625rem);
96
+ --ds-sizing-14: round(down, calc(var(--ds-sizing-scale) * 14em), 0.0625rem);
97
+ --ds-sizing-15: round(down, calc(var(--ds-sizing-scale) * 15em), 0.0625rem);
98
+ --ds-sizing-16: round(down, calc(var(--ds-sizing-scale) * 16em), 0.0625rem);
99
+ --ds-sizing-17: round(down, calc(var(--ds-sizing-scale) * 17em), 0.0625rem);
100
+ --ds-sizing-18: round(down, calc(var(--ds-sizing-scale) * 18em), 0.0625rem);
101
+ --ds-sizing-19: round(down, calc(var(--ds-sizing-scale) * 19em), 0.0625rem);
102
+ --ds-sizing-20: round(down, calc(var(--ds-sizing-scale) * 20em), 0.0625rem);
103
+ --ds-sizing-21: round(down, calc(var(--ds-sizing-scale) * 21em), 0.0625rem);
104
+ --ds-sizing-22: round(down, calc(var(--ds-sizing-scale) * 22em), 0.0625rem);
105
+ --ds-sizing-23: round(down, calc(var(--ds-sizing-scale) * 23em), 0.0625rem);
106
+ --ds-sizing-24: round(down, calc(var(--ds-sizing-scale) * 24em), 0.0625rem);
107
+ --ds-sizing-25: round(down, calc(var(--ds-sizing-scale) * 25em), 0.0625rem);
108
+ --ds-sizing-26: round(down, calc(var(--ds-sizing-scale) * 26em), 0.0625rem);
109
+ --ds-sizing-27: round(down, calc(var(--ds-sizing-scale) * 27em), 0.0625rem);
110
+ --ds-sizing-28: round(down, calc(var(--ds-sizing-scale) * 28em), 0.0625rem);
111
+ --ds-sizing-29: round(down, calc(var(--ds-sizing-scale) * 29em), 0.0625rem);
112
+ --ds-sizing-30: round(down, calc(var(--ds-sizing-scale) * 30em), 0.0625rem);
113
+ }
114
+
115
+ /* Spacing */
116
+ --ds-spacing-1: var(--ds-sizing-1);
117
+ --ds-spacing-2: var(--ds-sizing-2);
118
+ --ds-spacing-3: var(--ds-sizing-3);
119
+ --ds-spacing-4: var(--ds-sizing-4);
120
+ --ds-spacing-5: var(--ds-sizing-5);
121
+ --ds-spacing-6: var(--ds-sizing-6);
122
+ --ds-spacing-7: var(--ds-sizing-7);
123
+ --ds-spacing-8: var(--ds-sizing-8);
124
+ --ds-spacing-9: var(--ds-sizing-9);
125
+ --ds-spacing-10: var(--ds-sizing-10);
126
+ --ds-spacing-11: var(--ds-sizing-11);
127
+ --ds-spacing-12: var(--ds-sizing-12);
128
+ --ds-spacing-13: var(--ds-sizing-13);
129
+ --ds-spacing-14: var(--ds-sizing-14);
130
+ --ds-spacing-15: var(--ds-sizing-15);
131
+ --ds-spacing-16: var(--ds-sizing-16);
132
+ --ds-spacing-17: var(--ds-sizing-17);
133
+ --ds-spacing-18: var(--ds-sizing-18);
134
+ --ds-spacing-19: var(--ds-sizing-19);
135
+ --ds-spacing-20: var(--ds-sizing-20);
136
+ --ds-spacing-21: var(--ds-sizing-21);
137
+ --ds-spacing-22: var(--ds-sizing-22);
138
+ --ds-spacing-23: var(--ds-sizing-23);
139
+ --ds-spacing-24: var(--ds-sizing-24);
140
+ --ds-spacing-25: var(--ds-sizing-25);
141
+ --ds-spacing-26: var(--ds-sizing-26);
142
+ --ds-spacing-27: var(--ds-sizing-27);
143
+ --ds-spacing-28: var(--ds-sizing-28);
144
+ --ds-spacing-29: var(--ds-sizing-29);
145
+ --ds-spacing-30: var(--ds-sizing-30);
146
+ }
package/input.css ADDED
@@ -0,0 +1,186 @@
1
+ .ds-input {
2
+ --dsc-input-background--checked: var(--dsc-input-border-color--checked);
3
+ --dsc-input-background--invalid: var(--dsc-input-border-color--invalid);
4
+ --dsc-input-background--readonly: var(--ds-color-neutral-background-subtle);
5
+ --dsc-input-background--switch: var(--ds-color-neutral-border-default);
6
+ --dsc-input-background: var(--ds-color-neutral-background-default);
7
+ --dsc-input-border-color--checked: var(--ds-color-base-default);
8
+ --dsc-input-border-color--invalid: var(--ds-color-danger-border-strong);
9
+ --dsc-input-border-color--readonly: var(--ds-color-neutral-border-subtle);
10
+ --dsc-input-border-color: var(--ds-color-neutral-border-default);
11
+ --dsc-input-border-width--toggle: max(1px, calc(var(--ds-spacing-1) / 2)); /* Allow border-width to grow with font-size */
12
+ --dsc-input-border-width: 1px;
13
+ --dsc-input-color--checked: var(--ds-color-contrast-default);
14
+ --dsc-input-color--invalid: var(--ds-color-danger-contrast-default);
15
+ --dsc-input-color--readonly: var(--ds-color-neutral-text-subtle);
16
+ --dsc-input-color: var(--ds-color-neutral-text-default);
17
+ --dsc-input-padding: var(--ds-spacing-2) var(--ds-spacing-3);
18
+ --dsc-input-size--switch: var(--ds-sizing-7);
19
+ --dsc-input-size--toggle: var(--ds-sizing-6);
20
+ --dsc-input-size: var(--ds-sizing-12);
21
+ --dsc-input-stroke: 0.055em;
22
+
23
+ /* Checkmark with antialiasing is achieved by percentages 48% / 50% / 52% */
24
+ --diagonal-1: transparent calc(48% - var(--dsc-input-stroke));
25
+ --diagonal-2: currentcolor calc(50% - var(--dsc-input-stroke));
26
+ --diagonal-3: currentcolor calc(50% + var(--dsc-input-stroke));
27
+ --diagonal-4: transparent calc(52% + var(--dsc-input-stroke));
28
+ --check-left: 10% 73% / 35% 35% no-repeat content-box linear-gradient(45deg, var(--diagonal-1), var(--diagonal-2), var(--diagonal-3), var(--diagonal-4));
29
+ --check-right: 90% 50% / 65% 65% no-repeat content-box linear-gradient(-45deg, var(--diagonal-1), var(--diagonal-2), var(--diagonal-3), var(--diagonal-4));
30
+
31
+ appearance: none;
32
+ background: var(--dsc-input-background);
33
+ border-radius: var(--ds-border-radius-md);
34
+ border: var(--dsc-input-border-width) solid var(--dsc-input-border-color); /* Inherit from .ds-input-addons if present */
35
+ box-shadow: var(--dsc-input-box-shadow);
36
+ box-sizing: border-box;
37
+ color: var(--dsc-input-color);
38
+ font-family: inherit;
39
+ height: var(--dsc-input-size);
40
+ line-height: inherit;
41
+ margin: 0; /* Reset native margin on checkbox and radio */
42
+ max-width: 100%; /* Ensure input does not grow outside bounds even with a high value in size="" or cols="" */
43
+ min-width: 0; /* Allow shrinking in flex container, see https://ishadeed.com/article/min-max-css/#setting-min-width-to-zero-with-flexbox */
44
+ padding: var(--dsc-input-padding);
45
+ position: relative; /* Ensure foucs outline renders on top */
46
+
47
+ @composes ds-focus from './base/base.css';
48
+
49
+ /* Round border-width up to nearest 1px if supported */
50
+ @supports (width: round(down, .1em, 1px)) {
51
+ border-width: round(up, var(--dsc-input-border-width), 0.0625rem);
52
+ }
53
+
54
+ &:not([data-size]) {
55
+ font-size: inherit; /* Ensure inheriting font-size */
56
+ }
57
+
58
+ /* Change switch background with low specificity to allow states to overwrite */
59
+ &:where([role='switch']) {
60
+ --dsc-input-background: var(--dsc-input-background--switch);
61
+ }
62
+
63
+ &:is(select) {
64
+ padding-right: 2.4em;
65
+ background: linear-gradient(45deg, var(--diagonal-1), var(--diagonal-2), var(--diagonal-3), var(--diagonal-4)) calc(100% - 1.2em + var(--dsc-input-stroke))
66
+ / 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
67
+ 0.4em no-repeat, var(--dsc-input-background);
68
+ }
69
+
70
+ &:is(textarea) {
71
+ height: auto; /* Allow rows="" to set height */
72
+ min-height: calc(var(--dsc-input-size) * 1.5); /* Set a min-height to indicate this is a <textarea> and not an <input> */
73
+ resize: vertical; /* Allow resizing vertically only */
74
+
75
+ &:not([rows]) {
76
+ field-sizing: content;
77
+ }
78
+ }
79
+
80
+ &:not([size], [cols], select) {
81
+ width: 100%;
82
+ }
83
+
84
+ /**
85
+ * States
86
+ */
87
+ &:checked,
88
+ &:indeterminate:where([type='checkbox']) {
89
+ --dsc-input-background: var(--dsc-input-background--checked);
90
+ --dsc-input-border-color: var(--dsc-input-border-color--checked);
91
+ --dsc-input-color: var(--dsc-input-color--checked);
92
+ }
93
+
94
+ &:disabled,
95
+ &[aria-disabled='true'] {
96
+ cursor: not-allowed;
97
+ opacity: var(--ds-disabled-opacity);
98
+ }
99
+
100
+ &[aria-invalid='true'] {
101
+ --dsc-input-background--checked: var(--dsc-input-background--invalid);
102
+ --dsc-input-border-color: var(--dsc-input-border-color--invalid);
103
+ --dsc-input-color--checked: var(--dsc-input-color--invalid);
104
+ }
105
+
106
+ /* Using attribute [readonly] since pseudo selector :read-only is always true for checkbox, radio and select */
107
+ &[readonly] {
108
+ --dsc-input-background: var(--dsc-input-background--readonly);
109
+ --dsc-input-border-color: var(--dsc-input-border-color--readonly);
110
+ --dsc-input-color: var(--dsc-input-color--readonly);
111
+ }
112
+
113
+ /**
114
+ * Toggle inputs and select
115
+ */
116
+ &:read-only:not([readonly], [aria-disabled='true'], :disabled) {
117
+ cursor: pointer;
118
+ }
119
+
120
+ /**
121
+ * Toggle inputs
122
+ */
123
+ &[type='checkbox'],
124
+ &[type='radio'] {
125
+ --dsc-input-border-width: var(--dsc-input-border-width--toggle);
126
+ --dsc-input-padding: calc(var(--ds-sizing-1) / 2);
127
+ --dsc-input-size: var(--dsc-input-size--toggle);
128
+
129
+ flex-shrink: 0; /* Never shrink a toggle input */
130
+ line-height: inherit; /* Inherit line height so we can use 1lh to align with first line of label */
131
+ width: var(--dsc-input-size);
132
+
133
+ &:not([aria-label]) {
134
+ translate: 0 calc((1lh - var(--dsc-input-size)) / 2); /* Align with first line of <label> text, but not if having aria-label as <label> */
135
+ }
136
+ }
137
+
138
+ &[type='radio'] {
139
+ border-radius: var(--ds-border-radius-full);
140
+ }
141
+
142
+ &[type='radio']:checked {
143
+ background: radial-gradient(circle closest-side, currentcolor 45%, transparent 50%), var(--dsc-input-background);
144
+ }
145
+
146
+ &[type='checkbox']:checked {
147
+ background: var(--check-left), var(--check-right), var(--dsc-input-background);
148
+ }
149
+
150
+ &[type='checkbox']:indeterminate {
151
+ background: center / contain no-repeat content-box
152
+ linear-gradient(
153
+ transparent calc(48% - var(--dsc-input-stroke)),
154
+ currentcolor calc(50% - var(--dsc-input-stroke)),
155
+ currentcolor calc(50% + var(--dsc-input-stroke)),
156
+ transparent calc(52% + var(--dsc-input-stroke))
157
+ ), var(--dsc-input-background);
158
+ }
159
+
160
+ /**
161
+ * Switch
162
+ */
163
+ &[role='switch']:is([type='radio'], [type='checkbox']) {
164
+ --dsc-input-color: transparent; /* Hide checkmark */
165
+ --dsc-input-padding: var(--ds-sizing-1);
166
+ --dsc-input-size: var(--dsc-input-size--switch);
167
+ --circle-color: var(--dsc-input-color--checked);
168
+ --circle-position: left;
169
+
170
+ border-radius: var(--ds-border-radius-full);
171
+ padding-left: var(--dsc-input-size); /* Push checkmark to right side */
172
+ transition: 0.2s background-position;
173
+ width: calc((var(--dsc-input-size) - var(--dsc-input-border-width)) * 2); /* Subtract border-width to make background-image math correct */
174
+ background: var(--check-left), var(--check-right), radial-gradient(circle closest-side, var(--circle-color) 95%, transparent 100%) var(--circle-position) /
175
+ 50% 100% no-repeat padding-box, var(--dsc-input-background);
176
+
177
+ &:checked {
178
+ --dsc-input-color: var(--dsc-input-border-color);
179
+ --circle-position: right;
180
+ }
181
+
182
+ &[readonly] {
183
+ --circle-color: var(--dsc-input-color--readonly);
184
+ }
185
+ }
186
+ }
package/label.css ADDED
@@ -0,0 +1,30 @@
1
+ .ds-label {
2
+ --dsc-label--readonly: initial; /* Using technique https://css-tricks.com/the-css-custom-property-toggle-trick/ */
3
+ --dsc-label-icon-url: 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");
4
+ --dsc-label-icon-size: 1.2em;
5
+ --dsc-label-gap: var(--ds-spacing-1);
6
+
7
+ font-weight: var(--ds-font-weight-medium);
8
+ padding-inline-start: var(--dsc-label--readonly) calc(var(--dsc-label-icon-size) + var(--dsc-label-gap));
9
+ position: relative;
10
+
11
+ &::before {
12
+ background: currentcolor;
13
+ content: var(--dsc-label--readonly) '';
14
+ display: inline-block;
15
+ height: var(--dsc-label-icon-size);
16
+ margin-inline: calc((var(--dsc-label-icon-size) + var(--dsc-label-gap)) * -1); /* Using margin instead of top/left to avoid position: relative and to support dir="rtl" */
17
+ mask: center / contain no-repeat var(--dsc-label-icon-url);
18
+ position: absolute;
19
+ width: var(--dsc-label-icon-size);
20
+ translate: 0 calc((1lh - var(--dsc-label-icon-size)) / 2); /* Center icon to line height */
21
+ }
22
+
23
+ &[data-weight='semibold'] {
24
+ font-weight: var(--ds-font-weight-semibold);
25
+ }
26
+
27
+ &[data-weight='regular'] {
28
+ font-weight: var(--ds-font-weight-regular);
29
+ }
30
+ }
package/link.css CHANGED
@@ -1,38 +1,44 @@
1
1
  .ds-link {
2
+ /* default color: accent */
2
3
  --dsc-link-background--active: var(--ds-color-accent-surface-default);
3
- --dsc-link-background--focus: var(--ds-color-focus-outer);
4
4
  --dsc-link-color--active: var(--ds-color-accent-text-default);
5
- --dsc-link-color--focus: var(--ds-color-focus-inner);
6
5
  --dsc-link-color--hover: var(--ds-color-accent-text-default);
7
- --dsc-link-color--visited: var(--ds-global-purple-12);
8
6
  --dsc-link-color: var(--ds-color-accent-text-subtle);
9
- --dsc-link-text-decoration-thickness--hover: max(2px, 0.125rem, 0.12em);
10
- --dsc-link-text-decoration-thickness: max(1px, 0.0625rem);
7
+
8
+ --dsc-link-background--focus: var(--ds-color-focus-outer);
9
+ --dsc-link-color--focus: var(--ds-color-focus-inner);
10
+ --dsc-link-color--visited: var(--ds-global-purple-12);
11
+ --dsc-link-text-decoration-thickness--hover: 0.125em; /* 2px ish */
12
+ --dsc-link-text-decoration-thickness: 0.0625em; /* 1px ish */
11
13
 
12
14
  color: var(--dsc-link-color);
13
15
  outline: none;
14
16
  text-decoration-style: solid;
15
17
  text-decoration-thickness: var(--dsc-link-text-decoration-thickness);
16
- text-underline-offset: max(5px, 0.25rem);
18
+ text-underline-offset: 0.27em; /* 5px ish */
17
19
 
18
20
  & :is(img, svg) {
19
21
  vertical-align: middle; /* Align img or svg icon with text */
20
22
  }
21
23
 
22
24
  /**
23
- * Colors
24
- */
25
+ * Colors
26
+ */
27
+ &[data-color] {
28
+ --dsc-link-background--active: var(--ds-color-surface-default);
29
+ --dsc-link-color--active: var(--ds-color-text-default);
30
+ --dsc-link-color--hover: var(--ds-color-text-default);
31
+ --dsc-link-color: var(--ds-color-text-subtle);
32
+ }
25
33
  &[data-color='neutral'] {
26
- --dsc-link-background--active: var(--ds-color-neutral-surface-default);
27
34
  --dsc-link-color--active: var(--ds-color-neutral-text-subtle);
28
35
  --dsc-link-color--hover: var(--ds-color-neutral-text-subtle);
29
- --dsc-link-color--visited: var(--ds-global-purple-12);
30
36
  --dsc-link-color: var(--ds-color-neutral-text-default);
31
37
  }
32
38
 
33
39
  /**
34
- * States
35
- */
40
+ * States
41
+ */
36
42
  &:visited {
37
43
  color: var(--dsc-link-color--visited);
38
44
  }
package/list.css CHANGED
@@ -1,32 +1,24 @@
1
1
  .ds-list {
2
- --dsc-list-font-size: var(--ds-font-size-5);
3
2
  --dsc-list-padding-left: var(--ds-spacing-6);
4
3
  --dsc-list-spacing: var(--ds-spacing-3);
5
4
  --dsc-list-spacing-nested: var(--ds-spacing-2);
6
5
 
7
- font-size: var(--dsc-list-font-size); /* Replace with composes paragraph-md */
8
- line-height: var(--ds-line-height-md); /* Replace with composes paragraph-md */
9
6
  margin: 0;
10
7
  padding-left: var(--dsc-list-padding-left);
11
8
 
12
- & > li + li { margin-top: var(--dsc-list-spacing) }
13
- & > li > :is(ol, ul) { --dsc-list-spacing: var(--dsc-list-spacing-nested) } /* Shrink spacing a bit when nested */
9
+ & > li + li {
10
+ margin-top: var(--dsc-list-spacing);
11
+ }
12
+
13
+ & > li > :is(ol, ul) {
14
+ --dsc-list-spacing: var(--dsc-list-spacing-nested);
15
+ } /* Shrink spacing a bit when nested */
14
16
 
15
17
  /* Add zero-width space to fix VoiceOver: https://gerardkcohen.me/writing/2017/voiceover-list-style-type.html
16
18
  * This can also be acheived by using role="list" + role="listitem", but is nice to solve with CSS avoiding cluttered HTML
17
19
  */
18
20
  & > li::before {
19
- content: "\200B";
21
+ content: '\200B';
20
22
  position: absolute;
21
23
  }
22
-
23
- &[data-size="sm"] {
24
- --dsc-list-padding-left: var(--ds-spacing-4);
25
- --dsc-list-font-size: var(--ds-font-size-4); /* Replace with composes paragraph-sm */
26
- }
27
-
28
- &[data-size="lg"] {
29
- --dsc-list-font-size: var(--ds-font-size-6); /* Replace with composes paragraph-sm */
30
- --dsc-list-spacing: var(--ds-spacing-4);
31
- }
32
24
  }
package/modal.css CHANGED
@@ -1,117 +1,93 @@
1
1
  .ds-modal {
2
- --dsc-modal-max-width: 40rem;
2
+ --dsc-modal-backdrop-background: rgb(0 0 0 / 0.5);
3
3
  --dsc-modal-background: var(--ds-color-neutral-background-default);
4
+ --dsc-modal-close-margin: var(--ds-spacing-3);
4
5
  --dsc-modal-color: var(--ds-color-neutral-text-default);
5
- --dsc-modal-backdrop-background: rgb(0 0 0 / 0.5);
6
- --dsc-modal-header-padding: var(--ds-spacing-6) var(--ds-spacing-18) var(--ds-spacing-2) var(--ds-spacing-6);
7
- --dsc-modal-footer-padding: var(--ds-spacing-3) var(--ds-spacing-6) var(--ds-spacing-6) var(--ds-spacing-6);
8
- --dsc-modal-content-padding: var(--ds-spacing-2) var(--ds-spacing-6);
9
- --dsc-modal-content-max-height: 80vh;
6
+ --dsc-modal-divider: 1px solid var(--ds-color-neutral-border-subtle);
7
+ --dsc-modal-max-height: 80vh;
8
+ --dsc-modal-max-width: 40rem;
9
+ --dsc-modal-padding: var(--ds-spacing-6);
10
+ --close-top-right: calc(var(--dsc-modal-padding) * -1 + var(--dsc-modal-close-margin));
10
11
 
11
- padding: 0;
12
- width: 100%;
13
- max-width: var(--dsc-modal-max-width);
14
- border: none;
15
- border-radius: min(1rem, var(--ds-border-radius-lg));
12
+ background: var(--dsc-modal-background);
13
+ border-radius: var(--ds-border-radius-lg);
14
+ border: 0;
16
15
  box-shadow: var(--ds-shadow-xl);
17
- background-color: var(--dsc-modal-background);
16
+ box-sizing: border-box;
18
17
  color: var(--dsc-modal-color);
18
+ max-height: var(--dsc-modal-max-height);
19
+ max-width: var(--dsc-modal-max-width);
20
+ padding: var(--dsc-modal-padding);
21
+ width: 100%;
19
22
 
20
23
  &::backdrop {
21
- background-color: var(--dsc-modal-backdrop-background);
22
24
  animation: fade-in 300ms ease-in-out;
25
+ /* we include a fallback color because ::backdrop didn't inherit
26
+ custom properties in Chrome until version 122 (mid-2024) */
27
+ background: var(--dsc-modal-backdrop-background, rgb(0 0 0 / 0.5));
23
28
  }
24
29
 
25
30
  &[open] {
26
- animation:
27
- slide-in 300ms ease-in-out,
28
- fade-in 300ms ease-in-out;
31
+ animation: slide-in 300ms ease-in-out, fade-in 300ms ease-in-out;
29
32
  }
30
33
 
31
- & > hr {
32
- margin: var(--ds-spacing-3) 0 !important;
34
+ &:has(> .ds-modal__block) {
35
+ --close-top-right: var(--dsc-modal-close-margin);
36
+
37
+ padding: 0; /* Let Modal.Block own the padding */
33
38
  }
34
39
 
35
40
  @media (max-width: 40rem) {
36
- & {
37
- min-width: 100%;
38
- max-width: 100%;
39
- border-radius: 0;
40
- }
41
+ min-width: 100%;
42
+ max-width: 100%;
43
+ border-radius: 0;
41
44
  }
42
45
 
43
46
  @media (prefers-reduced-motion: reduce) {
44
- &[open] {
45
- animation: none;
46
- }
47
-
47
+ &[open],
48
48
  &::backdrop {
49
49
  animation: none;
50
50
  }
51
51
  }
52
52
 
53
- &.ds-modal--lock-scroll {
54
- overflow: hidden;
55
- }
56
-
57
- .ds-modal__header {
58
- display: flex;
59
- justify-content: space-between;
60
- flex-direction: column;
61
- padding: var(--dsc-modal-header-padding);
62
- gap: var(--ds-spacing-1);
63
-
64
- &:not(:has(> .ds-modal__header__button)) {
65
- --dsc-modal-header-padding: var(--ds-spacing-6) var(--ds-spacing-6) var(--ds-spacing-2) var(--ds-spacing-6);
66
- }
67
-
68
- .ds-modal__header__button {
69
- position: absolute;
70
- top: var(--ds-spacing-3);
71
- right: var(--ds-spacing-3);
72
- color: var(--dsc-modal-color);
73
-
74
- &::before {
75
- content: '';
76
- background: currentcolor;
77
- height: 1.5em;
78
- width: 1.5em;
79
- mask: center/contain no-repeat
80
- url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' fill='none' viewBox='0 0 24 24' focusable='false' role='img'%3E%3Cpath fill='currentColor' d='M6.53 5.47a.75.75 0 0 0-1.06 1.06L10.94 12l-5.47 5.47a.75.75 0 1 0 1.06 1.06L12 13.06l5.47 5.47a.75.75 0 1 0 1.06-1.06L13.06 12l5.47-5.47a.75.75 0 0 0-1.06-1.06L12 10.94z'%3E%3C/path%3E%3C/svg%3E");
81
- }
53
+ /* Close button */
54
+ & > form[method='dialog']:first-child > button:only-child {
55
+ float: right;
56
+ margin: var(--close-top-right) var(--close-top-right) var(--dsc-modal-close-margin) var(--dsc-modal-close-margin);
57
+ color: inherit;
58
+
59
+ &::before {
60
+ content: '';
61
+ background: currentcolor;
62
+ height: var(--ds-spacing-6);
63
+ width: var(--ds-spacing-6);
64
+ mask: center / contain no-repeat
65
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' fill='none' viewBox='0 0 24 24' focusable='false' role='img'%3E%3Cpath fill='currentColor' d='M6.53 5.47a.75.75 0 0 0-1.06 1.06L10.94 12l-5.47 5.47a.75.75 0 1 0 1.06 1.06L12 13.06l5.47 5.47a.75.75 0 1 0 1.06-1.06L13.06 12l5.47-5.47a.75.75 0 0 0-1.06-1.06L12 10.94z'%3E%3C/path%3E%3C/svg%3E");
82
66
  }
83
67
  }
68
+ }
84
69
 
85
- .ds-modal__footer {
86
- display: flex;
87
- align-items: center;
88
- gap: var(--ds-spacing-4);
89
- padding: var(--dsc-modal-footer-padding);
90
- }
70
+ .ds-modal__block {
71
+ padding: var(--dsc-modal-padding);
91
72
 
92
- .ds-modal__content {
93
- padding: var(--dsc-modal-content-padding);
94
- max-height: var(--dsc-modal-content-max-height);
95
- overflow-y: auto;
73
+ & + & {
74
+ border-top: var(--dsc-modal-divider);
96
75
  }
97
76
  }
98
77
 
99
- @keyframes slide-in {
100
- 0% {
101
- transform: translateY(50px);
102
- }
78
+ /* Prevent scroll when open */
79
+ body:has(.ds-modal[open]) {
80
+ overflow: hidden;
81
+ }
103
82
 
104
- 100% {
105
- transform: translateY(0);
83
+ @keyframes slide-in {
84
+ from {
85
+ translate: 0 50px;
106
86
  }
107
87
  }
108
88
 
109
89
  @keyframes fade-in {
110
- 0% {
90
+ from {
111
91
  opacity: 0;
112
92
  }
113
-
114
- 100% {
115
- opacity: 1;
116
- }
117
93
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digdir/designsystemet-css",
3
- "version": "1.0.0-next.34",
3
+ "version": "1.0.0-next.36",
4
4
  "description": "CSS for Designsystemet",
5
5
  "author": "Designsystemet team",
6
6
  "repository": {