@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,119 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Green Steam splitter (`SplitterHandle` — a 3px recessed groove you drag).
|
|
3
|
+
*
|
|
4
|
+
* Two values in `docs/components/Splitter.md` have no token: the 3px groove
|
|
5
|
+
* width and the 8px invisible hit area, so both are local properties an
|
|
6
|
+
* application can widen without touching the component. The hit area is what
|
|
7
|
+
* keeps the 3px groove usable as a pointer target.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
.vgui-splitter {
|
|
11
|
+
--vgui-splitter-handle-size: 3px;
|
|
12
|
+
--vgui-splitter-hit-area: -8px;
|
|
13
|
+
|
|
14
|
+
display: grid;
|
|
15
|
+
min-width: 0;
|
|
16
|
+
min-height: 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.vgui-splitter--horizontal {
|
|
20
|
+
grid-template-columns: var(--vgui-splitter-size, 1fr) var(--vgui-splitter-handle-size) 1fr;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.vgui-splitter--vertical {
|
|
24
|
+
grid-template-rows: var(--vgui-splitter-size, 1fr) var(--vgui-splitter-handle-size) 1fr;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.vgui-splitter__handle {
|
|
28
|
+
/* Positioned so its hit area and grip paint above the panes. */
|
|
29
|
+
position: relative;
|
|
30
|
+
background-color: var(--vgui-surface-dark);
|
|
31
|
+
border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
32
|
+
border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
33
|
+
border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
34
|
+
border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
35
|
+
/* On the handle only — `touch-action` on the panes would break their scrolling. */
|
|
36
|
+
touch-action: none;
|
|
37
|
+
transition: background-color 100ms linear;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.vgui-splitter--horizontal .vgui-splitter__handle {
|
|
41
|
+
cursor: col-resize;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.vgui-splitter--vertical .vgui-splitter__handle {
|
|
45
|
+
cursor: row-resize;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.vgui-splitter__handle:hover,
|
|
49
|
+
.vgui-splitter__handle[data-dragging='true'] {
|
|
50
|
+
background-color: var(--vgui-surface);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.vgui-splitter__handle[aria-disabled='true'] {
|
|
54
|
+
cursor: default;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* A 3px groove is far below the 24x24 minimum target, so the pointer target is
|
|
59
|
+
* grown invisibly. It overlaps the panes by 8px on each side, which is the
|
|
60
|
+
* intended catch area next to the divider.
|
|
61
|
+
*/
|
|
62
|
+
.vgui-splitter__handle::before {
|
|
63
|
+
content: '';
|
|
64
|
+
position: absolute;
|
|
65
|
+
inset: var(--vgui-splitter-hit-area);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.vgui-splitter__handle:focus-visible {
|
|
69
|
+
outline: var(--vgui-focus-ring);
|
|
70
|
+
outline-offset: var(--vgui-focus-ring-offset);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.vgui-crisp .vgui-splitter__handle:focus-visible {
|
|
74
|
+
outline: var(--vgui-focus-ring-valve);
|
|
75
|
+
outline-offset: var(--vgui-focus-ring-valve-offset);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Three grip dots, centred on the groove. */
|
|
79
|
+
.vgui-splitter__handle-grip {
|
|
80
|
+
position: absolute;
|
|
81
|
+
top: 50%;
|
|
82
|
+
left: 50%;
|
|
83
|
+
transform: translate(-50%, -50%);
|
|
84
|
+
pointer-events: none;
|
|
85
|
+
background-image: radial-gradient(var(--vgui-bevel-light) 1px, transparent 1px);
|
|
86
|
+
background-size: 3px 3px;
|
|
87
|
+
background-position: center;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.vgui-splitter--horizontal .vgui-splitter__handle-grip {
|
|
91
|
+
width: 3px;
|
|
92
|
+
height: 7px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.vgui-splitter--vertical .vgui-splitter__handle-grip {
|
|
96
|
+
width: 7px;
|
|
97
|
+
height: 3px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* The faithful bare groove: no dots at all. */
|
|
101
|
+
.vgui-splitter--plain .vgui-splitter__handle-grip {
|
|
102
|
+
display: none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
* `min-width: 0` / `min-height: 0` are load-bearing: grid items default to
|
|
107
|
+
* `min-width: auto`, so one long line of content would freeze the divider.
|
|
108
|
+
*/
|
|
109
|
+
.vgui-splitter__pane {
|
|
110
|
+
min-width: 0;
|
|
111
|
+
min-height: 0;
|
|
112
|
+
overflow: auto;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@media (prefers-reduced-motion: reduce) {
|
|
116
|
+
.vgui-splitter__handle {
|
|
117
|
+
transition: none;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import './Splitter.css';
|
|
3
|
+
import '../../styles/scrollbars.css';
|
|
4
|
+
export interface SplitterProps extends HTMLAttributes<HTMLDivElement> {
|
|
5
|
+
/** Layout direction of the panes. */
|
|
6
|
+
orientation?: 'horizontal' | 'vertical';
|
|
7
|
+
/** Size of the first pane: a percentage, or a number of pixels. Uncontrolled. */
|
|
8
|
+
defaultSize?: number | string;
|
|
9
|
+
/** Controlled size of the first pane. Pair with `onResize`. */
|
|
10
|
+
size?: number | string;
|
|
11
|
+
/** Called with the new size while dragging and after keyboard nudges. */
|
|
12
|
+
onResize?: (size: number | string) => void;
|
|
13
|
+
/** Smallest the first pane may become, in pixels. */
|
|
14
|
+
minSize?: number;
|
|
15
|
+
/** Largest the first pane may become, in pixels. */
|
|
16
|
+
maxSize?: number;
|
|
17
|
+
/** Accessible name; defaults to "Resize panel". */
|
|
18
|
+
label?: string;
|
|
19
|
+
/** Content for the first pane. */
|
|
20
|
+
first: ReactNode;
|
|
21
|
+
/** Content for the second pane. */
|
|
22
|
+
second: ReactNode;
|
|
23
|
+
}
|
|
24
|
+
export declare const Splitter: import("react").ForwardRefExoticComponent<SplitterProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
25
|
+
//# sourceMappingURL=Splitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Splitter.d.ts","sourceRoot":"","sources":["../../../src/components/Splitter/Splitter.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EAGd,SAAS,EACV,MAAM,OAAO,CAAA;AAEd,OAAO,gBAAgB,CAAA;AACvB,OAAO,6BAA6B,CAAA;AAiCpC,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,cAAc,CAAC;IACnE,qCAAqC;IACrC,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IACvC,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;IAC1C,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,KAAK,EAAE,SAAS,CAAA;IAChB,mCAAmC;IACnC,MAAM,EAAE,SAAS,CAAA;CAClB;AAED,eAAO,MAAM,QAAQ,0GAgPnB,CAAA"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { forwardRef, useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import "../../styles/scrollbars.css";
|
|
4
|
+
import "./Splitter.css";
|
|
5
|
+
//#region src/components/Splitter/Splitter.tsx
|
|
6
|
+
/** Arrow-key nudge in pixels; `Shift` drops to a single pixel. */
|
|
7
|
+
var STEP = 10;
|
|
8
|
+
var FINE_STEP = 1;
|
|
9
|
+
function toPixels(value) {
|
|
10
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : null;
|
|
11
|
+
if (typeof value === "string") {
|
|
12
|
+
const match = /^(-?\d+(?:\.\d+)?)px$/.exec(value.trim());
|
|
13
|
+
if (match) return Number(match[1]);
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
function toPercent(value) {
|
|
18
|
+
if (typeof value !== "string") return null;
|
|
19
|
+
const match = /^(-?\d+(?:\.\d+)?)%$/.exec(value.trim());
|
|
20
|
+
return match ? Number(match[1]) : null;
|
|
21
|
+
}
|
|
22
|
+
/** A number is a pixel count; a string is passed through, `%` included. */
|
|
23
|
+
function toCssSize(value) {
|
|
24
|
+
return typeof value === "number" ? `${value}px` : value;
|
|
25
|
+
}
|
|
26
|
+
function clamp(value, min, max) {
|
|
27
|
+
let next = value;
|
|
28
|
+
if (min !== void 0) next = Math.max(next, min);
|
|
29
|
+
if (max !== void 0) next = Math.min(next, max);
|
|
30
|
+
return next;
|
|
31
|
+
}
|
|
32
|
+
var Splitter = forwardRef(function Splitter({ orientation = "horizontal", defaultSize, size, onResize, minSize, maxSize, label = "Resize panel", first, second, className, style, ...rest }, ref) {
|
|
33
|
+
const rootRef = useRef(null);
|
|
34
|
+
const [internalSize, setInternalSize] = useState(defaultSize);
|
|
35
|
+
const [extent, setExtent] = useState(0);
|
|
36
|
+
const draggingRef = useRef(null);
|
|
37
|
+
const [dragging, setDragging] = useState(false);
|
|
38
|
+
const isControlled = size !== void 0;
|
|
39
|
+
const currentSize = isControlled ? size : internalSize;
|
|
40
|
+
const percent = toPercent(currentSize);
|
|
41
|
+
const pixels = toPixels(currentSize);
|
|
42
|
+
const ariaDisabled = rest["aria-disabled"];
|
|
43
|
+
const disabled = ariaDisabled === true || ariaDisabled === "true";
|
|
44
|
+
useLayoutEffect(() => {
|
|
45
|
+
const node = rootRef.current;
|
|
46
|
+
if (!node) return;
|
|
47
|
+
const measure = () => {
|
|
48
|
+
const rect = node.getBoundingClientRect();
|
|
49
|
+
setExtent(orientation === "horizontal" ? rect.width : rect.height);
|
|
50
|
+
};
|
|
51
|
+
measure();
|
|
52
|
+
window.addEventListener("resize", measure);
|
|
53
|
+
return () => window.removeEventListener("resize", measure);
|
|
54
|
+
}, [orientation]);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (!dragging) return;
|
|
57
|
+
const previous = document.body.style.userSelect;
|
|
58
|
+
document.body.style.userSelect = "none";
|
|
59
|
+
return () => {
|
|
60
|
+
document.body.style.userSelect = previous;
|
|
61
|
+
};
|
|
62
|
+
}, [dragging]);
|
|
63
|
+
const measureNow = () => {
|
|
64
|
+
const node = rootRef.current;
|
|
65
|
+
if (!node) return extent;
|
|
66
|
+
const rect = node.getBoundingClientRect();
|
|
67
|
+
const measured = orientation === "horizontal" ? rect.width : rect.height;
|
|
68
|
+
return measured > 0 ? measured : extent;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* The gesture is always a pixel delta, so the current size has to become one.
|
|
72
|
+
* A pixel size always can; a percentage needs a laid-out container.
|
|
73
|
+
*/
|
|
74
|
+
const basePixels = () => {
|
|
75
|
+
if (pixels !== null) return pixels;
|
|
76
|
+
if (currentSize === void 0) {
|
|
77
|
+
const total = measureNow();
|
|
78
|
+
return total > 0 ? total / 2 : null;
|
|
79
|
+
}
|
|
80
|
+
if (percent !== null) {
|
|
81
|
+
const total = measureNow();
|
|
82
|
+
if (total > 0) return percent / 100 * total;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
};
|
|
86
|
+
const commit = (next) => {
|
|
87
|
+
if (!isControlled) setInternalSize(next);
|
|
88
|
+
onResize?.(next);
|
|
89
|
+
};
|
|
90
|
+
const resizeBy = (delta) => {
|
|
91
|
+
const base = basePixels();
|
|
92
|
+
if (base === null) return;
|
|
93
|
+
commit(clamp(base + delta, minSize, maxSize));
|
|
94
|
+
};
|
|
95
|
+
const axisPosition = (event) => orientation === "horizontal" ? event.clientX : event.clientY;
|
|
96
|
+
const handlePointerDown = (event) => {
|
|
97
|
+
if (disabled || event.button !== 0) return;
|
|
98
|
+
draggingRef.current = {
|
|
99
|
+
origin: axisPosition(event),
|
|
100
|
+
base: basePixels()
|
|
101
|
+
};
|
|
102
|
+
setDragging(true);
|
|
103
|
+
if (typeof event.currentTarget.setPointerCapture === "function") event.currentTarget.setPointerCapture(event.pointerId);
|
|
104
|
+
};
|
|
105
|
+
const handlePointerMove = (event) => {
|
|
106
|
+
const drag = draggingRef.current;
|
|
107
|
+
if (!drag || drag.base === null) return;
|
|
108
|
+
commit(clamp(drag.base + (axisPosition(event) - drag.origin), minSize, maxSize));
|
|
109
|
+
};
|
|
110
|
+
const handlePointerUp = (event) => {
|
|
111
|
+
if (!draggingRef.current) return;
|
|
112
|
+
draggingRef.current = null;
|
|
113
|
+
setDragging(false);
|
|
114
|
+
const target = event.currentTarget;
|
|
115
|
+
if (typeof target.hasPointerCapture === "function" && target.hasPointerCapture(event.pointerId)) target.releasePointerCapture(event.pointerId);
|
|
116
|
+
};
|
|
117
|
+
const handleKeyDown = (event) => {
|
|
118
|
+
if (disabled) return;
|
|
119
|
+
const increase = orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
|
|
120
|
+
const decrease = orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
|
|
121
|
+
const step = event.shiftKey ? FINE_STEP : STEP;
|
|
122
|
+
let handled = true;
|
|
123
|
+
if (event.key === increase) resizeBy(step);
|
|
124
|
+
else if (event.key === decrease) resizeBy(-step);
|
|
125
|
+
else if (event.key === "Home") {
|
|
126
|
+
const base = minSize ?? 0;
|
|
127
|
+
if (!isControlled) setInternalSize(base);
|
|
128
|
+
onResize?.(base);
|
|
129
|
+
} else if (event.key === "End") {
|
|
130
|
+
const base = maxSize ?? measureNow();
|
|
131
|
+
if (base > 0) {
|
|
132
|
+
if (!isControlled) setInternalSize(base);
|
|
133
|
+
onResize?.(base);
|
|
134
|
+
}
|
|
135
|
+
} else handled = false;
|
|
136
|
+
if (handled) event.preventDefault();
|
|
137
|
+
};
|
|
138
|
+
let valueNow;
|
|
139
|
+
let valueMin;
|
|
140
|
+
let valueMax;
|
|
141
|
+
let valueText;
|
|
142
|
+
if (percent !== null) {
|
|
143
|
+
valueMin = extent > 0 && minSize !== void 0 ? Math.round(minSize / extent * 100) : 0;
|
|
144
|
+
valueMax = extent > 0 && maxSize !== void 0 ? Math.round(maxSize / extent * 100) : 100;
|
|
145
|
+
valueNow = Math.round(clamp(percent, valueMin, valueMax));
|
|
146
|
+
valueText = `${valueNow} percent`;
|
|
147
|
+
} else if (pixels !== null) {
|
|
148
|
+
valueMin = Math.round(minSize ?? 0);
|
|
149
|
+
valueMax = Math.round(maxSize ?? (extent > 0 ? extent : Math.max(pixels, valueMin)));
|
|
150
|
+
valueNow = Math.round(clamp(pixels, valueMin, valueMax));
|
|
151
|
+
valueText = `${valueNow} pixels`;
|
|
152
|
+
} else {
|
|
153
|
+
valueMin = 0;
|
|
154
|
+
valueMax = 100;
|
|
155
|
+
valueNow = 50;
|
|
156
|
+
valueText = "50 percent";
|
|
157
|
+
}
|
|
158
|
+
const sizeStyle = currentSize === void 0 ? void 0 : { "--vgui-splitter-size": toCssSize(currentSize) };
|
|
159
|
+
const classes = ["vgui-splitter", `vgui-splitter--${orientation}`];
|
|
160
|
+
if (className) classes.push(className);
|
|
161
|
+
const setRoot = (node) => {
|
|
162
|
+
rootRef.current = node;
|
|
163
|
+
if (typeof ref === "function") ref(node);
|
|
164
|
+
else if (ref) ref.current = node;
|
|
165
|
+
};
|
|
166
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
167
|
+
ref: setRoot,
|
|
168
|
+
className: classes.join(" "),
|
|
169
|
+
style: {
|
|
170
|
+
...sizeStyle,
|
|
171
|
+
...style
|
|
172
|
+
},
|
|
173
|
+
...rest,
|
|
174
|
+
children: [
|
|
175
|
+
/* @__PURE__ */ jsx("div", {
|
|
176
|
+
className: "vgui-splitter__pane vgui-splitter__pane--first vgui-scroll-surface",
|
|
177
|
+
children: first
|
|
178
|
+
}),
|
|
179
|
+
/* @__PURE__ */ jsx("div", {
|
|
180
|
+
className: "vgui-splitter__handle",
|
|
181
|
+
role: "separator",
|
|
182
|
+
tabIndex: disabled ? -1 : 0,
|
|
183
|
+
"aria-label": label,
|
|
184
|
+
"aria-orientation": orientation === "horizontal" ? "vertical" : "horizontal",
|
|
185
|
+
"aria-disabled": disabled ? true : void 0,
|
|
186
|
+
"aria-valuenow": valueNow,
|
|
187
|
+
"aria-valuemin": valueMin,
|
|
188
|
+
"aria-valuemax": valueMax,
|
|
189
|
+
"aria-valuetext": valueText,
|
|
190
|
+
"data-dragging": dragging ? "true" : void 0,
|
|
191
|
+
onPointerDown: handlePointerDown,
|
|
192
|
+
onPointerMove: handlePointerMove,
|
|
193
|
+
onPointerUp: handlePointerUp,
|
|
194
|
+
onPointerCancel: handlePointerUp,
|
|
195
|
+
onKeyDown: handleKeyDown,
|
|
196
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
197
|
+
className: "vgui-splitter__handle-grip",
|
|
198
|
+
"aria-hidden": "true"
|
|
199
|
+
})
|
|
200
|
+
}),
|
|
201
|
+
/* @__PURE__ */ jsx("div", {
|
|
202
|
+
className: "vgui-splitter__pane vgui-splitter__pane--second vgui-scroll-surface",
|
|
203
|
+
children: second
|
|
204
|
+
})
|
|
205
|
+
]
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
Splitter.displayName = "Splitter";
|
|
209
|
+
//#endregion
|
|
210
|
+
export { Splitter };
|
|
211
|
+
|
|
212
|
+
//# sourceMappingURL=Splitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Splitter.js","names":[],"sources":["../../../src/components/Splitter/Splitter.tsx"],"sourcesContent":["import { forwardRef, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport type {\n CSSProperties,\n HTMLAttributes,\n KeyboardEvent as ReactKeyboardEvent,\n PointerEvent as ReactPointerEvent,\n ReactNode,\n} from 'react'\n\nimport './Splitter.css'\nimport '../../styles/scrollbars.css'\n\n/** Arrow-key nudge in pixels; `Shift` drops to a single pixel. */\nconst STEP = 10\nconst FINE_STEP = 1\n\nfunction toPixels(value: number | string | undefined): number | null {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null\n if (typeof value === 'string') {\n const match = /^(-?\\d+(?:\\.\\d+)?)px$/.exec(value.trim())\n if (match) return Number(match[1])\n }\n return null\n}\n\nfunction toPercent(value: number | string | undefined): number | null {\n if (typeof value !== 'string') return null\n const match = /^(-?\\d+(?:\\.\\d+)?)%$/.exec(value.trim())\n return match ? Number(match[1]) : null\n}\n\n/** A number is a pixel count; a string is passed through, `%` included. */\nfunction toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value\n}\n\nfunction clamp(value: number, min?: number, max?: number): number {\n let next = value\n if (min !== undefined) next = Math.max(next, min)\n if (max !== undefined) next = Math.min(next, max)\n return next\n}\n\nexport interface SplitterProps extends HTMLAttributes<HTMLDivElement> {\n /** Layout direction of the panes. */\n orientation?: 'horizontal' | 'vertical'\n /** Size of the first pane: a percentage, or a number of pixels. Uncontrolled. */\n defaultSize?: number | string\n /** Controlled size of the first pane. Pair with `onResize`. */\n size?: number | string\n /** Called with the new size while dragging and after keyboard nudges. */\n onResize?: (size: number | string) => void\n /** Smallest the first pane may become, in pixels. */\n minSize?: number\n /** Largest the first pane may become, in pixels. */\n maxSize?: number\n /** Accessible name; defaults to \"Resize panel\". */\n label?: string\n /** Content for the first pane. */\n first: ReactNode\n /** Content for the second pane. */\n second: ReactNode\n}\n\nexport const Splitter = forwardRef<HTMLDivElement, SplitterProps>(function Splitter(\n {\n orientation = 'horizontal',\n defaultSize,\n size,\n onResize,\n minSize,\n maxSize,\n label = 'Resize panel',\n first,\n second,\n className,\n style,\n ...rest\n },\n ref,\n) {\n const rootRef = useRef<HTMLDivElement | null>(null)\n const [internalSize, setInternalSize] = useState<number | string | undefined>(defaultSize)\n const [extent, setExtent] = useState(0)\n const draggingRef = useRef<{ origin: number; base: number | null } | null>(null)\n const [dragging, setDragging] = useState(false)\n\n const isControlled = size !== undefined\n const currentSize = isControlled ? size : internalSize\n const percent = toPercent(currentSize)\n const pixels = toPixels(currentSize)\n\n /*\n * `aria-disabled` is the documented way to switch the handle off, so it is\n * mirrored onto the handle (where the widget lives) instead of being passed\n * through to the container only.\n */\n const ariaDisabled = rest['aria-disabled']\n const disabled = ariaDisabled === true || ariaDisabled === 'true'\n\n /*\n * jsdom has no layout engine, so every measurement path has to survive a\n * zero-sized rect: `extent` stays 0 and pixel sizes simply cannot be turned\n * into proportions, which is exactly what the guards below fall back on.\n */\n useLayoutEffect(() => {\n const node = rootRef.current\n if (!node) return\n\n const measure = () => {\n const rect = node.getBoundingClientRect()\n setExtent(orientation === 'horizontal' ? rect.width : rect.height)\n }\n\n measure()\n window.addEventListener('resize', measure)\n return () => window.removeEventListener('resize', measure)\n }, [orientation])\n\n useEffect(() => {\n if (!dragging) return\n\n const previous = document.body.style.userSelect\n document.body.style.userSelect = 'none'\n return () => {\n document.body.style.userSelect = previous\n }\n }, [dragging])\n\n const measureNow = () => {\n const node = rootRef.current\n if (!node) return extent\n const rect = node.getBoundingClientRect()\n const measured = orientation === 'horizontal' ? rect.width : rect.height\n return measured > 0 ? measured : extent\n }\n\n /**\n * The gesture is always a pixel delta, so the current size has to become one.\n * A pixel size always can; a percentage needs a laid-out container.\n */\n const basePixels = (): number | null => {\n if (pixels !== null) return pixels\n if (currentSize === undefined) {\n const total = measureNow()\n return total > 0 ? total / 2 : null\n }\n if (percent !== null) {\n const total = measureNow()\n if (total > 0) return (percent / 100) * total\n }\n return null\n }\n\n const commit = (next: number) => {\n if (!isControlled) setInternalSize(next)\n onResize?.(next)\n }\n\n const resizeBy = (delta: number) => {\n const base = basePixels()\n if (base === null) return\n commit(clamp(base + delta, minSize, maxSize))\n }\n\n const axisPosition = (event: ReactPointerEvent<HTMLDivElement>) =>\n orientation === 'horizontal' ? event.clientX : event.clientY\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled || event.button !== 0) return\n\n // An unresolvable base (jsdom, or an unmeasurable percentage) leaves the\n // gesture live but makes every move a no-op, mirroring the keyboard.\n draggingRef.current = { origin: axisPosition(event), base: basePixels() }\n setDragging(true)\n\n if (typeof event.currentTarget.setPointerCapture === 'function') {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n }\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const drag = draggingRef.current\n if (!drag || drag.base === null) return\n\n commit(clamp(drag.base + (axisPosition(event) - drag.origin), minSize, maxSize))\n }\n\n const handlePointerUp = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current) return\n\n draggingRef.current = null\n setDragging(false)\n\n const target = event.currentTarget\n if (typeof target.hasPointerCapture === 'function' && target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId)\n }\n }\n\n /* Drag-only resizing is a WCAG 2.1.1 failure, so the separator is a widget. */\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n\n const increase = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const decrease = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const step = event.shiftKey ? FINE_STEP : STEP\n\n let handled = true\n\n if (event.key === increase) resizeBy(step)\n else if (event.key === decrease) resizeBy(-step)\n else if (event.key === 'Home') {\n const base = minSize ?? 0\n if (!isControlled) setInternalSize(base)\n onResize?.(base)\n } else if (event.key === 'End') {\n const base = maxSize ?? measureNow()\n if (base > 0) {\n if (!isControlled) setInternalSize(base)\n onResize?.(base)\n }\n } else handled = false\n\n if (handled) event.preventDefault()\n }\n\n /*\n * Two scales, never mixed: a percentage size is a proportion of an unknown\n * container, so min/max are converted only when the container can be\n * measured. A pixel size reports pixels, and an undeclared size is the\n * `1fr / 1fr` default — an even half.\n */\n let valueNow: number\n let valueMin: number\n let valueMax: number\n let valueText: string\n\n if (percent !== null) {\n valueMin = extent > 0 && minSize !== undefined ? Math.round((minSize / extent) * 100) : 0\n valueMax = extent > 0 && maxSize !== undefined ? Math.round((maxSize / extent) * 100) : 100\n valueNow = Math.round(clamp(percent, valueMin, valueMax))\n valueText = `${valueNow} percent`\n } else if (pixels !== null) {\n valueMin = Math.round(minSize ?? 0)\n valueMax = Math.round(maxSize ?? (extent > 0 ? extent : Math.max(pixels, valueMin)))\n valueNow = Math.round(clamp(pixels, valueMin, valueMax))\n valueText = `${valueNow} pixels`\n } else {\n valueMin = 0\n valueMax = 100\n valueNow = 50\n valueText = '50 percent'\n }\n\n const sizeStyle =\n currentSize === undefined\n ? undefined\n : ({ '--vgui-splitter-size': toCssSize(currentSize) } as unknown as CSSProperties)\n\n const classes = ['vgui-splitter', `vgui-splitter--${orientation}`]\n if (className) classes.push(className)\n\n const setRoot = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }\n\n return (\n <div\n ref={setRoot}\n className={classes.join(' ')}\n style={{ ...sizeStyle, ...style }}\n {...rest}\n >\n <div className=\"vgui-splitter__pane vgui-splitter__pane--first vgui-scroll-surface\">{first}</div>\n <div\n className=\"vgui-splitter__handle\"\n role=\"separator\"\n tabIndex={disabled ? -1 : 0}\n aria-label={label}\n /*\n * The separator's own orientation, per ARIA — a horizontal split has a\n * vertical bar between the panes. It is also what the arrow keys follow.\n */\n aria-orientation={orientation === 'horizontal' ? 'vertical' : 'horizontal'}\n aria-disabled={disabled ? true : undefined}\n aria-valuenow={valueNow}\n aria-valuemin={valueMin}\n aria-valuemax={valueMax}\n aria-valuetext={valueText}\n data-dragging={dragging ? 'true' : undefined}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onKeyDown={handleKeyDown}\n >\n <span className=\"vgui-splitter__handle-grip\" aria-hidden=\"true\" />\n </div>\n <div className=\"vgui-splitter__pane vgui-splitter__pane--second vgui-scroll-surface\">{second}</div>\n </div>\n )\n})\n\nSplitter.displayName = 'Splitter'\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Splitter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Green Steam status bar.
|
|
3
|
+
*
|
|
4
|
+
* A 28px strip: a `StatusLabel`, an optional slim progress bar, and nothing
|
|
5
|
+
* else (docs/components/StatusBar.md). The strip is chrome — `flex: none` so it
|
|
6
|
+
* never scrolls away with the content.
|
|
7
|
+
*
|
|
8
|
+
* The slim bar is `SlimProgressBar`, not `ProgressBar`: one flat `fill()` call
|
|
9
|
+
* in the corpus, so a single `background-color` here. Give it a bevel and a 3px
|
|
10
|
+
* bar has a 1px interior.
|
|
11
|
+
*
|
|
12
|
+
* The fill also carries a non-colour boundary cue (`--vgui-bevel-light-strong`
|
|
13
|
+
* on its leading edge) because the fill/trough pair measures 2.77:1 and the 3px
|
|
14
|
+
* height compounds it (docs/components/StatusBar.md, Accessibility).
|
|
15
|
+
*
|
|
16
|
+
* Component-local metrics are declared here per foundations.md §4; palette
|
|
17
|
+
* tokens are referenced bare.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
.vgui-status-bar {
|
|
21
|
+
--vgui-status-bar-height: 28px;
|
|
22
|
+
--vgui-status-bar-progress-width: 300px;
|
|
23
|
+
--vgui-status-bar-progress-height: 3px;
|
|
24
|
+
|
|
25
|
+
box-sizing: border-box;
|
|
26
|
+
display: flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
justify-content: center; /* the corpus places both children centred */
|
|
29
|
+
gap: 8px;
|
|
30
|
+
min-block-size: var(--vgui-status-bar-height);
|
|
31
|
+
padding-block: 0;
|
|
32
|
+
padding-inline: 8px;
|
|
33
|
+
background-color: var(--vgui-surface);
|
|
34
|
+
border-block-start: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
35
|
+
color: var(--vgui-text-muted);
|
|
36
|
+
font: inherit;
|
|
37
|
+
font-size: var(--vgui-font-size);
|
|
38
|
+
flex: none;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* The slim bar — one flat fill, no bevel, no stripes. */
|
|
42
|
+
.vgui-status-bar__progress {
|
|
43
|
+
box-sizing: border-box;
|
|
44
|
+
flex: none;
|
|
45
|
+
inline-size: var(--vgui-status-bar-progress-width);
|
|
46
|
+
block-size: var(--vgui-status-bar-progress-height);
|
|
47
|
+
overflow: hidden;
|
|
48
|
+
background-color: var(--vgui-surface-dark);
|
|
49
|
+
border: 0; /* barinset=0 */
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.vgui-status-bar__progress > * {
|
|
53
|
+
box-sizing: border-box;
|
|
54
|
+
block-size: 100%;
|
|
55
|
+
background-color: var(--vgui-accent-darker);
|
|
56
|
+
border-inline-end: var(--vgui-bevel-width) solid var(--vgui-bevel-light-strong);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* The 3px bar conveys nothing to a low-vision user, so the percentage is text. */
|
|
60
|
+
.vgui-status-bar__value {
|
|
61
|
+
flex: none;
|
|
62
|
+
font-size: var(--vgui-font-size-small);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/*
|
|
66
|
+
* Multi-field strip: the "bottom strip of status fields" case. Same height, same
|
|
67
|
+
* separator, children laid out in a row.
|
|
68
|
+
*/
|
|
69
|
+
.vgui-status-bar--fields {
|
|
70
|
+
justify-content: flex-start;
|
|
71
|
+
gap: 16px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.vgui-status-bar--fields > *:last-child {
|
|
75
|
+
margin-inline-start: auto;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/*
|
|
79
|
+
* `--message-only` is the default layout with the progress region omitted, so
|
|
80
|
+
* the modifier declares nothing itself; it is emitted so a caller can target the
|
|
81
|
+
* state.
|
|
82
|
+
*/
|
|
83
|
+
.vgui-status-bar--left {
|
|
84
|
+
justify-content: flex-start;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.vgui-status-bar--left .vgui-status-bar__message {
|
|
88
|
+
min-inline-size: 16ch; /* reserved so the bar does not slide as text changes */
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.vgui-status-bar--compact {
|
|
92
|
+
--vgui-status-bar-height: 20px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.vgui-status-bar--error .vgui-status-bar__message {
|
|
96
|
+
color: var(--vgui-danger);
|
|
97
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import './StatusBar.css';
|
|
3
|
+
export interface StatusBarProps extends HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
/** The status message. Rendered through StatusLabel (uppercase by default). */
|
|
5
|
+
message?: ReactNode;
|
|
6
|
+
/** Progress 0–100. Omit to hide the bar entirely. */
|
|
7
|
+
value?: number;
|
|
8
|
+
/** Render the progress region as indeterminate instead of a bar. */
|
|
9
|
+
busy?: boolean;
|
|
10
|
+
/** Turn the message into a link, as every corpus status string is. */
|
|
11
|
+
href?: string;
|
|
12
|
+
/** Left-align instead of centring the message and bar. */
|
|
13
|
+
align?: 'center' | 'left';
|
|
14
|
+
/** Show the numeric percentage beside the bar. */
|
|
15
|
+
showValue?: boolean;
|
|
16
|
+
/** Actionable failure state. Pairs with a details affordance. */
|
|
17
|
+
error?: boolean;
|
|
18
|
+
/** Compact 20px strip. */
|
|
19
|
+
compact?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare const StatusBar: import("react").ForwardRefExoticComponent<StatusBarProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
22
|
+
//# sourceMappingURL=StatusBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../src/components/StatusBar/StatusBar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtD,OAAO,iBAAiB,CAAA;AAExB,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,cAAc,CAAC;IACpE,+EAA+E;IAC/E,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACzB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,SAAS,2GAkEpB,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Spinner } from "../Spinner/Spinner.js";
|
|
2
|
+
import { StatusLabel } from "../StatusLabel/StatusLabel.js";
|
|
3
|
+
import { forwardRef, useId } from "react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import "./StatusBar.css";
|
|
6
|
+
//#region src/components/StatusBar/StatusBar.tsx
|
|
7
|
+
var StatusBar = forwardRef(function StatusBar({ className, message, value, busy = false, href, align = "center", showValue = false, error = false, compact = false, children, ...rest }, ref) {
|
|
8
|
+
const messageId = useId();
|
|
9
|
+
const hasChildren = children !== void 0 && children !== null;
|
|
10
|
+
const hasMessage = message !== void 0 && message !== null;
|
|
11
|
+
const hasBar = !busy && value !== void 0;
|
|
12
|
+
const percent = Math.min(100, Math.max(0, value ?? 0));
|
|
13
|
+
const classes = ["vgui-status-bar"];
|
|
14
|
+
if (hasMessage && !busy && value === void 0) classes.push("vgui-status-bar--message-only");
|
|
15
|
+
if (align === "left") classes.push("vgui-status-bar--left");
|
|
16
|
+
if (compact) classes.push("vgui-status-bar--compact");
|
|
17
|
+
if (hasChildren) classes.push("vgui-status-bar--fields");
|
|
18
|
+
if (error) classes.push("vgui-status-bar--error");
|
|
19
|
+
if (className) classes.push(className);
|
|
20
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
21
|
+
ref,
|
|
22
|
+
role: "contentinfo",
|
|
23
|
+
className: classes.join(" "),
|
|
24
|
+
...rest,
|
|
25
|
+
children: [
|
|
26
|
+
hasMessage && /* @__PURE__ */ jsx(StatusLabel, {
|
|
27
|
+
className: "vgui-status-bar__message",
|
|
28
|
+
id: messageId,
|
|
29
|
+
href,
|
|
30
|
+
live: "polite",
|
|
31
|
+
children: message
|
|
32
|
+
}),
|
|
33
|
+
children,
|
|
34
|
+
busy && /* @__PURE__ */ jsx(Spinner, {}),
|
|
35
|
+
hasBar && /* @__PURE__ */ jsx("div", {
|
|
36
|
+
className: "vgui-status-bar__progress",
|
|
37
|
+
role: "progressbar",
|
|
38
|
+
"aria-valuemin": 0,
|
|
39
|
+
"aria-valuemax": 100,
|
|
40
|
+
"aria-valuenow": percent,
|
|
41
|
+
"aria-labelledby": hasMessage ? messageId : void 0,
|
|
42
|
+
"aria-label": hasMessage ? void 0 : "Progress",
|
|
43
|
+
children: /* @__PURE__ */ jsx("div", { style: { width: `${percent}%` } })
|
|
44
|
+
}),
|
|
45
|
+
hasBar && showValue && /* @__PURE__ */ jsxs("span", {
|
|
46
|
+
className: "vgui-status-bar__value",
|
|
47
|
+
children: [percent, "%"]
|
|
48
|
+
})
|
|
49
|
+
]
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
StatusBar.displayName = "StatusBar";
|
|
53
|
+
//#endregion
|
|
54
|
+
export { StatusBar };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.js","names":[],"sources":["../../../src/components/StatusBar/StatusBar.tsx"],"sourcesContent":["import { forwardRef, useId } from 'react'\nimport type { HTMLAttributes, ReactNode } from 'react'\n\nimport { Spinner } from '../Spinner'\nimport { StatusLabel } from '../StatusLabel'\n\nimport './StatusBar.css'\n\nexport interface StatusBarProps extends HTMLAttributes<HTMLDivElement> {\n /** The status message. Rendered through StatusLabel (uppercase by default). */\n message?: ReactNode\n /** Progress 0–100. Omit to hide the bar entirely. */\n value?: number\n /** Render the progress region as indeterminate instead of a bar. */\n busy?: boolean\n /** Turn the message into a link, as every corpus status string is. */\n href?: string\n /** Left-align instead of centring the message and bar. */\n align?: 'center' | 'left'\n /** Show the numeric percentage beside the bar. */\n showValue?: boolean\n /** Actionable failure state. Pairs with a details affordance. */\n error?: boolean\n /** Compact 20px strip. */\n compact?: boolean\n}\n\nexport const StatusBar = forwardRef<HTMLDivElement, StatusBarProps>(function StatusBar(\n {\n className,\n message,\n value,\n busy = false,\n href,\n align = 'center',\n showValue = false,\n error = false,\n compact = false,\n children,\n ...rest\n },\n ref,\n) {\n const messageId = useId()\n const hasChildren = children !== undefined && children !== null\n const hasMessage = message !== undefined && message !== null\n const hasBar = !busy && value !== undefined\n const percent = Math.min(100, Math.max(0, value ?? 0))\n\n const classes = ['vgui-status-bar']\n if (hasMessage && !busy && value === undefined) classes.push('vgui-status-bar--message-only')\n if (align === 'left') classes.push('vgui-status-bar--left')\n if (compact) classes.push('vgui-status-bar--compact')\n if (hasChildren) classes.push('vgui-status-bar--fields')\n if (error) classes.push('vgui-status-bar--error')\n if (className) classes.push(className)\n\n return (\n <div ref={ref} role=\"contentinfo\" className={classes.join(' ')} {...rest}>\n {hasMessage && (\n <StatusLabel\n className=\"vgui-status-bar__message\"\n id={messageId}\n href={href}\n live=\"polite\"\n >\n {message}\n </StatusLabel>\n )}\n\n {children}\n\n {busy && <Spinner />}\n\n {hasBar && (\n <div\n className=\"vgui-status-bar__progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-labelledby={hasMessage ? messageId : undefined}\n aria-label={hasMessage ? undefined : 'Progress'}\n >\n <div style={{ width: `${percent}%` }} />\n </div>\n )}\n\n {hasBar && showValue && (\n <span className=\"vgui-status-bar__value\">{percent}%</span>\n )}\n </div>\n )\n})\n\nStatusBar.displayName = 'StatusBar'\n"],"mappings":";;;;;;AA2BA,IAAa,YAAY,WAA2C,SAAS,UAC3E,EACE,WACA,SACA,OACA,OAAO,OACP,MACA,QAAQ,UACR,YAAY,OACZ,QAAQ,OACR,UAAU,OACV,UACA,GAAG,QAEL,KACA;CACA,MAAM,YAAY,MAAM;CACxB,MAAM,cAAc,aAAa,KAAA,KAAa,aAAa;CAC3D,MAAM,aAAa,YAAY,KAAA,KAAa,YAAY;CACxD,MAAM,SAAS,CAAC,QAAQ,UAAU,KAAA;CAClC,MAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC;CAErD,MAAM,UAAU,CAAC,iBAAiB;CAClC,IAAI,cAAc,CAAC,QAAQ,UAAU,KAAA,GAAW,QAAQ,KAAK,+BAA+B;CAC5F,IAAI,UAAU,QAAQ,QAAQ,KAAK,uBAAuB;CAC1D,IAAI,SAAS,QAAQ,KAAK,0BAA0B;CACpD,IAAI,aAAa,QAAQ,KAAK,yBAAyB;CACvD,IAAI,OAAO,QAAQ,KAAK,wBAAwB;CAChD,IAAI,WAAW,QAAQ,KAAK,SAAS;CAErC,OACE,qBAAC,OAAD;EAAU;EAAK,MAAK;EAAc,WAAW,QAAQ,KAAK,GAAG;EAAG,GAAI;EAApE,UAAA;GACG,cACC,oBAAC,aAAD;IACE,WAAU;IACV,IAAI;IACE;IACN,MAAK;IAEJ,UAAA;GACU,CAAA;GAGd;GAEA,QAAQ,oBAAC,SAAD,CAAU,CAAA;GAElB,UACC,oBAAC,OAAD;IACE,WAAU;IACV,MAAK;IACL,iBAAe;IACf,iBAAe;IACf,iBAAe;IACf,mBAAiB,aAAa,YAAY,KAAA;IAC1C,cAAY,aAAa,KAAA,IAAY;IAErC,UAAA,oBAAC,OAAD,EAAK,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,EAAI,CAAA;GACpC,CAAA;GAGN,UAAU,aACT,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CAA0C,SAAQ,GAAO;;EAExD;;AAET,CAAC;AAED,UAAU,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/StatusBar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
|