Examples
Each card is a real component — the skeleton beside it is extracted from the live DOM. Tweak the color, texture, or toggle dark mode.
Blog Post
Hero image, title, excerpt, author row.
We Moved to a Monorepo and It Broke Everything
Three weeks of broken builds, circular deps, and one very long Friday. Here's what we actually learned.
import { Skeleton } from 'boneyard/react'apos;boneyard-js/react'boneyard/react'apos; function BlogPostPage() { const { data, isLoading } = useFetch('/api/blog') return ( <Skeleton loading={isLoading} color="#e0e0e0" > {data && <BlogPost data={data} />} </Skeleton> ) } // color: bone fill color (default: '#e0e0e0') // animate: pulse animation (default: true, set false for solid) // The skeleton is generated automatically from your real UI.
Product Card
Image, price, CTA button.
Aeropress Clear
Same recipe, now in borosilicate glass. Brews a clean cup in 90 seconds.
import { Skeleton } from 'boneyard/react'apos;boneyard-js/react'boneyard/react'apos; function ProductCardPage() { const { data, isLoading } = useFetch('/api/product') return ( <Skeleton loading={isLoading} color="#e0e0e0" > {data && <ProductCard data={data} />} </Skeleton> ) } // color: bone fill color (default: '#e0e0e0') // animate: pulse animation (default: true, set false for solid) // The skeleton is generated automatically from your real UI.
Social Feed
Avatars, text, images, engagement counts.
finally got the espresso dial-in right. 18g in, 36g out, 28 seconds. took me three months and 4 kg of beans.
just realized I mass-renamed a prod table in a migration. deploy went out 4 min ago. currently sprinting.
312 likes · 89 repostsimport { Skeleton } from 'boneyard/react'apos;boneyard-js/react'boneyard/react'apos; function SocialFeedPage() { const { data, isLoading } = useFetch('/api/feed') return ( <Skeleton loading={isLoading} color="#e0e0e0" > {data && <SocialFeed data={data} />} </Skeleton> ) } // color: bone fill color (default: '#e0e0e0') // animate: pulse animation (default: true, set false for solid) // The skeleton is generated automatically from your real UI.
Chat Thread
Alternating bubbles with mixed widths.
import { Skeleton } from 'boneyard/react'apos;boneyard-js/react'boneyard/react'apos; function ChatThreadPage() { const { data, isLoading } = useFetch('/api/chat') return ( <Skeleton loading={isLoading} color="#e0e0e0" > {data && <ChatThread data={data} />} </Skeleton> ) } // color: bone fill color (default: '#e0e0e0') // animate: pulse animation (default: true, set false for solid) // The skeleton is generated automatically from your real UI.
Dashboard
Nav, stats, chart, sidebar list.
import { Skeleton } from 'boneyard/react'apos;boneyard-js/react'boneyard/react'apos; function DashboardPage() { const { data, isLoading } = useFetch('/api/dashboard') return ( <Skeleton loading={isLoading} color="#e0e0e0" > {data && <Dashboard data={data} />} </Skeleton> ) } // color: bone fill color (default: '#e0e0e0') // animate: pulse animation (default: true, set false for solid) // The skeleton is generated automatically from your real UI.
Product Grid
Search bar, image grid, buttons.
import { Skeleton } from 'boneyard/react'apos;boneyard-js/react'boneyard/react'apos; function ProductGridPage() { const { data, isLoading } = useFetch('/api/ecommerce') return ( <Skeleton loading={isLoading} color="#e0e0e0" > {data && <ProductGrid data={data} />} </Skeleton> ) } // color: bone fill color (default: '#e0e0e0') // animate: pulse animation (default: true, set false for solid) // The skeleton is generated automatically from your real UI.
Article
Hero, byline, body text, pull quote.
Your Startup Doesn't Need a Design System Yet
Every three months someone on the team proposes building a design system. Tokens, primitives, a Figma library, the works. We're twelve people. We have nine screens.
The impulse is understandable — consistency matters. But the cost of maintaining shared abstractions at this stage almost always outweighs the benefit.
Copy-paste is underrated. A component you copied and tweaked for one page is faster to build, easier to delete, and won't break four other pages when you change it.
import { Skeleton } from 'boneyard/react'apos;boneyard-js/react'boneyard/react'apos; function ArticlePage() { const { data, isLoading } = useFetch('/api/article') return ( <Skeleton loading={isLoading} color="#e0e0e0" > {data && <Article data={data} />} </Skeleton> ) } // color: bone fill color (default: '#e0e0e0') // animate: pulse animation (default: true, set false for solid) // The skeleton is generated automatically from your real UI.