2025-12-26 16:52:35 +05:30
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import { cn } from "@/lib/utils";
|
|
|
|
|
|
|
|
|
|
export interface LoaderProps {
|
2025-12-26 17:49:56 +05:30
|
|
|
variant?: "text-shimmer";
|
|
|
|
|
size?: "sm" | "md" | "lg";
|
|
|
|
|
text?: string;
|
|
|
|
|
className?: string;
|
2025-12-26 16:52:35 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const textSizes = {
|
2025-12-26 17:49:56 +05:30
|
|
|
sm: "text-xs",
|
|
|
|
|
md: "text-sm",
|
|
|
|
|
lg: "text-base",
|
2025-12-26 16:52:35 +05:30
|
|
|
} as const;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* TextShimmerLoader - A text loader with a shimmer gradient animation
|
|
|
|
|
* Used for in-progress states in write_todos and chain-of-thought
|
|
|
|
|
*/
|
|
|
|
|
export function TextShimmerLoader({
|
2025-12-26 17:49:56 +05:30
|
|
|
text = "Thinking",
|
|
|
|
|
className,
|
|
|
|
|
size = "md",
|
2025-12-26 16:52:35 +05:30
|
|
|
}: {
|
2025-12-26 17:49:56 +05:30
|
|
|
text?: string;
|
|
|
|
|
className?: string;
|
|
|
|
|
size?: "sm" | "md" | "lg";
|
2025-12-26 16:52:35 +05:30
|
|
|
}) {
|
2025-12-26 17:49:56 +05:30
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<style>
|
|
|
|
|
{`
|
2025-12-26 16:52:35 +05:30
|
|
|
@keyframes shimmer {
|
|
|
|
|
0% { background-position: 200% 50%; }
|
|
|
|
|
100% { background-position: -200% 50%; }
|
|
|
|
|
}
|
|
|
|
|
`}
|
2025-12-26 17:49:56 +05:30
|
|
|
</style>
|
|
|
|
|
<span
|
|
|
|
|
className={cn(
|
|
|
|
|
"bg-[linear-gradient(to_right,var(--muted-foreground)_40%,var(--foreground)_60%,var(--muted-foreground)_80%)]",
|
|
|
|
|
"bg-[length:200%_auto] bg-clip-text font-medium text-transparent",
|
|
|
|
|
"animate-[shimmer_4s_infinite_linear]",
|
|
|
|
|
textSizes[size],
|
|
|
|
|
className
|
|
|
|
|
)}
|
|
|
|
|
>
|
|
|
|
|
{text}
|
|
|
|
|
</span>
|
|
|
|
|
</>
|
|
|
|
|
);
|
2025-12-26 16:52:35 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Loader component - currently only supports text-shimmer variant
|
|
|
|
|
* Can be extended with more variants if needed in the future
|
|
|
|
|
*/
|
2025-12-26 17:49:56 +05:30
|
|
|
export function Loader({ variant = "text-shimmer", size = "md", text, className }: LoaderProps) {
|
|
|
|
|
switch (variant) {
|
|
|
|
|
case "text-shimmer":
|
|
|
|
|
default:
|
|
|
|
|
return <TextShimmerLoader text={text} size={size} className={className} />;
|
|
|
|
|
}
|
2025-12-26 16:52:35 +05:30
|
|
|
}
|