Variable: RUnsignedIntegerField
ts
const RUnsignedIntegerField: DefineComponent<ExtractPropTypes<AppendDefault<{
active: BooleanConstructor;
allowUnspecifiedChoices: {
default: boolean;
type: BooleanConstructor;
};
baseColor: StringConstructor;
choices: {
default: undefined;
type: PropType<any[] | undefined>;
};
class: PropType<any>;
clearIcon: Omit<{
default: string;
type: PropType<IconValue>;
}, "type" | "default"> & {
default: | NonNullable<IconValue>
| () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<
| IconValue
| () => VNode<RendererNode, RendererElement, {
[key: ...]: ...;
}>>;
};
collapseIcon: {
default: () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<IconValue>;
};
color: StringConstructor;
controlVariant: {
default: string;
type: PropType<"default" | "split" | "hidden" | "stacked">;
};
decrementIcon: {
default: () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<IconValue>;
};
density: {
default: string;
type: PropType<Density>;
validator: (v: any) => boolean;
};
direction: {
default: string;
type: PropType<"vertical" | "horizontal">;
validator: (v: any) => boolean;
};
dirty: BooleanConstructor;
disabled: {
default: null;
type: BooleanConstructor;
};
error: BooleanConstructor;
errorMessages: {
default: () => never[];
type: PropType<string | readonly string[] | null>;
};
expandIcon: {
default: () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<IconValue>;
};
focused: BooleanConstructor;
format: {
default: string;
type: StringConstructor;
};
glow: BooleanConstructor;
hideDetails: PropType<boolean | "auto">;
hint: StringConstructor;
href: StringConstructor;
iconColor: (StringConstructor | BooleanConstructor)[];
id: StringConstructor;
incrementIcon: {
default: () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<IconValue>;
};
label: {
default: undefined;
type: PropType<string | undefined>;
};
max: {
default: number;
type: NumberConstructor;
};
maxErrors: {
default: number;
type: (NumberConstructor | StringConstructor)[];
};
maxWidth: (NumberConstructor | StringConstructor)[];
menuIcon: Omit<{
default: string;
type: PropType<IconValue>;
}, "type" | "default"> & {
default: | NonNullable<IconValue>
| () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<
| IconValue
| () => VNode<RendererNode, RendererElement, {
[key: ...]: ...;
}>>;
};
messages: {
default: () => never[];
type: PropType<string | readonly string[]>;
};
min: {
default: number;
type: NumberConstructor;
};
minWidth: (NumberConstructor | StringConstructor)[];
modelValue: {
default: undefined;
type: PropType<
| RNumberFieldValue
| RNumberFieldValue[]
| null
| undefined>;
};
multiple: {
default: boolean;
type: PropType<boolean>;
};
name: StringConstructor;
noValuesText: {
default: undefined;
type: PropType<string | undefined>;
};
onBlur: {
default: undefined;
type: PropType<() => void | undefined>;
};
onChange: {
default: undefined;
type: PropType<() => void | undefined>;
};
onClick:append: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:appendInner: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:clear: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:control: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:prepend: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:prependInner: PropType<(...args: [MouseEvent]) => void | undefined>;
onInput: {
default: undefined;
type: PropType<() => void | undefined>;
};
onMousedown:control: PropType<(...args: [MouseEvent]) => void | undefined>;
onUpdate:focused: PropType<(...args: [boolean]) => void | undefined>;
onUpdate:model-value: PropType<
| (...args: [
| RNumberFieldValue
| RNumberFieldValue[]
| null]) => void
| undefined>;
onUpdate:modelValue: PropType<
| (...args: [
| RNumberFieldValue
| RNumberFieldValue[]
| null]) => void
| undefined>;
persistentHint: BooleanConstructor;
persistentPlaceholder: BooleanConstructor;
prefix: StringConstructor;
readonly: {
default: null;
type: PropType<boolean | null>;
};
renderMode: {
default: string;
type: PropType<"edit" | "read">;
};
role: {
default: string;
type: PropType<string>;
};
step: {
default: number;
type: NumberConstructor;
};
style: {
default: null;
type: PropType<StyleValue>;
};
suffix: StringConstructor;
theme: StringConstructor;
to: PropType<
| string
| RouteLocationAsRelativeGeneric
| RouteLocationAsPathGeneric>;
validateOn: PropType<
| "eager"
| "input"
| "blur"
| "submit"
| "invalid-input"
| "input lazy"
| "blur lazy"
| "submit lazy"
| "invalid-input lazy"
| "input eager"
| "blur eager"
| "submit eager"
| "invalid-input eager"
| "lazy input"
| "lazy blur"
| "lazy submit"
| "lazy invalid-input"
| "eager input"
| "eager blur"
| "eager submit"
| "eager invalid-input"
| "lazy"
| undefined>;
variant: {
default: string;
type: PropType<
| "outlined"
| "plain"
| "underlined"
| "filled"
| "solo"
| "solo-inverted"
| "solo-filled">;
validator: (v: any) => boolean;
};
width: (NumberConstructor | StringConstructor)[];
}, {
}>>, () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>, {
}, {
}, {
}, ComponentOptionsMixin, ComponentOptionsMixin, EmitFunctions<{
click:append: (...args: [MouseEvent]) => boolean;
click:appendInner: (...args: [MouseEvent]) => boolean;
click:clear: (...args: [MouseEvent]) => boolean;
click:control: (...args: [MouseEvent]) => boolean;
click:prepend: (...args: [MouseEvent]) => boolean;
click:prependInner: (...args: [MouseEvent]) => boolean;
mousedown:control: (...args: [MouseEvent]) => boolean;
update:focused: (...args: [boolean]) => boolean;
update:model-value: (value:
| RNumberFieldValue
| RNumberFieldValue[]
| null
| undefined) => boolean;
update:modelValue: (value:
| RNumberFieldValue
| RNumberFieldValue[]
| null
| undefined) => boolean;
}>, string, PublicProps, ToResolvedProps<ExtractPropTypes<AppendDefault<{
active: BooleanConstructor;
allowUnspecifiedChoices: {
default: boolean;
type: BooleanConstructor;
};
baseColor: StringConstructor;
choices: {
default: undefined;
type: PropType<any[] | undefined>;
};
class: PropType<any>;
clearIcon: Omit<{
default: string;
type: PropType<IconValue>;
}, "type" | "default"> & {
default: | NonNullable<IconValue>
| () => VNode<RendererNode, RendererElement, {
[key: ...]: ...;
}>;
type: PropType<
| IconValue
| () => VNode<..., ..., ...>>;
};
collapseIcon: {
default: () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<IconValue>;
};
color: StringConstructor;
controlVariant: {
default: string;
type: PropType<"default" | "split" | "hidden" | "stacked">;
};
decrementIcon: {
default: () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<IconValue>;
};
density: {
default: string;
type: PropType<Density>;
validator: (v: any) => boolean;
};
direction: {
default: string;
type: PropType<"vertical" | "horizontal">;
validator: (v: any) => boolean;
};
dirty: BooleanConstructor;
disabled: {
default: null;
type: BooleanConstructor;
};
error: BooleanConstructor;
errorMessages: {
default: () => never[];
type: PropType<string | readonly string[] | null>;
};
expandIcon: {
default: () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<IconValue>;
};
focused: BooleanConstructor;
format: {
default: string;
type: StringConstructor;
};
glow: BooleanConstructor;
hideDetails: PropType<boolean | "auto">;
hint: StringConstructor;
href: StringConstructor;
iconColor: (StringConstructor | BooleanConstructor)[];
id: StringConstructor;
incrementIcon: {
default: () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
type: PropType<IconValue>;
};
label: {
default: undefined;
type: PropType<string | undefined>;
};
max: {
default: number;
type: NumberConstructor;
};
maxErrors: {
default: number;
type: (NumberConstructor | StringConstructor)[];
};
maxWidth: (NumberConstructor | StringConstructor)[];
menuIcon: Omit<{
default: string;
type: PropType<IconValue>;
}, "type" | "default"> & {
default: | NonNullable<IconValue>
| () => VNode<RendererNode, RendererElement, {
[key: ...]: ...;
}>;
type: PropType<
| IconValue
| () => VNode<..., ..., ...>>;
};
messages: {
default: () => never[];
type: PropType<string | readonly string[]>;
};
min: {
default: number;
type: NumberConstructor;
};
minWidth: (NumberConstructor | StringConstructor)[];
modelValue: {
default: undefined;
type: PropType<
| RNumberFieldValue
| RNumberFieldValue[]
| null
| undefined>;
};
multiple: {
default: boolean;
type: PropType<boolean>;
};
name: StringConstructor;
noValuesText: {
default: undefined;
type: PropType<string | undefined>;
};
onBlur: {
default: undefined;
type: PropType<() => void | undefined>;
};
onChange: {
default: undefined;
type: PropType<() => void | undefined>;
};
onClick:append: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:appendInner: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:clear: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:control: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:prepend: PropType<(...args: [MouseEvent]) => void | undefined>;
onClick:prependInner: PropType<(...args: [MouseEvent]) => void | undefined>;
onInput: {
default: undefined;
type: PropType<() => void | undefined>;
};
onMousedown:control: PropType<(...args: [MouseEvent]) => void | undefined>;
onUpdate:focused: PropType<(...args: [boolean]) => void | undefined>;
onUpdate:model-value: PropType<
| (...args: [RNumberFieldValue | ...[] | null]) => void
| undefined>;
onUpdate:modelValue: PropType<
| (...args: [RNumberFieldValue | ...[] | null]) => void
| undefined>;
persistentHint: BooleanConstructor;
persistentPlaceholder: BooleanConstructor;
prefix: StringConstructor;
readonly: {
default: null;
type: PropType<boolean | null>;
};
renderMode: {
default: string;
type: PropType<"edit" | "read">;
};
role: {
default: string;
type: PropType<string>;
};
step: {
default: number;
type: NumberConstructor;
};
style: {
default: null;
type: PropType<StyleValue>;
};
suffix: StringConstructor;
theme: StringConstructor;
to: PropType<
| string
| RouteLocationAsRelativeGeneric
| RouteLocationAsPathGeneric>;
validateOn: PropType<
| "eager"
| "input"
| "blur"
| "submit"
| "invalid-input"
| "input lazy"
| "blur lazy"
| "submit lazy"
| "invalid-input lazy"
| "input eager"
| "blur eager"
| "submit eager"
| "invalid-input eager"
| "lazy input"
| "lazy blur"
| "lazy submit"
| "lazy invalid-input"
| "eager input"
| "eager blur"
| "eager submit"
| "eager invalid-input"
| "lazy"
| undefined>;
variant: {
default: string;
type: PropType<
| "outlined"
| "plain"
| "underlined"
| "filled"
| "solo"
| "solo-inverted"
| "solo-filled">;
validator: (v: any) => boolean;
};
width: (NumberConstructor | StringConstructor)[];
}, {
}>>, EmitFunctions<{
click:append: (...args: [MouseEvent]) => boolean;
click:appendInner: (...args: [MouseEvent]) => boolean;
click:clear: (...args: [MouseEvent]) => boolean;
click:control: (...args: [MouseEvent]) => boolean;
click:prepend: (...args: [MouseEvent]) => boolean;
click:prependInner: (...args: [MouseEvent]) => boolean;
mousedown:control: (...args: [MouseEvent]) => boolean;
update:focused: (...args: [boolean]) => boolean;
update:model-value: (value:
| RNumberFieldValue
| RNumberFieldValue[]
| null
| undefined) => boolean;
update:modelValue: (value:
| RNumberFieldValue
| RNumberFieldValue[]
| null
| undefined) => boolean;
}>>, {
active: boolean;
allowUnspecifiedChoices: boolean;
choices: any[] | undefined;
clearIcon: | IconValue
| () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
collapseIcon: IconValue;
controlVariant: "default" | "split" | "hidden" | "stacked";
decrementIcon: IconValue;
density: Density;
direction: "vertical" | "horizontal";
dirty: boolean;
disabled: boolean;
error: boolean;
errorMessages: string | readonly string[] | null;
expandIcon: IconValue;
focused: boolean;
format: string;
glow: boolean;
incrementIcon: IconValue;
label: string | undefined;
max: number;
maxErrors: string | number;
menuIcon: | IconValue
| () => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>;
messages: string | readonly string[];
min: number;
modelValue: | RNumberFieldValue
| RNumberFieldValue[]
| null
| undefined;
multiple: boolean;
noValuesText: string | undefined;
onBlur: () => void | undefined;
onChange: () => void | undefined;
onInput: () => void | undefined;
persistentHint: boolean;
persistentPlaceholder: boolean;
readonly: boolean | null;
renderMode: "edit" | "read";
role: string;
step: number;
style: StyleValue;
variant: | "outlined"
| "plain"
| "underlined"
| "filled"
| "solo"
| "solo-inverted"
| "solo-filled";
}, SlotsType<Partial<{
append: (arg: VInputSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
append-inner: (arg: DefaultInputSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
clear: (arg: DefaultInputSlot & {
props: Record<string, any>;
}) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
counter: (arg: VCounterSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
decrement: (arg: ControlSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
details: (arg: VInputSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
increment: (arg: ControlSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
label: (arg: DefaultInputSlot & {
label: string | undefined;
props: Record<string, any>;
}) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
loader: (arg: LoaderSlotProps) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
message: (arg: VMessageSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
prepend: (arg: VInputSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
prepend-inner: (arg: DefaultInputSlot) => VNode<RendererNode, RendererElement, {
[key: string]: any;
}>[];
}>>, {
}, {
}, string, ComponentProvideOptions, true, {
}, any>;Specialized unsigned integer input field component with automatic constraint normalization.
A professional unsigned integer field that wraps RIntegerField with non-negative constraints, providing a clean API for positive whole number input while inheriting all advanced features like custom controls, numeral.js formatting, and unified field composer architecture.
Core Features:
- Unsigned-Only Input: Automatically enforces min ≥ 0 through constraint normalization
- RIntegerField Foundation: Inherits integer constraints (precision: 0, step: 1)
- Smart Constraint Normalization: Automatically corrects negative min/max values
- Clean Layered Architecture: Builds on integer field with minimal additional logic
- Advanced Formatting: Numeral.js integration for thousands separators and custom patterns
- Custom Controls: Fully customizable increment/decrement buttons with smart icons
- Multiple Mode: Chip-based interface for unsigned integer arrays with formatted display
- Read Mode: Professional display with Oxford comma lists for multiple values
- Smart Validation: Min/max boundary checking with visual feedback (non-negative only)
- Perfect Accessibility: Full keyboard navigation and screen reader support
Inherited from RIntegerField:
- Integer Constraints: precision: 0, step: 1 for whole numbers only
- Control Variants: default, stacked, split, hidden with adaptive icons
- Icon Customization: increment, decrement, collapse, expand icons
- Advanced Validation: Boundary checking with disabled state management
- Mobile Optimization: Touch-friendly controls with proper sizing
- Theme Integration: Pure Vuetify styling with zero custom CSS
- Event System: Complete event forwarding with type safety
- Slot System: Full slot inheritance for maximum customization
Unsigned-Specific Behavior:
- Forces
min ≥ 0regardless of user input (negative mins become 0) - Ignores negative
maxvalues (sets to undefined for no upper limit) - Preserves positive min/max constraints (respects user intent)
- Uses constraint validation instead of silent value transformation
- No Math.abs on input - better UX through validation feedback
Architecture Excellence:
typescript
// Three-layer architecture:
RNumberField (engine) → RIntegerField (integer constraints) → RUnsignedIntegerField (unsigned constraints)
// Maximum code reuse: ~98% inherited, ~2% unsigned-specific logicConstraint Normalization Examples:
- Input:
min: -5, max: -10→ Normalized:min: 0, max: undefined - Input:
min: 10, max: 100→ Preserved:min: 10, max: 100 - Input:
min: -1, max: 50→ Normalized:min: 0, max: 50
Formatting Examples:
- Basic:
format="0,0"→1,234,567 - No separators:
format="0"→1234567 - Ordinals:
format="0o"→1st, 2nd, 3rd - Bytes:
format="0b"→1KB, 2MB, 3GB
Example
vue
<!-- Single unsigned integer input -->
<RUnsignedIntegerField
v-model="quantity"
label="Item Count"
format="0,0"
:min="1"
:max="999999"
control-variant="split"
/>
<!-- Multiple unsigned integers -->
<RUnsignedIntegerField
v-model="ratings"
multiple
label="Star Ratings"
format="0,0"
:min="1"
:max="5"
/>
<!-- Read-only display -->
<RUnsignedIntegerField
v-model="counts"
multiple
label="Item Counts"
format="0,0"
render-mode="read"
/>
<!-- Automatic constraint normalization -->
<RUnsignedIntegerField
v-model="value"
label="Positive Value"
:min="-10"
:max="-5"
<!-- Becomes: min: 0, max: undefined -->
/>Use Cases:
- Quantity Fields: Product counts, inventory numbers
- Rating Systems: Star ratings, score systems (1-5, 1-10)
- Count Fields: User counts, item totals, statistics
- ID Fields: Positive integer identifiers
- Index Fields: Array indices, page numbers
Performance:
- Minimal overhead through efficient constraint normalization
- Optimal re-rendering through computed prop aggregation
- Maximum code reuse from underlying integer field implementation
- Lazy evaluation of constraints for better performance