import Point from './point'; import Classes from './classes'; let id = 0; class ShuffleItem { constructor(element) { id += 1; this.id = id; this.element = element; /** * Used to separate items for layout and shrink. */ this.isVisible = true; /** * Used to determine if a transition will happen. By the time the _layout * and _shrink methods get the ShuffleItem instances, the `isVisible` value * has already been changed by the separation methods, so this property is * needed to know if the item was visible/hidden before the shrink/layout. */ this.isHidden = false; } show() { this.isVisible = true; this.element.classList.remove(Classes.HIDDEN); this.element.classList.add(Classes.VISIBLE); this.element.removeAttribute('aria-hidden'); } hide() { this.isVisible = false; this.element.classList.remove(Classes.VISIBLE); this.element.classList.add(Classes.HIDDEN); this.element.setAttribute('aria-hidden', true); } init() { this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]); this.applyCss(ShuffleItem.Css.INITIAL); this.scale = ShuffleItem.Scale.VISIBLE; this.point = new Point(); } addClasses(classes) { classes.forEach((className) => { this.element.classList.add(className); }); } removeClasses(classes) { classes.forEach((className) => { this.element.classList.remove(className); }); } applyCss(obj) { Object.keys(obj).forEach((key) => { this.element.style[key] = obj[key]; }); } dispose() { this.removeClasses([ Classes.HIDDEN, Classes.VISIBLE, Classes.SHUFFLE_ITEM, ]); this.element.removeAttribute('style'); this.element = null; } } ShuffleItem.Css = { INITIAL: { position: 'absolute', top: 0, left: 0, visibility: 'visible', 'will-change': 'transform', }, VISIBLE: { before: { opacity: 1, visibility: 'visible', }, after: { transitionDelay: '', }, }, HIDDEN: { before: { opacity: 0, }, after: { visibility: 'hidden', transitionDelay: '', }, }, }; ShuffleItem.Scale = { VISIBLE: 1, HIDDEN: 0.001, }; export default ShuffleItem;