@digdir/designsystemet-css 0.6.1-alpha.1 → 0.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.
Files changed (76) hide show
  1. package/LICENSE +1 -1
  2. package/box.css +73 -0
  3. package/button.css +9 -9
  4. package/card.css +157 -0
  5. package/checkbox.css +175 -0
  6. package/chip.css +173 -0
  7. package/combobox.css +344 -0
  8. package/dist/box.css +1 -0
  9. package/dist/button.css +1 -1
  10. package/dist/card.css +1 -0
  11. package/dist/checkbox.css +1 -0
  12. package/dist/chip.css +1 -0
  13. package/dist/combobox.css +1 -0
  14. package/dist/divider.css +1 -0
  15. package/dist/dropdownmenu.css +1 -0
  16. package/dist/error-message.css +1 -0
  17. package/dist/error-summary.css +1 -0
  18. package/dist/fieldset.css +1 -0
  19. package/dist/heading.css +1 -0
  20. package/dist/helptext.css +1 -0
  21. package/dist/index.css +1 -1
  22. package/dist/ingress.css +1 -1
  23. package/dist/label.css +1 -0
  24. package/dist/link.css +1 -0
  25. package/dist/list.css +1 -0
  26. package/dist/modal.css +1 -0
  27. package/dist/native-select.css +1 -0
  28. package/dist/pagination.css +1 -0
  29. package/dist/paragraph.css +1 -0
  30. package/dist/popover.css +1 -0
  31. package/dist/radio.css +1 -0
  32. package/dist/search.css +1 -0
  33. package/dist/skeleton.css +1 -0
  34. package/dist/spinner.css +1 -0
  35. package/dist/switch.css +1 -0
  36. package/dist/table.css +1 -0
  37. package/dist/tabs.css +1 -0
  38. package/dist/tag.css +1 -0
  39. package/dist/textarea.css +1 -0
  40. package/dist/textfield.css +1 -0
  41. package/dist/togglegroup.css +1 -0
  42. package/dist/tooltip.css +1 -0
  43. package/dist/utils.css +1 -1
  44. package/divider.css +18 -0
  45. package/dropdownmenu.css +46 -0
  46. package/error-message.css +43 -0
  47. package/error-summary.css +15 -0
  48. package/fieldset.css +41 -0
  49. package/heading.css +68 -0
  50. package/helptext.css +58 -0
  51. package/index.css +33 -2
  52. package/ingress.css +1 -1
  53. package/label.css +46 -0
  54. package/link.css +36 -0
  55. package/list.css +18 -0
  56. package/modal.css +106 -0
  57. package/native-select.css +92 -0
  58. package/package.json +2 -5
  59. package/pagination.css +69 -0
  60. package/paragraph.css +82 -0
  61. package/popover.css +79 -0
  62. package/radio.css +171 -0
  63. package/search.css +170 -0
  64. package/skeleton.css +59 -0
  65. package/spinner.css +75 -0
  66. package/switch.css +216 -0
  67. package/table.css +136 -0
  68. package/tabs.css +103 -0
  69. package/tag.css +72 -0
  70. package/textarea.css +80 -0
  71. package/textfield.css +150 -0
  72. package/togglegroup.css +24 -0
  73. package/tooltip.css +23 -0
  74. package/utils.css +16 -0
  75. package/dist/react-css-modules.css +0 -1
  76. package/react-css-modules.css +0 -3099
package/pagination.css ADDED
@@ -0,0 +1,69 @@
1
+ @layer fds.pagination {
2
+ .fds-pagination {
3
+ --fds-pagination-listitem-margin: var(--fds-spacing-4);
4
+ --fds-pagination-ellipsis-width: var(--fds-sizing-12);
5
+ --fds-pagination-chevron-margin: var(--fds-spacing-2);
6
+
7
+ list-style-type: none;
8
+ display: flex;
9
+ padding: 0;
10
+ margin: 0;
11
+ position: relative;
12
+ width: fit-content;
13
+ }
14
+
15
+ .fds-pagination--hidden {
16
+ visibility: hidden;
17
+ }
18
+
19
+ .fds-pagination--small {
20
+ --fds-pagination-chevron-margin: var(--fds-spacing-2);
21
+ }
22
+
23
+ .fds-pagination--medium {
24
+ --fds-pagination-chevron-margin: var(--fds-spacing-2);
25
+ }
26
+
27
+ .fds-pagination--large {
28
+ --fds-pagination-chevron-margin: var(--fds-spacing-2);
29
+ }
30
+
31
+ .fds-pagination li:first-child {
32
+ margin-right: var(--fds-pagination-chevron-margin);
33
+ }
34
+
35
+ .fds-pagination li:last-child {
36
+ margin-left: var(--fds-pagination-chevron-margin);
37
+ }
38
+
39
+ .fds-pagination__item {
40
+ flex: 1;
41
+ margin-right: var(--fds-pagination-listitem-margin);
42
+ }
43
+
44
+ .fds-pagination--small .fds-pagination__item {
45
+ --fds-pagination-listitem-margin: var(--fds-spacing-2);
46
+ --fds-pagination-ellipsis-width: var(--fds-sizing-10);
47
+ }
48
+
49
+ .fds-pagination--medium .fds-pagination__item {
50
+ --fds-pagination-listitem-margin: var(--fds-spacing-4);
51
+ --fds-pagination-ellipsis-width: var(--fds-sizing-12);
52
+ }
53
+
54
+ .fds-pagination--large .fds-pagination__item {
55
+ --fds-pagination-listitem-margin: var(--fds-spacing-6);
56
+ --fds-pagination-ellipsis-width: var(--fds-sizing-14);
57
+ }
58
+
59
+ .fds-pagination__item.fds-pagination--compact {
60
+ --fds-pagination-listitem-margin: var(--fds-spacing-0);
61
+ --fds-pagination-chevron-margin: var(--fds-spacing-1);
62
+ }
63
+
64
+ .fds-pagination__ellipsis {
65
+ margin-top: 0.5em;
66
+ text-align: center;
67
+ width: var(--fds-pagination-ellipsis-width);
68
+ }
69
+ }
package/paragraph.css ADDED
@@ -0,0 +1,82 @@
1
+ @layer fds.typography.paragraph {
2
+ .fds-paragraph {
3
+ --fdsc-bottom-spacing: var(--fds-spacing-5);
4
+
5
+ color: var(--fds-semantic-text-neutral-default);
6
+ margin: 0;
7
+ }
8
+
9
+ .fds-paragraph--spacing {
10
+ margin-bottom: var(--fdsc-bottom-spacing);
11
+ }
12
+
13
+ .fds-paragraph--large {
14
+ --fdsc-bottom-spacing: var(--fds-spacing-6);
15
+
16
+ font: var(--fds-typography-paragraph-large);
17
+ font-family: inherit;
18
+ }
19
+
20
+ .fds-paragraph--large.fds-paragraph--short {
21
+ font: var(--fds-typography-paragraph-short-large);
22
+ font-family: inherit;
23
+ }
24
+
25
+ .fds-paragraph--large.fds-paragraph--long {
26
+ line-height: var(--fds-typography-paragraph-long-large);
27
+ }
28
+
29
+ .fds-paragraph--medium {
30
+ --fdsc-bottom-spacing: var(--fds-spacing-5);
31
+
32
+ font: var(--fds-typography-paragraph-medium);
33
+ font-family: inherit;
34
+ }
35
+
36
+ .fds-paragraph--medium.fds-paragraph--short {
37
+ --fdsc-bottom-spacing: var(--fds-spacing-5);
38
+
39
+ font: var(--fds-typography-paragraph-short-medium);
40
+ font-family: inherit;
41
+ }
42
+
43
+ .fds-paragraph--medium.fds-paragraph--long {
44
+ line-height: var(--fds-typography-paragraph-long-medium);
45
+ }
46
+
47
+ .fds-paragraph--small {
48
+ --fdsc-bottom-spacing: var(--fds-spacing-4);
49
+
50
+ font: var(--fds-typography-paragraph-small);
51
+ font-family: inherit;
52
+ }
53
+
54
+ .fds-paragraph--small.fds-paragraph--short {
55
+ --fdsc-bottom-spacing: var(--fds-spacing-4);
56
+
57
+ font: var(--fds-typography-paragraph-short-small);
58
+ font-family: inherit;
59
+ }
60
+
61
+ .fds-paragraph--small.fds-paragraph--long {
62
+ line-height: var(--fds-typography-paragraph-long-small);
63
+ }
64
+
65
+ .fds-paragraph--xsmall {
66
+ --fdsc-bottom-spacing: var(--fds-spacing-3);
67
+
68
+ font: var(--fds-typography-paragraph-xsmall);
69
+ font-family: inherit;
70
+ }
71
+
72
+ .fds-paragraph--xsmall.fds-paragraph--short {
73
+ --fdsc-bottom-spacing: var(--fds-spacing-3);
74
+
75
+ font: var(--fds-typography-paragraph-short-xsmall);
76
+ font-family: inherit;
77
+ }
78
+
79
+ .fds-paragraph--xsmall.fds-paragraph--long {
80
+ line-height: var(--fds-typography-paragraph-long-xsmall);
81
+ }
82
+ }
package/popover.css ADDED
@@ -0,0 +1,79 @@
1
+ @layer fds.fds-popover {
2
+ .fds-popover {
3
+ --fds-popover-border: 1px solid;
4
+ --fds-popover-background: var(--fds-semantic-surface-neutral-default);
5
+
6
+ z-index: 1500;
7
+ background: var(--fds-popover-background);
8
+ padding: var(--fds-spacing-3);
9
+ border: var(--fds-popover-border);
10
+ border-radius: var(--fds-border_radius-medium);
11
+ max-width: 300px;
12
+ }
13
+
14
+ .fds-popover--small {
15
+ padding: var(--fds-spacing-2) var(--fds-spacing-3);
16
+ }
17
+
18
+ .fds-popover--medium {
19
+ padding: var(--fds-spacing-3) var(--fds-spacing-4);
20
+ }
21
+
22
+ .fds-popover--large {
23
+ padding: var(--fds-spacing-3) var(--fds-spacing-5);
24
+ }
25
+
26
+ .fds-popover--default {
27
+ --fds-popover-background: var(--fds-semantic-surface-neutral-default);
28
+
29
+ border-color: var(--fds-semantic-border-neutral-default);
30
+ }
31
+
32
+ .fds-popover--info {
33
+ --fds-popover-background: var(--fds-semantic-surface-info-subtle);
34
+
35
+ border-color: var(--fds-semantic-border-info-default);
36
+ }
37
+
38
+ .fds-popover--warning {
39
+ --fds-popover-background: var(--fds-semantic-surface-warning-subtle);
40
+
41
+ border-color: var(--fds-semantic-border-warning-default);
42
+ }
43
+
44
+ .fds-popover--danger {
45
+ --fds-popover-background: var(--fds-semantic-surface-danger-subtle);
46
+
47
+ border-color: var(--fds-semantic-border-danger-default);
48
+ }
49
+
50
+ .fds-popover__arrow {
51
+ position: absolute;
52
+ background: var(--fds-popover-background);
53
+ transform: rotate(45deg);
54
+ }
55
+
56
+ .fds-popover__arrow.fds-popover__arrow--top {
57
+ border-top: var(--fds-popover-border);
58
+ border-left: var(--fds-popover-border);
59
+ border-color: inherit;
60
+ }
61
+
62
+ .fds-popover__arrow.fds-popover__arrow--bottom {
63
+ border-bottom: var(--fds-popover-border);
64
+ border-right: var(--fds-popover-border);
65
+ border-color: inherit;
66
+ }
67
+
68
+ .fds-popover__arrow.fds-popover__arrow--right {
69
+ border-top: var(--fds-popover-border);
70
+ border-right: var(--fds-popover-border);
71
+ border-color: inherit;
72
+ }
73
+
74
+ .fds-popover__arrow.fds-popover__arrow--left {
75
+ border-bottom: var(--fds-popover-border);
76
+ border-left: var(--fds-popover-border);
77
+ border-color: inherit;
78
+ }
79
+ }
package/radio.css ADDED
@@ -0,0 +1,171 @@
1
+ @layer fds.radio {
2
+ .fds-radio {
3
+ --fds-radio-size: 1.75rem;
4
+ --fds-radio-focus-border-width: 3px;
5
+ --fds-radio-background: var(--fds-semantic-background-default);
6
+ --fds-radio-border-color: var(--fds-semantic-border-input-default);
7
+ --fds-radio-border__hover: 0 0 0 var(--fds-spacing-2) var(--fds-semantic-surface-info-subtle-hover);
8
+
9
+ display: grid;
10
+ }
11
+
12
+ .fds-radio:has(.fds-radio__label) {
13
+ grid-template-columns: var(--fds-radio-size) auto;
14
+ gap: var(--fds-spacing-2);
15
+ }
16
+
17
+ /* Radio */
18
+ .fds-radio__input {
19
+ position: relative;
20
+ width: var(--fds-radio-size);
21
+ height: var(--fds-radio-size);
22
+ z-index: 1;
23
+ appearance: none;
24
+ outline: none;
25
+ cursor: pointer;
26
+ margin: 0;
27
+ align-self: center;
28
+ box-shadow: inset 0 0 0 2px var(--fds-radio-border-color);
29
+ background: var(--fds-radio-background);
30
+ border-radius: 50%;
31
+ }
32
+
33
+ .fds-radio__input::before {
34
+ position: absolute;
35
+ content: '';
36
+ display: block;
37
+ width: 2.75rem;
38
+ height: 2.75rem;
39
+ transform: translate(-50%, -50%);
40
+ top: 50%;
41
+ left: 50%;
42
+ cursor: pointer;
43
+ border-radius: var(--fds-border_radius-medium);
44
+ }
45
+
46
+ .fds-radio__label {
47
+ min-height: var(--fds-sizing-10);
48
+ min-width: min-content;
49
+ display: inline-flex;
50
+ flex-direction: row;
51
+ gap: var(--fds-spacing-1);
52
+ align-items: center;
53
+ cursor: pointer;
54
+ }
55
+
56
+ .fds-radio__description {
57
+ margin-top: calc(var(--fds-spacing-3) * -1);
58
+ color: var(--fds-semantic-text-neutral-subtle);
59
+ grid-column: 2;
60
+ }
61
+
62
+ .fds-radio--disabled > .fds-radio__input,
63
+ .fds-radio--disabled > .fds-radio__label,
64
+ .fds-radio--disabled > .fds-radio__input::before {
65
+ cursor: not-allowed;
66
+ }
67
+
68
+ .fds-radio--disabled > .fds-radio__label,
69
+ .fds-radio--disabled > .fds-radio__input,
70
+ .fds-radio--disabled > .fds-radio__description {
71
+ opacity: var(--fds-opacity-disabled);
72
+ }
73
+
74
+ .fds-radio--readonly > .fds-radio__input,
75
+ .fds-radio--readonly > .fds-radio__label,
76
+ .fds-radio--readonly > .fds-radio__input::before {
77
+ cursor: default;
78
+ }
79
+
80
+ .fds-radio__input:focus-visible {
81
+ outline-offset: 0;
82
+ outline: var(--fds-radio-focus-border-width) solid var(--fds-semantic-border-focus-outline);
83
+ box-shadow:
84
+ inset 0 0 0 var(--fds-radio-focus-border-width) var(--fds-semantic-border-focus-boxshadow),
85
+ inset 0 0 0 6px var(--fds-radio-background);
86
+ }
87
+
88
+ .fds-radio__input:checked {
89
+ --fds-radio-border-color: var(--fds-semantic-border-input-hover);
90
+
91
+ background: var(--fds-radio-border-color);
92
+ }
93
+
94
+ .fds-radio--readonly > .fds-radio__input {
95
+ --fds-radio-border-color: var(--fds-semantic-border-neutral-subtle);
96
+ --fds-radio-background: var(--fds-semantic-surface-neutral-subtle);
97
+ }
98
+
99
+ .fds-radio__input:checked:not(:focus-visible) {
100
+ box-shadow:
101
+ inset 0 0 0 2px var(--fds-radio-border-color),
102
+ inset 0 0 0 6px var(--fds-radio-background);
103
+ }
104
+
105
+ .fds-radio--readonly > .fds-radio__input:checked {
106
+ background: var(--fds-semantic-border-neutral-default);
107
+ }
108
+
109
+ .fds-radio--error > .fds-radio__input:not(:disabled, :focus-visible) {
110
+ --fds-radio-border-color: var(--fds-semantic-border-danger-default);
111
+ }
112
+
113
+ /* Only use hover for non-touch devices to prevent sticky-hovering
114
+ "input:not(:read-only)" does not work so using ".container:not(.readonly) >" instead */
115
+ @media (hover: hover) and (pointer: fine) {
116
+ .fds-radio:not(.fds-radio--readonly, .fds-radio--disabled) > .fds-radio__label:hover,
117
+ .fds-radio:not(.fds-radio--readonly, .fds-radio--disabled) > .fds-radio__input:hover + .fds-radio__label {
118
+ color: var(--fds-semantic-text-action-hover);
119
+ }
120
+
121
+ .fds-radio:not(.fds-radio--readonly, .fds-radio--disabled) > .fds-radio__input:hover:not(:checked) {
122
+ --fds-radio-border-color: var(--fds-semantic-border-input-hover);
123
+
124
+ box-shadow:
125
+ var(--fds-radio-border__hover),
126
+ inset 0 0 0 2px var(--fds-radio-border-color);
127
+ }
128
+
129
+ .fds-radio:not(.fds-radio--readonly, .fds-radio--disabled) > .fds-radio__input:hover:checked {
130
+ --fds-radio-border-color: var(--fds-semantic-border-input-hover);
131
+
132
+ box-shadow:
133
+ var(--fds-radio-border__hover),
134
+ inset 0 0 0 2px var(--fds-radio-border-color),
135
+ inset 0 0 0 6px var(--fds-radio-background);
136
+ }
137
+
138
+ .fds-radio:not(.fds-radio--readonly, .fds-radio--disabled) > .fds-radio__input:hover:checked:focus-visible {
139
+ box-shadow:
140
+ var(--fds-radio-border__hover),
141
+ inset 0 0 0 var(--fds-radio-focus-border-width) var(--fds-semantic-border-focus-boxshadow),
142
+ inset 0 0 0 6px var(--fds-radio-background);
143
+ }
144
+ }
145
+
146
+ /** Sizing */
147
+
148
+ .fds-radio--small {
149
+ --fds-radio-size: var(--fds-sizing-5);
150
+
151
+ min-height: var(--fds-sizing-10);
152
+ }
153
+
154
+ .fds-radio--medium {
155
+ --fds-radio-size: var(--fds-sizing-6);
156
+
157
+ min-height: var(--fds-sizing-11);
158
+ }
159
+
160
+ .fds-radio--large {
161
+ --fds-radio-size: var(--fds-sizing-7);
162
+
163
+ min-height: var(--fds-sizing-12);
164
+ }
165
+
166
+ .fds-radio-group--horizontal {
167
+ display: flex;
168
+ flex-direction: row;
169
+ gap: var(--fds-spacing-2);
170
+ }
171
+ }
package/search.css ADDED
@@ -0,0 +1,170 @@
1
+ @layer fds.search {
2
+ .fds-search {
3
+ display: inline-grid;
4
+ width: 100%;
5
+ gap: var(--fds-spacing-2);
6
+ }
7
+
8
+ .fds-search--small {
9
+ --f-search-button-clear-size: var(--fds-sizing-5);
10
+ }
11
+
12
+ .fds-search--medium {
13
+ --f-search-button-clear-size: var(--fds-sizing-6);
14
+ }
15
+
16
+ .fds-search--large {
17
+ --f-search-button-clear-size: var(--fds-sizing-8);
18
+ }
19
+
20
+ .fds-search__error:empty {
21
+ display: none;
22
+ }
23
+
24
+ .fds-search__label {
25
+ min-width: min-content;
26
+ display: inline-flex;
27
+ flex-direction: row;
28
+ gap: var(--fds-spacing-1);
29
+ align-items: center;
30
+ }
31
+
32
+ .fds-search__field {
33
+ display: flex;
34
+ width: 100%;
35
+ align-items: stretch;
36
+ border-radius: var(--fds-border_radius-medium);
37
+ position: relative;
38
+ }
39
+
40
+ .fds-search__icon {
41
+ position: absolute;
42
+ height: 100%;
43
+ z-index: 2;
44
+ left: var(--fds-spacing-4);
45
+ transform: scale(1.5);
46
+ pointer-events: none;
47
+ }
48
+
49
+ [type='search']::-webkit-search-decoration,
50
+ [type='search']::-webkit-search-cancel-button {
51
+ appearance: none;
52
+ }
53
+
54
+ .fds-search__input {
55
+ font: inherit;
56
+ font-family: inherit;
57
+ position: relative;
58
+ box-sizing: border-box;
59
+ flex: 0 1 auto;
60
+ height: var(--fds-sizing-10);
61
+ width: 100%;
62
+ appearance: none;
63
+ padding: 0 var(--fds-spacing-3);
64
+ border: solid 1px var(--fds-semantic-border-input-default);
65
+ border-radius: var(--fds-border_radius-medium);
66
+ }
67
+
68
+ .fds-search__input.fds-search__input--with-search-button {
69
+ border-top-right-radius: 0;
70
+ border-bottom-right-radius: 0;
71
+ }
72
+
73
+ .fds-search__input:disabled {
74
+ cursor: not-allowed;
75
+ }
76
+
77
+ .fds-search__input[type='search']:focus-visible {
78
+ z-index: 1;
79
+ }
80
+
81
+ .fds-search--disabled {
82
+ opacity: var(--fds-opacity-disabled);
83
+ }
84
+
85
+ .fds-search__search-button {
86
+ border-left: 0;
87
+ border-top-left-radius: 0;
88
+ border-bottom-left-radius: 0;
89
+ }
90
+
91
+ .fds-search__search-button:focus-visible {
92
+ z-index: 1;
93
+ }
94
+
95
+ .fds-search__clear-button {
96
+ color: var(--fds-semantic-text-neutral-default);
97
+ display: inline-flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ position: absolute;
101
+ background: none;
102
+ border: none;
103
+ right: 0.6em;
104
+ top: 50%;
105
+ transform: translateY(-50%);
106
+ cursor: pointer;
107
+ height: var(--f-search-button-clear-size);
108
+ width: var(--f-search-button-clear-size);
109
+ border-radius: var(--fds-border_radius-medium);
110
+ font-size: 1.25rem;
111
+ padding: 0;
112
+ z-index: 2;
113
+ }
114
+
115
+ .fds-search--small .fds-search__input {
116
+ --f-search-button-clear-size: var(--fds-sizing-4);
117
+
118
+ height: var(--fds-sizing-10);
119
+ padding: 0 var(--fds-spacing-3);
120
+ padding-right: 2.5em;
121
+ }
122
+
123
+ .fds-search--small .fds-search__icon {
124
+ left: var(--fds-spacing-3);
125
+ }
126
+
127
+ .fds-search--medium .fds-search__input {
128
+ --f-search-button-clear-size: var(--fds-sizing-6);
129
+
130
+ height: var(--fds-sizing-12);
131
+ padding: 0 var(--fds-spacing-4);
132
+ padding-right: 2.2em;
133
+ }
134
+
135
+ .fds-search--medium .fds-search__icon {
136
+ left: var(--fds-spacing-4);
137
+ }
138
+
139
+ .fds-search--large .fds-search__input {
140
+ --f-search-button-clear-size: var(--fds-sizing-12);
141
+
142
+ height: var(--fds-sizing-14);
143
+ padding: 0 var(--fds-spacing-5);
144
+ padding-right: 2em;
145
+ }
146
+
147
+ .fds-search--large .fds-search__icon {
148
+ left: var(--fds-spacing-5);
149
+ }
150
+
151
+ .fds-search__input.fds-search__input--simple {
152
+ padding-left: 2.4em;
153
+ }
154
+
155
+ .fds-search__error-message > .input:not(:focus-visible) {
156
+ border-color: var(--fds-semantic-border-danger-default);
157
+ box-shadow: inset 0 0 0 1px var(--fds-semantic-border-danger-default);
158
+ }
159
+
160
+ @media (hover: hover) and (pointer: fine) {
161
+ .fds-search__input:not(:focus-visible, :disabled, [aria-disabled]):hover {
162
+ border-color: var(--fds-semantic-border-input-hover);
163
+ box-shadow: inset 0 0 0 1px var(--fds-semantic-border-input-hover);
164
+ }
165
+
166
+ .fds-search__clear-button:not(:focus-visible, :disabled, [aria-disabled]):hover {
167
+ background: var(--fds-semantic-surface-action-subtle-hover);
168
+ }
169
+ }
170
+ }
package/skeleton.css ADDED
@@ -0,0 +1,59 @@
1
+ @layer fds.skeleton {
2
+ .fds-skeleton {
3
+ --fds-skeleton-animation-duration: 0.8s;
4
+
5
+ height: 1.3em;
6
+ pointer-events: none;
7
+ user-select: none;
8
+ background-color: var(--fds-semantic-surface-neutral-subtle-hover);
9
+ animation: fds-skeleton-opacity-fade var(--fds-skeleton-animation-duration) linear infinite alternate;
10
+ }
11
+
12
+ .fds-skeleton--circle {
13
+ width: 1.3em;
14
+ border-radius: 50%;
15
+ }
16
+
17
+ .fds-skeleton--rectangle {
18
+ width: 100%;
19
+ border-radius: 0.2em;
20
+ }
21
+
22
+ .fds-skeleton--text {
23
+ width: 100%;
24
+ height: auto;
25
+ transform-origin: 0 55%;
26
+ transform: scale(1, 0.6);
27
+ border-radius: 0.55em;
28
+ }
29
+
30
+ .fds-skeleton--text:empty::before {
31
+ content: '\00a0';
32
+ }
33
+
34
+ .fds-skeleton--has-children {
35
+ width: fit-content;
36
+ height: fit-content;
37
+ color: transparent !important;
38
+ }
39
+
40
+ .fds-skeleton--has-children > * {
41
+ visibility: hidden;
42
+ }
43
+
44
+ @media (prefers-reduced-motion: reduce) {
45
+ .fds-skeleton {
46
+ --fds-skeleton-animation-duration: 1.6s;
47
+ }
48
+ }
49
+
50
+ @keyframes fds-skeleton-opacity-fade {
51
+ 0% {
52
+ opacity: 1;
53
+ }
54
+
55
+ 100% {
56
+ opacity: 0.4;
57
+ }
58
+ }
59
+ }
package/spinner.css ADDED
@@ -0,0 +1,75 @@
1
+ @layer fds.spinner {
2
+ .fds-spinner {
3
+ animation: fds-spinner-rotate-animation linear infinite;
4
+ animation-duration: 2s;
5
+ }
6
+
7
+ .fds-spinner__circle {
8
+ stroke-dasharray: 1px, 200px;
9
+ transform-origin: center;
10
+ animation: fds-spinner-stroke-animation ease-in-out infinite;
11
+ animation-duration: 2s;
12
+ }
13
+
14
+ /* Prefers reduced motion needs longer animation,
15
+ but don't remove it since it is not decorative.
16
+ */
17
+ @media (prefers-reduced-motion: reduce) {
18
+ .fds-spinner {
19
+ animation-duration: 6s;
20
+ }
21
+
22
+ .fds-spinner__circle {
23
+ animation-duration: 6s;
24
+ }
25
+ }
26
+
27
+ .fds-spinner--default .fds-spinner__circle {
28
+ stroke: var(--fds-semantic-border-neutral-default);
29
+ }
30
+
31
+ .fds-spinner--interaction .fds-spinner__circle {
32
+ stroke: var(--fds-semantic-border-action-first-default);
33
+ }
34
+
35
+ .fds-spinner--inverted .fds-spinner__circle {
36
+ stroke: var(--fds-semantic-surface-neutral-default);
37
+ }
38
+
39
+ .fds-spinner__background {
40
+ stroke: var(--fds-semantic-border-neutral-subtle);
41
+ }
42
+
43
+ .fds-spinner__background--inverted {
44
+ stroke: var(--fds-semantic-surface-neutral-dark);
45
+ }
46
+
47
+ @keyframes fds-spinner-rotate-animation {
48
+ 0% {
49
+ transform: rotate(0deg);
50
+ }
51
+
52
+ 100% {
53
+ transform: rotate(360deg);
54
+ }
55
+ }
56
+
57
+ @keyframes fds-spinner-stroke-animation {
58
+ 0% {
59
+ stroke-dasharray: 1px, 200px;
60
+ stroke-dashoffset: 0;
61
+ }
62
+
63
+ 50% {
64
+ stroke-dasharray: 100px, 200px;
65
+ stroke-dashoffset: -15px;
66
+ transform: rotate(0deg);
67
+ }
68
+
69
+ 100% {
70
+ stroke-dasharray: 1px, 200px;
71
+ stroke-dashoffset: -120px;
72
+ transform: rotate(15deg);
73
+ }
74
+ }
75
+ }