🧩@omergulcicek/forms

Advanced Form Fields

Smart masking and validation for React Hook Form with TypeScript support

TypeScriptReact Hook Formshadcn/ui
Before
Standard HTML inputs
❌ No masking
❌ No validation
❌ No formatting
HTML + Masking
With @omergulcicek/forms
✅ Auto masking
✅ Keyboard validation
✅ Regex support
🎨 shadcn/ui + Masking
Perfect experience
✅ All features
✅ Modern design
✅ Accessible
🔥 All Input Types
Complete field collection

💳 Payment Information

Form fields values

Card Number:
Card Number Masked:

Expiry Date:
Expiry Date Masked:

CVV:
CVV Masked:

👤 Personal Information

📦 Installation

Quick Start

npm install @omergulcicek/forms

Peer Dependencies

npm install react-hook-form use-mask-input

Required for full functionality

✅ Keyboard validation
✅ Smart masking
✅ TypeScript support
✅ shadcn/ui ready
✅ 10+ input types
✅ Easy integration
💻 Usage
"use client"

import { useForm } from "react-hook-form"
import { useHookFormMask } from "use-mask-input"
import { useFormFields } from "@omergulcicek/forms"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Button } from "@/components/ui/button"

export default function PaymentForm() {
  const form = useForm()
  const registerWithMask = useHookFormMask(form.register)

  const { cardNumber, expiryDate, cvv, phone } = useFormFields({
    fields: [
      { name: "cardNumber", type: "cardNumber" },
      { name: "expiryDate", type: "expiryDate" },
      { name: "cvv", type: "cvv" },
      { name: "phone", type: "phone" }
    ],
    registerWithMask,
    form
  })

  const handleSubmit = (data: Record<string, unknown>) => {
    console.log("Form Data:", data)
  }

  return (
    <form onSubmit={form.handleSubmit(handleSubmit)} className="space-y-4">
      <div>
        <Label>Card Number</Label>
        <Input {...cardNumber} placeholder="**** **** **** ****" />
      </div>
      
      <div className="grid grid-cols-2 gap-4">
        <div>
          <Label>Expiry</Label>
          <Input {...expiryDate} placeholder="MM/YY" />
        </div>
        <div>
          <Label>CVV</Label>
          <Input {...cvv} placeholder="***" />
        </div>
      </div>
      
      <div>
        <Label>Phone</Label>
        <Input {...phone} placeholder="(5xx) xxx xx xx" />
      </div>

      <Button type="submit">Submit</Button>
    </form>
  )
}