UNPKG

vuikit

Version:

A responsive Vue UI library for web site interfaces based on UIkit

107 lines (102 loc) 3.6 kB
/** * 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 };