@crossed/ui
Version:
A universal & performant styling library for React Native, Next.js & React
62 lines (49 loc) • 1.78 kB
text/typescript
/**
* Copyright (c) Paymium.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root of this projects source tree.
*/
import type { ComponentType, ReactNode } from 'react';
import { ReferenceType, useFloating } from '@floating-ui/react';
import { ReactFocusOnProps } from 'react-focus-on/dist/es5/types';
import { SelectLabelProps } from './Label';
import { SelectConfigContext, SelectValueContext } from './context';
import { UseUncontrolledInput } from '@crossed/core';
export type ValueType = string | number | (string | number)[];
export type ValueTypeMultiple = ValueType[];
export type ItemList = {
value: ValueType;
label: ReactNode;
search?: ValueType;
};
export type ItemSection = { title: string; data: ItemList[] };
export type Item = ItemList | ItemSection;
export type UseFloating<T extends ReferenceType = ReferenceType> =
typeof useFloating<T>;
export type FocusProps = ReactFocusOnProps;
export type FocusComponent = ComponentType<FocusProps>;
////////////////////////
// Select Props
////////////////////////
type Base = Pick<SelectLabelProps, 'label' | 'description' | 'extra'> &
Pick<SelectConfigContext, 'multiple' | 'clearable' | 'searchable'> &
Partial<Pick<UseUncontrolledInput<ValueType>, 'defaultValue' | 'onChange'>> &
Pick<SelectValueContext, 'renderValue'> &
Partial<Pick<SelectValueContext, 'value'>> & {
error?: string;
disabled?: boolean;
id?: string;
onSearch?: (_search: string) => void;
loading?: boolean;
children?: ReactNode;
};
type SelectSectionProps = Base & {
items: ItemSection[];
section: true;
};
type SelectListProps = Base & {
items: ItemList[];
section?: never;
};
export type SelectProps = SelectListProps | SelectSectionProps;