Vue
Use boneyard in Nuxt, Vite, or any Vue 3 app. Same pixel-perfect skeletons, same CLI — Vue component with slots.
1. Install
npm install boneyard-js2. Wrap your components
<script setup>
import { ref } from 'vue'
import Skeleton from 'boneyard-js/vue'
import './bones/registry'
const loading = ref(true)
</script>
<template>
<Skeleton name="blog-card" :loading="loading">
<BlogCard />
</Skeleton>
</template>3. Generate bones
Option A — Vite plugin (recommended, no second terminal):
import { boneyardPlugin } from 'boneyard-js/vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue(), boneyardPlugin()]
})Option B — CLI:
npx boneyard-js build4. Import the registry
// Add once in your app entry (e.g. main.ts)
import './bones/registry'This import is required.Without it, skeletons won't render — the Skeleton component needs the registry to resolve bone data by name.
| Prop | Type | Default | Description |
|---|---|---|---|
| loading | boolean | — | Show skeleton or children |
| name | string | — | Resolve bones from registry by name |
| initialBones | ResponsiveBones | — | Pass bones directly (overrides registry) |
| color | string | rgba(0,0,0,0.08) | Bone color in light mode |
| darkColor | string | rgba(255,255,255,0.06) | Bone color in dark mode |
| animate | 'pulse' | 'shimmer' | 'solid' | pulse | Animation style (also accepts true/false) |
| class | string | — | CSS class on the container |
| stagger | number | boolean | false | Stagger delay between bones in ms (true = 80ms) |
| transition | number | boolean | false | Fade out duration in ms when loading ends (true = 300ms) |
| boneClass | string | — | CSS class applied to each bone element |
| snapshotConfig | SnapshotConfig | — | Controls bone extraction during CLI capture |
| Slot | Description |
|---|---|
| default | Your real component — shown when not loading |
| #fallback | Shown when loading but no bones are available |
| #fixture | Mock content for CLI capture (dev only, never in production) |
<Skeleton name="dashboard" :loading="loading">
<!-- Default: your real component -->
<Dashboard :data="data" />
<!-- Fixture: mock content for CLI bone capture -->
<template #fixture>
<Dashboard :data="mockData" />
</template>
<!-- Fallback: shown if no bones generated yet -->
<template #fallback>
<p>Loading...</p>
</template>
</Skeleton>Auto-detects via .dark class on <html> or any parent element (Tailwind convention), and prefers-color-scheme media query. Uses darkColor when dark mode is active.
| Value | Effect |
|---|---|
| 'pulse' | Fades a lighter overlay in and out (1.8s cycle) |
| 'shimmer' | Sweeps a gradient highlight across each bone (2.4s cycle) |
| 'solid' | Static — no animation |
| true / false | true = pulse, false = solid |
<!-- Shimmer -->
<Skeleton name="card" :loading="true" animate="shimmer">
<Card />
</Skeleton>
<!-- Custom colors -->
<Skeleton name="card" :loading="true" color="#fca5a5" dark-color="#7f1d1d">
<Card />
</Skeleton>Set defaults for all skeletons with configureBoneyard():
import { configureBoneyard } from 'boneyard-js/vue'
configureBoneyard({
color: '#e5e5e5',
darkColor: 'rgba(255,255,255,0.08)',
animate: 'shimmer',
})Per-component props override global defaults.
See Install → Config file for the full boneyard.config.json reference. Works with all frameworks.
Next steps
- See Getting Started for the full web setup walkthrough
- See Output to understand the .bones.json format
- See CLI & Props Reference for all flags and options