@carbon/styles 1.113.0 → 1.114.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/css/styles.css +2167 -536
- package/css/styles.min.css +1 -1
- package/index.scss +2 -1
- package/package.json +9 -9
- package/scss/__tests__/__snapshots__/border-radius-test.js.snap +24 -0
- package/scss/__tests__/__snapshots__/colors-test.js.snap +1 -1
- package/scss/__tests__/__snapshots__/config-test.js.snap +1 -1
- package/scss/__tests__/__snapshots__/spacing-test.js.snap +1 -1
- package/scss/__tests__/__snapshots__/type-test.js.snap +1 -1
- package/scss/__tests__/border-radius-test.js +31 -0
- package/scss/_border-radius.scss +10 -0
- package/scss/components/EditInPlace/_edit-in-place.scss +188 -0
- package/scss/components/EditInPlace/_index.scss +11 -0
- package/scss/components/FullPageError/_full-page-error.scss +91 -0
- package/scss/components/FullPageError/_index.scss +11 -0
- package/scss/components/InterstitialScreen/_index.scss +11 -0
- package/scss/components/InterstitialScreen/_interstitial-screen.scss +181 -0
- package/scss/components/OptionsTile/_index.scss +11 -0
- package/scss/components/OptionsTile/_options-tile.scss +240 -0
- package/scss/components/__tests__/button-test.js +27 -0
- package/scss/components/__tests__/data-table-test.js +43 -1
- package/scss/components/__tests__/file-uploader.js +30 -0
- package/scss/components/__tests__/overflow-menu-test.js +40 -1
- package/scss/components/__tests__/structured-list-test.js +38 -1
- package/scss/components/__tests__/tag-test.js +1 -2
- package/scss/components/__tests__/text-input-test.js +1 -1
- package/scss/components/__tests__/treeview-test.js +60 -1
- package/scss/components/_index.scss +9 -1
- package/scss/components/big-number/_big-number.scss +164 -0
- package/scss/components/big-number/_index.scss +11 -0
- package/scss/components/button/_button.scss +0 -1
- package/scss/components/card/_card.scss +37 -12
- package/scss/components/coachmark/_coachmark-beacon.scss +159 -0
- package/scss/components/coachmark/_coachmark-tagline.scss +142 -0
- package/scss/components/coachmark/_coachmark.scss +56 -0
- package/scss/components/coachmark/_index.scss +17 -0
- package/scss/components/data-table/_data-table.scss +140 -110
- package/scss/components/data-table/expandable/_data-table-expandable.scss +86 -59
- package/scss/components/data-table/skeleton/_data-table-skeleton.scss +10 -8
- package/scss/components/date-picker/_date-picker-next.scss +20 -20
- package/scss/components/date-picker/_date-picker.scss +5 -3
- package/scss/components/date-picker/_flatpickr.scss +46 -28
- package/scss/components/file-uploader/_file-uploader.scss +23 -10
- package/scss/components/loading/_loading.scss +2 -1
- package/scss/components/overflow-menu/_overflow-menu.scss +12 -6
- package/scss/components/pagination/_pagination.scss +12 -0
- package/scss/components/pagination-nav/_pagination-nav.scss +5 -3
- package/scss/components/scroll-gradient/_index.scss +11 -0
- package/scss/components/scroll-gradient/_scroll-gradient.scss +107 -0
- package/scss/components/slider/_slider.scss +38 -15
- package/scss/components/structured-list/_structured-list.scss +27 -20
- package/scss/components/tabs/_tabs.scss +11 -0
- package/scss/components/tag/_mixins.scss +9 -5
- package/scss/components/tag/_tag.scss +44 -26
- package/scss/components/text-input/_text-input.scss +11 -7
- package/scss/components/treeview/_treeview.scss +52 -33
- package/scss/components/ui-shell/side-nav/_side-nav.scss +58 -42
- package/scss/components/ui-shell/switcher/_switcher.scss +7 -5
- package/scss/components/user-avatar/_index.scss +11 -0
- 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
|
+
}
|
|
@@ -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);
|
|
@@ -69,4 +70,30 @@ describe('scss/components/button', () => {
|
|
|
69
70
|
`);
|
|
70
71
|
expect(unwrap('height')).toBe('2rem');
|
|
71
72
|
});
|
|
73
|
+
|
|
74
|
+
test('icon-only ghost button does not apply active background on focus', async () => {
|
|
75
|
+
const { result } = await render(`
|
|
76
|
+
@use '../button';
|
|
77
|
+
`);
|
|
78
|
+
|
|
79
|
+
let focusRule;
|
|
80
|
+
|
|
81
|
+
postcss.parse(result.css.toString()).walkRules((rule) => {
|
|
82
|
+
if (rule.selector === '.cds--btn--icon-only.cds--btn--ghost:focus') {
|
|
83
|
+
focusRule = rule;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
expect(focusRule).toBeDefined();
|
|
88
|
+
|
|
89
|
+
const declarations = focusRule.nodes
|
|
90
|
+
.filter((node) => node.type === 'decl')
|
|
91
|
+
.reduce((styles, node) => {
|
|
92
|
+
styles[node.prop] = node.value;
|
|
93
|
+
return styles;
|
|
94
|
+
}, {});
|
|
95
|
+
|
|
96
|
+
expect(declarations['background-color']).toBeUndefined();
|
|
97
|
+
expect(declarations['box-shadow']).toBeDefined();
|
|
98
|
+
});
|
|
72
99
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright IBM Corp. 2018,
|
|
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,
|
|
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);
|
|
@@ -24,4 +25,42 @@ describe('scss/components/overflow-menu', () => {
|
|
|
24
25
|
`);
|
|
25
26
|
expect(unwrap('mixin')).toBe(true);
|
|
26
27
|
});
|
|
28
|
+
|
|
29
|
+
test('trigger hover styles are only applied on devices that support hover', async () => {
|
|
30
|
+
const { result } = await render(`
|
|
31
|
+
@use '../overflow-menu';
|
|
32
|
+
`);
|
|
33
|
+
const hoverRules = [];
|
|
34
|
+
const triggerSelector =
|
|
35
|
+
/\.cds--overflow-menu(?=[.:#\s>+~,\[]).*:hover|\.cds--overflow-menu__trigger(?=[.:#\s>+~,\[]).*:hover/;
|
|
36
|
+
|
|
37
|
+
postcss.parse(result.css.toString()).walkRules((rule) => {
|
|
38
|
+
if (triggerSelector.test(rule.selector)) {
|
|
39
|
+
hoverRules.push(rule);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
expect(hoverRules.length).toBeGreaterThan(0);
|
|
44
|
+
expect(
|
|
45
|
+
hoverRules
|
|
46
|
+
.filter((rule) => {
|
|
47
|
+
let parent = rule.parent;
|
|
48
|
+
|
|
49
|
+
while (parent) {
|
|
50
|
+
if (
|
|
51
|
+
parent.type === 'atrule' &&
|
|
52
|
+
parent.name === 'media' &&
|
|
53
|
+
parent.params.includes('(any-hover: hover)')
|
|
54
|
+
) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
parent = parent.parent;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return true;
|
|
62
|
+
})
|
|
63
|
+
.map((rule) => rule.selector)
|
|
64
|
+
).toEqual([]);
|
|
65
|
+
});
|
|
27
66
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright IBM Corp. 2018,
|
|
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);
|
|
@@ -24,4 +25,40 @@ describe('scss/components/structured-list', () => {
|
|
|
24
25
|
`);
|
|
25
26
|
expect(unwrap('mixin')).toBe(true);
|
|
26
27
|
});
|
|
28
|
+
|
|
29
|
+
test('row hover styles are only applied on devices that support hover', async () => {
|
|
30
|
+
const { result } = await render(`
|
|
31
|
+
@use '../structured-list';
|
|
32
|
+
`);
|
|
33
|
+
const hoverRules = [];
|
|
34
|
+
|
|
35
|
+
postcss.parse(result.css.toString()).walkRules((rule) => {
|
|
36
|
+
if (rule.selector.includes('.cds--structured-list-row:hover')) {
|
|
37
|
+
hoverRules.push(rule);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
expect(hoverRules.length).toBeGreaterThan(0);
|
|
42
|
+
expect(
|
|
43
|
+
hoverRules
|
|
44
|
+
.filter((rule) => {
|
|
45
|
+
let parent = rule.parent;
|
|
46
|
+
|
|
47
|
+
while (parent) {
|
|
48
|
+
if (
|
|
49
|
+
parent.type === 'atrule' &&
|
|
50
|
+
parent.name === 'media' &&
|
|
51
|
+
parent.params.includes('(any-hover: hover)')
|
|
52
|
+
) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
parent = parent.parent;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return true;
|
|
60
|
+
})
|
|
61
|
+
.map((rule) => rule.selector)
|
|
62
|
+
).toEqual([]);
|
|
63
|
+
});
|
|
27
64
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright IBM Corp. 2018,
|
|
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.
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
11
|
-
|
|
12
11
|
const { SassRenderer } = require('@carbon/test-utils/scss');
|
|
13
12
|
|
|
14
13
|
const { render } = SassRenderer.create(__dirname);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright IBM Corp. 2018,
|
|
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);
|
|
@@ -22,4 +23,62 @@ describe('scss/components/treeview', () => {
|
|
|
22
23
|
`);
|
|
23
24
|
expect(unwrap('mixin')).toBe(true);
|
|
24
25
|
});
|
|
26
|
+
|
|
27
|
+
test('hover styles are only applied on devices that support hover', async () => {
|
|
28
|
+
const { result } = await render(`
|
|
29
|
+
@use '../treeview';
|
|
30
|
+
`);
|
|
31
|
+
const hoverRules = [];
|
|
32
|
+
|
|
33
|
+
postcss.parse(result.css.toString()).walkRules((rule) => {
|
|
34
|
+
if (
|
|
35
|
+
rule.selector.includes('.cds--tree') &&
|
|
36
|
+
rule.selector.includes(':hover')
|
|
37
|
+
) {
|
|
38
|
+
hoverRules.push(rule);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
expect(hoverRules.length).toBeGreaterThan(0);
|
|
43
|
+
expect(
|
|
44
|
+
hoverRules.some((rule) =>
|
|
45
|
+
rule.selector.includes('.cds--tree-node__label:hover')
|
|
46
|
+
)
|
|
47
|
+
).toBe(true);
|
|
48
|
+
expect(
|
|
49
|
+
hoverRules.some(
|
|
50
|
+
(rule) =>
|
|
51
|
+
rule.selector.includes('.cds--tree-node--disabled') &&
|
|
52
|
+
rule.selector.includes('.cds--tree-node__label:hover')
|
|
53
|
+
)
|
|
54
|
+
).toBe(true);
|
|
55
|
+
expect(
|
|
56
|
+
hoverRules.some(
|
|
57
|
+
(rule) =>
|
|
58
|
+
rule.selector.includes('.cds--tree-node--selected') &&
|
|
59
|
+
rule.selector.includes('.cds--tree-node__label:hover')
|
|
60
|
+
)
|
|
61
|
+
).toBe(true);
|
|
62
|
+
expect(
|
|
63
|
+
hoverRules
|
|
64
|
+
.filter((rule) => {
|
|
65
|
+
let parent = rule.parent;
|
|
66
|
+
|
|
67
|
+
while (parent) {
|
|
68
|
+
if (
|
|
69
|
+
parent.type === 'atrule' &&
|
|
70
|
+
parent.name === 'media' &&
|
|
71
|
+
parent.params.includes('(any-hover: hover)')
|
|
72
|
+
) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
parent = parent.parent;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return true;
|
|
80
|
+
})
|
|
81
|
+
.map((rule) => rule.selector)
|
|
82
|
+
).toEqual([]);
|
|
83
|
+
});
|
|
25
84
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//
|
|
2
|
-
// Copyright IBM Corp. 2018,
|
|
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';
|