Ultimate ScrollBar

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

当前为 2024-03-15 提交的版本,查看 最新版本

  1. /* ==UserStyle==
  2. @name Ultimate ScrollBar
  3. @namespace https://github.com/pabli24/
  4. @version 1.0.4
  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)
  44. s("var("+ p + a +")")
  45. wh(a...)
  46. width: a
  47. min-width: a
  48. max-width: a
  49. height: a
  50. min-height: a
  51. max-height: a
  52. h = _html ? ":root, html, body, main, #main, #root" : ":root, *"
  53. {h}
  54. scrollbar-width: unset i
  55. scrollbar-color: unset i
  56. :root
  57. if _zoom
  58. {p}dppx: 1
  59. {p}width: _zoom ? "calc(%s * (1 / %s))" % (_width v(dppx)) : _width
  60. {p}thumb-box-shadow-width: _zoom ? "calc(%s * (1 / %s))" % (_thumbBoxShadowWidth v(dppx)) : _thumbBoxShadowWidth
  61. {p}thumb-border-width: _zoom ? "calc(%s * (1 / %s))" % (_thumbBorderWidth v(dppx)) : _thumbBorderWidth
  62. {p}thumb-border-radius: _zoom ? "calc(%s * (1 / %s))" % (_thumbBorderRadius v(dppx)) : _thumbBorderRadius
  63. {p}button-border-width: _zoom ? "calc(%s * (1 / %s))" % (_buttonBorderWidth v(dppx)) : _buttonBorderWidth
  64. h = _html ? ":is(html\, body\, main\, #main\, #root)" : ""
  65. {h}::-webkit-scrollbar
  66. ^[0], &:vertical, &:horizontal
  67. wh: v(width) i
  68. background: none i
  69. border: none i
  70. outline: none i
  71. box-shadow: none i
  72. &-thumb, &-thumb:vertical, &-thumb:horizontal
  73. all: initial i
  74. background-color: _thumbBackgroundColor i
  75. background-clip: padding-box i
  76. border: solid transparent i
  77. border-radius: v(thumb-border-radius) i
  78. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor i
  79. &:hover
  80. all: initial i
  81. background-color: _thumbBackgroundColorHover i
  82. background-clip: padding-box i
  83. border: solid transparent i
  84. border-radius: v(thumb-border-radius) i
  85. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor i
  86. &:active
  87. all: initial i
  88. background-color: _thumbBackgroundColorActive i
  89. background-clip: padding-box i
  90. border: solid transparent i
  91. border-radius: v(thumb-border-radius) i
  92. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor i
  93. &-thumb:vertical, &-thumb:vertical:hover, &-thumb:vertical:active
  94. border-width: 0 v(thumb-border-width) i
  95. &-thumb:horizontal, &-thumb:horizontal:hover, &-thumb:horizontal:active
  96. border-width: v(thumb-border-width) 0 i
  97. &-track, &-track:vertical, &-track:horizontal
  98. all: initial i
  99. background-color: _trackBackgroundColor i
  100. &:hover, &:active
  101. all: initial i
  102. &-track-piece, &-track-piece:vertical, &-track-piece:horizontal
  103. all: initial i
  104. &-corner
  105. all: initial i
  106. background-color: _cornerBackgroundColor i
  107. dataSvg = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' "
  108. if _button
  109. {h}::-webkit-scrollbar-button
  110. all: initial i
  111. display: none i
  112. &:single-button
  113. all: initial i
  114. &:vertical
  115. all: initial i
  116. &:decrement
  117. all: initial i
  118. wh: v(width) i
  119. border: v(button-border-width) solid transparent i
  120. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColor +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  121. &:hover
  122. all: initial i
  123. wh: v(width) i
  124. border: v(button-border-width) solid transparent i
  125. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorHover +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  126. &:active
  127. all: initial i
  128. wh: v(width) i
  129. border: v(button-border-width) solid transparent i
  130. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorActive +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  131. &:increment
  132. all: initial i
  133. wh: v(width) i
  134. border: v(button-border-width) solid transparent i
  135. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColor +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  136. &:hover
  137. all: initial i
  138. wh: v(width) i
  139. border: v(button-border-width) solid transparent i
  140. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorHover +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  141. &:active
  142. all: initial i
  143. wh: v(width) i
  144. border: v(button-border-width) solid transparent i
  145. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorActive +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  146. &:horizontal
  147. all: initial i
  148. &:decrement
  149. all: initial i
  150. wh: v(width) i
  151. border: v(button-border-width) solid transparent i
  152. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColor +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  153. &:hover
  154. all: initial i
  155. wh: v(width) i
  156. border: v(button-border-width) solid transparent i
  157. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorHover +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  158. &:active
  159. all: initial i
  160. wh: v(width) i
  161. border: v(button-border-width) solid transparent i
  162. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorActive +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  163. &:increment
  164. all: initial i
  165. wh: v(width) i
  166. border: v(button-border-width) solid transparent i
  167. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColor +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  168. &:hover
  169. all: initial i
  170. wh: v(width) i
  171. border: v(button-border-width) solid transparent i
  172. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorHover +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  173. &:active
  174. all: initial i
  175. wh: v(width) i
  176. border: v(button-border-width) solid transparent i
  177. background: no-repeat center / contain _trackBackgroundColor url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorActive +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  178. else
  179. {h}::-webkit-scrollbar-button
  180. ^[0], &:single-button, &:single-button:vertical, &:single-button:horizontal
  181. all: initial i
  182. display: none i
  183. if _zoom
  184. 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")
  185. for n in zoom
  186. s("@media (min-resolution:"+ n +"dppx) {:root{"+ p +"dppx:"+ n +"}}")
  187.  
  188. dark()
  189. {h}::-webkit-scrollbar
  190. &-thumb, &-thumb:vertical, &-thumb:horizontal
  191. background-color: _thumbBackgroundColor2 i
  192. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor2 i
  193. &:hover
  194. background-color: _thumbBackgroundColorHover2 i
  195. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor2 i
  196. &:active
  197. background-color: _thumbBackgroundColorActive2 i
  198. box-shadow: inset 0 0 0 v(thumb-box-shadow-width) _thumbBorderColor2 i
  199. &-track, &-track:vertical, &-track:horizontal
  200. background-color: _trackBackgroundColor2 i
  201. &-corner
  202. background-color: _cornerBackgroundColor2 i
  203. if _button
  204. &-button:single-button
  205. &:vertical
  206. &:decrement
  207. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColor2 +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  208. &:hover
  209. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorHover2 +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  210. &:active
  211. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorActive2 +"'><polygon points='1,0 0,1 2,1'/></svg>") i
  212. &:increment
  213. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColor2 +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  214. &:hover
  215. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorHover2 +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  216. &:active
  217. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='2' height='1' fill='"+ _thumbBackgroundColorActive2 +"'><polygon points='0,0 2,0 1,1'/></svg>") i
  218. &:horizontal
  219. &:decrement
  220. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColor2 +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  221. &:hover
  222. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorHover2 +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  223. &:active
  224. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorActive2 +"'><polygon points='0,1 1,2 1,0'/></svg>") i
  225. &:increment
  226. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColor2 +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  227. &:hover
  228. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorHover2 +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  229. &:active
  230. background: no-repeat center / contain _trackBackgroundColor2 url(dataSvg +"width='1' height='2' fill='"+ _thumbBackgroundColorActive2 +"'><polygon points='0,0 0,2 1,1'/></svg>") i
  231.  
  232. if _dark
  233. @-moz-document regexp("(?!https?:\/\/(www\.duolingo\.com|duckduckgo\.com|minecraft\.wiki|runescape\.wiki|www\.google\.)).*")
  234. .dark, .dark-bg, .dark-mode, .dark-theme, .theme-dark, .tw-dark, [dark], [dark="true"], [theme="dark"],
  235. [data-theme="dark"], [data-color-mode="dark"], [data-color-scheme="dark"], [data-scheme="dark"], [data-bs-theme="dark"], [data-ui-theme="dark"],
  236. [data-dark-mode="true"], [style*="color-scheme: dark"],
  237. html:has(>:is(.theme-default\\\,.theme-contrast\,.skin-modern-dark)>:is(\#mastodon\,.admin-wrapper)),
  238. [data-darkreader-scheme="dark"], [native-dark-active], [ml-is-active]
  239. dark()
  240. @-moz-document domain("minecraft.wiki"), domain("steampowered.com"), domain("steamcommunity.com")
  241. html
  242. dark()
  243. @-moz-document regexp("(chrome|moz)-extension://.+")
  244. [data-ui-theme="dark"]
  245. dark()
  246. @-moz-document domain("duolingo.com")
  247. [data-duo-theme="dark"]
  248. dark()
  249. @-moz-document domain("old.reddit.com"), domain("www.reddit.com")
  250. .res-nightmode
  251. dark()
  252. @-moz-document domain("duckduckgo.com")
  253. [style*="--theme-bg-global: var(--color-gray100)"]
  254. dark()
  255. @-moz-document domain("runescape.wiki")
  256. html:has(>body:is(.wgl-theme-dark\\\, .wgl-theme-browntown))
  257. dark()
  258. @-moz-document url-prefix("https://www.google.")
  259. html:has([data-darkmode="true"])
  260. dark()
  261. if _darkWebsite != "example.com, example.org"
  262. unless _darkWebsite is a "string"
  263. error("Expected a string. DO NOT remove the quotation marks.")
  264. _darkWebsite = split(",", replace("^\s+|\s+(?=,)|(?<=,)\s+|\s+$", "", _darkWebsite))
  265. if _darkWebsite != ""
  266. domain = ""
  267. for n in _darkWebsite
  268. domain += "domain('"+ n +"')"
  269. if n != _darkWebsite[-1]
  270. domain += ", "
  271. s("@-moz-document "+ domain +" {")
  272. dark()
  273. s("}")