AppyKit UI

Skeleton

A loading placeholder that mimics the shape of content.

import { Skeleton } from "@/components/ui/skeleton";
import React from "react";
import { View } from "react-native";
export default function SkeletonDemo() {
return (
  <View className='flex-1 flex-row justify-center items-center p-6 gap-5 bg-white'>
   
       <Skeleton className='h-12 w-12 rounded-full' />
       <View className="flex flex-col gap-2">
        <Skeleton className='h-4 w-52 rounded-full' />
       <Skeleton className='h-4 w-40 rounded-full' />
       </View>
     
    </View>
  
);
}

Installation

npx appykit@latest add skeleton

Create a folder named ui under component folder in your project and add the following code in a file named skeleton.tsx:

import * as React from 'react';
import Animated, {
  useAnimatedStyle,
  useSharedValue,
  withRepeat,
  withSequence,
  withTiming,
} from 'react-native-reanimated';
import { cn } from '@/lib/utils';

const duration = 1000;

function Skeleton({
  className,
  ...props
}: Omit<React.ComponentPropsWithoutRef<typeof Animated.View>, 'style'>) {
  const sv = useSharedValue(1);

  React.useEffect(() => {
    sv.value = withRepeat(
      withSequence(withTiming(0.5, { duration }), withTiming(1, { duration })),
      -1
    );
  }, []);

  const style = useAnimatedStyle(() => ({
    opacity: sv.value,
  }));

  return (
    <Animated.View
      style={style}
      className={cn('rounded-md bg-secondary dark:bg-muted', className)}
      {...props}
    />
  );
}

export { Skeleton };

Update the import paths to match your project setup.

Usage

import { Skeleton } from "@/components/ui/skeleton";
 <Skeleton className='h-52 w-52 rounded-2xl' />

On this page