"use client";
import * as React from "react";
import { NumberField as BaseNumberField } from "@base-ui-components/react/number-field";
import IconButton from "@mui/material/IconButton";
import FormControl from "@mui/material/FormControl";
import FormHelperText from "@mui/material/FormHelperText";
import OutlinedInput from "@mui/material/OutlinedInput";
import InputAdornment from "@mui/material/InputAdornment";
import InputLabel from "@mui/material/InputLabel";
import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp";
import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown";
/**
* This component is a placeholder for FormControl to correctly set the shrink label state on SSR.
*/
function SSRInitialFilled(_: BaseNumberField.Root.Props) {
return null;
}
SSRInitialFilled.muiName = "Input";
export default function NumberField({
id: idProp,
label,
error,
size = "medium",
...other
}: BaseNumberField.Root.Props & {
label?: React.ReactNode;
size?: "small" | "medium";
error?: boolean;
}) {
let id = React.useId();
if (idProp) {
id = idProp;
}
return (
<BaseNumberField.Root
{...other}
render={(props, state) => (
<FormControl
size={size}
ref={props.ref}
disabled={state.disabled}
required={state.required}
error={error}
variant="outlined"
>
{props.children}
</FormControl>
)}
>
<SSRInitialFilled {...other} />
<InputLabel htmlFor={id}>{label}</InputLabel>
<BaseNumberField.Input
id={id}
render={(props, state) => (
<OutlinedInput
label={label}
inputRef={props.ref}
value={state.inputValue}
onBlur={props.onBlur}
onChange={props.onChange}
onKeyUp={props.onKeyUp}
onKeyDown={props.onKeyDown}
onFocus={props.onFocus}
slotProps={{
input: props,
}}
endAdornment={
<InputAdornment
position="end"
sx={{
flexDirection: "column",
maxHeight: "unset",
alignSelf: "stretch",
borderLeft: "1px solid",
borderColor: "divider",
ml: 0,
"& button": {
py: 0,
flex: 1,
borderRadius: 0.5,
"&.MuiIconButton-sizeSmall": {
lineHeight: "17px",
},
},
}}
>
<BaseNumberField.Increment
render={<IconButton size={size} aria-label="Increase" />}
>
<KeyboardArrowUpIcon
fontSize={size}
sx={{ transform: "translateY(2px)" }}
/>
</BaseNumberField.Increment>
<BaseNumberField.Decrement
render={<IconButton size={size} aria-label="Decrease" />}
>
<KeyboardArrowDownIcon
fontSize={size}
sx={{ transform: "translateY(-2px)" }}
/>
</BaseNumberField.Decrement>
</InputAdornment>
}
sx={{ pr: 0 }}
/>
)}
/>
<FormHelperText sx={{ ml: 0, "&:empty": { mt: 0 } }}>
Enter value between 10 and 40
</FormHelperText>
</BaseNumberField.Root>
);
}