UNPKG

scradar

Version:

CSS-first scroll interaction library with progress-based animations

201 lines (168 loc) 5.08 kB
import Scradar from '../../src/scradar.js'; // Global Scradar instance for Vue apps let globalScradar = null; let instanceCount = 0; // Cleanup function const cleanupGlobalInstance = () => { if (globalScradar && instanceCount === 0) { globalScradar.destroy(); globalScradar = null; } }; // Vue 3 Plugin export default { install(app, globalOptions = {}) { // Initialize global Scradar instance if (!globalScradar) { globalScradar = new Scradar(globalOptions); } instanceCount++; // Vue 3 directive app.directive('scradar', { mounted(el, binding) { const options = { ...globalOptions, ...binding.value }; // Apply configuration to element if (options && typeof options === 'object') { el.setAttribute('data-scradar', JSON.stringify(options)); } // Store reference for cleanup el.__scradar_config = options; // Update global instance if (globalScradar) { globalScradar.update(); } }, updated(el, binding) { const newOptions = { ...globalOptions, ...binding.value }; // Update configuration if changed if (JSON.stringify(el.__scradar_config) !== JSON.stringify(newOptions)) { el.__scradar_config = newOptions; el.setAttribute('data-scradar', JSON.stringify(newOptions)); if (globalScradar) { globalScradar.update(); } } }, unmounted(el) { // Remove data attribute el.removeAttribute('data-scradar'); delete el.__scradar_config; // Update global instance if (globalScradar) { globalScradar.update(); } } }); // Global properties app.config.globalProperties.$scradar = globalScradar; // Global configs method app.config.globalProperties.$scradarConfigs = (configs) => { Scradar.configs = { ...Scradar.configs, ...configs }; if (globalScradar) { globalScradar.update(); } }; // Cleanup method app.config.globalProperties.$scradarCleanup = () => { instanceCount--; cleanupGlobalInstance(); }; // Provide Scradar instance to components app.provide('scradar', globalScradar); app.provide('scradarConfigs', (configs) => { Scradar.configs = { ...Scradar.configs, ...configs }; if (globalScradar) { globalScradar.update(); } }); } }; // Vue 2 compatibility export const ScradarVue2 = { install(Vue, globalOptions = {}) { // Initialize global Scradar instance if (!globalScradar) { globalScradar = new Scradar(globalOptions); } instanceCount++; Vue.directive('scradar', { bind(el, binding) { const options = { ...globalOptions, ...binding.value }; if (options && typeof options === 'object') { el.setAttribute('data-scradar', JSON.stringify(options)); } el.__scradar_config = options; if (globalScradar) { globalScradar.update(); } }, update(el, binding) { const newOptions = { ...globalOptions, ...binding.value }; if (JSON.stringify(el.__scradar_config) !== JSON.stringify(newOptions)) { el.__scradar_config = newOptions; el.setAttribute('data-scradar', JSON.stringify(newOptions)); if (globalScradar) { globalScradar.update(); } } }, unbind(el) { el.removeAttribute('data-scradar'); delete el.__scradar_config; if (globalScradar) { globalScradar.update(); } } }); Vue.prototype.$scradar = globalScradar; Vue.prototype.$scradarConfigs = (configs) => { Scradar.configs = { ...Scradar.configs, ...configs }; if (globalScradar) { globalScradar.update(); } }; Vue.prototype.$scradarCleanup = () => { instanceCount--; cleanupGlobalInstance(); }; } }; // Composition API utilities for Vue 3 export function useScradar(options = {}) { return { instance: globalScradar, update: () => globalScradar?.update(), destroy: () => { instanceCount--; cleanupGlobalInstance(); } }; } export function useScradarConfigs(configs = {}) { Scradar.configs = { ...Scradar.configs, ...configs }; if (globalScradar) { globalScradar.update(); } return { update: (newConfigs) => { Scradar.configs = { ...Scradar.configs, ...newConfigs }; if (globalScradar) { globalScradar.update(); } } }; } // Utility functions export function setScradarConfigs(configs) { Scradar.configs = { ...Scradar.configs, ...configs }; if (globalScradar) { globalScradar.update(); } } export function cleanupScradar() { if (globalScradar) { globalScradar.destroy(); globalScradar = null; instanceCount = 0; } }