2025-09-17 18:43:43 +09:00
|
|
|
import { forwardRef } from "react";
|
|
|
|
|
import { cva, type VariantProps } from "class-variance-authority";
|
2025-12-29 18:19:27 +09:00
|
|
|
import { cn } from "@/shared/utils";
|
2025-09-17 18:43:43 +09:00
|
|
|
import { ExclamationCircleIcon } from "@heroicons/react/24/outline";
|
|
|
|
|
|
|
|
|
|
const errorMessageVariants = cva("flex items-center gap-1 text-sm", {
|
|
|
|
|
variants: {
|
|
|
|
|
variant: {
|
|
|
|
|
default: "text-red-600",
|
|
|
|
|
inline: "text-red-600",
|
|
|
|
|
subtle: "text-red-500",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
defaultVariants: {
|
|
|
|
|
variant: "default",
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
interface ErrorMessageProps
|
2025-12-25 17:30:02 +09:00
|
|
|
extends React.HTMLAttributes<HTMLParagraphElement>, VariantProps<typeof errorMessageVariants> {
|
2025-09-17 18:43:43 +09:00
|
|
|
showIcon?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const ErrorMessage = forwardRef<HTMLParagraphElement, ErrorMessageProps>(
|
|
|
|
|
({ className, variant, showIcon = true, children, ...props }, ref) => {
|
|
|
|
|
if (!children) return null;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<p
|
|
|
|
|
ref={ref}
|
|
|
|
|
className={cn(errorMessageVariants({ variant, className }))}
|
|
|
|
|
role="alert"
|
|
|
|
|
{...props}
|
|
|
|
|
>
|
|
|
|
|
{showIcon && <ExclamationCircleIcon className="h-4 w-4 flex-shrink-0" />}
|
|
|
|
|
{children}
|
|
|
|
|
</p>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
ErrorMessage.displayName = "ErrorMessage";
|
|
|
|
|
|
|
|
|
|
export { ErrorMessage, errorMessageVariants };
|
|
|
|
|
export type { ErrorMessageProps };
|