vuikit
Version:
A responsive Vue UI library for web site interfaces based on UIkit
107 lines (102 loc) • 3.6 kB
JavaScript
/**
* Vuikit 0.8.10
* (c) 2018 Miljan Aleksic
* @license MIT
**/
/* Substantial part of the code is adapted from UIkit,
Copyright (c) 2013-2018 YOOtheme GmbH, getuikit.com */
import { removeAttr } from './attr';
import { isNode, isString, startsWith, toNode, toNodes } from './lang';
function query (selector, context) {
return toNode(selector) || find(selector, isContextSelector(selector) ? context : document)
}
function queryAll (selector, context) {
var nodes = toNodes(selector);
return nodes.length && nodes || findAll(selector, isContextSelector(selector) ? context : document)
}
function find (selector, context) {
return toNode(_query(selector, context, 'querySelector'))
}
function findAll (selector, context) {
return toNodes(_query(selector, context, 'querySelectorAll'))
}
function _query (selector, context, queryFn) {
if ( context === void 0 ) context = document;
if (!selector || !isString(selector)) {
return null
}
selector = selector.replace(contextSanitizeRe, '$1 *');
var removes;
if (isContextSelector(selector)) {
removes = [];
selector = selector.split(',').map(function (selector, i) {
var ctx = context;
selector = selector.trim();
if (selector[0] === '!') {
var selectors = selector.substr(1).trim().split(' ');
ctx = closest(context.parentNode, selectors[0]);
selector = selectors.slice(1).join(' ');
}
if (!ctx) {
return null
}
if (!ctx.id) {
ctx.id = "uk-" + (Date.now()) + i;
removes.push(function () { return removeAttr(ctx, 'id'); });
}
return ("#" + (escape(ctx.id)) + " " + selector)
}).filter(Boolean).join(',');
context = document;
}
try {
return context[queryFn](selector)
} catch (e) {
return null
} finally {
removes && removes.forEach(function (remove) { return remove(); });
}
}
var contextSelectorRe = /(^|,)\s*[!>+~]/;
var contextSanitizeRe = /([!>+~])(?=\s+[!>+~]|\s*$)/g;
function isContextSelector (selector) {
return isString(selector) && selector.match(contextSelectorRe)
}
function matches (element, selector) {
var elProto = window.Element.prototype;
var matchesFn = elProto.matches || elProto.webkitMatchesSelector || elProto.msMatchesSelector;
return toNodes(element).some(function (element) { return matchesFn.call(element, selector); })
}
function closest (element, selector) {
var elProto = window.Element.prototype;
var closestFn = elProto.closest || function (selector) {
var ancestor = this;
do {
if (matches(ancestor, selector)) {
return ancestor
}
ancestor = ancestor.parentNode;
} while (ancestor && ancestor.nodeType === 1)
};
if (startsWith(selector, '>')) {
selector = selector.slice(1);
}
return isNode(element)
? element.parentNode && closestFn.call(element, selector)
: toNodes(element).map(function (element) { return element.parentNode && closestFn.call(element, selector); }).filter(Boolean)
}
function parents (element, selector) {
var elements = [];
var parent = toNode(element).parentNode;
while (parent && parent.nodeType === 1) {
if (matches(parent, selector)) {
elements.push(parent);
}
parent = parent.parentNode;
}
return elements
}
function escape (css) {
var escapeFn = window.CSS && CSS.escape || function (css) { return css.replace(/([^\x7f-\uFFFF\w-])/g, function (match) { return ("\\" + match); }) };
return isString(css) ? escapeFn.call(null, css) : ''
}
export { query, queryAll, find, findAll, matches, closest, parents, escape };