UNPKG

bespoke

Version:
77 lines (62 loc) 2.25 kB
var from = function(opts, plugins) { var parent = (opts.parent || opts).nodeType === 1 ? (opts.parent || opts) : document.querySelector(opts.parent || opts), slides = [].filter.call(typeof opts.slides === 'string' ? parent.querySelectorAll(opts.slides) : (opts.slides || parent.children), function(el) { return el.nodeName !== 'SCRIPT'; }), activeSlide = slides[0], listeners = {}, activate = function(index, customData) { if (!slides[index]) { return; } fire('deactivate', createEventData(activeSlide, customData)); activeSlide = slides[index]; fire('activate', createEventData(activeSlide, customData)); }, slide = function(index, customData) { if (arguments.length) { fire('slide', createEventData(slides[index], customData)) && activate(index, customData); } else { return slides.indexOf(activeSlide); } }, step = function(offset, customData) { var slideIndex = slides.indexOf(activeSlide) + offset; fire(offset > 0 ? 'next' : 'prev', createEventData(activeSlide, customData)) && activate(slideIndex, customData); }, on = function(eventName, callback) { (listeners[eventName] || (listeners[eventName] = [])).push(callback); return off.bind(null, eventName, callback); }, off = function(eventName, callback) { listeners[eventName] = (listeners[eventName] || []).filter(function(listener) { return listener !== callback; }); }, fire = function(eventName, eventData) { return (listeners[eventName] || []) .reduce(function(notCancelled, callback) { return notCancelled && callback(eventData) !== false; }, true); }, createEventData = function(el, eventData) { eventData = eventData || {}; eventData.index = slides.indexOf(el); eventData.slide = el; return eventData; }, deck = { on: on, off: off, fire: fire, slide: slide, next: step.bind(null, 1), prev: step.bind(null, -1), parent: parent, slides: slides }; (plugins || []).forEach(function(plugin) { plugin(deck); }); activate(0); return deck; }; module.exports = { from: from };