@navikt/ds-css 8.8.0 → 8.9.1

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navikt/ds-css",
3
- "version": "8.8.0",
3
+ "version": "8.9.1",
4
4
  "description": "CSS for Nav Designsystem",
5
5
  "author": "Aksel | Nav designsystem team",
6
6
  "keywords": [
@@ -30,9 +30,9 @@
30
30
  "css:get-version": "node config/get-version.js"
31
31
  },
32
32
  "devDependencies": {
33
- "@navikt/ds-tokens": "^8.8.0",
33
+ "@navikt/ds-tokens": "^8.9.1",
34
34
  "browserslist": "^4.25.0",
35
- "esbuild": "^0.27.2",
35
+ "esbuild": "^0.27.4",
36
36
  "fast-glob": "3.3.3",
37
37
  "lightningcss": "^1.30.1",
38
38
  "normalize.css": "^8.0.1",
package/src/button.css CHANGED
@@ -44,7 +44,9 @@
44
44
  background-color: transparent;
45
45
  color: var(--ax-text-subtle);
46
46
 
47
- &[data-color="neutral"] {
47
+ &[data-color="neutral"],
48
+ [data-color="neutral"] > &:not([data-color]),
49
+ [data-color="neutral"] :not([data-color]) &:not([data-color]) {
48
50
  color: var(--ax-text-default);
49
51
  }
50
52
 
@@ -62,7 +64,8 @@
62
64
  color: var(--ax-text-subtle);
63
65
  background-color: transparent;
64
66
 
65
- &[data-color="neutral"] {
67
+ &[data-color="neutral"],
68
+ [data-color="neutral"] > &:not([data-color]) {
66
69
  color: var(--ax-text-default);
67
70
  }
68
71
  }
@@ -72,7 +75,9 @@
72
75
  background-color: transparent;
73
76
  color: var(--ax-text-subtle);
74
77
 
75
- &[data-color="neutral"] {
78
+ &[data-color="neutral"],
79
+ [data-color="neutral"] > &:not([data-color], [data-pressed="true"]),
80
+ [data-color="neutral"] :not([data-color]) &:not([data-color], [data-pressed="true"]) {
76
81
  color: var(--ax-text-default);
77
82
  }
78
83
 
@@ -93,7 +98,8 @@
93
98
  color: var(--ax-text-subtle);
94
99
  background-color: transparent;
95
100
 
96
- &[data-color="neutral"] {
101
+ &[data-color="neutral"],
102
+ [data-color="neutral"] > &:not([data-color]) {
97
103
  color: var(--ax-text-default);
98
104
  }
99
105
  }
package/src/chips.css CHANGED
@@ -95,8 +95,6 @@
95
95
  padding-left: var(--ax-space-6);
96
96
  }
97
97
 
98
- /* -------------------------- start old CSS -------------------------- */
99
-
100
98
  /* ----------------------------- Chips removable ---------------------------- */
101
99
  .aksel-chips__removable {
102
100
  gap: 0;
@@ -50,7 +50,7 @@
50
50
  }
51
51
 
52
52
  &[data-truncate-content="true"] {
53
- .aksel-data-table__td > div {
53
+ .aksel-data-table__td:not(.aksel-data-table--UNSAFE_isSelection) > div {
54
54
  text-overflow: ellipsis;
55
55
  white-space: nowrap;
56
56
  overflow: hidden;
@@ -306,7 +306,7 @@
306
306
  vertical-align: middle;
307
307
  color: var(--ax-text-neutral-subtle);
308
308
 
309
- > div {
309
+ &:not(.aksel-data-table--UNSAFE_isSelection) > div {
310
310
  padding-block: var(--__axc-data-table-density);
311
311
  padding-inline: 1rem;
312
312
  }
@@ -323,6 +323,11 @@
323
323
  outline: 2px solid var(--ax-border-focus);
324
324
  outline-offset: -4px;
325
325
  }
326
+
327
+ &.aksel-data-table--UNSAFE_isSelection > div {
328
+ display: grid;
329
+ place-content: center;
330
+ }
326
331
  }
327
332
 
328
333
  .aksel-data-table__tfoot {
@@ -335,15 +340,35 @@
335
340
  padding: 0;
336
341
  }
337
342
 
338
- .aksel-data-table__drag-and-drop-item {
339
- &[data-dragging="true"] {
340
- background: var(--ax-bg-default);
343
+ .aksel-data-drag-and-drop__drag-handler__button {
344
+ height: 1.5rem;
345
+ position: relative;
346
+ background: transparent;
347
+ border: none;
348
+ padding: 0;
349
+
350
+ &:hover {
351
+ cursor: grab;
341
352
  }
342
353
 
343
- &[data-mouse-dragging="true"]:not(:active) {
354
+ &:focus-visible,
355
+ &[data-drag-handler-active="true"] {
356
+ outline: 2px solid var(--ax-border-focus);
357
+ outline-offset: -1px;
358
+ border-radius: var(--ax-radius-8);
359
+ }
360
+ }
361
+
362
+ .aksel-data-table__drag-and-drop-item {
363
+ background-color: var(--ax-bg-default);
364
+
365
+ &[data-overlay="true"] {
366
+ width: 100%;
344
367
  opacity: 0.8;
368
+ box-shadow: var(--ax-shadow-dialog);
345
369
  }
346
370
 
371
+ /* TODO - might be removable */
347
372
  &[data-keyboard-dragging="true"] {
348
373
  .aksel-data-drag-and-drop__drag-handler__button {
349
374
  outline: 2px solid var(--ax-border-focus);
@@ -352,32 +377,19 @@
352
377
  }
353
378
  }
354
379
 
355
- &[data-drop-target="true"] {
380
+ &[data-drop-target="true"]:not([data-overlay="true"]) {
356
381
  background: var(--ax-bg-neutral-moderate);
357
382
  }
358
383
  }
359
384
 
360
- .aksel-data-drag-and-drop__drag-handler__button {
361
- cursor: grab;
362
- height: 1.5rem;
363
- position: relative;
364
- background: transparent;
365
- border: none;
366
- padding: 0;
367
-
368
- &:focus-visible {
369
- outline: 2px solid var(--ax-border-focus);
370
- outline-offset: -1px;
371
- border-radius: var(--ax-radius-8);
372
- }
373
- }
374
-
375
385
  .aksel-data-drag-and-drop__drag-handler__arrow {
376
386
  height: 1.2rem;
377
387
  }
378
388
 
379
- .aksel-data-drag-and-drop__drag-handler__alt {
389
+ .aksel-data-drag-and-drop__drag-handler__alt,
390
+ .aksel-data-drag-and-drop__drag-handler {
380
391
  position: relative;
392
+ height: 1.5rem;
381
393
 
382
394
  .aksel-data-drag-and-drop__drag-handler__arrow {
383
395
  position: absolute;
@@ -455,3 +467,13 @@
455
467
  .aksel-data-table tr .aksel-checkbox:focus-within::after {
456
468
  inset: 0;
457
469
  }
470
+
471
+ /* TODO -
472
+ * This is needed to prevent the cursor from changing back to default when dragging over interactive elements in the row.
473
+ * Not sure if this is the best approach or breaks styling elsewhere */
474
+ html[data-dragging="true"],
475
+ html[data-dragging="true"] *,
476
+ html[data-dragging="true"] *::before,
477
+ html[data-dragging="true"] *::after {
478
+ cursor: grabbing !important;
479
+ }
@@ -1,36 +1,105 @@
1
+ /* .aksel-property-filter {
2
+ flex: 1 1 fit-content;
3
+ max-inline-size: 100%;
4
+ } */
5
+
1
6
  .aksel-property-filter__popup {
2
7
  overflow: hidden;
3
- border-radius: var(--ax-radius-12);
8
+ border-radius: var(--ax-radius-8);
4
9
  border: 1px solid var(--ax-border-neutral-subtleA);
5
10
  box-shadow: var(--ax-shadow-dialog);
6
11
  /* stylelint-disable-next-line csstools/value-no-unknown-custom-properties */
7
12
  transform-origin: var(--__axc-floating-transform-origin);
8
- transition:
9
- transform 150ms ease allow-discrete,
10
- opacity 150ms ease allow-discrete;
13
+ transition: opacity 150ms ease allow-discrete;
11
14
 
12
15
  @starting-style {
13
- opacity: 0.8;
14
- transform: scale3d(0.94, 0.94, 0.94);
16
+ opacity: 0.6;
15
17
  }
16
18
 
17
19
  min-width: 260px;
18
20
  }
19
21
 
20
22
  .aksel-property-filter__popup-inner {
21
- --__axc-token-filter-content-p: var(--ax-space-8);
22
23
  --__axc-token-filter-item-pr: var(--ax-space-8);
23
24
  --__axc-token-filter-item-pl: var(--ax-space-8);
24
25
  --__axc-token-filter-item-height: 2rem;
25
26
 
26
- border-radius: var(--ax-radius-12);
27
+ border-radius: var(--ax-radius-8);
27
28
  background-color: var(--ax-bg-raised);
28
29
  min-width: 128px;
29
30
  max-width: min(95vw, 640px);
30
31
  animation-duration: 160ms;
31
32
  animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
32
- padding: var(--__axc-token-filter-content-p);
33
33
  overflow: auto;
34
34
  /* stylelint-disable-next-line csstools/value-no-unknown-custom-properties */
35
35
  max-height: calc(var(--__axc-floating-available-height) - 4px);
36
36
  }
37
+
38
+ .aksel-property-filter__input {
39
+ max-inline-size: 640px;
40
+ }
41
+
42
+ .aksel-property-filter__chips {
43
+ display: flex;
44
+ flex-wrap: wrap;
45
+ gap: var(--ax-space-8);
46
+ margin: 0;
47
+ margin-block-start: var(--ax-space-12);
48
+ padding: 0;
49
+ font-size: var(--ax-font-size-medium);
50
+ }
51
+
52
+ .aksel-property-filter__chip {
53
+ display: flex;
54
+ gap: var(--ax-space-1);
55
+ }
56
+
57
+ .aksel-property-filter__chip-button {
58
+ display: flex;
59
+ align-items: center;
60
+ gap: var(--ax-space-4);
61
+ padding: var(--ax-space-4) var(--ax-space-8);
62
+ background-color: var(--ax-bg-strong);
63
+ color: var(--ax-text-contrast);
64
+ border: none;
65
+ cursor: pointer;
66
+
67
+ &:hover {
68
+ background-color: var(--ax-bg-strong-hover);
69
+ }
70
+
71
+ &:active {
72
+ background-color: var(--ax-bg-strong-pressed);
73
+ }
74
+
75
+ &:focus-visible {
76
+ outline: 3px solid var(--ax-border-focus);
77
+ outline-offset: 2px;
78
+ z-index: 1;
79
+ }
80
+
81
+ &:first-of-type {
82
+ border-start-start-radius: var(--ax-radius-8);
83
+ border-end-start-radius: var(--ax-radius-8);
84
+ }
85
+
86
+ &:last-child {
87
+ border-start-end-radius: var(--ax-radius-8);
88
+ border-end-end-radius: var(--ax-radius-8);
89
+ }
90
+
91
+ &[data-type="operation"] {
92
+ /* background-color: var(--ax-bg-default);
93
+ box-shadow: inset 0 0 0 1px var(--ax-bg-strong);
94
+ color: var(--ax-text-default); */
95
+ color: var(--ax-text-neutral);
96
+ background-color: var(--ax-bg-neutral-moderate-pressed);
97
+ }
98
+
99
+ /* &[data-type="value"] {
100
+ } */
101
+
102
+ &[data-type="remove"] {
103
+ padding-inline: var(--ax-space-4);
104
+ }
105
+ }
@@ -1,18 +1,29 @@
1
1
  .aksel-data-toolbar {
2
- padding: var(--ax-space-12);
3
2
  display: flex;
4
- align-items: center;
3
+ flex-wrap: wrap;
4
+ align-items: flex-end;
5
5
  gap: var(--ax-space-8);
6
- border: 1px solid var(--ax-border-neutral);
7
- border-radius: var(--ax-radius-12);
8
- background-color: var(--ax-bg-raised);
9
6
  }
10
7
 
11
- .aksel-data-toolbar__toggle-button {
12
- &[aria-pressed="true"] {
13
- --__axc-button-border-width: 0px; /* ??? */
8
+ .aksel-data-toolbar__actions {
9
+ margin-inline-start: auto;
10
+ display: flex;
11
+ align-items: center;
14
12
 
15
- color: var(--ax-text-contrast);
16
- background-color: var(--ax-bg-strong-pressed);
13
+ > :not(:last-child) {
14
+ border-right: 1px solid var(--ax-border-neutral-subtle);
15
+ margin-inline-end: var(--ax-space-4);
16
+ padding-inline-end: var(--ax-space-4);
17
17
  }
18
18
  }
19
+
20
+ .aksel-data-toolbar__input {
21
+ flex: 1 1 fit-content;
22
+ max-inline-size: 100%;
23
+ }
24
+
25
+ .aksel-data-toolbar__pagination {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: var(--ax-space-8);
29
+ }
package/src/date.css CHANGED
@@ -203,35 +203,41 @@
203
203
  }
204
204
 
205
205
  .aksel-date__field-input {
206
- &.aksel-text-field__input {
207
- padding-right: var(--ax-space-48);
206
+ border-top-right-radius: 0;
207
+ border-bottom-right-radius: 0;
208
+ border-right: none;
209
+
210
+ &:focus-visible {
211
+ outline: none;
208
212
  }
209
213
 
210
- .aksel-form-field--small & {
211
- padding-right: var(--ax-space-32);
214
+ .aksel-date__field--error &:not(:disabled) {
215
+ box-shadow:
216
+ inset -2px 0 0 0 var(--ax-border-danger-strong),
217
+ inset 0 0 0 1px var(--ax-border-danger-strong);
212
218
  }
213
219
  }
214
220
 
215
221
  .aksel-date__field-button {
216
- position: absolute;
217
- right: 0.0625rem;
218
- top: 50%;
219
- transform: translateY(-50%);
220
- color: var(--ax-text-neutral);
221
- display: inline-flex;
222
- cursor: pointer;
223
- margin: 0;
224
- text-decoration: none;
225
- border: none;
226
- background: none;
227
- border-radius: calc(var(--ax-radius-8) - 1px);
228
- padding: var(--ax-space-12);
229
- align-items: center;
230
- justify-content: center;
231
- font-size: 1.5rem;
232
- height: calc(100% - 0.125rem);
222
+ --__axc-button-border-width: 1px;
223
+ --__axc-button-border-color: var(--ax-border-neutral);
224
+
233
225
  border-start-start-radius: 0;
234
226
  border-end-start-radius: 0;
227
+ position: relative;
228
+
229
+ &:focus-visible {
230
+ outline: 3px solid var(--ax-border-focus);
231
+ outline-offset: 3px;
232
+ }
233
+
234
+ .aksel-date__field:not(.aksel-date__field--readonly):has(.aksel-date__field-input:not(:disabled)) &:hover,
235
+ .aksel-date__field:not(.aksel-date__field--readonly, .aksel-date__field--error):has(
236
+ .aksel-date__field-input:is(:focus-visible, :hover):not(:disabled)
237
+ )
238
+ & {
239
+ --__axc-button-border-color: var(--ax-border-strong);
240
+ }
235
241
 
236
242
  .aksel-form-field--small & {
237
243
  padding: var(--ax-space-4);
@@ -244,19 +250,37 @@
244
250
 
245
251
  /* Readonly */
246
252
  .aksel-date__field--readonly & {
253
+ --__axc-button-border-color: var(--ax-border-neutral-subtleA);
254
+
247
255
  cursor: default;
256
+ opacity: 1;
257
+ background-color: var(--ax-bg-neutral-moderate);
258
+ color: var(--ax-text-neutral-subtle);
248
259
  }
249
260
 
250
- &:focus-visible {
251
- outline-color: var(--ax-border-focus);
261
+ /* Syncs button-bg with input while respecting hover/active states */
262
+ &::before {
263
+ content: "";
264
+ position: absolute;
265
+ inset: 0;
266
+ border-radius: inherit;
267
+ background-color: var(--ax-bg-input);
268
+ z-index: -1;
252
269
  }
253
270
  }
254
271
 
255
272
  .aksel-date__field-wrapper {
256
273
  display: inline-flex;
257
- align-items: center;
258
- position: relative;
259
274
  width: fit-content;
275
+ border-radius: var(--ax-radius-8);
276
+
277
+ /* Initializes stacking context to allow z-index: -1 on button to work. */
278
+ z-index: 0;
279
+
280
+ &:has(.aksel-date__field-input:focus-visible) {
281
+ outline: 3px solid var(--ax-border-focus);
282
+ outline-offset: 3px;
283
+ }
260
284
  }
261
285
 
262
286
  .aksel-date__week-row {
@@ -18,7 +18,8 @@
18
18
  }
19
19
 
20
20
  /* Applied when hideLegend is applied to fieldset */
21
- .aksel-fieldset > .aksel-sr-only + :not(:first-child, :empty) {
21
+ .aksel-fieldset > .aksel-sr-only + :not(:first-child, :empty),
22
+ .aksel-fieldset > .aksel-typo--visually-hidden + :not(:first-child, :empty) {
22
23
  margin-top: 0;
23
24
  }
24
25
 
@@ -1,8 +1,5 @@
1
1
  .aksel-checkbox,
2
2
  .aksel-radio {
3
- --__axc-radio-checkbox-marker-size: 1.5rem;
4
- --__axc-radio-checkbox-marker-target: 2.75rem; /* We want the click area to be a bit larger than the visible radio/checkbox */
5
-
6
3
  position: relative;
7
4
  width: fit-content;
8
5
  display: grid;
@@ -25,9 +22,6 @@
25
22
  /* Small */
26
23
  .aksel-checkbox--small,
27
24
  .aksel-radio--small {
28
- --__axc-radio-checkbox-marker-size: 1.25rem;
29
- --__axc-radio-checkbox-marker-target: 2rem;
30
-
31
25
  padding: var(--ax-space-6) 0;
32
26
 
33
27
  /* Focus outline */
@@ -58,8 +52,29 @@
58
52
 
59
53
  /* Checkbox has a wrapper around input and checkmark svg (consider creating the checkmark with css in the future) */
60
54
  .aksel-checkbox__input-wrapper {
55
+ --__axc-radio-checkbox-marker-size: 1.5rem;
56
+ --__axc-radio-checkbox-marker-target: 2.75rem; /* We want the click area to be a bit larger than the visible radio/checkbox */
57
+
61
58
  position: relative;
62
59
  height: var(--__axc-radio-checkbox-marker-size);
60
+
61
+ .aksel-checkbox--small & {
62
+ --__axc-radio-checkbox-marker-size: 1.25rem;
63
+ --__axc-radio-checkbox-marker-target: 2rem;
64
+ }
65
+
66
+ &[data-standalone="true"] {
67
+ margin: calc(calc(var(--__axc-radio-checkbox-marker-target) - var(--__axc-radio-checkbox-marker-size)) / 2);
68
+ }
69
+
70
+ &[data-standalone="true"] > .aksel-checkbox__input:focus-visible {
71
+ outline: 3px solid var(--ax-border-focus);
72
+ outline-offset: 3px;
73
+ }
74
+
75
+ &[data-compact="true"] {
76
+ --__axc-radio-checkbox-marker-target: 2rem;
77
+ }
63
78
  }
64
79
 
65
80
  /* The input acts as a container for the marker (since the click area should be larger than the visible marker) */
@@ -93,9 +108,30 @@
93
108
  );
94
109
  }
95
110
 
96
- /* Radio marker should be round */
111
+ /* Radio marker */
97
112
  .aksel-radio__input {
113
+ --__axc-radio-checkbox-marker-size: 1.5rem;
114
+ --__axc-radio-checkbox-marker-target: 2.75rem; /* We want the click area to be a bit larger than the visible radio/checkbox */
115
+
116
+ .aksel-radio--small & {
117
+ --__axc-radio-checkbox-marker-size: 1.25rem;
118
+ --__axc-radio-checkbox-marker-target: 2rem;
119
+ }
120
+
98
121
  border-radius: var(--ax-radius-full);
122
+
123
+ &[data-standalone="true"] {
124
+ margin: calc(calc(var(--__axc-radio-checkbox-marker-target) - var(--__axc-radio-checkbox-marker-size)) / 2);
125
+
126
+ &:focus-visible {
127
+ outline: 3px solid var(--ax-border-focus);
128
+ outline-offset: 3px;
129
+ }
130
+ }
131
+
132
+ &[data-compact="true"] {
133
+ --__axc-radio-checkbox-marker-target: 2rem;
134
+ }
99
135
  }
100
136
 
101
137
  /* Checkbox indeterminate: Center the icon */
@@ -67,10 +67,28 @@
67
67
  gap: var(--ax-space-8);
68
68
  border-left: 1px solid var(--ax-border-neutral-subtleA);
69
69
  color: var(--ax-text-neutral);
70
+ text-decoration: none;
71
+ position: relative;
70
72
 
71
73
  &:hover {
72
74
  background: var(--ax-bg-neutral-moderate-hoverA);
73
75
  }
76
+
77
+ &[data-active="true"] {
78
+ &::after {
79
+ content: "";
80
+ position: absolute;
81
+ width: 100%;
82
+ height: 6px;
83
+ bottom: -1px;
84
+ left: 0;
85
+ background-color: var(--ax-border-strong);
86
+
87
+ @media (forced-colors: active) {
88
+ background-color: Highlight;
89
+ }
90
+ }
91
+ }
74
92
  }
75
93
 
76
94
  @media (forced-colors: active) {
package/src/list.css CHANGED
@@ -39,7 +39,6 @@
39
39
 
40
40
  /* SAFARI HACK START */
41
41
 
42
- /* biome-ignore lint/a11y/useGenericFontNames: Hack for targeting Safari */
43
42
  @supports (hanging-punctuation: first) and (font: -apple-system-body) and (-webkit-appearance: none) {
44
43
  .aksel-list ol {
45
44
  padding-left: 2.1rem;
package/src/listbox.css CHANGED
@@ -1,14 +1,52 @@
1
- .aksel-listbox__options {
2
- padding: var(--ax-space-4);
3
- }
1
+ /* .aksel-listbox__options {} */
4
2
 
5
3
  .aksel-listbox__option {
4
+ position: relative;
6
5
  cursor: default;
7
- border-radius: var(--ax-radius-8);
8
- padding: var(--ax-space-4) var(--ax-space-2);
6
+ padding: var(--ax-space-6) var(--ax-space-4);
9
7
  scroll-margin-block: 4px;
8
+ border-radius: var(--ax-radius-8);
9
+ margin-top: 1px;
10
10
 
11
11
  &[data-virtual-focus="true"] {
12
12
  outline: 2px solid var(--ax-border-focus);
13
+ outline-offset: -2px;
14
+ background-color: var(--ax-bg-neutral-soft);
15
+ }
16
+
17
+ .aksel-listbox__group & {
18
+ padding-inline: var(--ax-space-24);
19
+ }
20
+
21
+ ::before {
22
+ content: "";
23
+ position: absolute;
24
+ top: -1px;
25
+ left: 0;
26
+ width: 100%;
27
+ height: 1px;
28
+ background-color: var(--ax-border-neutral-subtle);
13
29
  }
14
30
  }
31
+
32
+ .aksel-listbox__group-label {
33
+ padding: var(--ax-space-6) var(--ax-space-8);
34
+ position: relative;
35
+
36
+ &:not(:first-of-type)::before {
37
+ content: "";
38
+ position: absolute;
39
+ top: 0;
40
+ left: 0;
41
+ width: 100%;
42
+ height: 1px;
43
+ background-color: var(--ax-border-neutral-subtle);
44
+ }
45
+ }
46
+
47
+ .aksel-listbox__highlight {
48
+ /* background-color: var(--ax-bg-sunken); */
49
+ background: transparent;
50
+ color: var(--ax-text-accent-subtle);
51
+ font-weight: 700;
52
+ }