
Inspira Ui
- 428 installs
- 202 repo stars
- Updated August 4, 2026
- secondsky/claude-skills
inspira-ui is a Claude Code skill that integrates Inspira UI's 120+ animated Vue and Nuxt components for developers who need TailwindCSS v4 landing pages with motion-v, GSAP, and Three.js effects.
About
inspira-ui is a Claude Code skill for Inspira UI, a copy-paste library of 120+ animated Vue and Nuxt components built on TailwindCSS v4, motion-v, GSAP, and Three.js rather than a traditional npm package install. The skill walks developers through dependency setup with clsx, tailwind-merge, class-variance-authority, tw-animate-css, @vueuse/core, and motion-v, plus optional three and ogl packages for 3D or WebGL backgrounds. It provides component selection workflows for hero sections, aurora backgrounds, shimmer buttons, morphing text, fluid cursors, and particle systems, along with fixes for CSS variable theming, motion-v integration errors, and WebGL cleanup to prevent memory leaks. Developers reach for inspira-ui when shipping marketing sites, portfolios, or SaaS landing pages that need Aceternity-style motion in Vue 3 or Nuxt 4 projects without rebuilding animation primitives from scratch. Install with npx skills add secondsky/claude-skills --skill inspira-ui when you want the agent to pick components from the Inspira UI gallery and wire imports explicitly.
- Extends Claude Code agent capabilities
- Activates on relevant task triggers
- Integrates with Claude Code workflow
Inspira Ui by the numbers
- 428 all-time installs (skills.sh)
- +16 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #1,908 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/secondsky/claude-skills --skill inspira-uiAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 428 |
|---|---|
| repo stars | ★ 202 |
| Last updated | August 4, 2026 |
| Repository | secondsky/claude-skills ↗ |
How do you add animated Vue landing components?
inspira-ui: agent skill for task automation in Claude Code workflows.
Who is it for?
Developers building Vue 3 or Nuxt 4 frontends who want 120+ prebuilt animated UI blocks with guided setup and troubleshooting.
Skip if: Developers standardizing on React or shadcn/ui who will not adopt Vue copy-paste components and TailwindCSS v4 OkLch theming.
When should I use this skill?
The user mentions Inspira UI, animated Vue hero sections, motion-v errors, or TailwindCSS v4 component integration for Nuxt landing pages.
What you get
Configured TailwindCSS v4 theme variables, installed motion dependencies, and pasted Inspira UI component source with working imports.
- animated UI components
- Tailwind theme variables
- dependency install commands
By the numbers
- Inspira UI provides 120+ reusable animated Vue and Nuxt components
- Built on TailwindCSS v4 with motion-v, GSAP, and Three.js integrations
- Uses copy-paste component workflow instead of a single npm library package
Files
Inspira UI - Animated Vue/Nuxt Component Library
Inspira UI is a collection of 120+ reusable, animated components powered by TailwindCSS v4, motion-v, GSAP, and Three.js — crafted to help ship beautiful Vue and Nuxt applications faster.
Table of Contents
When to Use This Skill
Use Inspira UI when building:
- Animated landing pages with hero sections, testimonials, and effects
- Modern web applications requiring 3D visualizations and interactive elements
- Marketing sites with eye-catching backgrounds and text animations
- Portfolio sites with image galleries, carousels, and showcase effects
- Interactive experiences with custom cursors, special effects, and particle systems
- Vue 3 or Nuxt 4 projects requiring production-ready animated components
Key Benefits:
- 120+ copy-paste components (not a traditional npm library)
- Full TypeScript support with Vue 3 Composition API
- TailwindCSS v4 with OkLch color space
- Responsive and mobile-optimized
- Free and open source (MIT license)
Quick Start
1. Install Core Dependencies
# Required for all components
bun add -d clsx tailwind-merge class-variance-authority tw-animate-css
bun add @vueuse/core motion-v
# Optional: For 3D components (Globe, Cosmic Portal, etc.)
bun add three @types/three
# Optional: For WebGL components (Fluid Cursor, Neural Background, etc.)
bun add ogl2. Setup CN Utility
Create lib/utils.ts:
import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}3. Configure CSS Variables
Add to your main.css. See references/SETUP.md for complete CSS configuration with OkLch colors.
4. Verify Setup
./scripts/verify-setup.sh5. Copy Components
Browse inspira-ui.com/components, copy what you need into components/ui/.
Secure Installation
This installs 6+ packages including 3D libraries (three, ogl) with large dependency trees. Before installing, follow supply chain security best practices:
- Block post-install scripts —
npm config set ignore-scripts true(or Bun: disabled by default) - Cooldown period — Wait 7 days for new package versions to be vetted by the community
- Audit before installing — Run
socket package score npm <pkg>or usesocket npm install <pkg>to check packages
Load the dependency-upgrade skill for full security configuration including Socket CLI integration, cooldown setup, lockfile validation, and CI enforcement.
Component Selection Workflow
What type of effect do you need?
1. Background Effects → Aurora, Cosmic Portal, Particles, Neural Background
- See: references/components-list.md#backgrounds
2. Text Animations → Morphing Text, Glitch, Hyper Text, Sparkles Text
- See: references/components-list.md#text-animations
3. 3D Visualizations → Globe, 3D Carousel, Icon Cloud, World Map
- Dependencies:
bun add three @types/three - See: references/components-list.md#visualization
4. Interactive Cursors → Fluid Cursor, Tailed Cursor, Smooth Cursor
- Dependencies:
bun add ogl(for WebGL cursors) - See: references/components-list.md#cursors
5. Animated Buttons → Shimmer, Ripple, Rainbow, Gradient
- No extra dependencies
- See: references/components-list.md#buttons
6. Special Effects → Confetti, Meteors, Neon Border, Glow Border
- See: references/components-list.md#special-effects
For complete implementation details (props, full code, installation): Fetch https://inspira-ui.com/docs/llms-full.txt - LLM-optimized documentation with structured props tables and working code examples.
Core Usage Patterns
Pattern 1: Animated Landing Page
<template>
<AuroraBackground>
<Motion
:initial="{ opacity: 0, y: 40, filter: 'blur(10px)' }"
:while-in-view="{ opacity: 1, y: 0, filter: 'blur(0px)' }"
:transition="{ delay: 0.3, duration: 0.8, ease: 'easeInOut' }"
class="relative flex flex-col items-center gap-4 px-4"
>
<div class="text-center text-3xl font-bold md:text-7xl">
Your amazing headline
</div>
<ShimmerButton>Get Started</ShimmerButton>
</Motion>
</AuroraBackground>
</template>
<script setup lang="ts">
import { Motion } from "motion-v";
import AuroraBackground from "~/components/ui/AuroraBackground.vue";
import ShimmerButton from "~/components/ui/ShimmerButton.vue";
</script>Pattern 2: Props with TypeScript Interfaces
<script setup lang="ts">
// ALWAYS use interface-based props
interface Props {
title: string;
count?: number;
variant?: "primary" | "secondary";
}
const props = withDefaults(defineProps<Props>(), {
count: 0,
variant: "primary",
});
</script>Pattern 3: Explicit Imports (Critical for Vue.js Compatibility)
<script setup lang="ts">
// ALWAYS include explicit imports even with Nuxt auto-imports
import { ref, onMounted, computed } from "vue";
import { useWindowSize } from "@vueuse/core";
const { width } = useWindowSize();
</script>Pattern 4: WebGL Component Cleanup
<script setup lang="ts">
import { onUnmounted } from "vue";
let animationFrame: number;
let renderer: any;
onUnmounted(() => {
// CRITICAL: Clean up WebGL resources to prevent memory leaks
if (animationFrame) cancelAnimationFrame(animationFrame);
if (renderer) renderer.dispose();
});
</script>Pattern 5: Client-Only Wrapper (Nuxt)
<template>
<ClientOnly>
<FluidCursor />
</ClientOnly>
</template>Critical Pitfalls to Avoid
1. Accessibility Bug (CRITICAL)
The original Inspira UI docs have --destructive-foreground set to the same color as --destructive, making text invisible. Use the corrected value:
:root {
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.985 0 0); /* CORRECTED */
}2. Missing CSS Imports
/* REQUIRED in main.css */
@import "tailwindcss";
@import "tw-animate-css"; /* Often forgotten! */3. Wrong Props Syntax
// DON'T: Object syntax
const props = defineProps({ title: { type: String } });
// DO: Interface syntax
interface Props { title: string; }
const props = defineProps<Props>();4. Three.js Without ClientOnly (Nuxt)
<!-- WRONG: Will fail during SSR -->
<GithubGlobe :markers="markers" />
<!-- CORRECT -->
<ClientOnly>
<GithubGlobe :markers="markers" />
</ClientOnly>5. Using Enums Instead of as const
// DON'T: TypeScript enums
enum ButtonVariant { Primary = "primary" }
// DO: as const objects
const ButtonVariants = { Primary: "primary" } as const;Token Efficiency
Average Token Savings: ~65%
- Without skill: ~15k tokens (trial-and-error with setup)
- With skill: ~5k tokens (direct implementation)
Errors Prevented: 13+ common issues including: 1. Critical accessibility bug (destructive-foreground) 2. TailwindCSS v4 CSS variables misconfiguration 3. Missing @import "tw-animate-css" 4. Motion-V setup issues 5. Three.js/OGL without ClientOnly 6. Props typed with object syntax instead of interfaces 7. Missing explicit imports
Detailed Documentation
For complete setup with all CSS variables: references/SETUP.md
For all 120+ components with dependencies: references/components-list.md
For troubleshooting common issues: references/TROUBLESHOOTING.md
For TypeScript patterns and conventions: references/CODE_PATTERNS.md
Keywords
Frameworks: Vue, Vue 3, Nuxt, Nuxt 4, Composition API, script setup
Styling: TailwindCSS v4, OkLch, CSS variables, dark mode
Animation: motion-v, GSAP, Three.js, WebGL, OGL, canvas
Components: aurora background, shimmer button, morphing text, 3D globe, fluid cursor, confetti, neon border, icon cloud, flip card, particles
Use Cases: landing pages, hero sections, animated backgrounds, interactive UI, marketing sites, portfolios, 3D websites
Problems Solved: Vue animations, Nuxt animations, animated components, 3D effects, particle effects, modern UI effects
Resources
- Official Documentation: https://inspira-ui.com/docs
- LLM-Optimized Docs: https://inspira-ui.com/docs/llms-full.txt (complete props, code examples, installation)
- Component Gallery: https://inspira-ui.com/components
- GitHub Repository: https://github.com/unovue/inspira-ui
- Discord Community: https://discord.gg/Xbh5DwJRc9
---
Production Status: ✅ Production-Ready Token Efficiency: ✅ ~65% savings Error Prevention: ✅ 13+ common issues prevented Last Updated: 2025-11-12
Inspira UI Code Patterns & Best Practices
This guide covers TypeScript patterns, Vue 3 Composition API conventions, and best practices for working with Inspira UI components.
Component File Structure
Standard structure for all Inspira UI components:
<template>
<!-- Template code -->
</template>
<script setup lang="ts">
// 1. Imports (explicit, always)
import { ref, computed, onMounted, onUnmounted } from "vue";
// 2. Props interface
interface Props {
title: string;
count?: number;
isActive?: boolean;
}
// 3. Props definition with defaults
const props = withDefaults(defineProps<Props>(), {
count: 0,
isActive: false,
});
// 4. Emits
const emit = defineEmits<{
click: [value: string];
update: [count: number];
}>();
// 5. Component logic
const state = ref(0);
const computed = computed(() => props.count * 2);
// 6. Lifecycle hooks
onMounted(() => {
// Setup
});
onUnmounted(() => {
// Cleanup
});
</script>
<style scoped>
/* Scoped styles if needed */
</style>---
Props Definition
DO: Interface-Based Props
<script setup lang="ts">
interface Props {
title: string;
count?: number;
variant?: "primary" | "secondary" | "destructive";
items?: string[];
}
const props = withDefaults(defineProps<Props>(), {
count: 0,
variant: "primary",
items: () => [],
});
</script>DON'T: Object Syntax Props
<script setup lang="ts">
// AVOID THIS - less type-safe, more verbose
const props = defineProps({
title: { type: String, required: true },
count: { type: Number, default: 0 },
variant: {
type: String,
default: "primary",
validator: (v) => ["primary", "secondary", "destructive"].includes(v),
},
});
</script>---
Explicit Imports
Always include explicit imports, even in Nuxt with auto-imports:
<script setup lang="ts">
// ALWAYS DO THIS for Vue.js compatibility
import { ref, onMounted, computed, watch } from "vue";
import { useWindowSize, useMouse, useIntersectionObserver } from "@vueuse/core";
import { Motion } from "motion-v";
// This ensures components work in both Vue and Nuxt
// and makes dependencies clear
</script>---
Constants Naming
Use CAPS_SNAKE_CASE for constants, with component prefix:
// Component-specific constants
const AURORA_GRADIENT_COLORS = ["#ff0000", "#00ff00", "#0000ff"] as const;
const BUTTON_ANIMATION_DURATION = 300;
const PARTICLE_DEFAULT_COUNT = 100;
const GLOBE_ROTATION_SPEED = 0.005;
// Configuration objects
const SHIMMER_BUTTON_CONFIG = {
duration: 300,
easing: "ease-in-out",
colors: ["#3b82f6", "#8b5cf6"],
} as const;---
Avoid Enums - Use as const Objects
DO: Use as const Objects
export const ButtonVariants = {
Primary: "primary",
Secondary: "secondary",
Destructive: "destructive",
Ghost: "ghost",
} as const;
export type ButtonVariant = (typeof ButtonVariants)[keyof typeof ButtonVariants];
// Usage
const variant: ButtonVariant = ButtonVariants.Primary;DON'T: Use TypeScript Enums
// AVOID - Enums have runtime overhead and tree-shaking issues
enum ButtonVariants {
Primary = "primary",
Secondary = "secondary",
Destructive = "destructive",
}---
Motion-V Animation Patterns
Basic Animation
<template>
<Motion
:initial="{ opacity: 0, y: 20 }"
:animate="{ opacity: 1, y: 0 }"
:transition="{ duration: 0.5, ease: 'easeOut' }"
>
<div>Animated content</div>
</Motion>
</template>
<script setup lang="ts">
import { Motion } from "motion-v";
</script>While In View Animation
<template>
<Motion
:initial="{ opacity: 0, scale: 0.8 }"
:while-in-view="{ opacity: 1, scale: 1 }"
:transition="{ delay: 0.3, duration: 0.8 }"
>
<div>Animates when scrolled into view</div>
</Motion>
</template>Hover Animation
<template>
<Motion
:initial="{ scale: 1 }"
:while-hover="{ scale: 1.05 }"
:transition="{ type: 'spring', stiffness: 300 }"
>
<button>Hover me</button>
</Motion>
</template>---
VueUse Composables Pattern
<script setup lang="ts">
import { ref, computed } from "vue";
import {
useWindowSize,
useMouse,
useIntersectionObserver,
useElementSize,
useThrottleFn,
} from "@vueuse/core";
// Window dimensions
const { width: windowWidth, height: windowHeight } = useWindowSize();
// Mouse position
const { x: mouseX, y: mouseY } = useMouse();
// Element intersection
const target = ref<HTMLElement | null>(null);
const isVisible = ref(false);
useIntersectionObserver(target, ([{ isIntersecting }]) => {
isVisible.value = isIntersecting;
});
// Throttled handler for performance
const handleScroll = useThrottleFn(() => {
// Heavy computation
}, 100);
</script>---
Responsive Design Patterns
Tailwind Responsive Classes
<template>
<div class="text-2xl md:text-4xl lg:text-6xl xl:text-8xl">
Responsive Text
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<!-- Responsive grid -->
</div>
<div class="hidden md:block">
<!-- Desktop only -->
</div>
<div class="block md:hidden">
<!-- Mobile only -->
</div>
</template>Programmatic Responsiveness
<script setup lang="ts">
import { computed } from "vue";
import { useWindowSize } from "@vueuse/core";
const { width } = useWindowSize();
const isMobile = computed(() => width.value < 768);
const isTablet = computed(() => width.value >= 768 && width.value < 1024);
const isDesktop = computed(() => width.value >= 1024);
const particleCount = computed(() => {
if (isMobile.value) return 50;
if (isTablet.value) return 100;
return 200;
});
</script>---
Dark Mode Patterns
CSS Variables Approach
<template>
<div class="bg-background text-foreground">
<!-- Automatically switches with dark mode -->
</div>
<button class="bg-primary text-primary-foreground hover:bg-primary/90">
Primary Button
</button>
<div class="border border-border bg-card text-card-foreground">
Card content
</div>
</template>Conditional Styling
<template>
<div
:class="[
'transition-colors duration-200',
isDark ? 'bg-gray-900' : 'bg-white',
]"
>
Content
</div>
</template>
<script setup lang="ts">
import { useDark } from "@vueuse/core";
const isDark = useDark();
</script>---
WebGL/Canvas Cleanup Pattern
Critical for preventing memory leaks:
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from "vue";
import * as THREE from "three";
const containerRef = ref<HTMLElement | null>(null);
let renderer: THREE.WebGLRenderer | null = null;
let scene: THREE.Scene | null = null;
let camera: THREE.PerspectiveCamera | null = null;
let animationId: number | null = null;
onMounted(() => {
if (!containerRef.value) return;
// Initialize Three.js
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight);
renderer = new THREE.WebGLRenderer({ antialias: true });
containerRef.value.appendChild(renderer.domElement);
// Animation loop
const animate = () => {
animationId = requestAnimationFrame(animate);
renderer?.render(scene!, camera!);
};
animate();
});
onUnmounted(() => {
// CRITICAL: Clean up WebGL resources
if (animationId) cancelAnimationFrame(animationId);
if (renderer) {
renderer.dispose();
renderer.forceContextLoss();
renderer.domElement.remove();
renderer = null;
}
if (scene) {
scene.traverse((object) => {
if (object instanceof THREE.Mesh) {
object.geometry.dispose();
if (Array.isArray(object.material)) {
object.material.forEach((m) => m.dispose());
} else {
object.material.dispose();
}
}
});
scene = null;
}
camera = null;
});
</script>---
Client-Only Pattern (Nuxt)
For browser-only components:
<template>
<ClientOnly>
<FluidCursor />
<template #fallback>
<div class="h-full w-full animate-pulse bg-muted" />
</template>
</ClientOnly>
</template>
<script setup lang="ts">
// No special imports needed for ClientOnly in Nuxt
</script>---
Event Handling Pattern
<script setup lang="ts">
const emit = defineEmits<{
click: [event: MouseEvent];
update: [value: string];
change: [oldValue: string, newValue: string];
}>();
const handleClick = (event: MouseEvent) => {
// Process event
emit("click", event);
};
const updateValue = (newValue: string) => {
const oldValue = currentValue.value;
currentValue.value = newValue;
emit("change", oldValue, newValue);
};
</script>---
Performance Optimization Patterns
Computed Properties
<script setup lang="ts">
import { computed } from "vue";
// Cache expensive calculations
const filteredItems = computed(() => {
return props.items.filter((item) => item.active);
});
const sortedAndFiltered = computed(() => {
return filteredItems.value.sort((a, b) => a.priority - b.priority);
});
</script>Watch with Debounce
<script setup lang="ts">
import { ref, watch } from "vue";
import { useDebounceFn } from "@vueuse/core";
const searchQuery = ref("");
const performSearch = useDebounceFn((query: string) => {
// API call or heavy operation
}, 300);
watch(searchQuery, (newQuery) => {
performSearch(newQuery);
});
</script>Conditional Rendering
<template>
<!-- Use v-show for frequent toggles (keeps DOM) -->
<div v-show="isVisible">Frequently toggled</div>
<!-- Use v-if for rare toggles (removes DOM) -->
<HeavyComponent v-if="shouldLoad" />
</template>---
Slot Patterns
<!-- Component definition -->
<template>
<div class="wrapper">
<slot name="header" :title="title">
<!-- Default header -->
<h2>{{ title }}</h2>
</slot>
<slot>
<!-- Default content -->
</slot>
<slot name="footer" :actions="actions">
<!-- Default footer -->
</slot>
</div>
</template>
<!-- Usage -->
<MyComponent title="Hello">
<template #header="{ title }">
<h1>Custom: {{ title }}</h1>
</template>
<p>Main content</p>
<template #footer="{ actions }">
<button v-for="action in actions" :key="action.id">
{{ action.label }}
</button>
</template>
</MyComponent>---
Error Boundary Pattern
<script setup lang="ts">
import { onErrorCaptured, ref } from "vue";
const error = ref<Error | null>(null);
onErrorCaptured((err) => {
error.value = err;
// Return false to prevent error from propagating
return false;
});
</script>
<template>
<div v-if="error" class="error-boundary">
<p>Something went wrong: {{ error.message }}</p>
<button @click="error = null">Retry</button>
</div>
<slot v-else />
</template>---
Summary: Key Conventions
1. Always use interface-based props with defineProps<Props>() 2. Include explicit imports for Vue composables 3. Use `as const` objects instead of enums 4. Name constants with CAPS_SNAKE_CASE and component prefix 5. Clean up WebGL/Canvas resources in onUnmounted 6. Wrap browser-only components in <ClientOnly> for Nuxt 7. Use VueUse composables for reactive utilities 8. Leverage Motion-V for declarative animations 9. Follow CSS variable patterns for theming 10. Optimize performance with computed properties and throttling
---
Last Updated: 2025-11-12
Inspira UI Components Quick Reference
Complete list of all 120+ components organized by category.
💡 Need complete implementation details? For full props documentation, code examples, and installation instructions, fetch:
https://inspira-ui.com/docs/llms-full.txt (LLM-optimized documentation)
🌌 Backgrounds (24)
| Component | Description | Dependencies |
|---|---|---|
| Aurora Background | Subtle Aurora/Southern Lights effect with radial gradients | motion-v |
| Black Hole Background | Canvas-driven warped tunnel with animated discs, radial lines | Canvas API |
| Bubbles Background | Three.js animated floating bubbles with gradient colors | three |
| Cosmic Portal | Animated 3D portal with glowing rings and floating crystals | three |
| Falling Stars | Animated starfield with glowing and sharp trail effects | Canvas API |
| Flickering Grid | Canvas-based flickering grid pattern | Canvas API |
| Interactive Grid Pattern | SVG-based interactive background grid | SVG |
| Lamp Effect | Captivating lamp lighting with conic gradients | CSS |
| Liquid Background | Reactive dynamic effect using OGL for WebGL visuals | ogl |
| Neural Background | Shader-powered animated background with fluid visuals | ogl, GLSL |
| Particle Whirlpool | Whirlpool particle animation effect | Canvas API |
| Particles Background | Classic particle background animation | Canvas API |
| Pattern Background | Reusable animated patterns (grid, dot variants) | SVG |
| Ripple | Ripple effect background animation | CSS |
| Silk Background | Smooth silk-like background effect | CSS |
| Snowfall Background | Animated falling snow particles | Canvas API |
| Sparkles | Sparkling animated background effect | Canvas API |
| Stars Background | Twinkling stars background | Canvas API |
| Stractium Background | Abstract stractium-style background | Canvas API |
| Tetris | Animated falling tetris blocks background | Canvas API |
| Video Text | Text with video background effect | Video API |
| Vortex | Swirling vortex background effect | Canvas API |
| Warp Background | Warp speed effect background | Canvas API |
| Wavy Background | Animated wavy pattern background | CSS |
🔘 Buttons (5)
| Component | Description | Dependencies |
|---|---|---|
| Gradient Button | Rotating conic gradient border with customizable properties | CSS |
| Interactive Hover Button | Dynamic transitions with light/dark mode adaptation | motion-v |
| Rainbow Button | Rainbow gradient effect on hover | CSS |
| Ripple Button | Ripple effect with customizable colors and duration | CSS |
| Shimmer Button | Shimmering animated gradient effect | CSS |
🃏 Cards (6)
| Component | Description | Dependencies |
|---|---|---|
| 3D Card Effect | Card perspective effect with element elevation on hover | motion-v |
| Apple Card Carousel | Apple-style carousel with blur-loading and modal expansion | motion-v |
| Card Spotlight | Dynamic spotlight effect following mouse cursor | CSS |
| Direction Aware Hover | Image card with directional hover effects | motion-v |
| Flip Card | Smooth 180-degree flipping animations | motion-v |
| Glare Card | Linear-website-style glare effect on hover | CSS |
🖱️ Cursors (5)
| Component | Description | Dependencies |
|---|---|---|
| Fluid Cursor | GPU-accelerated animated cursor trail simulating fluid motion | ogl |
| Image Trail Cursor | Dynamic trail of images following mouse movement | motion-v |
| Sleek Line Cursor | Reactive animated cursor trail with wave-like motion | motion-v |
| Smooth Cursor | Physics-based smooth cursor animation | motion-v |
| Tailed Cursor | Colorful ribbon cursor trail with WebGL and shaders | ogl |
📱 Device Mocks (2)
| Component | Description | Dependencies |
|---|---|---|
| iPhone Mockup | SVG mockup of iPhone with customizable content | SVG |
| Safari Mockup | SVG mockup of Safari browser with customizable content | SVG |
✏️ Input and Forms (5)
| Component | Description | Dependencies |
|---|---|---|
| Color Picker | Comprehensive color picker with multiple formats | @vueuse/core |
| File Upload | Modern file upload with 3D card effect and drag-and-drop | motion-v |
| Halo Search | Futuristic search input with glowing rings | CSS |
| Input | Versatile dynamic input field with radial hover effects | CSS |
| Placeholders and Vanish Input | Sliding placeholders with vanish effect on submit | motion-v |
🎨 Miscellaneous (24)
| Component | Description | Dependencies |
|---|---|---|
| Animate Grid | Skew animation grid with box shadow | motion-v |
| Animated Circular Progress Bar | Circular gauge with percentage value | motion-v |
| Animated List | Sequentially animated list with timed delays | motion-v |
| Animated Testimonials | Engaging animated testimonial component with auto-play | motion-v |
| Animated Tooltip | Tooltip that follows mouse pointer on hover | @vueuse/core |
| Balance Slider | Dynamic balance slider with adjustable colors and limits | @vueuse/core |
| Bento Grid | Grid layout with different child components | CSS |
| Book | 3D book component with customizable sizes and gradients | CSS |
| Compare | Slide to compare any two pieces of content | @vueuse/core |
| Container Scroll | Container scrolling effect with scaling and rotating | motion-v |
| Dock | macOS-style dock with magnifying icons on hover | motion-v |
| Expandable Gallery | Responsive image gallery with interactive hover expansion | CSS |
| Images Slider | Full-page slider with keyboard navigation | motion-v |
| Lens | Lens component to zoom into images or videos | @vueuse/core |
| Link Preview | Dynamic link previews for anchor tags | @vueuse/core |
| Marquee | Auto-scrolling marquee component | CSS |
| Morphing Tabs | Tabs with morphing transitions | motion-v |
| Multi-Step Loader | Loading animation for multi-step processes | motion-v |
| Photo Gallery | Responsive photo gallery layout | CSS |
| Scroll Island | Floating scroll-based navigation island | @vueuse/core |
| Shader Toy | Embed shader toy effects | GLSL |
| SVG Mask | SVG masking effects for images/content | SVG |
| Testimonial Slider | Slider for testimonials | motion-v |
| Timeline | Vertical timeline component | CSS |
| Tracing Beam | Animated beam that traces paths | SVG |
✨ Special Effects (12)
| Component | Description | Dependencies |
|---|---|---|
| Animated Beam | SVG beam connecting elements with animation | SVG |
| Border Beam | Animated border beam effect with customizable properties | CSS |
| Confetti | Confetti animations for celebrations | canvas-confetti |
| Glow Border | Animated glowing border effect | CSS |
| Glowing Effect | Proximity-based glow effect reacting to mouse and scroll | @vueuse/core |
| Meteors | Meteor shower animation with customizable meteor count | CSS |
| Neon Border | Neon border component with customizable animations | CSS |
| Particle Image | Particle animation applied to images | Canvas API |
| Scratch To Reveal | Interactive scratch-off effect revealing hidden content | Canvas API |
| Spring Calendar | Animated calendar widget with spring transitions | motion-v |
📝 Text Animations (24)
| Component | Description | Dependencies |
|---|---|---|
| 3D Text | Stylish 3D text with customizable colors and shadows | CSS |
| Blur Reveal | Smooth blur fade-in content animation | motion-v |
| Box Reveal | Animated box reveal effect | motion-v |
| Colorful Text | Text with various colors, filter, and scale effects | motion-v |
| Container Text Flip | Container that flips through words | motion-v |
| Flip Words | Component that flips through a list of words | motion-v |
| Focus | Highlight words with blurred effect and focus frame | motion-v |
| Hyper Text | Hyper changing text animation on hover | CSS |
| Letter Pullup | Staggered letter pull-up text animation | motion-v |
| Line Shadow Text | Text with line shadow effect | CSS |
| Morphing Text | Dynamic transitions between text strings | motion-v |
| Number Ticker | Animate numbers counting up or down | motion-v |
| Radiant Text | Glare effect on text | CSS |
| Sparkles Text | Dynamic text generating continuous sparkles | Canvas API |
| Spinning Text | Text animating in circular motion | CSS |
| Text Generate Effect | Text generation/typing effect | motion-v |
| Text Glitch | Glitch effect on text | CSS |
| Text Highlight | Highlight text with animated background | motion-v |
| Text Hover Effect | Custom hover effects for text | CSS |
| Text Reveal | Reveal text with animation | motion-v |
| Text Reveal Card | Card with text reveal animation | motion-v |
| Text Scroll Reveal | Reveal text on scroll | motion-v |
📊 Visualization (21)
| Component | Description | Dependencies |
|---|---|---|
| Bending Gallery | Curved, scrollable 3D gallery with WebGL | ogl |
| 3D Carousel | Dynamic interactive 3D carousel | three, motion-v |
| File Tree | Component showcasing folder and file structure | CSS |
| GitHub Globe | 3D interactive globe with arcs and points | three |
| Globe | Interactive rotating globe component | three |
| Icon Cloud | Interactive 3D tag cloud component | three |
| Infinite Grid | High-performance interactive 3D infinite grid | ogl |
| Light Speed | 3D highway speed visual effect | three |
| Liquid Glass Effect | Striking glassmorphism effect | SVG |
| Liquid Logo | WebGL-based dynamic liquid effect for logos | ogl |
| Logo Cloud | Animated company logo cloud | motion-v |
| Logo Origami | Animated flipping logo with origami effect | CSS |
| Orbit | Content animating in circular orbit | motion-v |
| Spline | Vue wrapper for Spline 3D tool | spline |
| World Map | Customizable world map with animated arcs | SVG |
🧱 Blocks (2)
| Block | Description | Components Used |
|---|---|---|
| Hero | Complete hero section blocks with various styles | Various |
| Testimonials | Complete testimonial section blocks | Animated Testimonials |
Dependencies Summary
Core (Required)
@vueuse/core- Vue composition utilitiesmotion-v- Vue animation libraryclsx- Class name utilitytailwind-merge- Tailwind class mergingclass-variance-authority- Variant utilitiestw-animate-css- Tailwind animation utilities
Optional (Component-Specific)
three&@types/three- For 3D components (Globe, Cosmic Portal, etc.)ogl- For WebGL/shader components (Fluid Cursor, Liquid Background, etc.)gsap- For advanced animations (select components)canvas-confetti- For Confetti componentspline- For Spline component
Usage Pattern
1. Browse: Visit https://inspira-ui.com/components 2. Copy: Copy the component code you need 3. Paste: Add to your components/ui/ directory 4. Install: Install component-specific dependencies if needed 5. Customize: Modify colors, sizes, animations to fit your design
Component Files Location
When copying components, typical structure:
your-project/
├── components/
│ └── ui/
│ ├── AuroraBackground.vue
│ ├── ShimmerButton.vue
│ ├── FlipCard.vue
│ └── ...
├── lib/
│ └── utils.ts (cn utility)
└── assets/
└── main.css (CSS variables)Quick Links
- Component Gallery: https://inspira-ui.com/components
- Installation Guide: https://inspira-ui.com/docs/getting-started/installation
- GitHub: https://github.com/unovue/inspira-ui
- Discord: https://discord.gg/Xbh5DwJRc9
---
Last Updated: 2025-11-12 Total Components: 120+ Blocks: 2
Inspira UI Complete Setup Guide
This guide contains the complete setup instructions for integrating Inspira UI into your Vue 3 or Nuxt 4 project.
Prerequisites
Before starting, ensure you have:
- Vue 3 or Nuxt 4 project
- TailwindCSS v4 (required - for v3, use Inspira UI v1)
- Node.js 18+
- Bun (recommended) or npm/pnpm
Step 1: Install TailwindCSS v4
Follow the official TailwindCSS installation guide.
Step 2: Install Core Dependencies
Install utility libraries and TailwindCSS animation utilities:
bun add -d clsx tailwind-merge class-variance-authority tw-animate-cssInstall VueUse and Motion-V for animations:
bun add @vueuse/core motion-vFollow the Motion-V Vue/Nuxt setup guide to configure motion-v in your project.
Step 3: Configure CSS Variables
Add the following to your main.css or global CSS file:
@import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *));
:root {
--card: oklch(1 0 0);
--card-foreground: oklch(0.141 0.005 285.823);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.141 0.005 285.823);
--primary: oklch(0.21 0.006 285.885);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.967 0.001 286.375);
--secondary-foreground: oklch(0.21 0.006 285.885);
--muted: oklch(0.967 0.001 286.375);
--muted-foreground: oklch(0.552 0.016 285.938);
--accent: oklch(0.967 0.001 286.375);
--accent-foreground: oklch(0.21 0.006 285.885);
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.985 0 0);
--border: oklch(0.92 0.004 286.32);
--input: oklch(0.92 0.004 286.32);
--ring: oklch(0.705 0.015 286.067);
--radius: 0.625rem;
--background: oklch(1 0 0);
--foreground: oklch(0.141 0.005 285.823);
}
.dark {
--background: oklch(0.141 0.005 285.823);
--foreground: oklch(0.985 0 0);
--card: oklch(0.141 0.005 285.823);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.141 0.005 285.823);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.985 0 0);
--primary-foreground: oklch(0.21 0.006 285.885);
--secondary: oklch(0.274 0.006 286.033);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.274 0.006 286.033);
--muted-foreground: oklch(0.705 0.015 286.067);
--accent: oklch(0.274 0.006 286.033);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.396 0.141 25.723);
--destructive-foreground: oklch(0.637 0.237 25.331);
--border: oklch(0.274 0.006 286.033);
--input: oklch(0.274 0.006 286.033);
--ring: oklch(0.442 0.017 285.786);
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}
html {
color-scheme: light dark;
}
html.dark {
color-scheme: dark;
}
html.light {
color-scheme: light;
}CRITICAL BUG FIX: The CSS variables above have been corrected from the original Inspira UI documentation. The original docs have an accessibility bug where --destructive-foreground in light mode is set to the same value as --destructive (both oklch(0.577 0.245 27.325)), making destructive text invisible. This version uses oklch(0.985 0 0) for proper contrast.
Step 4: Setup CN Utility
Create lib/utils.ts (or appropriate location in your project):
import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
export type ObjectValues<T> = T[keyof T];Step 5: Optional Icon Support
Many components use icons. Install Iconify Vue for optimal experience:
Follow the Iconify Vue guide for installation.
Step 6: Optional Dependencies
Install based on the components you need:
For 3D Components (Globe, Cosmic Portal, 3D Carousel, etc.)
bun add three @types/threeFor OGL/WebGL Components (Fluid Cursor, Liquid Background, Neural Background, etc.)
bun add oglFor GSAP Animations (certain advanced animations)
bun add gsapFor Confetti Effect
bun add canvas-confettiVerification Checklist
After setup, verify:
- [ ] TailwindCSS v4 is installed and configured
- [ ]
@import "tailwindcss"is in your CSS - [ ]
@import "tw-animate-css"is in your CSS - [ ] CSS variables are defined in
:rootand.dark - [ ]
@theme inlineblock is present - [ ]
cn()utility is created and accessible - [ ] Motion-V is configured per their docs
- [ ] Optional dependencies installed for your components
Quick Verification Command
After setup, run the verification script:
./scripts/verify-setup.shThis will check that all required dependencies are installed and configured correctly.
Nuxt-Specific Setup
For Nuxt 4 projects, additional configuration:
nuxt.config.ts
export default defineNuxtConfig({
// Enable TypeScript
typescript: {
strict: true,
},
// Configure motion-v if using as module
modules: [
// Add any Nuxt modules needed
],
// Tailwind v4 is auto-configured in Nuxt 4
});ClientOnly Wrapper
For browser-only components (WebGL, Canvas, etc.):
<template>
<ClientOnly>
<FluidCursor />
</ClientOnly>
</template>Project Structure
Recommended file organization after setup:
your-project/
├── assets/
│ └── main.css # CSS variables and imports
├── components/
│ └── ui/ # Inspira UI components
│ ├── AuroraBackground.vue
│ ├── ShimmerButton.vue
│ └── ...
├── lib/
│ └── utils.ts # cn() utility
└── package.json # DependenciesUsing Components
Inspira UI is a copy-paste library:
1. Browse: Visit inspira-ui.com/components 2. Select: Choose the component you need 3. Copy: Copy the component code 4. Paste: Add to your components/ui/ directory 5. Import: Import and use in your pages/components 6. Customize: Modify to fit your design
Next Steps
- Browse components: https://inspira-ui.com/components
- Check component dependencies: components-list.md
- Learn code patterns: CODE_PATTERNS.md
- Troubleshoot issues: TROUBLESHOOTING.md
---
Last Updated: 2025-11-12
Inspira UI Troubleshooting Guide
Common issues and solutions when working with Inspira UI components.
Issue 1: TailwindCSS v4 Not Working
Symptoms:
- Components not styling correctly
- CSS variables undefined
- Tailwind classes not applied
Solution: 1. Verify TailwindCSS v4 is installed: bun add tailwindcss@next 2. Check @import "tailwindcss" is in your CSS 3. Ensure CSS variables are defined in :root and .dark 4. Verify @theme inline block is present 5. Check that @layer base styles are applied
Verification:
grep -r "@import \"tailwindcss\"" src/assets/
grep -r "var(--background)" src/assets/---
Issue 2: Motion-V Animations Not Working
Symptoms:
- Motion components render but don't animate
- No transitions or movements
- Static content
Solution: 1. Install motion-v: bun add motion-v 2. Follow Motion-V setup guide 3. For Nuxt, ensure proper plugin configuration 4. Import Motion component: import { Motion } from "motion-v" 5. Verify you're using correct props (:initial, :animate, :transition)
Example Fix:
<script setup lang="ts">
// Correct import
import { Motion } from "motion-v";
</script>
<template>
<!-- Correct usage -->
<Motion
:initial="{ opacity: 0 }"
:animate="{ opacity: 1 }"
:transition="{ duration: 0.5 }"
>
Content
</Motion>
</template>---
Issue 3: Three.js Components Not Rendering
Symptoms:
- 3D components (Globe, Cosmic Portal, 3D Carousel) show blank
- Canvas element present but empty
- WebGL context errors
Solution: 1. Install Three.js: bun add three @types/three 2. Wrap in <ClientOnly> for Nuxt 3. Check browser console for WebGL errors 4. Verify canvas element is rendering 5. Ensure proper cleanup in onUnmounted
Example:
<template>
<ClientOnly>
<GithubGlobe :markers="markers" />
</ClientOnly>
</template>
<script setup lang="ts">
import { onUnmounted } from "vue";
onUnmounted(() => {
// Clean up WebGL context if needed
});
</script>---
Issue 4: OGL Components Not Working
Symptoms:
- OGL-based components (Fluid Cursor, Liquid Background) not displaying
- Shader compilation errors
- WebGL context issues
Solution: 1. Install OGL: bun add ogl 2. Ensure WebGL support in browser 3. Wrap in <ClientOnly> for SSR 4. Check for shader compilation errors in console 5. Verify proper disposal of resources
Debug:
// Check WebGL support
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2') || canvas.getContext('webgl');
console.log('WebGL supported:', !!gl);---
Issue 5: Props Type Errors
Symptoms:
- TypeScript errors with component props
- Runtime type mismatches
- Default values not applied
Solution: 1. Use interface-based props, not object syntax 2. Use withDefaults() for default values 3. Ensure explicit imports for types 4. Check props are correctly typed in parent component
Correct Pattern:
<script setup lang="ts">
// DO THIS
interface Props {
title: string;
count?: number;
}
const props = withDefaults(defineProps<Props>(), {
count: 0,
});
// DON'T DO THIS
// const props = defineProps({
// title: { type: String, required: true },
// });
</script>---
Issue 6: Icons Not Showing
Symptoms:
- Icon components render empty
- Missing icon SVGs
- Icon library not found
Solution: 1. Install Iconify Vue: Follow Iconify guide 2. Or replace <Icon> with your preferred icon library 3. Or use SVG icons directly 4. Check icon name format (e.g., "mdi:home")
Alternative:
<!-- Direct SVG -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="..." />
</svg>
<!-- Or use another library -->
<LucideIcon name="home" />---
Issue 7: CSS Variables Not Applied
Symptoms:
- Colors or sizing not working as expected
- Default browser styles showing
- Dark mode not switching
Solution: 1. Verify :root CSS variables are defined 2. Check .dark variants are set up 3. Ensure @theme inline block includes all variables 4. Use var(--variable-name) syntax or Tailwind classes 5. Check for typos in variable names
Debug:
// In browser console
getComputedStyle(document.documentElement).getPropertyValue('--background');---
Issue 8: Component Dependencies Missing
Symptoms:
- Component imports failing
- Features not working
- Runtime errors about missing modules
Solution: 1. Check component documentation for specific dependencies 2. Install required packages (Three.js, OGL, GSAP, etc.) 3. Verify peer dependencies are satisfied 4. Check for component-specific setup requirements 5. See components-list.md for dependency matrix
Common Dependencies:
# 3D components
bun add three @types/three
# WebGL shaders
bun add ogl
# Advanced animations
bun add gsap
# Confetti
bun add canvas-confetti---
Issue 9: Accessibility Bug - Destructive Colors
Symptoms:
- Text on destructive backgrounds is invisible
- Poor contrast on error states
- Red text on red background
Root Cause: Original Inspira UI docs set --destructive-foreground to same color as --destructive.
Solution: Use the corrected CSS variables from this skill:
:root {
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.985 0 0); /* CORRECTED - was same as destructive */
}
.dark {
--destructive: oklch(0.396 0.141 25.723);
--destructive-foreground: oklch(0.637 0.237 25.331);
}---
Issue 10: SSR/Hydration Mismatches (Nuxt)
Symptoms:
- Hydration warnings in console
- Content flashing or jumping
- Different rendering on server vs client
Solution: 1. Wrap browser-only components in <ClientOnly> 2. Check for window or document access in setup 3. Use onMounted for browser-specific code 4. Verify no random values in SSR
Pattern:
<template>
<ClientOnly>
<FluidCursor />
<template #fallback>
<!-- Optional placeholder during SSR -->
<div class="cursor-placeholder" />
</template>
</ClientOnly>
</template>---
Issue 11: Animation Performance Issues
Symptoms:
- Choppy animations
- High CPU/GPU usage
- Frame drops
Solution: 1. Use transform and opacity for animations (GPU-accelerated) 2. Avoid animating width, height, top, left 3. Reduce particle counts for particle effects 4. Implement proper cleanup for WebGL resources 5. Use will-change sparingly
Performance Pattern:
<script setup lang="ts">
import { onUnmounted } from "vue";
// Store references for cleanup
let animationFrame: number;
let renderer: any;
onUnmounted(() => {
if (animationFrame) cancelAnimationFrame(animationFrame);
if (renderer) renderer.dispose();
});
</script>---
Issue 12: Build/Bundle Size Issues
Symptoms:
- Large bundle size
- Slow builds
- Tree-shaking not working
Solution: 1. Only copy components you need 2. Import specific utilities, not entire libraries 3. Check for duplicate dependencies 4. Use dynamic imports for heavy components
Optimized Import:
// Specific imports (smaller bundle)
import { useWindowSize } from "@vueuse/core";
// Not entire library
// import * as VueUse from "@vueuse/core";---
Issue 13: Nuxt Auto-Import Conflicts
Symptoms:
- Duplicate identifier errors
- Vue composables not working
- Import conflicts
Solution: 1. Add explicit imports even with auto-imports enabled 2. Check nuxt.config for auto-import settings 3. Verify no naming conflicts with local composables
Safe Pattern:
<script setup lang="ts">
// Always include explicit imports for compatibility
import { ref, onMounted, computed } from "vue";
import { useWindowSize } from "@vueuse/core";
</script>---
Quick Diagnostic Commands
# Check package versions
bun pm ls | grep -E "tailwind|motion|three|ogl"
# Verify CSS imports
grep -r "@import" src/assets/
# Check for missing dependencies
bun install --dry-run
# Run setup verification
./scripts/verify-setup.sh---
Getting More Help
- Official Docs: https://inspira-ui.com/docs
- GitHub Issues: https://github.com/unovue/inspira-ui/issues
- Discord Community: https://discord.gg/Xbh5DwJRc9
- Component Gallery: https://inspira-ui.com/components
---
Last Updated: 2025-11-12
#!/bin/bash
# Inspira UI Setup Script
# Automates the installation and configuration of Inspira UI dependencies
set -e
echo "🎨 Inspira UI Setup Script"
echo "=========================="
echo ""
# Detect package manager
if command -v bun &> /dev/null; then
PM="bun"
ADD_CMD="bun add"
ADD_DEV_CMD="bun add -d"
echo "✅ Detected: Bun"
elif command -v pnpm &> /dev/null; then
PM="pnpm"
ADD_CMD="pnpm add"
ADD_DEV_CMD="pnpm add -D"
echo "✅ Detected: pnpm"
elif command -v npm &> /dev/null; then
PM="npm"
ADD_CMD="npm install"
ADD_DEV_CMD="npm install -D"
echo "✅ Detected: npm"
else
echo "❌ No package manager found. Please install bun, npm, or pnpm."
exit 1
fi
echo ""
# Check for existing TailwindCSS
if [ -f "tailwind.config.js" ] || [ -f "tailwind.config.ts" ]; then
echo "✅ TailwindCSS config detected"
else
echo "⚠️ No TailwindCSS config found. Make sure to install TailwindCSS v4+"
echo " Visit: https://tailwindcss.com/docs/installation"
fi
echo ""
echo "📦 Installing core dependencies..."
$ADD_DEV_CMD clsx tailwind-merge class-variance-authority tw-animate-css
echo ""
echo "📦 Installing animation dependencies..."
$ADD_CMD @vueuse/core motion-v
echo ""
read -p "Install Three.js? (for 3D components) [y/N]: " install_three
if [[ $install_three =~ ^[Yy]$ ]]; then
echo "📦 Installing Three.js..."
$ADD_CMD three @types/three
fi
echo ""
read -p "Install OGL? (for WebGL components) [y/N]: " install_ogl
if [[ $install_ogl =~ ^[Yy]$ ]]; then
echo "📦 Installing OGL..."
$ADD_CMD ogl
fi
echo ""
read -p "Install GSAP? (for advanced animations) [y/N]: " install_gsap
if [[ $install_gsap =~ ^[Yy]$ ]]; then
echo "📦 Installing GSAP..."
$ADD_CMD gsap
fi
echo ""
echo "✅ Dependencies installed!"
echo ""
# Create utils directory if it doesn't exist
if [ ! -d "lib" ] && [ ! -d "utils" ]; then
echo "📁 Creating lib directory..."
mkdir -p lib
UTILS_DIR="lib"
elif [ -d "lib" ]; then
UTILS_DIR="lib"
else
UTILS_DIR="utils"
fi
# Create cn utility if it doesn't exist
if [ ! -f "$UTILS_DIR/utils.ts" ]; then
echo "📝 Creating cn utility at $UTILS_DIR/utils.ts..."
cat > "$UTILS_DIR/utils.ts" << 'EOF'
import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
export type ObjectValues<T> = T[keyof T];
EOF
echo "✅ Created $UTILS_DIR/utils.ts"
else
echo "✅ Utils file already exists at $UTILS_DIR/utils.ts"
fi
echo ""
echo "📝 Next steps:"
echo "1. Add CSS variables to your main.css (see SKILL.md for complete setup)"
echo "2. Follow motion-v setup guide: https://motion.dev/docs/vue"
echo "3. Browse components at: https://inspira-ui.com/components"
echo "4. Copy and paste components into your project"
echo ""
echo "🎉 Setup complete! Start building with Inspira UI!"
#!/bin/bash
# Inspira UI Setup Verification Script
# Verifies that all required dependencies and configurations are in place
set -e
echo "🔍 Inspira UI Setup Verification"
echo "================================="
echo ""
# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
ERRORS=0
WARNINGS=0
# Function to check if a package exists in package.json
check_package() {
local pkg=$1
local required=$2
if [ -f "package.json" ]; then
if grep -q "\"$pkg\"" package.json 2>/dev/null; then
echo -e "${GREEN}✅ $pkg${NC}"
return 0
else
if [ "$required" = "required" ]; then
echo -e "${RED}❌ $pkg (MISSING - required)${NC}"
((ERRORS++))
else
echo -e "${YELLOW}⚠️ $pkg (not installed - optional)${NC}"
((WARNINGS++))
fi
return 1
fi
else
echo -e "${RED}❌ package.json not found${NC}"
((ERRORS++))
return 1
fi
}
# Function to check if a file contains a string
check_file_contains() {
local file=$1
local pattern=$2
local description=$3
local required=$4
if [ -f "$file" ]; then
if grep -q "$pattern" "$file" 2>/dev/null; then
echo -e "${GREEN}✅ $description${NC}"
return 0
else
if [ "$required" = "required" ]; then
echo -e "${RED}❌ $description (MISSING in $file)${NC}"
((ERRORS++))
else
echo -e "${YELLOW}⚠️ $description (not found in $file)${NC}"
((WARNINGS++))
fi
return 1
fi
else
echo -e "${YELLOW}⚠️ $file not found${NC}"
((WARNINGS++))
return 1
fi
}
echo "📦 Checking Core Dependencies..."
echo "--------------------------------"
check_package "clsx" "required"
check_package "tailwind-merge" "required"
check_package "class-variance-authority" "required"
check_package "tw-animate-css" "required"
check_package "@vueuse/core" "required"
check_package "motion-v" "required"
echo ""
echo "📦 Checking Optional Dependencies..."
echo "-------------------------------------"
check_package "three" "optional"
check_package "@types/three" "optional"
check_package "ogl" "optional"
check_package "gsap" "optional"
check_package "canvas-confetti" "optional"
echo ""
echo "🎨 Checking CSS Configuration..."
echo "---------------------------------"
# Find CSS files
CSS_FILES=""
for pattern in "src/assets/main.css" "assets/main.css" "src/styles/main.css" "styles/main.css" "app.css" "src/app.css"; do
if [ -f "$pattern" ]; then
CSS_FILES="$pattern"
break
fi
done
if [ -z "$CSS_FILES" ]; then
# Try to find any CSS file with tailwind import
CSS_FILES=$(find . -name "*.css" -path "./src/*" -o -name "*.css" -path "./assets/*" 2>/dev/null | head -1)
fi
if [ -n "$CSS_FILES" ]; then
echo "Found CSS file: $CSS_FILES"
check_file_contains "$CSS_FILES" '@import "tailwindcss"' "TailwindCSS import" "required"
check_file_contains "$CSS_FILES" '@import "tw-animate-css"' "tw-animate-css import" "required"
check_file_contains "$CSS_FILES" "var(--background)" "CSS variables (--background)" "required"
check_file_contains "$CSS_FILES" "var(--foreground)" "CSS variables (--foreground)" "required"
check_file_contains "$CSS_FILES" "@theme inline" "@theme inline block" "required"
check_file_contains "$CSS_FILES" "--destructive-foreground" "Destructive foreground variable" "required"
else
echo -e "${YELLOW}⚠️ No main CSS file found. Create one in src/assets/main.css or similar.${NC}"
((WARNINGS++))
fi
echo ""
echo "🛠️ Checking CN Utility..."
echo "---------------------------"
# Find utils file
UTILS_FILES=""
for pattern in "lib/utils.ts" "src/lib/utils.ts" "utils/index.ts" "src/utils/index.ts"; do
if [ -f "$pattern" ]; then
UTILS_FILES="$pattern"
break
fi
done
if [ -n "$UTILS_FILES" ]; then
echo "Found utils file: $UTILS_FILES"
check_file_contains "$UTILS_FILES" "export function cn" "cn() utility function" "required"
check_file_contains "$UTILS_FILES" "twMerge" "tailwind-merge usage" "required"
check_file_contains "$UTILS_FILES" "clsx" "clsx usage" "required"
else
echo -e "${RED}❌ CN utility file not found. Create lib/utils.ts${NC}"
((ERRORS++))
fi
echo ""
echo "📁 Checking Project Structure..."
echo "---------------------------------"
if [ -d "components/ui" ] || [ -d "src/components/ui" ]; then
echo -e "${GREEN}✅ components/ui directory exists${NC}"
else
echo -e "${YELLOW}⚠️ components/ui directory not found (create when copying components)${NC}"
((WARNINGS++))
fi
if [ -f "tsconfig.json" ]; then
echo -e "${GREEN}✅ TypeScript configured${NC}"
else
echo -e "${YELLOW}⚠️ tsconfig.json not found (TypeScript recommended)${NC}"
((WARNINGS++))
fi
# Check for Vue or Nuxt
if [ -f "nuxt.config.ts" ] || [ -f "nuxt.config.js" ]; then
echo -e "${GREEN}✅ Nuxt project detected${NC}"
elif grep -q '"vue"' package.json 2>/dev/null; then
echo -e "${GREEN}✅ Vue project detected${NC}"
else
echo -e "${YELLOW}⚠️ Neither Vue nor Nuxt detected in package.json${NC}"
((WARNINGS++))
fi
echo ""
echo "📊 Verification Summary"
echo "======================="
if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then
echo -e "${GREEN}🎉 All checks passed! Your Inspira UI setup is complete.${NC}"
echo ""
echo "Next steps:"
echo "1. Browse components at https://inspira-ui.com/components"
echo "2. Copy components into your components/ui/ directory"
echo "3. Import and use in your pages/components"
elif [ $ERRORS -eq 0 ]; then
echo -e "${YELLOW}⚠️ Setup mostly complete with $WARNINGS warning(s).${NC}"
echo ""
echo "Warnings are optional dependencies or non-critical configurations."
echo "Your project should work fine, but consider addressing the warnings."
else
echo -e "${RED}❌ Setup incomplete with $ERRORS error(s) and $WARNINGS warning(s).${NC}"
echo ""
echo "Please fix the errors above before using Inspira UI components."
echo "Refer to references/SETUP.md for complete setup instructions."
exit 1
fi
echo ""
echo "For detailed setup instructions: references/SETUP.md"
echo "For troubleshooting: references/TROUBLESHOOTING.md"
echo ""
exit 0
Related skills
How it compares
Choose inspira-ui over React Magic UI skills when the stack is Vue or Nuxt and you need Aceternity-style motion with TailwindCSS v4 setup guidance.
FAQ
Is inspira-ui an npm component library?
inspira-ui documents Inspira UI as 120+ copy-paste Vue and Nuxt components, not a traditional npm package. Developers browse the gallery, copy source, and adapt components inside their own projects.
Which dependencies does inspira-ui require?
inspira-ui lists clsx, tailwind-merge, class-variance-authority, tw-animate-css, @vueuse/core, and motion-v as core installs, with optional three, @types/three, and ogl for 3D or WebGL components.
What frameworks does inspira-ui target?
inspira-ui targets Vue 3 and Nuxt 4 projects using TailwindCSS v4 OkLch theming, Composition API script setup, and TypeScript-friendly Inspira UI component patterns.