OctaneInput.tsx 2 Ko
Télécharger le fichier
import { DetailedHTMLProps, InputHTMLAttributes, PropsWithChildren, Ref } from 'react';
import { NumberInput, NumberInputProps } from '../common/NumberInput';
import { classNames } from './classNames';
const classes = {
base: 'block w-full bg-white text-black placeholder-gray-400 border border-gray-300 shadow-sm appearance-none',
disabled: '',
size: {
default: 'px-2 py-2 font-medium'
},
rounded: 'rounded-md',
color: {
default: 'focus:outline-none'
}
};
type OctaneInputProps = PropsWithChildren<{
color?: 'default' | 'dark' | 'ghost';
inputSize?: 'xs' | 'sm' | 'default' | 'lg' | 'xl';
rounded?: boolean;
ref?: Ref<HTMLInputElement>;
}> &
DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>;
export const OctaneInput = ({
ref,
color = 'default',
inputSize = 'default',
rounded = true,
disabled = false,
type = 'text',
autoComplete = 'off',
className = null,
...rest
}: OctaneInputProps) => {
const composedClassName = classNames(
classes.base,
classes.size[inputSize],
rounded && classes.rounded,
classes.color[color],
disabled && classes.disabled,
className
);
// A number box is a Base UI number field; the change event keeps `target.value` / `target.valueAsNumber`.
if (type === 'number') {
return <NumberInput {...(rest as unknown as NumberInputProps)} ref={ref} autoComplete={autoComplete} className={composedClassName} disabled={disabled} />;
}
return (
<input
ref={ref}
autoComplete={autoComplete}
className={classNames(
classes.base,
classes.size[inputSize],
rounded && classes.rounded,
classes.color[color],
disabled && classes.disabled,
className
)}
disabled={disabled}
type={type}
{...rest}
/>
);
};
