@navikt/ds-css 8.6.0 → 8.8.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.6.0",
3
+ "version": "8.8.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.6.0",
33
+ "@navikt/ds-tokens": "^8.8.0",
34
34
  "browserslist": "^4.25.0",
35
35
  "esbuild": "^0.27.2",
36
36
  "fast-glob": "3.3.3",
package/src/alert.css CHANGED
@@ -117,8 +117,8 @@
117
117
  }
118
118
 
119
119
  &[data-variant="strong"] {
120
- outline: 4px solid var(--ax-border-default);
121
- outline-offset: -4px;
120
+ outline: 2px solid var(--ax-border-default);
121
+ outline-offset: -2px;
122
122
 
123
123
  &[data-color="neutral"] {
124
124
  outline-color: var(--ax-border-strong);
@@ -192,3 +192,24 @@
192
192
  color: var(--ax-text-neutral-contrast);
193
193
  }
194
194
  }
195
+
196
+ .aksel-base-alert__message {
197
+ border-radius: var(--ax-radius-12);
198
+ height: fit-content;
199
+ outline: 1px solid var(--ax-border-default);
200
+ outline-offset: -1px;
201
+ background: var(--ax-bg-moderate);
202
+ color: var(--ax-text-default);
203
+ display: flex;
204
+ align-items: flex-start;
205
+ gap: var(--ax-space-8);
206
+ padding: var(--ax-space-12) var(--ax-space-16);
207
+
208
+ & > .aksel-base-alert__icon {
209
+ margin-top: var(--ax-space-2);
210
+ }
211
+
212
+ .aksel-base-alert[data-size="small"] & > .aksel-base-alert__icon {
213
+ margin-top: 0;
214
+ }
215
+ }
@@ -24,20 +24,23 @@
24
24
  &[data-layout="fixed"] {
25
25
  table-layout: fixed;
26
26
  width: 1px; /* This is for some reason needed to make the browser respect the column width. TODO: Test in all browsers */
27
+
28
+ /* TODO: review side-effects from this hack */
29
+ min-width: 100%;
27
30
  }
28
31
 
29
32
  &[data-layout="auto"] {
30
33
  min-width: 100%;
31
34
  }
32
35
 
33
- --__axc-data-table-density: var(--ax-space-16) 0;
36
+ --__axc-data-table-density: var(--ax-space-16);
34
37
 
35
38
  &[data-density="condensed"] {
36
- --__axc-data-table-density: var(--ax-space-8) 0;
39
+ --__axc-data-table-density: var(--ax-space-8);
37
40
  }
38
41
 
39
42
  &[data-density="spacious"] {
40
- --__axc-data-table-density: var(--ax-space-32) 0;
43
+ --__axc-data-table-density: var(--ax-space-32);
41
44
  }
42
45
 
43
46
  &[data-zebra-stripes="true"] {
@@ -115,6 +118,18 @@
115
118
  .aksel-data-table__td {
116
119
  /* border doesn't work on sticky thead when we have collapsed borders, so using box-shadow instead */
117
120
  box-shadow: inset 1px 1px 0 0 var(--ax-border-neutral-subtle);
121
+
122
+ &[data-align="left"] {
123
+ text-align: left;
124
+ }
125
+
126
+ &[data-align="center"] {
127
+ text-align: center;
128
+ }
129
+
130
+ &[data-align="right"] {
131
+ text-align: right;
132
+ }
118
133
  }
119
134
 
120
135
  /* BORDER STYLING END */
@@ -125,6 +140,59 @@
125
140
  color: var(--ax-text-neutral);
126
141
  padding: var(--ax-space-8) var(--ax-space-16);
127
142
  text-align: start;
143
+ font-weight: var(--ax-font-weight-bold);
144
+
145
+ &:has(.aksel-data-table__th-sort-button):hover {
146
+ background-color: var(--ax-bg-neutral-moderate-hover);
147
+ }
148
+
149
+ &:has(.aksel-data-table__th-sort-button):active {
150
+ background-color: var(--ax-bg-neutral-moderate-pressed);
151
+ }
152
+
153
+ &[data-sortable="true"] {
154
+ padding: 0;
155
+ block-size: calc(var(--__axc-data-table-density) + 1.5rem);
156
+ }
157
+ }
158
+
159
+ .aksel-data-table__th-sort-button {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: var(--ax-space-2);
163
+ padding-inline-start: var(--ax-space-16);
164
+ block-size: calc(var(--__axc-data-table-density) + 1.5rem);
165
+ width: 100%;
166
+ cursor: pointer;
167
+ text-align: start;
168
+ background-color: transparent;
169
+ border: none;
170
+ font-weight: inherit;
171
+
172
+ &:focus-visible {
173
+ outline: none;
174
+ }
175
+ }
176
+
177
+ .aksel-data-table__th-sort-icon {
178
+ flex-shrink: 0;
179
+ margin-left: auto;
180
+
181
+ &[data-sort-direction="none"] {
182
+ visibility: hidden;
183
+ }
184
+
185
+ .aksel-data-table__th-sort-button:is(:hover, :focus-visible, :focus-within) & {
186
+ visibility: visible;
187
+ }
188
+
189
+ .aksel-data-table[data-layout="fixed"] &[data-sort-direction="none"] {
190
+ display: none;
191
+ }
192
+
193
+ .aksel-data-table[data-layout="fixed"] .aksel-data-table__th-sort-button:is(:hover, :focus-visible, :focus-within) & {
194
+ display: block;
195
+ }
128
196
  }
129
197
 
130
198
  .aksel-data-table__th-content {
@@ -147,11 +215,22 @@
147
215
  inset-inline-end: -10px;
148
216
  width: 19px; /* TODO: Violation of WCAG SC 2.5.8 Target Size? https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html */
149
217
 
218
+ &:focus-visible {
219
+ outline: 2px solid var(--ax-border-focus);
220
+ outline-offset: -4px;
221
+ border-radius: var(--ax-radius-8);
222
+ }
223
+
150
224
  &::after {
151
225
  content: "";
152
226
  position: absolute;
153
227
  inset-block: 0;
154
228
  width: 3px;
229
+ height: 75%;
230
+ top: 50%;
231
+ transform: translateY(-50%);
232
+ border-radius: var(--ax-radius-full);
233
+ transition: background 50ms linear;
155
234
  }
156
235
 
157
236
  &:hover::after {
@@ -159,11 +238,12 @@
159
238
  background: var(--ax-bg-strong);
160
239
  }
161
240
 
162
- &:active::after {
241
+ &:active::after,
242
+ &:focus-visible::after {
163
243
  background: var(--ax-bg-strong-pressed);
164
244
  }
165
245
 
166
- .aksel-data-table__th:last-child & {
246
+ .aksel-data-table__th:last-of-type & {
167
247
  inset-inline-end: 0;
168
248
  width: 15px;
169
249
 
@@ -171,6 +251,34 @@
171
251
  inset-inline-end: 0;
172
252
  }
173
253
  }
254
+
255
+ &[data-active="true"] {
256
+ .aksel-data-table__th-resize-handle-indicator {
257
+ position: absolute;
258
+ top: 50%;
259
+ color: var(--ax-bg-strong);
260
+ transform: translateY(-50%);
261
+ height: 1.5rem;
262
+
263
+ &.aksel-data-table__th-resize-handle-indicator--start {
264
+ right: 12px;
265
+ }
266
+
267
+ &.aksel-data-table__th-resize-handle-indicator--end {
268
+ left: 12px;
269
+ }
270
+ }
271
+
272
+ &::after {
273
+ background: var(--ax-bg-strong);
274
+ }
275
+
276
+ &:focus-visible,
277
+ &:focus,
278
+ &:active {
279
+ outline: none;
280
+ }
281
+ }
174
282
  }
175
283
 
176
284
  .aksel-data-table__th-action-button {
@@ -199,7 +307,7 @@
199
307
  color: var(--ax-text-neutral-subtle);
200
308
 
201
309
  > div {
202
- padding: var(--__axc-data-table-density);
310
+ padding-block: var(--__axc-data-table-density);
203
311
  padding-inline: 1rem;
204
312
  }
205
313
  }
@@ -209,7 +317,9 @@
209
317
  scroll-margin-block: var(--ax-space-0);
210
318
  scroll-margin-inline: var(--ax-space-0);
211
319
 
212
- &:focus-visible {
320
+ &:focus-visible,
321
+ /* Focus instead of focus-visible so that effect of sort-icon staying isnt strange */
322
+ &:has(.aksel-data-table__th-sort-button:focus) {
213
323
  outline: 2px solid var(--ax-border-focus);
214
324
  outline-offset: -4px;
215
325
  }
@@ -218,3 +328,130 @@
218
328
  .aksel-data-table__tfoot {
219
329
  background-color: var(--ax-bg-raised);
220
330
  }
331
+
332
+ .aksel-data-table__filler-cell {
333
+ width: auto;
334
+ display: table-cell;
335
+ padding: 0;
336
+ }
337
+
338
+ .aksel-data-table__drag-and-drop-item {
339
+ &[data-dragging="true"] {
340
+ background: var(--ax-bg-default);
341
+ }
342
+
343
+ &[data-mouse-dragging="true"]:not(:active) {
344
+ opacity: 0.8;
345
+ }
346
+
347
+ &[data-keyboard-dragging="true"] {
348
+ .aksel-data-drag-and-drop__drag-handler__button {
349
+ outline: 2px solid var(--ax-border-focus);
350
+ outline-offset: -1px;
351
+ border-radius: var(--ax-radius-8);
352
+ }
353
+ }
354
+
355
+ &[data-drop-target="true"] {
356
+ background: var(--ax-bg-neutral-moderate);
357
+ }
358
+ }
359
+
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
+ .aksel-data-drag-and-drop__drag-handler__arrow {
376
+ height: 1.2rem;
377
+ }
378
+
379
+ .aksel-data-drag-and-drop__drag-handler__alt {
380
+ position: relative;
381
+
382
+ .aksel-data-drag-and-drop__drag-handler__arrow {
383
+ position: absolute;
384
+ left: 50%;
385
+ transform: translate(-50%, -50%);
386
+
387
+ &[data-direction="up"] {
388
+ top: -10px;
389
+ }
390
+
391
+ &[data-direction="down"] {
392
+ bottom: calc(-100% - 6px);
393
+ }
394
+ }
395
+ }
396
+
397
+ .aksel-data-table__empty-state {
398
+ display: grid;
399
+ place-content: center;
400
+ padding-block: var(--ax-space-32);
401
+ padding-inline: var(--ax-space-16);
402
+ text-align: center;
403
+ gap: var(--ax-space-8);
404
+ justify-items: center;
405
+ }
406
+
407
+ .aksel-data-table__loading-state {
408
+ display: grid;
409
+ place-content: center;
410
+ padding-block: var(--ax-space-32);
411
+ padding-inline: var(--ax-space-16);
412
+ text-align: center;
413
+ gap: var(--ax-space-8);
414
+ justify-items: center;
415
+ position: relative;
416
+
417
+ &::before {
418
+ content: "";
419
+ position: absolute;
420
+ inline-size: 100%;
421
+ block-size: 2px;
422
+ inset-block-start: -1px;
423
+ background-color: var(--ax-bg-strong);
424
+ animation: animateDataTableLoading 1s linear infinite;
425
+ }
426
+ }
427
+
428
+ @keyframes animateDataTableLoading {
429
+ 0% {
430
+ inset-inline-start: 0;
431
+ inline-size: 0;
432
+ }
433
+
434
+ 20% {
435
+ inset-inline-start: 0;
436
+ inline-size: 40%;
437
+ }
438
+
439
+ 80% {
440
+ inset-inline-start: 60%;
441
+ inline-size: 40%;
442
+ }
443
+
444
+ 100% {
445
+ inset-inline-start: 100%;
446
+ inline-size: 0;
447
+ }
448
+ }
449
+
450
+ /* TODO: Look to handle "inline"-checkbox better than custom CSS-overrides in the future. */
451
+ .aksel-data-table tr .aksel-checkbox {
452
+ padding: 0;
453
+ }
454
+
455
+ .aksel-data-table tr .aksel-checkbox:focus-within::after {
456
+ inset: 0;
457
+ }
@@ -0,0 +1,36 @@
1
+ .aksel-property-filter__popup {
2
+ overflow: hidden;
3
+ border-radius: var(--ax-radius-12);
4
+ border: 1px solid var(--ax-border-neutral-subtleA);
5
+ box-shadow: var(--ax-shadow-dialog);
6
+ /* stylelint-disable-next-line csstools/value-no-unknown-custom-properties */
7
+ transform-origin: var(--__axc-floating-transform-origin);
8
+ transition:
9
+ transform 150ms ease allow-discrete,
10
+ opacity 150ms ease allow-discrete;
11
+
12
+ @starting-style {
13
+ opacity: 0.8;
14
+ transform: scale3d(0.94, 0.94, 0.94);
15
+ }
16
+
17
+ min-width: 260px;
18
+ }
19
+
20
+ .aksel-property-filter__popup-inner {
21
+ --__axc-token-filter-content-p: var(--ax-space-8);
22
+ --__axc-token-filter-item-pr: var(--ax-space-8);
23
+ --__axc-token-filter-item-pl: var(--ax-space-8);
24
+ --__axc-token-filter-item-height: 2rem;
25
+
26
+ border-radius: var(--ax-radius-12);
27
+ background-color: var(--ax-bg-raised);
28
+ min-width: 128px;
29
+ max-width: min(95vw, 640px);
30
+ animation-duration: 160ms;
31
+ animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
32
+ padding: var(--__axc-token-filter-content-p);
33
+ overflow: auto;
34
+ /* stylelint-disable-next-line csstools/value-no-unknown-custom-properties */
35
+ max-height: calc(var(--__axc-floating-available-height) - 4px);
36
+ }
package/src/date.css CHANGED
@@ -1,4 +1,6 @@
1
1
  .aksel-date {
2
+ --__axc-date-button-size: 2.5rem;
3
+
2
4
  padding: var(--ax-space-16);
3
5
 
4
6
  .rdp-table {
@@ -7,6 +9,17 @@
7
9
 
8
10
  .rdp-cell {
9
11
  padding: 1px; /* Some CSS-resets sets padding:0 on all items */
12
+
13
+ &[data-outside="true"] {
14
+ width: var(--__axc-date-button-size);
15
+ height: var(--__axc-date-button-size);
16
+
17
+ /* Padding is ignored when element is empty */
18
+ &:empty {
19
+ width: calc(var(--__axc-date-button-size) + 2px);
20
+ height: calc(var(--__axc-date-button-size) + 2px);
21
+ }
22
+ }
10
23
  }
11
24
 
12
25
  .rdp-day_range_middle {
@@ -40,8 +53,8 @@
40
53
  .rdp-button {
41
54
  all: unset;
42
55
  display: block;
43
- width: 2.5rem;
44
- height: 2.5rem;
56
+ width: var(--__axc-date-button-size);
57
+ height: var(--__axc-date-button-size);
45
58
  text-align: center;
46
59
  border-radius: var(--ax-radius-8);
47
60
  }
@@ -129,6 +142,13 @@
129
142
  }
130
143
  }
131
144
 
145
+ .aksel-date__popover {
146
+ &:focus-visible {
147
+ outline: 3px solid var(--ax-border-focus);
148
+ outline-offset: 3px;
149
+ }
150
+ }
151
+
132
152
  .aksel-date__caption {
133
153
  display: flex;
134
154
  justify-content: space-between;
@@ -272,6 +292,8 @@
272
292
 
273
293
  @media (min-width: 480px) {
274
294
  .aksel-date {
295
+ --__axc-date-button-size: 3rem;
296
+
275
297
  padding: var(--ax-space-20);
276
298
  }
277
299
 
@@ -283,7 +305,6 @@
283
305
  gap: var(--ax-space-8);
284
306
  }
285
307
 
286
- .aksel-date .rdp-button,
287
308
  .aksel-date__caption-button {
288
309
  width: 3rem;
289
310
  height: 3rem;
@@ -1,6 +1,6 @@
1
1
  .aksel-inline-message {
2
2
  display: flex;
3
- gap: var(--ax-space-4);
3
+ gap: var(--ax-space-8);
4
4
  color: var(--ax-text-default);
5
5
  }
6
6
 
@@ -8,6 +8,7 @@
8
8
  color: var(--ax-text-subtle);
9
9
  font-size: 1.5rem;
10
10
  flex: 0 0 auto;
11
+ margin-block-start: var(--ax-space-2);
11
12
 
12
13
  .aksel-inline-message[data-size="small"] & {
13
14
  font-size: 1.25rem;
@@ -0,0 +1,14 @@
1
+ .aksel-listbox__options {
2
+ padding: var(--ax-space-4);
3
+ }
4
+
5
+ .aksel-listbox__option {
6
+ cursor: default;
7
+ border-radius: var(--ax-radius-8);
8
+ padding: var(--ax-space-4) var(--ax-space-2);
9
+ scroll-margin-block: 4px;
10
+
11
+ &[data-virtual-focus="true"] {
12
+ outline: 2px solid var(--ax-border-focus);
13
+ }
14
+ }
package/src/read-more.css CHANGED
@@ -3,6 +3,41 @@
3
3
  --__axc-read-more-pi-start: 0px;
4
4
  --__axc-read-more-pi-end: var(--ax-space-4);
5
5
  --__axc-read-more-pb: var(--ax-space-4);
6
+
7
+ &[data-variant="ghost"] {
8
+ --__axc-read-more-radius: var(--ax-radius-4);
9
+ }
10
+
11
+ &[data-variant="moderate"] {
12
+ --__axc-read-more-radius: calc((var(--__axc-read-more-pb) * 2 + var(--ax-font-line-height-large)) / 2);
13
+ }
14
+ }
15
+
16
+ .aksel-read-more--large {
17
+ --__axc-read-more-pb: var(--ax-space-12);
18
+
19
+ &[data-variant="moderate"] {
20
+ --__axc-read-more-pi-start: var(--ax-space-12);
21
+ --__axc-read-more-pi-end: var(--ax-space-24);
22
+ }
23
+ }
24
+
25
+ .aksel-read-more--medium {
26
+ &[data-variant="moderate"] {
27
+ --__axc-read-more-pi-start: var(--ax-space-8);
28
+ --__axc-read-more-pi-end: var(--ax-space-16);
29
+ }
30
+ }
31
+
32
+ .aksel-read-more--small {
33
+ --__axc-read-more-icon-size: 1.25rem;
34
+ --__axc-read-more-pb: var(--ax-space-2);
35
+
36
+ &[data-variant="moderate"] {
37
+ --__axc-read-more-pi-start: var(--ax-space-8);
38
+ --__axc-read-more-pi-end: var(--ax-space-16);
39
+ --__axc-read-more-radius: calc((var(--__axc-read-more-pb) * 2 + var(--ax-font-line-height-medium)) / 2);
40
+ }
6
41
  }
7
42
 
8
43
  /* ----------------------------- ReadMore Button ---------------------------- */
@@ -18,48 +53,27 @@
18
53
  padding-inline: var(--__axc-read-more-pi-start) var(--__axc-read-more-pi-end);
19
54
  padding-block: var(--__axc-read-more-pb);
20
55
  text-align: start;
56
+ border-radius: var(--__axc-read-more-radius);
21
57
 
22
58
  &:focus-visible {
23
59
  outline: 3px solid var(--ax-border-focus);
24
60
  outline-offset: 3px;
25
61
  }
26
62
 
27
- &[data-state="open"] .aksel-read-more__expand-icon {
28
- transform: rotateX(-180deg);
29
- }
30
- }
31
-
32
- .aksel-read-more:is([data-volume="low"], :not([data-volume])) {
33
- & .aksel-read-more__button {
34
- border-radius: var(--ax-radius-4);
35
-
63
+ .aksel-read-more[data-variant="ghost"] & {
36
64
  &:hover {
37
65
  background-color: var(--ax-bg-neutral-moderate-hoverA);
38
66
  }
39
67
  }
40
- }
41
68
 
42
- .aksel-read-more[data-volume="high"] {
43
- & .aksel-read-more__button {
69
+ .aksel-read-more[data-variant="moderate"] & {
44
70
  background-color: var(--ax-bg-moderate);
45
- border-radius: var(--ax-radius-full);
46
71
 
47
72
  &:hover {
48
- background-color: var(--ax-bg-moderate-hoverA);
73
+ background-color: var(--ax-bg-moderate-hover);
49
74
  color: var(--ax-text-default);
50
75
  }
51
76
  }
52
-
53
- &.aksel-read-more--large {
54
- --__axc-read-more-pi-start: var(--ax-space-12);
55
- --__axc-read-more-pi-end: var(--ax-space-24);
56
- }
57
-
58
- &.aksel-read-more--small,
59
- &.aksel-read-more--medium {
60
- --__axc-read-more-pi-start: var(--ax-space-8);
61
- --__axc-read-more-pi-end: var(--ax-space-16);
62
- }
63
77
  }
64
78
 
65
79
  /* ---------------------------- ReadMore Content ---------------------------- */
@@ -70,7 +84,7 @@
70
84
  margin-left: calc(var(--__axc-read-more-pi-start) + var(--__axc-read-more-icon-size) / 2 - 1px);
71
85
  padding-left: calc(var(--__axc-read-more-icon-size) / 2 - 1px + var(--ax-space-4));
72
86
 
73
- &[data-state="closed"] {
87
+ .aksel-read-more[data-state="closed"] & {
74
88
  display: none;
75
89
  }
76
90
  }
@@ -78,20 +92,14 @@
78
92
  .aksel-read-more__expand-icon {
79
93
  font-size: var(--__axc-read-more-icon-size);
80
94
  flex-shrink: 0;
81
- transition: transform 100ms cubic-bezier(0.2, 0, 0, 1);
82
- }
83
-
84
- /* ----------------------------- ReadMore Sizes ----------------------------- */
85
- .aksel-read-more--large {
86
- --__axc-read-more-pb: var(--ax-space-12);
87
- }
95
+ transition: transform 100ms ease-in-out;
88
96
 
89
- .aksel-read-more--small {
90
- --__axc-read-more-icon-size: 1.25rem;
91
- --__axc-read-more-pb: var(--ax-space-2);
97
+ .aksel-read-more[data-state="open"] & {
98
+ transform: rotateX(-180deg);
99
+ }
92
100
  }
93
101
 
94
- /* ------------------------- ReadMore high-contrast ------------------------- */
102
+ /* ------------------------- high-contrast ------------------------- */
95
103
  @media (forced-colors: active) {
96
104
  .aksel-read-more__button {
97
105
  background-color: ButtonFace;