uikit
Version:
UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.
124 lines (117 loc) • 4.06 kB
JavaScript
/*! 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('uikitnotification', ['uikit-util'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.UIkitNotification = factory(global.UIkit.util));
})(this, (function (uikitUtil) { 'use strict';
var Container = {
props: {
container: Boolean
},
data: {
container: true
},
computed: {
container({ container }) {
return container === true && this.$container || container && uikitUtil.$(container);
}
}
};
var Component = {
mixins: [Container],
functional: true,
args: ["message", "status"],
data: {
message: "",
status: "",
timeout: 5e3,
group: "",
pos: "top-center",
clsContainer: "uk-notification",
clsClose: "uk-notification-close",
clsMsg: "uk-notification-message"
},
install,
computed: {
marginProp: ({ pos }) => `margin-${pos.match(/[a-z]+(?=-)/)[0]}`,
startProps() {
return { opacity: 0, [this.marginProp]: -this.$el.offsetHeight };
}
},
created() {
const posClass = `${this.clsContainer}-${this.pos}`;
const containerAttr = `data-${this.clsContainer}-container`;
const container = uikitUtil.$(`.${posClass}[${containerAttr}]`, this.container) || uikitUtil.append(
this.container,
`<div class="${this.clsContainer} ${posClass}" ${containerAttr}></div>`
);
this.$mount(
uikitUtil.append(
container,
`<div class="${this.clsMsg}${this.status ? ` ${this.clsMsg}-${this.status}` : ""}" role="alert"> <a href class="${this.clsClose}" data-uk-close></a> <div>${this.message}</div> </div>`
)
);
},
async connected() {
const margin = uikitUtil.toFloat(uikitUtil.css(this.$el, this.marginProp));
await uikitUtil.Transition.start(uikitUtil.css(this.$el, this.startProps), {
opacity: 1,
[this.marginProp]: margin
});
if (this.timeout) {
this.timer = setTimeout(this.close, this.timeout);
}
},
events: {
click(e) {
if (e.target.closest('a[href="#"],a[href=""]')) {
e.preventDefault();
}
this.close();
},
[uikitUtil.pointerEnter]() {
if (this.timer) {
clearTimeout(this.timer);
}
},
[uikitUtil.pointerLeave]() {
if (this.timeout) {
this.timer = setTimeout(this.close, this.timeout);
}
}
},
methods: {
async close(immediate) {
const removeFn = (el) => {
const container = uikitUtil.parent(el);
uikitUtil.trigger(el, "close", [this]);
uikitUtil.remove(el);
if (!(container == null ? void 0 : container.hasChildNodes())) {
uikitUtil.remove(container);
}
};
if (this.timer) {
clearTimeout(this.timer);
}
if (!immediate) {
await uikitUtil.Transition.start(this.$el, this.startProps);
}
removeFn(this.$el);
}
}
};
function install(UIkit) {
UIkit.notification.closeAll = function(group, immediate) {
uikitUtil.apply(document.body, (el) => {
const notification = UIkit.getComponent(el, "notification");
if (notification && (!group || group === notification.group)) {
notification.close(immediate);
}
});
};
}
if (typeof window !== "undefined" && window.UIkit) {
window.UIkit.component("notification", Component);
}
return Component;
}));