import React, { forwardRef, useContext, useId } from 'react' import { ExclamationCircleIcon } from '@heroicons/react/24/outline' import { omit } from 'ramda' import { Loader } from './loader' import clsx from 'clsx' const ControlContext = React.createContext({}) function ControlProvider({ children, ...props }) { return ( {children} ) } function useControl(props) { const field = useContext(ControlContext) return { ...field, ...props } } export const Control = forwardRef(function Control( { as = 'div', children, ...props }, ref, ) { const id = useId() const props_ = omit(['id'], props) return ( {React.createElement(as, { ref, ...props }, children)} ) }) export function Button({ children, as = 'button', className, isLoading = false, ...props }) { if (isLoading) { props['disabled'] = isLoading } return React.createElement( as, { className: clsx( 'font-medium text-green-primary rounded-lg bg-green-secondary hover:bg-green-support', 'h-12 px-4 relative', 'disabled:bg-green-secondary/50 disabled:pointer-events-none', 'transition', className, ), ...props, }, <> {isLoading && (
)} {children} , ) } export function Label({ children, className, ...props }) { const { id, htmlFor, className: _, ...field } = useControl(props) return ( ) } export const Input = forwardRef(function Input( { as = 'input', size = 'base', className, children, ...props }, ref, ) { const { className: _, ...field } = useControl(props) const sizes = { base: 'h-12' } return React.createElement( as, { className: clsx( 'bg-white outline-none px-4 rounded-lg transition', 'border border-green-light dark:border-gray-700 dark:bg-gray-800', 'focus:ring-1 focus:border-green-secondary focus:ring-green-secondary focus:placeholder:text-transparent', // Tailwind's won't inherit focus behavior; you must define it explicitly for both modes. 'dark:focus:border-green-secondary', 'aria-[invalid=true]:border-red-400 aria-[invalid=true]:ring-red-400', 'dark:aria-[invalid=true]:border-red-500 dark:aria-[invalid=true]:ring-red-500', 'disabled:text-gray-400 disabled:border-gray-300 disabled:bg-gray-200', 'dark:disabled:text-gray-500 dark:disabled:bg-gray-700', sizes?.[size], className, ), ref, ...field, }, children, ) }) export const Checkbox = forwardRef(function Checkbox( { className, ...props }, ref, ) { const { className: _, ...field } = useControl(props) return ( ) }) export function Error({ children }) { return (
{children}
) }