UNPKG

uikit

Version:

UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.

108 lines (101 loc) 3.19 kB
/*! UIkit 3.21.0 | https://www.getuikit.com | (c) 2014 - 2024 YOOtheme | MIT License */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('uikit-util')) : typeof define === 'function' && define.amd ? define('uikitcountdown', ['uikit-util'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.UIkitCountdown = factory(global.UIkit.util)); })(this, (function (uikitUtil) { 'use strict'; var Class = { connected() { uikitUtil.addClass(this.$el, this.$options.id); } }; const units = ["days", "hours", "minutes", "seconds"]; var Component = { mixins: [Class], props: { date: String, clsWrapper: String, role: String }, data: { date: "", clsWrapper: ".uk-countdown-%unit%", role: "timer" }, connected() { uikitUtil.attr(this.$el, "role", this.role); this.date = uikitUtil.toFloat(Date.parse(this.$props.date)); this.end = false; this.start(); }, disconnected() { this.stop(); }, events: { name: "visibilitychange", el: () => document, handler() { if (document.hidden) { this.stop(); } else { this.start(); } } }, methods: { start() { this.stop(); this.update(); if (!this.timer) { uikitUtil.trigger(this.$el, "countdownstart"); this.timer = setInterval(this.update, 1e3); } }, stop() { if (this.timer) { clearInterval(this.timer); uikitUtil.trigger(this.$el, "countdownstop"); this.timer = null; } }, update() { const timespan = getTimeSpan(this.date); if (!timespan.total) { this.stop(); if (!this.end) { uikitUtil.trigger(this.$el, "countdownend"); this.end = true; } } for (const unit of units) { const el = uikitUtil.$(this.clsWrapper.replace("%unit%", unit), this.$el); if (!el) { continue; } let digits = Math.trunc(timespan[unit]).toString().padStart(2, "0"); if (el.textContent !== digits) { digits = digits.split(""); if (digits.length !== el.children.length) { uikitUtil.html(el, digits.map(() => "<span></span>").join("")); } digits.forEach((digit, i) => el.children[i].textContent = digit); } } } } }; function getTimeSpan(date) { const total = Math.max(0, date - Date.now()) / 1e3; return { total, seconds: total % 60, minutes: total / 60 % 60, hours: total / 60 / 60 % 24, days: total / 60 / 60 / 24 }; } if (typeof window !== "undefined" && window.UIkit) { window.UIkit.component("countdown", Component); } return Component; }));