Components
- AccordionNew
- Alert
- Alert DialogNew
- AutocompleteNew
- AvatarNew
- Badge
- Breadcrumb
- Button
- CalendarNew
- CardNew
- Checkbox
- Checkbox GroupNew
- CollapsibleNew
- ComboboxNew
- CommandNew
- Context MenuNew
- Date PickerNew
- DialogNew
- DrawerNew
- EmptyNew
- FieldNew
- FieldsetNew
- FormNew
- FrameNew
- GroupNew
- Input
- Input GroupNew
- KbdNew
- Label
- MenuNew
- MeterNew
- Number Field
- OTP FieldNew
- Pagination
- PopoverNew
- Preview CardNew
- Progress
- Radio Group
- Scroll AreaNew
- Select
- Separator
- SheetNew
- SkeletonNew
- Slider
- Spinner
- StepperNew
- Switch
- Table
- TabsNew
- Textarea
- ToastNew
- ToggleNew
- Toggle GroupNew
- ToolbarNew
- Tooltip
Skeleton
A loading state skeleton for your components.
"use client";
import { UserRoundPlusIcon, UsersRoundIcon } from "lucide-react";
import { Avatar, AvatarFallback, AvatarImage } from "mako-ui/components/avatar";
import { Button } from "mako-ui/components/button";
import { Skeleton } from "mako-ui/components/skeleton";
import { useEffect, useState } from "react";
const users = [
{
delay: 3000,
fallback: "SJ",
followers: "15k",
image: "/images/portrait-4.jpg",
name: "Sarah Johnson",
role: "Design Engineer",
},
{
delay: 4000,
fallback: "MA",
followers: "8k",
image: "/images/portrait-1.jpg",
name: "Mark Bennett Andersson",
role: "Product Designer",
},
{
delay: 3400,
fallback: "AR",
followers: "12k",
image: "/images/portrait-5.jpg",
name: "Alex Rivera",
role: "UI/UX Designer",
},
];
function UserCard({
delay,
user,
}: Readonly<{ delay: number; user: (typeof users)[0] }>) {
const [isLoaded, setIsLoaded] = useState(false);
useEffect(() => {
const timer = setTimeout(() => {
setIsLoaded(true);
}, delay);
return () => clearTimeout(timer);
}, [delay]);
if (!isLoaded) {
return <UserCardSkeleton />;
}
return (
<>
<Avatar className="size-10">
<AvatarImage alt={user.name} src={user.image} />
<AvatarFallback>{user.fallback}</AvatarFallback>
</Avatar>
<div className="flex min-w-0 flex-1 flex-col gap-1">
<h4 className="line-clamp-1 font-medium text-sm">{user.name}</h4>
<div className="flex items-center gap-3 text-muted-foreground text-xs">
<span className="truncate">{user.role}</span>
<div className="flex min-w-0 items-center gap-1">
<UsersRoundIcon className="size-3 shrink-0" />
<span className="truncate">
{user.followers}
<span className="max-sm:hidden"> followers</span>
</span>
</div>
</div>
</div>
<Button size="xs">
<UserRoundPlusIcon />
Follow
</Button>
</>
);
}
function UserCardSkeleton() {
return (
<>
<Skeleton className="size-10 rounded-full" />
<div className="flex flex-1 flex-col">
<Skeleton className="my-0.5 h-4 max-w-54" />
<div className="flex max-w-54 items-center gap-1">
<Skeleton className="my-0.5 h-4 w-1/2" />
<Skeleton className="my-0.5 h-4 w-1/2" />
</div>
</div>
<Skeleton className="h-7 w-19 sm:h-6 sm:w-17" />
</>
);
}
export default function Particle() {
return (
<div className="flex w-full max-w-92 flex-col gap-6">
{users.map((user) => (
<div className="flex items-center gap-4" key={user.fallback}>
<UserCard delay={user.delay} user={user} />
</div>
))}
</div>
);
}
Usage
import { Skeleton } from "mako-ui/components/skeleton"<Skeleton className="size-10 rounded-full" />API Reference
This is a custom component.
Skeleton
A simple div with animated pulse effect for loading states. Apply sizing and shape via className.
Examples
Skeleton Only
import { Skeleton } from "mako-ui/components/skeleton";
export default function Particle() {
return (
<div className="flex w-full max-w-92 items-center gap-4">
<Skeleton className="size-10 rounded-full" />
<div className="flex flex-1 flex-col">
<Skeleton className="my-0.5 h-4 max-w-54" />
<div className="flex max-w-54 items-center gap-1">
<Skeleton className="my-0.5 h-4 w-1/2" />
<Skeleton className="my-0.5 h-4 w-1/2" />
</div>
</div>
<Skeleton className="h-6 w-17" />
</div>
);
}
On This Page