@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/button.css CHANGED
@@ -1,57 +1,87 @@
1
1
  .ds-button {
2
+ /* default color: accent */
2
3
  --dsc-button-background--active: var(--ds-color-accent-base-active);
3
4
  --dsc-button-background--hover: var(--ds-color-accent-base-hover);
4
5
  --dsc-button-background: var(--ds-color-accent-base-default);
5
6
  --dsc-button-color: var(--ds-color-accent-contrast-default);
7
+ --dsc-button-border-color: transparent;
8
+
9
+ &[data-variant='secondary'],
10
+ &[data-variant='tertiary'] {
11
+ --dsc-button-background: transparent;
12
+ --dsc-button-background--active: var(--ds-color-accent-surface-hover);
13
+ --dsc-button-background--hover: var(--ds-color-accent-surface-default);
14
+ --dsc-button-color: var(--ds-color-accent-text-subtle);
15
+ }
16
+ &[data-variant='secondary'] {
17
+ --dsc-button-border-color: var(--ds-color-accent-border-strong);
18
+ }
19
+
20
+ &[data-color] {
21
+ --dsc-button-background--active: var(--ds-color-base-active);
22
+ --dsc-button-background--hover: var(--ds-color-base-hover);
23
+ --dsc-button-background: var(--ds-color-base-default);
24
+ --dsc-button-color: var(--ds-color-contrast-default);
25
+
26
+ &[data-variant='secondary'],
27
+ &[data-variant='tertiary'] {
28
+ --dsc-button-background: transparent;
29
+ --dsc-button-background--active: var(--ds-color-surface-hover);
30
+ --dsc-button-background--hover: var(--ds-color-surface-default);
31
+ --dsc-button-color: var(--ds-color-text-subtle);
32
+ }
33
+ &[data-variant='secondary'] {
34
+ --dsc-button-border-color: var(--ds-color-border-strong);
35
+ }
36
+ }
37
+
6
38
  --dsc-button-font-size: var(--ds-font-size-5);
7
39
  --dsc-button-gap: var(--ds-spacing-2);
8
- --dsc-button-padding-block: var(--ds-spacing-2);
9
- --dsc-button-padding-inline: var(--ds-spacing-4);
40
+ --dsc-button-padding: var(--ds-spacing-2) var(--ds-spacing-4);
10
41
  --dsc-button-size: var(--ds-sizing-12);
11
42
 
12
- @composes ds-focus from './utilities.css';
13
- @composes ds-paragraph-short from './baseline/typography.css';
14
-
15
43
  align-items: center;
16
44
  background: var(--dsc-button-background);
17
- border-radius: var(--ds-border-radius-md);
18
- border: var(--ds-border-width-default) solid var(--dsc-button-border-color, transparent);
45
+ border-radius: var(--ds-border-radius-default);
46
+ border: var(--ds-border-width-default) solid var(--dsc-button-border-color);
19
47
  box-sizing: border-box;
20
48
  color: var(--dsc-button-color);
21
49
  cursor: pointer;
22
50
  font-family: inherit;
51
+ font-weight: var(--ds-font-weight-medium);
23
52
  gap: var(--dsc-button-gap);
24
53
  justify-content: center;
54
+ line-height: var(--ds-line-height-sm);
25
55
  min-height: var(--dsc-button-size);
26
56
  min-width: var(--dsc-button-size);
27
57
  outline: none;
28
- padding: var(--dsc-button-padding-block) var(--dsc-button-padding-inline);
58
+ padding: var(--dsc-button-padding);
29
59
  text-align: inherit;
30
60
  text-decoration: none;
31
61
 
32
- &:focus-visible {
33
- position: relative; /* Place focusring on top */
62
+ @composes ds-focus from './base/base.css';
63
+
64
+ &:not([data-size]) {
65
+ font-size: inherit; /* Ensure inheriting font-size when <button> */
34
66
  }
35
67
 
36
- &:not([hidden]) {
37
- display: flex;
68
+ & :where(img, svg) {
69
+ flex-shrink: 0;
70
+ font-size: 1.25em;
38
71
  }
39
72
 
40
- &[data-size='sm'] {
41
- --dsc-button-gap: var(--ds-sizing-1);
42
- --dsc-button-padding-block: var(--ds-spacing-2);
43
- --dsc-button-padding-inline: var(--ds-spacing-3);
44
- --dsc-button-size: var(--ds-sizing-10);
73
+ &:focus-visible {
74
+ position: relative; /* Place focusring on top */
45
75
  }
46
76
 
47
- &[data-size='lg'] {
48
- --dsc-button-padding-block: var(--ds-spacing-3);
49
- --dsc-button-padding-inline: var(--ds-spacing-5);
50
- --dsc-button-size: var(--ds-sizing-14);
77
+ &:not([hidden]) {
78
+ display: flex;
51
79
  }
52
80
 
53
81
  &[data-icon] {
54
- padding-inline: var(--dsc-button-padding-block);
82
+ width: var(--dsc-button-size); /* Ensure it keeps square shape */
83
+ height: var(--dsc-button-size); /* Ensure it keeps square shape */
84
+ padding: 0;
55
85
  }
56
86
 
57
87
  &[data-fullwidth] {
@@ -60,86 +90,8 @@
60
90
  }
61
91
 
62
92
  /**
63
- * Variants
64
- */
65
- &[data-variant='secondary'] {
66
- --dsc-button-background--active: var(--ds-color-accent-surface-hover);
67
- --dsc-button-background--hover: var(--ds-color-accent-surface-default);
68
- --dsc-button-background: transparent;
69
- --dsc-button-border-color: var(--ds-color-accent-border-strong);
70
- --dsc-button-color--active: var(--ds-color-accent-text-default);
71
- --dsc-button-color--hover: var(--ds-color-accent-text-default);
72
- --dsc-button-color: var(--ds-color-accent-text-subtle);
73
- }
74
-
75
- &[data-variant='tertiary'] {
76
- --dsc-button-background--active: var(--ds-color-accent-surface-hover);
77
- --dsc-button-background--hover: var(--ds-color-accent-surface-default);
78
- --dsc-button-background: transparent;
79
- --dsc-button-border-color: var(--dsc-button-tertiary-border-color);
80
- --dsc-button-color--active: var(--ds-color-accent-text-default);
81
- --dsc-button-color--hover: var(--ds-color-accent-text-default);
82
- --dsc-button-color: var(--ds-color-accent-text-subtle);
83
- }
84
-
85
- /**
86
- * Colors
87
- */
88
- &[data-color='neutral'] {
89
- --dsc-button-background--active: var(--ds-color-neutral-base-active);
90
- --dsc-button-background--hover: var(--ds-color-neutral-base-hover);
91
- --dsc-button-background: var(--ds-color-neutral-base-default);
92
- --dsc-button-color: var(--ds-color-neutral-contrast-default);
93
- }
94
-
95
- &[data-color='neutral'][data-variant='secondary'] {
96
- --dsc-button-background--active: var(--ds-color-neutral-surface-hover);
97
- --dsc-button-background--hover: var(--ds-color-neutral-surface-default);
98
- --dsc-button-background: transparent;
99
- --dsc-button-border-color: var(--ds-color-neutral-border-strong);
100
- --dsc-button-color--active: var(--ds-color-neutral-text-default);
101
- --dsc-button-color--hover: var(--ds-color-neutral-text-default);
102
- --dsc-button-color: var(--ds-color-neutral-text-subtle);
103
- }
104
-
105
- &[data-color='neutral'][data-variant='tertiary'] {
106
- --dsc-button-background--active: var(--ds-color-neutral-surface-hover);
107
- --dsc-button-background--hover: var(--ds-color-neutral-surface-default);
108
- --dsc-button-background: transparent;
109
- --dsc-button-color--active: var(--ds-color-neutral-text-default);
110
- --dsc-button-color--hover: var(--ds-color-neutral-text-default);
111
- --dsc-button-color: var(--ds-color-neutral-text-subtle);
112
- }
113
-
114
- &[data-color='danger'] {
115
- --dsc-button-background--active: var(--ds-color-danger-base-active);
116
- --dsc-button-background--hover: var(--ds-color-danger-base-hover);
117
- --dsc-button-background: var(--ds-color-danger-base-default);
118
- --dsc-button-color: var(--ds-color-danger-contrast-default);
119
- }
120
-
121
- &[data-color='danger'][data-variant='secondary'] {
122
- --dsc-button-background--active: var(--ds-color-danger-surface-hover);
123
- --dsc-button-background--hover: var(--ds-color-danger-surface-default);
124
- --dsc-button-background: transparent;
125
- --dsc-button-border-color: var(--ds-color-danger-border-strong);
126
- --dsc-button-color--active: var(--ds-color-danger-text-default);
127
- --dsc-button-color--hover: var(--ds-color-danger-text-default);
128
- --dsc-button-color: var(--ds-color-danger-text-subtle);
129
- }
130
-
131
- &[data-color='danger'][data-variant='tertiary'] {
132
- --dsc-button-background--active: var(--ds-color-danger-surface-hover);
133
- --dsc-button-background--hover: var(--ds-color-danger-surface-default);
134
- --dsc-button-background: transparent;
135
- --dsc-button-color--active: var(--ds-color-danger-text-default);
136
- --dsc-button-color--hover: var(--ds-color-danger-text-default);
137
- --dsc-button-color: var(--ds-color-danger-text-subtle);
138
- }
139
-
140
- /**
141
- * States
142
- */
93
+ * States
94
+ */
143
95
 
144
96
  @media (hover: hover) and (pointer: fine) {
145
97
  /* Only use hover for non-touch devices to prevent sticky-hovering, using :where to prevent adding specificity */
package/card.css CHANGED
@@ -1,197 +1,127 @@
1
1
  .ds-card {
2
+ /* default color: neutral */
3
+ --dsc-card-background--active: var(--ds-color-neutral-surface-default);
4
+ --dsc-card-background--hover: var(--ds-color-neutral-background-subtle);
5
+ --dsc-card-background: var(--ds-color-neutral-background-default);
2
6
  --dsc-card-border-color: var(--ds-color-neutral-border-subtle);
3
- --dsc-card-backround: var(--ds-color-neutral-background-default);
4
7
  --dsc-card-color: var(--ds-color-neutral-text-default);
5
8
 
6
- display: flex;
7
- flex-direction: column;
8
- width: 100%;
9
- box-sizing: border-box;
10
- position: relative;
11
- overflow: hidden;
12
- color: var(--dsc-card-color);
13
- border-radius: min(1rem, var(--ds-border-radius-md));
14
- border: 1px solid var(--dsc-card-border-color);
15
- background: var(--dsc-card-backround);
16
-
17
- &[data-link] {
18
- --dsc-card-border-color: var(--ds-color-neutral-border-default);
19
-
20
- text-decoration: none;
21
-
22
- & h1,
23
- & h2,
24
- & h3,
25
- & h4,
26
- & h5,
27
- & h6 {
28
- color: var(--dsc-card-color);
29
- text-decoration: underline;
30
- text-decoration-thickness: max(1px, 0.0625rem, 0.1025em);
31
- text-underline-offset: max(6px, 0.25rem, 0.22em);
32
- }
33
-
34
- &:active {
35
- --dsc-card-backround: var(--ds-color-neutral-surface-default);
36
- }
37
-
38
- @media (hover: hover) and (pointer: fine) {
39
- &:hover {
40
- --dsc-card-backround: var(--ds-color-neutral-background-subtle);
41
- }
42
- }
9
+ &[data-color]:where(:not([data-color='subtle'])) {
10
+ --dsc-card-background--active: var(--ds-color-surface-default);
11
+ --dsc-card-background--hover: var(--ds-color-background-subtle);
12
+ --dsc-card-background: var(--ds-color-surface-default);
13
+ --dsc-card-border-color: var(--ds-color-border-subtle);
14
+ --dsc-card-color: var(--ds-color-text-default);
15
+ }
16
+ &[data-color='neutral'] {
17
+ --dsc-card-background: var(--ds-color-background-default);
43
18
  }
44
-
45
19
  &[data-color='subtle'] {
46
- --dsc-card-border-color: var(--ds-color-neutral-border-subtle);
47
- --dsc-card-backround: var(--ds-color-neutral-background-subtle);
48
-
49
- &[data-link] {
50
- --dsc-card-border-color: var(--ds-color-neutral-border-default);
51
-
52
- &:active {
53
- --dsc-card-backround: var(--ds-color-neutral-surface-hover);
54
- }
55
-
56
- @media (hover: hover) and (pointer: fine) {
57
- &:hover {
58
- --dsc-card-backround: var(--ds-color-neutral-surface-default);
59
- }
60
- }
61
- }
20
+ --dsc-card-background: var(--ds-color-neutral-background-subtle);
62
21
  }
63
22
 
64
- &[data-color='brand1'] {
65
- --dsc-card-border-color: var(--ds-color-brand1-border-subtle);
66
- --dsc-card-backround: var(--ds-color-brand1-surface-default);
67
- --dsc-card-color: var(--ds-color-brand1-text-default);
23
+ --dsc-card-border: 1px solid var(--dsc-card-border-color);
24
+ --dsc-card-gap: var(--ds-spacing-3);
25
+ --dsc-card-padding: var(--ds-spacing-6);
68
26
 
69
- &[data-link] {
70
- --dsc-card-border-color: var(--ds-color-brand1-border-default);
71
-
72
- &:active {
73
- --dsc-card-backround: var(--ds-color-brand1-surface-active);
74
- }
27
+ background: var(--dsc-card-background);
28
+ border-radius: var(--ds-border-radius-lg);
29
+ border: var(--dsc-card-border);
30
+ box-sizing: border-box;
31
+ color: var(--dsc-card-color);
32
+ display: block;
33
+ font-family: inherit;
34
+ margin: 0;
35
+ overflow: clip; /* Needed to clip media elements and and Card.Block */
36
+ padding: var(--dsc-card-padding);
37
+ text-align: inherit;
75
38
 
76
- @media (hover: hover) and (pointer: fine) {
77
- &:hover {
78
- --dsc-card-backround: var(--ds-color-brand1-surface-hover);
79
- }
80
- }
81
- }
39
+ &:not([data-size]) {
40
+ font-size: inherit; /* Ensure inheriting font-size when <button> */
82
41
  }
83
42
 
84
- &[data-color='brand2'] {
85
- --dsc-card-border-color: var(--ds-color-brand2-border-subtle);
86
- --dsc-card-backround: var(--ds-color-brand2-surface-default);
87
- --dsc-card-color: var(--ds-color-brand2-text-default);
88
-
89
- &[data-link] {
90
- --dsc-card-border-color: var(--ds-color-brand2-border-default);
91
-
92
- &:active {
93
- --dsc-card-backround: var(--ds-color-brand2-surface-active);
94
- }
95
-
96
- @media (hover: hover) and (pointer: fine) {
97
- &:hover {
98
- --dsc-card-backround: var(--ds-color-brand2-surface-hover);
99
- }
100
- }
101
- }
43
+ /* Style link in heading, or heading when Card is anchor */
44
+ :is(h1, h2, h3, h4, h5, h6) a:any-link /* Using :any-link to target both a and a:visited */,
45
+ &:is(a:any-link, button, [role='button']) :is(h1, h2, h3, h4, h5, h6) {
46
+ color: inherit;
47
+ outline: 0;
48
+ text-decoration: underline;
49
+ text-decoration-thickness: max(1px, 0.0625rem, 0.1025em);
50
+ text-underline-offset: max(6px, 0.25rem, 0.22em);
102
51
  }
103
52
 
104
- &[data-color='brand3'] {
105
- --dsc-card-border-color: var(--ds-color-brand3-border-subtle);
106
- --dsc-card-backround: var(--ds-color-brand3-surface-default);
107
- --dsc-card-color: var(--ds-color-brand3-text-default);
108
-
109
- &[data-link] {
110
- --dsc-card-border-color: var(--ds-color-brand3-border-default);
111
-
112
- &:active {
113
- --dsc-card-backround: var(--ds-color-brand3-surface-active);
114
- }
53
+ /* Add states when Card is a anchor, button, or when containing a anchor in heading */
54
+ &:where(a, button, [role='button']),
55
+ &:where(:has(:is(h1, h2, h3, h4, h5, h6) a)) {
56
+ cursor: pointer;
57
+ text-decoration: none;
115
58
 
116
- @media (hover: hover) and (pointer: fine) {
117
- &:hover {
118
- --dsc-card-backround: var(--ds-color-brand3-surface-hover);
119
- }
59
+ @media (hover: hover) and (pointer: fine) {
60
+ &:hover {
61
+ background: var(--dsc-card-background--hover);
120
62
  }
121
63
  }
122
- }
123
64
 
124
- .ds-card__header h1,
125
- .ds-card__header h2,
126
- .ds-card__header h3,
127
- .ds-card__header h4,
128
- .ds-card__header h5,
129
- .ds-card__header h6 {
130
- color: inherit;
131
- }
132
-
133
- .ds-card__media > * {
134
- display: flex;
135
- flex-direction: column;
136
- width: 100%;
137
- border: 0;
138
- }
139
-
140
- .ds-card__media {
141
- width: auto;
142
- }
65
+ &:where(:focus-visible, :has(:focus-visible)) {
66
+ @composes ds-focus--visible from './base/base.css';
67
+ }
143
68
 
144
- .ds-card__media:first-child {
145
- padding-bottom: var(--ds-spacing-4);
69
+ &:active {
70
+ background: var(--dsc-card-background--active);
71
+ }
146
72
  }
147
73
 
148
- .ds-card__media:last-child {
149
- padding-top: var(--ds-spacing-6);
74
+ &:has(> .ds-card__block) {
75
+ padding: 0; /* Let Card.Block own the padding */
150
76
  }
77
+ }
151
78
 
152
- .ds-card__footer,
153
- .ds-card__content {
154
- display: flex;
155
- justify-content: flex-start;
156
- gap: var(--ds-spacing-4);
157
- flex-wrap: wrap;
158
- word-wrap: break-word;
159
- padding: var(--ds-spacing-2) 0;
160
- color: inherit;
79
+ /* Using :where to overwrite user agent CSS, but not our own CSS */
80
+ :where(.ds-card, .ds-card__block) {
81
+ & > :first-child {
82
+ margin-block: 0;
161
83
  }
162
84
 
163
- .ds-card__content {
164
- flex-direction: column;
85
+ & > * + * {
86
+ margin-block: var(--dsc-card-gap) 0; /* https://every-layout.dev/layouts/stack/ */
165
87
  }
88
+ }
166
89
 
167
- .ds-card__header {
168
- display: flex;
169
- flex-direction: column;
170
- flex-wrap: wrap;
171
- word-wrap: break-word;
172
- font-family: inherit;
173
- padding: var(--ds-spacing-2) 0;
174
- }
90
+ .ds-card__block {
91
+ box-sizing: border-box;
92
+ margin: 0;
93
+ padding: var(--dsc-card-padding);
94
+ position: relative;
175
95
 
176
- & a:any-link {
177
- color: var(--ds-color-neutral-text-default);
96
+ /* Needed to support automatic separator border between both vertical and horizontal stacking Card.Block: */
97
+ &::before {
98
+ content: '';
99
+ border-top: var(--dsc-card-border);
100
+ position: absolute;
101
+ inset: 0 0 auto;
102
+ translate: 0 -100%;
178
103
  }
179
104
 
180
- & > hr {
181
- width: 100%;
182
- margin: var(--ds-spacing-3) 0;
105
+ &::after {
106
+ content: '';
107
+ border-left: var(--dsc-card-border);
108
+ position: absolute;
109
+ inset: 0 auto 0 0;
110
+ translate: -100%;
183
111
  }
184
112
 
185
- & > *:not(.ds-card__media, hr) {
186
- padding-left: var(--ds-spacing-6);
187
- padding-right: var(--ds-spacing-6);
188
- }
113
+ &:has(> :is(audio, figure, iframe, img, video):only-child) {
114
+ padding: 0;
189
115
 
190
- & > *:not(.ds-card__media):first-child {
191
- padding-top: var(--ds-spacing-6);
192
- }
116
+ & > * {
117
+ border: 0;
118
+ display: block;
119
+ height: auto;
120
+ width: 100%;
121
+ }
193
122
 
194
- & > *:not(.ds-card__media):last-child {
195
- padding-bottom: var(--ds-spacing-6);
123
+ & > iframe {
124
+ aspect-ratio: 16 / 9; /* Make iframes scale responsively */
125
+ }
196
126
  }
197
127
  }