{"_id":"@aivue/360-spin","_rev":"5-6d47415f14cc9461eaf792b23a56f50c","name":"@aivue/360-spin","dist-tags":{"latest":"2.0.1"},"versions":{"1.0.1":{"name":"@aivue/360-spin","version":"1.0.1","keywords":["vue","360","spin","product","image","rotation","3d","viewer","ecommerce","product-view","interactive","ui","components"],"author":{"name":"reachbrt"},"license":"MIT","_id":"@aivue/360-spin@1.0.1","maintainers":[{"name":"aivue","email":"reachbrt@gmail.com"}],"homepage":"https://github.com/reachbrt/vueai#readme","bugs":{"url":"https://github.com/reachbrt/vueai/issues"},"dist":{"shasum":"21d45cc3c201507bf537483bd1e85a91de00ccf6","tarball":"https://registry.npmjs.org/@aivue/360-spin/-/360-spin-1.0.1.tgz","fileCount":13,"integrity":"sha512-St88AqWVZW9t91N2Mm0sLAyRAo+mqObkAQpkYOKoVkpdwmZrJc/+GNmwK8B9APZ5djHuSpHSMRMpEOifJA4tXw==","signatures":[{"sig":"MEQCIGi/R7ag2NC3ncmqi1swAu418TsgtEFOaDNBzjdt6VN2AiADEMRovbsybhE2pVDZGGUM3w+LxIUcRb1qOcJVgF4ToA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79758},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./360-spin.css":"./dist/360-spin.css","./dist/360-spin.css":"./dist/360-spin.css"},"gitHead":"2c1375e259fc33f94a09503be06d9c1b0d3106a7","scripts":{"dev":"vite build --watch","build":"npm run clean && vite build","clean":"rm -rf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"aivue","email":"reachbrt@gmail.com"},"repository":{"url":"git+https://github.com/reachbrt/vueai.git","type":"git","directory":"packages/360-spin"},"_npmVersion":"10.9.2","description":"Interactive 360-degree product image spin component for Vue.js","directories":{},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.3.5","vue-tsc":"^2.2.10","typescript":"^5.3.0","@types/node":"^20.16.0","vite-plugin-dts":"^4.5.3","@vue/compiler-sfc":"^3.5.13","@vitejs/plugin-vue":"^5.0.0"},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/360-spin_1.0.1_1765053743877_0.5951699759862923","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aivue/360-spin","version":"1.0.2","keywords":["vue","360","spin","product","image","rotation","3d","viewer","ecommerce","product-view","interactive","ui","components"],"author":{"name":"reachbrt"},"license":"MIT","_id":"@aivue/360-spin@1.0.2","maintainers":[{"name":"aivue","email":"reachbrt@gmail.com"}],"homepage":"https://github.com/reachbrt/vueai#readme","bugs":{"url":"https://github.com/reachbrt/vueai/issues"},"dist":{"shasum":"bbae4da88ef25d402d5389ffe2072ae1c539fbcc","tarball":"https://registry.npmjs.org/@aivue/360-spin/-/360-spin-1.0.2.tgz","fileCount":13,"integrity":"sha512-oooyCdP15ozxO1XCTNmVB5fJAdhX6cmEkAf2QIloqE3WM99BoUMuTwoiVWWljEtP8+zee/owNv9USkG3ghi5jg==","signatures":[{"sig":"MEQCIFpbAcTGpW4cMR/WwRyxQXj4GZHFesaLlNOE06kwFBGyAiAyVA6qzvTNIpQtcdYBj3TNBDYGmJrrmGNB7jKXQC/Z5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80054},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./360-spin.css":"./dist/360-spin.css","./dist/360-spin.css":"./dist/360-spin.css"},"gitHead":"2c1375e259fc33f94a09503be06d9c1b0d3106a7","scripts":{"dev":"vite build --watch","build":"npm run clean && vite build","clean":"rm -rf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"aivue","email":"reachbrt@gmail.com"},"repository":{"url":"git+https://github.com/reachbrt/vueai.git","type":"git","directory":"packages/360-spin"},"_npmVersion":"10.9.2","description":"Interactive 360-degree product image spin component for Vue.js","directories":{},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.3.5","vue-tsc":"^2.2.10","typescript":"^5.3.0","@types/node":"^20.16.0","vite-plugin-dts":"^4.5.3","@vue/compiler-sfc":"^3.5.13","@vitejs/plugin-vue":"^5.0.0"},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/360-spin_1.0.2_1765248661275_0.17871369798111703","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@aivue/360-spin","version":"1.0.3","keywords":["vue","360","spin","product","image","rotation","3d","viewer","ecommerce","product-view","interactive","ui","components"],"author":{"name":"reachbrt"},"license":"MIT","_id":"@aivue/360-spin@1.0.3","maintainers":[{"name":"aivue","email":"reachbrt@gmail.com"}],"homepage":"https://github.com/reachbrt/vueai#readme","bugs":{"url":"https://github.com/reachbrt/vueai/issues"},"dist":{"shasum":"4d55e88426455e36cb05ad28b4e499a5c4493987","tarball":"https://registry.npmjs.org/@aivue/360-spin/-/360-spin-1.0.3.tgz","fileCount":13,"integrity":"sha512-efs8/3FqrKRjcdr4ZTSToDVm3sVH+CsDsBl0jQy3zJUin6DzyLe3DyewNGj0varCqTbeLL4LsDHeVpnPwhhRww==","signatures":[{"sig":"MEYCIQC0qtNQeQQEcr+ts90dwiDUFwqFW99WSNAYowclQNqa/AIhALtUeGx6vHA/mG+xzjLI4f750lYYF+LiVO2obu4vhCyl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80086},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./360-spin.css":"./dist/360-spin.css","./dist/360-spin.css":"./dist/360-spin.css"},"gitHead":"2567f0769c449fe4333ccc807a82444957dc0cd3","scripts":{"dev":"vite build --watch","build":"npm run clean && vite build","clean":"rm -rf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"aivue","email":"reachbrt@gmail.com"},"repository":{"url":"git+https://github.com/reachbrt/vueai.git","type":"git","directory":"packages/360-spin"},"_npmVersion":"10.9.2","description":"Interactive 360-degree product image spin component for Vue.js","directories":{},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.3.5","vue-tsc":"^2.2.10","typescript":"^5.3.0","@types/node":"^20.16.0","vite-plugin-dts":"^4.5.3","@vue/compiler-sfc":"^3.5.13","@vitejs/plugin-vue":"^5.0.0"},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/360-spin_1.0.3_1765265284179_0.6819875502100992","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@aivue/360-spin","version":"2.0.0","keywords":["vue","360","spin","product","image","rotation","3d","viewer","ecommerce","product-view","interactive","ui","components"],"author":{"name":"reachbrt"},"license":"MIT","_id":"@aivue/360-spin@2.0.0","maintainers":[{"name":"aivue","email":"reachbrt@gmail.com"}],"homepage":"https://github.com/reachbrt/vueai#readme","bugs":{"url":"https://github.com/reachbrt/vueai/issues"},"dist":{"shasum":"f010d58c679bf1e9e2d73786c46369916045cffe","tarball":"https://registry.npmjs.org/@aivue/360-spin/-/360-spin-2.0.0.tgz","fileCount":15,"integrity":"sha512-6RXO8C89tsniwLS7ijv7wWkqrdAk9KQccx/lZC8/8p5A0hFQyroh98ENMHcEUlGNqWBpw22xKYqfMBB2ZXeHYQ==","signatures":[{"sig":"MEUCIE7uGgfaedxJIDITTCIqFL04lPyey5hDgg2wgRENXLnwAiEAsrGhlLVnL/u27M+XATctQaNEAr7Qi74ht+DMB+jQTjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191785},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./360-spin.css":"./dist/360-spin.css","./dist/360-spin.css":"./dist/360-spin.css"},"scripts":{"dev":"vite build --watch","build":"npm run clean && vite build","clean":"rm -rf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"aivue","email":"reachbrt@gmail.com"},"repository":{"url":"git+https://github.com/reachbrt/vueai.git","type":"git","directory":"packages/360-spin"},"_npmVersion":"6.14.5","description":"Interactive 360-degree product image spin component for Vue.js with AI-powered generation","directories":{},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.3.5","vue-tsc":"^2.2.10","typescript":"^5.3.0","@types/node":"^20.16.0","vite-plugin-dts":"^4.5.3","@vue/compiler-sfc":"^3.5.13","@vitejs/plugin-vue":"^5.0.0"},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/360-spin_2.0.0_1765511594840_0.7330211430988887","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@aivue/360-spin","version":"2.0.1","description":"Interactive 360-degree product image spin component for Vue.js with AI-powered generation","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./360-spin.css":"./dist/360-spin.css","./dist/360-spin.css":"./dist/360-spin.css"},"scripts":{"build":"npm run clean && vite build","dev":"vite build --watch","clean":"rm -rf dist","prepublishOnly":"npm run build"},"keywords":["vue","360","spin","product","image","rotation","3d","viewer","ecommerce","product-view","interactive","ui","components"],"author":{"name":"reachbrt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/reachbrt/vueai.git","directory":"packages/360-spin"},"homepage":"https://github.com/reachbrt/vueai#readme","bugs":{"url":"https://github.com/reachbrt/vueai/issues"},"publishConfig":{"access":"public"},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@types/node":"^20.16.0","@vitejs/plugin-vue":"^5.0.0","@vue/compiler-sfc":"^3.5.13","typescript":"^5.3.0","vite":"^6.3.5","vite-plugin-dts":"^4.5.3","vue":"^3.5.0","vue-tsc":"^2.2.10"},"_id":"@aivue/360-spin@2.0.1","gitHead":"c54d7def7f2bad63a3e63881dd7ac15ba3e957a4","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-10FPUpQiRhvcNKQQZH4KbbNDL96SXiqj/fjnx++VO/M85AbagdJ/JNv3XUSVn1UaEgtLKE8Dto5RdlezeCozyw==","shasum":"dafac34034857ebc8ba69c91a98620f58b13da8f","tarball":"https://registry.npmjs.org/@aivue/360-spin/-/360-spin-2.0.1.tgz","fileCount":15,"unpackedSize":191785,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD7XuiglsQPU3J0BcgKXdWnOpD9e0GcRJEyuLB6XdrjDAIgX91mXpvLe2MqlO3SzDjk+R5dl5gEVPq6QEgeOhjF9+g="}]},"_npmUser":{"name":"aivue","email":"reachbrt@gmail.com"},"directories":{},"maintainers":[{"name":"aivue","email":"reachbrt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/360-spin_2.0.1_1768404863893_0.45868697913539025"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-06T20:42:23.807Z","modified":"2026-01-14T15:34:24.175Z","1.0.1":"2025-12-06T20:42:24.025Z","1.0.2":"2025-12-09T02:51:01.425Z","1.0.3":"2025-12-09T07:28:04.336Z","2.0.0":"2025-12-12T03:53:15.054Z","2.0.1":"2026-01-14T15:34:24.045Z"},"bugs":{"url":"https://github.com/reachbrt/vueai/issues"},"author":{"name":"reachbrt"},"license":"MIT","homepage":"https://github.com/reachbrt/vueai#readme","keywords":["vue","360","spin","product","image","rotation","3d","viewer","ecommerce","product-view","interactive","ui","components"],"repository":{"type":"git","url":"git+https://github.com/reachbrt/vueai.git","directory":"packages/360-spin"},"description":"Interactive 360-degree product image spin component for Vue.js with AI-powered generation","maintainers":[{"name":"aivue","email":"reachbrt@gmail.com"}],"readme":"# @aivue/360-spin\n\n> Interactive 360-degree product image spin component for Vue.js with AI-powered generation\n\n[![npm version](https://img.shields.io/npm/v/@aivue/360-spin.svg)](https://www.npmjs.com/package/@aivue/360-spin)\n[![npm downloads](https://img.shields.io/badge/downloads-0%2Fmonth-CB3837?style=flat-square&logo=npm)](https://www.npmjs.com/package/@aivue/360-spin)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## ✨ Features\n\n### 360° Viewer\n- 🖼️ **Static to Animated**: Show static product image by default, animate on hover/tap\n- 🎬 **Multiple Modes**: Support for GIF animations or frame sequences\n- 📱 **Mobile Optimized**: Touch and drag to spin on mobile devices\n- 🎯 **Flexible Triggers**: Hover, click, or auto-play animations\n- 🛍️ **E-commerce Ready**: Perfect for product cards, carousels, and search results\n- ⚡ **Performance**: Preloading and optimized frame rendering\n- 🎨 **Customizable**: Full control over styling and behavior\n- ♿ **Accessible**: Keyboard navigation and screen reader support\n\n### 🤖 AI 360° Generator (NEW!)\n- 📤 **Upload & Generate**: Upload a single product image and AI generates 360° views\n- 🎨 **OpenAI DALL-E 3**: High-quality AI-generated frames at different angles\n- 🔄 **Stability AI Support**: Alternative AI provider for generation\n- 🎯 **Customizable**: Choose frame count (12/24/36/72), background color, quality\n- 📊 **Real-time Progress**: Track generation progress with live updates\n- 💾 **Download Frames**: Export all generated frames for use elsewhere\n- 🔍 **Vision Analysis**: GPT-4 Vision analyzes your product for better results\n\n## 📦 Installation\n\n```bash\nnpm install @aivue/360-spin\n```\n\n## 🚀 Quick Start\n\n### Basic Usage (GIF Mode)\n\n```vue\n<template>\n  <Ai360Spin\n    static-image=\"/images/product-static.jpg\"\n    animated-image=\"/images/product-360.gif\"\n    alt=\"Product 360 view\"\n    width=\"400px\"\n    height=\"400px\"\n  />\n</template>\n\n<script setup>\nimport { Ai360Spin } from '@aivue/360-spin';\nimport '@aivue/360-spin/360-spin.css';\n</script>\n```\n\n### Frame Sequence Mode\n\n```vue\n<template>\n  <Ai360Spin\n    static-image=\"/images/product-static.jpg\"\n    :animated-image=\"frameUrls\"\n    mode=\"frames\"\n    :frame-rate=\"30\"\n    enable-drag-spin\n    alt=\"Product 360 view\"\n  />\n</template>\n\n<script setup>\nimport { Ai360Spin } from '@aivue/360-spin';\nimport '@aivue/360-spin/360-spin.css';\n\nconst frameUrls = [\n  '/images/frame-001.jpg',\n  '/images/frame-002.jpg',\n  '/images/frame-003.jpg',\n  // ... more frames\n];\n</script>\n```\n\n### Product Card Integration\n\n```vue\n<template>\n  <div class=\"product-card\">\n    <Ai360Spin\n      :static-image=\"product.image\"\n      :animated-image=\"product.spin360\"\n      container-class=\"ai-360-spin--card\"\n      :alt=\"product.name\"\n      trigger=\"hover\"\n    />\n    <h3>{{ product.name }}</h3>\n    <p>{{ product.price }}</p>\n  </div>\n</template>\n```\n\n### 🤖 AI 360° Generator\n\nGenerate 360-degree product views from a single image using AI:\n\n```vue\n<template>\n  <Ai360Generator\n    provider=\"openai\"\n    api-key=\"your-openai-api-key\"\n    :auto-save-api-key=\"true\"\n    :show-frame-preview=\"true\"\n    @frames-generated=\"handleFramesGenerated\"\n    @generation-complete=\"handleComplete\"\n  />\n</template>\n\n<script setup>\nimport { Ai360Generator } from '@aivue/360-spin';\nimport '@aivue/360-spin/360-spin.css';\n\nfunction handleFramesGenerated(frames) {\n  console.log('Generated frames:', frames);\n  // Use frames with Ai360Spin component\n}\n\nfunction handleComplete(frames) {\n  console.log('Generation complete!', frames.length, 'frames');\n}\n</script>\n```\n\n### Programmatic AI Generation\n\nUse the AI generator utility directly:\n\n```typescript\nimport { AI360Generator } from '@aivue/360-spin';\n\nconst generator = new AI360Generator(\n  {\n    provider: 'openai',\n    apiKey: 'your-api-key',\n    frameCount: 36,\n    backgroundColor: 'white',\n    quality: 80,\n    useVisionAnalysis: true\n  },\n  (progress) => {\n    console.log(`Progress: ${progress.percentage}%`);\n    console.log(`Status: ${progress.status}`);\n    console.log(`Frame ${progress.currentFrame}/${progress.totalFrames}`);\n  }\n);\n\n// Generate from File\nconst file = document.querySelector('input[type=\"file\"]').files[0];\nconst result = await generator.generate(file);\nconsole.log('Generated frames:', result.frames);\nconsole.log('Product description:', result.productDescription);\n\n// Or generate from base64 image\nconst base64Image = 'data:image/jpeg;base64,...';\nconst result = await generator.generate(base64Image);\n```\n\n## 📖 API Reference\n\n### Ai360Spin Component\n\n#### Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `staticImage` | `string` | **required** | URL of the static product image |\n| `animatedImage` | `string \\| string[]` | **required** | GIF URL or array of frame URLs |\n| `mode` | `'gif' \\| 'frames' \\| 'auto'` | `'auto'` | Animation mode |\n| `trigger` | `'hover' \\| 'click' \\| 'auto'` | `'hover'` | How to start animation |\n| `width` | `string \\| number` | `'100%'` | Container width |\n| `height` | `string \\| number` | `'auto'` | Container height |\n| `alt` | `string` | `'Product 360 view'` | Alt text for images |\n| `frameRate` | `number` | `30` | FPS for frame sequence |\n| `loop` | `boolean` | `true` | Whether to loop animation |\n| `direction` | `'clockwise' \\| 'counterclockwise'` | `'clockwise'` | Spin direction |\n| `preload` | `boolean` | `true` | Preload images on mount |\n| `showLoading` | `boolean` | `true` | Show loading indicator |\n| `loadingText` | `string` | `'Loading...'` | Loading text |\n| `enableDragSpin` | `boolean` | `true` | Enable drag to spin on mobile |\n| `dragSensitivity` | `number` | `10` | Pixels per frame for drag |\n| `containerClass` | `string` | `''` | CSS class for container |\n| `imageClass` | `string` | `''` | CSS class for images |\n\n#### Events\n\n| Event | Payload | Description |\n|-------|---------|-------------|\n| `animation-start` | `void` | Fired when animation starts |\n| `animation-end` | `void` | Fired when animation ends |\n| `loaded` | `void` | Fired when images are loaded |\n| `error` | `Error` | Fired on loading error |\n| `frame-change` | `number` | Fired when frame changes (frames mode) |\n\n### Ai360Generator Component\n\n#### Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `provider` | `'openai' \\| 'stability'` | `'openai'` | AI provider for generation |\n| `apiKey` | `string` | `''` | API key (can be saved in localStorage) |\n| `autoSaveApiKey` | `boolean` | `true` | Auto-save API key to localStorage |\n| `showFramePreview` | `boolean` | `true` | Show preview grid of generated frames |\n\n#### Events\n\n| Event | Payload | Description |\n|-------|---------|-------------|\n| `frames-generated` | `string[]` | Emitted when user clicks \"Use These Frames\" |\n| `generation-start` | `void` | Emitted when generation starts |\n| `generation-complete` | `string[]` | Emitted when generation completes |\n| `generation-error` | `Error` | Emitted on generation error |\n\n### AI360Generator Class\n\n#### Constructor Options\n\n```typescript\ninterface AI360GeneratorConfig {\n  provider?: 'openai' | 'stability';\n  apiKey: string;\n  frameCount?: number; // Default: 36\n  backgroundColor?: 'white' | 'transparent' | 'black' | 'custom';\n  customBackgroundColor?: string;\n  quality?: number; // 0-100, Default: 80\n  imageSize?: '1024x1024' | '1024x1792' | '1792x1024';\n  model?: string; // Default: 'dall-e-3' for OpenAI\n  useVisionAnalysis?: boolean; // Default: true\n  promptTemplate?: string; // Custom prompt template\n}\n```\n\n#### Methods\n\n- `generate(imageFile: File | string): Promise<AI360GenerationResult>`\n  - Generates 360° frames from a single image\n  - Returns frames, product description, and metadata\n\n## 🎨 Styling\n\nThe component comes with default styles, but you can customize them:\n\n```css\n/* Custom container styles */\n.ai-360-spin {\n  border-radius: 12px;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n/* Custom loading spinner */\n.ai-360-spin__spinner {\n  border-top-color: #your-brand-color;\n}\n\n/* Custom hint badge */\n.ai-360-spin__hint {\n  background: rgba(your-color, 0.9);\n}\n```\n\n### Pre-built Classes\n\n- `.ai-360-spin--card` - Optimized for product cards (1:1 aspect ratio)\n- `.ai-360-spin--grid` - Optimized for grid layouts (4:3 aspect ratio)\n- `.ai-360-spin--carousel` - Optimized for carousels (full width/height)\n\n## 💡 Use Cases\n\n### E-commerce Product Listings\n\n```vue\n<div class=\"product-grid\">\n  <div v-for=\"product in products\" :key=\"product.id\" class=\"product-item\">\n    <Ai360Spin\n      :static-image=\"product.thumbnail\"\n      :animated-image=\"product.spin360Gif\"\n      container-class=\"ai-360-spin--grid\"\n      :alt=\"product.name\"\n    />\n  </div>\n</div>\n```\n\n### Product Detail Page\n\n```vue\n<Ai360Spin\n  :static-image=\"product.mainImage\"\n  :animated-image=\"product.frames\"\n  mode=\"frames\"\n  :frame-rate=\"60\"\n  enable-drag-spin\n  width=\"600px\"\n  height=\"600px\"\n  trigger=\"click\"\n/>\n```\n\n### Carousel Integration\n\n```vue\n<div class=\"carousel\">\n  <div v-for=\"item in carouselItems\" :key=\"item.id\" class=\"carousel-slide\">\n    <Ai360Spin\n      :static-image=\"item.image\"\n      :animated-image=\"item.spin\"\n      container-class=\"ai-360-spin--carousel\"\n      trigger=\"hover\"\n    />\n  </div>\n</div>\n```\n\n## 🔧 Advanced Usage\n\n### Using the Composable\n\n```vue\n<script setup>\nimport { use360Spin } from '@aivue/360-spin';\n\nconst config = {\n  staticImage: '/product.jpg',\n  animatedImage: frameUrls,\n  mode: 'frames',\n  frameRate: 30\n};\n\nconst {\n  isAnimating,\n  isLoading,\n  currentFrameIndex,\n  startAnimation,\n  stopAnimation,\n  preloadImages\n} = use360Spin(config, emit);\n\n// Manually control animation\nfunction handleCustomTrigger() {\n  if (isAnimating.value) {\n    stopAnimation();\n  } else {\n    startAnimation();\n  }\n}\n</script>\n```\n\n### Programmatic Control\n\n```vue\n<template>\n  <div>\n    <Ai360Spin\n      ref=\"spinRef\"\n      :static-image=\"staticImg\"\n      :animated-image=\"frames\"\n      trigger=\"click\"\n      @animation-start=\"onStart\"\n      @animation-end=\"onEnd\"\n      @frame-change=\"onFrameChange\"\n    />\n    <button @click=\"toggleSpin\">Toggle Spin</button>\n  </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\nimport { Ai360Spin } from '@aivue/360-spin';\n\nconst spinRef = ref(null);\n\nfunction onStart() {\n  console.log('Animation started');\n}\n\nfunction onEnd() {\n  console.log('Animation ended');\n}\n\nfunction onFrameChange(frameIndex) {\n  console.log('Current frame:', frameIndex);\n}\n</script>\n```\n\n## 📱 Mobile Optimization\n\nThe component automatically optimizes for mobile devices:\n\n- **Touch Events**: Drag to spin through frames\n- **Performance**: Optimized rendering for mobile browsers\n- **Responsive**: Adapts to different screen sizes\n- **Touch Feedback**: Visual feedback for touch interactions\n\n## 🎯 Best Practices\n\n### Frame Sequence Tips\n\n1. **Frame Count**: Use 24-36 frames for smooth rotation\n2. **Image Size**: Optimize images (WebP format recommended)\n3. **Naming**: Use sequential naming (frame-001.jpg, frame-002.jpg, etc.)\n4. **Preloading**: Enable preloading for better UX\n\n### Performance Optimization\n\n```vue\n<Ai360Spin\n  :static-image=\"product.thumbnail\"\n  :animated-image=\"product.frames\"\n  :preload=\"true\"\n  :frame-rate=\"24\"\n  loading-image=\"/placeholder.jpg\"\n/>\n```\n\n### Accessibility\n\n```vue\n<Ai360Spin\n  :static-image=\"product.image\"\n  :animated-image=\"product.spin\"\n  :alt=\"`360-degree view of ${product.name}`\"\n  role=\"img\"\n  aria-label=\"Interactive product view\"\n/>\n```\n\n## 🌐 Browser Support\n\n- Chrome/Edge (latest)\n- Firefox (latest)\n- Safari (latest)\n- Mobile browsers (iOS Safari, Chrome Mobile)\n\n## 📄 License\n\nMIT © [reachbrt](https://github.com/reachbrt)\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## 🔗 Links\n\n- [GitHub Repository](https://github.com/reachbrt/vueai)\n- [Demo](https://aivue.netlify.app)\n- [Report Issues](https://github.com/reachbrt/vueai/issues)\n\n## 📝 Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md) for details.\n\n---\n\nMade with ❤️ by [reachbrt](https://github.com/reachbrt)\n\n\n","readmeFilename":"README.md"}