| 123456789101112131415161718192021222324252627 |
- "use client";
- import React from "react";
- import { cn } from "@/lib/utils";
- import { Skeleton } from "@/components/ui/skeleton";
- import { useDebouncedVisibility } from "@/lib/frontend/hooks/useDebouncedVisibility";
- /**
- * DebouncedSkeleton
- *
- * Behavior:
- * - Reserves layout space immediately (renders a plain div with sizing classes).
- * - Shows the animated Skeleton only after delayMs.
- *
- * This avoids "skeleton flicker" on fast loads.
- */
- export function DebouncedSkeleton({ className, delayMs = 200, ...props }) {
- const visible = useDebouncedVisibility(true, { delayMs, minVisibleMs: 0 });
- if (!visible) {
- // Reserve space, but do not show animation/background yet.
- return <div aria-hidden="true" className={cn(className)} />;
- }
- return <Skeleton className={className} {...props} />;
- }
|