Skip to main content

Overview

The Input component provides a versatile text input with support for various types, validation states, icons, and helper text.

Basic Usage

  • Code
  • Preview
import { useState } from "react";
import { Input } from "@peppermint-design/devreadykit";

export default function InputExample() {
  const [value, setValue] = useState('');

  return (
    <div className="flex min-w-[230px] flex-col gap-4">
      <Input
        value={value}
        onChange={(nextValue) => setValue(String(nextValue))}
        label="Full name"
        placeholder="e.g., Ada Lovelace"
        supportText="Use your legal name as on your ID."
      />
    </div>
  );
}

Input Types

  • Code
  • Preview
import { useState } from "react";
import Input from "@peppermint-design/devreadykit";

export default function InputTypes() {
    const [numberValue, setNumberValue] = useState<number | string>("");
    const [password, setPassword] = useState<string>("");

    return (
        <div className="flex items-center flex-col gap-4 w-full">
            <div className="w-full flex flex-col gap-6">
                <Input
                    type="text"
                    placeholder="Enter your name"
                    label="Full Name"
                />

                <Input
                    type="number"
                    placeholder="0"
                    label="Quantity"
                    value={numberValue}
                    onChange={setNumberValue}
                />

                <Input
                    type="password"
                    placeholder="Enter password"
                    label="Password"
                    value={password}
                    onChange={(value) => setPassword(String(value))}
                />
            </div>
        </div>
    );
}

With Labels and Helper Text

  • Code
  • Preview
 import { useState } from "react";
 import Input from "@peppermint-design/devreadykit";

export default function InputWithLabels() {
    const [email, setEmail] = useState<string>("");
    const [required, setRequired] = useState<string>("");

    return (
        <div className="flex items-center flex-col gap-4 w-full">
            <div className="w-full flex flex-col gap-6">
                <Input
                    label="Email Address"
                    placeholder="user@example.com"
                    supportText="We'll never share your email"
                    value={email}
                    onChange={(value) => setEmail(String(value))}
                />

                <Input
                    label="Required Field"
                    placeholder="This field is required"
                    required
                    value={required}
                    onChange={(value) => setRequired(String(value))}
                />
            </div>
        </div>
    );
}

With Icons

Start Icon

  • Code
  • Preview
import Input from "@peppermint-design/devreadykit";
import { Circle } from "@/assets/icons/circle.tsx";

export default function InputWithIcons() {
  return (
    <div className="flex items-center flex-col gap-4 w-full">
        <Input
          placeholder="Amount"
          type="number"
          label="Amount"
          startIcon={<Circle />}
        />
    </div>
  );
}

Validation States

Error State

  • Code
  • Preview
<Input 
  placeholder="Enter email"
  label="Email"
  errorMessage="Please enter a valid email address"
  value="invalid-email"
/>

States

Disabled and read only

  • Code
  • Preview
import Input from "@peppermint-design/devreadykit";

export default function InputStates() {
  return (
    <div className="flex items-center flex-col gap-4 w-full">
      <div className="w-full flex flex-col gap-6">
        <Input
          placeholder="Disabled input"
          label="Disabled Field"
          value="Cannot edit this"
          disabled
        />

        <Input
          placeholder="Read only input"
          label="Read Only Field"
          value="Cannot edit this"
          readOnly
        />
      </div>
    </div>
  );
}

Props

PropTypeDefaultDescription
type"text" | "number" | "password""text"Input type
labelstringInput label
placeholderstringPlaceholder text
valuestring | number""Input value
onChange(value: string | number) => voidChange handler
disabledbooleanfalseDisabled state
readOnlybooleanfalseRead only state
requiredbooleanfalseRequired field indicator
errorMessagestringError message
supportTextstringHelper text
startIconReact.ReactNodeIcon at start of input
endIconReact.ReactNodeIcon at end of input
actionReact.ReactNodeAction button
minnumberMinimum value (number inputs)
maxnumberMaximum value (number inputs)
stepnumber1Step value (number inputs)
classNamestring""Additional CSS classes

Examples

Contact Form

  • Code
  • Preview
import { Input, Button } from '@peppermint-design/devreadykit';
import { useState } from 'react';

function ContactFormExample() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    phone: ''
  });

  const handleSubmit = (e) => {
    e.preventDefault();
     console.log('Form submitted!');
  };

  return (
    <form onSubmit={handleSubmit} className="space-y-4 max-w-md">
      <Input
        label="Full Name"
        placeholder="John Doe"
        value={formData.name}
        onChange={(value) => setFormData(prev => ({ ...prev, name: value }))}
        required
      />
      
      <Input
        type="text"
        label="Email"
        placeholder="john@example.com"
        value={formData.email}
        onChange={(value) => setFormData(prev => ({ ...prev, email: value }))}
        required
      />
      
      <Input
        type="text"
        label="Phone"
        placeholder="+123 456-7890"
        value={formData.phone}
        onChange={(value) =>
          setFormData((prev) => ({ ...prev, phone: String(value) }))
        }
      />
      
      <Button type="submit" variant="filled" color="primary">
        Submit Form
      </Button>
    </form>
  );
}
I