Skip to main content

NumberInput

The NumberInput component provides a specialized input for numeric values with built-in validation, min/max constraints, and step controls.

Overview

NumberInput provides a complete numeric input solution with:

  • Number type enforcement
  • Min/max/step constraints
  • Built-in validation
  • Label and helper text
  • Various sizes and states
  • Focus and blur handling

Basic Usage

{
uuid: "my-number-input",
name: "quantity_input",
component_type: "number-input",
input: {
placeholder: { type: "string", value: "Enter quantity" },
min: { type: "number", value: 1 },
max: { type: "number", value: 100 }
},
inputHandlers: {
label: `return "Quantity";`,
value: `return $quantity || 1;`
},
event: {
onChange: `
$quantity = parseInt(EventData.value);
`
}
}

Component Inputs

PropertyTypeDefaultDescription
valuenumber-Current numeric value
placeholderstring'Number input'Placeholder text
labelstring''Label text
helperstring''Helper text
sizestring'medium'Size: 'small', 'medium', 'large'
variantstring-Visual variant
statusstring-Validation status
statestring'default'State: 'default', 'disabled'
readonlybooleanfalseRead-only mode
requiredbooleanfalseMark as required
minnumber0Minimum value
maxnumber-Maximum value
stepnumber-Step increment
namestring-Form field name
rulesarray[]Validation rules
validateOnChangebooleantrueValidate on change
validateOnBlurbooleantrueValidate on blur
hasFeedbackbooleanfalseShow validation feedback

Events

onChange

Triggered: When value changes

EventData:

{
value: string // New value (as string)
oldValue: string // Previous value
}

onFocus / onBlur

Triggered: When input receives/loses focus

onEnter

Triggered: When Enter key is pressed


Common Patterns

Quantity Selector

{
component_type: "number-input",
input: {
min: { type: "number", value: 1 },
max: { type: "number", value: 99 },
step: { type: "number", value: 1 }
},
inputHandlers: {
label: `return "Quantity";`,
value: `return $cartItem?.quantity || 1;`
},
event: {
onChange: `
const qty = parseInt(EventData.value);
$cartItem = {
...$cartItem,
quantity: qty
};

$cartTotal = $cart.reduce((sum, item) =>
sum + (item.price * item.quantity), 0
);
`
}
}

Price Input

{
component_type: "number-input",
input: {
min: { type: "number", value: 0 },
step: { type: "number", value: 0.01 },
placeholder: { type: "string", value: "0.00" }
},
inputHandlers: {
label: `return "Price ($)";`,
value: `return $product?.price || 0;`
},
event: {
onChange: `
const price = parseFloat(EventData.value);
$product = { ...$product, price: price };
`,
onBlur: `
const price = parseFloat(EventData.event.target.value);
$product.price = Math.round(price * 100) / 100;
`
}
}

Age Input with Validation

{
component_type: "number-input",
input: {
min: { type: "number", value: 0 },
max: { type: "number", value: 120 },
required: { type: "boolean", value: true },
rules: {
type: "array",
value: [
{ required: true, message: "Age is required" },
{ min: 18, message: "Must be at least 18 years old" }
]
}
},
inputHandlers: {
label: `return "Age";`,
helper: `return "You must be 18 or older";`,
value: `return $userAge || '';`
},
event: {
onChange: `
const age = parseInt(EventData.value);
$userAge = age;
$isAdult = age >= 18;
`
}
}

Percentage Input

{
component_type: "number-input",
input: {
min: { type: "number", value: 0 },
max: { type: "number", value: 100 },
step: { type: "number", value: 1 }
},
inputHandlers: {
label: `return "Discount (%)";`,
value: `return $discountPercent || 0;`
},
event: {
onChange: `
const percent = parseFloat(EventData.value);
$discountPercent = Math.min(100, Math.max(0, percent));
$discountedPrice = $originalPrice * (1 - percent / 100);
`
}
}

See Also