debounced-skeleton.jsx 806 B

123456789101112131415161718192021222324252627
  1. "use client";
  2. import React from "react";
  3. import { cn } from "@/lib/utils";
  4. import { Skeleton } from "@/components/ui/skeleton";
  5. import { useDebouncedVisibility } from "@/lib/frontend/hooks/useDebouncedVisibility";
  6. /**
  7. * DebouncedSkeleton
  8. *
  9. * Behavior:
  10. * - Reserves layout space immediately (renders a plain div with sizing classes).
  11. * - Shows the animated Skeleton only after delayMs.
  12. *
  13. * This avoids "skeleton flicker" on fast loads.
  14. */
  15. export function DebouncedSkeleton({ className, delayMs = 200, ...props }) {
  16. const visible = useDebouncedVisibility(true, { delayMs, minVisibleMs: 0 });
  17. if (!visible) {
  18. // Reserve space, but do not show animation/background yet.
  19. return <div aria-hidden="true" className={cn(className)} />;
  20. }
  21. return <Skeleton className={className} {...props} />;
  22. }