forked from adoxography/tailwind-scrollbar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
94 lines (80 loc) · 2.35 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
const plugin = require( 'tailwindcss/plugin' )
/**
* Generates a track style, a thumb style, and a thumb hover style for a given
* name/color pair
*
* @param name The text to use in the class name
* @param color The color to set the element to
*
* @return An object containing the generated classes
*/
const generateScrollbarClasses = ( key, value ) => ({
[ `.scrollbar-track-${key}` ]: {
'--scrollbar-track': value,
},
[ `.scrollbar-thumb-${key}` ]: {
'--scrollbar-thumb': value,
},
[ `.hover\\:scrollbar-thumb-${key}` ]: {
'&::-webkit-scrollbar-thumb:hover': {
'--scrollbar-thumb': value,
},
},
})
/**
* Tells an element what to do with --scrollbar-track and --scrollbar-thumb
* variables
*/
const scrollbarBase = {
'--scrollbar-track': 'initial',
'--scrollbar-thumb': 'initial',
'scrollbar-color': 'var(--scrollbar-thumb) var(--scrollbar-track)',
// Make sure the scrollbars are calculated in the elements width
// NOTE: only has effect in webkit-based browsers, but is only really needed
// in webkit-based browsers in the first place.
'overflow': 'overlay',
'&::-webkit-scrollbar-track': {
'background-color': 'var(--scrollbar-track)',
'border-radius': '9999px',
},
'&::-webkit-scrollbar-thumb': {
'background-color': 'var(--scrollbar-thumb)',
'border-radius': '9999px',
},
}
module.exports = plugin( function ( { e, addUtilities, theme, addBase, variants } ) {
const generateScrollbarColorUtilities = ( colors, prefix = '' ) => Object.entries( colors )
.reduce( ( memo, [ key, value ] ) => ({
...memo,
...(
typeof value === 'object'
? generateScrollbarColorUtilities( value, `${e( key )}-` )
: generateScrollbarClasses( `${prefix}${e( key )}`, value )
),
}), {} )
addBase( {
'*': {
'scrollbar-color': 'initial',
'scrollbar-width': 'initial',
},
} )
addUtilities( {
'.scrollbar': {
...scrollbarBase,
'scrollbar-width': 'auto',
'&::-webkit-scrollbar': {
width: '12px',
height: '12px',
},
},
'.scrollbar-thin': {
...scrollbarBase,
'scrollbar-width': 'thin',
'&::-webkit-scrollbar': {
width: '8px',
height: '8px',
},
},
...generateScrollbarColorUtilities( theme( 'colors', {} ) ),
}, variants('mmCustomScrollbar') )
} )