diff --git a/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx b/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx
deleted file mode 100644
index f152001023c..00000000000
--- a/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import React from 'react';
-
-import { ToolbarButton, ButtonGroup, VerticalGroup, HorizontalGroup } from '@grafana/ui';
-
-import { DashboardStoryCanvas } from '../../utils/storybook/DashboardStoryCanvas';
-import { withCenteredStory } from '../../utils/storybook/withCenteredStory';
-
-import { ToolbarButtonVariant } from './ToolbarButton';
-import { ToolbarButtonRow } from './ToolbarButtonRow';
-
-export default {
- title: 'Buttons/ToolbarButton',
- component: ToolbarButton,
- decorators: [withCenteredStory],
- parameters: {},
-};
-
-export const List = () => {
- const variants: ToolbarButtonVariant[] = ['default', 'active', 'primary', 'destructive'];
-
- return (
-
-
- Button states
-
- Just text
-
- With imgSrc
-
- isOpen
-
-
- isOpen = false
-
-
-
- disabled
-
-
- Disabled
-
-
-
- Variants
-
- {variants.map((variant) => (
-
- {variant}
-
- ))}
-
-
- disabled
-
-
- Disabled
-
-
-
- Variants
-
- {variants.map((variant) => (
-
- {variant}
-
- ))}
-
-
- Wrapped in noSpacing ButtonGroup
-
-
- 2020-10-02
-
-
-
-
-
-
-
-
-
- As primary and destructive variant
-
-
-
- Run query
-
-
-
-
-
- Run query
-
-
-
-
-
-
- );
-};
diff --git a/packages/grafana-ui/src/components/Button/index.ts b/packages/grafana-ui/src/components/Button/index.ts
index cc6da63a2d4..3e27c288a5d 100644
--- a/packages/grafana-ui/src/components/Button/index.ts
+++ b/packages/grafana-ui/src/components/Button/index.ts
@@ -1,4 +1,2 @@
export * from './Button';
export { ButtonGroup } from './ButtonGroup';
-export { ToolbarButton, ToolbarButtonVariant } from './ToolbarButton';
-export { ToolbarButtonRow } from './ToolbarButtonRow';
diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx
index 375650c9fa3..b4985badef9 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx
+++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx
@@ -19,7 +19,8 @@ import { selectors } from '@grafana/e2e-selectors';
import { withTheme, useTheme } from '../../themes/ThemeContext';
import { stylesFactory } from '../../themes/stylesFactory';
import { Themeable } from '../../types';
-import { ButtonGroup, ToolbarButton } from '../Button';
+import { ButtonGroup } from '../Button';
+import { ToolbarButton } from '../ToolbarButton';
import { Tooltip } from '../Tooltip/Tooltip';
import { TimePickerContent } from './TimeRangePicker/TimePickerContent';
diff --git a/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx b/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx
index be0ae91df41..d16d590b01b 100644
--- a/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx
+++ b/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx
@@ -8,10 +8,11 @@ import React, { HTMLAttributes } from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
import { useStyles2 } from '../../themes/ThemeContext';
-import { ToolbarButtonVariant, ToolbarButton, ButtonGroup } from '../Button';
+import { ButtonGroup } from '../Button';
import { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';
import { Menu } from '../Menu/Menu';
import { MenuItem } from '../Menu/MenuItem';
+import { ToolbarButton, ToolbarButtonVariant } from '../ToolbarButton';
import { PopoverContent } from '../Tooltip';
export interface Props extends HTMLAttributes {
diff --git a/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx b/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx
index 2e437b0076b..f9c07499104 100644
--- a/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx
+++ b/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx
@@ -4,8 +4,9 @@ import React, { PureComponent } from 'react';
import { SelectableValue, parseDuration } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
-import { ButtonGroup, ToolbarButton, ToolbarButtonVariant } from '../Button';
+import { ButtonGroup } from '../Button';
import { ButtonSelect } from '../Dropdown/ButtonSelect';
+import { ToolbarButtonVariant, ToolbarButton } from '../ToolbarButton';
// Default intervals used in the refresh picker component
export const defaultIntervals = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];
diff --git a/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.mdx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.mdx
new file mode 100644
index 00000000000..506e00bc487
--- /dev/null
+++ b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.mdx
@@ -0,0 +1,26 @@
+import { Meta, Props } from '@storybook/addon-docs/blocks';
+import { ToolbarButton } from './ToolbarButton';
+
+# ToolbarButton
+
+Multiple buttons that form a toolbar. Each button can contain an icon, image and text.
+There are three variants of the `ToolbarButton`: default, primary and destructive.
+
+## Usage
+
+This example shows how to use several buttons in a `ToolbarButtonRow`.
+
+```jsx
+
+
+ Last 6 hours
+
+
+
+
+
+
+
+```
+
+
diff --git a/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.story.tsx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.story.tsx
new file mode 100644
index 00000000000..ae1f17a488f
--- /dev/null
+++ b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.story.tsx
@@ -0,0 +1,103 @@
+import { Meta, Story } from '@storybook/react';
+import React from 'react';
+
+import { withCenteredStory } from '../../utils/storybook/withCenteredStory';
+import { ButtonGroup } from '../Button';
+
+import { ToolbarButton, ToolbarButtonProps } from './ToolbarButton';
+import mdx from './ToolbarButton.mdx';
+import { ToolbarButtonRow } from './ToolbarButtonRow';
+
+export default {
+ title: 'Buttons/ToolbarButton',
+ component: ToolbarButton,
+ decorators: [withCenteredStory],
+ parameters: {
+ docs: {
+ page: mdx,
+ },
+ controls: {
+ exclude: ['imgSrc', 'imgAlt', 'iconOnly', 'narrow'],
+ },
+ },
+ args: {
+ variant: 'default',
+ fullWidth: false,
+ disabled: false,
+ toolbarButtonText: 'Just text',
+ icon: 'cloud',
+ showDropdown: false,
+ isOpen: false,
+ tooltip: 'This is a tooltip',
+ isHighlighted: false,
+ imgSrc: '',
+ imgAlt: '',
+ },
+ argTypes: {
+ variant: {
+ control: {
+ type: 'select',
+ },
+ options: ['default', 'primary', 'active', 'destructive'],
+ },
+ icon: {
+ control: {
+ type: 'select',
+ options: ['sync', 'cloud'],
+ },
+ },
+ },
+} as Meta;
+
+interface StoryProps extends Partial {
+ toolbarButtonText: string;
+ showDropdown: boolean;
+}
+
+export const BasicWithText: Story = (args) => {
+ return (
+
+ {args.toolbarButtonText}
+
+ );
+};
+
+export const BasicWithIcon: Story = (args) => {
+ return (
+
+ );
+};
+
+export const List: Story = (args) => {
+ return (
+
+
+ Last 6 hours
+
+
+
+
+
+
+
+ );
+};
diff --git a/packages/grafana-ui/src/components/Button/ToolbarButton.tsx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx
similarity index 96%
rename from packages/grafana-ui/src/components/Button/ToolbarButton.tsx
rename to packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx
index 739c27e3fdf..1a6e9f5b672 100644
--- a/packages/grafana-ui/src/components/Button/ToolbarButton.tsx
+++ b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx
@@ -8,12 +8,11 @@ import { selectors } from '@grafana/e2e-selectors';
import { styleMixins, useStyles2 } from '../../themes';
import { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';
import { IconName } from '../../types/icon';
+import { getPropertiesForVariant } from '../Button';
import { Icon } from '../Icon/Icon';
import { Tooltip } from '../Tooltip/Tooltip';
-import { getPropertiesForVariant } from './Button';
-
-export interface Props extends ButtonHTMLAttributes {
+type CommonProps = {
/** Icon name */
icon?: IconName | React.ReactNode;
/** Tooltip */
@@ -34,11 +33,13 @@ export interface Props extends ButtonHTMLAttributes {
iconOnly?: boolean;
/** Show highlight dot */
isHighlighted?: boolean;
-}
+};
+
+export type ToolbarButtonProps = CommonProps & ButtonHTMLAttributes;
export type ToolbarButtonVariant = 'default' | 'primary' | 'destructive' | 'active';
-export const ToolbarButton = forwardRef(
+export const ToolbarButton = forwardRef(
(
{
tooltip,
diff --git a/packages/grafana-ui/src/components/Button/ToolbarButtonRow.tsx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButtonRow.tsx
similarity index 100%
rename from packages/grafana-ui/src/components/Button/ToolbarButtonRow.tsx
rename to packages/grafana-ui/src/components/ToolbarButton/ToolbarButtonRow.tsx
diff --git a/packages/grafana-ui/src/components/ToolbarButton/index.ts b/packages/grafana-ui/src/components/ToolbarButton/index.ts
new file mode 100644
index 00000000000..f6a0851d6b9
--- /dev/null
+++ b/packages/grafana-ui/src/components/ToolbarButton/index.ts
@@ -0,0 +1,2 @@
+export * from './ToolbarButton';
+export { ToolbarButtonRow } from './ToolbarButtonRow';
diff --git a/packages/grafana-ui/src/components/index.ts b/packages/grafana-ui/src/components/index.ts
index 802e5e62267..721d749c863 100644
--- a/packages/grafana-ui/src/components/index.ts
+++ b/packages/grafana-ui/src/components/index.ts
@@ -178,7 +178,8 @@ export { RangeSlider } from './Slider/RangeSlider';
export { Form } from './Forms/Form';
export { sharedInputStyle } from './Forms/commonStyles';
export { InputControl } from './InputControl';
-export { Button, LinkButton, ButtonVariant, ToolbarButton, ButtonGroup, ToolbarButtonRow, ButtonProps } from './Button';
+export { Button, LinkButton, ButtonVariant, ButtonGroup, ButtonProps } from './Button';
+export { ToolbarButton, ToolbarButtonRow } from './ToolbarButton';
export { ValuePicker } from './ValuePicker/ValuePicker';
export { fieldMatchersUI } from './MatchersUI/fieldMatchersUI';
export { Link } from './Link/Link';