moduix

Input

A native input element that works with Field labels, validation, and Base UI state.

API Reference

Original primitive API

Behavior, accessibility details, and low-level props are documented by Base UI.

Base UI API

Basic

import { Field, FieldLabel, Input } from "moduix";export function InputDemo() {  return (    <Field className={styles.field}>      <FieldLabel>Name</FieldLabel>      <Input placeholder="Enter your name" />    </Field>  );}
.field {  width: min(20rem, 100%);}

Full list of component variables available for project-level overrides.

PropertyDefaultDescription
--input-bgvar(--color-background)Controls the input background color.
--input-border-colorvar(--color-border)Controls the input border color.
--input-border-color-invalidvar(--color-destructive)Controls invalid border and focus ring color.
--input-border-stylesolidControls the input border style.
--input-border-widthvar(--border-width-sm)Controls the input border width.
--input-colorvar(--color-foreground)Controls the input text color.
--input-disabled-opacityvar(--opacity-disabled)Controls disabled input opacity.
--input-focus-ring-colorvar(--color-ring)Controls focus ring color.
--input-focus-ring-offsetdepends on focus ring widthControls focus ring offset.
--input-focus-ring-widthdepends on border widthControls focus ring width.
--input-font-sizevar(--text-md)Controls default font size.
--input-font-size-xsvar(--text-xs)Controls extra-small input font size.
--input-font-size-smvar(--text-sm)Controls small input font size.
--input-font-size-mdvar(--text-md)Controls medium input font size.
--input-font-size-lgvar(--text-lg)Controls large input font size.
--input-font-size-xlvar(--text-lg)Controls extra-large input font size.
--input-heightvar(--size-lg)Controls the default input minimum height.
--input-height-xsvar(--size-sm)Controls extra-small input height.
--input-height-sm2remControls small input height.
--input-height-mdvar(--size-lg)Controls medium input height.
--input-height-lgvar(--size-xl)Controls large input height.
--input-height-xl3remControls extra-large input height.
--input-line-heightvar(--line-height-text-md)Controls default line height.
--input-line-height-xsvar(--line-height-text-xs)Controls extra-small line height.
--input-line-height-smvar(--line-height-text-sm)Controls small line height.
--input-line-height-mdvar(--line-height-text-md)Controls medium line height.
--input-line-height-lgvar(--line-height-text-lg)Controls large line height.
--input-line-height-xlvar(--line-height-text-lg)Controls extra-large line height.
--input-max-widthnoneControls the input max width.
--input-padding-x0.875remControls default horizontal padding.
--input-padding-x-xs0.625remControls extra-small horizontal padding.
--input-padding-x-sm0.75remControls small horizontal padding.
--input-padding-x-md0.875remControls medium horizontal padding.
--input-padding-x-lg1remControls large horizontal padding.
--input-padding-x-xl1.125remControls extra-large horizontal padding.
--input-padding-y0.5remControls default vertical padding.
--input-padding-y-xs0.25remControls extra-small vertical padding.
--input-padding-y-sm0.3125remControls small vertical padding.
--input-padding-y-md0.5remControls medium vertical padding.
--input-padding-y-lg0.625remControls large vertical padding.
--input-padding-y-xl0.75remControls extra-large vertical padding.
--input-placeholder-colorvar(--color-muted-foreground)Controls placeholder color.
--input-radiusvar(--radius-md)Controls input corner radius.
--input-transitionvar(--transition-default)Controls state transition timing.
--input-width100%Controls the input width.

Interactive variables scoped for docs preview without changing size scale tokens.

PropertyValueDefaultDescription
--input-bgvar(--color-background)Controls the input background color.
--input-border-colorvar(--color-border)Controls the input border color.
--input-border-color-invalidvar(--color-destructive)Controls invalid border and focus ring color.
--input-border-stylesolidControls the input border style.
--input-border-widthvar(--border-width-sm)Controls the input border width.
--input-colorvar(--color-foreground)Controls the input text color.
--input-disabled-opacityvar(--opacity-disabled)Controls disabled input opacity.
--input-focus-ring-colorvar(--color-ring)Controls focus ring color.
--input-focus-ring-offsetdepends on focus ring widthControls focus ring offset.
--input-focus-ring-widthdepends on border widthControls focus ring width.
--input-font-sizevar(--text-md)Controls default font size.
--input-font-size-xsvar(--text-xs)Controls extra-small input font size.
--input-font-size-smvar(--text-sm)Controls small input font size.
--input-font-size-mdvar(--text-md)Controls medium input font size.
--input-font-size-lgvar(--text-lg)Controls large input font size.
--input-font-size-xlvar(--text-lg)Controls extra-large input font size.
--input-heightvar(--size-lg)Controls the default input minimum height.
--input-height-xsvar(--size-sm)Controls extra-small input height.
--input-height-sm2remControls small input height.
--input-height-mdvar(--size-lg)Controls medium input height.
--input-height-lgvar(--size-xl)Controls large input height.
--input-height-xl3remControls extra-large input height.
--input-line-heightvar(--line-height-text-md)Controls default line height.
--input-line-height-xsvar(--line-height-text-xs)Controls extra-small line height.
--input-line-height-smvar(--line-height-text-sm)Controls small line height.
--input-line-height-mdvar(--line-height-text-md)Controls medium line height.
--input-line-height-lgvar(--line-height-text-lg)Controls large line height.
--input-line-height-xlvar(--line-height-text-lg)Controls extra-large line height.
--input-max-widthnoneControls the input max width.
--input-padding-x0.875remControls default horizontal padding.
--input-padding-x-xs0.625remControls extra-small horizontal padding.
--input-padding-x-sm0.75remControls small horizontal padding.
--input-padding-x-md0.875remControls medium horizontal padding.
--input-padding-x-lg1remControls large horizontal padding.
--input-padding-x-xl1.125remControls extra-large horizontal padding.
--input-padding-y0.5remControls default vertical padding.
--input-padding-y-xs0.25remControls extra-small vertical padding.
--input-padding-y-sm0.3125remControls small vertical padding.
--input-padding-y-md0.5remControls medium vertical padding.
--input-padding-y-lg0.625remControls large vertical padding.
--input-padding-y-xl0.75remControls extra-large vertical padding.
--input-placeholder-colorvar(--color-muted-foreground)Controls placeholder color.
--input-radiusvar(--radius-md)Controls input corner radius.
--input-transitionvar(--transition-default)Controls state transition timing.
--input-width100%Controls the input width.

Anatomy

Input is composed as a single native input root. It is commonly composed inside Field for labels, descriptions, and validation messaging.

Field (optional wrapper)
└─ Input
PartRole
InputNative input element with Base UI state integration and style variables.

Composition

Use Input props such as value, defaultValue, onValueChange, render, function className, function style, and Field state data attributes from Base UI.

Use size for the visual component size. Use htmlSize for the native HTML size attribute:

<Input size="lg" htmlSize={24} placeholder="Search projects" />

Input does not render hidden service slots such as Positioner, Backdrop, or Viewport, so it does not need a classNames API. Style the input element directly with className.

The package exports Base UI event and state types for controlled inputs and styling callbacks:

import { type InputChangeEventDetails, type InputChangeEventReason, type InputState } from 'moduix';

Examples

Controlled

Use value and onValueChange when the input value needs to stay in React state.

import { Field, FieldLabel, Input } from "moduix";import { useState } from "react";function ControlledInput() {  const [value, setValue] = useState("");  return (    <Field className={styles.field}>      <FieldLabel>Username</FieldLabel>      <Input        value={value}        onValueChange={setValue}        placeholder="Type to control value"      />    </Field>  );}
.field {  width: min(20rem, 100%);}

Sizes

Use the size prop for visual sizing. Use htmlSize when you need the native input size attribute.

import { Input } from "moduix";export function InputSizesDemo() {  return (    <div className={styles.stack}>      <Input size="xs" placeholder="Extra-small input" />      <Input size="sm" placeholder="Small input" />      <Input size="md" placeholder="Medium input" />      <Input size="lg" placeholder="Large input" />      <Input size="xl" placeholder="Extra-large input" />    </div>  );}
.stack {  display: grid;  gap: var(--spacing-3);  width: min(20rem, 100%);}

Native Attributes

Use standard input attributes for keyboard, autocomplete, validation, and form behavior. The htmlSize prop maps to the native size attribute because size controls the visual component size.

import { Field, FieldLabel, Input } from "moduix";export function NativeInputAttributesDemo() {  return (    <Field className={styles.field}>      <FieldLabel>Security code</FieldLabel>      <Input        htmlSize={8}        inputMode="numeric"        maxLength={6}        name="security-code"        placeholder="000000"        type="text"        autoComplete="one-time-code"      />    </Field>  );}
.field {  width: min(20rem, 100%);}

Disabled

Set disabled to prevent interaction while keeping the input visible in forms.

import { Input } from "moduix";export function DisabledInputDemo() {  return (    <div className={styles.stack}>      <Input disabled placeholder="Disabled input" />      <Input disabled value="Read only value" />    </div>  );}
.stack {  display: grid;  gap: var(--spacing-3);  width: min(20rem, 100%);}

Field Validation

Place Input inside Field to connect labels, errors, native validity, and Base UI data attributes.

import { Field, FieldLabel, Input, FieldError } from "moduix";export function InputFieldValidationDemo() {  return (    <Field className={styles.field} validationMode="onBlur">      <FieldLabel>Email</FieldLabel>      <Input required type="email" placeholder="name@example.com" />      <FieldError match="valueMissing">Please enter your email.</FieldError>      <FieldError match="typeMismatch">Enter a valid email address.</FieldError>    </Field>  );}
.field {  width: min(20rem, 100%);}

Custom Styles

Pass className directly to Input when styling with CSS Modules, Tailwind CSS, or CSS-in-JS.

import { Field, FieldLabel, Input } from "moduix";export function CustomInputDemo() {  return (    <Field className={styles.field}>      <FieldLabel>Project key</FieldLabel>      <Input placeholder="MAPS" className={styles.customInput} />    </Field>  );}
.field {  width: min(20rem, 100%);}.customInput {  border-color: color-mix(in srgb, var(--color-primary) 40%, transparent);  background-color: color-mix(in srgb, var(--color-primary) 5%, transparent);  color: var(--color-primary);  text-transform: uppercase;  letter-spacing: 0;}.customInput::placeholder {  text-transform: none;}.customInput:focus {  outline-color: var(--color-primary);}

On this page