@navikt/ds-css 8.9.0 → 8.10.0

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.9.0",
3
+ "version": "8.10.0",
4
4
  "description": "CSS for Nav Designsystem",
5
5
  "author": "Aksel | Nav designsystem team",
6
6
  "keywords": [
@@ -30,7 +30,7 @@
30
30
  "css:get-version": "node config/get-version.js"
31
31
  },
32
32
  "devDependencies": {
33
- "@navikt/ds-tokens": "^8.9.0",
33
+ "@navikt/ds-tokens": "^8.10.0",
34
34
  "browserslist": "^4.25.0",
35
35
  "esbuild": "^0.27.4",
36
36
  "fast-glob": "3.3.3",
package/src/alert.css CHANGED
@@ -114,6 +114,11 @@
114
114
  &[data-variant="moderate"] {
115
115
  outline: 1px solid var(--ax-border-default);
116
116
  outline-offset: -1px;
117
+
118
+ /* Adjust horizontal padding for small moderate alerts */
119
+ &[data-size="small"] {
120
+ --__axc-base-alert-pi: var(--ax-space-16);
121
+ }
117
122
  }
118
123
 
119
124
  &[data-variant="strong"] {
@@ -145,6 +150,9 @@
145
150
  background: var(--ax-bg-moderate);
146
151
  color: var(--ax-text-default);
147
152
  border-color: var(--ax-border-subtleA);
153
+
154
+ /* Optical alignment */
155
+ padding-top: var(--ax-space-1);
148
156
  }
149
157
 
150
158
  .aksel-base-alert[data-variant="strong"] & {
@@ -172,6 +180,10 @@
172
180
  padding: var(--__axc-base-alert-content-p);
173
181
  background-color: var(--ax-bg-default);
174
182
 
183
+ &[data-color] {
184
+ color: var(--ax-text-neutral);
185
+ }
186
+
175
187
  .aksel-base-alert[data-global="true"] & {
176
188
  padding-inline: var(--__axc-global-alert-alignment);
177
189
  }
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
  }
@@ -48,41 +48,70 @@
48
48
  background-color: var(--ax-bg-neutral-softA);
49
49
  }
50
50
  }
51
-
52
- &[data-truncate-content="true"] {
53
- .aksel-data-table__td > div {
54
- text-overflow: ellipsis;
55
- white-space: nowrap;
56
- overflow: hidden;
57
- }
58
- }
59
51
  }
60
52
 
61
53
  .aksel-data-table__thead {
62
54
  background-color: var(--ax-bg-raised);
63
- position: sticky;
64
- top: 0;
55
+
56
+ .aksel-data-table[data-loading="true"] &::after {
57
+ content: "";
58
+ position: absolute;
59
+ block-size: 2px;
60
+ inset-block-end: -2px;
61
+ background-color: var(--ax-bg-strong);
62
+ animation: animateDataTableLoading 1s linear infinite;
63
+ z-index: 11;
64
+ }
65
65
  }
66
66
 
67
67
  .aksel-data-table__tbody {
68
68
  background-color: var(--ax-bg-raised);
69
- }
69
+ position: relative;
70
+
71
+ &[inert] {
72
+ transition: opacity 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
73
+ opacity: var(--ax-opacity-disabled);
74
+
75
+ @starting-style {
76
+ opacity: 0.001;
77
+ }
78
+ }
70
79
 
71
- .aksel-data-table__tr--selected {
72
- background-color: var(--ax-bg-softA);
73
- box-shadow:
74
- inset 1px 0 0 0 var(--ax-border-default),
75
- inset -1px 0 0 0 var(--ax-border-default);
80
+ &[inert]::after {
81
+ content: "";
82
+ position: absolute;
83
+ inset: 0;
84
+ background-color: var(--ax-bg-overlay);
85
+ transition: opacity 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
86
+ z-index: 10;
87
+ opacity: 0.2;
88
+
89
+ /* iOS 26+: Ensure the backdrop covers the entire visible viewport. */
90
+
91
+ @starting-style {
92
+ opacity: 0.001;
93
+ }
94
+ }
95
+ }
76
96
 
77
- &:first-of-type {
78
- box-shadow:
79
- inset 1px 0 0 0 var(--ax-border-default),
80
- inset -1px 0 0 0 var(--ax-border-default),
81
- inset 0 1px 0 0 var(--ax-border-default);
97
+ .aksel-data-table__tr {
98
+ &[data-selected="true"] {
99
+ background-color: var(--ax-bg-softA);
82
100
  }
83
101
 
84
- & :is(.aksel-data-table__td, .aksel-data-table__th) {
85
- border-color: var(--ax-border-default);
102
+ .aksel-data-table__thead &[data-sticky="true"] {
103
+ position: sticky;
104
+ top: 0;
105
+ z-index: 3;
106
+
107
+ &::after {
108
+ content: "";
109
+ position: absolute;
110
+ inset-inline: 0;
111
+ bottom: -1px;
112
+ pointer-events: none;
113
+ border-bottom: 1px solid var(--ax-border-neutral-subtle);
114
+ }
86
115
  }
87
116
  }
88
117
 
@@ -100,6 +129,7 @@
100
129
  pointer-events: none;
101
130
  border: 1px solid var(--ax-border-neutral-subtle);
102
131
  border-radius: var(--ax-radius-12);
132
+ z-index: 3;
103
133
  }
104
134
  }
105
135
 
@@ -111,16 +141,23 @@
111
141
  }
112
142
 
113
143
  .aksel-data-table__thead {
144
+ position: relative; /* Shadow ends up behind loading/empty-state without, consider after-element instead like with sticky */
114
145
  box-shadow: 0 1px 0 0 var(--ax-border-neutral-subtle);
115
146
  }
116
147
 
117
- .aksel-data-table__th,
118
- .aksel-data-table__td {
148
+ .aksel-data-table__cell {
119
149
  /* border doesn't work on sticky thead when we have collapsed borders, so using box-shadow instead */
120
150
  box-shadow: inset 1px 1px 0 0 var(--ax-border-neutral-subtle);
151
+ text-align: start;
152
+ vertical-align: middle;
153
+ scroll-margin: var(--ax-space-0);
154
+
155
+ .aksel-data-table__thead & {
156
+ background-color: var(--ax-bg-neutral-soft);
157
+ }
121
158
 
122
159
  &[data-align="left"] {
123
- text-align: left;
160
+ text-align: start;
124
161
  }
125
162
 
126
163
  &[data-align="center"] {
@@ -128,18 +165,79 @@
128
165
  }
129
166
 
130
167
  &[data-align="right"] {
131
- text-align: right;
168
+ text-align: end;
169
+ }
170
+
171
+ &[data-sticky] {
172
+ position: sticky;
173
+ z-index: 1;
174
+
175
+ &::after {
176
+ content: "";
177
+ position: absolute;
178
+ inset-block: 0;
179
+ pointer-events: none;
180
+ border-color: var(--ax-border-neutral-subtle);
181
+ border-style: solid;
182
+ border-width: 0;
183
+ }
184
+
185
+ &[data-sticky="start"] {
186
+ left: 0;
187
+
188
+ &::after {
189
+ inset-inline: 0 -1px;
190
+ border-right-width: 1px;
191
+ }
192
+ }
193
+
194
+ &[data-sticky="end"] {
195
+ right: 0;
196
+ }
197
+
198
+ background-color: var(--ax-bg-raised);
199
+
200
+ .aksel-data-table__thead & {
201
+ background-color: var(--ax-bg-neutral-soft);
202
+ }
203
+ }
204
+
205
+ &:focus-visible,
206
+ /* Focus instead of focus-visible so that effect of sort-icon staying isnt strange */
207
+ /* TODO: Update from th to generic */
208
+ &:has(.aksel-data-table__th-sort-button:focus) {
209
+ outline: 2px solid var(--ax-border-focus);
210
+ outline-offset: -4px;
211
+ }
212
+
213
+ &[data-selectable="true"] {
214
+ padding: 0;
215
+
216
+ & > div {
217
+ display: grid;
218
+ place-content: center;
219
+ }
220
+ }
221
+
222
+ &:not([data-selectable="true"]) > div {
223
+ padding-block: var(--__axc-data-table-density);
224
+ padding-inline: var(--ax-space-16);
225
+
226
+ .aksel-data-table[data-truncate-content="true"] & {
227
+ text-overflow: ellipsis;
228
+ white-space: nowrap;
229
+ overflow: hidden;
230
+ }
132
231
  }
133
232
  }
134
233
 
135
234
  /* BORDER STYLING END */
136
235
 
137
- .aksel-data-table__th {
236
+ .aksel-data-table__column-header {
237
+ /* TODO: Might want this to be dynamic */
238
+ --__axc-data-table-density: var(--ax-space-8);
239
+
138
240
  position: relative;
139
- background-color: var(--ax-bg-neutral-soft);
140
- color: var(--ax-text-neutral);
141
- padding: var(--ax-space-8) var(--ax-space-16);
142
- text-align: start;
143
241
  font-weight: var(--ax-font-weight-bold);
144
242
 
145
243
  &:has(.aksel-data-table__th-sort-button):hover {
@@ -160,7 +258,6 @@
160
258
  display: flex;
161
259
  align-items: center;
162
260
  gap: var(--ax-space-2);
163
- padding-inline-start: var(--ax-space-16);
164
261
  block-size: calc(var(--__axc-data-table-density) + 1.5rem);
165
262
  width: 100%;
166
263
  cursor: pointer;
@@ -202,7 +299,7 @@
202
299
  }
203
300
 
204
301
  .aksel-data-table__th-resize-handle {
205
- z-index: 2;
302
+ z-index: 1;
206
303
  position: absolute;
207
304
  cursor: col-resize;
208
305
  margin: 0;
@@ -233,6 +330,13 @@
233
330
  transition: background 50ms linear;
234
331
  }
235
332
 
333
+ &:hover,
334
+ &:focus-visible,
335
+ &:active {
336
+ /* Avoids clipping when having sticky columns */
337
+ z-index: 3;
338
+ }
339
+
236
340
  &:hover::after {
237
341
  /* TODO: Consider if the resize-handle should be visible already when hovering the column header */
238
342
  background: var(--ax-bg-strong);
@@ -243,7 +347,7 @@
243
347
  background: var(--ax-bg-strong-pressed);
244
348
  }
245
349
 
246
- .aksel-data-table__th:last-of-type & {
350
+ .aksel-data-table__column-header:last-of-type & {
247
351
  inset-inline-end: 0;
248
352
  width: 15px;
249
353
 
@@ -301,18 +405,6 @@
301
405
  }
302
406
  }
303
407
 
304
- .aksel-data-table__td {
305
- text-align: start;
306
- vertical-align: middle;
307
- color: var(--ax-text-neutral-subtle);
308
-
309
- > div {
310
- padding-block: var(--__axc-data-table-density);
311
- padding-inline: 1rem;
312
- }
313
- }
314
-
315
- .aksel-data-table__td,
316
408
  .aksel-data-table__th {
317
409
  scroll-margin-block: var(--ax-space-0);
318
410
  scroll-margin-inline: var(--ax-space-0);
@@ -323,6 +415,15 @@
323
415
  outline: 2px solid var(--ax-border-focus);
324
416
  outline-offset: -4px;
325
417
  }
418
+
419
+ &[data-selectable="true"] {
420
+ padding: 0;
421
+
422
+ & > div {
423
+ display: grid;
424
+ place-content: center;
425
+ }
426
+ }
326
427
  }
327
428
 
328
429
  .aksel-data-table__tfoot {
@@ -377,26 +478,34 @@
377
478
  }
378
479
  }
379
480
 
380
- .aksel-data-drag-and-drop__drag-handler__arrow {
381
- height: 1.2rem;
382
- }
383
-
384
481
  .aksel-data-drag-and-drop__drag-handler__alt,
385
482
  .aksel-data-drag-and-drop__drag-handler {
386
483
  position: relative;
387
484
  height: 1.5rem;
388
485
 
389
486
  .aksel-data-drag-and-drop__drag-handler__arrow {
487
+ height: 1.8rem;
390
488
  position: absolute;
391
489
  left: 50%;
392
490
  transform: translate(-50%, -50%);
491
+ background: var(--ax-bg-default);
492
+ border: none;
493
+ cursor: pointer;
494
+ padding: 0;
495
+ border-radius: 50%;
496
+ z-index: 1;
393
497
 
394
498
  &[data-direction="up"] {
395
- top: -10px;
499
+ top: -18px;
396
500
  }
397
501
 
398
502
  &[data-direction="down"] {
399
- bottom: calc(-100% - 6px);
503
+ bottom: calc(-100% - 22px);
504
+ }
505
+
506
+ &:disabled {
507
+ opacity: 0.8;
508
+ cursor: not-allowed;
400
509
  }
401
510
  }
402
511
  }
@@ -420,16 +529,6 @@
420
529
  gap: var(--ax-space-8);
421
530
  justify-items: center;
422
531
  position: relative;
423
-
424
- &::before {
425
- content: "";
426
- position: absolute;
427
- inline-size: 100%;
428
- block-size: 2px;
429
- inset-block-start: -1px;
430
- background-color: var(--ax-bg-strong);
431
- animation: animateDataTableLoading 1s linear infinite;
432
- }
433
532
  }
434
533
 
435
534
  @keyframes animateDataTableLoading {
@@ -466,9 +565,9 @@
466
565
  /* TODO -
467
566
  * This is needed to prevent the cursor from changing back to default when dragging over interactive elements in the row.
468
567
  * Not sure if this is the best approach or breaks styling elsewhere */
469
- html[data-dragging="true"],
470
- html[data-dragging="true"] *,
471
- html[data-dragging="true"] *::before,
472
- html[data-dragging="true"] *::after {
568
+ html[data-dragging-cursor="true"],
569
+ html[data-dragging-cursor="true"] *,
570
+ html[data-dragging-cursor="true"] *::before,
571
+ html[data-dragging-cursor="true"] *::after {
473
572
  cursor: grabbing !important;
474
573
  }
@@ -1,3 +1,8 @@
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
8
  border-radius: var(--ax-radius-8);
@@ -29,3 +34,72 @@
29
34
  /* stylelint-disable-next-line csstools/value-no-unknown-custom-properties */
30
35
  max-height: calc(var(--__axc-floating-available-height) - 4px);
31
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,9 +1,8 @@
1
1
  .aksel-data-toolbar {
2
2
  display: flex;
3
3
  flex-wrap: wrap;
4
- align-items: center;
4
+ align-items: flex-end;
5
5
  gap: var(--ax-space-8);
6
- grid-template-columns: 1fr 1fr;
7
6
  }
8
7
 
9
8
  .aksel-data-toolbar__actions {
@@ -19,8 +18,8 @@
19
18
  }
20
19
 
21
20
  .aksel-data-toolbar__input {
22
- max-inline-size: 600px;
23
- width: 100%;
21
+ flex: 1 1 fit-content;
22
+ max-inline-size: 100%;
24
23
  }
25
24
 
26
25
  .aksel-data-toolbar__pagination {