@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,236 @@
1
+ .vgui-scroll-area {
2
+ position: relative;
3
+ display: grid;
4
+ grid-template:
5
+ minmax(0, 1fr)
6
+ / minmax(0, 1fr);
7
+ grid-template-areas: 'viewport';
8
+ min-height: 0;
9
+ min-width: 0;
10
+ /* Fills a sized flex/grid parent; falls back to auto height otherwise. */
11
+ height: 100%;
12
+ }
13
+
14
+ .vgui-scroll-area__viewport {
15
+ grid-area: viewport;
16
+ overflow-x: hidden;
17
+ overflow-y: auto;
18
+ max-height: 100%;
19
+ min-height: 0;
20
+ min-width: 0;
21
+ }
22
+
23
+ .vgui-scroll-area__viewport:focus-visible {
24
+ outline: var(--vgui-focus-ring);
25
+ outline-offset: var(--vgui-focus-ring-offset);
26
+ }
27
+
28
+ .vgui-scroll-area--horizontal .vgui-scroll-area__viewport {
29
+ overflow-x: auto;
30
+ overflow-y: hidden;
31
+ }
32
+
33
+ .vgui-scroll-area--both .vgui-scroll-area__viewport {
34
+ overflow-x: auto;
35
+ overflow-y: auto;
36
+ }
37
+
38
+ .vgui-scroll-area--inset .vgui-scroll-area__viewport {
39
+ background-color: var(--vgui-surface-dark);
40
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
41
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
42
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
43
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
44
+ }
45
+
46
+ @media (prefers-reduced-motion: no-preference) {
47
+ .vgui-scroll-area__viewport {
48
+ scroll-behavior: smooth;
49
+ }
50
+ }
51
+
52
+ /* Shadows sit on the leading and trailing edge of the scrollable axis. A
53
+ vertical area is the default, so its placement lives in the base rule. */
54
+ .vgui-scroll-area__shadow {
55
+ position: absolute;
56
+ left: 0;
57
+ right: var(--vgui-scrollbar-size);
58
+ height: var(--vgui-bevel-width);
59
+ background-color: var(--vgui-bevel-dark);
60
+ pointer-events: none;
61
+ opacity: 0;
62
+ }
63
+
64
+ .vgui-scroll-area__shadow--top {
65
+ top: 0;
66
+ bottom: auto;
67
+ }
68
+
69
+ .vgui-scroll-area__shadow--bottom {
70
+ bottom: 0;
71
+ top: auto;
72
+ }
73
+
74
+ .vgui-scroll-area__shadow[data-visible='true'] {
75
+ opacity: 1;
76
+ }
77
+
78
+ /* The scroll affordances are decorative, so they never announce themselves. */
79
+ .vgui-scroll-area--no-shadows .vgui-scroll-area__shadow {
80
+ display: none;
81
+ }
82
+
83
+ /* Leading and trailing edge of the scrollable axis. */
84
+ .vgui-scroll-area--both .vgui-scroll-area__shadow {
85
+ right: var(--vgui-scrollbar-size);
86
+ bottom: var(--vgui-scrollbar-size);
87
+ }
88
+
89
+ .vgui-scroll-area--both .vgui-scroll-area__shadow--top {
90
+ bottom: auto;
91
+ }
92
+
93
+ .vgui-scroll-area--horizontal .vgui-scroll-area__shadow {
94
+ left: auto;
95
+ right: auto;
96
+ bottom: var(--vgui-scrollbar-size);
97
+ height: auto;
98
+ width: var(--vgui-bevel-width);
99
+ }
100
+
101
+ .vgui-scroll-area--horizontal .vgui-scroll-area__shadow--top {
102
+ left: 0;
103
+ }
104
+
105
+ .vgui-scroll-area--horizontal .vgui-scroll-area__shadow--bottom {
106
+ right: 0;
107
+ }
108
+
109
+ /* --- Drawn scrollbar (the themed stand-in for the Scrollbar component) ---
110
+ The drawn bar is the default. The platform bar is hidden outright so that a
111
+ `--drawn` region measures and scrolls exactly the same everywhere, and the
112
+ bar itself is painted by the markup in `ScrollArea.tsx`. `--native` instead
113
+ hides nothing and puts `.vgui-scroll-surface` on the viewport, which is what
114
+ `styles/scrollbars.css` skips the markup for; that is the only difference
115
+ between the two, so neither path pays for the other's selectors. */
116
+ .vgui-scroll-area--drawn .vgui-scroll-area__viewport {
117
+ scrollbar-width: none;
118
+ }
119
+
120
+ .vgui-scroll-area--drawn .vgui-scroll-area__viewport::-webkit-scrollbar {
121
+ display: none;
122
+ }
123
+
124
+ .vgui-scroll-area--drawn {
125
+ grid-template:
126
+ minmax(0, 1fr)
127
+ / minmax(0, 1fr) auto;
128
+ grid-template-areas: 'viewport scrollbar-y';
129
+ }
130
+
131
+ .vgui-scroll-area--drawn.vgui-scroll-area--horizontal {
132
+ grid-template:
133
+ minmax(0, 1fr) auto
134
+ / minmax(0, 1fr);
135
+ grid-template-areas:
136
+ 'viewport'
137
+ 'scrollbar-x';
138
+ }
139
+
140
+ .vgui-scroll-area--drawn.vgui-scroll-area--both {
141
+ grid-template:
142
+ minmax(0, 1fr) auto
143
+ / minmax(0, 1fr) auto;
144
+ grid-template-areas:
145
+ 'viewport scrollbar-y'
146
+ 'scrollbar-x corner';
147
+ }
148
+
149
+ .vgui-scroll-area--drawn.vgui-scroll-area--both::after {
150
+ content: '';
151
+ grid-area: corner;
152
+ background-color: var(--vgui-scrollbar-gutter, var(--vgui-surface-light));
153
+ }
154
+
155
+ /* Every box below is sized by its own width/border rather than by `content-box`,
156
+ so the composited bar measures the full 18px `--vgui-scrollbar-size`. */
157
+ .vgui-scroll-area__scrollbar,
158
+ .vgui-scroll-area__button,
159
+ .vgui-scroll-area__thumb {
160
+ box-sizing: border-box;
161
+ }
162
+
163
+ .vgui-scroll-area__scrollbar {
164
+ display: flex;
165
+ flex-direction: column;
166
+ background-color: var(--vgui-scrollbar-gutter, var(--vgui-surface-light));
167
+ }
168
+
169
+ .vgui-scroll-area__scrollbar--vertical {
170
+ grid-area: scrollbar-y;
171
+ width: var(--vgui-scrollbar-size);
172
+ }
173
+
174
+ .vgui-scroll-area__scrollbar--horizontal {
175
+ grid-area: scrollbar-x;
176
+ flex-direction: row;
177
+ height: var(--vgui-scrollbar-size);
178
+ }
179
+
180
+ .vgui-scroll-area__button {
181
+ flex: 0 0 auto;
182
+ display: grid;
183
+ place-items: center;
184
+ width: var(--vgui-scrollbar-button-size, var(--vgui-scrollbar-size));
185
+ height: var(--vgui-scrollbar-button-size, var(--vgui-scrollbar-size));
186
+ background-color: var(--vgui-scrollbar-thumb, var(--vgui-surface));
187
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
188
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
189
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
190
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
191
+ }
192
+
193
+ .vgui-scroll-area__button::before {
194
+ content: '';
195
+ width: var(--vgui-scrollbar-glyph-width, 7px);
196
+ height: var(--vgui-scrollbar-glyph-height, 4px);
197
+ background-color: var(--vgui-scrollbar-glyph-color, #a0aa95);
198
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
199
+ }
200
+
201
+ .vgui-scroll-area__button--increment::before {
202
+ clip-path: polygon(0 0, 100% 0, 50% 100%);
203
+ }
204
+
205
+ .vgui-scroll-area__scrollbar--horizontal .vgui-scroll-area__button::before {
206
+ width: var(--vgui-scrollbar-glyph-height, 4px);
207
+ height: var(--vgui-scrollbar-glyph-width, 7px);
208
+ clip-path: polygon(100% 0, 0 50%, 100% 100%);
209
+ }
210
+
211
+ .vgui-scroll-area__scrollbar--horizontal .vgui-scroll-area__button--increment::before {
212
+ clip-path: polygon(0 0, 100% 50%, 0 100%);
213
+ }
214
+
215
+ .vgui-scroll-area__track {
216
+ position: relative;
217
+ flex: 1 1 auto;
218
+ background-color: var(--vgui-scrollbar-gutter, var(--vgui-surface-light));
219
+ }
220
+
221
+ .vgui-scroll-area__thumb {
222
+ position: absolute;
223
+ top: 0;
224
+ left: 0;
225
+ right: 0;
226
+ background-color: var(--vgui-scrollbar-thumb, var(--vgui-surface));
227
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
228
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
229
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
230
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
231
+ }
232
+
233
+ .vgui-scroll-area__scrollbar--horizontal .vgui-scroll-area__thumb {
234
+ bottom: 0;
235
+ right: auto;
236
+ }
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,25 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ import './ScrollArea.css';
3
+ import '../../styles/scrollbars.css';
4
+ export interface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {
5
+ /** Recess the viewport to the VGUI list-interior look. */
6
+ inset?: boolean;
7
+ /** Which axes may scroll. */
8
+ axis?: 'vertical' | 'horizontal' | 'both';
9
+ /**
10
+ * Which scrollbar to paint. `"drawn"` renders the 18px Green Steam bar, which
11
+ * looks the same in every browser; `"native"` drops the extra markup and skins
12
+ * the platform's own bar instead. Defaults to `"drawn"`.
13
+ */
14
+ variant?: 'drawn' | 'native';
15
+ /** Maximum height of the viewport; omit to fill the parent. */
16
+ maxHeight?: number | string;
17
+ /** Show the fade affordances at the scrollable edges. */
18
+ shadows?: boolean;
19
+ /** Make the viewport focusable so keyboard users can scroll it. */
20
+ focusable?: boolean;
21
+ /** Called with the scroll offset; throttle at the call site if needed. */
22
+ onScrollPositionChange?: (top: number, left: number) => void;
23
+ }
24
+ export declare const ScrollArea: import("react").ForwardRefExoticComponent<ScrollAreaProps & import("react").RefAttributes<HTMLDivElement>>;
25
+ //# sourceMappingURL=ScrollArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollArea.d.ts","sourceRoot":"","sources":["../../../src/components/ScrollArea/ScrollArea.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,cAAc,EAEpB,MAAM,OAAO,CAAA;AACd,OAAO,kBAAkB,CAAA;AACzB,OAAO,6BAA6B,CAAA;AAEpC,MAAM,WAAW,eAAgB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACrE,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,6BAA6B;IAC7B,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAA;IACzC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7D;AAgDD,eAAO,MAAM,UAAU,4GAyIrB,CAAA"}
@@ -0,0 +1,124 @@
1
+ import { forwardRef, useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import "../../styles/scrollbars.css";
4
+ import "./ScrollArea.css";
5
+ //#region src/components/ScrollArea/ScrollArea.tsx
6
+ var EMPTY = {
7
+ scrollable: false,
8
+ atStart: true,
9
+ atEnd: true,
10
+ thumbY: 100,
11
+ thumbX: 100
12
+ };
13
+ /** Anything that can hold focus without a programmatic `tabIndex`. */
14
+ var FOCUSABLE_SELECTOR = "a[href], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])";
15
+ var toPercent = (value) => `${Math.round(value * 100) / 100}%`;
16
+ var readMetrics = (node, horizontal) => {
17
+ return {
18
+ scrollable: horizontal ? node.scrollWidth > node.clientWidth : node.scrollHeight > node.clientHeight,
19
+ atStart: horizontal ? node.scrollLeft <= 0 : node.scrollTop <= 0,
20
+ atEnd: horizontal ? node.scrollLeft + node.clientWidth >= node.scrollWidth : node.scrollTop + node.clientHeight >= node.scrollHeight,
21
+ thumbY: node.scrollHeight > 0 ? node.clientHeight / node.scrollHeight * 100 : 100,
22
+ thumbX: node.scrollWidth > 0 ? node.clientWidth / node.scrollWidth * 100 : 100
23
+ };
24
+ };
25
+ var toLength = (value) => {
26
+ if (value === void 0) return void 0;
27
+ return typeof value === "number" ? `${value}px` : value;
28
+ };
29
+ var ScrollArea = forwardRef(function ScrollArea({ axis = "vertical", children, className, focusable, inset = false, maxHeight, onScrollPositionChange, shadows = true, variant = "drawn", ...rest }, ref) {
30
+ const viewportRef = useRef(null);
31
+ const [metrics, setMetrics] = useState(EMPTY);
32
+ const [autoFocusable, setAutoFocusable] = useState(false);
33
+ const setRoot = useCallback((node) => {
34
+ if (typeof ref === "function") ref(node);
35
+ else if (ref) ref.current = node;
36
+ }, [ref]);
37
+ const isFocusable = focusable ?? autoFocusable;
38
+ const horizontal = axis === "horizontal";
39
+ const drawn = variant === "drawn";
40
+ const measure = useCallback(() => {
41
+ const node = viewportRef.current;
42
+ if (!node) return;
43
+ setMetrics(readMetrics(node, horizontal));
44
+ }, [horizontal]);
45
+ useLayoutEffect(() => {
46
+ if (focusable !== void 0) return;
47
+ const node = viewportRef.current;
48
+ if (!node) return;
49
+ setAutoFocusable(node.querySelector(FOCUSABLE_SELECTOR) === null);
50
+ }, [children, focusable]);
51
+ useLayoutEffect(() => {
52
+ measure();
53
+ }, [children, measure]);
54
+ useEffect(() => {
55
+ const onResize = () => measure();
56
+ window.addEventListener("resize", onResize);
57
+ return () => window.removeEventListener("resize", onResize);
58
+ }, [measure]);
59
+ const handleScroll = (event) => {
60
+ const node = event.currentTarget;
61
+ setMetrics(readMetrics(node, horizontal));
62
+ onScrollPositionChange?.(node.scrollTop, node.scrollLeft);
63
+ };
64
+ const scrollbar = (scrollAxis, thumb) => /* @__PURE__ */ jsxs("div", {
65
+ "aria-hidden": "true",
66
+ className: ["vgui-scroll-area__scrollbar", `vgui-scroll-area__scrollbar--${scrollAxis}`].join(" "),
67
+ children: [
68
+ /* @__PURE__ */ jsx("span", { className: "vgui-scroll-area__button vgui-scroll-area__button--decrement" }),
69
+ /* @__PURE__ */ jsx("span", {
70
+ className: "vgui-scroll-area__track",
71
+ children: /* @__PURE__ */ jsx("span", {
72
+ className: "vgui-scroll-area__thumb",
73
+ style: scrollAxis === "vertical" ? { height: toPercent(thumb) } : { width: toPercent(thumb) }
74
+ })
75
+ }),
76
+ /* @__PURE__ */ jsx("span", { className: "vgui-scroll-area__button vgui-scroll-area__button--increment" })
77
+ ]
78
+ });
79
+ const viewportStyle = {};
80
+ const maxHeightValue = toLength(maxHeight);
81
+ if (maxHeightValue !== void 0) viewportStyle.maxHeight = maxHeightValue;
82
+ return /* @__PURE__ */ jsxs("div", {
83
+ ...rest,
84
+ ref: setRoot,
85
+ className: [
86
+ "vgui-scroll-area",
87
+ axis === "vertical" ? null : `vgui-scroll-area--${axis}`,
88
+ inset ? "vgui-scroll-area--inset" : null,
89
+ drawn ? "vgui-scroll-area--drawn" : "vgui-scroll-area--native",
90
+ shadows ? null : "vgui-scroll-area--no-shadows",
91
+ className
92
+ ].filter(Boolean).join(" "),
93
+ children: [
94
+ /* @__PURE__ */ jsx("div", {
95
+ ref: viewportRef,
96
+ className: drawn ? "vgui-scroll-area__viewport" : "vgui-scroll-area__viewport vgui-scroll-surface",
97
+ style: viewportStyle,
98
+ tabIndex: isFocusable ? 0 : void 0,
99
+ role: isFocusable ? "region" : void 0,
100
+ "aria-label": isFocusable ? rest["aria-label"] : void 0,
101
+ "aria-labelledby": isFocusable ? rest["aria-labelledby"] : void 0,
102
+ onScroll: handleScroll,
103
+ children
104
+ }),
105
+ /* @__PURE__ */ jsx("div", {
106
+ "aria-hidden": "true",
107
+ className: "vgui-scroll-area__shadow vgui-scroll-area__shadow--top",
108
+ "data-visible": metrics.scrollable && !metrics.atStart ? "true" : void 0
109
+ }),
110
+ /* @__PURE__ */ jsx("div", {
111
+ "aria-hidden": "true",
112
+ className: "vgui-scroll-area__shadow vgui-scroll-area__shadow--bottom",
113
+ "data-visible": metrics.scrollable && !metrics.atEnd ? "true" : void 0
114
+ }),
115
+ drawn && axis !== "horizontal" ? scrollbar("vertical", metrics.thumbY) : null,
116
+ drawn && axis !== "vertical" ? scrollbar("horizontal", metrics.thumbX) : null
117
+ ]
118
+ });
119
+ });
120
+ ScrollArea.displayName = "ScrollArea";
121
+ //#endregion
122
+ export { ScrollArea };
123
+
124
+ //# sourceMappingURL=ScrollArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollArea.js","names":[],"sources":["../../../src/components/ScrollArea/ScrollArea.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type UIEvent,\n} from 'react'\nimport './ScrollArea.css'\nimport '../../styles/scrollbars.css'\n\nexport interface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n /** Recess the viewport to the VGUI list-interior look. */\n inset?: boolean\n /** Which axes may scroll. */\n axis?: 'vertical' | 'horizontal' | 'both'\n /**\n * Which scrollbar to paint. `\"drawn\"` renders the 18px Green Steam bar, which\n * looks the same in every browser; `\"native\"` drops the extra markup and skins\n * the platform's own bar instead. Defaults to `\"drawn\"`.\n */\n variant?: 'drawn' | 'native'\n /** Maximum height of the viewport; omit to fill the parent. */\n maxHeight?: number | string\n /** Show the fade affordances at the scrollable edges. */\n shadows?: boolean\n /** Make the viewport focusable so keyboard users can scroll it. */\n focusable?: boolean\n /** Called with the scroll offset; throttle at the call site if needed. */\n onScrollPositionChange?: (top: number, left: number) => void\n}\n\ninterface Metrics {\n /** Whether the scrollable axis actually overflows, so its bars are present. */\n scrollable: boolean\n /** Whether each end of the scrollable axis is reached, so its shadow hides. */\n atStart: boolean\n atEnd: boolean\n /** Visible proportion of each axis, as a percentage for the thumb. */\n thumbY: number\n thumbX: number\n}\n\nconst EMPTY: Metrics = {\n scrollable: false,\n atStart: true,\n atEnd: true,\n thumbY: 100,\n thumbX: 100,\n}\n\n/** Anything that can hold focus without a programmatic `tabIndex`. */\nconst FOCUSABLE_SELECTOR =\n 'a[href], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n\nconst toPercent = (value: number) => `${Math.round(value * 100) / 100}%`\n\nconst readMetrics = (node: HTMLElement, horizontal: boolean): Metrics => {\n const scrollable = horizontal\n ? node.scrollWidth > node.clientWidth\n : node.scrollHeight > node.clientHeight\n\n return {\n scrollable,\n atStart: horizontal ? node.scrollLeft <= 0 : node.scrollTop <= 0,\n atEnd: horizontal\n ? node.scrollLeft + node.clientWidth >= node.scrollWidth\n : node.scrollTop + node.clientHeight >= node.scrollHeight,\n thumbY: node.scrollHeight > 0 ? (node.clientHeight / node.scrollHeight) * 100 : 100,\n thumbX: node.scrollWidth > 0 ? (node.clientWidth / node.scrollWidth) * 100 : 100,\n }\n}\n\nconst toLength = (value: number | string | undefined) => {\n if (value === undefined) return undefined\n return typeof value === 'number' ? `${value}px` : value\n}\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(function ScrollArea(\n {\n axis = 'vertical',\n children,\n className,\n focusable,\n inset = false,\n maxHeight,\n onScrollPositionChange,\n shadows = true,\n variant = 'drawn',\n ...rest\n },\n ref,\n) {\n const viewportRef = useRef<HTMLDivElement | null>(null)\n const [metrics, setMetrics] = useState<Metrics>(EMPTY)\n const [autoFocusable, setAutoFocusable] = useState(false)\n\n const setRoot = useCallback(\n (node: HTMLDivElement | null) => {\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n },\n [ref],\n )\n\n const isFocusable = focusable ?? autoFocusable\n const horizontal = axis === 'horizontal'\n const drawn = variant === 'drawn'\n\n const measure = useCallback(() => {\n const node = viewportRef.current\n if (!node) return\n setMetrics(readMetrics(node, horizontal))\n }, [horizontal])\n\n // A viewport with no focusable descendants has to become one itself: a\n // `overflow: auto` box is otherwise unscrollable without a pointer (WCAG 2.1.1).\n useLayoutEffect(() => {\n if (focusable !== undefined) return\n const node = viewportRef.current\n if (!node) return\n setAutoFocusable(node.querySelector(FOCUSABLE_SELECTOR) === null)\n }, [children, focusable])\n\n useLayoutEffect(() => {\n measure()\n }, [children, measure])\n\n useEffect(() => {\n const onResize = () => measure()\n window.addEventListener('resize', onResize)\n return () => window.removeEventListener('resize', onResize)\n }, [measure])\n\n const handleScroll = (event: UIEvent<HTMLDivElement>) => {\n const node = event.currentTarget\n setMetrics(readMetrics(node, horizontal))\n onScrollPositionChange?.(node.scrollTop, node.scrollLeft)\n }\n\n const scrollbar = (\n scrollAxis: 'vertical' | 'horizontal',\n thumb: number,\n ) => (\n <div\n aria-hidden=\"true\"\n className={[\n 'vgui-scroll-area__scrollbar',\n `vgui-scroll-area__scrollbar--${scrollAxis}`,\n ].join(' ')}\n >\n <span className=\"vgui-scroll-area__button vgui-scroll-area__button--decrement\" />\n <span className=\"vgui-scroll-area__track\">\n <span\n className=\"vgui-scroll-area__thumb\"\n style={\n scrollAxis === 'vertical'\n ? { height: toPercent(thumb) }\n : { width: toPercent(thumb) }\n }\n />\n </span>\n <span className=\"vgui-scroll-area__button vgui-scroll-area__button--increment\" />\n </div>\n )\n\n const viewportStyle: CSSProperties = {}\n const maxHeightValue = toLength(maxHeight)\n if (maxHeightValue !== undefined) viewportStyle.maxHeight = maxHeightValue\n\n return (\n <div\n {...rest}\n ref={setRoot}\n className={[\n 'vgui-scroll-area',\n axis === 'vertical' ? null : `vgui-scroll-area--${axis}`,\n inset ? 'vgui-scroll-area--inset' : null,\n drawn ? 'vgui-scroll-area--drawn' : 'vgui-scroll-area--native',\n shadows ? null : 'vgui-scroll-area--no-shadows',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div\n ref={viewportRef}\n className={\n drawn\n ? 'vgui-scroll-area__viewport'\n : 'vgui-scroll-area__viewport vgui-scroll-surface'\n }\n style={viewportStyle}\n tabIndex={isFocusable ? 0 : undefined}\n role={isFocusable ? 'region' : undefined}\n aria-label={isFocusable ? rest['aria-label'] : undefined}\n aria-labelledby={isFocusable ? rest['aria-labelledby'] : undefined}\n onScroll={handleScroll}\n >\n {children}\n </div>\n <div\n aria-hidden=\"true\"\n className=\"vgui-scroll-area__shadow vgui-scroll-area__shadow--top\"\n data-visible={metrics.scrollable && !metrics.atStart ? 'true' : undefined}\n />\n <div\n aria-hidden=\"true\"\n className=\"vgui-scroll-area__shadow vgui-scroll-area__shadow--bottom\"\n data-visible={metrics.scrollable && !metrics.atEnd ? 'true' : undefined}\n />\n {drawn && axis !== 'horizontal' ? scrollbar('vertical', metrics.thumbY) : null}\n {drawn && axis !== 'vertical' ? scrollbar('horizontal', metrics.thumbX) : null}\n </div>\n )\n})\n\nScrollArea.displayName = 'ScrollArea'\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ScrollArea } from './ScrollArea';
2
+ export type { ScrollAreaProps } from './ScrollArea';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ScrollArea/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,260 @@
1
+ /*
2
+ * Green Steam scrollbar.
3
+ *
4
+ * VGUI draws this control entirely by hand — four arrow buttons, a gutter and a
5
+ * thumb, every pixel of them a stack of half-open `fill()` rectangles
6
+ * (docs/components/Scrollbar.md). Almost none of that is reachable from CSS, so
7
+ * the component splits in two:
8
+ *
9
+ * 1. The drawn path (the default) is the button/gutter/thumb tree below. It
10
+ * reproduces the pressed bevel, the arrow glyph and the stable gutter, and
11
+ * it looks the same in every engine.
12
+ * 2. The native path skips the markup and skins the user agent's own bar with
13
+ * `styles/scrollbars.css`. It costs nothing and keeps wheel, trackpad,
14
+ * PageUp/PageDown, Home/End, autoscroll, rubber-banding and the OS's own
15
+ * size preference as the platform's job — at the price of a bar that only
16
+ * WebKit and Blink paint in full, since `::-webkit-scrollbar-button` is in
17
+ * no specification.
18
+ *
19
+ * Both paths paint the same 18px bar with the same tokens, which is what makes
20
+ * `Scrollbar`, `ScrollArea`, the native skin and the rest of the library read as
21
+ * one control. The drawn bar is flush inside its 18px slot; VGUI's own
22
+ * `inset = "0 0 3 1"` only shrank the paint area within a wider slot, and
23
+ * reproducing that gap would misalign this bar against the other two paths.
24
+ *
25
+ * Press is nothing but the bevel: the arrow is `White` in both hover and active,
26
+ * and the two bevel colours are 2.33:1 and 1.87:1 against the face
27
+ * (foundations.md:444, :445). Valve's inversion is kept because it is the house
28
+ * style, and the one perceivable difference press gains — the glyph dropping by
29
+ * a pixel — is added here, exactly as docs/components/Scrollbar.md prescribes.
30
+ *
31
+ * The four `--vgui-scrollbar-*` metrics this file used to fall back on are
32
+ * declared in src/styles/tokens.css, so no `var()` here needs a literal.
33
+ */
34
+
35
+ /* --- Native path: no markup, no JS, no lost platform behaviour. --------- */
36
+
37
+ .vgui-scroll-region {
38
+ box-sizing: border-box;
39
+ position: relative;
40
+ overflow: auto;
41
+ overscroll-behavior: contain;
42
+ /* The bar's own colours are not set here: on the native path the region also
43
+ * carries `.vgui-scroll-surface`, and `styles/scrollbars.css` is the single
44
+ * place that skin is written down. */
45
+ scroll-padding-block-end: var(--vgui-scrollbar-scroll-padding, 0);
46
+ scroll-padding-inline-end: var(--vgui-scrollbar-scroll-padding, 0);
47
+ }
48
+
49
+ .vgui-scroll-region--vertical {
50
+ overflow-x: hidden;
51
+ }
52
+
53
+ .vgui-scroll-region--horizontal {
54
+ overflow-y: hidden;
55
+ scroll-padding-block-end: 0;
56
+ scroll-padding-inline-end: var(--vgui-scrollbar-scroll-padding, 0);
57
+ }
58
+
59
+ /* The bar's own box is reserved even with nothing to scroll. */
60
+ .vgui-scroll-region--always-visible {
61
+ scrollbar-gutter: stable;
62
+ }
63
+
64
+ /*
65
+ * No scrollbar block in the corpus has a `:focus` style, and the one focus
66
+ * colour the file declares (`ScrollGlyphFocus`, steam.styles:74) is referenced by
67
+ * nothing. The region therefore shows focus itself; the active bevel is never
68
+ * reused as a focus indicator, because a keyboard user never sees it.
69
+ */
70
+ .vgui-scroll-region:focus-visible {
71
+ outline: var(--vgui-focus-ring);
72
+ outline-offset: var(--vgui-focus-ring-offset);
73
+ }
74
+
75
+ .vgui-crisp .vgui-scroll-region:focus-visible {
76
+ outline: var(--vgui-focus-ring-valve);
77
+ outline-offset: var(--vgui-focus-ring-valve-offset);
78
+ }
79
+
80
+ /* --- WebKit-only extras: the pressed bevel of a disabled region. -------- */
81
+
82
+ /* The rest of the platform arrow painting lives in `styles/scrollbars.css` and
83
+ * reaches this element through `.vgui-scroll-surface`, which the region carries
84
+ * on the native path only — the drawn path hides the platform bar outright. */
85
+
86
+ /* steam.styles:2315-2319 — the disabled gutter paints nothing. Translucent
87
+ * rather than a new colour, so it works over any parent surface. */
88
+ .vgui-scroll-surface[data-disabled]::-webkit-scrollbar {
89
+ background-color: transparent;
90
+ }
91
+
92
+ /* --- Drawn path: the bar is a flex sibling, so it never scrolls away. --- */
93
+
94
+ .vgui-scroll-region--drawn {
95
+ display: flex;
96
+ overflow: hidden;
97
+ }
98
+
99
+ .vgui-scroll-region--drawn.vgui-scroll-region--vertical {
100
+ flex-direction: row;
101
+ }
102
+
103
+ .vgui-scroll-region--drawn.vgui-scroll-region--horizontal {
104
+ flex-direction: column;
105
+ }
106
+
107
+ /*
108
+ * The drawn tree duplicates a native affordance, which is the only reason
109
+ * `aria-hidden="true"` is honest on it; that in turn means the native bar it
110
+ * duplicates must go, and the region must stay reachable by keyboard. The outer
111
+ * region keeps a tabindex and the browser scrolls the focused box on arrow keys,
112
+ * PageUp/PageDown, Home/End and Space, which is what docs/components/Scrollbar.md
113
+ * requires of the drawn path.
114
+ */
115
+ .vgui-scroll-region--drawn .vgui-scroll-region__content {
116
+ flex: 1 1 auto;
117
+ min-width: 0;
118
+ min-height: 0;
119
+ overflow: auto;
120
+ overscroll-behavior: contain;
121
+ scrollbar-width: none;
122
+ }
123
+
124
+ .vgui-scroll-region--drawn .vgui-scroll-region__content::-webkit-scrollbar {
125
+ width: 0;
126
+ height: 0;
127
+ }
128
+
129
+ /* scrollbar-color = none, inset = "0 0 3 1" (steam.styles:1999-2003). */
130
+ .vgui-scrollbar {
131
+ box-sizing: content-box;
132
+ flex: 0 0 auto;
133
+ display: flex;
134
+ flex-direction: column;
135
+ inline-size: var(--vgui-scrollbar-size, 18px);
136
+ padding: 0 3px 1px 0;
137
+ cursor: default;
138
+ }
139
+
140
+ /* Scrollbar.Horizontal, inset = "0 1 1 3" (steam.styles:2005-2009). */
141
+ .vgui-scrollbar[data-orientation='horizontal'] {
142
+ flex-direction: row;
143
+ inline-size: auto;
144
+ block-size: var(--vgui-scrollbar-size, 18px);
145
+ padding: 1px 1px 3px 0;
146
+ }
147
+
148
+ .vgui-scrollbar__button {
149
+ position: relative;
150
+ flex: 0 0 auto;
151
+ inline-size: 100%;
152
+ block-size: var(--vgui-scrollbar-button-size, 18px);
153
+ padding: 0;
154
+ background-color: var(--vgui-surface);
155
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
156
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
157
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
158
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
159
+ cursor: pointer;
160
+ }
161
+
162
+ .vgui-scrollbar[data-orientation='horizontal'] .vgui-scrollbar__button {
163
+ inline-size: var(--vgui-scrollbar-button-size, 18px);
164
+ block-size: 100%;
165
+ }
166
+
167
+ /* 18px is below the 24px minimum target, so the arrows grow their hit area
168
+ * without changing their painted size (WCAG 2.5.8). */
169
+ .vgui-scrollbar__button::after {
170
+ content: '';
171
+ position: absolute;
172
+ inset: calc((var(--vgui-scrollbar-button-size, 18px) - var(--vgui-min-target-size)) / 2) 0;
173
+ }
174
+
175
+ .vgui-crisp .vgui-scrollbar__button:focus-visible {
176
+ outline: var(--vgui-focus-ring-valve);
177
+ outline-offset: var(--vgui-focus-ring-valve-offset);
178
+ }
179
+
180
+ /* Hover recolours the glyph only (steam.styles:2042-2046). */
181
+ .vgui-scrollbar__button:hover .vgui-scrollbar__glyph {
182
+ background-color: var(--vgui-text-strong);
183
+ }
184
+
185
+ /* Press inverts the box (steam.styles:2056-2059) and drops the glyph by 1px —
186
+ * the only perceivable difference available, since the bevel is below 3:1. */
187
+ .vgui-scrollbar__button:active {
188
+ border-top-color: var(--vgui-bevel-dark);
189
+ border-left-color: var(--vgui-bevel-dark);
190
+ border-bottom-color: var(--vgui-bevel-light);
191
+ border-right-color: var(--vgui-bevel-light);
192
+ }
193
+
194
+ .vgui-scrollbar__button:active .vgui-scrollbar__glyph {
195
+ translate: 0 1px;
196
+ }
197
+
198
+ .vgui-scrollbar[data-orientation='horizontal'] .vgui-scrollbar__button:active .vgui-scrollbar__glyph {
199
+ translate: 1px 0;
200
+ }
201
+
202
+ /* The glyph takes no clicks: they belong to the button underneath it. */
203
+ .vgui-scrollbar__glyph {
204
+ display: block;
205
+ pointer-events: none;
206
+ inline-size: var(--vgui-scrollbar-glyph-width, 7px);
207
+ block-size: var(--vgui-scrollbar-glyph-height, 4px);
208
+ margin-inline: auto;
209
+ background-color: var(--vgui-text-muted);
210
+ /* The corpus draws four stacked rectangles, which is what this staircase
211
+ * clips a triangle down to — Valve's glyph is not an isoceles triangle. */
212
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
213
+ }
214
+
215
+ .vgui-scrollbar__glyph--down {
216
+ rotate: 180deg;
217
+ }
218
+
219
+ .vgui-scrollbar__glyph--left {
220
+ rotate: -90deg;
221
+ }
222
+
223
+ .vgui-scrollbar__glyph--right {
224
+ rotate: 90deg;
225
+ }
226
+
227
+ .vgui-scrollbar__gutter {
228
+ flex: 1 1 auto;
229
+ min-block-size: 0;
230
+ min-inline-size: 0;
231
+ background-color: var(--vgui-surface-light);
232
+ }
233
+
234
+ /* The vertical thumb has no hover or drag style anywhere in the corpus, and the
235
+ * horizontal thumb's are a no-op (steam.styles:2263-2286), so only the cursor
236
+ * says "draggable" — reproduced here rather than invented. */
237
+ .vgui-scrollbar__thumb {
238
+ box-sizing: border-box;
239
+ block-size: var(--vgui-scrollbar-thumb-length, 100%);
240
+ margin-block-start: calc((100% - var(--vgui-scrollbar-thumb-length, 100%)) * var(--vgui-scrollbar-thumb-offset, 0));
241
+ background-color: var(--vgui-surface);
242
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
243
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
244
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
245
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
246
+ cursor: pointer;
247
+ }
248
+
249
+ .vgui-scrollbar[data-orientation='horizontal'] .vgui-scrollbar__thumb {
250
+ block-size: 100%;
251
+ margin-block-start: 0;
252
+ inline-size: var(--vgui-scrollbar-thumb-length, 100%);
253
+ margin-inline-start: calc((100% - var(--vgui-scrollbar-thumb-length, 100%)) * var(--vgui-scrollbar-thumb-offset, 0));
254
+ }
255
+
256
+ /* A disabled region loses the gutter fill and nothing replaces it
257
+ * (steam.styles:2315-2319). The content stays scrollable. */
258
+ .vgui-scroll-region[data-disabled] .vgui-scrollbar__gutter {
259
+ background-color: transparent;
260
+ }
@@ -0,0 +1 @@
1
+ export {}