Skip to content

Commit c3cb385

Browse files
authored
fix(scrollbar.style): various (#675)
1 parent 87fd543 commit c3cb385

File tree

6 files changed

+227
-113
lines changed

6 files changed

+227
-113
lines changed

.changeset/silly-dragons-buy.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@cube-dev/ui-kit": patch
3+
---
4+
5+
Apply various fixes to the new scrollbar style.

src/tasty/__snapshots__/tasty.test.tsx.snap

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ exports[`tasty() API should allow multiple wrapping 1`] = `
2222
}
2323
2424
.c0.c0 {
25-
color: var(--white-color, rgb(0 0 0 / 1));
25+
color: var(--white-color);
2626
--current-color: var(--white-color, white);
2727
--current-color-rgb: var(--white-color-rgb);
2828
}
@@ -120,7 +120,7 @@ exports[`tasty() API should create element styles 1`] = `
120120
}
121121
122122
.c0.c0[data-is-modified] [data-element="Element"] {
123-
color: var(--purple-color, rgb(0 0 0 / 1));
123+
color: var(--purple-color);
124124
--current-color: var(--purple-color, purple);
125125
--current-color-rgb: var(--purple-color-rgb);
126126
}
@@ -190,7 +190,7 @@ exports[`tasty() API should fallback to default variant 1`] = `
190190
}
191191
192192
.c0.c0 {
193-
color: var(--white-color, rgb(0 0 0 / 1));
193+
color: var(--white-color);
194194
--current-color: var(--white-color, white);
195195
--current-color-rgb: var(--white-color-rgb);
196196
}
@@ -226,7 +226,7 @@ exports[`tasty() API should merge element styles 1`] = `
226226
}
227227
228228
.c0.c0[data-is-modified] [data-element="Element"] {
229-
color: var(--purple-color, rgb(0 0 0 / 1));
229+
color: var(--purple-color);
230230
--current-color: var(--purple-color, purple);
231231
--current-color-rgb: var(--purple-color-rgb);
232232
}
@@ -263,7 +263,7 @@ exports[`tasty() API should merge styles 1`] = `
263263
}
264264
265265
.c0.c0[data-is-modified] {
266-
color: var(--purple-color, rgb(0 0 0 / 1));
266+
color: var(--purple-color);
267267
--current-color: var(--purple-color, purple);
268268
--current-color-rgb: var(--purple-color-rgb);
269269
}
@@ -300,7 +300,7 @@ exports[`tasty() API should merge styles in custom prop 1`] = `
300300
}
301301
302302
.c0.c0[data-is-modified] {
303-
color: var(--purple-color, rgb(0 0 0 / 1));
303+
color: var(--purple-color);
304304
--current-color: var(--purple-color, purple);
305305
--current-color-rgb: var(--purple-color-rgb);
306306
}
@@ -367,7 +367,7 @@ exports[`tasty() API should support camelCase modifiers 1`] = `
367367
}
368368
369369
.c0.c0[data-is-somehow-modified] {
370-
color: var(--purple-color, rgb(0 0 0 / 1));
370+
color: var(--purple-color);
371371
--current-color: var(--purple-color, purple);
372372
--current-color-rgb: var(--purple-color-rgb);
373373
}
@@ -400,7 +400,7 @@ exports[`tasty() API should support kebab-case modifiers 1`] = `
400400
}
401401
402402
.c0.c0[data-is-somehow-modified] {
403-
color: var(--purple-color, rgb(0 0 0 / 1));
403+
color: var(--purple-color);
404404
--current-color: var(--purple-color, purple);
405405
--current-color-rgb: var(--purple-color-rgb);
406406
}
@@ -433,7 +433,7 @@ exports[`tasty() API should support modifiers 1`] = `
433433
}
434434
435435
.c0.c0[data-is-modified] {
436-
color: var(--purple-color, rgb(0 0 0 / 1));
436+
color: var(--purple-color);
437437
--current-color: var(--purple-color, purple);
438438
--current-color-rgb: var(--purple-color-rgb);
439439
}

src/tasty/styles.test.ts

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -115,70 +115,4 @@ describe('Tasty style tests', () => {
115115
'margin-bottom': '1rem',
116116
});
117117
});
118-
119-
it('should return undefined for undefined scrollbar', () => {
120-
expect(scrollbarStyle({})).toBeUndefined();
121-
});
122-
123-
it('should return correct styles for two colors', () => {
124-
expect(scrollbarStyle({ scrollbar: '#dark #clear' })).toEqual({
125-
'scrollbar-color': 'var(--dark-color) var(--clear-color)',
126-
'&::-webkit-scrollbar-corner': {
127-
background: 'var(--clear-color)',
128-
},
129-
});
130-
});
131-
132-
it('should return correct styles for `thin` scrollbar', () => {
133-
expect(scrollbarStyle({ scrollbar: 'thin' })).toEqual({
134-
'scrollbar-width': 'thin',
135-
'scrollbar-color': 'var(--scrollbar-thumb-color) transparent',
136-
});
137-
});
138-
139-
it('should return correct styles for `none` scrollbar', () => {
140-
expect(scrollbarStyle({ scrollbar: 'none' })).toEqual({
141-
'scrollbar-color': 'var(--scrollbar-thumb-color) transparent',
142-
'&::-webkit-scrollbar': {
143-
width: 'none',
144-
height: 'none',
145-
},
146-
});
147-
});
148-
149-
it('should handle custom overflow with scrollbar', () => {
150-
expect(scrollbarStyle({ scrollbar: 'always', overflow: 'scroll' })).toEqual(
151-
{
152-
overflow: 'scroll',
153-
'scrollbar-gutter': 'always',
154-
'scrollbar-color': 'var(--scrollbar-thumb-color) transparent',
155-
},
156-
);
157-
});
158-
159-
it('should handle styled scrollbar', () => {
160-
expect(scrollbarStyle({ scrollbar: 'styled' })).toEqual({
161-
'scrollbar-width': 'thin',
162-
'scrollbar-color': 'var(--scrollbar-thumb-color) transparent',
163-
'&::-webkit-scrollbar': {
164-
width: '8px',
165-
height: '8px',
166-
background: 'var(--scrollbar-track-color)',
167-
transition:
168-
'background var(--transition), border-radius var(--transition), box-shadow var(--transition), width var(--transition), height var(--transition), border var(--transition)',
169-
},
170-
'&::-webkit-scrollbar-thumb': {
171-
background: 'var(--scrollbar-thumb-color)',
172-
borderRadius: '8px',
173-
minHeight: '24px',
174-
transition:
175-
'background var(--transition), border-radius var(--transition), box-shadow var(--transition), width var(--transition), height var(--transition), border var(--transition)',
176-
},
177-
'&::-webkit-scrollbar-corner': {
178-
background: 'var(--scrollbar-track-color)',
179-
transition:
180-
'background var(--transition), border-radius var(--transition), box-shadow var(--transition), width var(--transition), height var(--transition), border var(--transition)',
181-
},
182-
});
183-
});
184118
});

src/tasty/styles/scrollbar.test.ts

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import { scrollbarStyle } from './scrollbar';
2+
3+
describe('scrollbarStyle', () => {
4+
it('returns undefined when scrollbar is not defined', () => {
5+
expect(scrollbarStyle({})).toBeUndefined();
6+
});
7+
8+
it('handles boolean true value as thin', () => {
9+
const result = scrollbarStyle({ scrollbar: true });
10+
expect(result['scrollbar-width']).toBe('thin');
11+
});
12+
13+
it('handles number value as size', () => {
14+
const result = scrollbarStyle({ scrollbar: 10 });
15+
expect(result['&::-webkit-scrollbar']['width']).toBe('10');
16+
expect(result['&::-webkit-scrollbar']['height']).toBe('10');
17+
});
18+
19+
it('handles "none" modifier', () => {
20+
const result = scrollbarStyle({ scrollbar: 'none' });
21+
expect(result['scrollbar-width']).toBe('none');
22+
expect(result['scrollbar-color']).toBe('transparent transparent');
23+
expect(result['&::-webkit-scrollbar']['width']).toBe('0px');
24+
});
25+
26+
it('handles "styled" modifier with proper defaults', () => {
27+
const result = scrollbarStyle({ scrollbar: 'styled' });
28+
expect(result['scrollbar-width']).toBe('thin');
29+
expect(result['&::-webkit-scrollbar']['width']).toBe('8px');
30+
expect(result['&::-webkit-scrollbar-thumb']['border-radius']).toBe('8px');
31+
expect(result['&::-webkit-scrollbar-thumb']['min-height']).toBe('24px');
32+
});
33+
34+
it('handles custom colors', () => {
35+
const result = scrollbarStyle({ scrollbar: '#red #blue #green' });
36+
expect(result['scrollbar-color']).toBe(
37+
'var(--red-color) var(--blue-color)',
38+
);
39+
expect(result['&::-webkit-scrollbar-track']['background']).toBe(
40+
'var(--blue-color)',
41+
);
42+
expect(result['&::-webkit-scrollbar-thumb']['background']).toBe(
43+
'var(--red-color)',
44+
);
45+
expect(result['&::-webkit-scrollbar-corner']['background']).toBe(
46+
'var(--green-color)',
47+
);
48+
});
49+
50+
it('handles "always" modifier with overflow', () => {
51+
const result = scrollbarStyle({ scrollbar: 'always', overflow: 'auto' });
52+
expect(result['overflow']).toBe('auto');
53+
expect(result['scrollbar-gutter']).toBe('stable');
54+
expect(result['&::-webkit-scrollbar']['display']).toBe('block');
55+
});
56+
57+
it('combines modifiers correctly', () => {
58+
const result = scrollbarStyle({ scrollbar: 'thin styled #red' });
59+
expect(result['scrollbar-width']).toBe('thin');
60+
expect(result['scrollbar-color']).toBe(
61+
'var(--red-color) var(--scrollbar-track-color, transparent)',
62+
);
63+
expect(result['&::-webkit-scrollbar-thumb']['background']).toBe(
64+
'var(--red-color)',
65+
);
66+
});
67+
68+
it('applies custom colors to styled scrollbars', () => {
69+
const result = scrollbarStyle({
70+
scrollbar: 'styled #purple #dark #light-grey',
71+
});
72+
expect(result['scrollbar-color']).toBe(
73+
'var(--purple-color) var(--dark-color)',
74+
);
75+
expect(result['&::-webkit-scrollbar']['background']).toBe(
76+
'var(--dark-color)',
77+
);
78+
expect(result['&::-webkit-scrollbar-track']['background']).toBe(
79+
'var(--dark-color)',
80+
);
81+
expect(result['&::-webkit-scrollbar-thumb']['background']).toBe(
82+
'var(--purple-color)',
83+
);
84+
expect(result['&::-webkit-scrollbar-corner']['background']).toBe(
85+
'var(--light-grey-color)',
86+
);
87+
});
88+
89+
it('applies partial custom colors with defaults', () => {
90+
const result = scrollbarStyle({ scrollbar: 'styled #danger' });
91+
// Only thumb color specified, track should use default
92+
expect(result['scrollbar-color']).toBe(
93+
'var(--danger-color) var(--scrollbar-track-color, transparent)',
94+
);
95+
expect(result['&::-webkit-scrollbar-thumb']['background']).toBe(
96+
'var(--danger-color)',
97+
);
98+
expect(result['&::-webkit-scrollbar-track']['background']).toBe(
99+
'var(--scrollbar-track-color, transparent)',
100+
);
101+
});
102+
103+
it('ensures all CSS properties are kebab-cased', () => {
104+
const result = scrollbarStyle({ scrollbar: 'styled thin' });
105+
// Check that camelCase properties are converted to kebab-case
106+
expect(result['&::-webkit-scrollbar-thumb']['border-radius']).toBe('8px');
107+
expect(result['&::-webkit-scrollbar-thumb']['min-height']).toBe('24px');
108+
});
109+
});

0 commit comments

Comments
 (0)