@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.
- package/README.md +20 -5
- package/dist/components/Avatar/Avatar.css +136 -0
- package/dist/components/Avatar/Avatar.d.ts +22 -0
- package/dist/components/Avatar/Avatar.d.ts.map +1 -0
- package/dist/components/Avatar/Avatar.js +49 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Avatar/index.d.ts +3 -0
- package/dist/components/Avatar/index.d.ts.map +1 -0
- package/dist/components/Button/Button.css +117 -0
- package/dist/components/Button/Button.d.ts +18 -0
- package/dist/components/Button/Button.d.ts.map +1 -0
- package/dist/components/Button/Button.js +29 -0
- package/dist/components/Button/Button.js.map +1 -0
- package/dist/components/Button/index.d.ts +3 -0
- package/dist/components/Button/index.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.css +116 -0
- package/dist/components/Checkbox/Checkbox.css.d.ts +1 -0
- package/dist/components/Checkbox/Checkbox.d.ts +19 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.js +51 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/components/Checkbox/index.d.ts +3 -0
- package/dist/components/Checkbox/index.d.ts.map +1 -0
- package/dist/components/ColorPicker/ColorPicker.css +331 -0
- package/dist/components/ColorPicker/ColorPicker.css.d.ts +1 -0
- package/dist/components/ColorPicker/ColorPicker.d.ts +29 -0
- package/dist/components/ColorPicker/ColorPicker.d.ts.map +1 -0
- package/dist/components/ColorPicker/ColorPicker.js +534 -0
- package/dist/components/ColorPicker/ColorPicker.js.map +1 -0
- package/dist/components/ColorPicker/index.d.ts +3 -0
- package/dist/components/{GreenButton → ColorPicker}/index.d.ts.map +1 -1
- package/dist/components/Console/Console.css +96 -0
- package/dist/components/Console/Console.css.d.ts +1 -0
- package/dist/components/Console/Console.d.ts +26 -0
- package/dist/components/Console/Console.d.ts.map +1 -0
- package/dist/components/Console/Console.js +59 -0
- package/dist/components/Console/Console.js.map +1 -0
- package/dist/components/Console/index.d.ts +3 -0
- package/dist/components/Console/index.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.css +137 -0
- package/dist/components/Dialog/Dialog.css.d.ts +1 -0
- package/dist/components/Dialog/Dialog.d.ts +28 -0
- package/dist/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.js +151 -0
- package/dist/components/Dialog/Dialog.js.map +1 -0
- package/dist/components/Dialog/index.d.ts +3 -0
- package/dist/components/Dialog/index.d.ts.map +1 -0
- package/dist/components/Divider/Divider.css +68 -0
- package/dist/components/Divider/Divider.css.d.ts +1 -0
- package/dist/components/Divider/Divider.d.ts +12 -0
- package/dist/components/Divider/Divider.d.ts.map +1 -0
- package/dist/components/Divider/Divider.js +23 -0
- package/dist/components/Divider/Divider.js.map +1 -0
- package/dist/components/Divider/index.d.ts +3 -0
- package/dist/components/Divider/index.d.ts.map +1 -0
- package/dist/components/FieldLabel/FieldLabel.css +98 -0
- package/dist/components/FieldLabel/FieldLabel.css.d.ts +1 -0
- package/dist/components/FieldLabel/FieldLabel.d.ts +29 -0
- package/dist/components/FieldLabel/FieldLabel.d.ts.map +1 -0
- package/dist/components/FieldLabel/FieldLabel.js +42 -0
- package/dist/components/FieldLabel/FieldLabel.js.map +1 -0
- package/dist/components/FieldLabel/index.d.ts +3 -0
- package/dist/components/{GreenPanel → FieldLabel}/index.d.ts.map +1 -1
- package/dist/components/GroupBox/GroupBox.css +101 -0
- package/dist/components/GroupBox/GroupBox.css.d.ts +1 -0
- package/dist/components/GroupBox/GroupBox.d.ts +14 -0
- package/dist/components/GroupBox/GroupBox.d.ts.map +1 -0
- package/dist/components/GroupBox/GroupBox.js +25 -0
- package/dist/components/GroupBox/GroupBox.js.map +1 -0
- package/dist/components/GroupBox/index.d.ts +3 -0
- package/dist/components/GroupBox/index.d.ts.map +1 -0
- package/dist/components/IconButton/IconButton.css +184 -0
- package/dist/components/IconButton/IconButton.css.d.ts +1 -0
- package/dist/components/IconButton/IconButton.d.ts +56 -0
- package/dist/components/IconButton/IconButton.d.ts.map +1 -0
- package/dist/components/IconButton/IconButton.js +77 -0
- package/dist/components/IconButton/IconButton.js.map +1 -0
- package/dist/components/IconButton/index.d.ts +3 -0
- package/dist/components/IconButton/index.d.ts.map +1 -0
- package/dist/components/LevelMeter/LevelMeter.css +117 -0
- package/dist/components/LevelMeter/LevelMeter.css.d.ts +1 -0
- package/dist/components/LevelMeter/LevelMeter.d.ts +20 -0
- package/dist/components/LevelMeter/LevelMeter.d.ts.map +1 -0
- package/dist/components/LevelMeter/LevelMeter.js +44 -0
- package/dist/components/LevelMeter/LevelMeter.js.map +1 -0
- package/dist/components/LevelMeter/index.d.ts +3 -0
- package/dist/components/LevelMeter/index.d.ts.map +1 -0
- package/dist/components/Link/Link.css +127 -0
- package/dist/components/Link/Link.css.d.ts +1 -0
- package/dist/components/Link/Link.d.ts +26 -0
- package/dist/components/Link/Link.d.ts.map +1 -0
- package/dist/components/Link/Link.js +60 -0
- package/dist/components/Link/Link.js.map +1 -0
- package/dist/components/Link/index.d.ts +3 -0
- package/dist/components/Link/index.d.ts.map +1 -0
- package/dist/components/List/List.css +224 -0
- package/dist/components/List/List.css.d.ts +1 -0
- package/dist/components/List/List.d.ts +49 -0
- package/dist/components/List/List.d.ts.map +1 -0
- package/dist/components/List/List.js +300 -0
- package/dist/components/List/List.js.map +1 -0
- package/dist/components/List/index.d.ts +3 -0
- package/dist/components/List/index.d.ts.map +1 -0
- package/dist/components/Menu/Menu.css +122 -0
- package/dist/components/Menu/Menu.css.d.ts +1 -0
- package/dist/components/Menu/Menu.d.ts +46 -0
- package/dist/components/Menu/Menu.d.ts.map +1 -0
- package/dist/components/Menu/Menu.js +246 -0
- package/dist/components/Menu/Menu.js.map +1 -0
- package/dist/components/Menu/index.d.ts +3 -0
- package/dist/components/Menu/index.d.ts.map +1 -0
- package/dist/components/MenuBar/MenuBar.css +94 -0
- package/dist/components/MenuBar/MenuBar.css.d.ts +1 -0
- package/dist/components/MenuBar/MenuBar.d.ts +34 -0
- package/dist/components/MenuBar/MenuBar.d.ts.map +1 -0
- package/dist/components/MenuBar/MenuBar.js +129 -0
- package/dist/components/MenuBar/MenuBar.js.map +1 -0
- package/dist/components/MenuBar/index.d.ts +3 -0
- package/dist/components/MenuBar/index.d.ts.map +1 -0
- package/dist/components/NavBar/NavBar.css +179 -0
- package/dist/components/NavBar/NavBar.css.d.ts +1 -0
- package/dist/components/NavBar/NavBar.d.ts +39 -0
- package/dist/components/NavBar/NavBar.d.ts.map +1 -0
- package/dist/components/NavBar/NavBar.js +198 -0
- package/dist/components/NavBar/NavBar.js.map +1 -0
- package/dist/components/NavBar/index.d.ts +3 -0
- package/dist/components/NavBar/index.d.ts.map +1 -0
- package/dist/components/Notification/Notification.css +176 -0
- package/dist/components/Notification/Notification.css.d.ts +1 -0
- package/dist/components/Notification/Notification.d.ts +26 -0
- package/dist/components/Notification/Notification.d.ts.map +1 -0
- package/dist/components/Notification/Notification.js +181 -0
- package/dist/components/Notification/Notification.js.map +1 -0
- package/dist/components/Notification/index.d.ts +3 -0
- package/dist/components/Notification/index.d.ts.map +1 -0
- package/dist/components/Panel/Panel.css +56 -0
- package/dist/components/Panel/Panel.css.d.ts +1 -0
- package/dist/components/Panel/Panel.d.ts +14 -0
- package/dist/components/Panel/Panel.d.ts.map +1 -0
- package/dist/components/Panel/Panel.js +42 -0
- package/dist/components/Panel/Panel.js.map +1 -0
- package/dist/components/Panel/index.d.ts +3 -0
- package/dist/components/Panel/index.d.ts.map +1 -0
- package/dist/components/ProgressBar/ProgressBar.css +108 -0
- package/dist/components/ProgressBar/ProgressBar.css.d.ts +1 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts +22 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -0
- package/dist/components/ProgressBar/ProgressBar.js +43 -0
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
- package/dist/components/ProgressBar/index.d.ts +3 -0
- package/dist/components/ProgressBar/index.d.ts.map +1 -0
- package/dist/components/Radio/Radio.css +125 -0
- package/dist/components/Radio/Radio.css.d.ts +1 -0
- package/dist/components/Radio/Radio.d.ts +40 -0
- package/dist/components/Radio/Radio.d.ts.map +1 -0
- package/dist/components/Radio/Radio.js +91 -0
- package/dist/components/Radio/Radio.js.map +1 -0
- package/dist/components/Radio/index.d.ts +3 -0
- package/dist/components/Radio/index.d.ts.map +1 -0
- package/dist/components/RichText/RichText.css +96 -0
- package/dist/components/RichText/RichText.css.d.ts +1 -0
- package/dist/components/RichText/RichText.d.ts +25 -0
- package/dist/components/RichText/RichText.d.ts.map +1 -0
- package/dist/components/RichText/RichText.js +56 -0
- package/dist/components/RichText/RichText.js.map +1 -0
- package/dist/components/RichText/index.d.ts +3 -0
- package/dist/components/RichText/index.d.ts.map +1 -0
- package/dist/components/ScrollArea/ScrollArea.css +236 -0
- package/dist/components/ScrollArea/ScrollArea.css.d.ts +1 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts +25 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -0
- package/dist/components/ScrollArea/ScrollArea.js +124 -0
- package/dist/components/ScrollArea/ScrollArea.js.map +1 -0
- package/dist/components/ScrollArea/index.d.ts +3 -0
- package/dist/components/ScrollArea/index.d.ts.map +1 -0
- package/dist/components/Scrollbar/Scrollbar.css +260 -0
- package/dist/components/Scrollbar/Scrollbar.css.d.ts +1 -0
- package/dist/components/Scrollbar/Scrollbar.d.ts +31 -0
- package/dist/components/Scrollbar/Scrollbar.d.ts.map +1 -0
- package/dist/components/Scrollbar/Scrollbar.js +277 -0
- package/dist/components/Scrollbar/Scrollbar.js.map +1 -0
- package/dist/components/Scrollbar/index.d.ts +3 -0
- package/dist/components/Scrollbar/index.d.ts.map +1 -0
- package/dist/components/Select/Select.css +299 -0
- package/dist/components/Select/Select.css.d.ts +1 -0
- package/dist/components/Select/Select.d.ts +52 -0
- package/dist/components/Select/Select.d.ts.map +1 -0
- package/dist/components/Select/Select.js +281 -0
- package/dist/components/Select/Select.js.map +1 -0
- package/dist/components/Select/index.d.ts +3 -0
- package/dist/components/Select/index.d.ts.map +1 -0
- package/dist/components/Slider/Slider.css +158 -0
- package/dist/components/Slider/Slider.css.d.ts +1 -0
- package/dist/components/Slider/Slider.d.ts +26 -0
- package/dist/components/Slider/Slider.d.ts.map +1 -0
- package/dist/components/Slider/Slider.js +67 -0
- package/dist/components/Slider/Slider.js.map +1 -0
- package/dist/components/Slider/index.d.ts +3 -0
- package/dist/components/Slider/index.d.ts.map +1 -0
- package/dist/components/SpinBox/SpinBox.css +152 -0
- package/dist/components/SpinBox/SpinBox.css.d.ts +1 -0
- package/dist/components/SpinBox/SpinBox.d.ts +28 -0
- package/dist/components/SpinBox/SpinBox.d.ts.map +1 -0
- package/dist/components/SpinBox/SpinBox.js +207 -0
- package/dist/components/SpinBox/SpinBox.js.map +1 -0
- package/dist/components/SpinBox/index.d.ts +3 -0
- package/dist/components/SpinBox/index.d.ts.map +1 -0
- package/dist/components/Spinner/Spinner.css +137 -0
- package/dist/components/Spinner/Spinner.css.d.ts +1 -0
- package/dist/components/Spinner/Spinner.d.ts +20 -0
- package/dist/components/Spinner/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner/Spinner.js +36 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/Spinner/index.d.ts +3 -0
- package/dist/components/Spinner/index.d.ts.map +1 -0
- package/dist/components/Splitter/Splitter.css +119 -0
- package/dist/components/Splitter/Splitter.css.d.ts +1 -0
- package/dist/components/Splitter/Splitter.d.ts +25 -0
- package/dist/components/Splitter/Splitter.d.ts.map +1 -0
- package/dist/components/Splitter/Splitter.js +212 -0
- package/dist/components/Splitter/Splitter.js.map +1 -0
- package/dist/components/Splitter/index.d.ts +3 -0
- package/dist/components/Splitter/index.d.ts.map +1 -0
- package/dist/components/StatusBar/StatusBar.css +97 -0
- package/dist/components/StatusBar/StatusBar.css.d.ts +1 -0
- package/dist/components/StatusBar/StatusBar.d.ts +22 -0
- package/dist/components/StatusBar/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar/StatusBar.js +56 -0
- package/dist/components/StatusBar/StatusBar.js.map +1 -0
- package/dist/components/StatusBar/index.d.ts +3 -0
- package/dist/components/StatusBar/index.d.ts.map +1 -0
- package/dist/components/StatusLabel/StatusLabel.css +93 -0
- package/dist/components/StatusLabel/StatusLabel.css.d.ts +1 -0
- package/dist/components/StatusLabel/StatusLabel.d.ts +20 -0
- package/dist/components/StatusLabel/StatusLabel.d.ts.map +1 -0
- package/dist/components/StatusLabel/StatusLabel.js +42 -0
- package/dist/components/StatusLabel/StatusLabel.js.map +1 -0
- package/dist/components/StatusLabel/index.d.ts +3 -0
- package/dist/components/StatusLabel/index.d.ts.map +1 -0
- package/dist/components/Table/Table.css +253 -0
- package/dist/components/Table/Table.css.d.ts +1 -0
- package/dist/components/Table/Table.d.ts +67 -0
- package/dist/components/Table/Table.d.ts.map +1 -0
- package/dist/components/Table/Table.js +429 -0
- package/dist/components/Table/Table.js.map +1 -0
- package/dist/components/Table/index.d.ts +3 -0
- package/dist/components/Table/index.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.css +138 -0
- package/dist/components/Tabs/Tabs.css.d.ts +1 -0
- package/dist/components/Tabs/Tabs.d.ts +34 -0
- package/dist/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.js +140 -0
- package/dist/components/Tabs/Tabs.js.map +1 -0
- package/dist/components/Tabs/index.d.ts +3 -0
- package/dist/components/Tabs/index.d.ts.map +1 -0
- package/dist/components/TextInput/TextInput.css +133 -0
- package/dist/components/TextInput/TextInput.css.d.ts +1 -0
- package/dist/components/TextInput/TextInput.d.ts +16 -0
- package/dist/components/TextInput/TextInput.d.ts.map +1 -0
- package/dist/components/TextInput/TextInput.js +38 -0
- package/dist/components/TextInput/TextInput.js.map +1 -0
- package/dist/components/TextInput/index.d.ts +3 -0
- package/dist/components/TextInput/index.d.ts.map +1 -0
- package/dist/components/Textarea/Textarea.css +121 -0
- package/dist/components/Textarea/Textarea.css.d.ts +1 -0
- package/dist/components/Textarea/Textarea.d.ts +21 -0
- package/dist/components/Textarea/Textarea.d.ts.map +1 -0
- package/dist/components/Textarea/Textarea.js +61 -0
- package/dist/components/Textarea/Textarea.js.map +1 -0
- package/dist/components/Textarea/index.d.ts +3 -0
- package/dist/components/Textarea/index.d.ts.map +1 -0
- package/dist/components/TitleBar/TitleBar.css +76 -0
- package/dist/components/TitleBar/TitleBar.css.d.ts +1 -0
- package/dist/components/TitleBar/TitleBar.d.ts +20 -0
- package/dist/components/TitleBar/TitleBar.d.ts.map +1 -0
- package/dist/components/TitleBar/TitleBar.js +43 -0
- package/dist/components/TitleBar/TitleBar.js.map +1 -0
- package/dist/components/TitleBar/index.d.ts +3 -0
- package/dist/components/TitleBar/index.d.ts.map +1 -0
- package/dist/components/ToggleButton/ToggleButton.css +162 -0
- package/dist/components/ToggleButton/ToggleButton.css.d.ts +1 -0
- package/dist/components/ToggleButton/ToggleButton.d.ts +27 -0
- package/dist/components/ToggleButton/ToggleButton.d.ts.map +1 -0
- package/dist/components/ToggleButton/ToggleButton.js +52 -0
- package/dist/components/ToggleButton/ToggleButton.js.map +1 -0
- package/dist/components/ToggleButton/index.d.ts +3 -0
- package/dist/components/ToggleButton/index.d.ts.map +1 -0
- package/dist/components/Toolbar/Toolbar.css +202 -0
- package/dist/components/Toolbar/Toolbar.css.d.ts +1 -0
- package/dist/components/Toolbar/Toolbar.d.ts +46 -0
- package/dist/components/Toolbar/Toolbar.d.ts.map +1 -0
- package/dist/components/Toolbar/Toolbar.js +102 -0
- package/dist/components/Toolbar/Toolbar.js.map +1 -0
- package/dist/components/Toolbar/index.d.ts +3 -0
- package/dist/components/Toolbar/index.d.ts.map +1 -0
- package/dist/components/Tooltip/Tooltip.css +86 -0
- package/dist/components/Tooltip/Tooltip.css.d.ts +1 -0
- package/dist/components/Tooltip/Tooltip.d.ts +22 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip/Tooltip.js +92 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/components/Tooltip/index.d.ts +3 -0
- package/dist/components/Tooltip/index.d.ts.map +1 -0
- package/dist/components/TreeView/TreeView.css +191 -0
- package/dist/components/TreeView/TreeView.css.d.ts +1 -0
- package/dist/components/TreeView/TreeView.d.ts +46 -0
- package/dist/components/TreeView/TreeView.d.ts.map +1 -0
- package/dist/components/TreeView/TreeView.js +331 -0
- package/dist/components/TreeView/TreeView.js.map +1 -0
- package/dist/components/TreeView/index.d.ts +3 -0
- package/dist/components/TreeView/index.d.ts.map +1 -0
- package/dist/components/Window/Window.css +218 -0
- package/dist/components/Window/Window.css.d.ts +1 -0
- package/dist/components/Window/Window.d.ts +30 -0
- package/dist/components/Window/Window.d.ts.map +1 -0
- package/dist/components/Window/Window.js +156 -0
- package/dist/components/Window/Window.js.map +1 -0
- package/dist/components/Window/index.d.ts +3 -0
- package/dist/components/Window/index.d.ts.map +1 -0
- package/dist/index.d.ts +91 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -3
- package/dist/styles/scrollbars.css +123 -0
- package/dist/styles/scrollbars.css.d.ts +1 -0
- package/dist/styles/theme.css +86 -41
- package/dist/styles/tokens.css +202 -0
- package/dist/styles/tokens.css.d.ts +1 -0
- package/dist/test/a11y.d.ts +3 -0
- package/dist/test/a11y.d.ts.map +1 -0
- package/dist/test/index.d.ts +2 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/package.json +13 -2
- package/dist/components/GreenButton/GreenButton.css +0 -47
- package/dist/components/GreenButton/GreenButton.d.ts +0 -8
- package/dist/components/GreenButton/GreenButton.d.ts.map +0 -1
- package/dist/components/GreenButton/GreenButton.js +0 -20
- package/dist/components/GreenButton/GreenButton.js.map +0 -1
- package/dist/components/GreenButton/index.d.ts +0 -3
- package/dist/components/GreenPanel/GreenPanel.css +0 -45
- package/dist/components/GreenPanel/GreenPanel.d.ts +0 -12
- package/dist/components/GreenPanel/GreenPanel.d.ts.map +0 -1
- package/dist/components/GreenPanel/GreenPanel.js +0 -24
- package/dist/components/GreenPanel/GreenPanel.js.map +0 -1
- package/dist/components/GreenPanel/index.d.ts +0 -3
- /package/dist/components/{GreenButton/GreenButton.css.d.ts → Avatar/Avatar.css.d.ts} +0 -0
- /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 @@
|
|
|
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 {}
|