This commit is contained in:
Dan Elbert 2018-09-10 17:25:36 -05:00
parent eb34393407
commit a6cf7c1b16
9 changed files with 431 additions and 233 deletions

View File

@ -1,190 +1,49 @@
<template> <template>
<span class="icon" :class="sizeClass" @click="$emit('click', $event)" ref="container"> <span class="icon" :class="iconClasses" @click="$emit('click', $event)">
<app-iconic-icon :icon="iconicIcon" :size="iconicSize" v-bind="iconicAttributes"></app-iconic-icon>
</span> </span>
</template> </template>
<script> <script>
import IconicJs from "../iconic/js/iconic.min";
import Caret from "../iconic/svg/smart/caret";
import Check from "../iconic/svg/smart/check";
import CircleCheck from "../iconic/svg/smart/circle-check";
import Link from "../iconic/svg/smart/link";
import Lock from "../iconic/svg/smart/lock";
import Menu from "../iconic/svg/smart/menu";
import Person from "../iconic/svg/smart/person";
import Pencil from "../iconic/svg/smart/pencil";
import Star from "../iconic/svg/smart/star";
import StarEmpty from "../iconic/svg/smart/star-empty";
import X from "../iconic/svg/smart/x";
const SVG_CACHE = {};
let REMAP_COUNT = 0;
class IconData { class IconData {
constructor(svgData, dataAttributes) { constructor(iconicIcon, dataAttributes) {
this.svgData = svgData; this.iconicIcon = iconicIcon;
this.dataAttributes = dataAttributes || {}; this.dataAttributes = dataAttributes || {};
this.svgTemplate = null;
}
getSvg() {
if (this.svgTemplate === null) {
const iconicName = this.svgData.attributes.class;
this.svgTemplate = SVG_CACHE[iconicName] || null;
if (this.svgTemplate === null) {
this.svgTemplate = document.createElementNS("http://www.w3.org/2000/svg", "svg");
SVG_CACHE[iconicName] = this.svgTemplate;
for (let attr in this.svgData.attributes) {
this.svgTemplate.setAttribute(attr, this.svgData.attributes[attr]);
}
this.svgTemplate.innerHTML = this.svgData.content;
// Find then prune the scripts
const scripts = [...this.svgTemplate.querySelectorAll('script')];
scripts.filter(s => {
let scriptType = s.getAttribute("type");
return !scriptType || scriptType === 'application/ecmascript' || scriptType === 'application/javascript'
}).forEach(s => {
new Function(s.innerText || s.textContent)(window);
this.svgTemplate.removeChild(s);
});
}
}
const clone = this.svgTemplate.cloneNode(true);
this.remapIds(clone);
this.attachIconicApi(clone);
for (let attr in this.dataAttributes) {
clone.setAttribute(`data-${attr}`, this.dataAttributes[attr]);
}
return clone;
}
remapIds(svg) {
const iriElementsAndProperties = {
'clipPath': ['clip-path'],
'color-profile': ['color-profile'],
'cursor': ['cursor'],
'filter': ['filter'],
'linearGradient': ['fill', 'stroke'],
'marker': ['marker', 'marker-start', 'marker-mid', 'marker-end'],
'mask': ['mask'],
'pattern': ['fill', 'stroke'],
'radialGradient': ['fill', 'stroke']
};
REMAP_COUNT += 1;
let element, elementDefs, properties, currentId, newId;
Object.keys(iriElementsAndProperties).forEach(function (key) {
element = key;
properties = iriElementsAndProperties[key];
elementDefs = svg.querySelectorAll('defs ' + element + '[id]');
for (var i = 0, elementsLen = elementDefs.length; i < elementsLen; i++) {
currentId = elementDefs[i].id;
newId = currentId + '-' + REMAP_COUNT;
// All of the properties that can reference this element type
var referencingElements;
properties.forEach(function (property) {
// :NOTE: using a substring match attr selector here to deal with IE "adding extra quotes in url() attrs"
referencingElements = svg.querySelectorAll('[' + property + '*="' + currentId + '"]');
for (var j = 0, referencingElementLen = referencingElements.length; j < referencingElementLen; j++) {
referencingElements[j].setAttribute(property, 'url(#' + newId + ')');
}
});
elementDefs[i].id = newId;
}
});
}
attachIconicApi(svg) {
const key = svg.getAttribute("data-icon");
const apis = window.iconicSmartIconApis;
if (key && apis[key]) {
const iconApi = apis[key](svg);
for (let func in iconApi) svg[func] = iconApi[func]
}
} }
} }
class SizeData { class SizeData {
constructor(bulmaIconClass, defaultPadding) { constructor(bulmaIconClass, iconicSize, customClass) {
this.bulmaIconClass = bulmaIconClass; this.bulmaIconClass = bulmaIconClass;
this.defaultPadding = defaultPadding || null; this.iconicSize = iconicSize || null;
this.customIconClass = customClass || null;
} }
} }
class IconicQueue {
constructor(iconicInstance) {
this.iconic = iconicInstance;
this.updateQueue = [];
this.isTimerRunning = false;
}
processQueues() {
if (this.updateQueue.length > 0) {
console.log(`updating ${this.updateQueue.length}`);
this.iconic.update(this.updateQueue);
this.updateQueue.forEach(s => (s.style.visibility = null));
this.updateQueue = [];
}
this.isTimerRunning = false;
}
ensureTimer() {
if (!this.isTimerRunning) {
this.isTimerRunning = true;
setTimeout(() => this.processQueues());
}
}
updateSvg(svgElem) {
this.updateQueue.push(svgElem);
this.ensureTimer();
}
}
const iconicInstance = IconicJs({
autoInjectSelector: "#notreal-noinjection"
});
const iconicQueue = new IconicQueue(iconicInstance);
const iconMap = { const iconMap = {
'caret-bottom': new IconData(Caret, {direction: 'bottom'}), 'caret-bottom': new IconData('caret', {'data-direction': 'bottom'}),
'caret-top': new IconData(Caret, {direction: 'top'}), 'caret-top': new IconData('caret', {'data-direction': 'top'}),
check: new IconData(Check), check: new IconData('check'),
'circle-check': new IconData(CircleCheck), 'circle-check': new IconData('circle-check'),
'link-broken': new IconData(Link, {state: 'broken'}), 'link-broken': new IconData('link', {'data-state': 'broken'}),
'link-intact': new IconData(Link, {state: 'intact'}), 'link-intact': new IconData('link', {'data-state': 'intact'}),
'lock-locked': new IconData(Lock, {state: 'locked'}), 'lock-locked': new IconData('lock', {'data-state': 'locked'}),
'lock-unlocked': new IconData(Lock, {state: 'unlocked'}), 'lock-unlocked': new IconData('lock', {'data-state': 'unlocked'}),
menu: new IconData(Menu), menu: new IconData('menu'),
pencil: new IconData(Pencil), pencil: new IconData('pencil'),
person: new IconData(Person), person: new IconData('person'),
star: new IconData(Star), star: new IconData('star'),
'star-empty': new IconData(StarEmpty), 'star-empty': new IconData('star-empty'),
x: new IconData(X) x: new IconData('x')
}; };
const sizeMap = { const sizeMap = {
xs: new SizeData('is-small', '25%'), xs: new SizeData('is-small', 'sm', 'is-xs'),
sm: new SizeData('is-small'), sm: new SizeData('is-small', 'sm'),
md: new SizeData(''), md: new SizeData('', 'sm', 'is-md'),
lg: new SizeData('is-medium'), lg: new SizeData('is-medium', 'md'),
xl: new SizeData('is-large') xl: new SizeData('is-large', 'md', 'is-xl')
}; };
export default { export default {
@ -220,45 +79,24 @@
return sizeMap[this.size]; return sizeMap[this.size];
}, },
sizeClass() { iconClasses() {
return this.sizeData.bulmaIconClass; return [
this.sizeData.bulmaIconClass,
this.sizeData.customIconClass
]
}, },
svgPadding() { iconicSize() {
return this.padding || this.sizeData.defaultPadding || "15%"; return this.sizeData.iconicSize;
}
}, },
methods: { iconicIcon() {
insertSvg() { return this.iconData.iconicIcon;
const parent = this.$refs.container;
while (parent.firstChild) {
parent.removeChild(parent.firstChild);
}
const svg = this.iconData.getSvg();
this.injectedSvg = svg;
svg.style.padding = this.svgPadding;
svg.style.visibility = "hidden";
svg.classList.add("iconic-fluid");
parent.appendChild(svg);
iconicQueue.updateSvg(svg);
}
}, },
mounted() { iconicAttributes() {
let self = this; return this.iconData.dataAttributes;
this.$watch(
function() { return this.icon + this.size + this.padding },
function() {
this.insertSvg();
},
{
immediate: true
} }
)
} }
} }
@ -266,6 +104,41 @@
<style lang="scss" scoped> <style lang="scss" scoped>
span.icon.is-xs {
svg.iconic {
width: 8px;
height: 8px;
}
}
span.icon.is-sm {
svg.iconic {
width: 12px;
height: 12px;
}
}
span.icon.is-md {
svg.iconic {
width: 16px;
height: 16px;
}
}
span.icon.is-lg {
svg.iconic {
width: 32px;
height: 32px;
}
}
span.icon.is-xl {
svg.iconic {
width: 48px;
height: 48px;
}
}
</style> </style>

View File

@ -0,0 +1,151 @@
<template>
<svg v-bind="svgAttributes" v-html="svgContent" :class="calculatedClasses"></svg>
</template>
<script>
import Caret from "../iconic/svg/smart/caret";
import Check from "../iconic/svg/smart/check";
import CircleCheck from "../iconic/svg/smart/circle-check";
import Link from "../iconic/svg/smart/link";
import Lock from "../iconic/svg/smart/lock";
import Menu from "../iconic/svg/smart/menu";
import Person from "../iconic/svg/smart/person";
import Pencil from "../iconic/svg/smart/pencil";
import Star from "../iconic/svg/smart/star";
import StarEmpty from "../iconic/svg/smart/star-empty";
import X from "../iconic/svg/smart/x";
const APIS = {};
const LOADED_APIS = {};
window._Iconic = {
smartIconApis: APIS
};
let globalIdCounter = 0;
const iconMap = {
caret: Caret,
check: Check,
'circle-check': CircleCheck,
link: Link,
lock: Lock,
menu: Menu,
pencil: Pencil,
person: Person,
star: Star,
'star-empty': StarEmpty,
x: X
};
export default {
props: {
icon: {
type: String,
required: true,
validator: (i) => iconMap[i] !== undefined
},
size: {
type: String,
default: "lg",
validator: (s) => ["sm", "md", "lg"].indexOf(s) >= 0
},
iconSizeOverride: {
type: String,
validator: (s) => ["sm", "md", "lg", null].indexOf(s) >= 0
},
displaySizeOverride: {
type: String,
validator: (s) => ["sm", "md", "lg", null].indexOf(s) >= 0
}
},
data() {
return {
calculatedClasses: []
}
},
computed: {
svgData() {
return iconMap[this.icon];
},
svgAttributes() {
return this.svgData.attributes;
},
svgName() {
return this.svgAttributes['data-icon'];
},
svgContent() {
let content = String(this.svgData.content);
for (let idRep of this.svgData.idReplacements) {
let newId = `__new_id_${globalIdCounter}`;
globalIdCounter += 1;
content = content.replace(new RegExp(idRep, "g"), newId);
}
return content;
}
},
methods: {
rebind() {
const apis = APIS;
if (apis && this.svgName && apis[this.svgName]) {
const iconApi = apis[this.svgName](this.$el);
for (let func in iconApi) this.$el[func] = iconApi[func]
} else {
this.$el.update = function() {}
}
this.calculatedClasses = (this.svgAttributes.class || "").split(" ");
this.calculatedClasses.push(`iconic-${this.size}`);
if (this.iconSizeOverride) {
this.calculatedClasses.push(`iconic-icon-${this.iconSizeOverride}`);
}
if (this.displaySizeOverride) {
this.calculatedClasses.push(`iconic-size-${this.displaySizeOverride}`);
}
this.$el.update();
}
},
created() {
if (LOADED_APIS[this.svgName] !== true) {
for (let sb of this.svgData.scriptBlocks) {
new Function(sb)(window);
}
LOADED_APIS[this.svgName] = true;
}
},
mounted() {
this.$watch(
function() { return [this.$attrs, this.icon, this.fluid] },
function() {
this.rebind()
},
{
immediate: true
}
);
}
}
</script>

View File

@ -1,10 +1,12 @@
import '../styles'; import '../styles';
import "vue-resize/dist/vue-resize";
import Vue from 'vue' import Vue from 'vue'
import { sync } from 'vuex-router-sync'; import { sync } from 'vuex-router-sync';
import { swInit } from "../lib/ServiceWorker"; import { swInit } from "../lib/ServiceWorker";
import responsiveSync from "../lib/VuexResponsiveSync"; import responsiveSync from "../lib/VuexResponsiveSync";
import VueProgressBar from "vue-progressbar"; import VueProgressBar from "vue-progressbar";
import VueResize from "vue-resize";
import config from '../config'; import config from '../config';
import store from '../store'; import store from '../store';
import router from '../router'; import router from '../router';
@ -18,6 +20,7 @@ import AppDatePicker from "../components/AppDatePicker";
import AppDropdown from "../components/AppDropdown"; import AppDropdown from "../components/AppDropdown";
import AppExpandTransition from "../components/AppExpandTransition"; import AppExpandTransition from "../components/AppExpandTransition";
import AppIcon from "../components/AppIcon"; import AppIcon from "../components/AppIcon";
import AppIconicIcon from "../components/AppIconicIcon";
import AppModal from "../components/AppModal"; import AppModal from "../components/AppModal";
import AppNavbar from "../components/AppNavbar"; import AppNavbar from "../components/AppNavbar";
import AppPager from "../components/AppPager"; import AppPager from "../components/AppPager";
@ -33,6 +36,7 @@ Vue.component("AppDatePicker", AppDatePicker);
Vue.component("AppDropdown", AppDropdown); Vue.component("AppDropdown", AppDropdown);
Vue.component("AppExpandTransition", AppExpandTransition); Vue.component("AppExpandTransition", AppExpandTransition);
Vue.component("AppIcon", AppIcon); Vue.component("AppIcon", AppIcon);
Vue.component("AppIconicIcon", AppIconicIcon);
Vue.component("AppModal", AppModal); Vue.component("AppModal", AppModal);
Vue.component("AppNavbar", AppNavbar); Vue.component("AppNavbar", AppNavbar);
Vue.component("AppPager", AppPager); Vue.component("AppPager", AppPager);
@ -56,6 +60,8 @@ Vue.use(VueProgressBar, {
// inverse: false // inverse: false
}); });
Vue.use(VueResize);
sync(store, router); sync(store, router);
swInit(store); swInit(store);
responsiveSync(store); responsiveSync(store);

View File

@ -1,3 +1,17 @@
/* Iconic Responsive Support Styles */
.iconic-property-fill, .iconic-property-text {stroke: none !important;}
.iconic-property-stroke {fill: none !important;}
svg.iconic.iconic-fluid {height:100% !important;width:100% !important;}
svg.iconic.iconic-sm:not(.iconic-size-md):not(.iconic-size-lg), svg.iconic.iconic-size-sm{width:16px;height:16px;}
svg.iconic.iconic-md:not(.iconic-size-sm):not(.iconic-size-lg), svg.iconic.iconic-size-md{width:32px;height:32px;}
svg.iconic.iconic-lg:not(.iconic-size-sm):not(.iconic-size-md), svg.iconic.iconic-size-lg{width:128px;height:128px;}
svg.iconic-sm > g.iconic-md, svg.iconic-sm > g.iconic-lg, svg.iconic-md > g.iconic-sm, svg.iconic-md > g.iconic-lg, svg.iconic-lg > g.iconic-sm, svg.iconic-lg > g.iconic-md {display: none;}
svg.iconic.iconic-icon-sm > g.iconic-lg, svg.iconic.iconic-icon-md > g.iconic-lg {display:none;}
svg.iconic-sm:not(.iconic-icon-md):not(.iconic-icon-lg) > g.iconic-sm, svg.iconic-md.iconic-icon-sm > g.iconic-sm, svg.iconic-lg.iconic-icon-sm > g.iconic-sm {display:inline;}
svg.iconic-md:not(.iconic-icon-sm):not(.iconic-icon-lg) > g.iconic-md, svg.iconic-sm.iconic-icon-md > g.iconic-md, svg.iconic-lg.iconic-icon-md > g.iconic-md {display:inline;}
svg.iconic-lg:not(.iconic-icon-sm):not(.iconic-icon-md) > g.iconic-lg, svg.iconic-sm.iconic-icon-lg > g.iconic-lg, svg.iconic-md.iconic-icon-lg > g.iconic-lg {display:inline;}
@mixin iconic-color($color) { @mixin iconic-color($color) {
fill: $color; fill: $color;
stroke: $color; stroke: $color;

View File

@ -0,0 +1,81 @@
const cheerio = require('cheerio');
const iriElementsAndProperties = {
'clipPath': ['clip-path'],
'color-profile': ['color-profile'],
'cursor': ['cursor'],
'filter': ['filter'],
'linearGradient': ['fill', 'stroke'],
'marker': ['marker', 'marker-start', 'marker-mid', 'marker-end'],
'mask': ['mask'],
'pattern': ['fill', 'stroke'],
'radialGradient': ['fill', 'stroke']
};
module.exports = function(content) {
this.cacheable && this.cacheable();
const $ = cheerio.load(content, {
lowerCaseTags: false
});
let idReplacements = [];
for(let element in iriElementsAndProperties) {
let properties = iriElementsAndProperties[element];
$(`svg defs ${element}[id]`).each(function() {
const $elem = $(this);
const id = $elem.attr("id");
const newId = `__ICONIC_SVG_REPLACEMENT_${idReplacements.length}`;
idReplacements.push(newId);
$elem.attr("id", newId);
for (let property of properties) {
$(`svg *[${property}="url(#${id})"]`).each(function() {
const $elem = $(this);
$elem.attr(property, `url(#${newId})`);
})
}
})
}
const $svg = $("svg");
let iconName = $svg.attr("data-icon");
if (!iconName) {
const match = $svg.attr("class").match(/iconic-([a-z\-]+)/);
if (match) {
$svg.attr("data-icon", match[1]);
} else {
throw "Can't parse class into data-icon";
}
}
const scriptBlocks = [];
// Find then prune the scripts
$("svg script").each(function() {
const $script = $(this);
const scriptType = $script.attr("type");
if (!scriptType || scriptType === 'application/ecmascript' || scriptType === 'application/javascript') {
scriptBlocks.push($script.html());
}
});
$("svg script").remove();
const attributes = $svg.get(0).attribs;
const svgMarkup = $("svg").html();
return `module.exports = ${JSON.stringify({
attributes: attributes,
content: svgMarkup,
idReplacements: idReplacements,
scriptBlocks: scriptBlocks
})}`;
};

View File

@ -1,9 +1,9 @@
const path = require("path"); const path = require("path");
module.exports = { module.exports = {
test: /\.svg$/, test: /\/iconic\/svg\/.*\.svg$/,
use: [{ use: [{
loader: path.join(__dirname, 'svg_loader.js') loader: path.join(__dirname, 'iconic_svg_loader.js')
}] }]
}; };

View File

@ -1,27 +0,0 @@
module.exports = function(content) {
this.cacheable && this.cacheable();
var match = content.match(/<svg([^>]+)+>([\s\S]+)<\/svg>/i);
var attrs = {};
if (match) {
attrs = match[1];
if (attrs) {
attrs = attrs.match(/([\w-:]+)(=)?("[^<>"]*"|'[^<>']*'|[\w-:]+)/g)
.reduce(function(obj, attr){
var split = attr.split('=');
var name = split[0];
var value = true;
if (split && split[1]) {
value = split[1].replace(/['"]/g, '');
}
obj[name] = value;
return obj;
}, {})
}
content = match[2] || '';
};
return "module.exports = " + JSON.stringify({attributes: attrs, content: content});
};

View File

@ -4,6 +4,7 @@
"autosize": "^4.0.1", "autosize": "^4.0.1",
"bulma": "^0.7.1", "bulma": "^0.7.1",
"caniuse-lite": "^1.0.30000815", "caniuse-lite": "^1.0.30000815",
"cheerio": "^1.0.0-rc.2",
"css-loader": "^0.28.11", "css-loader": "^0.28.11",
"lodash": "^4.17.5", "lodash": "^4.17.5",
"svg-loader": "^0.0.2", "svg-loader": "^0.0.2",
@ -11,6 +12,7 @@
"vue": "^2.5.16", "vue": "^2.5.16",
"vue-loader": "^14.2.2", "vue-loader": "^14.2.2",
"vue-progressbar": "^0.7.4", "vue-progressbar": "^0.7.4",
"vue-resize": "^0.4.4",
"vue-router": "^3.0.1", "vue-router": "^3.0.1",
"vue-template-compiler": "^2.5.16", "vue-template-compiler": "^2.5.16",
"vuex": "^3.0.1", "vuex": "^3.0.1",

100
yarn.lock
View File

@ -32,6 +32,10 @@
webpack "^3.12.0" webpack "^3.12.0"
webpack-manifest-plugin "^1.3.2" webpack-manifest-plugin "^1.3.2"
"@types/node@*":
version "10.9.4"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.4.tgz#0f4cb2dc7c1de6096055357f70179043c33e9897"
abbrev@1: abbrev@1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@ -872,6 +876,10 @@ bonjour@^3.5.0:
multicast-dns "^6.0.1" multicast-dns "^6.0.1"
multicast-dns-service-types "^1.1.0" multicast-dns-service-types "^1.1.0"
boolbase@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
brace-expansion@^1.1.7: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@ -1130,6 +1138,17 @@ chalk@^2.0.1, chalk@^2.4.1:
escape-string-regexp "^1.0.5" escape-string-regexp "^1.0.5"
supports-color "^5.3.0" supports-color "^5.3.0"
cheerio@^1.0.0-rc.2:
version "1.0.0-rc.2"
resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db"
dependencies:
css-select "~1.2.0"
dom-serializer "~0.1.0"
entities "~1.1.1"
htmlparser2 "^3.9.1"
lodash "^4.15.0"
parse5 "^3.0.1"
chokidar@^2.0.0, chokidar@^2.0.2: chokidar@^2.0.0, chokidar@^2.0.2:
version "2.0.4" version "2.0.4"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
@ -1522,6 +1541,15 @@ css-loader@^0.28.11:
postcss-value-parser "^3.3.0" postcss-value-parser "^3.3.0"
source-list-map "^2.0.0" source-list-map "^2.0.0"
css-select@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
dependencies:
boolbase "~1.0.0"
css-what "2.1"
domutils "1.5.1"
nth-check "~1.0.1"
css-selector-tokenizer@^0.7.0: css-selector-tokenizer@^0.7.0:
version "0.7.0" version "0.7.0"
resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
@ -1534,6 +1562,10 @@ css-unit-converter@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
css-what@2.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
cssesc@^0.1.0: cssesc@^0.1.0:
version "0.1.0" version "0.1.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
@ -1746,10 +1778,45 @@ dns-txt@^2.0.2:
dependencies: dependencies:
buffer-indexof "^1.0.0" buffer-indexof "^1.0.0"
dom-serializer@0, dom-serializer@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
dependencies:
domelementtype "~1.1.1"
entities "~1.1.1"
domain-browser@^1.1.1: domain-browser@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
domelementtype@1, domelementtype@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
domelementtype@~1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
domhandler@^2.3.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
dependencies:
domelementtype "1"
domutils@1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
dependencies:
dom-serializer "0"
domelementtype "1"
domutils@^1.5.1:
version "1.7.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
dependencies:
dom-serializer "0"
domelementtype "1"
duplexify@^3.4.2, duplexify@^3.6.0: duplexify@^3.4.2, duplexify@^3.6.0:
version "3.6.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
@ -1809,6 +1876,10 @@ enhanced-resolve@^3.4.0:
object-assign "^4.0.1" object-assign "^4.0.1"
tapable "^0.2.7" tapable "^0.2.7"
entities@^1.1.1, entities@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
errno@^0.1.3, errno@~0.1.7: errno@^0.1.3, errno@~0.1.7:
version "0.1.7" version "0.1.7"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@ -2530,6 +2601,17 @@ html-entities@^1.2.0:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
htmlparser2@^3.9.1:
version "3.9.2"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
dependencies:
domelementtype "^1.3.0"
domhandler "^2.3.0"
domutils "^1.5.1"
entities "^1.1.1"
inherits "^2.0.1"
readable-stream "^2.0.2"
http-deceiver@^1.2.7: http-deceiver@^1.2.7:
version "1.2.7" version "1.2.7"
resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
@ -3180,7 +3262,7 @@ lodash.uniq@^4.5.0:
version "4.5.0" version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10:
version "4.17.10" version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
@ -3647,6 +3729,12 @@ npm-run-path@^2.0.0:
gauge "~2.7.3" gauge "~2.7.3"
set-blocking "~2.0.0" set-blocking "~2.0.0"
nth-check@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
dependencies:
boolbase "~1.0.0"
num2fraction@^1.2.2: num2fraction@^1.2.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
@ -3842,6 +3930,12 @@ parse-json@^4.0.0:
error-ex "^1.3.1" error-ex "^1.3.1"
json-parse-better-errors "^1.0.1" json-parse-better-errors "^1.0.1"
parse5@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
dependencies:
"@types/node" "*"
parseurl@~1.3.2: parseurl@~1.3.2:
version "1.3.2" version "1.3.2"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
@ -5796,6 +5890,10 @@ vue-progressbar@^0.7.4:
version "0.7.5" version "0.7.5"
resolved "https://registry.yarnpkg.com/vue-progressbar/-/vue-progressbar-0.7.5.tgz#414730892252b1e45582d4979dec93038e007f79" resolved "https://registry.yarnpkg.com/vue-progressbar/-/vue-progressbar-0.7.5.tgz#414730892252b1e45582d4979dec93038e007f79"
vue-resize@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-0.4.4.tgz#dee9b8dd1b189e7e3f6ec47f86c60694a241bb17"
vue-router@^3.0.1: vue-router@^3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9"