I want the label for Mantine fields to visually indicate when their corresponding field is focused (e.g. by turning blue).
This is the code I wrote:
const MyAutocompleteCustomClassNames = {
inputWrapperLabelFocused: `${CUSTOM_CLASSNAME_PREFIX}-InputWrapper-label-focused`,
autocompleteLabelFocused: `${CUSTOM_CLASSNAME_PREFIX}-Autocomplete-label-focused`,
} as const;
const UnstyledMyAutocomplete: React.FunctionComponent<
React.ComponentProps<typeof Autocomplete>
> = ({
onFocus: propOnFocus,
onBlur: propOnBlur,
classNames: propClassNames,
...restProps
}) => {
const [focused, setFocused] = useState(false)
propOnFocus = propOnFocus ?? (() => {})
propOnBlur = propOnBlur ?? (() => {})
const onFocus: NonNullable<
React.ComponentProps<typeof Autocomplete>["onFocus"]
> = (event) => {
setFocused(true);
propOnFocus(event);
};
const onBlur: NonNullable<
React.ComponentProps<typeof Autocomplete>["onBlur"]
> = (event) => {
setFocused(false);
propOnBlur(event);
};
const ownClassNames = focused
? {
label: clsx(
MyAutocompleteCustomClassNames.inputWrapperLabelFocused,
MyAutocompleteCustomClassNames.autocompleteLabelFocused
),
}
: {};
const classNamesMergeFn = R.mergeDeepWith(clsx, ownClassNames)
let classNames: NonNullable<
React.ComponentProps<typeof Autocomplete>["classNames"]
>;
if (propClassNames === undefined) {
classNames = ownClassNames;
} else if (typeof propClassNames === "function") {
classNames = R.compose(classNamesMergeFn, propClassNames);
} else {
classNames = classNamesMergeFn(propClassNames);
}
return (
<Autocomplete
onFocus={onFocus}
onBlur={onBlur}
classNames={classNames}
{...restProps}
/>
);
};
const MyAutocomplete = styled(UnstyledMyAutocomplete)({
[`& .${MyAutocompleteCustomClassNames.autocompleteLabelFocused}`]: {
color: "var(--mantine-color-blue-filled)",
},
});