Advertisement
danielvitor23

Input

Feb 24th, 2024
914
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use client'
  2.  
  3. import { InputHTMLAttributes, forwardRef } from 'react'
  4. import { cva } from 'class-variance-authority'
  5. import { twMerge } from 'tailwind-merge'
  6. import { clsx } from 'clsx'
  7.  
  8. import './input.styles.css'
  9.  
  10. export interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
  11.   name?: string | undefined
  12.   error?: boolean
  13.   sz?: 'small' | 'medium' | 'large'
  14. }
  15.  
  16. const Input = forwardRef<HTMLInputElement, InputProps>(
  17.   ({ name, className, placeholder, error, sz = 'medium', ...props }, ref) => {
  18.     const variants = cva(
  19.       clsx({
  20.         'w-full rounded-md bg-transparent box-border outline-none transition-all duration-300 ease-in-out focus-visible:text-handle-blue border-[0.094rem] border-custom-gray-300 focus-visible:border-handle-blue peer':
  21.           true,
  22.         'text-handle-red-500 border-handle-red-500 focus-visible:text-handle-red-500 focus-visible:border-handle-red-500':
  23.           error,
  24.       }),
  25.       {
  26.         variants: {
  27.           sz: {
  28.             small: ['px-2 py-2', 'text-sm'],
  29.             medium: ['px-3 py-2', 'text-base'],
  30.             large: ['px-4 py-2', 'text-lg'],
  31.           },
  32.         },
  33.         defaultVariants: {
  34.           sz: 'medium',
  35.         },
  36.       },
  37.     )
  38.  
  39.     return (
  40.       <div className={twMerge('relative bg-inherit', className)}>
  41.         <input
  42.           ref={ref}
  43.           id={name}
  44.           type="text"
  45.           className={twMerge(variants({ sz }))}
  46.           {...props}
  47.           placeholder=" "
  48.         />
  49.         <label
  50.           htmlFor={props.id}
  51.           className={twMerge(
  52.             'absolute top-0 -translate-y-1/2 left-2 px-1 py-0 text-xs bg-inherit transition-all duration-300 ease-in-out pointer-events-none',
  53.             error
  54.               ? 'text-handle-red-500'
  55.               : 'text-custom-gray-300 peer-focus-visible:text-handle-blue',
  56.           )}
  57.         >
  58.           {placeholder}
  59.         </label>
  60.       </div>
  61.     )
  62.   },
  63. )
  64.  
  65. Input.displayName = 'Input'
  66.  
  67. export { Input }
  68.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement