UNPKG

@wordpress/components

Version:
310 lines (294 loc) 7.97 kB
/** * External dependencies */ import type { CSSProperties, FocusEventHandler, MouseEventHandler, MutableRefObject, } from 'react'; /** * Internal dependencies */ import type { BaseControlProps } from '../base-control/types'; import type { IconType } from '../icon'; export type NumericProps = { /** * The minimum `value` allowed. * * @default 0 */ min?: number; /** * The maximum `value` allowed. * * @default 100 */ max?: number; /** * The current value of the range slider. */ value?: number; }; export type RangeMark = { value: number; label?: string }; // An expanded definition of this type is used in MarkProps to improve Storybook // generated docs. export type RangeMarks = boolean | RangeMark[]; export type MarksProps = NumericProps & { /** * Disables the `input`, preventing new values from being applied. * * @default false */ disabled?: boolean; /** * Renders a visual representation of `step` ticks. Custom mark indicators * can be provided by an `Array`. * * @default false */ marks?: boolean | { value: number; label?: string }[]; /** * The minimum amount by which `value` changes. It is also a factor in * validation as `value` must be a multiple of `step` (offset by `min`) to * be valid. Accepts the special string value `any` that voids the * validation constraint and overrides both `withInputField` and * `showTooltip` props to `false`. * * @default 1 */ step?: number | 'any'; }; export type RangeMarkProps = { isFilled?: boolean; label?: string; disabled?: boolean; key?: string; style?: CSSProperties; }; export type ControlledRangeValue = number | '' | null; export type RangeControlProps = Pick< BaseControlProps, 'hideLabelFromVision' | 'help' | '__nextHasNoMarginBottom' > & MarksProps & { /** * If this property is added, an Icon component will be rendered * after the slider with the icon equal to afterIcon. * * For more information on `IconType` see the Icon component: * /packages/components/src/icon/index.tsx */ afterIcon?: IconType; /** * If this property is true, a button to reset the slider is * rendered. * * @default false */ allowReset?: boolean; /** * If this property is added, an Icon component will be rendered * before the slider with the icon equal to beforeIcon. * * For more information on `IconType` see the Icon component: * /packages/components/src/icon/index.tsx */ beforeIcon?: IconType; /** * CSS color string for the `RangeControl` wrapper. * * @default COLORS.theme.accent * @see /packages/components/src/utils/colors-values.js */ color?: CSSProperties[ 'color' ]; /** * The current input to use as a fallback if `value` is currently * `undefined`. */ currentInput?: number; /** * An icon to be shown above the slider next to its container title. */ icon?: string; /** * The slider starting position, used when no `value` is passed. * The `initialPosition` will be clamped between the provided `min` * and `max` prop values. */ initialPosition?: number; /** * Passed as a prop to the `NumberControl` component and is only * applicable if `withInputField` is true. If true, while the number * input has focus, pressing `UP` or `DOWN` along with the `SHIFT` key * will change the value by the `shiftStep` value. * * @default true */ isShiftStepEnabled?: boolean; /** * If this property is added, a label will be generated using label * property as the content. */ label?: string; /** * Callback for when `RangeControl` input loses focus. * * @default () => void */ onBlur?: FocusEventHandler< HTMLInputElement >; /** * A function that receives the new value. The value will be less than * `max` and more than `min` unless a reset (enabled by `allowReset`) * has occurred. In which case the value will be either that of * `resetFallbackValue` if it has been specified or otherwise * `undefined`. * * @default () => void */ onChange?: ( value?: number ) => void; /** * Callback for when `RangeControl` input gains focus. * * @default () => void */ onFocus?: FocusEventHandler< HTMLInputElement >; /** * Callback for when mouse exits the `RangeControl`. * * @default () => void */ onMouseLeave?: MouseEventHandler< HTMLInputElement >; /** * Callback for when mouse moves within the `RangeControl`. * * @default () => void */ onMouseMove?: MouseEventHandler< HTMLInputElement >; /** * CSS color string to customize the rail element's background. */ railColor?: CSSProperties[ 'color' ]; /** * A way to customize the rendered UI of the value. * * @default ( value ) => value */ renderTooltipContent?: ( value?: ControlledRangeValue ) => string | number | null | undefined; /** * The value to revert to if the Reset button is clicked (enabled by * `allowReset`) */ resetFallbackValue?: number; /** * Define if separator line under/above control row should be disabled * or full width. By default it is placed below excluding underline the * control icon. */ separatorType?: 'none' | 'fullWidth' | 'topFullWidth'; /** * Passed as a prop to the `NumberControl` component and is only * applicable if `withInputField` and `isShiftStepEnabled` are both true * and while the number input has focus. Acts as a multiplier of `step`. * * @default 10 */ shiftStep?: number; /** * Start opting into the larger default height that will become the default size in a future version. * * @default false */ __next40pxDefaultSize?: boolean; /** * Forcing the Tooltip UI to show or hide. This is overridden to `false` * when `step` is set to the special string value `any`. */ showTooltip?: boolean; /** * CSS color string to customize the track element's background. */ trackColor?: CSSProperties[ 'color' ]; /** * Define if the value selection should present a stepper control or a * slider control in the bottom sheet on mobile. To use the stepper set * the type value as `stepper`. Defaults to slider if no option is * provided. */ type?: 'stepper'; /** * Determines if the `input` number field will render next to the * RangeControl. This is overridden to `false` when `step` is set to the * special string value `any`. * * @default true */ withInputField?: boolean; /** * Do not throw a warning for the deprecated 36px default size. * For internal components of other components that already throw the warning. * * @ignore */ __shouldNotWarnDeprecated36pxSize?: boolean; }; export type RailProps = MarksProps & { railColor?: CSSProperties[ 'color' ]; }; export type InputRangeProps = { describedBy?: string; label?: string; onMouseLeave?: MouseEventHandler< HTMLInputElement >; onMouseMove?: MouseEventHandler< HTMLInputElement >; value?: number | ''; }; export type WrapperProps = Pick< BaseControlProps, '__nextHasNoMarginBottom' > & { color?: CSSProperties[ 'color' ]; marks?: RangeMarks; }; export type ThumbProps = { isFocused?: boolean; disabled?: boolean; }; export type TooltipProps = { show?: boolean; placement?: string; inputRef?: MutableRefObject< HTMLElement | undefined >; tooltipPlacement?: string; value?: ControlledRangeValue; renderTooltipContent?: ( value?: ControlledRangeValue ) => string | number | null | undefined; zIndex?: number; }; export type TrackProps = { disabled: boolean; trackColor: CSSProperties[ 'color' ]; }; export type UseControlledRangeValueArgs = { /** * The initial value. */ initial?: number; /** * The maximum value. */ max: number; /** * The minimum value. */ min: number; /** * The current value. */ value: number | null; }; export type UseMarksArgs = NumericProps & { marks: RangeMarks; step: number; };