@gechiui/components
Version:
UI components for GeChiUI.
92 lines (81 loc) • 2.8 kB
text/typescript
/**
* External dependencies
*/
// eslint-disable-next-line no-restricted-imports
import type {
CSSProperties,
ReactNode,
ChangeEvent,
SyntheticEvent,
} from 'react';
import type { useDrag } from 'react-use-gesture';
/**
* Internal dependencies
*/
import type { StateReducer } from './reducer/state';
import type { FlexProps } from '../flex/types';
import type { GeChiUIComponentProps } from '../ui/context';
export type LabelPosition = 'top' | 'bottom' | 'side' | 'edge';
export type DragDirection = 'n' | 's' | 'e' | 'w';
export type DragProps = Parameters< Parameters< typeof useDrag >[ 0 ] >[ 0 ];
interface BaseProps {
__unstableInputWidth?: CSSProperties[ 'width' ];
hideLabelFromVision?: boolean;
isFocused: boolean;
labelPosition?: LabelPosition;
size?: 'default' | 'small';
}
export type InputChangeCallback<
E = ChangeEvent< HTMLInputElement >,
P = {}
> = ( nextValue: string | undefined, extra: { event: E } & P ) => void;
export interface InputFieldProps extends BaseProps {
dragDirection?: DragDirection;
dragThreshold?: number;
isDragEnabled?: boolean;
isPressEnterToChange?: boolean;
onChange?: InputChangeCallback;
onValidate?: (
nextValue: string,
event?: SyntheticEvent< HTMLInputElement >
) => void;
setIsFocused: ( isFocused: boolean ) => void;
stateReducer?: StateReducer;
value?: string;
onDragEnd?: ( dragProps: DragProps ) => void;
onDragStart?: ( dragProps: DragProps ) => void;
onDrag?: ( dragProps: DragProps ) => void;
}
export interface InputBaseProps extends BaseProps, FlexProps {
children: ReactNode;
prefix?: ReactNode;
suffix?: ReactNode;
disabled?: boolean;
className?: string;
id?: string;
label?: ReactNode;
}
export interface InputControlProps
extends Omit< InputBaseProps, 'children' | 'isFocused' >,
/**
* The `prefix` prop in `GeChiUIComponentProps< InputFieldProps, 'input', false >` comes from the
* `HTMLInputAttributes` and clashes with the one from `InputBaseProps`. So we have to omit it from
* `GeChiUIComponentProps< InputFieldProps, 'input', false >` in order that `InputBaseProps[ 'prefix' ]`
* be the only prefix prop. Otherwise it tries to do a union of the two prefix properties and you end up
* with an unresolvable type.
*
* `isFocused` and `setIsFocused` are managed internally by the InputControl, but the rest of the props
* for InputField are passed through.
*/
Omit<
GeChiUIComponentProps< InputFieldProps, 'input', false >,
'stateReducer' | 'prefix' | 'isFocused' | 'setIsFocused'
> {
__unstableStateReducer?: InputFieldProps[ 'stateReducer' ];
}
export interface InputControlLabelProps {
children: ReactNode;
hideLabelFromVision?: BaseProps[ 'hideLabelFromVision' ];
labelPosition?: BaseProps[ 'labelPosition' ];
size?: BaseProps[ 'size' ];
}