/** * Shopex OMS * * Copyright (c) 2025 Shopex (http://www.shopex.cn) * Licensed under Apache-2.0 with additional terms (See LICENSE file) */ /* --- script: Fx.Slide.js name: Fx.Slide description: Effect to slide an element in and out of view. license: MIT-style license authors: - Valerio Proietti requires: - Core/Fx - Core/Element.Style - MooTools.More provides: [Fx.Slide] ... */ Fx.Slide = new Class({ Extends: Fx, options: { mode: 'vertical', wrapper: false, hideOverflow: true, resetHeight: false }, initialize: function(element, options){ element = this.element = this.subject = document.id(element); this.parent(options); options = this.options; var wrapper = element.retrieve('wrapper'), styles = element.getStyles('margin', 'position', 'overflow'); if (options.hideOverflow) styles = Object.append(styles, {overflow: 'hidden'}); if (options.wrapper) wrapper = document.id(options.wrapper).setStyles(styles); if (!wrapper) wrapper = new Element('div', { styles: styles }).wraps(element); element.store('wrapper', wrapper).setStyle('margin', 0); if (element.getStyle('overflow') == 'visible') element.setStyle('overflow', 'hidden'); this.now = []; this.open = true; this.wrapper = wrapper; this.addEvent('complete', function(){ this.open = (wrapper['offset' + this.layout.capitalize()] != 0); if (this.open && this.options.resetHeight) wrapper.setStyle('height', ''); }, true); }, vertical: function(){ this.margin = 'margin-top'; this.layout = 'height'; this.offset = this.element.offsetHeight; }, horizontal: function(){ this.margin = 'margin-left'; this.layout = 'width'; this.offset = this.element.offsetWidth; }, set: function(now){ this.element.setStyle(this.margin, now[0]); this.wrapper.setStyle(this.layout, now[1]); return this; }, compute: function(from, to, delta){ return [0, 1].map(function(i){ return Fx.compute(from[i], to[i], delta); }); }, start: function(how, mode){ if (!this.check(how, mode)) return this; this[mode || this.options.mode](); var margin = this.element.getStyle(this.margin).toInt(), layout = this.wrapper.getStyle(this.layout).toInt(), caseIn = [[margin, layout], [0, this.offset]], caseOut = [[margin, layout], [-this.offset, 0]], start; switch (how){ case 'in': start = caseIn; break; case 'out': start = caseOut; break; case 'toggle': start = (layout == 0) ? caseIn : caseOut; } return this.parent(start[0], start[1]); }, slideIn: function(mode){ return this.start('in', mode); }, slideOut: function(mode){ return this.start('out', mode); }, hide: function(mode){ this[mode || this.options.mode](); this.open = false; return this.set([-this.offset, 0]); }, show: function(mode){ this[mode || this.options.mode](); this.open = true; return this.set([0, this.offset]); }, toggle: function(mode){ return this.start('toggle', mode); } }); Element.Properties.slide = { set: function(options){ this.get('slide').cancel().setOptions(options); return this; }, get: function(){ var slide = this.retrieve('slide'); if (!slide){ slide = new Fx.Slide(this, {link: 'cancel'}); this.store('slide', slide); } return slide; } }; Element.implement({ slide: function(how, mode){ how = how || 'toggle'; var slide = this.get('slide'), toggle; switch (how){ case 'hide': slide.hide(mode); break; case 'show': slide.show(mode); break; case 'toggle': var flag = this.retrieve('slide:flag', slide.open); slide[flag ? 'slideOut' : 'slideIn'](mode); this.store('slide:flag', !flag); toggle = true; break; default: slide.start(how, mode); } if (!toggle) this.eliminate('slide:flag'); return this; } });