@carbon/styles 1.113.0 → 1.114.0-rc.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 (40) hide show
  1. package/css/styles.css +1651 -198
  2. package/css/styles.min.css +1 -1
  3. package/index.scss +2 -1
  4. package/package.json +9 -9
  5. package/scss/__tests__/__snapshots__/border-radius-test.js.snap +24 -0
  6. package/scss/__tests__/__snapshots__/colors-test.js.snap +1 -1
  7. package/scss/__tests__/__snapshots__/config-test.js.snap +1 -1
  8. package/scss/__tests__/__snapshots__/spacing-test.js.snap +1 -1
  9. package/scss/__tests__/__snapshots__/type-test.js.snap +1 -1
  10. package/scss/__tests__/border-radius-test.js +31 -0
  11. package/scss/_border-radius.scss +10 -0
  12. package/scss/components/EditInPlace/_edit-in-place.scss +188 -0
  13. package/scss/components/EditInPlace/_index.scss +11 -0
  14. package/scss/components/FullPageError/_full-page-error.scss +91 -0
  15. package/scss/components/FullPageError/_index.scss +11 -0
  16. package/scss/components/InterstitialScreen/_index.scss +11 -0
  17. package/scss/components/InterstitialScreen/_interstitial-screen.scss +181 -0
  18. package/scss/components/OptionsTile/_index.scss +11 -0
  19. package/scss/components/OptionsTile/_options-tile.scss +240 -0
  20. package/scss/components/__tests__/data-table-test.js +43 -1
  21. package/scss/components/__tests__/file-uploader.js +30 -0
  22. package/scss/components/_index.scss +9 -1
  23. package/scss/components/big-number/_big-number.scss +164 -0
  24. package/scss/components/big-number/_index.scss +11 -0
  25. package/scss/components/card/_card.scss +37 -12
  26. package/scss/components/coachmark/_coachmark-beacon.scss +159 -0
  27. package/scss/components/coachmark/_coachmark-tagline.scss +142 -0
  28. package/scss/components/coachmark/_coachmark.scss +56 -0
  29. package/scss/components/coachmark/_index.scss +17 -0
  30. package/scss/components/data-table/_data-table.scss +140 -110
  31. package/scss/components/data-table/expandable/_data-table-expandable.scss +86 -59
  32. package/scss/components/data-table/skeleton/_data-table-skeleton.scss +10 -8
  33. package/scss/components/date-picker/_date-picker-next.scss +20 -20
  34. package/scss/components/file-uploader/_file-uploader.scss +6 -4
  35. package/scss/components/scroll-gradient/_index.scss +11 -0
  36. package/scss/components/scroll-gradient/_scroll-gradient.scss +107 -0
  37. package/scss/components/slider/_slider.scss +38 -15
  38. package/scss/components/tabs/_tabs.scss +11 -0
  39. package/scss/components/user-avatar/_index.scss +11 -0
  40. package/scss/components/user-avatar/_user-avatar.scss +160 -0
@@ -0,0 +1,240 @@
1
+ //
2
+ // Copyright IBM Corp. 2021, 2026
3
+ //
4
+ // This source code is licensed under the Apache-2.0 license found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ //
7
+
8
+ //-----------------------------
9
+ // Options tile
10
+ //-----------------------------
11
+
12
+ @use '../../config' as *;
13
+ @use '../../theme' as *;
14
+ @use '../../type';
15
+ @use '../../spacing' as *;
16
+ @use '../../motion' as *;
17
+ @use '../../utilities/focus-outline';
18
+ @use '../../utilities/visually-hidden';
19
+
20
+ /// Options tile styles
21
+ /// @access public
22
+ /// @group options-tile
23
+ @mixin options-tile {
24
+ .#{$prefix}--options-tile {
25
+ position: relative;
26
+ display: flex;
27
+ justify-content: space-between;
28
+ background-color: $layer;
29
+ border-block-end: 1px solid $border-subtle;
30
+ }
31
+
32
+ .#{$prefix}--options-tile__toggle-container {
33
+ position: absolute;
34
+ display: inline-flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ inline-size: calc(#{$spacing-05} + 2rem + #{$spacing-05});
38
+
39
+ inset-block: 0;
40
+ inset-inline-end: 0;
41
+ padding-inline-end: $spacing-05;
42
+ padding-inline-start: $spacing-05;
43
+ }
44
+
45
+ .#{$prefix}--options-tile__toggle {
46
+ position: absolute;
47
+ }
48
+
49
+ .#{$prefix}--options-tile__toggle
50
+ .#{$prefix}--toggle-input__label
51
+ .#{$prefix}--toggle__switch {
52
+ margin: 0;
53
+ }
54
+
55
+ .#{$prefix}--options-tile__toggle .#{$prefix}--toggle__label-text {
56
+ @include visually-hidden.visually-hidden;
57
+ }
58
+
59
+ .#{$prefix}--options-tile__details {
60
+ display: inline-flex;
61
+ flex-direction: column;
62
+ flex-grow: 1;
63
+ }
64
+
65
+ .#{$prefix}--options-tile__header,
66
+ .#{$prefix}--options-tile__static-content {
67
+ display: grid;
68
+ box-sizing: border-box;
69
+ align-items: center;
70
+ grid-template-columns: 3rem 1fr 0;
71
+ padding-inline-end: $spacing-05;
72
+ }
73
+
74
+ .#{$prefix}--options-tile__header {
75
+ flex-grow: 1;
76
+ background-color: transparent;
77
+ cursor: pointer;
78
+ inline-size: 100%;
79
+ transition: background-color $duration-fast-01 motion(entrance, productive);
80
+
81
+ &--has-toggle {
82
+ inline-size: calc(100% - (#{$spacing-05} + 2rem + #{$spacing-05}));
83
+ }
84
+ }
85
+
86
+ .#{$prefix}--options-tile__header::-webkit-details-marker {
87
+ display: none;
88
+ }
89
+
90
+ .#{$prefix}--options-tile__header:hover {
91
+ background-color: $background-hover;
92
+ }
93
+
94
+ .#{$prefix}--options-tile__header:has(
95
+ .#{$prefix}--options-tile__toggle-container:hover
96
+ ) {
97
+ background-color: transparent;
98
+ }
99
+
100
+ .#{$prefix}--options-tile__header:focus {
101
+ @include focus-outline.focus-outline('outline');
102
+ }
103
+
104
+ .#{$prefix}--options-tile__heading {
105
+ grid-column: 2;
106
+ }
107
+
108
+ .#{$prefix}--options-tile__title {
109
+ @include type.type-style('productive-heading-01');
110
+
111
+ color: $text-primary;
112
+ }
113
+
114
+ .#{$prefix}--options-tile__summary {
115
+ @include type.type-style('helper-text-01');
116
+
117
+ display: grid;
118
+ block-size: $spacing-05;
119
+ color: $text-secondary;
120
+ margin-block-start: $spacing-02;
121
+ opacity: 1;
122
+ transition-duration: $duration-moderate-01;
123
+ transition-property: height, opacity, margin-top;
124
+ transition-timing-function: motion(standard, productive);
125
+ }
126
+
127
+ .#{$prefix}--options-tile__summary--invalid,
128
+ .#{$prefix}--options-tile__summary--warn,
129
+ .#{$prefix}--options-tile__summary--locked {
130
+ column-gap: $spacing-02;
131
+ grid-template-columns: 1rem 1fr;
132
+ }
133
+
134
+ .#{$prefix}--options-tile__summary--invalid {
135
+ color: $support-error;
136
+ }
137
+
138
+ .#{$prefix}--options-tile__summary--warn {
139
+ color: $text-primary;
140
+ }
141
+
142
+ .#{$prefix}--options-tile__summary--warn svg {
143
+ color: $support-warning;
144
+ }
145
+
146
+ .#{$prefix}--options-tile__summary--warn svg path[fill='none'] {
147
+ fill: #000000;
148
+ }
149
+
150
+ .#{$prefix}--options-tile__summary-text {
151
+ overflow: hidden;
152
+ block-size: max-content;
153
+ padding-inline-end: $spacing-05;
154
+ text-overflow: ellipsis;
155
+ white-space: nowrap;
156
+ }
157
+
158
+ .#{$prefix}--options-tile__chevron {
159
+ display: block;
160
+ justify-self: center;
161
+ transition: transform $duration-fast-02 motion(standard, productive);
162
+ }
163
+
164
+ .#{$prefix}--options-tile__content {
165
+ padding-inline: $spacing-09 $spacing-05;
166
+ }
167
+
168
+ .#{$prefix}--options-tile__content
169
+ > .#{$prefix}--fieldset
170
+ > .#{$prefix}--label:empty {
171
+ display: none;
172
+ }
173
+
174
+ .#{$prefix}--options-tile--closing .#{$prefix}--options-tile__content {
175
+ overflow: hidden;
176
+ }
177
+
178
+ .#{$prefix}--options-tile__summary.#{$prefix}--options-tile__summary--open:not(
179
+ .#{$prefix}--options-tile__summary--closing
180
+ ),
181
+ .#{$prefix}--options-tile__summary--hidden {
182
+ block-size: 0;
183
+ margin-block-start: 0;
184
+ opacity: 0;
185
+ }
186
+
187
+ .#{$prefix}--options-tile__chevron.#{$prefix}--options-tile__chevron--open:not(
188
+ .#{$prefix}--options-tile__chevron--closing
189
+ ) {
190
+ transform: rotate(180deg);
191
+ }
192
+
193
+ .#{$prefix}--options-tile > details[open] .#{$prefix}--options-tile__content {
194
+ padding-block: $spacing-03 $spacing-06;
195
+ }
196
+
197
+ .#{$prefix}--options-tile__locked-text {
198
+ @include type.type-style('body-long-01');
199
+
200
+ display: inline-flex;
201
+ align-items: center;
202
+ color: $text-secondary;
203
+ margin-block-end: $spacing-06;
204
+ }
205
+
206
+ .#{$prefix}--options-tile__locked-text > svg {
207
+ margin-inline-end: $spacing-02;
208
+ }
209
+
210
+ .#{$prefix}--options-tile--lg .#{$prefix}--options-tile__header,
211
+ .#{$prefix}--options-tile--lg .#{$prefix}--options-tile__static-content {
212
+ block-size: 3rem;
213
+ }
214
+
215
+ .#{$prefix}--options-tile--xl .#{$prefix}--options-tile__header,
216
+ .#{$prefix}--options-tile--xl .#{$prefix}--options-tile__static-content {
217
+ block-size: 4rem;
218
+ }
219
+
220
+ .#{$prefix}--options-tile--lg .#{$prefix}--options-tile__toggle {
221
+ // "top" shouldn't be a spacing token as it depends on the toggle size
222
+ inset-block-start: $spacing-05;
223
+ }
224
+
225
+ .#{$prefix}--options-tile--xl .#{$prefix}--options-tile__toggle {
226
+ // "top" shouldn't be a spacing token as it depends on the toggle size
227
+ inset-block-start: $spacing-06;
228
+ }
229
+
230
+ .#{$prefix}--options-tile--lg .#{$prefix}--options-tile__summary {
231
+ margin-block-start: $spacing-01;
232
+ }
233
+
234
+ @media (prefers-reduced-motion: reduce) {
235
+ .#{$prefix}--options-tile__summary,
236
+ .#{$prefix}--options-tile__chevron {
237
+ transition: none;
238
+ }
239
+ }
240
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2018, 2023
2
+ * Copyright IBM Corp. 2018, 2026
3
3
  *
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -9,6 +9,7 @@
9
9
 
10
10
  'use strict';
11
11
 
12
+ const postcss = require('postcss');
12
13
  const { SassRenderer } = require('@carbon/test-utils/scss');
13
14
 
14
15
  const { render } = SassRenderer.create(__dirname);
@@ -30,6 +31,47 @@ describe('scss/components/data-table', () => {
30
31
  ]
31
32
  `);
32
33
  });
34
+
35
+ test('row hover styles are only applied on devices that support hover', async () => {
36
+ const { result } = await render(`
37
+ @use '../data-table';
38
+ @use '../data-table/expandable';
39
+ @use '../data-table/skeleton';
40
+ `);
41
+ const hoverRules = [];
42
+
43
+ postcss.parse(result.css.toString()).walkRules((rule) => {
44
+ if (
45
+ /(?:^|[\s>+~,])tr(?=[.\[:\s])/.test(rule.selector) &&
46
+ rule.selector.includes(':hover')
47
+ ) {
48
+ hoverRules.push(rule);
49
+ }
50
+ });
51
+
52
+ expect(hoverRules.length).toBeGreaterThan(0);
53
+ expect(
54
+ hoverRules
55
+ .filter((rule) => {
56
+ let parent = rule.parent;
57
+
58
+ while (parent) {
59
+ if (
60
+ parent.type === 'atrule' &&
61
+ parent.name === 'media' &&
62
+ parent.params.includes('(any-hover: hover)')
63
+ ) {
64
+ return false;
65
+ }
66
+
67
+ parent = parent.parent;
68
+ }
69
+
70
+ return true;
71
+ })
72
+ .map((rule) => rule.selector)
73
+ ).toEqual([]);
74
+ });
33
75
  });
34
76
 
35
77
  describe('scss/components/data-table/action', () => {
@@ -9,6 +9,7 @@
9
9
 
10
10
  'use strict';
11
11
 
12
+ const postcss = require('postcss');
12
13
  const { SassRenderer } = require('@carbon/test-utils/scss');
13
14
 
14
15
  const { render } = SassRenderer.create(__dirname);
@@ -24,4 +25,33 @@ describe('scss/components/file-uploader', () => {
24
25
  `);
25
26
  expect(unwrap('mixin')).toBe(true);
26
27
  });
28
+
29
+ test('disabled drop containers use disabled cursor', async () => {
30
+ const { result } = await render(`
31
+ @use '../file-uploader';
32
+ `);
33
+ const disabledDropContainerRules = [];
34
+
35
+ postcss.parse(result.css.toString()).walkRules((rule) => {
36
+ if (
37
+ rule.selector.includes('--file-browse-btn--disabled') &&
38
+ rule.selector.includes('--file__drop-container')
39
+ ) {
40
+ disabledDropContainerRules.push(rule);
41
+ }
42
+ });
43
+
44
+ expect(disabledDropContainerRules).toHaveLength(1);
45
+ expect(disabledDropContainerRules[0].selector).toContain(
46
+ '--file-browse-btn--disabled.cds--file__drop-container'
47
+ );
48
+ expect(disabledDropContainerRules[0].selector).toContain(
49
+ '--file-browse-btn--disabled .cds--file__drop-container'
50
+ );
51
+ expect(
52
+ disabledDropContainerRules[0].nodes.some(
53
+ (node) => node.prop === 'cursor' && node.value === 'no-drop'
54
+ )
55
+ ).toBe(true);
56
+ });
27
57
  });
@@ -1,5 +1,5 @@
1
1
  //
2
- // Copyright IBM Corp. 2018, 2025
2
+ // Copyright IBM Corp. 2018, 2026
3
3
  //
4
4
  // This source code is licensed under the Apache-2.0 license found in the
5
5
  // LICENSE file in the root directory of this source tree.
@@ -10,9 +10,11 @@
10
10
  @use 'ai-label';
11
11
  @use 'aspect-ratio';
12
12
  @use 'badge-indicator';
13
+ @use 'big-number';
13
14
  @use 'breadcrumb';
14
15
  @use 'button';
15
16
  @use 'card';
17
+ @use 'coachmark';
16
18
  @use 'chat-button';
17
19
  @use 'checkbox';
18
20
  @use 'code-snippet';
@@ -42,8 +44,10 @@
42
44
  @use 'fluid-text-input';
43
45
  @use 'fluid-time-picker';
44
46
  @use 'form';
47
+ @use 'FullPageError';
45
48
  @use 'icon-indicator';
46
49
  @use 'inline-loading';
50
+ @use 'InterstitialScreen';
47
51
  @use 'link';
48
52
  @use 'list';
49
53
  @use 'list-box';
@@ -55,6 +59,7 @@
55
59
  @use 'notification';
56
60
  @use 'number-input';
57
61
  @use 'overflow-menu';
62
+ @use 'OptionsTile';
58
63
  @use 'page-header';
59
64
  @use 'pagination';
60
65
  @use 'pagination-nav';
@@ -63,6 +68,7 @@
63
68
  @use 'progress-indicator';
64
69
  @use 'radio-button';
65
70
  @use 'resizer';
71
+ @use 'scroll-gradient';
66
72
  @use 'side-panel';
67
73
  @use 'search';
68
74
  @use 'select';
@@ -84,3 +90,5 @@
84
90
  @use 'treeview';
85
91
  @use 'truncated-text';
86
92
  @use 'ui-shell';
93
+ @use 'EditInPlace';
94
+ @use 'user-avatar';
@@ -0,0 +1,164 @@
1
+ //
2
+ // Copyright IBM Corp. 2024, 2026
3
+ //
4
+ // This source code is licensed under the Apache-2.0 license found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ //
7
+
8
+ //-----------------------------
9
+ // Big number
10
+ //-----------------------------
11
+
12
+ @use '../../config' as *;
13
+ @use '../../theme' as *;
14
+ @use '../../type' as *;
15
+ @use '../../spacing' as *;
16
+
17
+ /// BigNumber styles
18
+ /// @access public
19
+ /// @group big-number
20
+ @mixin big-number {
21
+ .#{$prefix}--big-number {
22
+ margin: 0;
23
+ }
24
+
25
+ .#{$prefix}--big-number__label {
26
+ @include type-style('label-01');
27
+
28
+ display: block;
29
+ margin: 0;
30
+ color: $text-secondary;
31
+ }
32
+
33
+ .#{$prefix}--big-number__value {
34
+ @include type-style('heading-04');
35
+
36
+ margin-block-end: 0;
37
+ }
38
+
39
+ .#{$prefix}--big-number__total {
40
+ @include type-style('body-compact-01');
41
+ }
42
+
43
+ .#{$prefix}--big-number__total,
44
+ .#{$prefix}--big-number__percentage-mark {
45
+ margin-block: auto $spacing-02;
46
+ }
47
+
48
+ .#{$prefix}--big-number__info {
49
+ padding-inline-start: $spacing-03;
50
+ vertical-align: top;
51
+ }
52
+
53
+ .#{$prefix}--big-number__trend {
54
+ margin-block-start: $spacing-03;
55
+ vertical-align: top;
56
+ }
57
+
58
+ .#{$prefix}--big-number__row {
59
+ display: flex;
60
+ }
61
+
62
+ .#{$prefix}--big-number__percentage {
63
+ @include type-style('heading-04');
64
+ }
65
+
66
+ .#{$prefix}--big-number__percentage-mark {
67
+ @include type-style('body-compact-01');
68
+ }
69
+
70
+ .#{$prefix}--big-number__icon-button {
71
+ margin-inline-start: $spacing-02;
72
+ }
73
+
74
+ .#{$prefix}--big-number--lg .#{$prefix}--big-number__value,
75
+ .#{$prefix}--big-number--lg .#{$prefix}--big-number__percentage {
76
+ @include type-style('heading-06');
77
+ }
78
+
79
+ .#{$prefix}--big-number--lg .#{$prefix}--big-number__total,
80
+ .#{$prefix}--big-number--lg .#{$prefix}--big-number__percentage-mark {
81
+ @include type-style('heading-03');
82
+ }
83
+
84
+ .#{$prefix}--big-number--xl .#{$prefix}--big-number__label {
85
+ @include type-style('body-compact-01');
86
+ }
87
+
88
+ .#{$prefix}--big-number--xl .#{$prefix}--big-number__value,
89
+ .#{$prefix}--big-number--xl .#{$prefix}--big-number__percentage {
90
+ @include type-style('heading-07');
91
+ }
92
+
93
+ .#{$prefix}--big-number--xl .#{$prefix}--big-number__total,
94
+ .#{$prefix}--big-number--xl .#{$prefix}--big-number__percentage-mark {
95
+ @include type-style('heading-04');
96
+ }
97
+
98
+ .#{$prefix}--big-number--xl .#{$prefix}--big-number__trend {
99
+ margin-block-start: $spacing-04;
100
+ }
101
+
102
+ .#{$prefix}--big-number .#{$prefix}--big-number__tooltip-trigger {
103
+ display: inline-flex;
104
+ padding: 0;
105
+ border: 0;
106
+ background: none;
107
+ color: inherit;
108
+ cursor: pointer;
109
+ vertical-align: top;
110
+
111
+ &:focus {
112
+ outline: 1px solid $focus;
113
+ }
114
+ }
115
+
116
+ //
117
+ // Skeleton
118
+ //
119
+
120
+ .#{$prefix}--big-number-skeleton {
121
+ inline-size: 4rem;
122
+ }
123
+
124
+ .#{$prefix}--big-number-skeleton__label {
125
+ block-size: $spacing-04;
126
+ margin-block: 0 $spacing-03;
127
+ }
128
+
129
+ .#{$prefix}--big-number-skeleton__value {
130
+ margin: 0;
131
+ /* stylelint-disable-next-line declaration-no-important */
132
+ block-size: $spacing-08 !important;
133
+ }
134
+
135
+ .#{$prefix}--big-number-skeleton--lg {
136
+ inline-size: 5rem;
137
+ }
138
+
139
+ .#{$prefix}--big-number-skeleton--xl {
140
+ inline-size: 6rem;
141
+ }
142
+
143
+ .#{$prefix}--big-number-skeleton.#{$prefix}--big-number-skeleton--lg
144
+ .#{$prefix}--big-number-skeleton__label {
145
+ block-size: $spacing-04;
146
+ }
147
+
148
+ .#{$prefix}--big-number-skeleton.#{$prefix}--big-number-skeleton--lg
149
+ .#{$prefix}--big-number-skeleton__value {
150
+ /* stylelint-disable-next-line declaration-no-important */
151
+ block-size: $spacing-09 !important;
152
+ }
153
+
154
+ .#{$prefix}--big-number-skeleton.#{$prefix}--big-number-skeleton--xl
155
+ .#{$prefix}--big-number-skeleton__label {
156
+ block-size: $spacing-04;
157
+ }
158
+
159
+ .#{$prefix}--big-number-skeleton.#{$prefix}--big-number-skeleton--xl
160
+ .#{$prefix}--big-number-skeleton__value {
161
+ /* stylelint-disable-next-line declaration-no-important */
162
+ block-size: $spacing-10 !important;
163
+ }
164
+ }
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright IBM Corp. 2024, 2026
3
+ //
4
+ // This source code is licensed under the Apache-2.0 license found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ //
7
+
8
+ @forward 'big-number';
9
+ @use 'big-number';
10
+
11
+ @include big-number.big-number;
@@ -24,33 +24,53 @@
24
24
  // ─── Base ────────────────────────────────────────────────────────────
25
25
  .#{$prefix}--card {
26
26
  position: relative;
27
- border: 1px solid $border-subtle-01;
28
- background-color: $layer-01;
27
+ background-color: $layer;
29
28
  color: $text-primary;
30
29
  }
31
30
 
32
31
  // ─── Clickable ───────────────────────────────────────────────────────
33
32
  .#{$prefix}--card--clickable {
33
+ display: block;
34
+ border: 1px solid $border-tile-01;
34
35
  cursor: pointer;
36
+ // Reset anchor defaults when card is rendered as <a>
37
+ text-decoration: none;
35
38
  transition: background-color $duration-fast-02 motion(standard, productive);
36
39
 
37
40
  &:hover {
38
- background-color: $layer-hover-01;
41
+ background-color: $layer-hover;
39
42
  }
40
43
 
41
44
  &:focus {
42
45
  @include focus-outline('outline');
46
+
47
+ outline-offset: 0;
43
48
  }
44
49
 
45
50
  &:active {
46
- background-color: $layer-active-01;
51
+ background-color: $layer-active;
47
52
  }
48
53
  }
49
54
 
55
+ // ─── Clickable footer affordance ─────────────────────────────────────
56
+ // Auto-rendered by Card when clickable is true.
57
+ .#{$prefix}--card__clickable-footer {
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: flex-end;
61
+ padding: $spacing-05;
62
+ color: $icon-interactive;
63
+ }
64
+
65
+ // Disabled state: mute the footer icon
66
+ .#{$prefix}--card--disabled .#{$prefix}--card__clickable-footer {
67
+ color: $icon-disabled;
68
+ }
69
+
50
70
  // ─── Disabled ────────────────────────────────────────────────────────
51
71
  .#{$prefix}--card--disabled {
52
72
  border-color: $border-disabled;
53
- background-color: $layer-01;
73
+ background-color: $layer;
54
74
  color: $text-disabled;
55
75
  cursor: not-allowed;
56
76
  pointer-events: none;
@@ -71,14 +91,12 @@
71
91
  .#{$prefix}--card__body {
72
92
  @include type-style('body-compact-01');
73
93
 
74
- margin-block: $spacing-05;
75
- margin-block-start: 0;
76
- margin-inline: $spacing-05;
94
+ padding-block: $spacing-05;
95
+ padding-inline: $spacing-05;
77
96
  }
78
97
 
79
- // When body is the first child (no header), restore top padding
80
- .#{$prefix}--card > .#{$prefix}--card__body:first-child {
81
- margin-block-start: $spacing-05;
98
+ .#{$prefix}--card__body--flush {
99
+ padding: 0;
82
100
  }
83
101
 
84
102
  // ─── Footer ──────────────────────────────────────────────────────────
@@ -231,6 +249,10 @@
231
249
  color: $text-secondary;
232
250
  }
233
251
 
252
+ .#{$prefix}--card--disabled .#{$prefix}--card__label {
253
+ color: $text-disabled;
254
+ }
255
+
234
256
  .#{$prefix}--card__label--truncate {
235
257
  overflow: hidden;
236
258
  text-overflow: ellipsis;
@@ -250,7 +272,6 @@
250
272
  display: flex;
251
273
  overflow: hidden;
252
274
  flex-direction: column;
253
- color: $text-primary;
254
275
  // 2px between label / text-row / description
255
276
  gap: $spacing-01;
256
277
  margin-inline: $spacing-05;
@@ -325,6 +346,10 @@
325
346
  color: $text-secondary;
326
347
  }
327
348
 
349
+ .#{$prefix}--card--disabled .#{$prefix}--card__description {
350
+ color: $text-disabled;
351
+ }
352
+
328
353
  .#{$prefix}--card__description--truncate {
329
354
  overflow: hidden;
330
355
  text-overflow: ellipsis;