@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,152 @@
1
+ /*
2
+ * Green Steam spin box — a composition, not a corpus control
3
+ * (docs/components/SpinBox.md).
4
+ *
5
+ * The field is a `TextEntry` and must match TextInput's recipe exactly, or the
6
+ * two will not sit together in a form; the stepper column is the `ComboBox`
7
+ * arrow-button grammar stacked twice. The glyphs are drawn procedurally from
8
+ * the 7x4 staircase of Scrollbar.md, because `icon_up_default` does not exist
9
+ * in the corpus at all.
10
+ *
11
+ * The metric tokens this component needs are not in tokens.css yet, so each
12
+ * keeps its `var()` fallback — a theme that adds them can still override.
13
+ */
14
+
15
+ .vgui-spin-box {
16
+ display: inline-flex;
17
+ align-items: stretch;
18
+ min-block-size: var(--vgui-spin-box-height, 25px);
19
+ min-inline-size: 0;
20
+ font: inherit;
21
+ }
22
+
23
+ /* The field: TextEntry, steam.styles:2395-2414. Recessed, DarkGreenBG. */
24
+ .vgui-spin-box__input {
25
+ box-sizing: border-box;
26
+ inline-size: 100%;
27
+ min-inline-size: 0;
28
+ padding: 0 var(--vgui-spin-box-inset, 4px);
29
+ font: inherit;
30
+ font-size: var(--vgui-font-size);
31
+ line-height: 1;
32
+ color: var(--vgui-text-strong);
33
+ background-color: var(--vgui-surface-dark);
34
+ appearance: none;
35
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
36
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
37
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
38
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
39
+ border-radius: 0;
40
+ /* A spin box is left-aligned numeric; right-align only for money. */
41
+ text-align: left;
42
+ }
43
+
44
+ /*
45
+ * `TextEntry:focus` restates the same colours — only the border treatment
46
+ * changes. The ring is the accessible default; `.vgui-crisp` gets Valve's.
47
+ */
48
+ .vgui-spin-box__input:focus {
49
+ outline: none;
50
+ }
51
+
52
+ .vgui-spin-box__input:focus-visible {
53
+ outline: var(--vgui-focus-ring);
54
+ outline-offset: var(--vgui-focus-ring-offset);
55
+ }
56
+
57
+ .vgui-crisp .vgui-spin-box__input:focus-visible {
58
+ outline: var(--vgui-focus-ring-valve);
59
+ outline-offset: var(--vgui-focus-ring-valve-offset);
60
+ }
61
+
62
+ /* `#232421` on the selection accent reaches 4.22:1; the body colour does not. */
63
+ .vgui-spin-box__input::selection {
64
+ background-color: var(--vgui-selection-bg);
65
+ color: var(--vgui-selection-text);
66
+ }
67
+
68
+ .vgui-spin-box__input[aria-invalid='true'] {
69
+ border-top-color: var(--vgui-danger);
70
+ border-left-color: var(--vgui-danger);
71
+ }
72
+
73
+ .vgui-spin-box__input:disabled {
74
+ color: var(--vgui-text-disabled);
75
+ text-shadow: 1px 1px 0 var(--vgui-text-disabled-shadow);
76
+ cursor: not-allowed;
77
+ }
78
+
79
+ /* The stepper plate: one beveled column, ComboBox grammar. */
80
+ .vgui-spin-box__steppers {
81
+ display: grid;
82
+ grid-template-rows: 1fr 1fr;
83
+ flex: none;
84
+ inline-size: var(--vgui-spin-box-step-width, 17px);
85
+ background-color: var(--vgui-surface);
86
+ border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
87
+ border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
88
+ border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
89
+ border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
90
+ }
91
+
92
+ .vgui-spin-box__step {
93
+ display: grid;
94
+ place-items: center;
95
+ padding: 0;
96
+ border: 0;
97
+ background: transparent;
98
+ color: var(--vgui-text-muted);
99
+ cursor: pointer;
100
+ }
101
+
102
+ .vgui-spin-box__step:hover:not(:disabled) {
103
+ background-color: var(--vgui-surface-light);
104
+ }
105
+
106
+ /* `Button:active` inverts the bevel — reuse that, not a translate. */
107
+ .vgui-spin-box__step:active:not(:disabled) {
108
+ box-shadow:
109
+ inset var(--vgui-bevel-width) var(--vgui-bevel-width) 0 var(--vgui-bevel-dark),
110
+ inset calc(-1 * var(--vgui-bevel-width)) calc(-1 * var(--vgui-bevel-width)) 0 var(--vgui-bevel-light);
111
+ }
112
+
113
+ .vgui-spin-box__step:disabled {
114
+ color: var(--vgui-text-dim);
115
+ cursor: default;
116
+ }
117
+
118
+ .vgui-spin-box__step:focus-visible {
119
+ outline: var(--vgui-focus-ring);
120
+ outline-offset: -2px;
121
+ }
122
+
123
+ .vgui-crisp .vgui-spin-box__step:focus-visible {
124
+ outline: var(--vgui-focus-ring-valve);
125
+ outline-offset: var(--vgui-focus-ring-valve-offset);
126
+ }
127
+
128
+ /* The glyph: the 7x4 staircase from Scrollbar.md, mirrored for "up". */
129
+ .vgui-spin-box__glyph {
130
+ inline-size: 7px;
131
+ block-size: 4px;
132
+ background-color: currentColor;
133
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
134
+ }
135
+
136
+ .vgui-spin-box__step--up .vgui-spin-box__glyph {
137
+ clip-path: polygon(50% 100%, 100% 0, 0 0);
138
+ }
139
+
140
+ .vgui-spin-box--small {
141
+ min-block-size: 18px;
142
+ }
143
+
144
+ .vgui-spin-box--small .vgui-spin-box__input {
145
+ font-size: var(--vgui-font-size-small);
146
+ }
147
+
148
+ .vgui-spin-box--horizontal .vgui-spin-box__steppers {
149
+ grid-template-rows: none;
150
+ grid-template-columns: 1fr 1fr;
151
+ inline-size: calc(2 * var(--vgui-spin-box-step-width, 17px));
152
+ }
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,28 @@
1
+ import type { InputHTMLAttributes } from 'react';
2
+ import './SpinBox.css';
3
+ export interface SpinBoxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {
4
+ /** Current value. `undefined` renders the input empty. */
5
+ value?: number;
6
+ /** Called with the new value on every accepted change. */
7
+ onValueChange?: (value: number) => void;
8
+ /** Lower bound, inclusive. */
9
+ min?: number;
10
+ /** Upper bound, inclusive. */
11
+ max?: number;
12
+ /** Increment applied by the steppers and by ArrowUp/ArrowDown. */
13
+ step?: number;
14
+ /** Allow fractional values. Switches keyboard input to a decimal keyboard. */
15
+ decimal?: boolean;
16
+ /** Wrap past the bounds instead of disabling the stepper. Off by default. */
17
+ wrap?: boolean;
18
+ /** Hide the stepper column. Arrow keys still work. */
19
+ noSteppers?: boolean;
20
+ /** Lay the steppers out side by side. */
21
+ horizontal?: boolean;
22
+ /** Compact 18px variant, for dense rows. */
23
+ small?: boolean;
24
+ /** Text announced in place of the raw number, e.g. "16 players". */
25
+ valueText?: string;
26
+ }
27
+ export declare const SpinBox: import("react").ForwardRefExoticComponent<SpinBoxProps & import("react").RefAttributes<HTMLInputElement>>;
28
+ //# sourceMappingURL=SpinBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpinBox.d.ts","sourceRoot":"","sources":["../../../src/components/SpinBox/SpinBox.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,mBAAmB,EAGpB,MAAM,OAAO,CAAA;AAEd,OAAO,eAAe,CAAA;AAgBtB,MAAM,WAAW,YACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAClF,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,OAAO,2GAgQlB,CAAA"}
@@ -0,0 +1,207 @@
1
+ import { forwardRef, useEffect, useRef, useState } from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import "./SpinBox.css";
4
+ //#region src/components/SpinBox/SpinBox.tsx
5
+ /** Hold-to-repeat: the conventional wait before the first repeat, then the rate. */
6
+ var REPEAT_DELAY = 500;
7
+ var REPEAT_INTERVAL = 50;
8
+ var decimalsOf = (n) => {
9
+ const text = String(n);
10
+ const dot = text.indexOf(".");
11
+ return dot === -1 ? 0 : text.length - dot - 1;
12
+ };
13
+ var round = (n, decimals) => Number(n.toFixed(decimals));
14
+ var toDisplay = (n) => n === void 0 || !Number.isFinite(n) ? "" : String(n);
15
+ var SpinBox = forwardRef(function SpinBox({ className, value, onValueChange, min, max, step = 1, decimal = false, wrap = false, noSteppers = false, horizontal = false, small = false, valueText, defaultValue, disabled = false, inputMode, onBlur, onFocus, onKeyDown, ...rest }, ref) {
16
+ const seed = value !== void 0 ? value : defaultValue !== void 0 ? Number(defaultValue) : void 0;
17
+ const [internalValue, setInternalValue] = useState(seed);
18
+ const current = value !== void 0 ? value : internalValue;
19
+ const stepDecimals = decimalsOf(step);
20
+ const shapeTyped = (n) => decimal ? round(n, Math.max(stepDecimals, decimalsOf(n))) : Math.round(n);
21
+ const [draft, setDraft] = useState(() => toDisplay(seed));
22
+ const [seen, setSeen] = useState(current);
23
+ const focusValue = useRef(current);
24
+ if (seen !== current) {
25
+ setSeen(current);
26
+ setDraft(toDisplay(current));
27
+ }
28
+ const bound = (n) => {
29
+ let next = n;
30
+ if (min !== void 0 && next < min) next = min;
31
+ if (max !== void 0 && next > max) next = max;
32
+ return next;
33
+ };
34
+ const commit = (next) => {
35
+ const bounded = bound(next);
36
+ setDraft(toDisplay(value !== void 0 && bounded !== current ? current : bounded));
37
+ if (bounded === current) return;
38
+ if (value === void 0) setInternalValue(bounded);
39
+ onValueChange?.(bounded);
40
+ };
41
+ /** Typed input is clamped and loses any trailing noise. */
42
+ const commitDraft = () => {
43
+ const trimmed = draft.trim();
44
+ if (trimmed === "") {
45
+ setDraft(toDisplay(current));
46
+ return;
47
+ }
48
+ const parsed = Number(decimal ? trimmed.replace(",", ".") : trimmed);
49
+ if (!Number.isFinite(parsed)) {
50
+ setDraft(toDisplay(current));
51
+ return;
52
+ }
53
+ commit(shapeTyped(parsed));
54
+ };
55
+ const stepTo = (delta) => {
56
+ const base = current ?? (delta > 0 ? min ?? 0 : max ?? 0);
57
+ let next = round(base + delta, Math.max(stepDecimals, decimalsOf(base)));
58
+ if (wrap) {
59
+ if (max !== void 0 && next > max) next = min ?? next;
60
+ else if (min !== void 0 && next < min) next = max ?? next;
61
+ }
62
+ return bound(next);
63
+ };
64
+ /** Returns whether anything moved, so hold-to-repeat can stop at a bound. */
65
+ const stepBy = (delta) => {
66
+ const next = stepTo(delta);
67
+ if (next === current) return false;
68
+ commit(next);
69
+ return true;
70
+ };
71
+ const stepRef = useRef(stepBy);
72
+ useEffect(() => {
73
+ stepRef.current = stepBy;
74
+ });
75
+ const timer = useRef(void 0);
76
+ const repeated = useRef(false);
77
+ const pointerHandled = useRef(false);
78
+ const stopRepeat = () => {
79
+ if (timer.current !== void 0) {
80
+ window.clearTimeout(timer.current);
81
+ timer.current = void 0;
82
+ }
83
+ };
84
+ useEffect(() => stopRepeat, []);
85
+ const startRepeat = (delta) => {
86
+ stopRepeat();
87
+ repeated.current = false;
88
+ const tick = () => {
89
+ if (!stepRef.current(delta)) {
90
+ stopRepeat();
91
+ return;
92
+ }
93
+ repeated.current = true;
94
+ timer.current = window.setTimeout(tick, REPEAT_INTERVAL);
95
+ };
96
+ timer.current = window.setTimeout(tick, REPEAT_DELAY);
97
+ };
98
+ const handleStepPointerDown = (delta) => (event) => {
99
+ if (event.button !== 0) return;
100
+ pointerHandled.current = true;
101
+ if (!stepRef.current(delta)) return;
102
+ startRepeat(delta);
103
+ };
104
+ const handleStepClick = (delta) => () => {
105
+ if (pointerHandled.current) {
106
+ pointerHandled.current = false;
107
+ return;
108
+ }
109
+ stepRef.current(delta);
110
+ };
111
+ const handleKeyDown = (event) => {
112
+ onKeyDown?.(event);
113
+ if (event.defaultPrevented) return;
114
+ switch (event.key) {
115
+ case "ArrowUp":
116
+ case "ArrowDown":
117
+ event.preventDefault();
118
+ stepBy(event.key === "ArrowUp" ? step : -step);
119
+ break;
120
+ case "PageUp":
121
+ case "PageDown":
122
+ event.preventDefault();
123
+ stepBy(event.key === "PageUp" ? step * 10 : step * -10);
124
+ break;
125
+ case "Home":
126
+ if (min === void 0) break;
127
+ event.preventDefault();
128
+ commit(min);
129
+ break;
130
+ case "End":
131
+ if (max === void 0) break;
132
+ event.preventDefault();
133
+ commit(max);
134
+ break;
135
+ case "Escape":
136
+ if (focusValue.current !== void 0) commit(focusValue.current);
137
+ else setDraft(toDisplay(current));
138
+ break;
139
+ case "Enter": commitDraft();
140
+ }
141
+ };
142
+ const handleChange = (event) => {
143
+ setDraft(event.currentTarget.value);
144
+ };
145
+ const handleFocus = (event) => {
146
+ focusValue.current = current;
147
+ onFocus?.(event);
148
+ };
149
+ const handleBlur = (event) => {
150
+ onBlur?.(event);
151
+ commitDraft();
152
+ };
153
+ const atMin = min !== void 0 && current !== void 0 && current <= min;
154
+ const atMax = max !== void 0 && current !== void 0 && current >= max;
155
+ const classes = ["vgui-spin-box"];
156
+ if (horizontal) classes.push("vgui-spin-box--horizontal");
157
+ if (small) classes.push("vgui-spin-box--small");
158
+ if (noSteppers) classes.push("vgui-spin-box--no-steppers");
159
+ if (className) classes.push(className);
160
+ const steppers = (delta, label, blocked) => /* @__PURE__ */ jsx("button", {
161
+ type: "button",
162
+ className: `vgui-spin-box__step vgui-spin-box__step--${delta === 1 ? "up" : "down"}`,
163
+ "aria-label": label,
164
+ tabIndex: -1,
165
+ disabled: disabled || !wrap && blocked,
166
+ onPointerDown: handleStepPointerDown(delta * step),
167
+ onPointerUp: stopRepeat,
168
+ onPointerLeave: stopRepeat,
169
+ onPointerCancel: stopRepeat,
170
+ onClick: handleStepClick(delta * step),
171
+ children: /* @__PURE__ */ jsx("span", {
172
+ className: "vgui-spin-box__glyph",
173
+ "aria-hidden": "true"
174
+ })
175
+ });
176
+ return /* @__PURE__ */ jsxs("div", {
177
+ className: classes.join(" "),
178
+ role: "group",
179
+ "aria-disabled": disabled || void 0,
180
+ children: [/* @__PURE__ */ jsx("input", {
181
+ ref,
182
+ className: "vgui-spin-box__input",
183
+ type: "text",
184
+ role: "spinbutton",
185
+ "aria-valuenow": current,
186
+ "aria-valuemin": min,
187
+ "aria-valuemax": max,
188
+ "aria-valuetext": valueText,
189
+ inputMode: inputMode ?? (decimal ? "decimal" : "numeric"),
190
+ disabled,
191
+ value: draft,
192
+ onFocus: handleFocus,
193
+ onBlur: handleBlur,
194
+ onChange: handleChange,
195
+ onKeyDown: handleKeyDown,
196
+ ...rest
197
+ }), noSteppers ? null : /* @__PURE__ */ jsxs("div", {
198
+ className: "vgui-spin-box__steppers",
199
+ children: [steppers(1, "Increase", atMax), steppers(-1, "Decrease", atMin)]
200
+ })]
201
+ });
202
+ });
203
+ SpinBox.displayName = "SpinBox";
204
+ //#endregion
205
+ export { SpinBox };
206
+
207
+ //# sourceMappingURL=SpinBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpinBox.js","names":[],"sources":["../../../src/components/SpinBox/SpinBox.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState } from 'react'\nimport type {\n ChangeEvent as ReactChangeEvent,\n FocusEvent as ReactFocusEvent,\n InputHTMLAttributes,\n KeyboardEvent as ReactKeyboardEvent,\n PointerEvent as ReactPointerEvent,\n} from 'react'\n\nimport './SpinBox.css'\n\n/** Hold-to-repeat: the conventional wait before the first repeat, then the rate. */\nconst REPEAT_DELAY = 500\nconst REPEAT_INTERVAL = 50\n\nconst decimalsOf = (n: number) => {\n const text = String(n)\n const dot = text.indexOf('.')\n return dot === -1 ? 0 : text.length - dot - 1\n}\n\nconst round = (n: number, decimals: number) => Number(n.toFixed(decimals))\n\nconst toDisplay = (n: number | undefined) => (n === undefined || !Number.isFinite(n) ? '' : String(n))\n\nexport interface SpinBoxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {\n /** Current value. `undefined` renders the input empty. */\n value?: number\n /** Called with the new value on every accepted change. */\n onValueChange?: (value: number) => void\n /** Lower bound, inclusive. */\n min?: number\n /** Upper bound, inclusive. */\n max?: number\n /** Increment applied by the steppers and by ArrowUp/ArrowDown. */\n step?: number\n /** Allow fractional values. Switches keyboard input to a decimal keyboard. */\n decimal?: boolean\n /** Wrap past the bounds instead of disabling the stepper. Off by default. */\n wrap?: boolean\n /** Hide the stepper column. Arrow keys still work. */\n noSteppers?: boolean\n /** Lay the steppers out side by side. */\n horizontal?: boolean\n /** Compact 18px variant, for dense rows. */\n small?: boolean\n /** Text announced in place of the raw number, e.g. \"16 players\". */\n valueText?: string\n}\n\nexport const SpinBox = forwardRef<HTMLInputElement, SpinBoxProps>(function SpinBox(\n {\n className,\n value,\n onValueChange,\n min,\n max,\n step = 1,\n decimal = false,\n wrap = false,\n noSteppers = false,\n horizontal = false,\n small = false,\n valueText,\n defaultValue,\n disabled = false,\n inputMode,\n onBlur,\n onFocus,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const seed = value !== undefined ? value : defaultValue !== undefined ? Number(defaultValue) : undefined\n const [internalValue, setInternalValue] = useState<number | undefined>(seed)\n const current = value !== undefined ? value : internalValue\n\n const stepDecimals = decimalsOf(step)\n /* `--decimal` keeps whatever precision the user typed, never less than the step's. */\n const shapeTyped = (n: number) => (decimal ? round(n, Math.max(stepDecimals, decimalsOf(n))) : Math.round(n))\n\n const [draft, setDraft] = useState(() => toDisplay(seed))\n const [seen, setSeen] = useState<number | undefined>(current)\n const focusValue = useRef<number | undefined>(current)\n\n /*\n * Keep the draft in step with the value when it is changed from the outside.\n * Committing sets the draft directly, so this only fires for prop changes.\n */\n if (seen !== current) {\n setSeen(current)\n setDraft(toDisplay(current))\n }\n\n const bound = (n: number) => {\n let next = n\n if (min !== undefined && next < min) next = min\n if (max !== undefined && next > max) next = max\n return next\n }\n\n const commit = (next: number) => {\n const bounded = bound(next)\n /* A controlled box shows the prop, not the draft, unless the value was accepted. */\n setDraft(toDisplay(value !== undefined && bounded !== current ? current : bounded))\n if (bounded === current) return\n if (value === undefined) setInternalValue(bounded)\n onValueChange?.(bounded)\n }\n\n /** Typed input is clamped and loses any trailing noise. */\n const commitDraft = () => {\n const trimmed = draft.trim()\n if (trimmed === '') {\n setDraft(toDisplay(current))\n return\n }\n const parsed = Number(decimal ? trimmed.replace(',', '.') : trimmed)\n if (!Number.isFinite(parsed)) {\n setDraft(toDisplay(current))\n return\n }\n commit(shapeTyped(parsed))\n }\n\n const stepTo = (delta: number) => {\n const base = current ?? (delta > 0 ? (min ?? 0) : (max ?? 0))\n let next = round(base + delta, Math.max(stepDecimals, decimalsOf(base)))\n if (wrap) {\n if (max !== undefined && next > max) next = min ?? next\n else if (min !== undefined && next < min) next = max ?? next\n }\n return bound(next)\n }\n\n /** Returns whether anything moved, so hold-to-repeat can stop at a bound. */\n const stepBy = (delta: number) => {\n const next = stepTo(delta)\n if (next === current) return false\n commit(next)\n return true\n }\n\n const stepRef = useRef(stepBy)\n useEffect(() => {\n stepRef.current = stepBy\n })\n\n const timer = useRef<number | undefined>(undefined)\n const repeated = useRef(false)\n const pointerHandled = useRef(false)\n\n const stopRepeat = () => {\n if (timer.current !== undefined) {\n window.clearTimeout(timer.current)\n timer.current = undefined\n }\n }\n\n useEffect(() => stopRepeat, [])\n\n const startRepeat = (delta: number) => {\n stopRepeat()\n repeated.current = false\n const tick = () => {\n if (!stepRef.current(delta)) {\n stopRepeat()\n return\n }\n repeated.current = true\n timer.current = window.setTimeout(tick, REPEAT_INTERVAL)\n }\n timer.current = window.setTimeout(tick, REPEAT_DELAY)\n }\n\n const handleStepPointerDown = (delta: number) => (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (event.button !== 0) return\n pointerHandled.current = true\n if (!stepRef.current(delta)) return\n startRepeat(delta)\n }\n\n /* A synthetic activation (a screen reader, say) never sends a pointer event. */\n const handleStepClick = (delta: number) => () => {\n if (pointerHandled.current) {\n pointerHandled.current = false\n return\n }\n stepRef.current(delta)\n }\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented) return\n\n switch (event.key) {\n case 'ArrowUp':\n case 'ArrowDown': {\n event.preventDefault()\n stepBy(event.key === 'ArrowUp' ? step : -step)\n break\n }\n case 'PageUp':\n case 'PageDown': {\n event.preventDefault()\n stepBy(event.key === 'PageUp' ? step * 10 : step * -10)\n break\n }\n case 'Home': {\n if (min === undefined) break\n event.preventDefault()\n commit(min)\n break\n }\n case 'End': {\n if (max === undefined) break\n event.preventDefault()\n commit(max)\n break\n }\n case 'Escape': {\n /* Back to whatever the control held when it was focused. */\n if (focusValue.current !== undefined) commit(focusValue.current)\n else setDraft(toDisplay(current))\n break\n }\n case 'Enter': {\n commitDraft()\n break\n }\n default:\n break\n }\n }\n\n /* The field is controlled by its own draft; nothing is emitted until commit. */\n const handleChange = (event: ReactChangeEvent<HTMLInputElement>) => {\n setDraft(event.currentTarget.value)\n }\n\n const handleFocus = (event: ReactFocusEvent<HTMLInputElement>) => {\n focusValue.current = current\n onFocus?.(event)\n }\n\n const handleBlur = (event: ReactFocusEvent<HTMLInputElement>) => {\n onBlur?.(event)\n commitDraft()\n }\n\n const atMin = min !== undefined && current !== undefined && current <= min\n const atMax = max !== undefined && current !== undefined && current >= max\n\n const classes = ['vgui-spin-box']\n if (horizontal) classes.push('vgui-spin-box--horizontal')\n if (small) classes.push('vgui-spin-box--small')\n if (noSteppers) classes.push('vgui-spin-box--no-steppers')\n if (className) classes.push(className)\n\n const steppers = (delta: 1 | -1, label: string, blocked: boolean) => (\n <button\n type=\"button\"\n className={`vgui-spin-box__step vgui-spin-box__step--${delta === 1 ? 'up' : 'down'}`}\n aria-label={label}\n /* Deliberately out of the tab order: the arrow keys replace them. */\n tabIndex={-1}\n disabled={disabled || (!wrap && blocked)}\n onPointerDown={handleStepPointerDown(delta * step)}\n onPointerUp={stopRepeat}\n onPointerLeave={stopRepeat}\n onPointerCancel={stopRepeat}\n onClick={handleStepClick(delta * step)}\n >\n <span className=\"vgui-spin-box__glyph\" aria-hidden=\"true\" />\n </button>\n )\n\n return (\n <div className={classes.join(' ')} role=\"group\" aria-disabled={disabled || undefined}>\n <input\n ref={ref}\n className=\"vgui-spin-box__input\"\n type=\"text\"\n role=\"spinbutton\"\n aria-valuenow={current}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={valueText}\n inputMode={inputMode ?? (decimal ? 'decimal' : 'numeric')}\n disabled={disabled}\n value={draft}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n {...rest}\n />\n {noSteppers ? null : (\n <div className=\"vgui-spin-box__steppers\">\n {steppers(1, 'Increase', atMax)}\n {steppers(-1, 'Decrease', atMin)}\n </div>\n )}\n </div>\n )\n})\n\nSpinBox.displayName = 'SpinBox'\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { SpinBox } from './SpinBox';
2
+ export type { SpinBoxProps } from './SpinBox';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SpinBox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,137 @@
1
+ /*
2
+ * Green Steam throbber (`minithrobber01..12`).
3
+ *
4
+ * Valve's twelve 20×20 `.tga` frames are copyrighted artwork and this package is
5
+ * redistributable, so the default is a procedural stand-in that reproduces the
6
+ * two things that make the original read as a turn-of-the-millennium throbber:
7
+ * twelve HARD steps (`steps(12, end)`), and a flat trailing fade rather than a
8
+ * gradient (docs/components/Spinner.md). A consumer who owns the artwork can
9
+ * point at their own sheet with the `frames` prop.
10
+ *
11
+ * The animation is CSS-only — no `requestAnimationFrame`, no `setInterval` — so
12
+ * it cannot leak a timer, and it is switched off wholesale under
13
+ * `prefers-reduced-motion`.
14
+ *
15
+ * `--vgui-spinner-size`, `--vgui-spinner-duration` and `--vgui-spinner-easing`
16
+ * are component-local and declared here, per foundations.md §4.
17
+ */
18
+
19
+ .vgui-spinner {
20
+ --vgui-spinner-size: 20px;
21
+ --vgui-spinner-duration: 1.2s;
22
+ --vgui-spinner-easing: steps(12, end);
23
+
24
+ display: inline-grid;
25
+ place-items: center;
26
+ inline-size: var(--vgui-spinner-size);
27
+ block-size: var(--vgui-spinner-size);
28
+ color: var(--vgui-text-strong);
29
+ }
30
+
31
+ /* Twelve bars, each rotated 30° further than the last. */
32
+ .vgui-spinner__frame {
33
+ position: relative;
34
+ inline-size: 100%;
35
+ block-size: 100%;
36
+ animation: vgui-spinner-step var(--vgui-spinner-duration) var(--vgui-spinner-easing)
37
+ infinite;
38
+ }
39
+
40
+ .vgui-spinner__frame::before {
41
+ content: '';
42
+ position: absolute;
43
+ inset: 0;
44
+ border-radius: 50%;
45
+ /* Twelve hard steps of a fading wedge: two discrete opacity plateaus, no ramp. */
46
+ background: conic-gradient(
47
+ from 0deg,
48
+ currentColor 0deg 30deg,
49
+ color-mix(in srgb, currentColor 55%, transparent) 30deg 60deg,
50
+ transparent 60deg 360deg
51
+ );
52
+ /* Only the annulus is painted, so the sweep reads as a ring of bars.
53
+ * `currentColor` is opaque, which is all a mask's alpha channel needs, so the
54
+ * mask needs no colour literal. */
55
+ mask: radial-gradient(circle, transparent 0 30%, currentColor 30% 45%, transparent 45%);
56
+ }
57
+
58
+ @keyframes vgui-spinner-step {
59
+ to {
60
+ transform: rotate(360deg);
61
+ }
62
+ }
63
+
64
+ /* The at-rest frame (`minithrobberinactive.tga`): a still ring. */
65
+ .vgui-spinner--paused .vgui-spinner__frame {
66
+ animation: none;
67
+ }
68
+
69
+ .vgui-spinner--paused .vgui-spinner__frame::before {
70
+ background: currentColor;
71
+ }
72
+
73
+ /* A 12-bar sweep is illegible below 16px, so the plate is generous instead. */
74
+ .vgui-spinner--block {
75
+ --vgui-spinner-size: 32px;
76
+
77
+ inline-size: 100%;
78
+ block-size: 100%;
79
+ min-inline-size: 100px;
80
+ min-block-size: 75px;
81
+ background-color: var(--vgui-surface-dark);
82
+ }
83
+
84
+ /* `--inline-label`: the 20×20 throbber with its label beside it. */
85
+ .vgui-spinner--inline-label {
86
+ display: inline-flex;
87
+ align-items: center;
88
+ gap: 6px;
89
+ inline-size: auto;
90
+ block-size: auto;
91
+ }
92
+
93
+ .vgui-spinner--inline-label .vgui-spinner__frame {
94
+ flex: none;
95
+ inline-size: var(--vgui-spinner-size);
96
+ block-size: var(--vgui-spinner-size);
97
+ }
98
+
99
+ .vgui-spinner__label {
100
+ color: var(--vgui-text-muted);
101
+ font-size: var(--vgui-font-size-small);
102
+ white-space: nowrap;
103
+ }
104
+
105
+ /* A consumer's own frame set, stepped the same way. */
106
+ .vgui-spinner--sprite .vgui-spinner__frame {
107
+ background-image: var(--vgui-spinner-sheet);
108
+ background-repeat: no-repeat;
109
+ background-size: calc(12 * var(--vgui-spinner-size)) 100%;
110
+ animation-name: vgui-spinner-sheet;
111
+ }
112
+
113
+ .vgui-spinner--sprite .vgui-spinner__frame::before {
114
+ background: none;
115
+ mask: none;
116
+ }
117
+
118
+ @keyframes vgui-spinner-sheet {
119
+ to {
120
+ background-position-x: calc(-12 * var(--vgui-spinner-size));
121
+ }
122
+ }
123
+
124
+ /*
125
+ * Reduced motion is mandatory, not a nicety (WCAG 2.3.3 / 2.2.2). The spinner
126
+ * becomes a static ring; because a still spinner is ambiguous, a consumer must
127
+ * pair it with a text label — `showLabel` is how.
128
+ */
129
+ @media (prefers-reduced-motion: reduce) {
130
+ .vgui-spinner__frame {
131
+ animation: none;
132
+ }
133
+
134
+ .vgui-spinner__frame::before {
135
+ background: currentColor;
136
+ }
137
+ }
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,20 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ import './Spinner.css';
3
+ export interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {
4
+ /** Native size in pixels. 20 is the corpus value. */
5
+ size?: number;
6
+ /** Fill the container and paint a black plate. The screenshot-loading case. */
7
+ block?: boolean;
8
+ /** Draw the at-rest frame instead of animating. */
9
+ paused?: boolean;
10
+ /** Accessible name announced to assistive tech. Defaults to "Loading". */
11
+ label?: string;
12
+ /** Repeat the label as visible text beside the spinner. */
13
+ showLabel?: boolean;
14
+ /** Sprite-sheet URL. When omitted the spinner is drawn procedurally. */
15
+ frames?: string;
16
+ /** Rotation duration in milliseconds. Defaults to 1200. */
17
+ durationMs?: number;
18
+ }
19
+ export declare const Spinner: import("react").ForwardRefExoticComponent<SpinnerProps & import("react").RefAttributes<HTMLSpanElement>>;
20
+ //# sourceMappingURL=Spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../src/components/Spinner/Spinner.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,OAAO,CAAA;AAE1D,OAAO,eAAe,CAAA;AAEtB,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,eAAe,CAAC;IACnE,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,eAAO,MAAM,OAAO,0GA8ClB,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { forwardRef } from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import "./Spinner.css";
4
+ //#region src/components/Spinner/Spinner.tsx
5
+ var Spinner = forwardRef(function Spinner({ className, size, block = false, paused = false, label = "Loading", showLabel = false, frames, durationMs, style, children, ...rest }, ref) {
6
+ const classes = ["vgui-spinner"];
7
+ if (block) classes.push("vgui-spinner--block");
8
+ if (paused) classes.push("vgui-spinner--paused");
9
+ if (frames !== void 0) classes.push("vgui-spinner--sprite");
10
+ if (showLabel) classes.push("vgui-spinner--inline-label");
11
+ if (className) classes.push(className);
12
+ const inlineStyle = { ...style };
13
+ if (size !== void 0) inlineStyle["--vgui-spinner-size"] = `${size}px`;
14
+ if (durationMs !== void 0) inlineStyle["--vgui-spinner-duration"] = `${durationMs}ms`;
15
+ if (frames !== void 0) inlineStyle["--vgui-spinner-sheet"] = `url("${frames}")`;
16
+ return /* @__PURE__ */ jsxs("span", {
17
+ ref,
18
+ role: "progressbar",
19
+ "aria-label": label,
20
+ className: classes.join(" "),
21
+ style: inlineStyle,
22
+ ...rest,
23
+ children: [/* @__PURE__ */ jsx("span", {
24
+ className: "vgui-spinner__frame",
25
+ "aria-hidden": "true"
26
+ }), showLabel && /* @__PURE__ */ jsx("span", {
27
+ className: "vgui-spinner__label",
28
+ children: children ?? label
29
+ })]
30
+ });
31
+ });
32
+ Spinner.displayName = "Spinner";
33
+ //#endregion
34
+ export { Spinner };
35
+
36
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","names":[],"sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport type { CSSProperties, HTMLAttributes } from 'react'\n\nimport './Spinner.css'\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n /** Native size in pixels. 20 is the corpus value. */\n size?: number\n /** Fill the container and paint a black plate. The screenshot-loading case. */\n block?: boolean\n /** Draw the at-rest frame instead of animating. */\n paused?: boolean\n /** Accessible name announced to assistive tech. Defaults to \"Loading\". */\n label?: string\n /** Repeat the label as visible text beside the spinner. */\n showLabel?: boolean\n /** Sprite-sheet URL. When omitted the spinner is drawn procedurally. */\n frames?: string\n /** Rotation duration in milliseconds. Defaults to 1200. */\n durationMs?: number\n}\n\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(function Spinner(\n {\n className,\n size,\n block = false,\n paused = false,\n label = 'Loading',\n showLabel = false,\n frames,\n durationMs,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const classes = ['vgui-spinner']\n if (block) classes.push('vgui-spinner--block')\n if (paused) classes.push('vgui-spinner--paused')\n if (frames !== undefined) classes.push('vgui-spinner--sprite')\n if (showLabel) classes.push('vgui-spinner--inline-label')\n if (className) classes.push(className)\n\n /*\n * `size` and `durationMs` are written as inline custom properties rather than\n * dimensions so that the component-local tokens stay overridable from CSS —\n * `--block` raises the size to 32px and would otherwise be clobbered.\n */\n const inlineStyle = { ...style } as CSSProperties & Record<string, string>\n if (size !== undefined) inlineStyle['--vgui-spinner-size'] = `${size}px`\n if (durationMs !== undefined) inlineStyle['--vgui-spinner-duration'] = `${durationMs}ms`\n if (frames !== undefined) inlineStyle['--vgui-spinner-sheet'] = `url(\"${frames}\")`\n\n return (\n <span\n ref={ref}\n role=\"progressbar\"\n aria-label={label}\n className={classes.join(' ')}\n style={inlineStyle}\n {...rest}\n >\n <span className=\"vgui-spinner__frame\" aria-hidden=\"true\" />\n {showLabel && <span className=\"vgui-spinner__label\">{children ?? label}</span>}\n </span>\n )\n})\n\nSpinner.displayName = 'Spinner'\n"],"mappings":";;;;AAsBA,IAAa,UAAU,WAA0C,SAAS,QACxE,EACE,WACA,MACA,QAAQ,OACR,SAAS,OACT,QAAQ,WACR,YAAY,OACZ,QACA,YACA,OACA,UACA,GAAG,QAEL,KACA;CACA,MAAM,UAAU,CAAC,cAAc;CAC/B,IAAI,OAAO,QAAQ,KAAK,qBAAqB;CAC7C,IAAI,QAAQ,QAAQ,KAAK,sBAAsB;CAC/C,IAAI,WAAW,KAAA,GAAW,QAAQ,KAAK,sBAAsB;CAC7D,IAAI,WAAW,QAAQ,KAAK,4BAA4B;CACxD,IAAI,WAAW,QAAQ,KAAK,SAAS;CAOrC,MAAM,cAAc,EAAE,GAAG,MAAM;CAC/B,IAAI,SAAS,KAAA,GAAW,YAAY,yBAAyB,GAAG,KAAK;CACrE,IAAI,eAAe,KAAA,GAAW,YAAY,6BAA6B,GAAG,WAAW;CACrF,IAAI,WAAW,KAAA,GAAW,YAAY,0BAA0B,QAAQ,OAAO;CAE/E,OACE,qBAAC,QAAD;EACO;EACL,MAAK;EACL,cAAY;EACZ,WAAW,QAAQ,KAAK,GAAG;EAC3B,OAAO;EACP,GAAI;EANN,UAAA,CAQE,oBAAC,QAAD;GAAM,WAAU;GAAsB,eAAY;EAAQ,CAAA,GACzD,aAAa,oBAAC,QAAD;GAAM,WAAU;GAAuB,UAAA,YAAY;EAAY,CAAA,CACzE;;AAEV,CAAC;AAED,QAAQ,cAAc"}
@@ -0,0 +1,3 @@
1
+ export { Spinner } from './Spinner';
2
+ export type { SpinnerProps } from './Spinner';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Spinner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}