Ultimate ScrollBar

Customizable scrollbar for chromium based browsers (Chrome/Edge/Brave/Opera/Vivaldi)

目前为 2024-02-18 提交的版本,查看 最新版本

  1. /* ==UserStyle==
  2. @name Ultimate ScrollBar
  3. @namespace https://github.com/pabli24/
  4. @version 1.0.0
  5. @description Customizable scrollbar for chromium based browsers (Chrome/Edge/Brave/Opera/Vivaldi)
  6.  
  7. @author Pabli (https://ko-fi.com/pabli)
  8. @license MIT
  9. @homepageURL https://github.com/pabli24/ultimate-scrollbar
  10. @supportURL https://github.com/pabli24/ultimate-scrollbar/issues
  11.  
  12. @preprocessor stylus
  13. @var checkbox _button "Show arrow buttons (Enable 'Patch CSP to allow style assets' in the stylus options, otherwise the arrows may not show up on some sites)" 1
  14. @var checkbox _zoom "Don't change the size of the scrollbar on zoom (ctrl +)" 1
  15. @var checkbox _html "Main scrollbar only" 0
  16.  
  17. @var number _width "Width (px)" [12, 0, null, null, "px"]
  18. @var number _thumbBorderRadius "Thumb border radius (px)" [4, 0, null, null, "px"]
  19. @var number _thumbBoxShadowWidth "Thumb border (px)" [1, 0, null, null, "px"]
  20. @var number _thumbBorderWidth "Thumb margin (px)" [1, 0, null, null, "px"]
  21. @var number _buttonBorderWidth "Arrow buttons margin (px)" [1, 0, null, null, "px"]
  22.  
  23. @var color _trackBackgroundColor "Track" hsla(0, 0%, 0%, 0)
  24. @var color _thumbBackgroundColor "Thumb" hsla(0, 0%, 30%, .7)
  25. @var color _thumbBackgroundColorHover "Thumb on hover" hsla(0, 0%, 35%, .7)
  26. @var color _thumbBackgroundColorActive "Thumb on click" hsla(0, 0%, 40%, .7)
  27. @var color _thumbBorderColor "Thumb border" hsla(0, 0%, 40%, .3)
  28. @var color _cornerBackgroundColor "Corner" hsla(0, 0%, 30%, .7)
  29.  
  30. @var checkbox _dark "Separate theme for websites with dark mode (On some websites you may need to change their theme from auto to dark)" 1
  31. @var text _darkWebsite "Add websites where dark mode isn't automatically detected" "'example.com, example.org'"
  32. @var color _trackBackgroundColor2 "Dark - Track" hsla(0, 0%, 0%, 0)
  33. @var color _thumbBackgroundColor2 "Dark - Thumb" hsla(0, 0%, 70%, .7)
  34. @var color _thumbBackgroundColorHover2 "Dark - Thumb on hover" hsla(0, 0%, 75%, .7)
  35. @var color _thumbBackgroundColorActive2 "Dark - Thumb on click" hsla(0, 0%, 80%, .7)
  36. @var color _thumbBorderColor2 "Dark - Thumb border" hsla(0, 0%, 80%, .3)
  37. @var color _cornerBackgroundColor2 "Dark - Corner" hsla(0, 0%, 70%, .7)
  38.  
  39. ==/UserStyle== */
  40. @-moz-document regexp(".+"), regexp("(chrome|moz)-extension://.+")
  41. i = !important
  42. p = "--ultimate-scrollbar-"
  43. v(a) {s("var("+p+a+")")}
  44. wh(a...)
  45. width: a
  46. min-width: a
  47. max-width: a
  48. height: a
  49. min-height: a
  50. max-height: a
  51. if _html
  52. :root, html, body, main, #main, #root
  53. scrollbar-width: unset i
  54. scrollbar-color: unset i
  55. else
  56. :root, *
  57. scrollbar-width: unset i
  58. scrollbar-color: unset i
  59. :root
  60. if _zoom
  61. {p}dppx: 1
  62. {p}width: _zoom ? "calc(%s * (1 / %s))" % (_width v(dppx)) : _width
  63. {p}thumb-box-shadow-width: _zoom ? "calc(%s * (1 / %s))" % (_thumbBoxShadowWidth v(dppx)) : _thumbBoxShadowWidth
  64. {p}thumb-border-width: _zoom ? "calc(%s * (1 / %s))" % (_thumbBorderWidth v(dppx)) : _thumbBorderWidth
  65. {p}thumb-border-radius: _zoom ? "calc(%s * (1 / %s))" % (_thumbBorderRadius v(dppx)) : _thumbBorderRadius
  66. {p}button-border-width: _zoom ? "calc(%s * (1 / %s))" % (_buttonBorderWidth v(dppx)) : _buttonBorderWidth
  67. _html = _html ? ":is(html\, body\, main\, #main\, #root)" : ""
  68. {_html}::-webkit-scrollbar
  69. ^[0], &:vertical, &:horizontal
  70. wh: v(width) i
  71. background: none i
  72. border: none i
  73. outline: none i
  74. box-shadow: none i
  75. &-thumb, &-thumb:vertical, &-thumb:horizontal
  76. all: initial i
  77. background-color: _thumbBackgroundColor i
  78. background-clip: padding-box i
  79. border: solid transparent i
  80. border-radius: v(thumb-border-radius) i
  81. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor i
  82. &:hover
  83. all: initial i
  84. background-color: _thumbBackgroundColorHover i
  85. background-clip: padding-box i
  86. border: solid transparent i
  87. border-radius: v(thumb-border-radius) i
  88. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor i
  89. &:active
  90. all: initial i
  91. background-color: _thumbBackgroundColorActive i
  92. background-clip: padding-box i
  93. border: solid transparent i
  94. border-radius: v(thumb-border-radius) i
  95. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor i
  96. &-thumb:vertical, &-thumb:vertical:hover, &-thumb:vertical:active
  97. border-width: 0 v(thumb-border-width) i
  98. &-thumb:horizontal, &-thumb:horizontal:hover, &-thumb:horizontal:active
  99. border-width: v(thumb-border-width) 0 i
  100. &-track, &-track:vertical, &-track:horizontal
  101. all: initial i
  102. background-color: _trackBackgroundColor i
  103. &:hover, &:active, &-piece
  104. all: initial i
  105. &-corner
  106. all: initial i
  107. background-color: _cornerBackgroundColor i
  108. dataSvg = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' "
  109. if _button
  110. {_html}::-webkit-scrollbar-button
  111. all: initial i
  112. display: none i
  113. &:single-button
  114. all: initial i
  115. &:vertical
  116. all: initial i
  117. &:decrement
  118. all: initial i
  119. wh: v(width) i
  120. border: v(button-border-width) solid transparent i
  121. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColor +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  122. &:hover
  123. all: initial i
  124. wh: v(width) i
  125. border: v(button-border-width) solid transparent i
  126. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorHover +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  127. &:active
  128. all: initial i
  129. wh: v(width) i
  130. border: v(button-border-width) solid transparent i
  131. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorActive +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  132. &:increment
  133. all: initial i
  134. wh: v(width) i
  135. border: v(button-border-width) solid transparent i
  136. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColor +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  137. &:hover
  138. all: initial i
  139. wh: v(width) i
  140. border: v(button-border-width) solid transparent i
  141. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorHover +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  142. &:active
  143. all: initial i
  144. wh: v(width) i
  145. border: v(button-border-width) solid transparent i
  146. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorActive +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  147. &:horizontal
  148. all: initial i
  149. &:decrement
  150. all: initial i
  151. wh: v(width) i
  152. border: v(button-border-width) solid transparent i
  153. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColor +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  154. &:hover
  155. all: initial i
  156. wh: v(width) i
  157. border: v(button-border-width) solid transparent i
  158. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorHover +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  159. &:active
  160. all: initial i
  161. wh: v(width) i
  162. border: v(button-border-width) solid transparent i
  163. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorActive +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  164. &:increment
  165. all: initial i
  166. wh: v(width) i
  167. border: v(button-border-width) solid transparent i
  168. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColor +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  169. &:hover
  170. all: initial i
  171. wh: v(width) i
  172. border: v(button-border-width) solid transparent i
  173. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorHover +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  174. &:active
  175. all: initial i
  176. wh: v(width) i
  177. border: v(button-border-width) solid transparent i
  178. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorActive +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  179. else
  180. {_html}::-webkit-scrollbar-button
  181. ^[0], &:single-button, &:single-button:vertical, &:single-button:horizontal
  182. all: initial i
  183. display: none i
  184. if _zoom
  185. zoom = ('0.1' '0.2' '0.25' '0.30000001192092896' '0.3125' '0.3333333432674408' '0.375' '0.4000000059604645' '0.4166666865348816' '0.4375' '0.45000001788139343' '0.5' '0.5250000357627869' '0.5833333730697632' '0.6000000238418579' '0.625' '0.6666666865348816' '0.699999988079071' '0.75' '0.800000011920929' '0.8333333730697632' '0.875' '0.8999999761581421' '0.9000000357627869' '0.9375' '1.0' '1.0499999523162842' '1.0500000715255737' '1.100000023841858' '1.125' '1.1666667461395264' '1.2000000476837158' '1.225000023841858' '1.25' '1.2999999523162842' '1.3125' '1.3333333730697632' '1.3499999046325684' '1.375' '1.399999976158142' '1.5' '1.5625' '1.5749999284744263' '1.600000023841858' '1.625' '1.6500000953674316' '1.6666667461395264' '1.7000000476837158' '1.75' '1.7999999523162842' '1.8000000715255737' '1.875' '1.899999976158142' '1.9250000715255737' '1.9499999284744263' '2.0' '2.0999999046325684' '2.1000001430511475' '2.125' '2.1875' '2.200000047683716' '2.25' '2.2749998569488525' '2.299999952316284' '2.3333334922790527' '2.375' '2.4000000953674316' '2.450000047683716' '2.5' '2.5500001907348633' '2.5999999046325684' '2.625' '2.6666667461395264' '2.6999998092651367' '2.700000047683716' '2.75' '2.799999952316284' '2.8499999046325684' '2.875' '2.9000000953674316' '2.9750001430511475' '3.0' '3.0625' '3.0999999046325684' '3.125' '3.1499998569488525' '3.200000047683716' '3.25' '3.299999952316284' '3.3000001907348633' '3.325000047683716' '3.375' '3.4000000953674316' '3.4499998092651367' '3.5' '3.5999999046325684' '3.6000001430511475' '3.625' '3.674999713897705' '3.700000047683716' '3.75' '3.799999952316284' '3.8500001430511475' '3.875' '3.8999998569488525' '3.9000000953674316' '4.0' '4.025000095367432' '4.050000190734863' '4.099999904632568' '4.125' '4.199999809265137' '4.200000286102295' '4.25' '4.300000190734863' '4.350000381469727' '4.375' '4.400000095367432' '4.5' '4.549999713897705' '4.599999904632568' '4.625' '4.649999618530273' '4.699999809265137' '4.724999904632568' '4.75' '4.800000190734863' '4.875' '4.900000095367432' '4.949999809265137' '5.0' '5.075000286102295' '5.100000381469727' '5.125' '5.199999809265137' '5.25' '5.375' '5.399999618530273' '5.400000095367432' '5.424999713897705' '5.5' '5.550000190734863' '5.599999904632568' '5.625' '5.699999809265137' '5.75' '5.775000095367432' '5.800000190734863' '5.850000381469727' '5.875' '5.950000286102295' '6.0' '6.125' '6.149999618530273' '6.199999809265137' '6.25' '6.299999713897705' '6.400000095367432' '6.450000286102295' '6.474999904632568' '6.599999904632568' '6.600000381469727' '6.650000095367432' '6.75' '6.800000190734863' '6.825000286102295' '6.899999618530273' '7.0' '7.049999713897705' '7.174999713897705' '7.199999809265137' '7.200000286102295' '7.34999942779541' '7.350000381469727' '7.400000095367432' '7.5' '7.52500057220459' '7.599999904632568' '7.700000286102295' '7.800000190734863' '7.875' '8.0' '8.050000190734863' '8.199999809265137' '8.22499942779541' '8.399999618530273' '8.40000057220459' '8.574999809265137' '8.600000381469727' '8.75' '8.800000190734863' '9.0' '9.199999809265137' '9.399999618530273' '9.600000381469727' '9.800000190734863' '10.0' '11.0' '12.0' '13.0' '14.0' '15.0')
  186. for n in zoom
  187. s('@media (min-resolution:'+ n +'dppx) {:root{'+ p +'dppx:'+ n +'}}')
  188.  
  189. dark()
  190. {_html}::-webkit-scrollbar
  191. &-thumb, &-thumb:vertical, &-thumb:horizontal
  192. background-color: _thumbBackgroundColor2 i
  193. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor2 i
  194. &:hover
  195. background-color: _thumbBackgroundColorHover2 i
  196. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor2 i
  197. &:active
  198. background-color: _thumbBackgroundColorActive2 i
  199. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor2 i
  200. &-track, &-track:vertical, &-track:horizontal
  201. background-color: _trackBackgroundColor2 i
  202. &-corner
  203. background-color: _cornerBackgroundColor2 i
  204. if _button
  205. &-button:single-button
  206. &:vertical
  207. &:decrement
  208. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColor2 +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  209. &:hover
  210. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorHover2 +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  211. &:active
  212. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorActive2 +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  213. &:increment
  214. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColor2 +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  215. &:hover
  216. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorHover2 +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  217. &:active
  218. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorActive2 +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  219. &:horizontal
  220. &:decrement
  221. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColor2 +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  222. &:hover
  223. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorHover2 +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  224. &:active
  225. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorActive2 +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  226. &:increment
  227. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColor2 +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  228. &:hover
  229. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorHover2 +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  230. &:active
  231. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorActive2 +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  232.  
  233. if _dark
  234. @-moz-document regexp("(?!https?:\/\/(www\.duolingo\.com|old\.reddit\.com|duckduckgo\.com)).*")
  235. .dark, .dark-bg, .dark-mode, .dark-theme, .theme-dark, [dark], [dark="true"],
  236. [data-theme="dark"], [data-color-mode="dark"], [data-color-scheme="dark"], [data-scheme="dark"], [data-bs-theme="dark"], [data-ui-theme="dark"],
  237. [data-dark-mode="true"], [style*="color-scheme: dark;"]
  238. [data-darkreader-scheme="dark"], [native-dark-active], [ml-is-active]
  239. dark()
  240.  
  241. @-moz-document regexp("(chrome|moz)-extension://.+")
  242. [data-ui-theme="dark"]
  243. dark()
  244.  
  245. @-moz-document domain("duolingo.com")
  246. [data-duo-theme="dark"]
  247. dark()
  248.  
  249. @-moz-document domain("old.reddit.com")
  250. .res-nightmode //Reddit Enhancement Suite
  251. dark()
  252.  
  253. @-moz-document domain("duckduckgo.com")
  254. [style*="--theme-bg-global: var(--color-gray100)"]
  255. dark()
  256.  
  257. if _darkWebsite != "example.com, example.org"
  258. unless _darkWebsite is a "string"
  259. error("Expected a string. DO NOT remove the quotation marks.")
  260. _darkWebsite = split(",", replace("^\s+|\s+(?=,)|(?<=,)\s+|\s+$", "", _darkWebsite))
  261. if _darkWebsite != ""
  262. domain = ""
  263. for n in _darkWebsite
  264. domain += "domain('"+ n +"')"
  265. if n != _darkWebsite[-1]
  266. domain += ", "
  267. s("@-moz-document "+ domain +" {")
  268. dark()
  269. s("}")