Skip to main content

Skeleton Loading

React-Forminate provides built-in skeleton loading states to enhance user experience during form loading. This feature prevents layout shifts and provides visual feedback while form fields are being initialized.

Basic Usage​

Default Skeleton Loading​

By default, forms will show a subtle skeleton loading state:

<DynamicForm 
formId="myForm"
formData={formData}
/>

Disabling Skeleton Loading​

To completely disable skeleton loading, set showSkeletonLoading to false:

<DynamicForm
formId="myForm"
formData={formData}
showSkeletonLoading={false}
/>

Customization Options​

Using Custom Skeleton Components​

You can provide your own skeleton component for a more branded loading experience:

const MyCustomSkeleton = () => (
// use of the tailwindCSS classes
<div className="animate-pulse space-y-4">
<div className="h-4 bg-gray-200 rounded w-1/4"></div>
<div className="h-10 bg-gray-200 rounded"></div>
</div>
);

<DynamicForm
formId="myForm"
formData={formData}
skeleton={<MyCustomSkeleton />}
/>

Per-Field Customization​

You can also customize skeletons for individual fields:

{
fieldId: "username",
type: "text",
label: "Username",
skeleton: (
<div className="my-custom-field-skeleton">
<div className="skeleton-line"></div>
</div>
)
}

Skeleton Loading Props​

PropTypeDescriptionDefault
showSkeletonLoadingbooleanToggles skeleton loading visibilitytrue
skeletonReactNodeCustom skeleton component to useDefault skeleton

Default Skeleton Implementation​

The default skeleton uses react-loading-skeleton with these characteristics:

const DefaultSkeleton = () => (
<div>
<Skeleton
height={15}
width="25%"
style={{ opacity: 0.2, marginTop: "10px" }}
/>
<Skeleton
height={40}
width="100%"
style={{ opacity: 0.5, marginBottom: "15px" }}
/>
</div>
)

Complete Examples​

Custom Animated Skeleton​

const PulseSkeleton = () => (
// Use of the tailwindCSS classes
<div className="space-y-3">
<div className="h-4 bg-gradient-to-r from-gray-100 to-gray-300 rounded w-1/3 animate-pulse"></div>
<div className="h-10 bg-gradient-to-r from-gray-100 to-gray-300 rounded animate-pulse"></div>
</div>
);

<DynamicForm
formId="animatedForm"
formData={formData}
skeleton={<PulseSkeleton />}
/>

Field-Specific Skeletons​

const formData = {
formId: "userProfile",
fields: [
{
fieldId: "avatar",
type: "file",
label: "Profile Picture",
skeleton: <AvatarSkeleton /> // Custom avatar skeleton
},
{
fieldId: "bio",
type: "textarea",
label: "Biography",
skeleton: <TextareaSkeleton /> // Custom textarea skeleton
},
// Other fields will use default skeleton
{
fieldId: "email",
type: "text",
label: "Email"
}
]
};

Disabling for Specific Fields​

{
fieldId: "instantField",
type: "text",
label: "Always Visible Field",
showSkeletonLoading: false
}
Clicky