1.0.0 • Published 4 months ago

@darksnow-ui/input v1.0.0

Weekly downloads
-
License
MIT
Repository
-
Last release
4 months ago

@darksnow-ui/input

A flexible and customizable Input component for React applications.

Installation

pnpm add @darksnow-ui/input

Usage

import { Input } from "@darksnow-ui/input"
import "@darksnow-ui/input/styles.css"

function App() {
  return <Input placeholder="Enter your email" variant="default" size="md" />
}

Props

PropTypeDefaultDescription
variant'default' \| 'error' \| 'success''default'Visual variant of the input
size'sm' \| 'md' \| 'lg''md'Size of the input
leftIconReactNode-Icon to display on the left side
rightIconReactNode-Icon to display on the right side
isLoadingbooleanfalseWhether the input is in a loading state
focusRingbooleantrueWhether to show focus ring
...propsInputHTMLAttributes-All native input attributes

Examples

Basic Usage

<Input type="email" placeholder="Email" />

With Label

import { Label } from "@darksnow-ui/label"

<div className="grid w-full max-w-sm items-center gap-1.5">
  <Label htmlFor="email">Email</Label>
  <Input type="email" id="email" placeholder="Email" />
</div>

With Icons

import { Input } from '@darksnow-ui/input'
import { Search, Mail } from 'lucide-react'

// Left icon
<Input
  leftIcon={<Search size={16} />}
  placeholder="Search..."
/>

// Right icon
<Input
  rightIcon={<Mail size={16} />}
  placeholder="Email"
  type="email"
/>

Variants

// Default
<Input variant="default" placeholder="Default input" />

// Error
<Input variant="error" placeholder="Error state" />

// Success
<Input variant="success" placeholder="Success state" />

Sizes

<Input size="sm" placeholder="Small input" />
<Input size="md" placeholder="Medium input" />
<Input size="lg" placeholder="Large input" />

States

// Disabled
<Input disabled type="email" placeholder="Email" />

// Loading
<Input isLoading placeholder="Loading..." />

// Without focus ring
<Input focusRing={false} placeholder="No focus ring" />

Input Types

<div className="space-y-4">
  <div>
    <Label htmlFor="text">Text</Label>
    <Input id="text" type="text" placeholder="Enter text" />
  </div>
  
  <div>
    <Label htmlFor="password">Password</Label>
    <Input id="password" type="password" placeholder="Enter password" />
  </div>
  
  <div>
    <Label htmlFor="number">Number</Label>
    <Input id="number" type="number" placeholder="Enter number" />
  </div>
  
  <div>
    <Label htmlFor="date">Date</Label>
    <Input id="date" type="date" />
  </div>
  
  <div>
    <Label htmlFor="time">Time</Label>
    <Input id="time" type="time" />
  </div>
  
  <div>
    <Label htmlFor="file">File</Label>
    <Input id="file" type="file" />
  </div>
</div>

With Button

import { Button } from "@darksnow-ui/button"

<div className="flex w-full max-w-sm items-center space-x-2">
  <Input type="email" placeholder="Email" />
  <Button type="submit">Subscribe</Button>
</div>

Form Example

import { Button } from "@darksnow-ui/button"
import { Label } from "@darksnow-ui/label"

<form className="space-y-4 max-w-sm">
  <div>
    <Label htmlFor="name">Full Name</Label>
    <Input 
      id="name" 
      type="text" 
      placeholder="John Doe" 
      required 
    />
  </div>
  
  <div>
    <Label htmlFor="email">Email</Label>
    <Input 
      id="email" 
      type="email" 
      placeholder="john@example.com" 
      required 
    />
  </div>
  
  <div>
    <Label htmlFor="phone">Phone</Label>
    <Input 
      id="phone" 
      type="tel" 
      placeholder="+1 (555) 123-4567"
      leftIcon={<Phone size={16} />}
    />
  </div>
  
  <Button type="submit" className="w-full">
    Submit
  </Button>
</form>

Search Input

import { Search, X } from "lucide-react"

<div className="relative">
  <Input
    type="search"
    placeholder="Search..."
    leftIcon={<Search size={16} />}
    rightIcon={<X size={16} />}
    className="pr-10"
  />
</div>

CSS Variables

You can customize the appearance using CSS variables:

:root {
  --darksnow-input-border: #e5e7eb;
  --darksnow-input-bg: #ffffff;
  --darksnow-input-color: #111827;
  --darksnow-input-border-hover: #d1d5db;
  --darksnow-input-border-focus: #3b82f6;
  --darksnow-input-focus-ring: rgba(59, 130, 246, 0.15);
  --darksnow-input-placeholder: #9ca3af;
  --darksnow-input-icon-color: #6b7280;
  --darksnow-input-radius: 0.375rem;

  /* Error variant */
  --darksnow-input-error-border: #ef4444;
  --darksnow-input-error-border-hover: #dc2626;
  --darksnow-input-error-focus-ring: rgba(239, 68, 68, 0.15);

  /* Success variant */
  --darksnow-input-success-border: #10b981;
  --darksnow-input-success-border-hover: #059669;
  --darksnow-input-success-focus-ring: rgba(16, 185, 129, 0.15);
}
1.0.0

4 months ago