LogoReactUI Library
HomeComponentsShowcaseThemesNServicesNNextGenNPricingContact

Resources

Theme ExtractorExtract palettes from any site or imageColor LabPick, mix, export & engineer colorsGalleryUI screenshots & inspirationBlogArticles & tutorialsDocumentationGuides & API referenceAboutCompany, mission & teamExamplesReal-world code examples
  1. Home
  2. /Components
  3. /Feedback
R
ReactUI

A comprehensive React component library with beautiful design, accessibility, and developer experience in mind.

Product

  • Components
  • Documentation
  • Examples
  • Buttons
  • Cards

Resources

  • Getting Started
  • Installation
  • Theming
  • API Reference
  • Free PDF & Image Tools

Community

  • About Us
  • GitHub
  • Discord
  • Twitter

© 2026 ReactUI Library. All rights reserved.

Privacy PolicyTerms of ServiceRefund Policy
Components/Feedback

Feedback.

Fire real toast notifications, watch AI thinking indicators stream, and copy shimmer skeletons, alerts and animated progress — feedback states users actually notice.

9 componentsFree · copy-pasteTailwind CSS
ButtonsCardsFormsNavigationData DisplayFeedbackLayoutOverlayHero SectionsDashboardLandingBlog & ContentSettings

Toast Playground

Toasts stack bottom-right and auto-dismiss

Click the buttons to fire real toasts — they stack, slide in and auto-dismiss after 3.5 seconds.

T
toast-playground.tsx
1function useToasts() {
2 const [toasts, setToasts] = useState<Toast[]>([]);
3 
4 const fire = (t: Omit<Toast, "id">) => {
5 const id = Date.now();
6 setToasts((all) => [...all, { ...t, id }]);
7 setTimeout(() => setToasts((all) => all.filter((x) => x.id !== id)), 3500);
8 };
9 
10 return { toasts, fire };
11}
12 
13{/* stack container (bottom-right of screen) */}
14<div "color:#79c0ff">className="fixed bottom-6 right-6 z-50 flex w-80 flex-col gap-2.5">
15 {toasts.map((t) => (
16 <div "color:#79c0ff">key={t.id}
17 "color:#79c0ff">className={"flex items-start gap-3 rounded-2xl border p-4 shadow-2xl backdrop-blur-xl " + t.frame}
18 "color:#79c0ff">style={{ animation: "slideUp .3s ease both" }}>
19 <span "color:#79c0ff">className={"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs " + t.badge}>
20 {t.icon}
21 </span>
22 <div "color:#79c0ff">className="min-w-0 flex-1">
23 <p "color:#79c0ff">className="text-sm font-bold text-white">{t.title}</p>
24 <p "color:#79c0ff">className="mt-0.5 text-xs text-white/45">{t.msg}</p>
25 </div>
26 <button "color:#79c0ff">onClick={() => dismiss(t.id)} "color:#79c0ff">className="text-white/30 hover:text-white">×</button>
27 </div>
28 ))}
29</div>
30 
31/* @keyframes slideUp { from { opacity: 0; transform: translateY(14px) scale(.97); }
32 to { opacity: 1; transform: translateY(0) scale(1); } } */
⬡ UIDrop Component32 lines
TypeScript ReactUTF-8

AI Thinking States

✦

✦ Thinking about your request…

Streaming response

The spotlight card uses a radial-gradient that tracks the cursor position

Typing dots, shimmering “thinking” label and a streaming cursor — the loading states of AI chat interfaces.

T
ai-thinking-states.tsx
1{/* typing dots */}
2<div "color:#79c0ff">className="flex w-fit items-center gap-1.5 rounded-2xl rounded-bl-md border border-white/10 bg-white/[0.05] px-4 py-3">
3 {[0, 1, 2].map((i) => (
4 <span "color:#79c0ff">key={i} "color:#79c0ff">className="h-2 w-2 rounded-full bg-violet-400"
5 "color:#79c0ff">style={{ animation: "dots 1.2s " + i * 0.18 + "s ease-in-out infinite" }} />
6 ))}
7</div>
8 
9{/* shimmer thinking text */}
10<p
11 "color:#79c0ff">className="w-fit bg-clip-text text-sm font-semibold text-transparent"
12 "color:#79c0ff">style={{
13 backgroundImage: "linear-gradient(90deg, rgba(255,255,255,0.25) 40%, #fff 50%, rgba(255,255,255,0.25) 60%)",
14 backgroundSize: "200% 100%",
15 animation: "skeleton 1.6s linear infinite",
16 }}
17>
18 ✦ Thinking about your request…
19</p>
20 
21{/* streaming cursor */}
22<p "color:#79c0ff">className="text-sm leading-relaxed text-white/75">
23 The spotlight card uses a radial-gradient that tracks
24 <span "color:#79c0ff">className="ml-0.5 inline-block h-4 w-[7px] translate-y-0.5 bg-violet-400"
25 "color:#79c0ff">style={{ animation: "caret 1s step-end infinite" }} />
26</p>
27 
28/* @keyframes dots { 0%,60%,100% { transform: translateY(0); opacity:.45 } 30% { transform: translateY(-5px); opacity:1 } }
29 @keyframes skeleton { 0% { background-position: 200% 0 } 100% { background-position: -200% 0 } }
30 @keyframes caret { 0%,100% { opacity:1 } 50% { opacity:0 } } */
⬡ UIDrop Component30 lines
TypeScript ReactUTF-8

Alert Banners

Scheduled maintenance

API will be read-only on Sunday 02:00–04:00 UTC.

Payment confirmed

Your Pro plan is active. Invoice sent to your inbox.

Usage at 82%

You're approaching your monthly token limit.

Build failed

Type error in src/app/page.tsx — line 42.

Accent-bar glass alerts for info, success, warning and error — with dismiss and action link.

T
alert-banners.tsx
1const alerts = [
2 { tone: "info", accent: "before:bg-sky-400", icon: "ℹ️",
3 ring: "border-sky-400/20 bg-sky-500/[0.06]",
4 title: "Scheduled maintenance", msg: "API will be read-only on Sunday 02:00–04:00 UTC." },
5 { tone: "success", accent: "before:bg-emerald-400", icon: "✓",
6 ring: "border-emerald-400/20 bg-emerald-500/[0.06]",
7 title: "Payment confirmed", msg: "Your Pro plan is active. Invoice sent to your inbox." },
8 { tone: "warning", accent: "before:bg-amber-400", icon: "⚠",
9 ring: "border-amber-400/20 bg-amber-500/[0.06]",
10 title: "Usage at 82%", msg: "You're approaching your monthly token limit." },
11 { tone: "error", accent: "before:bg-rose-400", icon: "✕",
12 ring: "border-rose-400/20 bg-rose-500/[0.06]",
13 title: "Build failed", msg: "Type error in src/app/page.tsx — line 42." },
14];
15 
16{alerts.map((a) => (
17 <div "color:#79c0ff">key={a.tone}
18 "color:#79c0ff">className={"relative flex items-start gap-3 overflow-hidden rounded-xl border py-3.5 pl-5 pr-3 before:absolute before:inset-y-0 before:left-0 before:w-1 " + a.ring + " " + a.accent}>
19 <span "color:#79c0ff">className="text-sm">{a.icon}</span>
20 <div "color:#79c0ff">className="min-w-0 flex-1">
21 <p "color:#79c0ff">className="text-sm font-bold text-white">{a.title}</p>
22 <p "color:#79c0ff">className="mt-0.5 text-xs leading-relaxed text-white/45">{a.msg}</p>
23 </div>
24 <button "color:#79c0ff">className="shrink-0 text-white/25 transition hover:text-white">×</button>
25 </div>
26))}
⬡ UIDrop Component26 lines
TypeScript ReactUTF-8

Skeleton Loaders

Shimmer-sweep placeholders for cards, lists and text — a single utility drives all of them.

T
skeleton-loaders.tsx
1/* shared shimmer class */
2const shimmer = {
3 backgroundImage:
4 "linear-gradient(90deg, rgba(255,255,255,0.06) 25%, rgba(255,255,255,0.14) 50%, rgba(255,255,255,0.06) 75%)",
5 backgroundSize: "200% 100%",
6 animation: "skeleton 1.6s linear infinite",
7};
8 
9{/* card skeleton */}
10<div "color:#79c0ff">className="w-64 rounded-2xl border border-white/8 bg-white/[0.02] p-4">
11 <div "color:#79c0ff">className="h-28 rounded-xl" "color:#79c0ff">style={shimmer} />
12 <div "color:#79c0ff">className="mt-3 h-4 w-3/4 rounded" "color:#79c0ff">style={shimmer} />
13 <div "color:#79c0ff">className="mt-2 h-3 w-1/2 rounded" "color:#79c0ff">style={shimmer} />
14</div>
15 
16{/* list row skeleton */}
17<div "color:#79c0ff">className="flex items-center gap-3">
18 <div "color:#79c0ff">className="h-10 w-10 rounded-full" "color:#79c0ff">style={shimmer} />
19 <div "color:#79c0ff">className="flex-1">
20 <div "color:#79c0ff">className="h-3.5 w-1/2 rounded" "color:#79c0ff">style={shimmer} />
21 <div "color:#79c0ff">className="mt-2 h-3 w-3/4 rounded" "color:#79c0ff">style={shimmer} />
22 </div>
23</div>
⬡ UIDrop Component23 lines
TypeScript ReactUTF-8

Progress Bars

Uploading design.fig68%
Processing video45%
OnboardingStep 3 of 5

Animated gradient fill, moving stripes and a segmented step meter.

T
progress-bars.tsx
1{/* gradient with label */}
2<div>
3 <div "color:#79c0ff">className="mb-1.5 flex justify-between text-xs">
4 <span "color:#79c0ff">className="font-semibold text-white/70">Uploading design.fig</span>
5 <span "color:#79c0ff">className="font-bold text-violet-300">68%</span>
6 </div>
7 <div "color:#79c0ff">className="h-2.5 overflow-hidden rounded-full bg-white/8">
8 <div "color:#79c0ff">className="h-full w-[68%] rounded-full bg-gradient-to-r from-violet-600 via-fuchsia-500 to-cyan-400" />
9 </div>
10</div>
11 
12{/* animated stripes */}
13<div "color:#79c0ff">className="h-2.5 overflow-hidden rounded-full bg-white/8">
14 <div "color:#79c0ff">className="h-full w-[45%] rounded-full bg-violet-600"
15 "color:#79c0ff">style={{
16 backgroundImage: "linear-gradient(45deg, rgba(255,255,255,.18) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.18) 50%, rgba(255,255,255,.18) 75%, transparent 75%)",
17 backgroundSize: "14px 14px",
18 animation: "stripes .8s linear infinite",
19 }} />
20</div>
21 
22{/* segmented steps */}
23<div "color:#79c0ff">className="flex gap-1.5">
24 {[1, 2, 3, 4, 5].map((s) => (
25 <div "color:#79c0ff">key={s} "color:#79c0ff">className={"h-2 flex-1 rounded-full " + (s <= 3 ? "bg-gradient-to-r from-violet-500 to-indigo-500" : "bg-white/8")} />
26 ))}
27</div>
28 
29/* @keyframes stripes { 0% { background-position: 0 0 } 100% { background-position: 28px 0 } } */
⬡ UIDrop Component29 lines
TypeScript ReactUTF-8

Spinner Collection

Dual ring

Orbit

Wave

Dots

Dual ring, orbit, wave bars and bounce dots — pick a personality for your loading states.

T
spinner-collection.tsx
1{/* dual ring */}
2<div "color:#79c0ff">className="relative h-12 w-12">
3 <div "color:#79c0ff">className="absolute inset-0 animate-spin rounded-full border-[3px] border-violet-500/20 border-t-violet-500" />
4 <div "color:#79c0ff">className="absolute inset-2 animate-spin rounded-full border-[3px] border-cyan-400/20 border-t-cyan-400"
5 "color:#79c0ff">style={{ animationDirection: "reverse", animationDuration: ".8s" }} />
6</div>
7 
8{/* orbit */}
9<div "color:#79c0ff">className="relative h-12 w-12" "color:#79c0ff">style={{ animation: "spin 1.4s linear infinite" }}>
10 <span "color:#79c0ff">className="absolute left-1/2 top-0 h-2.5 w-2.5 -translate-x-1/2 rounded-full bg-violet-400" />
11 <span "color:#79c0ff">className="absolute bottom-0 left-1/2 h-1.5 w-1.5 -translate-x-1/2 rounded-full bg-cyan-400/70" />
12</div>
13 
14{/* wave bars */}
15<div "color:#79c0ff">className="flex items-center gap-1">
16 {[0, 1, 2, 3, 4].map((i) => (
17 <span "color:#79c0ff">key={i} "color:#79c0ff">className="h-7 w-1.5 rounded-full bg-gradient-to-t from-violet-600 to-fuchsia-400"
18 "color:#79c0ff">style={{ animation: "wave 1s " + i * 0.12 + "s ease-in-out infinite" }} />
19 ))}
20</div>
21 
22/* @keyframes wave { 0%,100% { transform: scaleY(.35) } 50% { transform: scaleY(1) } } */
⬡ UIDrop Component22 lines
TypeScript ReactUTF-8

Empty State

No projects yet

Create your first project to start tracking deploys, analytics and more.

A glowing icon well, clear copy and a primary action — turn dead ends into next steps.

T
empty-state.tsx
1<div "color:#79c0ff">className="flex w-full max-w-sm flex-col items-center rounded-3xl border border-dashed border-white/15 bg-white/[0.02] px-8 py-10 text-center">
2 <div "color:#79c0ff">className="relative">
3 <div "color:#79c0ff">className="absolute inset-0 rounded-2xl bg-violet-500/30 blur-xl" />
4 <div "color:#79c0ff">className="relative flex h-14 w-14 items-center justify-center rounded-2xl border border-white/10 bg-white/[0.06]">
5 <FolderIcon "color:#79c0ff">className="h-6 w-6 text-violet-300" />
6 </div>
7 </div>
8 <h3 "color:#79c0ff">className="mt-5 text-base font-bold text-white">No projects yet</h3>
9 <p "color:#79c0ff">className="mt-1.5 text-sm leading-relaxed text-white/40">
10 Create your first project to start tracking deploys, analytics and more.
11 </p>
12 <button "color:#79c0ff">className="mt-6 rounded-xl bg-gradient-to-r from-violet-600 to-indigo-600 px-5 py-2.5 text-sm font-bold text-white shadow-lg shadow-violet-500/30 transition hover:shadow-violet-500/50">
13 + New project
14 </button>
15 <button "color:#79c0ff">className="mt-2 text-xs font-semibold text-white/35 transition hover:text-white/60">
16 Import from GitHub instead
17 </button>
18</div>
⬡ UIDrop Component18 lines
TypeScript ReactUTF-8

Success Confirmation

Payment successful!

Receipt #48210 sent to ayush@uidrops.dev

An SVG check that draws itself inside a glowing ring — click “Replay” to run the animation again.

T
success-confirmation.tsx
1function SuccessCheck() {
2 return (
3 <div "color:#79c0ff">className="flex flex-col items-center rounded-3xl border border-white/10 bg-white/[0.03] px-10 py-8 text-center">
4 <div "color:#79c0ff">className="relative flex h-20 w-20 items-center justify-center">
5 <div "color:#79c0ff">className="absolute inset-0 rounded-full bg-emerald-500/20 blur-xl" />
6 <svg viewBox="0 0 52 52" "color:#79c0ff">className="relative h-16 w-16">
7 {/* ring draws in */}
8 <circle cx="26" cy="26" r="23" fill="none" stroke="#34d399" strokeWidth="2.5"
9 strokeDasharray="145" strokeDashoffset="145"
10 "color:#79c0ff">style={{ animation: "draw .6s ease-out forwards" }} />
11 {/* check draws after ring */}
12 <path d="M14 27l8 8 16-17" fill="none" stroke="#34d399" strokeWidth="4"
13 strokeLinecap="round" strokeLinejoin="round"
14 strokeDasharray="36" strokeDashoffset="36"
15 "color:#79c0ff">style={{ animation: "draw .35s .5s ease-out forwards" }} />
16 </svg>
17 </div>
18 <h3 "color:#79c0ff">className="mt-4 text-lg font-extrabold text-white">Payment successful!</h3>
19 <p "color:#79c0ff">className="mt-1 text-sm text-white/40">Receipt #48210 sent to ayush@uidrops.dev</p>
20 </div>
21 );
22}
23 
24/* @keyframes draw { to { stroke-dashoffset: 0; } } */
⬡ UIDrop Component24 lines
TypeScript ReactUTF-8

Previous

←Data Display

Tables, KPI sparklines, rings, timelines and badges

Next

Layout→

Bento grids, app shells, split screens and masonry