Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/materialize-css/js/slider.js')
-rw-r--r--node_modules/materialize-css/js/slider.js359
1 files changed, 359 insertions, 0 deletions
diff --git a/node_modules/materialize-css/js/slider.js b/node_modules/materialize-css/js/slider.js
new file mode 100644
index 0000000000..40d7100d82
--- /dev/null
+++ b/node_modules/materialize-css/js/slider.js
@@ -0,0 +1,359 @@
+(function($, anim) {
+ 'use strict';
+
+ let _defaults = {
+ indicators: true,
+ height: 400,
+ duration: 500,
+ interval: 6000
+ };
+
+ /**
+ * @class
+ *
+ */
+ class Slider extends Component {
+ /**
+ * Construct Slider instance and set up overlay
+ * @constructor
+ * @param {Element} el
+ * @param {Object} options
+ */
+ constructor(el, options) {
+ super(Slider, el, options);
+
+ this.el.M_Slider = this;
+
+ /**
+ * Options for the modal
+ * @member Slider#options
+ * @prop {Boolean} [indicators=true] - Show indicators
+ * @prop {Number} [height=400] - height of slider
+ * @prop {Number} [duration=500] - Length in ms of slide transition
+ * @prop {Number} [interval=6000] - Length in ms of slide interval
+ */
+ this.options = $.extend({}, Slider.defaults, options);
+
+ // setup
+ this.$slider = this.$el.find('.slides');
+ this.$slides = this.$slider.children('li');
+ this.activeIndex = this.$slides
+ .filter(function(item) {
+ return $(item).hasClass('active');
+ })
+ .first()
+ .index();
+ if (this.activeIndex != -1) {
+ this.$active = this.$slides.eq(this.activeIndex);
+ }
+
+ this._setSliderHeight();
+
+ // Set initial positions of captions
+ this.$slides.find('.caption').each((el) => {
+ this._animateCaptionIn(el, 0);
+ });
+
+ // Move img src into background-image
+ this.$slides.find('img').each((el) => {
+ let placeholderBase64 =
+ 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
+ if ($(el).attr('src') !== placeholderBase64) {
+ $(el).css('background-image', 'url("' + $(el).attr('src') + '")');
+ $(el).attr('src', placeholderBase64);
+ }
+ });
+
+ this._setupIndicators();
+
+ // Show active slide
+ if (this.$active) {
+ this.$active.css('display', 'block');
+ } else {
+ this.$slides.first().addClass('active');
+ anim({
+ targets: this.$slides.first()[0],
+ opacity: 1,
+ duration: this.options.duration,
+ easing: 'easeOutQuad'
+ });
+
+ this.activeIndex = 0;
+ this.$active = this.$slides.eq(this.activeIndex);
+
+ // Update indicators
+ if (this.options.indicators) {
+ this.$indicators.eq(this.activeIndex).addClass('active');
+ }
+ }
+
+ // Adjust height to current slide
+ this.$active.find('img').each((el) => {
+ anim({
+ targets: this.$active.find('.caption')[0],
+ opacity: 1,
+ translateX: 0,
+ translateY: 0,
+ duration: this.options.duration,
+ easing: 'easeOutQuad'
+ });
+ });
+
+ this._setupEventHandlers();
+
+ // auto scroll
+ this.start();
+ }
+
+ static get defaults() {
+ return _defaults;
+ }
+
+ static init(els, options) {
+ return super.init(this, els, options);
+ }
+
+ /**
+ * Get Instance
+ */
+ static getInstance(el) {
+ let domElem = !!el.jquery ? el[0] : el;
+ return domElem.M_Slider;
+ }
+
+ /**
+ * Teardown component
+ */
+ destroy() {
+ this.pause();
+ this._removeIndicators();
+ this._removeEventHandlers();
+ this.el.M_Slider = undefined;
+ }
+
+ /**
+ * Setup Event Handlers
+ */
+ _setupEventHandlers() {
+ this._handleIntervalBound = this._handleInterval.bind(this);
+ this._handleIndicatorClickBound = this._handleIndicatorClick.bind(this);
+
+ if (this.options.indicators) {
+ this.$indicators.each((el) => {
+ el.addEventListener('click', this._handleIndicatorClickBound);
+ });
+ }
+ }
+
+ /**
+ * Remove Event Handlers
+ */
+ _removeEventHandlers() {
+ if (this.options.indicators) {
+ this.$indicators.each((el) => {
+ el.removeEventListener('click', this._handleIndicatorClickBound);
+ });
+ }
+ }
+
+ /**
+ * Handle indicator click
+ * @param {Event} e
+ */
+ _handleIndicatorClick(e) {
+ let currIndex = $(e.target).index();
+ this.set(currIndex);
+ }
+
+ /**
+ * Handle Interval
+ */
+ _handleInterval() {
+ let newActiveIndex = this.$slider.find('.active').index();
+ if (this.$slides.length === newActiveIndex + 1) newActiveIndex = 0;
+ // loop to start
+ else newActiveIndex += 1;
+
+ this.set(newActiveIndex);
+ }
+
+ /**
+ * Animate in caption
+ * @param {Element} caption
+ * @param {Number} duration
+ */
+ _animateCaptionIn(caption, duration) {
+ let animOptions = {
+ targets: caption,
+ opacity: 0,
+ duration: duration,
+ easing: 'easeOutQuad'
+ };
+
+ if ($(caption).hasClass('center-align')) {
+ animOptions.translateY = -100;
+ } else if ($(caption).hasClass('right-align')) {
+ animOptions.translateX = 100;
+ } else if ($(caption).hasClass('left-align')) {
+ animOptions.translateX = -100;
+ }
+
+ anim(animOptions);
+ }
+
+ /**
+ * Set height of slider
+ */
+ _setSliderHeight() {
+ // If fullscreen, do nothing
+ if (!this.$el.hasClass('fullscreen')) {
+ if (this.options.indicators) {
+ // Add height if indicators are present
+ this.$el.css('height', this.options.height + 40 + 'px');
+ } else {
+ this.$el.css('height', this.options.height + 'px');
+ }
+ this.$slider.css('height', this.options.height + 'px');
+ }
+ }
+
+ /**
+ * Setup indicators
+ */
+ _setupIndicators() {
+ if (this.options.indicators) {
+ this.$indicators = $('<ul class="indicators"></ul>');
+ this.$slides.each((el, index) => {
+ let $indicator = $('<li class="indicator-item"></li>');
+ this.$indicators.append($indicator[0]);
+ });
+ this.$el.append(this.$indicators[0]);
+ this.$indicators = this.$indicators.children('li.indicator-item');
+ }
+ }
+
+ /**
+ * Remove indicators
+ */
+ _removeIndicators() {
+ this.$el.find('ul.indicators').remove();
+ }
+
+ /**
+ * Cycle to nth item
+ * @param {Number} index
+ */
+ set(index) {
+ // Wrap around indices.
+ if (index >= this.$slides.length) index = 0;
+ else if (index < 0) index = this.$slides.length - 1;
+
+ // Only do if index changes
+ if (this.activeIndex != index) {
+ this.$active = this.$slides.eq(this.activeIndex);
+ let $caption = this.$active.find('.caption');
+ this.$active.removeClass('active');
+
+ anim({
+ targets: this.$active[0],
+ opacity: 0,
+ duration: this.options.duration,
+ easing: 'easeOutQuad',
+ complete: () => {
+ this.$slides.not('.active').each((el) => {
+ anim({
+ targets: el,
+ opacity: 0,
+ translateX: 0,
+ translateY: 0,
+ duration: 0,
+ easing: 'easeOutQuad'
+ });
+ });
+ }
+ });
+
+ this._animateCaptionIn($caption[0], this.options.duration);
+
+ // Update indicators
+ if (this.options.indicators) {
+ this.$indicators.eq(this.activeIndex).removeClass('active');
+ this.$indicators.eq(index).addClass('active');
+ }
+
+ anim({
+ targets: this.$slides.eq(index)[0],
+ opacity: 1,
+ duration: this.options.duration,
+ easing: 'easeOutQuad'
+ });
+
+ anim({
+ targets: this.$slides.eq(index).find('.caption')[0],
+ opacity: 1,
+ translateX: 0,
+ translateY: 0,
+ duration: this.options.duration,
+ delay: this.options.duration,
+ easing: 'easeOutQuad'
+ });
+
+ this.$slides.eq(index).addClass('active');
+ this.activeIndex = index;
+
+ // Reset interval
+ this.start();
+ }
+ }
+
+ /**
+ * Pause slider interval
+ */
+ pause() {
+ clearInterval(this.interval);
+ }
+
+ /**
+ * Start slider interval
+ */
+ start() {
+ clearInterval(this.interval);
+ this.interval = setInterval(
+ this._handleIntervalBound,
+ this.options.duration + this.options.interval
+ );
+ }
+
+ /**
+ * Move to next slide
+ */
+ next() {
+ let newIndex = this.activeIndex + 1;
+
+ // Wrap around indices.
+ if (newIndex >= this.$slides.length) newIndex = 0;
+ else if (newIndex < 0) newIndex = this.$slides.length - 1;
+
+ this.set(newIndex);
+ }
+
+ /**
+ * Move to previous slide
+ */
+ prev() {
+ let newIndex = this.activeIndex - 1;
+
+ // Wrap around indices.
+ if (newIndex >= this.$slides.length) newIndex = 0;
+ else if (newIndex < 0) newIndex = this.$slides.length - 1;
+
+ this.set(newIndex);
+ }
+ }
+
+ M.Slider = Slider;
+
+ if (M.jQueryLoaded) {
+ M.initializeJqueryWrapper(Slider, 'slider', 'M_Slider');
+ }
+})(cash, M.anime);