@dalcvil/steam-green-react 0.1.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/LICENSE +25 -25
- package/README.md +38 -12
- 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.css.d.ts +1 -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/FieldLabel/index.d.ts.map +1 -0
- 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 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -2
- package/dist/styles/scrollbars.css +123 -0
- package/dist/styles/scrollbars.css.d.ts +1 -0
- package/dist/styles/theme.css +167 -122
- 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 +23 -14
- 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/{GreenButton/GreenButton.css.d.ts → Avatar/Avatar.css.d.ts} +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
import './Scrollbar.css';
|
|
3
|
+
import '../../styles/scrollbars.css';
|
|
4
|
+
export interface ScrollbarProps extends HTMLAttributes<HTMLDivElement> {
|
|
5
|
+
/** Scrolling axis. Defaults to `"vertical"`. */
|
|
6
|
+
orientation?: 'vertical' | 'horizontal';
|
|
7
|
+
/**
|
|
8
|
+
* Painting strategy. `"drawn"` renders the button/gutter/thumb tree, which
|
|
9
|
+
* looks the same in every engine; `"native"` sets `scrollbar-color` and emits
|
|
10
|
+
* no extra markup, leaving the bar to the platform. Defaults to `"drawn"`.
|
|
11
|
+
*/
|
|
12
|
+
variant?: 'drawn' | 'native';
|
|
13
|
+
/**
|
|
14
|
+
* Bar thickness. Defaults to `--vgui-scrollbar-size` (18px). Honoured by both
|
|
15
|
+
* variants, but the platform only paints a custom thickness in WebKit/Blink.
|
|
16
|
+
*/
|
|
17
|
+
thickness?: number | string;
|
|
18
|
+
/** Reserve space for the bar even when the content does not overflow. */
|
|
19
|
+
alwaysVisible?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Paint the gutter with nothing, matching `ScrollBarSlider:disabled`
|
|
22
|
+
* (`steam.styles:2315`). The content stays scrollable.
|
|
23
|
+
*/
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
/** Pixels of the region that must remain visible above the bar. */
|
|
26
|
+
scrollPadding?: number;
|
|
27
|
+
/** Called with the scroll offset after every scroll frame. */
|
|
28
|
+
onScrollOffsetChange?: (offset: number, max: number) => void;
|
|
29
|
+
}
|
|
30
|
+
export declare const Scrollbar: import("react").ForwardRefExoticComponent<ScrollbarProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
31
|
+
//# sourceMappingURL=Scrollbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scrollbar.d.ts","sourceRoot":"","sources":["../../../src/components/Scrollbar/Scrollbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EAIf,MAAM,OAAO,CAAA;AAEd,OAAO,iBAAiB,CAAA;AACxB,OAAO,6BAA6B,CAAA;AAEpC,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,cAAc,CAAC;IACpE,gDAAgD;IAChD,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAA;IACvC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7D;AAgBD,eAAO,MAAM,SAAS,2GA2TpB,CAAA"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { forwardRef, useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import "../../styles/scrollbars.css";
|
|
4
|
+
import "./Scrollbar.css";
|
|
5
|
+
//#region src/components/Scrollbar/Scrollbar.tsx
|
|
6
|
+
var EMPTY_METRICS = {
|
|
7
|
+
offset: 0,
|
|
8
|
+
max: 0,
|
|
9
|
+
viewport: 0,
|
|
10
|
+
content: 0
|
|
11
|
+
};
|
|
12
|
+
/** jsdom has no layout engine, so every measured number is 0/NaN there. */
|
|
13
|
+
function toExtent(value) {
|
|
14
|
+
return Number.isFinite(value) && value > 0 ? value : 0;
|
|
15
|
+
}
|
|
16
|
+
var Scrollbar = forwardRef(function Scrollbar({ className, orientation = "vertical", variant = "drawn", thickness, alwaysVisible = false, disabled = false, scrollPadding, onScrollOffsetChange, children, style, tabIndex, onScroll, onKeyDown, ...rest }, forwardedRef) {
|
|
17
|
+
const regionRef = useRef(null);
|
|
18
|
+
const contentRef = useRef(null);
|
|
19
|
+
const dragCleanupRef = useRef(null);
|
|
20
|
+
const [metrics, setMetrics] = useState(EMPTY_METRICS);
|
|
21
|
+
const drawn = variant === "drawn";
|
|
22
|
+
const vertical = orientation === "vertical";
|
|
23
|
+
const scroller = drawn ? contentRef : regionRef;
|
|
24
|
+
const measure = useCallback(() => {
|
|
25
|
+
const node = scroller.current;
|
|
26
|
+
if (!node) return;
|
|
27
|
+
const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth);
|
|
28
|
+
const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth);
|
|
29
|
+
const offset = Math.max(vertical ? node.scrollTop : node.scrollLeft, 0);
|
|
30
|
+
const max = content > viewport ? content - viewport : 0;
|
|
31
|
+
setMetrics({
|
|
32
|
+
offset: max > 0 ? Math.min(offset, max) : offset,
|
|
33
|
+
max,
|
|
34
|
+
viewport,
|
|
35
|
+
content
|
|
36
|
+
});
|
|
37
|
+
onScrollOffsetChange?.(max > 0 ? Math.min(offset, max) : offset, max);
|
|
38
|
+
}, [
|
|
39
|
+
onScrollOffsetChange,
|
|
40
|
+
scroller,
|
|
41
|
+
vertical
|
|
42
|
+
]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
measure();
|
|
45
|
+
const node = scroller.current;
|
|
46
|
+
if (!node || typeof ResizeObserver === "undefined") return;
|
|
47
|
+
const observer = new ResizeObserver(measure);
|
|
48
|
+
observer.observe(node);
|
|
49
|
+
return () => observer.disconnect();
|
|
50
|
+
}, [
|
|
51
|
+
measure,
|
|
52
|
+
scroller,
|
|
53
|
+
children
|
|
54
|
+
]);
|
|
55
|
+
useEffect(() => () => dragCleanupRef.current?.(), []);
|
|
56
|
+
const setRegionRef = useCallback((node) => {
|
|
57
|
+
regionRef.current = node;
|
|
58
|
+
if (typeof forwardedRef === "function") forwardedRef(node);
|
|
59
|
+
else if (forwardedRef) forwardedRef.current = node;
|
|
60
|
+
}, [forwardedRef]);
|
|
61
|
+
const handleScroll = useCallback((event) => {
|
|
62
|
+
onScroll?.(event);
|
|
63
|
+
measure();
|
|
64
|
+
}, [measure, onScroll]);
|
|
65
|
+
const scrollByExtent = useCallback((delta) => {
|
|
66
|
+
const node = scroller.current;
|
|
67
|
+
if (!node) return;
|
|
68
|
+
if (vertical) node.scrollTop = Math.max(node.scrollTop + delta, 0);
|
|
69
|
+
else node.scrollLeft = Math.max(node.scrollLeft + delta, 0);
|
|
70
|
+
measure();
|
|
71
|
+
}, [
|
|
72
|
+
measure,
|
|
73
|
+
scroller,
|
|
74
|
+
vertical
|
|
75
|
+
]);
|
|
76
|
+
const scrollToEdge = useCallback((edge) => {
|
|
77
|
+
const node = scroller.current;
|
|
78
|
+
if (!node) return;
|
|
79
|
+
if (vertical) node.scrollTop = edge === "start" ? 0 : node.scrollHeight;
|
|
80
|
+
else node.scrollLeft = edge === "start" ? 0 : node.scrollWidth;
|
|
81
|
+
measure();
|
|
82
|
+
}, [
|
|
83
|
+
measure,
|
|
84
|
+
scroller,
|
|
85
|
+
vertical
|
|
86
|
+
]);
|
|
87
|
+
const step = useCallback((direction, factor = .2) => {
|
|
88
|
+
const node = scroller.current;
|
|
89
|
+
if (!node) return;
|
|
90
|
+
const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth);
|
|
91
|
+
const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth);
|
|
92
|
+
const distance = viewport > 0 ? Math.max(1, Math.round(viewport * factor)) : Math.max(1, Math.round(content / 10) || 20);
|
|
93
|
+
scrollByExtent(distance * direction);
|
|
94
|
+
}, [
|
|
95
|
+
scrollByExtent,
|
|
96
|
+
scroller,
|
|
97
|
+
vertical
|
|
98
|
+
]);
|
|
99
|
+
const scrollToRatio = useCallback((ratio) => {
|
|
100
|
+
const node = scroller.current;
|
|
101
|
+
if (!node) return;
|
|
102
|
+
const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth);
|
|
103
|
+
const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth);
|
|
104
|
+
const max = content > viewport ? content - viewport : 0;
|
|
105
|
+
if (max <= 0) return;
|
|
106
|
+
const next = Math.round(Math.min(Math.max(ratio, 0), 1) * max);
|
|
107
|
+
if (vertical) node.scrollTop = next;
|
|
108
|
+
else node.scrollLeft = next;
|
|
109
|
+
measure();
|
|
110
|
+
}, [
|
|
111
|
+
measure,
|
|
112
|
+
scroller,
|
|
113
|
+
vertical
|
|
114
|
+
]);
|
|
115
|
+
const handleKeyDown = useCallback((event) => {
|
|
116
|
+
onKeyDown?.(event);
|
|
117
|
+
if (event.defaultPrevented || !drawn) return;
|
|
118
|
+
const back = vertical ? "ArrowUp" : "ArrowLeft";
|
|
119
|
+
const forward = vertical ? "ArrowDown" : "ArrowRight";
|
|
120
|
+
switch (event.key) {
|
|
121
|
+
case back:
|
|
122
|
+
event.preventDefault();
|
|
123
|
+
step(-1);
|
|
124
|
+
return;
|
|
125
|
+
case forward:
|
|
126
|
+
event.preventDefault();
|
|
127
|
+
step(1);
|
|
128
|
+
return;
|
|
129
|
+
case "PageUp":
|
|
130
|
+
event.preventDefault();
|
|
131
|
+
step(-1, 1);
|
|
132
|
+
return;
|
|
133
|
+
case "PageDown":
|
|
134
|
+
event.preventDefault();
|
|
135
|
+
step(1, 1);
|
|
136
|
+
return;
|
|
137
|
+
case " ":
|
|
138
|
+
event.preventDefault();
|
|
139
|
+
step(event.shiftKey ? -1 : 1, 1);
|
|
140
|
+
return;
|
|
141
|
+
case "Home":
|
|
142
|
+
event.preventDefault();
|
|
143
|
+
scrollToEdge("start");
|
|
144
|
+
return;
|
|
145
|
+
case "End":
|
|
146
|
+
event.preventDefault();
|
|
147
|
+
scrollToEdge("end");
|
|
148
|
+
return;
|
|
149
|
+
default: return;
|
|
150
|
+
}
|
|
151
|
+
}, [
|
|
152
|
+
drawn,
|
|
153
|
+
onKeyDown,
|
|
154
|
+
scrollToEdge,
|
|
155
|
+
step,
|
|
156
|
+
vertical
|
|
157
|
+
]);
|
|
158
|
+
const handleGutterPointerDown = useCallback((event) => {
|
|
159
|
+
if (disabled) return;
|
|
160
|
+
const gutter = event.currentTarget;
|
|
161
|
+
const extent = toExtent(vertical ? gutter.clientHeight : gutter.clientWidth);
|
|
162
|
+
if (extent <= 0) return;
|
|
163
|
+
const start = vertical ? gutter.getBoundingClientRect().top : gutter.getBoundingClientRect().left;
|
|
164
|
+
scrollToRatio(((vertical ? event.clientY : event.clientX) - start) / extent);
|
|
165
|
+
}, [
|
|
166
|
+
disabled,
|
|
167
|
+
scrollToRatio,
|
|
168
|
+
vertical
|
|
169
|
+
]);
|
|
170
|
+
const handleThumbPointerDown = useCallback((event) => {
|
|
171
|
+
if (disabled) return;
|
|
172
|
+
const node = scroller.current;
|
|
173
|
+
const gutter = event.currentTarget.parentElement;
|
|
174
|
+
if (!node || !gutter) return;
|
|
175
|
+
const extent = toExtent(vertical ? gutter.clientHeight : gutter.clientWidth);
|
|
176
|
+
const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth);
|
|
177
|
+
const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth);
|
|
178
|
+
const max = content > viewport ? content - viewport : 0;
|
|
179
|
+
if (extent <= 0 || max <= 0) return;
|
|
180
|
+
const travel = extent - Math.max(1, Math.min(extent, viewport / content * extent));
|
|
181
|
+
if (travel <= 0) return;
|
|
182
|
+
const axis = vertical ? "clientY" : "clientX";
|
|
183
|
+
const startPosition = event[axis];
|
|
184
|
+
const startOffset = vertical ? node.scrollTop : node.scrollLeft;
|
|
185
|
+
const onMove = (moveEvent) => {
|
|
186
|
+
const delta = (moveEvent[axis] - startPosition) / travel;
|
|
187
|
+
const next = Math.round(Math.min(Math.max(startOffset + delta * max, 0), max));
|
|
188
|
+
if (vertical) node.scrollTop = next;
|
|
189
|
+
else node.scrollLeft = next;
|
|
190
|
+
measure();
|
|
191
|
+
};
|
|
192
|
+
const cleanup = () => {
|
|
193
|
+
window.removeEventListener("pointermove", onMove);
|
|
194
|
+
window.removeEventListener("pointerup", cleanup);
|
|
195
|
+
dragCleanupRef.current = null;
|
|
196
|
+
};
|
|
197
|
+
dragCleanupRef.current?.();
|
|
198
|
+
dragCleanupRef.current = cleanup;
|
|
199
|
+
window.addEventListener("pointermove", onMove);
|
|
200
|
+
window.addEventListener("pointerup", cleanup);
|
|
201
|
+
}, [
|
|
202
|
+
disabled,
|
|
203
|
+
measure,
|
|
204
|
+
scroller,
|
|
205
|
+
vertical
|
|
206
|
+
]);
|
|
207
|
+
const classes = ["vgui-scroll-region", `vgui-scroll-region--${orientation}`];
|
|
208
|
+
if (drawn) classes.push("vgui-scroll-region--drawn");
|
|
209
|
+
else classes.push("vgui-scroll-surface");
|
|
210
|
+
if (alwaysVisible) classes.push("vgui-scroll-region--always-visible");
|
|
211
|
+
if (className) classes.push(className);
|
|
212
|
+
const regionStyle = {
|
|
213
|
+
...style,
|
|
214
|
+
...thickness === void 0 ? null : { "--vgui-scrollbar-size": cssLength(thickness) },
|
|
215
|
+
...scrollPadding === void 0 ? null : { "--vgui-scrollbar-scroll-padding": `${scrollPadding}px` }
|
|
216
|
+
};
|
|
217
|
+
const ratio = metrics.max > 0 && metrics.viewport > 0 ? metrics.viewport / (metrics.max + metrics.viewport) : 1;
|
|
218
|
+
const lengthPercent = Math.round(Math.min(Math.max(ratio, .1), 1) * 100);
|
|
219
|
+
const offsetFraction = metrics.max > 0 ? metrics.offset / metrics.max : 0;
|
|
220
|
+
const thumbStyle = {
|
|
221
|
+
"--vgui-scrollbar-thumb-length": `${lengthPercent}%`,
|
|
222
|
+
"--vgui-scrollbar-thumb-offset": offsetFraction
|
|
223
|
+
};
|
|
224
|
+
return /* @__PURE__ */ jsx("div", {
|
|
225
|
+
ref: setRegionRef,
|
|
226
|
+
className: classes.join(" "),
|
|
227
|
+
style: regionStyle,
|
|
228
|
+
tabIndex: tabIndex ?? 0,
|
|
229
|
+
"data-disabled": disabled ? "" : void 0,
|
|
230
|
+
onKeyDown: handleKeyDown,
|
|
231
|
+
...drawn ? null : { onScroll: handleScroll },
|
|
232
|
+
...rest,
|
|
233
|
+
children: drawn ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
|
|
234
|
+
ref: contentRef,
|
|
235
|
+
className: "vgui-scroll-region__content",
|
|
236
|
+
onScroll: handleScroll,
|
|
237
|
+
children
|
|
238
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
239
|
+
className: "vgui-scrollbar",
|
|
240
|
+
"data-orientation": orientation,
|
|
241
|
+
"aria-hidden": "true",
|
|
242
|
+
children: [
|
|
243
|
+
/* @__PURE__ */ jsx("button", {
|
|
244
|
+
type: "button",
|
|
245
|
+
tabIndex: -1,
|
|
246
|
+
className: "vgui-scrollbar__button vgui-scrollbar__button--decrement",
|
|
247
|
+
onClick: () => step(-1),
|
|
248
|
+
children: /* @__PURE__ */ jsx("span", { className: `vgui-scrollbar__glyph vgui-scrollbar__glyph--${vertical ? "up" : "left"}` })
|
|
249
|
+
}),
|
|
250
|
+
/* @__PURE__ */ jsx("div", {
|
|
251
|
+
className: "vgui-scrollbar__gutter",
|
|
252
|
+
onPointerDown: handleGutterPointerDown,
|
|
253
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
254
|
+
className: "vgui-scrollbar__thumb",
|
|
255
|
+
style: thumbStyle,
|
|
256
|
+
onPointerDown: handleThumbPointerDown
|
|
257
|
+
})
|
|
258
|
+
}),
|
|
259
|
+
/* @__PURE__ */ jsx("button", {
|
|
260
|
+
type: "button",
|
|
261
|
+
tabIndex: -1,
|
|
262
|
+
className: "vgui-scrollbar__button vgui-scrollbar__button--increment",
|
|
263
|
+
onClick: () => step(1),
|
|
264
|
+
children: /* @__PURE__ */ jsx("span", { className: `vgui-scrollbar__glyph vgui-scrollbar__glyph--${vertical ? "down" : "right"}` })
|
|
265
|
+
})
|
|
266
|
+
]
|
|
267
|
+
})] }) : children
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
function cssLength(value) {
|
|
271
|
+
return typeof value === "number" ? `${value}px` : value;
|
|
272
|
+
}
|
|
273
|
+
Scrollbar.displayName = "Scrollbar";
|
|
274
|
+
//#endregion
|
|
275
|
+
export { Scrollbar };
|
|
276
|
+
|
|
277
|
+
//# sourceMappingURL=Scrollbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scrollbar.js","names":[],"sources":["../../../src/components/Scrollbar/Scrollbar.tsx"],"sourcesContent":["import { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\nimport type {\n CSSProperties,\n HTMLAttributes,\n KeyboardEvent as ReactKeyboardEvent,\n PointerEvent as ReactPointerEvent,\n UIEvent as ReactUIEvent,\n} from 'react'\n\nimport './Scrollbar.css'\nimport '../../styles/scrollbars.css'\n\nexport interface ScrollbarProps extends HTMLAttributes<HTMLDivElement> {\n /** Scrolling axis. Defaults to `\"vertical\"`. */\n orientation?: 'vertical' | 'horizontal'\n /**\n * Painting strategy. `\"drawn\"` renders the button/gutter/thumb tree, which\n * looks the same in every engine; `\"native\"` sets `scrollbar-color` and emits\n * no extra markup, leaving the bar to the platform. Defaults to `\"drawn\"`.\n */\n variant?: 'drawn' | 'native'\n /**\n * Bar thickness. Defaults to `--vgui-scrollbar-size` (18px). Honoured by both\n * variants, but the platform only paints a custom thickness in WebKit/Blink.\n */\n thickness?: number | string\n /** Reserve space for the bar even when the content does not overflow. */\n alwaysVisible?: boolean\n /**\n * Paint the gutter with nothing, matching `ScrollBarSlider:disabled`\n * (`steam.styles:2315`). The content stays scrollable.\n */\n disabled?: boolean\n /** Pixels of the region that must remain visible above the bar. */\n scrollPadding?: number\n /** Called with the scroll offset after every scroll frame. */\n onScrollOffsetChange?: (offset: number, max: number) => void\n}\n\ninterface ScrollMetrics {\n offset: number\n max: number\n viewport: number\n content: number\n}\n\nconst EMPTY_METRICS: ScrollMetrics = { offset: 0, max: 0, viewport: 0, content: 0 }\n\n/** jsdom has no layout engine, so every measured number is 0/NaN there. */\nfunction toExtent(value: number): number {\n return Number.isFinite(value) && value > 0 ? value : 0\n}\n\nexport const Scrollbar = forwardRef<HTMLDivElement, ScrollbarProps>(function Scrollbar(\n {\n className,\n orientation = 'vertical',\n variant = 'drawn',\n thickness,\n alwaysVisible = false,\n disabled = false,\n scrollPadding,\n onScrollOffsetChange,\n children,\n style,\n tabIndex,\n onScroll,\n onKeyDown,\n ...rest\n },\n forwardedRef,\n) {\n const regionRef = useRef<HTMLDivElement | null>(null)\n const contentRef = useRef<HTMLDivElement | null>(null)\n const dragCleanupRef = useRef<(() => void) | null>(null)\n const [metrics, setMetrics] = useState<ScrollMetrics>(EMPTY_METRICS)\n\n const drawn = variant === 'drawn'\n const vertical = orientation === 'vertical'\n\n // In the native path the region scrolls itself; in the drawn path the inner\n // content does, and the bar is a flex sibling that never scrolls away.\n const scroller = drawn ? contentRef : regionRef\n\n const measure = useCallback(() => {\n const node = scroller.current\n if (!node) return\n\n const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth)\n const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth)\n const offset = Math.max(vertical ? node.scrollTop : node.scrollLeft, 0)\n const max = content > viewport ? content - viewport : 0\n\n setMetrics({\n offset: max > 0 ? Math.min(offset, max) : offset,\n max,\n viewport,\n content,\n })\n onScrollOffsetChange?.(max > 0 ? Math.min(offset, max) : offset, max)\n }, [onScrollOffsetChange, scroller, vertical])\n\n useEffect(() => {\n measure()\n\n const node = scroller.current\n if (!node || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(measure)\n observer.observe(node)\n return () => observer.disconnect()\n }, [measure, scroller, children])\n\n useEffect(() => () => dragCleanupRef.current?.(), [])\n\n const setRegionRef = useCallback(\n (node: HTMLDivElement | null) => {\n regionRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef],\n )\n\n const handleScroll = useCallback(\n (event: ReactUIEvent<HTMLDivElement>) => {\n onScroll?.(event)\n measure()\n },\n [measure, onScroll],\n )\n\n const scrollByExtent = useCallback(\n (delta: number) => {\n const node = scroller.current\n if (!node) return\n\n // The engine clamps the far end to the content extent; the near end is\n // clamped here so a negative nudge cannot park the scroller above zero.\n if (vertical) node.scrollTop = Math.max(node.scrollTop + delta, 0)\n else node.scrollLeft = Math.max(node.scrollLeft + delta, 0)\n measure()\n },\n [measure, scroller, vertical],\n )\n\n const scrollToEdge = useCallback(\n (edge: 'start' | 'end') => {\n const node = scroller.current\n if (!node) return\n\n if (vertical) node.scrollTop = edge === 'start' ? 0 : node.scrollHeight\n else node.scrollLeft = edge === 'start' ? 0 : node.scrollWidth\n measure()\n },\n [measure, scroller, vertical],\n )\n\n const step = useCallback(\n (direction: -1 | 1, factor = 0.2) => {\n const node = scroller.current\n if (!node) return\n\n const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth)\n const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth)\n // A fifth of a viewport is a line-page; without a viewport it degrades to\n // the content or to a fixed 20px nudge, so the arrows still do something.\n const distance =\n viewport > 0\n ? Math.max(1, Math.round(viewport * factor))\n : Math.max(1, Math.round(content / 10) || 20)\n\n scrollByExtent(distance * direction)\n },\n [scrollByExtent, scroller, vertical],\n )\n\n const scrollToRatio = useCallback(\n (ratio: number) => {\n const node = scroller.current\n if (!node) return\n\n const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth)\n const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth)\n const max = content > viewport ? content - viewport : 0\n if (max <= 0) return\n\n const next = Math.round(Math.min(Math.max(ratio, 0), 1) * max)\n if (vertical) node.scrollTop = next\n else node.scrollLeft = next\n measure()\n },\n [measure, scroller, vertical],\n )\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n\n // Only the drawn path needs this. Its region hides its overflow and lets\n // the inner box scroll, so the browser has no scroll container to move\n // when the region itself holds focus; the keys it would have handled\n // natively are mapped onto the scroller here instead.\n if (event.defaultPrevented || !drawn) return\n\n const back = vertical ? 'ArrowUp' : 'ArrowLeft'\n const forward = vertical ? 'ArrowDown' : 'ArrowRight'\n\n switch (event.key) {\n case back:\n event.preventDefault()\n step(-1)\n return\n case forward:\n event.preventDefault()\n step(1)\n return\n case 'PageUp':\n event.preventDefault()\n step(-1, 1)\n return\n case 'PageDown':\n event.preventDefault()\n step(1, 1)\n return\n case ' ':\n event.preventDefault()\n step(event.shiftKey ? -1 : 1, 1)\n return\n case 'Home':\n event.preventDefault()\n scrollToEdge('start')\n return\n case 'End':\n event.preventDefault()\n scrollToEdge('end')\n return\n default:\n return\n }\n },\n [drawn, onKeyDown, scrollToEdge, step, vertical],\n )\n\n const handleGutterPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return\n\n const gutter = event.currentTarget\n const extent = toExtent(vertical ? gutter.clientHeight : gutter.clientWidth)\n if (extent <= 0) return\n\n const start = vertical ? gutter.getBoundingClientRect().top : gutter.getBoundingClientRect().left\n scrollToRatio(((vertical ? event.clientY : event.clientX) - start) / extent)\n },\n [disabled, scrollToRatio, vertical],\n )\n\n const handleThumbPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return\n\n const node = scroller.current\n const gutter = event.currentTarget.parentElement\n if (!node || !gutter) return\n\n const extent = toExtent(vertical ? gutter.clientHeight : gutter.clientWidth)\n const viewport = toExtent(vertical ? node.clientHeight : node.clientWidth)\n const content = toExtent(vertical ? node.scrollHeight : node.scrollWidth)\n const max = content > viewport ? content - viewport : 0\n // Without a measurable gutter there is nothing to drag; leaving the event\n // alone keeps the thumb inert rather than jumping the scroll position.\n if (extent <= 0 || max <= 0) return\n\n const thumbExtent = Math.max(1, Math.min(extent, (viewport / content) * extent))\n const travel = extent - thumbExtent\n if (travel <= 0) return\n\n const axis = vertical ? 'clientY' : 'clientX'\n const startPosition = event[axis]\n const startOffset = vertical ? node.scrollTop : node.scrollLeft\n\n const onMove = (moveEvent: PointerEvent) => {\n const delta = (moveEvent[axis] - startPosition) / travel\n const next = Math.round(Math.min(Math.max(startOffset + delta * max, 0), max))\n if (vertical) node.scrollTop = next\n else node.scrollLeft = next\n measure()\n }\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', cleanup)\n dragCleanupRef.current = null\n }\n\n dragCleanupRef.current?.()\n dragCleanupRef.current = cleanup\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', cleanup)\n },\n [disabled, measure, scroller, vertical],\n )\n\n const classes = ['vgui-scroll-region', `vgui-scroll-region--${orientation}`]\n if (drawn) classes.push('vgui-scroll-region--drawn')\n else classes.push('vgui-scroll-surface')\n if (alwaysVisible) classes.push('vgui-scroll-region--always-visible')\n if (className) classes.push(className)\n\n const regionStyle: CSSProperties = {\n ...style,\n ...(thickness === undefined ? null : { '--vgui-scrollbar-size': cssLength(thickness) }),\n ...(scrollPadding === undefined ? null : { '--vgui-scrollbar-scroll-padding': `${scrollPadding}px` }),\n } as CSSProperties\n\n // The thumb is sized from measurements that jsdom cannot provide, so an\n // unmeasurable region falls back to a full-length thumb rather than a\n // zero-length one.\n const ratio = metrics.max > 0 && metrics.viewport > 0 ? metrics.viewport / (metrics.max + metrics.viewport) : 1\n const lengthPercent = Math.round(Math.min(Math.max(ratio, 0.1), 1) * 100)\n const offsetFraction = metrics.max > 0 ? metrics.offset / metrics.max : 0\n const thumbStyle = {\n '--vgui-scrollbar-thumb-length': `${lengthPercent}%`,\n '--vgui-scrollbar-thumb-offset': offsetFraction,\n } as CSSProperties\n\n return (\n <div\n ref={setRegionRef}\n className={classes.join(' ')}\n style={regionStyle}\n tabIndex={tabIndex ?? 0}\n data-disabled={disabled ? '' : undefined}\n onKeyDown={handleKeyDown}\n {...(drawn ? null : { onScroll: handleScroll })}\n {...rest}\n >\n {drawn ? (\n <>\n <div ref={contentRef} className=\"vgui-scroll-region__content\" onScroll={handleScroll}>\n {children}\n </div>\n <div className=\"vgui-scrollbar\" data-orientation={orientation} aria-hidden=\"true\">\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"vgui-scrollbar__button vgui-scrollbar__button--decrement\"\n onClick={() => step(-1)}\n >\n <span className={`vgui-scrollbar__glyph vgui-scrollbar__glyph--${vertical ? 'up' : 'left'}`} />\n </button>\n <div className=\"vgui-scrollbar__gutter\" onPointerDown={handleGutterPointerDown}>\n <div className=\"vgui-scrollbar__thumb\" style={thumbStyle} onPointerDown={handleThumbPointerDown} />\n </div>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"vgui-scrollbar__button vgui-scrollbar__button--increment\"\n onClick={() => step(1)}\n >\n <span className={`vgui-scrollbar__glyph vgui-scrollbar__glyph--${vertical ? 'down' : 'right'}`} />\n </button>\n </div>\n </>\n ) : (\n children\n )}\n </div>\n )\n})\n\nfunction cssLength(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value\n}\n\nScrollbar.displayName = 'Scrollbar'\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Scrollbar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Green Steam select — the VGUI `ComboBox` (docs/components/Select.md).
|
|
3
|
+
*
|
|
4
|
+
* Three details separate a real VGUI combobox from a styled `<select>` and all
|
|
5
|
+
* three are kept here:
|
|
6
|
+
*
|
|
7
|
+
* 1. The field half is a field: black `TextEntryBG` interior with the inset
|
|
8
|
+
* bevel a `TextEntry` has, so `--vgui-field-bg` paints the trigger.
|
|
9
|
+
* 2. The button half is 18px of its own raised control with its own bevel,
|
|
10
|
+
* not a background-image caret, which is what makes the separation read.
|
|
11
|
+
* 3. The popup is a `Menu`: `--vgui-surface-dark` face, one bevel-dark
|
|
12
|
+
* border, 18px rows and an `--vgui-accent-dark` selection bar.
|
|
13
|
+
*
|
|
14
|
+
* The caret is drawn with `clip-path` instead of the recipe's
|
|
15
|
+
* `mask-image: var(--vgui-glyph-caret-down)`: no glyph module or caret token
|
|
16
|
+
* exists in `src`, so the 7x4 triangle is traced inline. `--vgui-field-bg`
|
|
17
|
+
* (#000, field and popup interiors) is named by this doc but is absent from
|
|
18
|
+
* `src/styles/tokens.css`; no literal fallback is declared for it.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
.vgui-select {
|
|
22
|
+
/* Component-local metrics: the 19px field, 18px button half and 18px rows
|
|
23
|
+
* come from the CSS port, not from the theme (the theme's scale has no 19px
|
|
24
|
+
* and its 18px values are the scrollbar and the title bar). */
|
|
25
|
+
--vgui-select-height: 19px;
|
|
26
|
+
--vgui-select-button-width: 18px;
|
|
27
|
+
--vgui-select-option-height: 18px;
|
|
28
|
+
--vgui-select-list-max-height: 200px;
|
|
29
|
+
/* The caret gutter, reserved on every row so labels never shift when the
|
|
30
|
+
* selection moves. Sized to the 7px glyph plus the 4px inset. */
|
|
31
|
+
--vgui-select-check-width: 15px;
|
|
32
|
+
|
|
33
|
+
position: relative;
|
|
34
|
+
display: inline-block;
|
|
35
|
+
min-inline-size: 0;
|
|
36
|
+
font: inherit;
|
|
37
|
+
color: var(--vgui-text);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.vgui-select--small {
|
|
41
|
+
--vgui-select-height: 18px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.vgui-select--large {
|
|
45
|
+
--vgui-select-height: var(--vgui-control-height);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* --- The field half ------------------------------------------------------ */
|
|
49
|
+
|
|
50
|
+
.vgui-select__trigger,
|
|
51
|
+
.vgui-select__field {
|
|
52
|
+
box-sizing: border-box;
|
|
53
|
+
display: flex;
|
|
54
|
+
align-items: stretch;
|
|
55
|
+
inline-size: 100%;
|
|
56
|
+
min-block-size: var(--vgui-select-height);
|
|
57
|
+
padding: 0;
|
|
58
|
+
font: inherit;
|
|
59
|
+
color: inherit;
|
|
60
|
+
background-color: var(--vgui-field-bg);
|
|
61
|
+
border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
62
|
+
border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
63
|
+
border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
64
|
+
border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
65
|
+
border-radius: 0;
|
|
66
|
+
text-align: left;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* Open: `TextEntryBorderFocused` on the field. VGUI recolours the whole frame;
|
|
71
|
+
* the theme has no split light/dark focused bevel, so all four sides take the
|
|
72
|
+
* accent. */
|
|
73
|
+
.vgui-select--open .vgui-select__trigger,
|
|
74
|
+
.vgui-select--open .vgui-select__field {
|
|
75
|
+
border-color: var(--vgui-accent);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Invalid: the danger border sits on the light half, matching `TextInput`. */
|
|
79
|
+
.vgui-select--invalid .vgui-select__trigger,
|
|
80
|
+
.vgui-select--invalid .vgui-select__field {
|
|
81
|
+
border-top-color: var(--vgui-danger);
|
|
82
|
+
border-left-color: var(--vgui-danger);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.vgui-select__trigger:focus-visible,
|
|
86
|
+
.vgui-select__input:focus-visible {
|
|
87
|
+
outline: var(--vgui-focus-ring);
|
|
88
|
+
outline-offset: var(--vgui-focus-ring-offset);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Pixel-perfect rendering is opt-in, as in the theme layer. */
|
|
92
|
+
.vgui-crisp .vgui-select__trigger:focus-visible,
|
|
93
|
+
.vgui-crisp .vgui-select__input:focus-visible {
|
|
94
|
+
outline: var(--vgui-focus-ring-valve);
|
|
95
|
+
outline-offset: var(--vgui-focus-ring-valve-offset);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.vgui-select__value {
|
|
99
|
+
flex: 1 1 auto;
|
|
100
|
+
display: flex;
|
|
101
|
+
align-items: center;
|
|
102
|
+
min-inline-size: 0;
|
|
103
|
+
padding: 0 var(--vgui-field-inset);
|
|
104
|
+
overflow: hidden;
|
|
105
|
+
text-overflow: ellipsis;
|
|
106
|
+
white-space: nowrap;
|
|
107
|
+
text-align: left;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.vgui-select__value[data-placeholder='true'] {
|
|
111
|
+
color: var(--vgui-text-dim);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Editable: the field half is a text entry, so the caret is a text caret. */
|
|
115
|
+
.vgui-select__editable .vgui-select__field {
|
|
116
|
+
cursor: text;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.vgui-select__input {
|
|
120
|
+
flex: 1 1 auto;
|
|
121
|
+
min-inline-size: 0;
|
|
122
|
+
padding: 0 var(--vgui-field-inset);
|
|
123
|
+
font: inherit;
|
|
124
|
+
color: var(--vgui-text);
|
|
125
|
+
background-color: transparent;
|
|
126
|
+
border: 0;
|
|
127
|
+
border-radius: 0;
|
|
128
|
+
caret-color: var(--vgui-text);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.vgui-select__input::placeholder {
|
|
132
|
+
color: var(--vgui-text-dim);
|
|
133
|
+
opacity: 1;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.vgui-select__input::selection {
|
|
137
|
+
background-color: var(--vgui-selection-bg);
|
|
138
|
+
color: var(--vgui-selection-text);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* --- The button half ----------------------------------------------------- */
|
|
142
|
+
|
|
143
|
+
.vgui-select__button {
|
|
144
|
+
box-sizing: border-box;
|
|
145
|
+
flex: 0 0 var(--vgui-select-button-width);
|
|
146
|
+
align-self: stretch;
|
|
147
|
+
display: flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
justify-content: center;
|
|
150
|
+
margin: 0;
|
|
151
|
+
padding: 0;
|
|
152
|
+
background-color: var(--vgui-surface);
|
|
153
|
+
border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
154
|
+
border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
155
|
+
border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
156
|
+
border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
157
|
+
border-radius: 0;
|
|
158
|
+
cursor: pointer;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* The 7x4 caret, traced rather than masked: `--vgui-glyph-caret-down` and the
|
|
162
|
+
* shared glyph module the doc points at do not exist in `src`. */
|
|
163
|
+
.vgui-select__button::before {
|
|
164
|
+
content: '';
|
|
165
|
+
flex: none;
|
|
166
|
+
inline-size: 7px;
|
|
167
|
+
block-size: 4px;
|
|
168
|
+
background-color: var(--vgui-text);
|
|
169
|
+
clip-path: polygon(50% 0, 100% 100%, 0 100%);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Closed with the field untouched: identical to closed in every value, so
|
|
173
|
+
* there is deliberately no hover rule on the trigger. The button half is its
|
|
174
|
+
* own control and takes the usual raised-control hover. */
|
|
175
|
+
.vgui-select__button:hover {
|
|
176
|
+
background-color: var(--vgui-surface-light);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* --- Disabled ------------------------------------------------------------ */
|
|
180
|
+
|
|
181
|
+
.vgui-select--disabled .vgui-select__trigger,
|
|
182
|
+
.vgui-select--disabled .vgui-select__field {
|
|
183
|
+
cursor: not-allowed;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.vgui-select--disabled .vgui-select__value,
|
|
187
|
+
.vgui-select--disabled .vgui-select__input {
|
|
188
|
+
color: var(--vgui-text-disabled);
|
|
189
|
+
text-shadow: 1px 1px 0 var(--vgui-text-disabled-shadow);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.vgui-select--disabled .vgui-select__button,
|
|
193
|
+
.vgui-select--disabled .vgui-select__button:hover {
|
|
194
|
+
background-color: var(--vgui-surface);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.vgui-select--disabled .vgui-select__button::before {
|
|
198
|
+
background-color: var(--vgui-text-disabled);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* --- The popup (a Menu) -------------------------------------------------- */
|
|
202
|
+
|
|
203
|
+
.vgui-select__list {
|
|
204
|
+
position: absolute;
|
|
205
|
+
z-index: 100;
|
|
206
|
+
inset-inline: 0;
|
|
207
|
+
inset-block-start: 100%;
|
|
208
|
+
margin: 0;
|
|
209
|
+
padding: 0;
|
|
210
|
+
list-style: none;
|
|
211
|
+
max-block-size: var(--vgui-select-list-max-height);
|
|
212
|
+
overflow-y: auto;
|
|
213
|
+
background-color: var(--vgui-surface-dark);
|
|
214
|
+
border: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
215
|
+
/* VGUI let the popup paint straight over its siblings; a drop shadow is the
|
|
216
|
+
* only way to lift it off the page in the DOM. Bevel dark instead of the
|
|
217
|
+
* recipe's `rgb(0 0 0 / 0.35)`, which is a colour literal. */
|
|
218
|
+
box-shadow: 2px 2px 0 var(--vgui-bevel-dark);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.vgui-select__option {
|
|
222
|
+
position: relative;
|
|
223
|
+
display: flex;
|
|
224
|
+
align-items: center;
|
|
225
|
+
min-block-size: var(--vgui-select-option-height);
|
|
226
|
+
padding: 0 var(--vgui-field-inset);
|
|
227
|
+
padding-inline-start: var(--vgui-select-check-width);
|
|
228
|
+
color: var(--vgui-text);
|
|
229
|
+
cursor: default;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/* The selected row's non-colour cue: a checkmark, as later Steam builds drew.
|
|
233
|
+
* `content: ''` contributes nothing to the accessible name. */
|
|
234
|
+
.vgui-select__option::before {
|
|
235
|
+
content: '';
|
|
236
|
+
position: absolute;
|
|
237
|
+
inset-inline-start: var(--vgui-field-inset);
|
|
238
|
+
inset-block-start: 50%;
|
|
239
|
+
inline-size: 7px;
|
|
240
|
+
block-size: 7px;
|
|
241
|
+
translate: 0 -50%;
|
|
242
|
+
background-color: currentColor;
|
|
243
|
+
clip-path: polygon(
|
|
244
|
+
0 45%,
|
|
245
|
+
35% 100%,
|
|
246
|
+
100% 10%,
|
|
247
|
+
80% 0,
|
|
248
|
+
35% 68%,
|
|
249
|
+
18% 45%
|
|
250
|
+
);
|
|
251
|
+
opacity: 0;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* #232421 on #91863C is 4.22:1; the port's white is 3.70:1 and fails.
|
|
255
|
+
* `--vgui-selection-text` is exactly #232421. */
|
|
256
|
+
.vgui-select__option[aria-selected='true'] {
|
|
257
|
+
background-color: var(--vgui-accent-dark);
|
|
258
|
+
color: var(--vgui-selection-text);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.vgui-select__option[aria-selected='true']::before {
|
|
262
|
+
opacity: 1;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* The row the keyboard is on, painted exactly like `Menu`'s hovered row. */
|
|
266
|
+
.vgui-select__option[data-active='true'] {
|
|
267
|
+
background-color: var(--vgui-accent-dark);
|
|
268
|
+
color: var(--vgui-selection-text);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.vgui-select__option[aria-disabled='true'] {
|
|
272
|
+
color: var(--vgui-text-disabled);
|
|
273
|
+
text-shadow: 1px 1px 0 var(--vgui-text-disabled-shadow);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.vgui-select__option[aria-disabled='true']::before {
|
|
277
|
+
color: var(--vgui-text-disabled);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* --- Clay ---------------------------------------------------------------- */
|
|
281
|
+
|
|
282
|
+
/* `--clay` is a hook rather than a repaint, matching `TextInput`: the field
|
|
283
|
+
* stays black inside a property sheet and only the chrome turns grey. */
|
|
284
|
+
.vgui-select--clay .vgui-select__button {
|
|
285
|
+
background-color: var(--vgui-clay-button);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.vgui-select--clay .vgui-select__button:hover {
|
|
289
|
+
background-color: var(--vgui-clay-light);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.vgui-select--clay .vgui-select__button::before {
|
|
293
|
+
background-color: var(--vgui-clay-glyph);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.vgui-select--clay .vgui-select__trigger:disabled .vgui-select__value {
|
|
297
|
+
color: var(--vgui-clay-glyph-dim);
|
|
298
|
+
text-shadow: none;
|
|
299
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|