diff --git a/packages/grafana-ui/src/components/Cascader/Cascader.tsx b/packages/grafana-ui/src/components/Cascader/Cascader.tsx
index 3fbd8afc56d..31671b60785 100644
--- a/packages/grafana-ui/src/components/Cascader/Cascader.tsx
+++ b/packages/grafana-ui/src/components/Cascader/Cascader.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import { Icon } from '../Icon/Icon';
import RCCascader from 'rc-cascader';
-import { Select } from '../Forms/Select/Select';
+import { Select } from '../Select/Select';
import { FormInputSize } from '../Forms/types';
import { Input } from '../Forms/Input/Input';
import { SelectableValue } from '@grafana/data';
diff --git a/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx b/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx
index 27e02d65065..2bc668c2348 100644
--- a/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx
+++ b/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx
@@ -8,7 +8,7 @@ import { TLSAuthSettings } from './TLSAuthSettings';
import { DataSourceSettings } from '@grafana/data';
import { HttpSettingsProps } from './types';
import { CustomHeadersSettings } from './CustomHeadersSettings';
-import { Select } from '../Select/Select';
+import { Select } from '../Forms/Legacy/Select/Select';
import { Input } from '../Input/Input';
import { FormField } from '../FormField/FormField';
import { FormLabel } from '../FormLabel/FormLabel';
diff --git a/packages/grafana-ui/src/components/Forms/Form.story.tsx b/packages/grafana-ui/src/components/Forms/Form.story.tsx
index ed0cfb73f52..82f72c22ebe 100644
--- a/packages/grafana-ui/src/components/Forms/Form.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/Form.story.tsx
@@ -11,7 +11,7 @@ import { Switch } from './Switch';
import { Checkbox } from './Checkbox';
import { RadioButtonGroup } from './RadioButtonGroup/RadioButtonGroup';
-import { Select } from './Select/Select';
+import { Select } from '../Select/Select';
import Forms from './index';
import mdx from './Form.mdx';
import { ValidateResult } from 'react-hook-form';
diff --git a/packages/grafana-ui/src/components/Select/ButtonSelect.story.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/ButtonSelect.story.tsx
similarity index 89%
rename from packages/grafana-ui/src/components/Select/ButtonSelect.story.tsx
rename to packages/grafana-ui/src/components/Forms/Legacy/Select/ButtonSelect.story.tsx
index af306fb8cde..9dff759ed59 100644
--- a/packages/grafana-ui/src/components/Select/ButtonSelect.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/ButtonSelect.story.tsx
@@ -2,8 +2,8 @@ import React from 'react';
import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import { withKnobs, object, text } from '@storybook/addon-knobs';
-import { withCenteredStory } from '../../utils/storybook/withCenteredStory';
-import { UseState } from '../../utils/storybook/UseState';
+import { withCenteredStory } from '../../../../utils/storybook/withCenteredStory';
+import { UseState } from '../../../../utils/storybook/UseState';
import { SelectableValue } from '@grafana/data';
import { ButtonSelect } from './ButtonSelect';
diff --git a/packages/grafana-ui/src/components/Forms/Legacy/Select/ButtonSelect.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/ButtonSelect.tsx
new file mode 100644
index 00000000000..5ad3a55d866
--- /dev/null
+++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/ButtonSelect.tsx
@@ -0,0 +1,97 @@
+import React, { PureComponent, ReactElement } from 'react';
+import Select from './Select';
+import { PopoverContent } from '../../../Tooltip/Tooltip';
+import { SelectableValue } from '@grafana/data';
+
+interface ButtonComponentProps {
+ label: ReactElement | string | undefined;
+ className: string | undefined;
+ iconClass?: string;
+}
+
+const ButtonComponent = (buttonProps: ButtonComponentProps) => (props: any) => {
+ const { label, className, iconClass } = buttonProps;
+
+ return (
+
+
+ {iconClass && }
+ {label ? label : ''}
+ {!props.menuIsOpen && }
+ {props.menuIsOpen && }
+
+
+ );
+};
+
+export interface Props {
+ className: string | undefined;
+ options: Array>;
+ value?: SelectableValue;
+ label?: ReactElement | string;
+ iconClass?: string;
+ components?: any;
+ maxMenuHeight?: number;
+ onChange: (item: SelectableValue) => void;
+ tooltipContent?: PopoverContent;
+ isMenuOpen?: boolean;
+ onOpenMenu?: () => void;
+ onCloseMenu?: () => void;
+ tabSelectsValue?: boolean;
+ autoFocus?: boolean;
+}
+
+export class ButtonSelect extends PureComponent> {
+ onChange = (item: SelectableValue) => {
+ const { onChange } = this.props;
+ onChange(item);
+ };
+
+ render() {
+ const {
+ className,
+ options,
+ value,
+ label,
+ iconClass,
+ components,
+ maxMenuHeight,
+ tooltipContent,
+ isMenuOpen,
+ onOpenMenu,
+ onCloseMenu,
+ tabSelectsValue,
+ autoFocus = true,
+ } = this.props;
+ const combinedComponents = {
+ ...components,
+ Control: ButtonComponent({ label, className, iconClass }),
+ };
+
+ return (
+
+ );
+ }
+}
diff --git a/packages/grafana-ui/src/components/Forms/Legacy/Select/IndicatorsContainer.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/IndicatorsContainer.tsx
new file mode 100644
index 00000000000..260fe6ebbdf
--- /dev/null
+++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/IndicatorsContainer.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+
+// Ignoring because I couldn't get @types/react-select work wih Torkel's fork
+// @ts-ignore
+import { components } from '@torkelo/react-select';
+
+export const IndicatorsContainer = (props: any) => {
+ const isOpen = props.selectProps.menuIsOpen;
+ return (
+
+
+
+ );
+};
+
+export default IndicatorsContainer;
diff --git a/packages/grafana-ui/src/components/Select/NoOptionsMessage.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/NoOptionsMessage.tsx
similarity index 100%
rename from packages/grafana-ui/src/components/Select/NoOptionsMessage.tsx
rename to packages/grafana-ui/src/components/Forms/Legacy/Select/NoOptionsMessage.tsx
diff --git a/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.story.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.story.tsx
new file mode 100644
index 00000000000..f2356ee0a6b
--- /dev/null
+++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.story.tsx
@@ -0,0 +1,101 @@
+import React, { useState, useCallback } from 'react';
+import { action } from '@storybook/addon-actions';
+import { withKnobs, object } from '@storybook/addon-knobs';
+import { withCenteredStory } from '../../../../utils/storybook/withCenteredStory';
+import { UseState } from '../../../../utils/storybook/UseState';
+import { SelectableValue } from '@grafana/data';
+import { Select, AsyncSelect } from './Select';
+
+export default {
+ title: 'General/Select/Select',
+ component: Select,
+ decorators: [withCenteredStory, withKnobs],
+};
+
+const intialState: SelectableValue = { label: 'A label', value: 'A value' };
+
+const options = object>>('Options:', [
+ intialState,
+ { label: 'Another label', value: 'Another value 1' },
+ { label: 'Another label', value: 'Another value 2' },
+ { label: 'Another label', value: 'Another value 3' },
+ { label: 'Another label', value: 'Another value 4' },
+ { label: 'Another label', value: 'Another value 5' },
+ { label: 'Another label', value: 'Another value ' },
+]);
+
+export const basic = () => {
+ const value = object>('Selected Value:', intialState);
+
+ return (
+
+ {(value, updateValue) => {
+ return (
+
+ );
+};
+
+export const withAllowCustomValue = () => {
+ // @ts-ignore
+ const value = object>('Selected Value:', null);
+
+ return (
+
+ {(value, updateValue) => {
+ return (
+
+ );
+};
+
+export const asyncSelect = () => {
+ const [isLoading, setIsLoading] = useState(true);
+ const [value, setValue] = useState();
+ const loadAsyncOptions = useCallback(
+ inputValue => {
+ return new Promise>>(resolve => {
+ setTimeout(() => {
+ setIsLoading(false);
+ resolve(options.filter(option => option.label && option.label.includes(inputValue)));
+ }, 1000);
+ });
+ },
+ [value]
+ );
+ return (
+ {
+ action('onChange')(value);
+ setValue(value);
+ }}
+ />
+ );
+};
diff --git a/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx
new file mode 100644
index 00000000000..31231a7235e
--- /dev/null
+++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx
@@ -0,0 +1,327 @@
+// Libraries
+import classNames from 'classnames';
+import React, { PureComponent } from 'react';
+
+// Ignoring because I couldn't get @types/react-select work wih Torkel's fork
+// @ts-ignore
+import { default as ReactSelect } from '@torkelo/react-select';
+// @ts-ignore
+import Creatable from '@torkelo/react-select/creatable';
+// @ts-ignore
+import { CreatableProps } from 'react-select';
+// @ts-ignore
+import { default as ReactAsyncSelect } from '@torkelo/react-select/async';
+// @ts-ignore
+import { components } from '@torkelo/react-select';
+
+// Components
+import { SelectOption } from './SelectOption';
+import { SelectOptionGroup } from '../../../Select/SelectOptionGroup';
+import { SingleValue } from '../../../Select/SingleValue';
+import { SelectCommonProps, SelectAsyncProps } from '../../../Select/types';
+import IndicatorsContainer from './IndicatorsContainer';
+import NoOptionsMessage from './NoOptionsMessage';
+import resetSelectStyles from '../../../Select/resetSelectStyles';
+import { CustomScrollbar } from '../../../CustomScrollbar/CustomScrollbar';
+import { PopoverContent } from '../../../Tooltip/Tooltip';
+import { Tooltip } from '../../../Tooltip/Tooltip';
+import { SelectableValue } from '@grafana/data';
+
+/**
+ * Changes in new selects:
+ * - noOptionsMessage & loadingMessage is of string type
+ * - isDisabled is renamed to disabled
+ */
+type LegacyCommonProps = Omit, 'noOptionsMessage' | 'disabled' | 'value'>;
+
+interface AsyncProps extends LegacyCommonProps, Omit, 'loadingMessage'> {
+ loadingMessage?: () => string;
+ noOptionsMessage?: () => string;
+ tooltipContent?: PopoverContent;
+ isDisabled?: boolean;
+ value?: SelectableValue;
+}
+
+interface LegacySelectProps extends LegacyCommonProps {
+ tooltipContent?: PopoverContent;
+ noOptionsMessage?: () => string;
+ isDisabled?: boolean;
+ value?: SelectableValue;
+}
+
+export const MenuList = (props: any) => {
+ return (
+
+
+ {props.children}
+
+
+ );
+};
+export class Select extends PureComponent> {
+ static defaultProps: Partial> = {
+ className: '',
+ isDisabled: false,
+ isSearchable: true,
+ isClearable: false,
+ isMulti: false,
+ openMenuOnFocus: false,
+ autoFocus: false,
+ isLoading: false,
+ backspaceRemovesValue: true,
+ maxMenuHeight: 300,
+ tabSelectsValue: true,
+ allowCustomValue: false,
+ components: {
+ Option: SelectOption,
+ SingleValue,
+ IndicatorsContainer,
+ MenuList,
+ Group: SelectOptionGroup,
+ },
+ };
+
+ render() {
+ const {
+ defaultValue,
+ getOptionLabel,
+ getOptionValue,
+ onChange,
+ options,
+ placeholder,
+ width,
+ value,
+ className,
+ isDisabled,
+ isLoading,
+ isSearchable,
+ isClearable,
+ backspaceRemovesValue,
+ isMulti,
+ autoFocus,
+ openMenuOnFocus,
+ onBlur,
+ maxMenuHeight,
+ noOptionsMessage,
+ isOpen,
+ components,
+ tooltipContent,
+ tabSelectsValue,
+ onCloseMenu,
+ onOpenMenu,
+ allowCustomValue,
+ formatCreateLabel,
+ } = this.props;
+
+ let widthClass = '';
+ if (width) {
+ widthClass = 'width-' + width;
+ }
+
+ let SelectComponent: ReactSelect | Creatable = ReactSelect;
+ const creatableOptions: any = {};
+
+ if (allowCustomValue) {
+ SelectComponent = Creatable;
+ creatableOptions.formatCreateLabel = formatCreateLabel ?? ((input: string) => input);
+ }
+
+ const selectClassNames = classNames('gf-form-input', 'gf-form-input--form-dropdown', widthClass, className);
+ const selectComponents = { ...Select.defaultProps.components, ...components };
+ return (
+
+ {(onOpenMenuInternal, onCloseMenuInternal) => {
+ return (
+ noOptionsMessage}
+ isMulti={isMulti}
+ backspaceRemovesValue={backspaceRemovesValue}
+ menuIsOpen={isOpen}
+ onMenuOpen={onOpenMenuInternal}
+ onMenuClose={onCloseMenuInternal}
+ tabSelectsValue={tabSelectsValue}
+ {...creatableOptions}
+ />
+ );
+ }}
+
+ );
+ }
+}
+
+export class AsyncSelect extends PureComponent> {
+ static defaultProps: Partial> = {
+ className: '',
+ components: {},
+ loadingMessage: () => 'Loading...',
+ isDisabled: false,
+ isClearable: false,
+ isMulti: false,
+ isSearchable: true,
+ backspaceRemovesValue: true,
+ autoFocus: false,
+ openMenuOnFocus: false,
+ maxMenuHeight: 300,
+ };
+
+ render() {
+ const {
+ defaultValue,
+ getOptionLabel,
+ getOptionValue,
+ onChange,
+ placeholder,
+ width,
+ value,
+ className,
+ loadOptions,
+ defaultOptions,
+ isLoading,
+ loadingMessage,
+ noOptionsMessage,
+ isDisabled,
+ isSearchable,
+ isClearable,
+ backspaceRemovesValue,
+ autoFocus,
+ onBlur,
+ openMenuOnFocus,
+ maxMenuHeight,
+ isMulti,
+ tooltipContent,
+ onCloseMenu,
+ onOpenMenu,
+ isOpen,
+ } = this.props;
+
+ let widthClass = '';
+ if (width) {
+ widthClass = 'width-' + width;
+ }
+
+ const selectClassNames = classNames('gf-form-input', 'gf-form-input--form-dropdown', widthClass, className);
+
+ return (
+
+ {(onOpenMenuInternal, onCloseMenuInternal) => {
+ return (
+ loadingMessage}
+ noOptionsMessage={noOptionsMessage}
+ isDisabled={isDisabled}
+ isSearchable={isSearchable}
+ isClearable={isClearable}
+ autoFocus={autoFocus}
+ onBlur={onBlur}
+ openMenuOnFocus={openMenuOnFocus}
+ maxMenuHeight={maxMenuHeight}
+ isMulti={isMulti}
+ backspaceRemovesValue={backspaceRemovesValue}
+ />
+ );
+ }}
+
+ );
+ }
+}
+
+export interface TooltipWrapperProps {
+ children: (onOpenMenu: () => void, onCloseMenu: () => void) => React.ReactNode;
+ onOpenMenu?: () => void;
+ onCloseMenu?: () => void;
+ isOpen?: boolean;
+ tooltipContent?: PopoverContent;
+}
+
+export interface TooltipWrapperState {
+ isOpenInternal: boolean;
+}
+
+export class WrapInTooltip extends PureComponent {
+ state: TooltipWrapperState = {
+ isOpenInternal: false,
+ };
+
+ onOpenMenu = () => {
+ const { onOpenMenu } = this.props;
+ if (onOpenMenu) {
+ onOpenMenu();
+ }
+ this.setState({ isOpenInternal: true });
+ };
+
+ onCloseMenu = () => {
+ const { onCloseMenu } = this.props;
+ if (onCloseMenu) {
+ onCloseMenu();
+ }
+ this.setState({ isOpenInternal: false });
+ };
+
+ render() {
+ const { children, isOpen, tooltipContent } = this.props;
+ const { isOpenInternal } = this.state;
+
+ let showTooltip: boolean | undefined = undefined;
+
+ if (isOpenInternal || isOpen) {
+ showTooltip = false;
+ }
+
+ if (tooltipContent) {
+ return (
+
+
+ {/* div needed for tooltip */}
+ {children(this.onOpenMenu, this.onCloseMenu)}
+
+
+ );
+ } else {
+ return {children(this.onOpenMenu, this.onCloseMenu)}
;
+ }
+ }
+}
+
+export default Select;
diff --git a/packages/grafana-ui/src/components/Select/SelectOption.test.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.test.tsx
similarity index 100%
rename from packages/grafana-ui/src/components/Select/SelectOption.test.tsx
rename to packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.test.tsx
diff --git a/packages/grafana-ui/src/components/Select/SelectOption.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.tsx
similarity index 100%
rename from packages/grafana-ui/src/components/Select/SelectOption.tsx
rename to packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.tsx
diff --git a/packages/grafana-ui/src/components/Select/_Select.scss b/packages/grafana-ui/src/components/Forms/Legacy/Select/_Select.scss
similarity index 100%
rename from packages/grafana-ui/src/components/Select/_Select.scss
rename to packages/grafana-ui/src/components/Forms/Legacy/Select/_Select.scss
diff --git a/packages/grafana-ui/src/components/Select/__snapshots__/SelectOption.test.tsx.snap b/packages/grafana-ui/src/components/Forms/Legacy/Select/__snapshots__/SelectOption.test.tsx.snap
similarity index 100%
rename from packages/grafana-ui/src/components/Select/__snapshots__/SelectOption.test.tsx.snap
rename to packages/grafana-ui/src/components/Forms/Legacy/Select/__snapshots__/SelectOption.test.tsx.snap
diff --git a/packages/grafana-ui/src/components/Forms/Select/ButtonSelect.tsx b/packages/grafana-ui/src/components/Forms/Select/ButtonSelect.tsx
deleted file mode 100644
index 385ff160b85..00000000000
--- a/packages/grafana-ui/src/components/Forms/Select/ButtonSelect.tsx
+++ /dev/null
@@ -1,89 +0,0 @@
-import React from 'react';
-import { css } from 'emotion';
-import { GrafanaTheme } from '@grafana/data';
-
-import { Button, ButtonVariant, ButtonProps } from '../../Button';
-import { ComponentSize } from '../../../types/size';
-import { SelectCommonProps, CustomControlProps } from './types';
-import { SelectBase } from './SelectBase';
-import { stylesFactory, useTheme } from '../../../themes';
-import { Icon } from '../../Icon/Icon';
-import { IconType } from '../../Icon/types';
-
-interface ButtonSelectProps extends Omit, 'renderControl' | 'size' | 'prefix'> {
- icon?: IconType;
- variant?: ButtonVariant;
- size?: ComponentSize;
-}
-
-interface SelectButtonProps extends Omit {
- icon?: IconType;
- isOpen?: boolean;
-}
-
-const SelectButton = React.forwardRef(
- ({ icon, children, isOpen, ...buttonProps }, ref) => {
- const getStyles = stylesFactory((theme: GrafanaTheme) => ({
- wrapper: css`
- display: flex;
- align-items: center;
- justify-content: space-between;
- max-width: 200px;
- text-overflow: ellipsis;
- `,
- iconWrap: css`
- padding: 0 15px 0 0;
- `,
- caretWrap: css`
- padding-left: ${theme.spacing.sm};
- margin-left: ${theme.spacing.sm};
- margin-right: -${theme.spacing.sm};
- height: 100%;
- `,
- }));
- const styles = getStyles(useTheme());
- const buttonIcon = `fa fa-${icon}`;
- const caretIcon = isOpen ? 'caret-up' : 'caret-down';
- return (
-
- );
- }
-);
-
-export function ButtonSelect({
- placeholder,
- icon,
- variant = 'primary',
- size = 'md',
- className,
- disabled,
- ...selectProps
-}: ButtonSelectProps) {
- const buttonProps = {
- icon,
- variant,
- size,
- className,
- disabled,
- };
-
- return (
- >(({ onBlur, onClick, value, isOpen }, ref) => {
- return (
-
- {value ? value.label : placeholder}
-
- );
- })}
- />
- );
-}
diff --git a/packages/grafana-ui/src/components/Forms/Select/IndicatorsContainer.tsx b/packages/grafana-ui/src/components/Forms/Select/IndicatorsContainer.tsx
deleted file mode 100644
index 077f773a606..00000000000
--- a/packages/grafana-ui/src/components/Forms/Select/IndicatorsContainer.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import { useTheme } from '../../../themes/ThemeContext';
-import { getInputStyles } from '../Input/Input';
-import { cx, css } from 'emotion';
-
-export const IndicatorsContainer = React.forwardRef>((props, ref) => {
- const { children } = props;
- const theme = useTheme();
- const styles = getInputStyles({ theme, invalid: false });
-
- return (
-
- {children}
-
- );
-});
diff --git a/packages/grafana-ui/src/components/Forms/Select/Select.story.tsx b/packages/grafana-ui/src/components/Forms/Select/Select.story.tsx
deleted file mode 100644
index fef35ed06cd..00000000000
--- a/packages/grafana-ui/src/components/Forms/Select/Select.story.tsx
+++ /dev/null
@@ -1,300 +0,0 @@
-import React, { useState } from 'react';
-import { Select, AsyncSelect, MultiSelect, AsyncMultiSelect } from './Select';
-import { withCenteredStory, withHorizontallyCenteredStory } from '../../../utils/storybook/withCenteredStory';
-import { SelectableValue } from '@grafana/data';
-import { getAvailableIcons, IconType } from '../../Icon/types';
-import { select, boolean } from '@storybook/addon-knobs';
-import { Icon } from '../../Icon/Icon';
-import { Button } from '../../Button';
-import { ButtonSelect } from './ButtonSelect';
-import { getIconKnob } from '../../../utils/storybook/knobs';
-import kebabCase from 'lodash/kebabCase';
-import { generateOptions } from './mockOptions';
-
-export default {
- title: 'Forms/Select',
- component: Select,
- decorators: [withCenteredStory, withHorizontallyCenteredStory],
-};
-
-const loadAsyncOptions = () => {
- return new Promise>>(resolve => {
- setTimeout(() => {
- resolve(generateOptions());
- }, 2000);
- });
-};
-
-const getKnobs = () => {
- const BEHAVIOUR_GROUP = 'Behaviour props';
- const disabled = boolean('Disabled', false, BEHAVIOUR_GROUP);
- const invalid = boolean('Invalid', false, BEHAVIOUR_GROUP);
- const loading = boolean('Loading', false, BEHAVIOUR_GROUP);
- const prefixSuffixOpts = {
- None: null,
- Text: '$',
- ...getAvailableIcons().reduce>((prev, c) => {
- return {
- ...prev,
- [`Icon: ${c}`]: `icon-${c}`,
- };
- }, {}),
- };
- const VISUAL_GROUP = 'Visual options';
- // ---
- const prefix = select('Prefix', prefixSuffixOpts, null, VISUAL_GROUP);
-
- let prefixEl: any = prefix;
- if (prefix && prefix.match(/icon-/g)) {
- prefixEl = ;
- }
-
- return {
- disabled,
- invalid,
- loading,
- prefixEl,
- };
-};
-
-const getDynamicProps = () => {
- const knobs = getKnobs();
- return {
- disabled: knobs.disabled,
- isLoading: knobs.loading,
- invalid: knobs.invalid,
- prefix: knobs.prefixEl,
- };
-};
-
-export const basic = () => {
- const [value, setValue] = useState>();
-
- return (
- <>
-