@dalcvil/steam-green-react 0.2.0 → 1.0.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.
Files changed (348) hide show
  1. package/README.md +20 -5
  2. package/dist/components/Avatar/Avatar.css +136 -0
  3. package/dist/components/Avatar/Avatar.d.ts +22 -0
  4. package/dist/components/Avatar/Avatar.d.ts.map +1 -0
  5. package/dist/components/Avatar/Avatar.js +49 -0
  6. package/dist/components/Avatar/Avatar.js.map +1 -0
  7. package/dist/components/Avatar/index.d.ts +3 -0
  8. package/dist/components/Avatar/index.d.ts.map +1 -0
  9. package/dist/components/Button/Button.css +117 -0
  10. package/dist/components/Button/Button.d.ts +18 -0
  11. package/dist/components/Button/Button.d.ts.map +1 -0
  12. package/dist/components/Button/Button.js +29 -0
  13. package/dist/components/Button/Button.js.map +1 -0
  14. package/dist/components/Button/index.d.ts +3 -0
  15. package/dist/components/Button/index.d.ts.map +1 -0
  16. package/dist/components/Checkbox/Checkbox.css +116 -0
  17. package/dist/components/Checkbox/Checkbox.css.d.ts +1 -0
  18. package/dist/components/Checkbox/Checkbox.d.ts +19 -0
  19. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  20. package/dist/components/Checkbox/Checkbox.js +51 -0
  21. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  22. package/dist/components/Checkbox/index.d.ts +3 -0
  23. package/dist/components/Checkbox/index.d.ts.map +1 -0
  24. package/dist/components/ColorPicker/ColorPicker.css +331 -0
  25. package/dist/components/ColorPicker/ColorPicker.css.d.ts +1 -0
  26. package/dist/components/ColorPicker/ColorPicker.d.ts +29 -0
  27. package/dist/components/ColorPicker/ColorPicker.d.ts.map +1 -0
  28. package/dist/components/ColorPicker/ColorPicker.js +534 -0
  29. package/dist/components/ColorPicker/ColorPicker.js.map +1 -0
  30. package/dist/components/ColorPicker/index.d.ts +3 -0
  31. package/dist/components/{GreenButton → ColorPicker}/index.d.ts.map +1 -1
  32. package/dist/components/Console/Console.css +96 -0
  33. package/dist/components/Console/Console.css.d.ts +1 -0
  34. package/dist/components/Console/Console.d.ts +26 -0
  35. package/dist/components/Console/Console.d.ts.map +1 -0
  36. package/dist/components/Console/Console.js +59 -0
  37. package/dist/components/Console/Console.js.map +1 -0
  38. package/dist/components/Console/index.d.ts +3 -0
  39. package/dist/components/Console/index.d.ts.map +1 -0
  40. package/dist/components/Dialog/Dialog.css +137 -0
  41. package/dist/components/Dialog/Dialog.css.d.ts +1 -0
  42. package/dist/components/Dialog/Dialog.d.ts +28 -0
  43. package/dist/components/Dialog/Dialog.d.ts.map +1 -0
  44. package/dist/components/Dialog/Dialog.js +151 -0
  45. package/dist/components/Dialog/Dialog.js.map +1 -0
  46. package/dist/components/Dialog/index.d.ts +3 -0
  47. package/dist/components/Dialog/index.d.ts.map +1 -0
  48. package/dist/components/Divider/Divider.css +68 -0
  49. package/dist/components/Divider/Divider.css.d.ts +1 -0
  50. package/dist/components/Divider/Divider.d.ts +12 -0
  51. package/dist/components/Divider/Divider.d.ts.map +1 -0
  52. package/dist/components/Divider/Divider.js +23 -0
  53. package/dist/components/Divider/Divider.js.map +1 -0
  54. package/dist/components/Divider/index.d.ts +3 -0
  55. package/dist/components/Divider/index.d.ts.map +1 -0
  56. package/dist/components/FieldLabel/FieldLabel.css +98 -0
  57. package/dist/components/FieldLabel/FieldLabel.css.d.ts +1 -0
  58. package/dist/components/FieldLabel/FieldLabel.d.ts +29 -0
  59. package/dist/components/FieldLabel/FieldLabel.d.ts.map +1 -0
  60. package/dist/components/FieldLabel/FieldLabel.js +42 -0
  61. package/dist/components/FieldLabel/FieldLabel.js.map +1 -0
  62. package/dist/components/FieldLabel/index.d.ts +3 -0
  63. package/dist/components/{GreenPanel → FieldLabel}/index.d.ts.map +1 -1
  64. package/dist/components/GroupBox/GroupBox.css +101 -0
  65. package/dist/components/GroupBox/GroupBox.css.d.ts +1 -0
  66. package/dist/components/GroupBox/GroupBox.d.ts +14 -0
  67. package/dist/components/GroupBox/GroupBox.d.ts.map +1 -0
  68. package/dist/components/GroupBox/GroupBox.js +25 -0
  69. package/dist/components/GroupBox/GroupBox.js.map +1 -0
  70. package/dist/components/GroupBox/index.d.ts +3 -0
  71. package/dist/components/GroupBox/index.d.ts.map +1 -0
  72. package/dist/components/IconButton/IconButton.css +184 -0
  73. package/dist/components/IconButton/IconButton.css.d.ts +1 -0
  74. package/dist/components/IconButton/IconButton.d.ts +56 -0
  75. package/dist/components/IconButton/IconButton.d.ts.map +1 -0
  76. package/dist/components/IconButton/IconButton.js +77 -0
  77. package/dist/components/IconButton/IconButton.js.map +1 -0
  78. package/dist/components/IconButton/index.d.ts +3 -0
  79. package/dist/components/IconButton/index.d.ts.map +1 -0
  80. package/dist/components/LevelMeter/LevelMeter.css +117 -0
  81. package/dist/components/LevelMeter/LevelMeter.css.d.ts +1 -0
  82. package/dist/components/LevelMeter/LevelMeter.d.ts +20 -0
  83. package/dist/components/LevelMeter/LevelMeter.d.ts.map +1 -0
  84. package/dist/components/LevelMeter/LevelMeter.js +44 -0
  85. package/dist/components/LevelMeter/LevelMeter.js.map +1 -0
  86. package/dist/components/LevelMeter/index.d.ts +3 -0
  87. package/dist/components/LevelMeter/index.d.ts.map +1 -0
  88. package/dist/components/Link/Link.css +127 -0
  89. package/dist/components/Link/Link.css.d.ts +1 -0
  90. package/dist/components/Link/Link.d.ts +26 -0
  91. package/dist/components/Link/Link.d.ts.map +1 -0
  92. package/dist/components/Link/Link.js +60 -0
  93. package/dist/components/Link/Link.js.map +1 -0
  94. package/dist/components/Link/index.d.ts +3 -0
  95. package/dist/components/Link/index.d.ts.map +1 -0
  96. package/dist/components/List/List.css +224 -0
  97. package/dist/components/List/List.css.d.ts +1 -0
  98. package/dist/components/List/List.d.ts +49 -0
  99. package/dist/components/List/List.d.ts.map +1 -0
  100. package/dist/components/List/List.js +300 -0
  101. package/dist/components/List/List.js.map +1 -0
  102. package/dist/components/List/index.d.ts +3 -0
  103. package/dist/components/List/index.d.ts.map +1 -0
  104. package/dist/components/Menu/Menu.css +122 -0
  105. package/dist/components/Menu/Menu.css.d.ts +1 -0
  106. package/dist/components/Menu/Menu.d.ts +46 -0
  107. package/dist/components/Menu/Menu.d.ts.map +1 -0
  108. package/dist/components/Menu/Menu.js +246 -0
  109. package/dist/components/Menu/Menu.js.map +1 -0
  110. package/dist/components/Menu/index.d.ts +3 -0
  111. package/dist/components/Menu/index.d.ts.map +1 -0
  112. package/dist/components/MenuBar/MenuBar.css +94 -0
  113. package/dist/components/MenuBar/MenuBar.css.d.ts +1 -0
  114. package/dist/components/MenuBar/MenuBar.d.ts +34 -0
  115. package/dist/components/MenuBar/MenuBar.d.ts.map +1 -0
  116. package/dist/components/MenuBar/MenuBar.js +129 -0
  117. package/dist/components/MenuBar/MenuBar.js.map +1 -0
  118. package/dist/components/MenuBar/index.d.ts +3 -0
  119. package/dist/components/MenuBar/index.d.ts.map +1 -0
  120. package/dist/components/NavBar/NavBar.css +179 -0
  121. package/dist/components/NavBar/NavBar.css.d.ts +1 -0
  122. package/dist/components/NavBar/NavBar.d.ts +39 -0
  123. package/dist/components/NavBar/NavBar.d.ts.map +1 -0
  124. package/dist/components/NavBar/NavBar.js +198 -0
  125. package/dist/components/NavBar/NavBar.js.map +1 -0
  126. package/dist/components/NavBar/index.d.ts +3 -0
  127. package/dist/components/NavBar/index.d.ts.map +1 -0
  128. package/dist/components/Notification/Notification.css +176 -0
  129. package/dist/components/Notification/Notification.css.d.ts +1 -0
  130. package/dist/components/Notification/Notification.d.ts +26 -0
  131. package/dist/components/Notification/Notification.d.ts.map +1 -0
  132. package/dist/components/Notification/Notification.js +181 -0
  133. package/dist/components/Notification/Notification.js.map +1 -0
  134. package/dist/components/Notification/index.d.ts +3 -0
  135. package/dist/components/Notification/index.d.ts.map +1 -0
  136. package/dist/components/Panel/Panel.css +56 -0
  137. package/dist/components/Panel/Panel.css.d.ts +1 -0
  138. package/dist/components/Panel/Panel.d.ts +14 -0
  139. package/dist/components/Panel/Panel.d.ts.map +1 -0
  140. package/dist/components/Panel/Panel.js +42 -0
  141. package/dist/components/Panel/Panel.js.map +1 -0
  142. package/dist/components/Panel/index.d.ts +3 -0
  143. package/dist/components/Panel/index.d.ts.map +1 -0
  144. package/dist/components/ProgressBar/ProgressBar.css +108 -0
  145. package/dist/components/ProgressBar/ProgressBar.css.d.ts +1 -0
  146. package/dist/components/ProgressBar/ProgressBar.d.ts +22 -0
  147. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -0
  148. package/dist/components/ProgressBar/ProgressBar.js +43 -0
  149. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  150. package/dist/components/ProgressBar/index.d.ts +3 -0
  151. package/dist/components/ProgressBar/index.d.ts.map +1 -0
  152. package/dist/components/Radio/Radio.css +125 -0
  153. package/dist/components/Radio/Radio.css.d.ts +1 -0
  154. package/dist/components/Radio/Radio.d.ts +40 -0
  155. package/dist/components/Radio/Radio.d.ts.map +1 -0
  156. package/dist/components/Radio/Radio.js +91 -0
  157. package/dist/components/Radio/Radio.js.map +1 -0
  158. package/dist/components/Radio/index.d.ts +3 -0
  159. package/dist/components/Radio/index.d.ts.map +1 -0
  160. package/dist/components/RichText/RichText.css +96 -0
  161. package/dist/components/RichText/RichText.css.d.ts +1 -0
  162. package/dist/components/RichText/RichText.d.ts +25 -0
  163. package/dist/components/RichText/RichText.d.ts.map +1 -0
  164. package/dist/components/RichText/RichText.js +56 -0
  165. package/dist/components/RichText/RichText.js.map +1 -0
  166. package/dist/components/RichText/index.d.ts +3 -0
  167. package/dist/components/RichText/index.d.ts.map +1 -0
  168. package/dist/components/ScrollArea/ScrollArea.css +236 -0
  169. package/dist/components/ScrollArea/ScrollArea.css.d.ts +1 -0
  170. package/dist/components/ScrollArea/ScrollArea.d.ts +25 -0
  171. package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -0
  172. package/dist/components/ScrollArea/ScrollArea.js +124 -0
  173. package/dist/components/ScrollArea/ScrollArea.js.map +1 -0
  174. package/dist/components/ScrollArea/index.d.ts +3 -0
  175. package/dist/components/ScrollArea/index.d.ts.map +1 -0
  176. package/dist/components/Scrollbar/Scrollbar.css +260 -0
  177. package/dist/components/Scrollbar/Scrollbar.css.d.ts +1 -0
  178. package/dist/components/Scrollbar/Scrollbar.d.ts +31 -0
  179. package/dist/components/Scrollbar/Scrollbar.d.ts.map +1 -0
  180. package/dist/components/Scrollbar/Scrollbar.js +277 -0
  181. package/dist/components/Scrollbar/Scrollbar.js.map +1 -0
  182. package/dist/components/Scrollbar/index.d.ts +3 -0
  183. package/dist/components/Scrollbar/index.d.ts.map +1 -0
  184. package/dist/components/Select/Select.css +299 -0
  185. package/dist/components/Select/Select.css.d.ts +1 -0
  186. package/dist/components/Select/Select.d.ts +52 -0
  187. package/dist/components/Select/Select.d.ts.map +1 -0
  188. package/dist/components/Select/Select.js +281 -0
  189. package/dist/components/Select/Select.js.map +1 -0
  190. package/dist/components/Select/index.d.ts +3 -0
  191. package/dist/components/Select/index.d.ts.map +1 -0
  192. package/dist/components/Slider/Slider.css +158 -0
  193. package/dist/components/Slider/Slider.css.d.ts +1 -0
  194. package/dist/components/Slider/Slider.d.ts +26 -0
  195. package/dist/components/Slider/Slider.d.ts.map +1 -0
  196. package/dist/components/Slider/Slider.js +67 -0
  197. package/dist/components/Slider/Slider.js.map +1 -0
  198. package/dist/components/Slider/index.d.ts +3 -0
  199. package/dist/components/Slider/index.d.ts.map +1 -0
  200. package/dist/components/SpinBox/SpinBox.css +152 -0
  201. package/dist/components/SpinBox/SpinBox.css.d.ts +1 -0
  202. package/dist/components/SpinBox/SpinBox.d.ts +28 -0
  203. package/dist/components/SpinBox/SpinBox.d.ts.map +1 -0
  204. package/dist/components/SpinBox/SpinBox.js +207 -0
  205. package/dist/components/SpinBox/SpinBox.js.map +1 -0
  206. package/dist/components/SpinBox/index.d.ts +3 -0
  207. package/dist/components/SpinBox/index.d.ts.map +1 -0
  208. package/dist/components/Spinner/Spinner.css +137 -0
  209. package/dist/components/Spinner/Spinner.css.d.ts +1 -0
  210. package/dist/components/Spinner/Spinner.d.ts +20 -0
  211. package/dist/components/Spinner/Spinner.d.ts.map +1 -0
  212. package/dist/components/Spinner/Spinner.js +36 -0
  213. package/dist/components/Spinner/Spinner.js.map +1 -0
  214. package/dist/components/Spinner/index.d.ts +3 -0
  215. package/dist/components/Spinner/index.d.ts.map +1 -0
  216. package/dist/components/Splitter/Splitter.css +119 -0
  217. package/dist/components/Splitter/Splitter.css.d.ts +1 -0
  218. package/dist/components/Splitter/Splitter.d.ts +25 -0
  219. package/dist/components/Splitter/Splitter.d.ts.map +1 -0
  220. package/dist/components/Splitter/Splitter.js +212 -0
  221. package/dist/components/Splitter/Splitter.js.map +1 -0
  222. package/dist/components/Splitter/index.d.ts +3 -0
  223. package/dist/components/Splitter/index.d.ts.map +1 -0
  224. package/dist/components/StatusBar/StatusBar.css +97 -0
  225. package/dist/components/StatusBar/StatusBar.css.d.ts +1 -0
  226. package/dist/components/StatusBar/StatusBar.d.ts +22 -0
  227. package/dist/components/StatusBar/StatusBar.d.ts.map +1 -0
  228. package/dist/components/StatusBar/StatusBar.js +56 -0
  229. package/dist/components/StatusBar/StatusBar.js.map +1 -0
  230. package/dist/components/StatusBar/index.d.ts +3 -0
  231. package/dist/components/StatusBar/index.d.ts.map +1 -0
  232. package/dist/components/StatusLabel/StatusLabel.css +93 -0
  233. package/dist/components/StatusLabel/StatusLabel.css.d.ts +1 -0
  234. package/dist/components/StatusLabel/StatusLabel.d.ts +20 -0
  235. package/dist/components/StatusLabel/StatusLabel.d.ts.map +1 -0
  236. package/dist/components/StatusLabel/StatusLabel.js +42 -0
  237. package/dist/components/StatusLabel/StatusLabel.js.map +1 -0
  238. package/dist/components/StatusLabel/index.d.ts +3 -0
  239. package/dist/components/StatusLabel/index.d.ts.map +1 -0
  240. package/dist/components/Table/Table.css +253 -0
  241. package/dist/components/Table/Table.css.d.ts +1 -0
  242. package/dist/components/Table/Table.d.ts +67 -0
  243. package/dist/components/Table/Table.d.ts.map +1 -0
  244. package/dist/components/Table/Table.js +429 -0
  245. package/dist/components/Table/Table.js.map +1 -0
  246. package/dist/components/Table/index.d.ts +3 -0
  247. package/dist/components/Table/index.d.ts.map +1 -0
  248. package/dist/components/Tabs/Tabs.css +138 -0
  249. package/dist/components/Tabs/Tabs.css.d.ts +1 -0
  250. package/dist/components/Tabs/Tabs.d.ts +34 -0
  251. package/dist/components/Tabs/Tabs.d.ts.map +1 -0
  252. package/dist/components/Tabs/Tabs.js +140 -0
  253. package/dist/components/Tabs/Tabs.js.map +1 -0
  254. package/dist/components/Tabs/index.d.ts +3 -0
  255. package/dist/components/Tabs/index.d.ts.map +1 -0
  256. package/dist/components/TextInput/TextInput.css +133 -0
  257. package/dist/components/TextInput/TextInput.css.d.ts +1 -0
  258. package/dist/components/TextInput/TextInput.d.ts +16 -0
  259. package/dist/components/TextInput/TextInput.d.ts.map +1 -0
  260. package/dist/components/TextInput/TextInput.js +38 -0
  261. package/dist/components/TextInput/TextInput.js.map +1 -0
  262. package/dist/components/TextInput/index.d.ts +3 -0
  263. package/dist/components/TextInput/index.d.ts.map +1 -0
  264. package/dist/components/Textarea/Textarea.css +121 -0
  265. package/dist/components/Textarea/Textarea.css.d.ts +1 -0
  266. package/dist/components/Textarea/Textarea.d.ts +21 -0
  267. package/dist/components/Textarea/Textarea.d.ts.map +1 -0
  268. package/dist/components/Textarea/Textarea.js +61 -0
  269. package/dist/components/Textarea/Textarea.js.map +1 -0
  270. package/dist/components/Textarea/index.d.ts +3 -0
  271. package/dist/components/Textarea/index.d.ts.map +1 -0
  272. package/dist/components/TitleBar/TitleBar.css +76 -0
  273. package/dist/components/TitleBar/TitleBar.css.d.ts +1 -0
  274. package/dist/components/TitleBar/TitleBar.d.ts +20 -0
  275. package/dist/components/TitleBar/TitleBar.d.ts.map +1 -0
  276. package/dist/components/TitleBar/TitleBar.js +43 -0
  277. package/dist/components/TitleBar/TitleBar.js.map +1 -0
  278. package/dist/components/TitleBar/index.d.ts +3 -0
  279. package/dist/components/TitleBar/index.d.ts.map +1 -0
  280. package/dist/components/ToggleButton/ToggleButton.css +162 -0
  281. package/dist/components/ToggleButton/ToggleButton.css.d.ts +1 -0
  282. package/dist/components/ToggleButton/ToggleButton.d.ts +27 -0
  283. package/dist/components/ToggleButton/ToggleButton.d.ts.map +1 -0
  284. package/dist/components/ToggleButton/ToggleButton.js +52 -0
  285. package/dist/components/ToggleButton/ToggleButton.js.map +1 -0
  286. package/dist/components/ToggleButton/index.d.ts +3 -0
  287. package/dist/components/ToggleButton/index.d.ts.map +1 -0
  288. package/dist/components/Toolbar/Toolbar.css +202 -0
  289. package/dist/components/Toolbar/Toolbar.css.d.ts +1 -0
  290. package/dist/components/Toolbar/Toolbar.d.ts +46 -0
  291. package/dist/components/Toolbar/Toolbar.d.ts.map +1 -0
  292. package/dist/components/Toolbar/Toolbar.js +102 -0
  293. package/dist/components/Toolbar/Toolbar.js.map +1 -0
  294. package/dist/components/Toolbar/index.d.ts +3 -0
  295. package/dist/components/Toolbar/index.d.ts.map +1 -0
  296. package/dist/components/Tooltip/Tooltip.css +86 -0
  297. package/dist/components/Tooltip/Tooltip.css.d.ts +1 -0
  298. package/dist/components/Tooltip/Tooltip.d.ts +22 -0
  299. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
  300. package/dist/components/Tooltip/Tooltip.js +92 -0
  301. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  302. package/dist/components/Tooltip/index.d.ts +3 -0
  303. package/dist/components/Tooltip/index.d.ts.map +1 -0
  304. package/dist/components/TreeView/TreeView.css +191 -0
  305. package/dist/components/TreeView/TreeView.css.d.ts +1 -0
  306. package/dist/components/TreeView/TreeView.d.ts +46 -0
  307. package/dist/components/TreeView/TreeView.d.ts.map +1 -0
  308. package/dist/components/TreeView/TreeView.js +331 -0
  309. package/dist/components/TreeView/TreeView.js.map +1 -0
  310. package/dist/components/TreeView/index.d.ts +3 -0
  311. package/dist/components/TreeView/index.d.ts.map +1 -0
  312. package/dist/components/Window/Window.css +218 -0
  313. package/dist/components/Window/Window.css.d.ts +1 -0
  314. package/dist/components/Window/Window.d.ts +30 -0
  315. package/dist/components/Window/Window.d.ts.map +1 -0
  316. package/dist/components/Window/Window.js +156 -0
  317. package/dist/components/Window/Window.js.map +1 -0
  318. package/dist/components/Window/index.d.ts +3 -0
  319. package/dist/components/Window/index.d.ts.map +1 -0
  320. package/dist/index.d.ts +91 -10
  321. package/dist/index.d.ts.map +1 -1
  322. package/dist/index.js +41 -3
  323. package/dist/styles/scrollbars.css +123 -0
  324. package/dist/styles/scrollbars.css.d.ts +1 -0
  325. package/dist/styles/theme.css +86 -41
  326. package/dist/styles/tokens.css +202 -0
  327. package/dist/styles/tokens.css.d.ts +1 -0
  328. package/dist/test/a11y.d.ts +3 -0
  329. package/dist/test/a11y.d.ts.map +1 -0
  330. package/dist/test/index.d.ts +2 -0
  331. package/dist/test/index.d.ts.map +1 -0
  332. package/dist/test/setup.d.ts +2 -0
  333. package/dist/test/setup.d.ts.map +1 -0
  334. package/package.json +13 -2
  335. package/dist/components/GreenButton/GreenButton.css +0 -47
  336. package/dist/components/GreenButton/GreenButton.d.ts +0 -8
  337. package/dist/components/GreenButton/GreenButton.d.ts.map +0 -1
  338. package/dist/components/GreenButton/GreenButton.js +0 -20
  339. package/dist/components/GreenButton/GreenButton.js.map +0 -1
  340. package/dist/components/GreenButton/index.d.ts +0 -3
  341. package/dist/components/GreenPanel/GreenPanel.css +0 -45
  342. package/dist/components/GreenPanel/GreenPanel.d.ts +0 -12
  343. package/dist/components/GreenPanel/GreenPanel.d.ts.map +0 -1
  344. package/dist/components/GreenPanel/GreenPanel.js +0 -24
  345. package/dist/components/GreenPanel/GreenPanel.js.map +0 -1
  346. package/dist/components/GreenPanel/index.d.ts +0 -3
  347. /package/dist/components/{GreenButton/GreenButton.css.d.ts → Avatar/Avatar.css.d.ts} +0 -0
  348. /package/dist/components/{GreenPanel/GreenPanel.css.d.ts → Button/Button.css.d.ts} +0 -0
@@ -0,0 +1,31 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ import './Scrollbar.css';
3
+ import '../../styles/scrollbars.css';
4
+ export interface ScrollbarProps extends HTMLAttributes<HTMLDivElement> {
5
+ /** Scrolling axis. Defaults to `"vertical"`. */
6
+ orientation?: 'vertical' | 'horizontal';
7
+ /**
8
+ * Painting strategy. `"drawn"` renders the button/gutter/thumb tree, which
9
+ * looks the same in every engine; `"native"` sets `scrollbar-color` and emits
10
+ * no extra markup, leaving the bar to the platform. Defaults to `"drawn"`.
11
+ */
12
+ variant?: 'drawn' | 'native';
13
+ /**
14
+ * Bar thickness. Defaults to `--vgui-scrollbar-size` (18px). Honoured by both
15
+ * variants, but the platform only paints a custom thickness in WebKit/Blink.
16
+ */
17
+ thickness?: number | string;
18
+ /** Reserve space for the bar even when the content does not overflow. */
19
+ alwaysVisible?: boolean;
20
+ /**
21
+ * Paint the gutter with nothing, matching `ScrollBarSlider:disabled`
22
+ * (`steam.styles:2315`). The content stays scrollable.
23
+ */
24
+ disabled?: boolean;
25
+ /** Pixels of the region that must remain visible above the bar. */
26
+ scrollPadding?: number;
27
+ /** Called with the scroll offset after every scroll frame. */
28
+ onScrollOffsetChange?: (offset: number, max: number) => void;
29
+ }
30
+ export declare const Scrollbar: import("react").ForwardRefExoticComponent<ScrollbarProps & import("react").RefAttributes<HTMLDivElement>>;
31
+ //# sourceMappingURL=Scrollbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scrollbar.d.ts","sourceRoot":"","sources":["../../../src/components/Scrollbar/Scrollbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EAIf,MAAM,OAAO,CAAA;AAEd,OAAO,iBAAiB,CAAA;AACxB,OAAO,6BAA6B,CAAA;AAEpC,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,cAAc,CAAC;IACpE,gDAAgD;IAChD,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAA;IACvC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7D;AAgBD,eAAO,MAAM,SAAS,2GA2TpB,CAAA"}
@@ -0,0 +1,277 @@
1
+ import { forwardRef, useCallback, useEffect, useRef, useState } from "react";
2
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
3
+ import "../../styles/scrollbars.css";
4
+ import "./Scrollbar.css";
5
+ //#region src/components/Scrollbar/Scrollbar.tsx
6
+ var EMPTY_METRICS = {
7
+ offset: 0,
8
+ max: 0,
9
+ viewport: 0,
10
+ content: 0
11
+ };
12
+ /** jsdom has no layout engine, so every measured number is 0/NaN there. */
13
+ function toExtent(value) {
14
+ return Number.isFinite(value) && value > 0 ? value : 0;
15
+ }
16
+ var Scrollbar = forwardRef(function Scrollbar({ className, orientation = "vertical", variant = "drawn", thickness, alwaysVisible = false, disabled = false, scrollPadding, onScrollOffsetChange, children, style, tabIndex, onScroll, onKeyDown, ...rest }, forwardedRef) {
17
+ const regionRef = useRef(null);
18
+ const contentRef = useRef(null);
19
+ const dragCleanupRef = useRef(null);
20
+ const [metrics, setMetrics] = useState(EMPTY_METRICS);
21
+ const drawn = variant === "drawn";
22
+ const vertical = orientation === "vertical";
23
+ const scroller = drawn ? contentRef : regionRef;
24
+ const measure = useCallback(() => {
25
+ const node = scroller.current;
26
+ if (!node) return;
27
+ const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth);
28
+ const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth);
29
+ const offset = Math.max(vertical ? node.scrollTop : node.scrollLeft, 0);
30
+ const max = content > viewport ? content - viewport : 0;
31
+ setMetrics({
32
+ offset: max > 0 ? Math.min(offset, max) : offset,
33
+ max,
34
+ viewport,
35
+ content
36
+ });
37
+ onScrollOffsetChange?.(max > 0 ? Math.min(offset, max) : offset, max);
38
+ }, [
39
+ onScrollOffsetChange,
40
+ scroller,
41
+ vertical
42
+ ]);
43
+ useEffect(() => {
44
+ measure();
45
+ const node = scroller.current;
46
+ if (!node || typeof ResizeObserver === "undefined") return;
47
+ const observer = new ResizeObserver(measure);
48
+ observer.observe(node);
49
+ return () => observer.disconnect();
50
+ }, [
51
+ measure,
52
+ scroller,
53
+ children
54
+ ]);
55
+ useEffect(() => () => dragCleanupRef.current?.(), []);
56
+ const setRegionRef = useCallback((node) => {
57
+ regionRef.current = node;
58
+ if (typeof forwardedRef === "function") forwardedRef(node);
59
+ else if (forwardedRef) forwardedRef.current = node;
60
+ }, [forwardedRef]);
61
+ const handleScroll = useCallback((event) => {
62
+ onScroll?.(event);
63
+ measure();
64
+ }, [measure, onScroll]);
65
+ const scrollByExtent = useCallback((delta) => {
66
+ const node = scroller.current;
67
+ if (!node) return;
68
+ if (vertical) node.scrollTop = Math.max(node.scrollTop + delta, 0);
69
+ else node.scrollLeft = Math.max(node.scrollLeft + delta, 0);
70
+ measure();
71
+ }, [
72
+ measure,
73
+ scroller,
74
+ vertical
75
+ ]);
76
+ const scrollToEdge = useCallback((edge) => {
77
+ const node = scroller.current;
78
+ if (!node) return;
79
+ if (vertical) node.scrollTop = edge === "start" ? 0 : node.scrollHeight;
80
+ else node.scrollLeft = edge === "start" ? 0 : node.scrollWidth;
81
+ measure();
82
+ }, [
83
+ measure,
84
+ scroller,
85
+ vertical
86
+ ]);
87
+ const step = useCallback((direction, factor = .2) => {
88
+ const node = scroller.current;
89
+ if (!node) return;
90
+ const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth);
91
+ const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth);
92
+ const distance = viewport > 0 ? Math.max(1, Math.round(viewport * factor)) : Math.max(1, Math.round(content / 10) || 20);
93
+ scrollByExtent(distance * direction);
94
+ }, [
95
+ scrollByExtent,
96
+ scroller,
97
+ vertical
98
+ ]);
99
+ const scrollToRatio = useCallback((ratio) => {
100
+ const node = scroller.current;
101
+ if (!node) return;
102
+ const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth);
103
+ const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth);
104
+ const max = content > viewport ? content - viewport : 0;
105
+ if (max <= 0) return;
106
+ const next = Math.round(Math.min(Math.max(ratio, 0), 1) * max);
107
+ if (vertical) node.scrollTop = next;
108
+ else node.scrollLeft = next;
109
+ measure();
110
+ }, [
111
+ measure,
112
+ scroller,
113
+ vertical
114
+ ]);
115
+ const handleKeyDown = useCallback((event) => {
116
+ onKeyDown?.(event);
117
+ if (event.defaultPrevented || !drawn) return;
118
+ const back = vertical ? "ArrowUp" : "ArrowLeft";
119
+ const forward = vertical ? "ArrowDown" : "ArrowRight";
120
+ switch (event.key) {
121
+ case back:
122
+ event.preventDefault();
123
+ step(-1);
124
+ return;
125
+ case forward:
126
+ event.preventDefault();
127
+ step(1);
128
+ return;
129
+ case "PageUp":
130
+ event.preventDefault();
131
+ step(-1, 1);
132
+ return;
133
+ case "PageDown":
134
+ event.preventDefault();
135
+ step(1, 1);
136
+ return;
137
+ case " ":
138
+ event.preventDefault();
139
+ step(event.shiftKey ? -1 : 1, 1);
140
+ return;
141
+ case "Home":
142
+ event.preventDefault();
143
+ scrollToEdge("start");
144
+ return;
145
+ case "End":
146
+ event.preventDefault();
147
+ scrollToEdge("end");
148
+ return;
149
+ default: return;
150
+ }
151
+ }, [
152
+ drawn,
153
+ onKeyDown,
154
+ scrollToEdge,
155
+ step,
156
+ vertical
157
+ ]);
158
+ const handleGutterPointerDown = useCallback((event) => {
159
+ if (disabled) return;
160
+ const gutter = event.currentTarget;
161
+ const extent = toExtent(vertical ? gutter.clientHeight : gutter.clientWidth);
162
+ if (extent <= 0) return;
163
+ const start = vertical ? gutter.getBoundingClientRect().top : gutter.getBoundingClientRect().left;
164
+ scrollToRatio(((vertical ? event.clientY : event.clientX) - start) / extent);
165
+ }, [
166
+ disabled,
167
+ scrollToRatio,
168
+ vertical
169
+ ]);
170
+ const handleThumbPointerDown = useCallback((event) => {
171
+ if (disabled) return;
172
+ const node = scroller.current;
173
+ const gutter = event.currentTarget.parentElement;
174
+ if (!node || !gutter) return;
175
+ const extent = toExtent(vertical ? gutter.clientHeight : gutter.clientWidth);
176
+ const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth);
177
+ const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth);
178
+ const max = content > viewport ? content - viewport : 0;
179
+ if (extent <= 0 || max <= 0) return;
180
+ const travel = extent - Math.max(1, Math.min(extent, viewport / content * extent));
181
+ if (travel <= 0) return;
182
+ const axis = vertical ? "clientY" : "clientX";
183
+ const startPosition = event[axis];
184
+ const startOffset = vertical ? node.scrollTop : node.scrollLeft;
185
+ const onMove = (moveEvent) => {
186
+ const delta = (moveEvent[axis] - startPosition) / travel;
187
+ const next = Math.round(Math.min(Math.max(startOffset + delta * max, 0), max));
188
+ if (vertical) node.scrollTop = next;
189
+ else node.scrollLeft = next;
190
+ measure();
191
+ };
192
+ const cleanup = () => {
193
+ window.removeEventListener("pointermove", onMove);
194
+ window.removeEventListener("pointerup", cleanup);
195
+ dragCleanupRef.current = null;
196
+ };
197
+ dragCleanupRef.current?.();
198
+ dragCleanupRef.current = cleanup;
199
+ window.addEventListener("pointermove", onMove);
200
+ window.addEventListener("pointerup", cleanup);
201
+ }, [
202
+ disabled,
203
+ measure,
204
+ scroller,
205
+ vertical
206
+ ]);
207
+ const classes = ["vgui-scroll-region", `vgui-scroll-region--${orientation}`];
208
+ if (drawn) classes.push("vgui-scroll-region--drawn");
209
+ else classes.push("vgui-scroll-surface");
210
+ if (alwaysVisible) classes.push("vgui-scroll-region--always-visible");
211
+ if (className) classes.push(className);
212
+ const regionStyle = {
213
+ ...style,
214
+ ...thickness === void 0 ? null : { "--vgui-scrollbar-size": cssLength(thickness) },
215
+ ...scrollPadding === void 0 ? null : { "--vgui-scrollbar-scroll-padding": `${scrollPadding}px` }
216
+ };
217
+ const ratio = metrics.max > 0 && metrics.viewport > 0 ? metrics.viewport / (metrics.max + metrics.viewport) : 1;
218
+ const lengthPercent = Math.round(Math.min(Math.max(ratio, .1), 1) * 100);
219
+ const offsetFraction = metrics.max > 0 ? metrics.offset / metrics.max : 0;
220
+ const thumbStyle = {
221
+ "--vgui-scrollbar-thumb-length": `${lengthPercent}%`,
222
+ "--vgui-scrollbar-thumb-offset": offsetFraction
223
+ };
224
+ return /* @__PURE__ */ jsx("div", {
225
+ ref: setRegionRef,
226
+ className: classes.join(" "),
227
+ style: regionStyle,
228
+ tabIndex: tabIndex ?? 0,
229
+ "data-disabled": disabled ? "" : void 0,
230
+ onKeyDown: handleKeyDown,
231
+ ...drawn ? null : { onScroll: handleScroll },
232
+ ...rest,
233
+ children: drawn ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
234
+ ref: contentRef,
235
+ className: "vgui-scroll-region__content",
236
+ onScroll: handleScroll,
237
+ children
238
+ }), /* @__PURE__ */ jsxs("div", {
239
+ className: "vgui-scrollbar",
240
+ "data-orientation": orientation,
241
+ "aria-hidden": "true",
242
+ children: [
243
+ /* @__PURE__ */ jsx("button", {
244
+ type: "button",
245
+ tabIndex: -1,
246
+ className: "vgui-scrollbar__button vgui-scrollbar__button--decrement",
247
+ onClick: () => step(-1),
248
+ children: /* @__PURE__ */ jsx("span", { className: `vgui-scrollbar__glyph vgui-scrollbar__glyph--${vertical ? "up" : "left"}` })
249
+ }),
250
+ /* @__PURE__ */ jsx("div", {
251
+ className: "vgui-scrollbar__gutter",
252
+ onPointerDown: handleGutterPointerDown,
253
+ children: /* @__PURE__ */ jsx("div", {
254
+ className: "vgui-scrollbar__thumb",
255
+ style: thumbStyle,
256
+ onPointerDown: handleThumbPointerDown
257
+ })
258
+ }),
259
+ /* @__PURE__ */ jsx("button", {
260
+ type: "button",
261
+ tabIndex: -1,
262
+ className: "vgui-scrollbar__button vgui-scrollbar__button--increment",
263
+ onClick: () => step(1),
264
+ children: /* @__PURE__ */ jsx("span", { className: `vgui-scrollbar__glyph vgui-scrollbar__glyph--${vertical ? "down" : "right"}` })
265
+ })
266
+ ]
267
+ })] }) : children
268
+ });
269
+ });
270
+ function cssLength(value) {
271
+ return typeof value === "number" ? `${value}px` : value;
272
+ }
273
+ Scrollbar.displayName = "Scrollbar";
274
+ //#endregion
275
+ export { Scrollbar };
276
+
277
+ //# sourceMappingURL=Scrollbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scrollbar.js","names":[],"sources":["../../../src/components/Scrollbar/Scrollbar.tsx"],"sourcesContent":["import { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\nimport type {\n CSSProperties,\n HTMLAttributes,\n KeyboardEvent as ReactKeyboardEvent,\n PointerEvent as ReactPointerEvent,\n UIEvent as ReactUIEvent,\n} from 'react'\n\nimport './Scrollbar.css'\nimport '../../styles/scrollbars.css'\n\nexport interface ScrollbarProps extends HTMLAttributes<HTMLDivElement> {\n /** Scrolling axis. Defaults to `\"vertical\"`. */\n orientation?: 'vertical' | 'horizontal'\n /**\n * Painting strategy. `\"drawn\"` renders the button/gutter/thumb tree, which\n * looks the same in every engine; `\"native\"` sets `scrollbar-color` and emits\n * no extra markup, leaving the bar to the platform. Defaults to `\"drawn\"`.\n */\n variant?: 'drawn' | 'native'\n /**\n * Bar thickness. Defaults to `--vgui-scrollbar-size` (18px). Honoured by both\n * variants, but the platform only paints a custom thickness in WebKit/Blink.\n */\n thickness?: number | string\n /** Reserve space for the bar even when the content does not overflow. */\n alwaysVisible?: boolean\n /**\n * Paint the gutter with nothing, matching `ScrollBarSlider:disabled`\n * (`steam.styles:2315`). The content stays scrollable.\n */\n disabled?: boolean\n /** Pixels of the region that must remain visible above the bar. */\n scrollPadding?: number\n /** Called with the scroll offset after every scroll frame. */\n onScrollOffsetChange?: (offset: number, max: number) => void\n}\n\ninterface ScrollMetrics {\n offset: number\n max: number\n viewport: number\n content: number\n}\n\nconst EMPTY_METRICS: ScrollMetrics = { offset: 0, max: 0, viewport: 0, content: 0 }\n\n/** jsdom has no layout engine, so every measured number is 0/NaN there. */\nfunction toExtent(value: number): number {\n return Number.isFinite(value) && value > 0 ? value : 0\n}\n\nexport const Scrollbar = forwardRef<HTMLDivElement, ScrollbarProps>(function Scrollbar(\n {\n className,\n orientation = 'vertical',\n variant = 'drawn',\n thickness,\n alwaysVisible = false,\n disabled = false,\n scrollPadding,\n onScrollOffsetChange,\n children,\n style,\n tabIndex,\n onScroll,\n onKeyDown,\n ...rest\n },\n forwardedRef,\n) {\n const regionRef = useRef<HTMLDivElement | null>(null)\n const contentRef = useRef<HTMLDivElement | null>(null)\n const dragCleanupRef = useRef<(() => void) | null>(null)\n const [metrics, setMetrics] = useState<ScrollMetrics>(EMPTY_METRICS)\n\n const drawn = variant === 'drawn'\n const vertical = orientation === 'vertical'\n\n // In the native path the region scrolls itself; in the drawn path the inner\n // content does, and the bar is a flex sibling that never scrolls away.\n const scroller = drawn ? contentRef : regionRef\n\n const measure = useCallback(() => {\n const node = scroller.current\n if (!node) return\n\n const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth)\n const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth)\n const offset = Math.max(vertical ? node.scrollTop : node.scrollLeft, 0)\n const max = content > viewport ? content - viewport : 0\n\n setMetrics({\n offset: max > 0 ? Math.min(offset, max) : offset,\n max,\n viewport,\n content,\n })\n onScrollOffsetChange?.(max > 0 ? Math.min(offset, max) : offset, max)\n }, [onScrollOffsetChange, scroller, vertical])\n\n useEffect(() => {\n measure()\n\n const node = scroller.current\n if (!node || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(measure)\n observer.observe(node)\n return () => observer.disconnect()\n }, [measure, scroller, children])\n\n useEffect(() => () => dragCleanupRef.current?.(), [])\n\n const setRegionRef = useCallback(\n (node: HTMLDivElement | null) => {\n regionRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef],\n )\n\n const handleScroll = useCallback(\n (event: ReactUIEvent<HTMLDivElement>) => {\n onScroll?.(event)\n measure()\n },\n [measure, onScroll],\n )\n\n const scrollByExtent = useCallback(\n (delta: number) => {\n const node = scroller.current\n if (!node) return\n\n // The engine clamps the far end to the content extent; the near end is\n // clamped here so a negative nudge cannot park the scroller above zero.\n if (vertical) node.scrollTop = Math.max(node.scrollTop + delta, 0)\n else node.scrollLeft = Math.max(node.scrollLeft + delta, 0)\n measure()\n },\n [measure, scroller, vertical],\n )\n\n const scrollToEdge = useCallback(\n (edge: 'start' | 'end') => {\n const node = scroller.current\n if (!node) return\n\n if (vertical) node.scrollTop = edge === 'start' ? 0 : node.scrollHeight\n else node.scrollLeft = edge === 'start' ? 0 : node.scrollWidth\n measure()\n },\n [measure, scroller, vertical],\n )\n\n const step = useCallback(\n (direction: -1 | 1, factor = 0.2) => {\n const node = scroller.current\n if (!node) return\n\n const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth)\n const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth)\n // A fifth of a viewport is a line-page; without a viewport it degrades to\n // the content or to a fixed 20px nudge, so the arrows still do something.\n const distance =\n viewport > 0\n ? Math.max(1, Math.round(viewport * factor))\n : Math.max(1, Math.round(content / 10) || 20)\n\n scrollByExtent(distance * direction)\n },\n [scrollByExtent, scroller, vertical],\n )\n\n const scrollToRatio = useCallback(\n (ratio: number) => {\n const node = scroller.current\n if (!node) return\n\n const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth)\n const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth)\n const max = content > viewport ? content - viewport : 0\n if (max <= 0) return\n\n const next = Math.round(Math.min(Math.max(ratio, 0), 1) * max)\n if (vertical) node.scrollTop = next\n else node.scrollLeft = next\n measure()\n },\n [measure, scroller, vertical],\n )\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n\n // Only the drawn path needs this. Its region hides its overflow and lets\n // the inner box scroll, so the browser has no scroll container to move\n // when the region itself holds focus; the keys it would have handled\n // natively are mapped onto the scroller here instead.\n if (event.defaultPrevented || !drawn) return\n\n const back = vertical ? 'ArrowUp' : 'ArrowLeft'\n const forward = vertical ? 'ArrowDown' : 'ArrowRight'\n\n switch (event.key) {\n case back:\n event.preventDefault()\n step(-1)\n return\n case forward:\n event.preventDefault()\n step(1)\n return\n case 'PageUp':\n event.preventDefault()\n step(-1, 1)\n return\n case 'PageDown':\n event.preventDefault()\n step(1, 1)\n return\n case ' ':\n event.preventDefault()\n step(event.shiftKey ? -1 : 1, 1)\n return\n case 'Home':\n event.preventDefault()\n scrollToEdge('start')\n return\n case 'End':\n event.preventDefault()\n scrollToEdge('end')\n return\n default:\n return\n }\n },\n [drawn, onKeyDown, scrollToEdge, step, vertical],\n )\n\n const handleGutterPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return\n\n const gutter = event.currentTarget\n const extent = toExtent(vertical ? gutter.clientHeight : gutter.clientWidth)\n if (extent <= 0) return\n\n const start = vertical ? gutter.getBoundingClientRect().top : gutter.getBoundingClientRect().left\n scrollToRatio(((vertical ? event.clientY : event.clientX) - start) / extent)\n },\n [disabled, scrollToRatio, vertical],\n )\n\n const handleThumbPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return\n\n const node = scroller.current\n const gutter = event.currentTarget.parentElement\n if (!node || !gutter) return\n\n const extent = toExtent(vertical ? gutter.clientHeight : gutter.clientWidth)\n const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth)\n const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth)\n const max = content > viewport ? content - viewport : 0\n // Without a measurable gutter there is nothing to drag; leaving the event\n // alone keeps the thumb inert rather than jumping the scroll position.\n if (extent <= 0 || max <= 0) return\n\n const thumbExtent = Math.max(1, Math.min(extent, (viewport / content) * extent))\n const travel = extent - thumbExtent\n if (travel <= 0) return\n\n const axis = vertical ? 'clientY' : 'clientX'\n const startPosition = event[axis]\n const startOffset = vertical ? node.scrollTop : node.scrollLeft\n\n const onMove = (moveEvent: PointerEvent) => {\n const delta = (moveEvent[axis] - startPosition) / travel\n const next = Math.round(Math.min(Math.max(startOffset + delta * max, 0), max))\n if (vertical) node.scrollTop = next\n else node.scrollLeft = next\n measure()\n }\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', cleanup)\n dragCleanupRef.current = null\n }\n\n dragCleanupRef.current?.()\n dragCleanupRef.current = cleanup\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', cleanup)\n },\n [disabled, measure, scroller, vertical],\n )\n\n const classes = ['vgui-scroll-region', `vgui-scroll-region--${orientation}`]\n if (drawn) classes.push('vgui-scroll-region--drawn')\n else classes.push('vgui-scroll-surface')\n if (alwaysVisible) classes.push('vgui-scroll-region--always-visible')\n if (className) classes.push(className)\n\n const regionStyle: CSSProperties = {\n ...style,\n ...(thickness === undefined ? null : { '--vgui-scrollbar-size': cssLength(thickness) }),\n ...(scrollPadding === undefined ? null : { '--vgui-scrollbar-scroll-padding': `${scrollPadding}px` }),\n } as CSSProperties\n\n // The thumb is sized from measurements that jsdom cannot provide, so an\n // unmeasurable region falls back to a full-length thumb rather than a\n // zero-length one.\n const ratio = metrics.max > 0 && metrics.viewport > 0 ? metrics.viewport / (metrics.max + metrics.viewport) : 1\n const lengthPercent = Math.round(Math.min(Math.max(ratio, 0.1), 1) * 100)\n const offsetFraction = metrics.max > 0 ? metrics.offset / metrics.max : 0\n const thumbStyle = {\n '--vgui-scrollbar-thumb-length': `${lengthPercent}%`,\n '--vgui-scrollbar-thumb-offset': offsetFraction,\n } as CSSProperties\n\n return (\n <div\n ref={setRegionRef}\n className={classes.join(' ')}\n style={regionStyle}\n tabIndex={tabIndex ?? 0}\n data-disabled={disabled ? '' : undefined}\n onKeyDown={handleKeyDown}\n {...(drawn ? null : { onScroll: handleScroll })}\n {...rest}\n >\n {drawn ? (\n <>\n <div ref={contentRef} className=\"vgui-scroll-region__content\" onScroll={handleScroll}>\n {children}\n </div>\n <div className=\"vgui-scrollbar\" data-orientation={orientation} aria-hidden=\"true\">\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"vgui-scrollbar__button vgui-scrollbar__button--decrement\"\n onClick={() => step(-1)}\n >\n <span className={`vgui-scrollbar__glyph vgui-scrollbar__glyph--${vertical ? 'up' : 'left'}`} />\n </button>\n <div className=\"vgui-scrollbar__gutter\" onPointerDown={handleGutterPointerDown}>\n <div className=\"vgui-scrollbar__thumb\" style={thumbStyle} onPointerDown={handleThumbPointerDown} />\n </div>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"vgui-scrollbar__button vgui-scrollbar__button--increment\"\n onClick={() => step(1)}\n >\n <span className={`vgui-scrollbar__glyph vgui-scrollbar__glyph--${vertical ? 'down' : 'right'}`} />\n </button>\n </div>\n </>\n ) : (\n children\n )}\n </div>\n )\n})\n\nfunction cssLength(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value\n}\n\nScrollbar.displayName = 'Scrollbar'\n"],"mappings":";;;;;AA8CA,IAAM,gBAA+B;CAAE,QAAQ;CAAG,KAAK;CAAG,UAAU;CAAG,SAAS;AAAE;;AAGlF,SAAS,SAAS,OAAuB;CACvC,OAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AACvD;AAEA,IAAa,YAAY,WAA2C,SAAS,UAC3E,EACE,WACA,cAAc,YACd,UAAU,SACV,WACA,gBAAgB,OAChB,WAAW,OACX,eACA,sBACA,UACA,OACA,UACA,UACA,WACA,GAAG,QAEL,cACA;CACA,MAAM,YAAY,OAA8B,IAAI;CACpD,MAAM,aAAa,OAA8B,IAAI;CACrD,MAAM,iBAAiB,OAA4B,IAAI;CACvD,MAAM,CAAC,SAAS,cAAc,SAAwB,aAAa;CAEnE,MAAM,QAAQ,YAAY;CAC1B,MAAM,WAAW,gBAAgB;CAIjC,MAAM,WAAW,QAAQ,aAAa;CAEtC,MAAM,UAAU,kBAAkB;EAChC,MAAM,OAAO,SAAS;EACtB,IAAI,CAAC,MAAM;EAEX,MAAM,WAAW,SAAS,WAAW,KAAK,eAAe,KAAK,WAAW;EACzE,MAAM,UAAU,SAAS,WAAW,KAAK,eAAe,KAAK,WAAW;EACxE,MAAM,SAAS,KAAK,IAAI,WAAW,KAAK,YAAY,KAAK,YAAY,CAAC;EACtE,MAAM,MAAM,UAAU,WAAW,UAAU,WAAW;EAEtD,WAAW;GACT,QAAQ,MAAM,IAAI,KAAK,IAAI,QAAQ,GAAG,IAAI;GAC1C;GACA;GACA;EACF,CAAC;EACD,uBAAuB,MAAM,IAAI,KAAK,IAAI,QAAQ,GAAG,IAAI,QAAQ,GAAG;CACtE,GAAG;EAAC;EAAsB;EAAU;CAAQ,CAAC;CAE7C,gBAAgB;EACd,QAAQ;EAER,MAAM,OAAO,SAAS;EACtB,IAAI,CAAC,QAAQ,OAAO,mBAAmB,aAAa;EACpD,MAAM,WAAW,IAAI,eAAe,OAAO;EAC3C,SAAS,QAAQ,IAAI;EACrB,aAAa,SAAS,WAAW;CACnC,GAAG;EAAC;EAAS;EAAU;CAAQ,CAAC;CAEhC,sBAAsB,eAAe,UAAU,GAAG,CAAC,CAAC;CAEpD,MAAM,eAAe,aAClB,SAAgC;EAC/B,UAAU,UAAU;EACpB,IAAI,OAAO,iBAAiB,YAAY,aAAa,IAAI;OACpD,IAAI,cAAc,aAAa,UAAU;CAChD,GACA,CAAC,YAAY,CACf;CAEA,MAAM,eAAe,aAClB,UAAwC;EACvC,WAAW,KAAK;EAChB,QAAQ;CACV,GACA,CAAC,SAAS,QAAQ,CACpB;CAEA,MAAM,iBAAiB,aACpB,UAAkB;EACjB,MAAM,OAAO,SAAS;EACtB,IAAI,CAAC,MAAM;EAIX,IAAI,UAAU,KAAK,YAAY,KAAK,IAAI,KAAK,YAAY,OAAO,CAAC;OAC5D,KAAK,aAAa,KAAK,IAAI,KAAK,aAAa,OAAO,CAAC;EAC1D,QAAQ;CACV,GACA;EAAC;EAAS;EAAU;CAAQ,CAC9B;CAEA,MAAM,eAAe,aAClB,SAA0B;EACzB,MAAM,OAAO,SAAS;EACtB,IAAI,CAAC,MAAM;EAEX,IAAI,UAAU,KAAK,YAAY,SAAS,UAAU,IAAI,KAAK;OACtD,KAAK,aAAa,SAAS,UAAU,IAAI,KAAK;EACnD,QAAQ;CACV,GACA;EAAC;EAAS;EAAU;CAAQ,CAC9B;CAEA,MAAM,OAAO,aACV,WAAmB,SAAS,OAAQ;EACnC,MAAM,OAAO,SAAS;EACtB,IAAI,CAAC,MAAM;EAEX,MAAM,WAAW,SAAS,WAAW,KAAK,eAAe,KAAK,WAAW;EACzE,MAAM,UAAU,SAAS,WAAW,KAAK,eAAe,KAAK,WAAW;EAGxE,MAAM,WACJ,WAAW,IACP,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,MAAM,CAAC,IACzC,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,EAAE,KAAK,EAAE;EAEhD,eAAe,WAAW,SAAS;CACrC,GACA;EAAC;EAAgB;EAAU;CAAQ,CACrC;CAEA,MAAM,gBAAgB,aACnB,UAAkB;EACjB,MAAM,OAAO,SAAS;EACtB,IAAI,CAAC,MAAM;EAEX,MAAM,WAAW,SAAS,WAAW,KAAK,eAAe,KAAK,WAAW;EACzE,MAAM,UAAU,SAAS,WAAW,KAAK,eAAe,KAAK,WAAW;EACxE,MAAM,MAAM,UAAU,WAAW,UAAU,WAAW;EACtD,IAAI,OAAO,GAAG;EAEd,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG;EAC7D,IAAI,UAAU,KAAK,YAAY;OAC1B,KAAK,aAAa;EACvB,QAAQ;CACV,GACA;EAAC;EAAS;EAAU;CAAQ,CAC9B;CAEA,MAAM,gBAAgB,aACnB,UAA8C;EAC7C,YAAY,KAAK;EAMjB,IAAI,MAAM,oBAAoB,CAAC,OAAO;EAEtC,MAAM,OAAO,WAAW,YAAY;EACpC,MAAM,UAAU,WAAW,cAAc;EAEzC,QAAQ,MAAM,KAAd;GACE,KAAK;IACH,MAAM,eAAe;IACrB,KAAK,EAAE;IACP;GACF,KAAK;IACH,MAAM,eAAe;IACrB,KAAK,CAAC;IACN;GACF,KAAK;IACH,MAAM,eAAe;IACrB,KAAK,IAAI,CAAC;IACV;GACF,KAAK;IACH,MAAM,eAAe;IACrB,KAAK,GAAG,CAAC;IACT;GACF,KAAK;IACH,MAAM,eAAe;IACrB,KAAK,MAAM,WAAW,KAAK,GAAG,CAAC;IAC/B;GACF,KAAK;IACH,MAAM,eAAe;IACrB,aAAa,OAAO;IACpB;GACF,KAAK;IACH,MAAM,eAAe;IACrB,aAAa,KAAK;IAClB;GACF,SACE;EACJ;CACF,GACA;EAAC;EAAO;EAAW;EAAc;EAAM;CAAQ,CACjD;CAEA,MAAM,0BAA0B,aAC7B,UAA6C;EAC5C,IAAI,UAAU;EAEd,MAAM,SAAS,MAAM;EACrB,MAAM,SAAS,SAAS,WAAW,OAAO,eAAe,OAAO,WAAW;EAC3E,IAAI,UAAU,GAAG;EAEjB,MAAM,QAAQ,WAAW,OAAO,sBAAsB,CAAC,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAC;EAC7F,gBAAgB,WAAW,MAAM,UAAU,MAAM,WAAW,SAAS,MAAM;CAC7E,GACA;EAAC;EAAU;EAAe;CAAQ,CACpC;CAEA,MAAM,yBAAyB,aAC5B,UAA6C;EAC5C,IAAI,UAAU;EAEd,MAAM,OAAO,SAAS;EACtB,MAAM,SAAS,MAAM,cAAc;EACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ;EAEtB,MAAM,SAAS,SAAS,WAAW,OAAO,eAAe,OAAO,WAAW;EAC3E,MAAM,WAAW,SAAS,WAAW,KAAK,eAAe,KAAK,WAAW;EACzE,MAAM,UAAU,SAAS,WAAW,KAAK,eAAe,KAAK,WAAW;EACxE,MAAM,MAAM,UAAU,WAAW,UAAU,WAAW;EAGtD,IAAI,UAAU,KAAK,OAAO,GAAG;EAG7B,MAAM,SAAS,SADK,KAAK,IAAI,GAAG,KAAK,IAAI,QAAS,WAAW,UAAW,MAAM,CACtD;EACxB,IAAI,UAAU,GAAG;EAEjB,MAAM,OAAO,WAAW,YAAY;EACpC,MAAM,gBAAgB,MAAM;EAC5B,MAAM,cAAc,WAAW,KAAK,YAAY,KAAK;EAErD,MAAM,UAAU,cAA4B;GAC1C,MAAM,SAAS,UAAU,QAAQ,iBAAiB;GAClD,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,cAAc,QAAQ,KAAK,CAAC,GAAG,GAAG,CAAC;GAC7E,IAAI,UAAU,KAAK,YAAY;QAC1B,KAAK,aAAa;GACvB,QAAQ;EACV;EACA,MAAM,gBAAgB;GACpB,OAAO,oBAAoB,eAAe,MAAM;GAChD,OAAO,oBAAoB,aAAa,OAAO;GAC/C,eAAe,UAAU;EAC3B;EAEA,eAAe,UAAU;EACzB,eAAe,UAAU;EACzB,OAAO,iBAAiB,eAAe,MAAM;EAC7C,OAAO,iBAAiB,aAAa,OAAO;CAC9C,GACA;EAAC;EAAU;EAAS;EAAU;CAAQ,CACxC;CAEA,MAAM,UAAU,CAAC,sBAAsB,uBAAuB,aAAa;CAC3E,IAAI,OAAO,QAAQ,KAAK,2BAA2B;MAC9C,QAAQ,KAAK,qBAAqB;CACvC,IAAI,eAAe,QAAQ,KAAK,oCAAoC;CACpE,IAAI,WAAW,QAAQ,KAAK,SAAS;CAErC,MAAM,cAA6B;EACjC,GAAG;EACH,GAAI,cAAc,KAAA,IAAY,OAAO,EAAE,yBAAyB,UAAU,SAAS,EAAE;EACrF,GAAI,kBAAkB,KAAA,IAAY,OAAO,EAAE,mCAAmC,GAAG,cAAc,IAAI;CACrG;CAKA,MAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,WAAW,IAAI,QAAQ,YAAY,QAAQ,MAAM,QAAQ,YAAY;CAC9G,MAAM,gBAAgB,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,OAAO,EAAG,GAAG,CAAC,IAAI,GAAG;CACxE,MAAM,iBAAiB,QAAQ,MAAM,IAAI,QAAQ,SAAS,QAAQ,MAAM;CACxE,MAAM,aAAa;EACjB,iCAAiC,GAAG,cAAc;EAClD,iCAAiC;CACnC;CAEA,OACE,oBAAC,OAAD;EACE,KAAK;EACL,WAAW,QAAQ,KAAK,GAAG;EAC3B,OAAO;EACP,UAAU,YAAY;EACtB,iBAAe,WAAW,KAAK,KAAA;EAC/B,WAAW;EACX,GAAK,QAAQ,OAAO,EAAE,UAAU,aAAa;EAC7C,GAAI;EAEH,UAAA,QACC,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,OAAD;GAAK,KAAK;GAAY,WAAU;GAA8B,UAAU;GACrE;EACE,CAAA,GACL,qBAAC,OAAD;GAAK,WAAU;GAAiB,oBAAkB;GAAa,eAAY;GAA3E,UAAA;IACE,oBAAC,UAAD;KACE,MAAK;KACL,UAAU;KACV,WAAU;KACV,eAAe,KAAK,EAAE;KAEtB,UAAA,oBAAC,QAAD,EAAM,WAAW,gDAAgD,WAAW,OAAO,SAAW,CAAA;IACxF,CAAA;IACR,oBAAC,OAAD;KAAK,WAAU;KAAyB,eAAe;KACrD,UAAA,oBAAC,OAAD;MAAK,WAAU;MAAwB,OAAO;MAAY,eAAe;KAAyB,CAAA;IAC/F,CAAA;IACL,oBAAC,UAAD;KACE,MAAK;KACL,UAAU;KACV,WAAU;KACV,eAAe,KAAK,CAAC;KAErB,UAAA,oBAAC,QAAD,EAAM,WAAW,gDAAgD,WAAW,SAAS,UAAY,CAAA;IAC3F,CAAA;GACL;EACL,CAAA,CAAA,EAAA,CAAA,IAEF;CAEC,CAAA;AAET,CAAC;AAED,SAAS,UAAU,OAAgC;CACjD,OAAO,OAAO,UAAU,WAAW,GAAG,MAAM,MAAM;AACpD;AAEA,UAAU,cAAc"}
@@ -0,0 +1,3 @@
1
+ export { Scrollbar } from './Scrollbar';
2
+ export type { ScrollbarProps } from './Scrollbar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Scrollbar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,299 @@
1
+ /*
2
+ * Green Steam select — the VGUI `ComboBox` (docs/components/Select.md).
3
+ *
4
+ * Three details separate a real VGUI combobox from a styled `<select>` and all
5
+ * three are kept here:
6
+ *
7
+ * 1. The field half is a field: black `TextEntryBG` interior with the inset
8
+ * bevel a `TextEntry` has, so `--vgui-field-bg` paints the trigger.
9
+ * 2. The button half is 18px of its own raised control with its own bevel,
10
+ * not a background-image caret, which is what makes the separation read.
11
+ * 3. The popup is a `Menu`: `--vgui-surface-dark` face, one bevel-dark
12
+ * border, 18px rows and an `--vgui-accent-dark` selection bar.
13
+ *
14
+ * The caret is drawn with `clip-path` instead of the recipe's
15
+ * `mask-image: var(--vgui-glyph-caret-down)`: no glyph module or caret token
16
+ * exists in `src`, so the 7x4 triangle is traced inline. `--vgui-field-bg`
17
+ * (#000, field and popup interiors) is named by this doc but is absent from
18
+ * `src/styles/tokens.css`; no literal fallback is declared for it.
19
+ */
20
+
21
+ .vgui-select {
22
+ /* Component-local metrics: the 19px field, 18px button half and 18px rows
23
+ * come from the CSS port, not from the theme (the theme's scale has no 19px
24
+ * and its 18px values are the scrollbar and the title bar). */
25
+ --vgui-select-height: 19px;
26
+ --vgui-select-button-width: 18px;
27
+ --vgui-select-option-height: 18px;
28
+ --vgui-select-list-max-height: 200px;
29
+ /* The caret gutter, reserved on every row so labels never shift when the
30
+ * selection moves. Sized to the 7px glyph plus the 4px inset. */
31
+ --vgui-select-check-width: 15px;
32
+
33
+ position: relative;
34
+ display: inline-block;
35
+ min-inline-size: 0;
36
+ font: inherit;
37
+ color: var(--vgui-text);
38
+ }
39
+
40
+ .vgui-select--small {
41
+ --vgui-select-height: 18px;
42
+ }
43
+
44
+ .vgui-select--large {
45
+ --vgui-select-height: var(--vgui-control-height);
46
+ }
47
+
48
+ /* --- The field half ------------------------------------------------------ */
49
+
50
+ .vgui-select__trigger,
51
+ .vgui-select__field {
52
+ box-sizing: border-box;
53
+ display: flex;
54
+ align-items: stretch;
55
+ inline-size: 100%;
56
+ min-block-size: var(--vgui-select-height);
57
+ padding: 0;
58
+ font: inherit;
59
+ color: inherit;
60
+ background-color: var(--vgui-field-bg);
61
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
62
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
63
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
64
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
65
+ border-radius: 0;
66
+ text-align: left;
67
+ cursor: pointer;
68
+ }
69
+
70
+ /* Open: `TextEntryBorderFocused` on the field. VGUI recolours the whole frame;
71
+ * the theme has no split light/dark focused bevel, so all four sides take the
72
+ * accent. */
73
+ .vgui-select--open .vgui-select__trigger,
74
+ .vgui-select--open .vgui-select__field {
75
+ border-color: var(--vgui-accent);
76
+ }
77
+
78
+ /* Invalid: the danger border sits on the light half, matching `TextInput`. */
79
+ .vgui-select--invalid .vgui-select__trigger,
80
+ .vgui-select--invalid .vgui-select__field {
81
+ border-top-color: var(--vgui-danger);
82
+ border-left-color: var(--vgui-danger);
83
+ }
84
+
85
+ .vgui-select__trigger:focus-visible,
86
+ .vgui-select__input:focus-visible {
87
+ outline: var(--vgui-focus-ring);
88
+ outline-offset: var(--vgui-focus-ring-offset);
89
+ }
90
+
91
+ /* Pixel-perfect rendering is opt-in, as in the theme layer. */
92
+ .vgui-crisp .vgui-select__trigger:focus-visible,
93
+ .vgui-crisp .vgui-select__input:focus-visible {
94
+ outline: var(--vgui-focus-ring-valve);
95
+ outline-offset: var(--vgui-focus-ring-valve-offset);
96
+ }
97
+
98
+ .vgui-select__value {
99
+ flex: 1 1 auto;
100
+ display: flex;
101
+ align-items: center;
102
+ min-inline-size: 0;
103
+ padding: 0 var(--vgui-field-inset);
104
+ overflow: hidden;
105
+ text-overflow: ellipsis;
106
+ white-space: nowrap;
107
+ text-align: left;
108
+ }
109
+
110
+ .vgui-select__value[data-placeholder='true'] {
111
+ color: var(--vgui-text-dim);
112
+ }
113
+
114
+ /* Editable: the field half is a text entry, so the caret is a text caret. */
115
+ .vgui-select__editable .vgui-select__field {
116
+ cursor: text;
117
+ }
118
+
119
+ .vgui-select__input {
120
+ flex: 1 1 auto;
121
+ min-inline-size: 0;
122
+ padding: 0 var(--vgui-field-inset);
123
+ font: inherit;
124
+ color: var(--vgui-text);
125
+ background-color: transparent;
126
+ border: 0;
127
+ border-radius: 0;
128
+ caret-color: var(--vgui-text);
129
+ }
130
+
131
+ .vgui-select__input::placeholder {
132
+ color: var(--vgui-text-dim);
133
+ opacity: 1;
134
+ }
135
+
136
+ .vgui-select__input::selection {
137
+ background-color: var(--vgui-selection-bg);
138
+ color: var(--vgui-selection-text);
139
+ }
140
+
141
+ /* --- The button half ----------------------------------------------------- */
142
+
143
+ .vgui-select__button {
144
+ box-sizing: border-box;
145
+ flex: 0 0 var(--vgui-select-button-width);
146
+ align-self: stretch;
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ margin: 0;
151
+ padding: 0;
152
+ background-color: var(--vgui-surface);
153
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
154
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
155
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
156
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
157
+ border-radius: 0;
158
+ cursor: pointer;
159
+ }
160
+
161
+ /* The 7x4 caret, traced rather than masked: `--vgui-glyph-caret-down` and the
162
+ * shared glyph module the doc points at do not exist in `src`. */
163
+ .vgui-select__button::before {
164
+ content: '';
165
+ flex: none;
166
+ inline-size: 7px;
167
+ block-size: 4px;
168
+ background-color: var(--vgui-text);
169
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
170
+ }
171
+
172
+ /* Closed with the field untouched: identical to closed in every value, so
173
+ * there is deliberately no hover rule on the trigger. The button half is its
174
+ * own control and takes the usual raised-control hover. */
175
+ .vgui-select__button:hover {
176
+ background-color: var(--vgui-surface-light);
177
+ }
178
+
179
+ /* --- Disabled ------------------------------------------------------------ */
180
+
181
+ .vgui-select--disabled .vgui-select__trigger,
182
+ .vgui-select--disabled .vgui-select__field {
183
+ cursor: not-allowed;
184
+ }
185
+
186
+ .vgui-select--disabled .vgui-select__value,
187
+ .vgui-select--disabled .vgui-select__input {
188
+ color: var(--vgui-text-disabled);
189
+ text-shadow: 1px 1px 0 var(--vgui-text-disabled-shadow);
190
+ }
191
+
192
+ .vgui-select--disabled .vgui-select__button,
193
+ .vgui-select--disabled .vgui-select__button:hover {
194
+ background-color: var(--vgui-surface);
195
+ }
196
+
197
+ .vgui-select--disabled .vgui-select__button::before {
198
+ background-color: var(--vgui-text-disabled);
199
+ }
200
+
201
+ /* --- The popup (a Menu) -------------------------------------------------- */
202
+
203
+ .vgui-select__list {
204
+ position: absolute;
205
+ z-index: 100;
206
+ inset-inline: 0;
207
+ inset-block-start: 100%;
208
+ margin: 0;
209
+ padding: 0;
210
+ list-style: none;
211
+ max-block-size: var(--vgui-select-list-max-height);
212
+ overflow-y: auto;
213
+ background-color: var(--vgui-surface-dark);
214
+ border: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
215
+ /* VGUI let the popup paint straight over its siblings; a drop shadow is the
216
+ * only way to lift it off the page in the DOM. Bevel dark instead of the
217
+ * recipe's `rgb(0 0 0 / 0.35)`, which is a colour literal. */
218
+ box-shadow: 2px 2px 0 var(--vgui-bevel-dark);
219
+ }
220
+
221
+ .vgui-select__option {
222
+ position: relative;
223
+ display: flex;
224
+ align-items: center;
225
+ min-block-size: var(--vgui-select-option-height);
226
+ padding: 0 var(--vgui-field-inset);
227
+ padding-inline-start: var(--vgui-select-check-width);
228
+ color: var(--vgui-text);
229
+ cursor: default;
230
+ }
231
+
232
+ /* The selected row's non-colour cue: a checkmark, as later Steam builds drew.
233
+ * `content: ''` contributes nothing to the accessible name. */
234
+ .vgui-select__option::before {
235
+ content: '';
236
+ position: absolute;
237
+ inset-inline-start: var(--vgui-field-inset);
238
+ inset-block-start: 50%;
239
+ inline-size: 7px;
240
+ block-size: 7px;
241
+ translate: 0 -50%;
242
+ background-color: currentColor;
243
+ clip-path: polygon(
244
+ 0 45%,
245
+ 35% 100%,
246
+ 100% 10%,
247
+ 80% 0,
248
+ 35% 68%,
249
+ 18% 45%
250
+ );
251
+ opacity: 0;
252
+ }
253
+
254
+ /* #232421 on #91863C is 4.22:1; the port's white is 3.70:1 and fails.
255
+ * `--vgui-selection-text` is exactly #232421. */
256
+ .vgui-select__option[aria-selected='true'] {
257
+ background-color: var(--vgui-accent-dark);
258
+ color: var(--vgui-selection-text);
259
+ }
260
+
261
+ .vgui-select__option[aria-selected='true']::before {
262
+ opacity: 1;
263
+ }
264
+
265
+ /* The row the keyboard is on, painted exactly like `Menu`'s hovered row. */
266
+ .vgui-select__option[data-active='true'] {
267
+ background-color: var(--vgui-accent-dark);
268
+ color: var(--vgui-selection-text);
269
+ }
270
+
271
+ .vgui-select__option[aria-disabled='true'] {
272
+ color: var(--vgui-text-disabled);
273
+ text-shadow: 1px 1px 0 var(--vgui-text-disabled-shadow);
274
+ }
275
+
276
+ .vgui-select__option[aria-disabled='true']::before {
277
+ color: var(--vgui-text-disabled);
278
+ }
279
+
280
+ /* --- Clay ---------------------------------------------------------------- */
281
+
282
+ /* `--clay` is a hook rather than a repaint, matching `TextInput`: the field
283
+ * stays black inside a property sheet and only the chrome turns grey. */
284
+ .vgui-select--clay .vgui-select__button {
285
+ background-color: var(--vgui-clay-button);
286
+ }
287
+
288
+ .vgui-select--clay .vgui-select__button:hover {
289
+ background-color: var(--vgui-clay-light);
290
+ }
291
+
292
+ .vgui-select--clay .vgui-select__button::before {
293
+ background-color: var(--vgui-clay-glyph);
294
+ }
295
+
296
+ .vgui-select--clay .vgui-select__trigger:disabled .vgui-select__value {
297
+ color: var(--vgui-clay-glyph-dim);
298
+ text-shadow: none;
299
+ }
@@ -0,0 +1 @@
1
+ export {}