@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,98 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Green Steam field label.
|
|
3
|
+
*
|
|
4
|
+
* `Label` in `steam.styles:1147` is four declarations: a font family, a size, a
|
|
5
|
+
* `textcolor` and a `selectedtextcolor`. No bevel, no face, no sprite, **no
|
|
6
|
+
* hover** and no disabled state — the sunken disabled treatment comes from the
|
|
7
|
+
* scheme's `DisabledText1` over `DisabledText2` pair instead
|
|
8
|
+
* (docs/components/FieldLabel.md).
|
|
9
|
+
*
|
|
10
|
+
* The whole visual identity is therefore colour, size and the two-colour shadow
|
|
11
|
+
* trick. Two things are deliberate:
|
|
12
|
+
*
|
|
13
|
+
* 1. **No hover state.** A caption that brightens on hover makes a VGUI layout
|
|
14
|
+
* look like a modern web page: everything starts to look clickable.
|
|
15
|
+
* 2. **No uppercase and no tracking.** Uppercase chrome text is `StatusLabel`'s
|
|
16
|
+
* signature, not this component's; a caption loses readability and gains
|
|
17
|
+
* nothing.
|
|
18
|
+
*
|
|
19
|
+
* `overflow-wrap: anywhere` is not cosmetic — form captions are the most
|
|
20
|
+
* translated strings in an application, and the corpus never had to care because
|
|
21
|
+
* it was English-only and bitmap-fonted.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
.vgui-field-label {
|
|
25
|
+
display: inline-block;
|
|
26
|
+
font: inherit;
|
|
27
|
+
font-size: var(--vgui-font-size);
|
|
28
|
+
line-height: var(--vgui-line-height);
|
|
29
|
+
max-inline-size: 100%;
|
|
30
|
+
overflow-wrap: anywhere;
|
|
31
|
+
color: var(--vgui-text);
|
|
32
|
+
text-transform: none;
|
|
33
|
+
letter-spacing: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/*
|
|
37
|
+
* The sunken look, exactly as `steamscheme.res:50-51` intends it: the dark copy
|
|
38
|
+
* drawn at +1px +1px and the light copy on top. A `text-shadow` is equivalent to
|
|
39
|
+
* two stacked elements and cannot drift out of alignment. It is decorative — the
|
|
40
|
+
* disabled control carries the meaning.
|
|
41
|
+
*/
|
|
42
|
+
.vgui-field-label[data-disabled='true'] {
|
|
43
|
+
color: var(--vgui-text-disabled);
|
|
44
|
+
text-shadow: 1px 1px 0 var(--vgui-text-disabled-shadow);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.vgui-field-label--strong {
|
|
48
|
+
color: var(--vgui-text-strong);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/*
|
|
52
|
+
* The default caption is `--vgui-text` `#D8DED3` (**5.49:1** on `--vgui-surface`),
|
|
53
|
+
* not the classic `Label` grey `#A0AA95` (**3.11:1**), because a form caption is
|
|
54
|
+
* body text and 3.11:1 fails WCAG 1.4.3. The `Label` grey survives as the
|
|
55
|
+
* `--muted` variant, where it belongs — it reaches 4.06:1 on the
|
|
56
|
+
* `--vgui-surface-dark` `#3E4637` interiors that motivated it in the first
|
|
57
|
+
* place. The header comment above describes the corpus, not this decision; see
|
|
58
|
+
* docs/components/FieldLabel.md §Accessibility.
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
.vgui-field-label--muted {
|
|
62
|
+
color: var(--vgui-text-muted);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.vgui-field-label--heading {
|
|
66
|
+
color: var(--vgui-heading);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.vgui-field-label--error {
|
|
70
|
+
color: var(--vgui-danger);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
* The asterisk is a *shape*, but it is invisible to assistive tech, which is why
|
|
75
|
+
* `required` also sets `aria-required` on the label and should be paired with
|
|
76
|
+
* `required` on the control.
|
|
77
|
+
*/
|
|
78
|
+
.vgui-field-label--required::after {
|
|
79
|
+
content: '*';
|
|
80
|
+
margin-inline-start: 0.25em;
|
|
81
|
+
color: var(--vgui-danger);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
* Only the `<label>` variant is ever focusable, and only in a form context. The
|
|
86
|
+
* literal Valve ring is a dotted `BorderDark` (1.87:1), so the shipped ring is
|
|
87
|
+
* the accessible accent ring — the same ring every other control in the library
|
|
88
|
+
* uses (docs/foundations.md §4, "Focus rings").
|
|
89
|
+
*/
|
|
90
|
+
label.vgui-field-label:focus-visible {
|
|
91
|
+
outline: var(--vgui-focus-ring);
|
|
92
|
+
outline-offset: 2px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.vgui-crisp label.vgui-field-label:focus-visible {
|
|
96
|
+
outline: var(--vgui-focus-ring-valve);
|
|
97
|
+
outline-offset: var(--vgui-focus-ring-valve-offset);
|
|
98
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { LabelHTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import './FieldLabel.css';
|
|
3
|
+
export interface FieldLabelProps extends LabelHTMLAttributes<HTMLLabelElement> {
|
|
4
|
+
/** Text or inline content of the label. */
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
/** Render a <span> instead of a <label>, for standalone explanatory text. */
|
|
7
|
+
asText?: boolean;
|
|
8
|
+
/** Emphasis: strong white text rather than the default caption colour. */
|
|
9
|
+
strong?: boolean;
|
|
10
|
+
/** The classic Label grey `#A0AA95`, for captions on a darker surface. */
|
|
11
|
+
muted?: boolean;
|
|
12
|
+
/** Use the maize heading colour, for a label acting as a section title. */
|
|
13
|
+
heading?: boolean;
|
|
14
|
+
/** Actionable/validation failure state. Pair with a message; never colour alone. */
|
|
15
|
+
error?: boolean;
|
|
16
|
+
/** Append a danger-coloured asterisk. Adds `aria-required` semantics. */
|
|
17
|
+
required?: boolean;
|
|
18
|
+
/** Apply the sunken DisabledText1/DisabledText2 treatment. */
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The ordinary caption: one element, one text node, no bevel and no interaction.
|
|
23
|
+
*
|
|
24
|
+
* It renders a real `<label>` whenever it captions a control, so `htmlFor` gives
|
|
25
|
+
* the click-to-focus behaviour for free; `asText` swaps in a `<span>` for
|
|
26
|
+
* standalone explanatory text (docs/components/FieldLabel.md, "Anatomy").
|
|
27
|
+
*/
|
|
28
|
+
export declare const FieldLabel: import("react").ForwardRefExoticComponent<FieldLabelProps & import("react").RefAttributes<HTMLLabelElement>>;
|
|
29
|
+
//# sourceMappingURL=FieldLabel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldLabel.d.ts","sourceRoot":"","sources":["../../../src/components/FieldLabel/FieldLabel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE3D,OAAO,kBAAkB,CAAA;AAEzB,MAAM,WAAW,eAAgB,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IAC5E,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oFAAoF;IACpF,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,8GAuDrB,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { forwardRef } from "react";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import "./FieldLabel.css";
|
|
4
|
+
//#region src/components/FieldLabel/FieldLabel.tsx
|
|
5
|
+
/**
|
|
6
|
+
* The ordinary caption: one element, one text node, no bevel and no interaction.
|
|
7
|
+
*
|
|
8
|
+
* It renders a real `<label>` whenever it captions a control, so `htmlFor` gives
|
|
9
|
+
* the click-to-focus behaviour for free; `asText` swaps in a `<span>` for
|
|
10
|
+
* standalone explanatory text (docs/components/FieldLabel.md, "Anatomy").
|
|
11
|
+
*/
|
|
12
|
+
var FieldLabel = forwardRef(function FieldLabel({ className, children, asText = false, strong = false, muted = false, heading = false, error = false, required = false, disabled = false, htmlFor, ...rest }, ref) {
|
|
13
|
+
const classes = ["vgui-field-label"];
|
|
14
|
+
if (strong) classes.push("vgui-field-label--strong");
|
|
15
|
+
if (muted) classes.push("vgui-field-label--muted");
|
|
16
|
+
if (heading) classes.push("vgui-field-label--heading");
|
|
17
|
+
if (error) classes.push("vgui-field-label--error");
|
|
18
|
+
if (required) classes.push("vgui-field-label--required");
|
|
19
|
+
if (className) classes.push(className);
|
|
20
|
+
const isDisabled = disabled || void 0;
|
|
21
|
+
if (asText) return /* @__PURE__ */ jsx("span", {
|
|
22
|
+
className: classes.join(" "),
|
|
23
|
+
"data-disabled": disabled ? "true" : void 0,
|
|
24
|
+
"aria-disabled": isDisabled,
|
|
25
|
+
...rest,
|
|
26
|
+
children
|
|
27
|
+
});
|
|
28
|
+
return /* @__PURE__ */ jsx("label", {
|
|
29
|
+
ref,
|
|
30
|
+
htmlFor,
|
|
31
|
+
className: classes.join(" "),
|
|
32
|
+
"data-disabled": disabled ? "true" : void 0,
|
|
33
|
+
"aria-disabled": isDisabled,
|
|
34
|
+
...rest,
|
|
35
|
+
children
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
FieldLabel.displayName = "FieldLabel";
|
|
39
|
+
//#endregion
|
|
40
|
+
export { FieldLabel };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=FieldLabel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldLabel.js","names":[],"sources":["../../../src/components/FieldLabel/FieldLabel.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport type { LabelHTMLAttributes, ReactNode } from 'react'\n\nimport './FieldLabel.css'\n\nexport interface FieldLabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** Text or inline content of the label. */\n children?: ReactNode\n /** Render a <span> instead of a <label>, for standalone explanatory text. */\n asText?: boolean\n /** Emphasis: strong white text rather than the default caption colour. */\n strong?: boolean\n /** The classic Label grey `#A0AA95`, for captions on a darker surface. */\n muted?: boolean\n /** Use the maize heading colour, for a label acting as a section title. */\n heading?: boolean\n /** Actionable/validation failure state. Pair with a message; never colour alone. */\n error?: boolean\n /** Append a danger-coloured asterisk. Adds `aria-required` semantics. */\n required?: boolean\n /** Apply the sunken DisabledText1/DisabledText2 treatment. */\n disabled?: boolean\n}\n\n/**\n * The ordinary caption: one element, one text node, no bevel and no interaction.\n *\n * It renders a real `<label>` whenever it captions a control, so `htmlFor` gives\n * the click-to-focus behaviour for free; `asText` swaps in a `<span>` for\n * standalone explanatory text (docs/components/FieldLabel.md, \"Anatomy\").\n */\nexport const FieldLabel = forwardRef<HTMLLabelElement, FieldLabelProps>(function FieldLabel(\n {\n className,\n children,\n asText = false,\n strong = false,\n muted = false,\n heading = false,\n error = false,\n required = false,\n disabled = false,\n htmlFor,\n ...rest\n },\n ref,\n) {\n const classes = ['vgui-field-label']\n if (strong) classes.push('vgui-field-label--strong')\n if (muted) classes.push('vgui-field-label--muted')\n if (heading) classes.push('vgui-field-label--heading')\n if (error) classes.push('vgui-field-label--error')\n if (required) classes.push('vgui-field-label--required')\n if (className) classes.push(className)\n\n // A `<label>` cannot be natively disabled, so the sunken look is opt-in and\n // keyed on `data-disabled`, with the semantics exposed alongside it. The\n // requirement itself stays on the control: `aria-required` on a `<label>` is\n // not permitted for the generic role.\n const isDisabled = disabled || undefined\n\n if (asText) {\n return (\n <span\n className={classes.join(' ')}\n data-disabled={disabled ? 'true' : undefined}\n aria-disabled={isDisabled}\n {...rest}\n >\n {children}\n </span>\n )\n }\n\n return (\n <label\n ref={ref}\n htmlFor={htmlFor}\n className={classes.join(' ')}\n data-disabled={disabled ? 'true' : undefined}\n aria-disabled={isDisabled}\n {...rest}\n >\n {children}\n </label>\n )\n})\n\nFieldLabel.displayName = 'FieldLabel'\n"],"mappings":";;;;;;;;;;;AA+BA,IAAa,aAAa,WAA8C,SAAS,WAC/E,EACE,WACA,UACA,SAAS,OACT,SAAS,OACT,QAAQ,OACR,UAAU,OACV,QAAQ,OACR,WAAW,OACX,WAAW,OACX,SACA,GAAG,QAEL,KACA;CACA,MAAM,UAAU,CAAC,kBAAkB;CACnC,IAAI,QAAQ,QAAQ,KAAK,0BAA0B;CACnD,IAAI,OAAO,QAAQ,KAAK,yBAAyB;CACjD,IAAI,SAAS,QAAQ,KAAK,2BAA2B;CACrD,IAAI,OAAO,QAAQ,KAAK,yBAAyB;CACjD,IAAI,UAAU,QAAQ,KAAK,4BAA4B;CACvD,IAAI,WAAW,QAAQ,KAAK,SAAS;CAMrC,MAAM,aAAa,YAAY,KAAA;CAE/B,IAAI,QACF,OACE,oBAAC,QAAD;EACE,WAAW,QAAQ,KAAK,GAAG;EAC3B,iBAAe,WAAW,SAAS,KAAA;EACnC,iBAAe;EACf,GAAI;EAEH;CACG,CAAA;CAIV,OACE,oBAAC,SAAD;EACO;EACI;EACT,WAAW,QAAQ,KAAK,GAAG;EAC3B,iBAAe,WAAW,SAAS,KAAA;EACnC,iBAAe;EACf,GAAI;EAEH;CACI,CAAA;AAEX,CAAC;AAED,WAAW,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FieldLabel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Green Steam group box — a real <fieldset> styled with the 1px bevel
|
|
3
|
+
* (docs/components/GroupBox.md).
|
|
4
|
+
*
|
|
5
|
+
* `theme.css` already gives every `fieldset` a bevel and every `legend` the
|
|
6
|
+
* uppercase 12px chrome treatment, but those are element-level rules this
|
|
7
|
+
* component has to be able to override, so the box and the legend are both
|
|
8
|
+
* declared here through their own classes.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
.vgui-groupbox {
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
margin: 0 0 16px;
|
|
14
|
+
padding: 12px;
|
|
15
|
+
/* Non-obvious but essential: a fieldset defaults to min-inline-size:
|
|
16
|
+
min-content and then refuses to shrink inside a flex or grid parent,
|
|
17
|
+
which silently breaks every responsive layout it is dropped into. */
|
|
18
|
+
min-inline-size: 0;
|
|
19
|
+
border-top: 1px solid var(--vgui-bevel-light);
|
|
20
|
+
border-left: 1px solid var(--vgui-bevel-light);
|
|
21
|
+
border-bottom: 1px solid var(--vgui-bevel-dark);
|
|
22
|
+
border-right: 1px solid var(--vgui-bevel-dark);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.vgui-groupbox--inset {
|
|
26
|
+
border-top-color: var(--vgui-bevel-dark);
|
|
27
|
+
border-left-color: var(--vgui-bevel-dark);
|
|
28
|
+
border-bottom-color: var(--vgui-bevel-light);
|
|
29
|
+
border-right-color: var(--vgui-bevel-light);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* Legend: the theme's uppercase chrome treatment, straddling the top border. */
|
|
33
|
+
.vgui-groupbox__legend {
|
|
34
|
+
padding: 0 6px;
|
|
35
|
+
text-transform: uppercase;
|
|
36
|
+
letter-spacing: var(--vgui-chrome-tracking);
|
|
37
|
+
font-family: var(--vgui-font);
|
|
38
|
+
font-size: var(--vgui-font-size-small);
|
|
39
|
+
font-weight: bold;
|
|
40
|
+
color: var(--vgui-text-strong);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* `--legend-top`: the caption takes the whole first row as a section rule
|
|
45
|
+
* instead of notching the border. The React API has no prop for it — the doc
|
|
46
|
+
* lists it as a variant, so it is reachable through `className`.
|
|
47
|
+
*/
|
|
48
|
+
.vgui-groupbox--legend-top {
|
|
49
|
+
border-top: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.vgui-groupbox--legend-top > .vgui-groupbox__legend {
|
|
53
|
+
display: block;
|
|
54
|
+
width: 100%;
|
|
55
|
+
padding: 0 0 6px;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* `hideLegend` hides the caption from sight only. `display: none` would strip
|
|
60
|
+
* the group's accessible name entirely, so the legend is clipped instead.
|
|
61
|
+
*/
|
|
62
|
+
.vgui-groupbox--legend-hidden > .vgui-groupbox__legend {
|
|
63
|
+
position: absolute;
|
|
64
|
+
width: 1px;
|
|
65
|
+
height: 1px;
|
|
66
|
+
margin: -1px;
|
|
67
|
+
padding: 0;
|
|
68
|
+
overflow: hidden;
|
|
69
|
+
clip-path: inset(50%);
|
|
70
|
+
white-space: nowrap;
|
|
71
|
+
border: 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* `<fieldset disabled>` already disables the whole subtree; only the caption
|
|
75
|
+
needs a treatment of its own. */
|
|
76
|
+
.vgui-groupbox:disabled .vgui-groupbox__legend {
|
|
77
|
+
color: var(--vgui-text-disabled);
|
|
78
|
+
text-shadow: 1px 1px 0 var(--vgui-text-disabled-shadow);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Ruled variant: no box, just the engraved divider under the caption. */
|
|
82
|
+
.vgui-groupbox--ruled {
|
|
83
|
+
border: 0;
|
|
84
|
+
padding: 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.vgui-groupbox--ruled > .vgui-groupbox__legend {
|
|
88
|
+
display: block;
|
|
89
|
+
width: 100%;
|
|
90
|
+
padding: 0 0 6px;
|
|
91
|
+
border-bottom: 1px solid var(--vgui-bevel-dark);
|
|
92
|
+
box-shadow: 0 1px 0 var(--vgui-bevel-light);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* Invalid border. Colour alone may never be the only indicator (WCAG 1.4.1),
|
|
97
|
+
* so this only draws the border — callers still owe a message or an icon.
|
|
98
|
+
*/
|
|
99
|
+
.vgui-groupbox--invalid {
|
|
100
|
+
border-color: var(--vgui-danger);
|
|
101
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FieldsetHTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import './GroupBox.css';
|
|
3
|
+
export interface GroupBoxProps extends FieldsetHTMLAttributes<HTMLFieldSetElement> {
|
|
4
|
+
/** Uppercase caption drawn on the border. */
|
|
5
|
+
legend: ReactNode;
|
|
6
|
+
/** Invert the bevel, for a group sitting on a lighter surface. */
|
|
7
|
+
inset?: boolean;
|
|
8
|
+
/** Drop the box; render only the engraved rule under the caption. */
|
|
9
|
+
ruled?: boolean;
|
|
10
|
+
/** Hide the legend visually while keeping it for assistive technology. */
|
|
11
|
+
hideLegend?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const GroupBox: import("react").ForwardRefExoticComponent<GroupBoxProps & import("react").RefAttributes<HTMLFieldSetElement>>;
|
|
14
|
+
//# sourceMappingURL=GroupBox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupBox.d.ts","sourceRoot":"","sources":["../../../src/components/GroupBox/GroupBox.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE9D,OAAO,gBAAgB,CAAA;AAEvB,MAAM,WAAW,aAAc,SAAQ,sBAAsB,CAAC,mBAAmB,CAAC;IAChF,6CAA6C;IAC7C,MAAM,EAAE,SAAS,CAAA;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,qEAAqE;IACrE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,eAAO,MAAM,QAAQ,+GAkBnB,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { forwardRef } from "react";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import "./GroupBox.css";
|
|
4
|
+
//#region src/components/GroupBox/GroupBox.tsx
|
|
5
|
+
var GroupBox = forwardRef(function GroupBox({ className, legend, inset = false, ruled = false, hideLegend = false, children, ...rest }, ref) {
|
|
6
|
+
const classes = ["vgui-groupbox"];
|
|
7
|
+
if (inset) classes.push("vgui-groupbox--inset");
|
|
8
|
+
if (ruled) classes.push("vgui-groupbox--ruled");
|
|
9
|
+
if (hideLegend) classes.push("vgui-groupbox--legend-hidden");
|
|
10
|
+
if (className) classes.push(className);
|
|
11
|
+
return /* @__PURE__ */ jsxs("fieldset", {
|
|
12
|
+
ref,
|
|
13
|
+
className: classes.join(" "),
|
|
14
|
+
...rest,
|
|
15
|
+
children: [/* @__PURE__ */ jsx("legend", {
|
|
16
|
+
className: "vgui-groupbox__legend",
|
|
17
|
+
children: legend
|
|
18
|
+
}), children]
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
GroupBox.displayName = "GroupBox";
|
|
22
|
+
//#endregion
|
|
23
|
+
export { GroupBox };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=GroupBox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupBox.js","names":[],"sources":["../../../src/components/GroupBox/GroupBox.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport type { FieldsetHTMLAttributes, ReactNode } from 'react'\n\nimport './GroupBox.css'\n\nexport interface GroupBoxProps extends FieldsetHTMLAttributes<HTMLFieldSetElement> {\n /** Uppercase caption drawn on the border. */\n legend: ReactNode\n /** Invert the bevel, for a group sitting on a lighter surface. */\n inset?: boolean\n /** Drop the box; render only the engraved rule under the caption. */\n ruled?: boolean\n /** Hide the legend visually while keeping it for assistive technology. */\n hideLegend?: boolean\n}\n\nexport const GroupBox = forwardRef<HTMLFieldSetElement, GroupBoxProps>(function GroupBox(\n { className, legend, inset = false, ruled = false, hideLegend = false, children, ...rest },\n ref,\n) {\n const classes = ['vgui-groupbox']\n if (inset) classes.push('vgui-groupbox--inset')\n if (ruled) classes.push('vgui-groupbox--ruled')\n if (hideLegend) classes.push('vgui-groupbox--legend-hidden')\n if (className) classes.push(className)\n\n // No `role=\"group\"`: the element already maps to the group role, and an\n // explicit role interferes with the legend-derived accessible name.\n return (\n <fieldset ref={ref} className={classes.join(' ')} {...rest}>\n <legend className=\"vgui-groupbox__legend\">{legend}</legend>\n {children}\n </fieldset>\n )\n})\n\nGroupBox.displayName = 'GroupBox'\n"],"mappings":";;;;AAgBA,IAAa,WAAW,WAA+C,SAAS,SAC9E,EAAE,WAAW,QAAQ,QAAQ,OAAO,QAAQ,OAAO,aAAa,OAAO,UAAU,GAAG,QACpF,KACA;CACA,MAAM,UAAU,CAAC,eAAe;CAChC,IAAI,OAAO,QAAQ,KAAK,sBAAsB;CAC9C,IAAI,OAAO,QAAQ,KAAK,sBAAsB;CAC9C,IAAI,YAAY,QAAQ,KAAK,8BAA8B;CAC3D,IAAI,WAAW,QAAQ,KAAK,SAAS;CAIrC,OACE,qBAAC,YAAD;EAAe;EAAK,WAAW,QAAQ,KAAK,GAAG;EAAG,GAAI;EAAtD,UAAA,CACE,oBAAC,UAAD;GAAQ,WAAU;GAAyB,UAAA;EAAe,CAAA,GACzD,QACO;;AAEd,CAAC;AAED,SAAS,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/GroupBox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Green Steam icon button.
|
|
3
|
+
*
|
|
4
|
+
* A square face whose entire content is a glyph. Three things differ from
|
|
5
|
+
* `.vgui-button` (docs/components/IconButton.md):
|
|
6
|
+
*
|
|
7
|
+
* 1. The face is square and driven by the sprite's pixel size, not a label.
|
|
8
|
+
* 2. The glyph recolours per state through `currentColor` over a
|
|
9
|
+
* `mask-image`, so one URI covers normal/hover/active/disabled and every
|
|
10
|
+
* theme variant. There are no per-state assets.
|
|
11
|
+
* 3. `:active` inverts the bevel *and* drops the glyph 1px — the only place
|
|
12
|
+
* in the theme where content moves on press.
|
|
13
|
+
*
|
|
14
|
+
* Two deviations required by WCAG: the accessible focus ring replaces Valve's
|
|
15
|
+
* dashed `BorderDark` ring (1.87:1), and every face keeps an invisible 24×24
|
|
16
|
+
* hit area because a 15–20px square is below 2.5.8's minimum.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
.vgui-icon-button {
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
position: relative;
|
|
22
|
+
display: inline-flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
justify-content: center;
|
|
25
|
+
inline-size: var(--vgui-frame-control-size);
|
|
26
|
+
block-size: var(--vgui-frame-control-size);
|
|
27
|
+
padding: 0;
|
|
28
|
+
font: inherit;
|
|
29
|
+
color: var(--vgui-text);
|
|
30
|
+
background-color: var(--vgui-surface);
|
|
31
|
+
border-top: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
32
|
+
border-left: var(--vgui-bevel-width) solid var(--vgui-bevel-light);
|
|
33
|
+
border-bottom: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
34
|
+
border-right: var(--vgui-bevel-width) solid var(--vgui-bevel-dark);
|
|
35
|
+
cursor: pointer;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/*
|
|
39
|
+
* The painted face is 15–20px; the target is not. A centred 24×24 overlay
|
|
40
|
+
* travels with the button, so the glyph stays sprite-sized while the pointer
|
|
41
|
+
* target meets WCAG 2.5.8.
|
|
42
|
+
*/
|
|
43
|
+
.vgui-icon-button::before {
|
|
44
|
+
content: '';
|
|
45
|
+
position: absolute;
|
|
46
|
+
inset: 50% auto auto 50%;
|
|
47
|
+
inline-size: var(--vgui-min-target-size);
|
|
48
|
+
block-size: var(--vgui-min-target-size);
|
|
49
|
+
transform: translate(-50%, -50%);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* The `_over` sprites are brighter glyphs, not a different face: the bevel
|
|
53
|
+
* stays raised and only the colour changes. */
|
|
54
|
+
.vgui-icon-button:hover,
|
|
55
|
+
.vgui-icon-button--toggled,
|
|
56
|
+
.vgui-icon-button[aria-pressed='true'] {
|
|
57
|
+
color: var(--vgui-text-strong);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Pressed and latched both invert the bevel — and `:active` does so even when
|
|
61
|
+
* already latched, so the press is never invisible. */
|
|
62
|
+
.vgui-icon-button:active,
|
|
63
|
+
.vgui-icon-button--toggled,
|
|
64
|
+
.vgui-icon-button[aria-pressed='true'] {
|
|
65
|
+
border-top-color: var(--vgui-bevel-dark);
|
|
66
|
+
border-left-color: var(--vgui-bevel-dark);
|
|
67
|
+
border-bottom-color: var(--vgui-bevel-light);
|
|
68
|
+
border-right-color: var(--vgui-bevel-light);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* `icon_button_*_down` draws the glyph 1px lower. The movement is decorative
|
|
72
|
+
* and mirrors the bevel inversion, so it is a state change, not motion. */
|
|
73
|
+
.vgui-icon-button:active .vgui-icon-button__glyph {
|
|
74
|
+
transform: translateY(1px);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.vgui-icon-button:disabled {
|
|
78
|
+
color: var(--vgui-text-disabled);
|
|
79
|
+
cursor: default;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* A disabled control is not a target, so it drops the expanded hit area rather
|
|
83
|
+
* than overlapping its still-enabled neighbours. */
|
|
84
|
+
.vgui-icon-button:disabled::before {
|
|
85
|
+
content: none;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.vgui-icon-button:focus-visible {
|
|
89
|
+
outline: var(--vgui-focus-ring);
|
|
90
|
+
outline-offset: var(--vgui-focus-ring-offset);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Valve's literal ring, reachable only through the pixel-perfect opt-in. */
|
|
94
|
+
.vgui-crisp .vgui-icon-button:focus-visible {
|
|
95
|
+
outline: var(--vgui-focus-ring-valve);
|
|
96
|
+
outline-offset: var(--vgui-focus-ring-valve-offset);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.vgui-icon-button--small {
|
|
100
|
+
inline-size: var(--vgui-checkbox-size);
|
|
101
|
+
block-size: var(--vgui-checkbox-size);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.vgui-icon-button--gutter {
|
|
105
|
+
inline-size: var(--vgui-scrollbar-size);
|
|
106
|
+
block-size: var(--vgui-scrollbar-size);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.vgui-icon-button--large {
|
|
110
|
+
inline-size: var(--vgui-control-height);
|
|
111
|
+
block-size: var(--vgui-control-height);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.vgui-icon-button--clay {
|
|
115
|
+
background-color: var(--vgui-clay-button);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/*
|
|
119
|
+
* Frameless: no chrome until hovered, for tree expanders and the `?` hint.
|
|
120
|
+
* Declared last so it also wins over `--clay` and the `:active` inversion sets
|
|
121
|
+
* above keep their bevel once shown.
|
|
122
|
+
*/
|
|
123
|
+
.vgui-icon-button--frameless {
|
|
124
|
+
background-color: transparent;
|
|
125
|
+
border-color: transparent;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.vgui-icon-button--frameless:hover {
|
|
129
|
+
border-top-color: var(--vgui-bevel-light);
|
|
130
|
+
border-left-color: var(--vgui-bevel-light);
|
|
131
|
+
border-bottom-color: var(--vgui-bevel-dark);
|
|
132
|
+
border-right-color: var(--vgui-bevel-dark);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.vgui-icon-button--frameless:active,
|
|
136
|
+
.vgui-icon-button--frameless.vgui-icon-button--toggled,
|
|
137
|
+
.vgui-icon-button--frameless[aria-pressed='true'] {
|
|
138
|
+
border-top-color: var(--vgui-bevel-dark);
|
|
139
|
+
border-left-color: var(--vgui-bevel-dark);
|
|
140
|
+
border-bottom-color: var(--vgui-bevel-light);
|
|
141
|
+
border-right-color: var(--vgui-bevel-light);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* `icon_button_*_disabled` has no bevel at all on this variant. */
|
|
145
|
+
.vgui-icon-button--frameless:disabled {
|
|
146
|
+
border-color: transparent;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/*
|
|
150
|
+
* The glyph box is 60% of the face — 12×12 inside the default 20×20, which is
|
|
151
|
+
* the sprite-derived metric in the doc. The mask is one image scaled to the
|
|
152
|
+
* box, tinted by `currentColor`.
|
|
153
|
+
*/
|
|
154
|
+
.vgui-icon-button__glyph {
|
|
155
|
+
display: block;
|
|
156
|
+
flex: 0 0 auto;
|
|
157
|
+
inline-size: 60%;
|
|
158
|
+
block-size: 60%;
|
|
159
|
+
background-color: currentColor;
|
|
160
|
+
-webkit-mask-image: var(--vgui-icon-button-glyph, none);
|
|
161
|
+
mask-image: var(--vgui-icon-button-glyph, none);
|
|
162
|
+
-webkit-mask-repeat: no-repeat;
|
|
163
|
+
mask-repeat: no-repeat;
|
|
164
|
+
-webkit-mask-position: center;
|
|
165
|
+
mask-position: center;
|
|
166
|
+
-webkit-mask-size: contain;
|
|
167
|
+
mask-size: contain;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/*
|
|
171
|
+
* A caller-supplied node paints itself, so it must not also get the solid
|
|
172
|
+
* `currentColor` box the mask needs. `currentColor` is still inherited from the
|
|
173
|
+
* button, so `fill="currentColor"` in the node tracks every state.
|
|
174
|
+
*/
|
|
175
|
+
.vgui-icon-button__glyph--node {
|
|
176
|
+
background-color: transparent;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.vgui-icon-button__glyph--node > svg {
|
|
180
|
+
display: block;
|
|
181
|
+
inline-size: 100%;
|
|
182
|
+
block-size: 100%;
|
|
183
|
+
fill: currentColor;
|
|
184
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ButtonHTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import './IconButton.css';
|
|
3
|
+
/**
|
|
4
|
+
* The built-in glyphs, keyed by the name accepted by `IconButton`'s `icon`
|
|
5
|
+
* prop. Geometry is drawn on a 12×12 grid and centred, rather than transcribed
|
|
6
|
+
* from Valve's sprites — `icon_down_*` is 9×6 while `icon_left_*`/`icon_right_*`
|
|
7
|
+
* are 13×13, so one primitive per direction is the only consistent option
|
|
8
|
+
* (docs/components/IconButton.md, "Assets").
|
|
9
|
+
*/
|
|
10
|
+
export declare const glyphs: {
|
|
11
|
+
readonly back: string;
|
|
12
|
+
readonly forward: string;
|
|
13
|
+
readonly home: string;
|
|
14
|
+
readonly reload: string;
|
|
15
|
+
readonly stop: string;
|
|
16
|
+
readonly detail: string;
|
|
17
|
+
readonly close: string;
|
|
18
|
+
readonly minimize: string;
|
|
19
|
+
readonly maximize: string;
|
|
20
|
+
readonly restore: string;
|
|
21
|
+
readonly 'chevron-down': string;
|
|
22
|
+
readonly 'chevron-up': string;
|
|
23
|
+
readonly 'arrow-down': string;
|
|
24
|
+
readonly 'arrow-up': string;
|
|
25
|
+
readonly 'arrow-left': string;
|
|
26
|
+
readonly 'arrow-right': string;
|
|
27
|
+
readonly grid: string;
|
|
28
|
+
readonly list: string;
|
|
29
|
+
readonly pin: string;
|
|
30
|
+
readonly question: string;
|
|
31
|
+
};
|
|
32
|
+
/** The names accepted by `IconButton`'s `icon` prop. */
|
|
33
|
+
export type GlyphName = keyof typeof glyphs;
|
|
34
|
+
/** Resolves the built-in glyph data URI for a name, or `null` for a node. */
|
|
35
|
+
export declare function glyphMask(icon: ReactNode | GlyphName): string | null;
|
|
36
|
+
export interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
37
|
+
/** Accessible name. Required — a glyph alone is not a name. */
|
|
38
|
+
label: string;
|
|
39
|
+
/** The glyph: an inline SVG node, or the name of one of the built-in glyphs. */
|
|
40
|
+
icon: ReactNode | GlyphName;
|
|
41
|
+
/** Edge length in pixels. Defaults to 20. */
|
|
42
|
+
size?: 15 | 18 | 20 | 25;
|
|
43
|
+
/** Render without a bevel until hovered. */
|
|
44
|
+
frameless?: boolean;
|
|
45
|
+
/** Latched on: an inverted bevel that persists. */
|
|
46
|
+
toggled?: boolean;
|
|
47
|
+
/** Render the grey property-sheet face. */
|
|
48
|
+
clay?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A square, glyph-only button. The tick target of a 20×20 face is under WCAG
|
|
52
|
+
* 2.5.8's 24×24, so every variant grows an invisible centred hit area rather
|
|
53
|
+
* than relying on the painted box (docs/foundations.md §10, rule 6).
|
|
54
|
+
*/
|
|
55
|
+
export declare const IconButton: import("react").ForwardRefExoticComponent<IconButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
56
|
+
//# sourceMappingURL=IconButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconButton.d.ts","sourceRoot":"","sources":["../../../src/components/IconButton/IconButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAA;AAE3E,OAAO,kBAAkB,CAAA;AAiBzB;;;;;;GAMG;AACH,eAAO,MAAM,MAAM;aACjB,IAAI;aACJ,OAAO;aACP,IAAI;aACJ,MAAM;aAGN,IAAI;aACJ,MAAM;aACN,KAAK;aACL,QAAQ;aACR,QAAQ;aAGR,OAAO;aAGP,cAAc;aAGd,YAAY;aAIZ,YAAY;aACZ,UAAU;aACV,YAAY;aACZ,aAAa;aACb,IAAI;aAGJ,IAAI;aAGJ,GAAG;aAGH,QAAQ;CAGA,CAAA;AAEV,wDAAwD;AACxD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAA;AAE3C,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAEpE;AAED,MAAM,WAAW,eAAgB,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC9E,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAA;IACb,gFAAgF;IAChF,IAAI,EAAE,SAAS,GAAG,SAAS,CAAA;IAC3B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACxB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,+GAkDrB,CAAA"}
|