panhui 3 ani în urmă
părinte
comite
0faf4d3836

+ 1 - 0
src/main/vue/package.json

@@ -53,6 +53,7 @@
     "less-vars-loader": "^1.1.0",
     "prettier": "1.19.1",
     "style-resources-loader": "^1.3.3",
+    "svg-sprite-loader": "^6.0.11",
     "vue-cli-plugin-style-resources-loader": "^0.1.4",
     "vue-template-compiler": "2.6.11"
   }

BIN
src/main/vue/src/assets/home_icon_redian.png


BIN
src/main/vue/src/assets/home_icon_redian2.png


BIN
src/main/vue/src/assets/icon-sosuo.png


BIN
src/main/vue/src/assets/icon_bar.png


+ 3 - 0
src/main/vue/src/assets/icons/index.js

@@ -0,0 +1,3 @@
+const requireAll = requireContext => requireContext.keys().map(requireContext);
+const req = require.context('./svg', false, /\.svg$/);
+requireAll(req);

+ 20 - 0
src/main/vue/src/assets/icons/svg/redian.svg

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="55px" height="16px" viewBox="0 0 55 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>home_icon_redian</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill-rule="evenodd">
+        <g id="首页-黑色" transform="translate(-26.000000, -386.000000)" fill-rule="nonzero">
+            <g id="编组" transform="translate(16.000000, 376.000000)">
+                <g id="编组-8" transform="translate(10.000000, 10.000000)">
+                    <g id="公告" transform="translate(28.280000, 2.920000)" fill="#FFFFFF">
+                        <path d="M9.506,0 L12.278,4.424 L10.164,4.424 L7.392,0 L9.506,0 Z M2.114,4.424 L0,4.424 L2.604,0 L4.718,0 L2.114,4.424 Z M10.052,5.488 L12.306,10.066 L10.108,10.066 L9.996,9.828 L0.896,9.828 L0.042,9.828 L3.64,3.724 L5.922,3.724 L2.982,8.47 L9.324,8.47 L7.84,5.488 L10.052,5.488 Z" id="形状"></path>
+                        <path d="M24.906,8.554 C24.906,8.76866667 24.8663333,8.967 24.787,9.149 C24.7076667,9.331 24.598,9.492 24.458,9.632 C24.318,9.772 24.1546667,9.88166667 23.968,9.961 C23.7813333,10.0403333 23.5806667,10.08 23.366,10.08 L13.496,10.08 L13.496,6.174 L24.906,6.174 L24.906,8.554 Z M23.142,7.378 L15.26,7.378 L15.26,8.89 L22.694,8.89 C22.8246667,8.89 22.932,8.848 23.016,8.764 C23.1,8.68 23.142,8.57733333 23.142,8.456 L23.142,7.378 Z M20.062,3.906 L25.186,3.906 L25.186,5.292 L12.894,5.292 L12.894,3.906 L18.116,3.906 L18.116,2.632 L14.742,2.632 L13.286,2.632 L14,0 L16.002,0 L15.666,1.232 L18.116,1.232 L18.116,0 L20.062,0 L20.062,1.232 L24.892,1.232 L24.892,2.632 L20.062,2.632 L20.062,3.906 Z" id="形状"></path>
+                    </g>
+                    <g id="新闻" transform="translate(2.294000, 2.878000)" >
+                        <path d="M0.014,0.448 L1.75,0.448 L1.568,0.028 L3.85,0.028 L4.032,0.448 L6.216,0.448 L6.216,1.834 L0.014,1.834 L0.014,0.448 Z M2.17,5.628 L2.17,4.774 L0.014,4.774 L0.014,3.388 L0.742,3.388 L0.238,2.198 L2.044,2.198 L2.548,3.388 L3.696,3.388 L4.186,2.198 L5.992,2.198 L5.488,3.388 L6.216,3.388 L6.216,4.774 L4.074,4.774 L4.074,5.628 L6.216,5.628 L6.216,7.014 L4.074,7.014 L4.074,8.806 C4.074,8.98333333 4.039,9.15133333 3.969,9.31 C3.899,9.46866667 3.80566667,9.60866667 3.689,9.73 C3.57233333,9.85133333 3.43233333,9.947 3.269,10.017 C3.10566667,10.087 2.93533333,10.122 2.758,10.122 L1.526,10.122 L1.89,9.156 L1.946,9.156 C2.09533333,9.156 2.17,9.08133333 2.17,8.932 L2.17,7.014 L0.014,7.014 L0.014,5.628 L2.17,5.628 Z M0,10.122 L0.294,7.546 L1.778,7.546 L1.484,10.122 L0,10.122 Z M4.452,7.546 L5.922,7.546 L6.216,10.122 L4.746,10.122 L4.452,7.546 Z M8.764,1.428 L8.764,2.8 L12.292,2.8 L12.292,3.99 L11.816,3.99 L11.816,10.108 L9.926,10.108 L9.926,3.99 L8.764,3.99 L8.764,8.932 L8.4,10.122 L6.51,10.122 L6.874,8.932 L6.874,1.54 L6.874,0.868 L6.874,0.35 L12.292,0.042 L12.292,1.232 L8.764,1.428 Z" id="形状"></path>
+                        <path d="M19.782,9.38 L19.782,8.428 L15.47,8.624 L15.47,7.616 L15.904,7.602 L15.904,3.682 L15.47,3.682 L15.47,2.674 L15.904,2.674 L17.724,2.674 L19.782,2.674 L21.602,2.674 L22.12,2.674 L22.12,3.682 L21.602,3.682 L21.602,7.336 L22.12,7.308 L22.12,8.316 L21.602,8.344 L21.602,9.38 L19.782,9.38 Z M17.724,5.866 L19.782,5.866 L19.782,5.278 L17.724,5.278 L17.724,5.866 Z M17.724,3.682 L17.724,4.27 L19.782,4.27 L19.782,3.682 L17.724,3.682 Z M19.782,7.42 L19.782,6.874 L17.724,6.874 L17.724,7.518 L19.782,7.42 Z M14.938,0 L17.234,0 L18.116,2.016 L15.834,2.016 L14.938,0 Z M25.06,8.61 C25.06,8.82466667 25.0203333,9.02533333 24.941,9.212 C24.8616667,9.39866667 24.752,9.562 24.612,9.702 C24.472,9.842 24.3086667,9.95166667 24.122,10.031 C23.9353333,10.1103333 23.7346667,10.15 23.52,10.15 L21.7,10.15 L22.232,8.946 L22.68,8.946 C22.8013333,8.946 22.9063333,8.904 22.995,8.82 C23.0836667,8.736 23.128,8.62866667 23.128,8.498 L23.128,1.61 L18.452,1.61 L18.452,0.238 L25.06,0.238 L25.06,8.61 Z M12.978,1.176 L14.924,1.176 L14.924,10.15 L12.978,10.15 L12.978,1.176 Z" id="形状"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 13 - 0
src/main/vue/src/assets/icons/svg/selected.svg

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon_gouxuan_pre</title>
+    <g id="暗色-新" stroke="none" stroke-width="1"  fill-rule="evenodd">
+        <g id="确认订单" transform="translate(-335.000000, -359.000000)">
+            <g id="编组-2" transform="translate(0.000000, 347.000000)">
+                <g id="icon/gouxuan_pre" transform="translate(335.000000, 12.000000)">
+                    <path d="M12,3 C16.9705627,3 21,7.02943725 21,12 C21,16.9705627 16.9705627,21 12,21 C7.02943725,21 3,16.9705627 3,12 C3,7.02943725 7.02943725,3 12,3 Z M16.1555861,9.48335676 C15.861615,9.25961888 15.4402153,9.28199267 15.1717299,9.55047812 L10.7519559,13.9691923 L8.80776884,12.0253519 L8.7309649,11.9582305 C8.43699375,11.7344926 8.01559412,11.7568664 7.74710866,12.0253519 C7.45421545,12.3182451 7.45421545,12.7931188 7.74710866,13.086012 L10.2219824,15.5608858 L10.2987863,15.6280071 C10.5927575,15.851745 11.0141571,15.8293712 11.2826426,15.5608858 L16.23239,10.6111383 L16.2995114,10.5343344 C16.5232493,10.2403632 16.5008755,9.81896357 16.23239,9.55047812 Z" id="形状结合"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 42 - 0
src/main/vue/src/components/SvgIcon.vue

@@ -0,0 +1,42 @@
+<template>
+    <svg :class="svgClass" aria-hidden="true">
+        <use :xlink:href="iconName"></use>
+    </svg>
+</template>
+
+<script>
+export default {
+    name: 'svg-icon',
+    props: {
+        iconClass: {
+            type: String,
+            required: true
+        },
+        className: {
+            type: String
+        }
+    },
+    computed: {
+        iconName() {
+            return `#icon-${this.iconClass}`;
+        },
+        svgClass() {
+            if (this.className) {
+                return 'svg-icon ' + this.className;
+            } else {
+                return 'svg-icon';
+            }
+        }
+    }
+};
+</script>
+
+<style scoped>
+.svg-icon {
+    width: 1em;
+    height: 1em;
+    vertical-align: -0.15em;
+    fill: currentColor;
+    overflow: hidden;
+}
+</style>

+ 171 - 30
src/main/vue/src/components/phone/Home.vue

@@ -1,6 +1,7 @@
 <template>
     <van-pull-refresh
         class="home"
+        :class="[`home-${theme}`]"
         success-text="加载成功"
         success-duration="500"
         v-model="isLoading"
@@ -12,6 +13,18 @@
         <img src="../../assets/theme3-bg.png" alt="" v-if="theme === 'theme3'" class="theme3-bg" />
         <div class="filter-bg" :style="{ backgroundImage: `url(${bgImg})` }"></div>
 
+        <van-sticky ref="top" v-if="theme === 'theme6'">
+            <div class="padding-safe-top">
+                <div class="top">
+                    <div class="search" @click="$router.push('/' + $route.params.companyId + '/productSearch')">
+                        <img src="../../assets/icon-sosuo.png" alt="" />
+                        <span>搜索你要的精彩</span>
+                    </div>
+                </div>
+            </div>
+        </van-sticky>
+
+        <div class="home-title" v-if="theme === 'theme6'">数字艺术品</div>
         <div class="welcom3" v-if="theme === 'theme3'">
             <van-image
                 width="38"
@@ -37,7 +50,7 @@
             <div class="mySwiper" :class="[`swiper-${theme}`]" ref="mySwiper">
                 <div class="swiper-wrapper">
                     <div class="swiper-slide" v-for="item in banners" :key="item.id">
-                        <product-small :info="item"></product-small>
+                        <banner-small :info="item"></banner-small>
                     </div>
                 </div>
                 <!-- 如果需要分页器 -->
@@ -52,35 +65,64 @@
                 fit="cover"
                 :src="companyInfo.logo || require('../../assets/img_default_photo.png')"
             ></van-image>
+            <div class="company-descript" v-if="theme === 'theme7'">
+                <div class="text1">{{ companyInfo.description }}</div>
+                <div class="text2">{{ companyInfo.name }}欢迎您</div>
+            </div>
         </div>
 
-        <div class="home-title">
-            <span>新闻公告</span>
+        <div class="news-notice" v-if="theme === 'theme6' || theme === 'theme7'">
+            <van-notice-bar :text="newsInfo.title">
+                <template #left-icon>
+                    <img src="../../assets/home_icon_redian.png" v-if="theme === 'theme6'" alt="" class="bar-icon" />
+                    <img src="../../assets/home_icon_redian2.png" v-else="theme === 'theme7'" alt="" class="bar-icon" />
+                </template>
+
+                <template #right-icon>
+                    <img src="../../assets/icon_bar.png" class="right-bar" alt="" />
+                </template>
+            </van-notice-bar>
+        </div>
+
+        <template v-else>
+            <div class="home-title">
+                <span>新闻公告</span>
 
-            <div class="title-more">
-                <span>更多</span>
-                <van-icon name="icon-icon_inter" class-prefix="font_family" />
+                <div class="title-more">
+                    <span>更多</span>
+                    <van-icon name="icon-icon_inter" class-prefix="font_family" />
+                </div>
             </div>
-        </div>
 
-        <div class="newsList">
-            <news-large v-for="(item, index) in news" :theme="theme" :key="index" :info="item.obj"></news-large>
-        </div>
+            <div class="newsList">
+                <news-large v-for="(item, index) in news" :theme="theme" :key="index" :info="item.obj"></news-large>
+            </div>
+        </template>
 
-        <div class="home-title">数字艺术品</div>
+        <div class="home-title" v-if="theme !== 'theme6'">数字艺术品</div>
 
         <!-- <div class="tabs" v-if="!empty">
             <div class="tab" :class="{ active: active === 0 }" @click="active = 0">数字藏品</div>
             <div class="tab" :class="{ active: active === 1 }" @click="active = 1">产品新闻端</div>
         </div> -->
         <div class="listSwiper">
-            <product-large
-                v-for="(item, index) in products"
-                :theme="theme"
-                :key="index"
-                :info="item.obj"
-                :type="item.type"
-            ></product-large>
+            <template v-for="(item, index) in products">
+                <template v-if="theme === 'theme6'">
+                    <product-small
+                        :key="`small_${index}`"
+                        :info="products[index].obj"
+                        :type="item.type"
+                    ></product-small>
+                </template>
+
+                <product-large
+                    v-if="theme !== 'theme6'"
+                    :theme="theme"
+                    :key="index"
+                    :info="item.obj"
+                    :type="item.type"
+                ></product-large>
+            </template>
         </div>
     </van-pull-refresh>
 </template>
@@ -95,6 +137,7 @@ import product from '../../mixins/product';
 import ProductLarge from './productLarge.vue';
 import NewsLarge from './NewsLarge.vue';
 import ProductSmall from './productSmall.vue';
+import BannerSmall from './bannerSmall.vue';
 import { mapState } from 'vuex';
 
 export default {
@@ -115,7 +158,8 @@ export default {
     components: {
         ProductLarge,
         ProductSmall,
-        NewsLarge
+        NewsLarge,
+        BannerSmall
     },
     computed: {
         ...mapState(['userInfo']),
@@ -142,6 +186,12 @@ export default {
                 }
             });
             return flag;
+        },
+        newsInfo() {
+            if (this.news.length > 0) {
+                return [...this.news][0].obj;
+            }
+            return {};
         }
     },
     data() {
@@ -373,17 +423,6 @@ export default {
     height: auto;
     z-index: -1;
 }
-.top {
-    display: flex;
-    padding: 9px 16px;
-    background-color: var(--bg);
-    display: flex;
-    align-items: center;
-    .logo {
-        width: 74px;
-        height: 26px;
-    }
-}
 
 .home {
     width: 100%;
@@ -395,6 +434,7 @@ export default {
     overflow-y: auto;
     max-height: 720px;
     overflow-x: hidden;
+    min-height: 800px;
     &::-webkit-scrollbar {
         display: none; /* Chrome Safari */
     }
@@ -464,6 +504,48 @@ export default {
     height: 160px;
     overflow: hidden;
 }
+
+.home-theme6 {
+    .large-logo {
+        padding: 4px 16px 16px;
+        border-radius: 0px;
+    }
+}
+
+.home-theme7 {
+    .large-logo {
+        padding: 0 0 48px;
+        height: 200px;
+        position: relative;
+    }
+
+    .company-descript {
+        background: var(--bg2);
+        position: absolute;
+        z-index: 2;
+        top: 150px;
+        color: var(--text1);
+        .flex-col();
+        align-items: center;
+        left: 16px;
+        right: 16px;
+        padding: 9px 0 22px;
+        box-shadow: 0px 2px 8px 0px rgba(255, 255, 255, 0.1);
+        .text1 {
+            font-size: 20px;
+            font-weight: bold;
+            line-height: 28px;
+            text-shadow: 0px 0px 4px rgba(0, 0, 0, 0.5);
+        }
+
+        .text2 {
+            font-size: 12px;
+            line-height: 17px;
+            text-shadow: 0px 0px 4px rgba(0, 0, 0, 0.5);
+            margin-top: 2px;
+        }
+    }
+}
 // .swiper-slide {
 //     width: 255px;
 // }
@@ -671,4 +753,63 @@ export default {
 .newsList {
     padding-bottom: 8px;
 }
+
+/deep/.news-notice {
+    padding: 0 16px 16px;
+    .van-notice-bar {
+        background-color: var(--bglight);
+        color: var(--info);
+        padding: 0 10px;
+        position: relative;
+        .bar-icon {
+            width: 55px;
+            height: 16px;
+            display: block;
+            margin-right: 17px;
+            color: var(--prim);
+        }
+
+        &::before {
+            content: '';
+            position: absolute;
+            width: 1px;
+            height: 10px;
+            background: rgba(255, 255, 255, 0.2);
+            left: 73px;
+            top: 50%;
+            transform: translateY(-50%);
+        }
+
+        .right-bar {
+            width: 18px;
+            height: 18px;
+            margin-left: 10px;
+        }
+    }
+}
+
+.top {
+    display: flex;
+    padding: 9px 16px;
+    background-color: var(--bg2);
+    display: flex;
+    align-items: center;
+
+    .search {
+        flex-grow: 1;
+        background-color: var(--bglight);
+        display: flex;
+        align-items: center;
+        padding: 4px 20px;
+        border-radius: 21px;
+        img {
+            width: 16px;
+            height: 16px;
+            margin-right: 10px;
+        }
+        font-size: 14px;
+        color: #939599;
+        line-height: 24px;
+    }
+}
 </style>

+ 81 - 0
src/main/vue/src/components/phone/bannerSmall.vue

@@ -0,0 +1,81 @@
+<template>
+    <div class="product">
+        <van-image width="100%" height="100%" :radius="30" :src="getImg(info.pic)" fit="cover" />
+
+        <!-- <div class="content">
+            <div class="name van-ellipsis">
+                {{ info.name }}
+            </div>
+            <div class="text van-ellipsis">
+                {{ info.remark }}
+            </div>
+        </div> -->
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: () => {
+                return {};
+            }
+        }
+    },
+    methods: {
+        getImg(imgs = '', type = '', size = 800) {
+            if (!imgs) {
+                imgs = '';
+            }
+            if (!(imgs instanceof Array)) {
+                imgs = imgs.split(',');
+            }
+
+            imgs = imgs.filter(item => {
+                return !!item;
+            });
+            if (imgs.length > 0) {
+                let img = type ? imgs[0][type] : imgs[0];
+                // console.log(img);
+                return img + (/\.gif$/i.test(img) ? '' : `?x-oss-process=image/resize,h_${size},m_lfit`);
+            } else {
+                return '';
+            }
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.product {
+    // width: 255px;
+    // margin: 8px;
+    width: 100%;
+    background-color: #fff;
+    display: inline-block;
+    border-radius: 30px;
+    overflow: hidden;
+    height: 100%;
+
+    .van-image {
+        overflow: hidden;
+        display: block;
+    }
+    .content {
+        padding: 6px 16px 10px;
+
+        .name {
+            font-size: 14px;
+            color: #ffffff;
+            line-height: 24px;
+        }
+
+        .text {
+            font-size: 12px;
+            color: #939599;
+            line-height: 20px;
+        }
+    }
+}
+</style>

+ 1 - 0
src/main/vue/src/components/phone/module.vue

@@ -60,6 +60,7 @@ export default {
         border-radius: 30px;
         overflow: hidden;
         box-sizing: border-box;
+        min-height: 100px;
     }
 }
 

+ 19 - 2
src/main/vue/src/components/phone/productLarge.vue

@@ -1,14 +1,13 @@
 <template>
     <div class="product" :class="[`product-${theme}`]">
         <van-image
-            :radius="30"
             width="100%"
             height="calc(354px - 32px)"
             v-if="type === 'collection'"
             :src="getImg(changeImgs(info.pic))"
             fit="cover"
         />
-        <van-image :radius="30" width="100%" height="calc(100% - 32px)" v-else :src="getImg(info.pic)" fit="cover" />
+        <van-image width="100%" height="calc(100% - 32px)" v-else :src="getImg(info.pic)" fit="cover" />
 
         <template v-if="type === 'collection'">
             <div class="content">
@@ -139,6 +138,9 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.product > .van-image {
+    border-radius: var(--product-radius);
+}
 .product {
     width: calc(100% - 32px);
     margin: 8px 16px;
@@ -147,6 +149,7 @@ export default {
     display: inline-block;
     border-radius: 30px;
     overflow: hidden;
+    border-radius: var(--product-radius);
 
     .bg {
         position: absolute;
@@ -303,4 +306,18 @@ export default {
         color: var(--danger);
     }
 }
+
+.product-theme7 {
+    position: relative;
+    .content {
+        position: absolute;
+        bottom: 10px;
+        left: 10px;
+        right: 10px;
+        z-index: 2;
+        background-color: var(--bglight);
+        border-radius: var(--product-radius);
+        backdrop-filter: blur(3px);
+    }
+}
 </style>

+ 194 - 32
src/main/vue/src/components/phone/productSmall.vue

@@ -1,46 +1,112 @@
 <template>
     <div class="product">
-        <van-image width="100%" height="100%" :radius="30" :src="getImg(info.pic)" fit="cover" />
+        <van-image width="120" height="120" :radius="2" :src="getImg(changeImgs(info.pic))" fit="cover" />
 
-        <!-- <div class="content">
-            <div class="name van-ellipsis">
-                {{ info.name }}
+        <div class="content">
+            <div class="name van-ellipsis">{{ info.name }}</div>
+            <div class="sales-list">
+                <div class="sales" v-if="info.category">
+                    <span>{{ info.category }}</span>
+                </div>
+                <div class="sales">
+                    <span class="sales-fir">限量</span>
+                    <span>{{ info.total }}份</span>
+                </div>
             </div>
-            <div class="text van-ellipsis">
-                {{ info.remark }}
+            <div class="flex1"></div>
+
+            <div class="bottom">
+                <div class="miner">
+                    <van-image width="18" height="18" radius="18" :src="getImg(info.minterAvatar)" fit="cover" />
+                    <span class="van-ellipsis">{{ info.minter }}</span>
+                </div>
+                <div class="price" v-if="info.salable">
+                    <van-icon name="icon-icon_jiage" class-prefix="font_family" />
+                    <span> {{ info.price }}</span>
+                </div>
+                <div v-else class="status">仅展示</div>
             </div>
-        </div> -->
+        </div>
+
+        <div class="sold xianliang" v-if="time && info.scheduleSale">
+            <van-icon name="icon-clock" class-prefix="font_family" />
+            <span>开售:{{ startTime || time }}</span>
+        </div>
+        <div class="sold" v-else-if="isSolded">
+            <van-icon name="icon-jinzhi" class-prefix="font_family" />
+            <span>已售罄</span>
+        </div>
+        <div class="sold" v-else-if="isSold">
+            <van-icon name="icon-info_icon_qianggouzhong" class-prefix="font_family" />
+            <span>即将售罄</span>
+        </div>
+        <div class="sold hot" v-else>
+            <van-icon name="icon-info_icon_qianggouzhong" class-prefix="font_family" />
+            <span>火爆抢购中…</span>
+        </div>
     </div>
 </template>
 
 <script>
+import { mapState } from 'vuex';
+import product from '../../mixins/product';
 export default {
+    mixins: [product],
     props: {
         info: {
             type: Object,
             default: () => {
                 return {};
             }
+        },
+        type: {
+            type: String,
+            default: 'collection'
         }
     },
-    methods: {
-        getImg(imgs = '', type = '', size = 800) {
-            if (!imgs) {
-                imgs = '';
-            }
-            if (!(imgs instanceof Array)) {
-                imgs = imgs.split(',');
+    computed: {
+        ...mapState(['theme']),
+        time() {
+            if (this.info.startTime) {
+                if (this.dayjs().isSameOrBefore(this.info.startTime, 'YYYY-MM-DD HH:mm:ss')) {
+                    return this.dayjs(this.info.startTime).format('MM月DD日');
+                }
             }
 
-            imgs = imgs.filter(item => {
-                return !!item;
-            });
-            if (imgs.length > 0) {
-                let img = type ? imgs[0][type] : imgs[0];
-                // console.log(img);
-                return img + (/\.gif$/i.test(img) ? '' : `?x-oss-process=image/resize,h_${size},m_lfit`);
+            return '';
+        }
+    },
+    mounted() {
+        if (this.info.startTime) {
+            var x = this.dayjs(this.info.startTime, 'YYYY-MM-DD HH:mm:ss');
+            var y = this.dayjs();
+            let d = this.dayjs.duration(x.diff(y));
+            let day = parseInt(d.asDays());
+            if (day <= 0) {
+                this.getTime(this.info.startTime);
+            }
+        }
+    },
+    methods: {
+        likeProduct() {
+            if (!this.info.liked) {
+                this.$http.get(`/collection/${this.info.id}/like`).then(() => {
+                    this.$emit('update:info', {
+                        ...this.info,
+                        liked: true,
+                        likes: this.info.likes + 1
+                    });
+                    this.$toast.success('收藏成功');
+                });
             } else {
-                return '';
+                this.$http.get(`/collection/${this.info.id}/unlike`).then(() => {
+                    this.$emit('update:info', {
+                        ...this.info,
+                        liked: false,
+                        likes: this.info.likes - 1
+                    });
+                    this.$toast.success('取消收藏');
+                });
             }
         }
     }
@@ -51,31 +117,127 @@ export default {
 .product {
     // width: 255px;
     // margin: 8px;
-    width: 100%;
-    background-color: #fff;
-    display: inline-block;
-    border-radius: 30px;
+    .flex();
+    align-items: stretch;
+
+    background-color: var(--bglight);
+    border-radius: 2px;
     overflow: hidden;
-    height: 100%;
+    margin: 8px 16px;
+    position: relative;
 
     .van-image {
         overflow: hidden;
         display: block;
+        flex-shrink: 0;
     }
     .content {
-        padding: 6px 16px 10px;
+        padding: 12px 12px 3px;
+        flex-grow: 1;
+        .flex-col();
+        overflow: hidden;
 
         .name {
             font-size: 14px;
-            color: #ffffff;
+            font-weight: bold;
+            color: var(--text1);
             line-height: 24px;
         }
 
-        .text {
+        .sales-list {
+            margin-top: 8px;
+            .flex();
+        }
+
+        .sales {
+            overflow: hidden;
             font-size: 12px;
-            color: #939599;
-            line-height: 20px;
+            border-radius: 2px;
+
+            span {
+                padding: 0 10px;
+                line-height: 20px;
+                height: 20px;
+                display: inline-block;
+                &.sales-fir {
+                    background: var(--prim);
+                    color: var(--text2);
+                }
+                background-color: var(--fadePrim);
+                color: var(--prim);
+            }
+        }
+        .sales + .sales {
+            margin-left: 14px;
         }
+
+        .bottom {
+            display: flex;
+            margin-top: 14px;
+            align-items: center;
+            overflow: hidden;
+            width: 100%;
+
+            .miner {
+                display: flex;
+                align-items: center;
+                margin-right: 6px;
+                overflow: hidden;
+                flex-grow: 1;
+
+                span {
+                    color: var(--info);
+                    font-size: 12px;
+                    margin-left: 6px;
+                }
+            }
+
+            .price {
+                flex-shrink: 0;
+                font-size: 28px;
+                color: var(--text1);
+                line-height: 20px;
+                font-family: OSP;
+                .flex();
+                .font_family {
+                    font-size: 8px;
+                    line-height: 16px;
+                    margin-top: 8px;
+                }
+            }
+        }
+    }
+}
+
+.status {
+    font-size: 14px;
+    color: var(--text1);
+}
+.sold {
+    background-color: var(--bglight);
+    font-size: 12px;
+    color: var(--info);
+    padding: 0 6px;
+    line-height: 24px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 3;
+    .flex();
+    .font_family {
+        margin-right: 2px;
+    }
+
+    &.preSold {
+        color: var(--danger);
+    }
+
+    &.xianliang {
+        color: var(--primlight);
+    }
+
+    &.hot {
+        color: var(--danger);
     }
 }
 </style>

+ 3 - 0
src/main/vue/src/main.js

@@ -21,6 +21,8 @@ import ObjectUpload from '@/components/ObjectUpload';
 import CollectionSearch from '@/components/CollectionSearch';
 import CollectionCoupon from '@/components/CollectionCoupon';
 import CreatedAtPicker from '@/components/CreatedAtPicker';
+import SvgIcon from '@/components/SvgIcon.vue';
+import '@/assets/icons';
 import { mapGetters } from 'vuex';
 import Vant from 'vant';
 import queryString from 'query-string';
@@ -65,6 +67,7 @@ Vue.component('file-upload', FileUpload);
 Vue.component('video-upload', VideoUpload);
 Vue.component('rich-text', RichText);
 Vue.component('crop-upload', CropUpload);
+Vue.component('svg-icon', SvgIcon)
 Vue.component('district-choose', DistrictChoose);
 Vue.component('page-title', PageTitle);
 Vue.component('minter-select', MinterSelect);

+ 61 - 0
src/main/vue/src/styles/theme.less

@@ -12,6 +12,7 @@
     --bg3:#272b2e;
     --text1:#fff;
     --text2:#000;
+    --product-radius:30px;
 }
 
 .theme2 {
@@ -28,6 +29,7 @@
     --bg3:#272b2e;
     --text1:#fff;
     --text2:#000;
+    --product-radius:30px;
     --van-primary-color: var(--prim);
     --van-tabbar-item-active-color: var(--prim);
     --van-tabs-default-color: var(--prim);
@@ -54,6 +56,7 @@
     --bg3:#272b2e;
     --text1:#fff;
     --text2:#000;
+    --product-radius:30px;
     --van-primary-color: var(--prim);
     --van-tabbar-item-active-color: var(--prim);
     --van-tabs-default-color: var(--prim);
@@ -81,6 +84,7 @@
     --bg3:#fff;
     --text1:#000;
     --text2:#fff;
+    --product-radius:30px;
     --van-primary-color: var(--prim);
     --van-tabbar-item-active-color: var(--prim);
     --van-tabs-default-color: var(--prim);
@@ -108,6 +112,63 @@
     --bg3:#1C1C1C;
     --text1:#fff;
     --text2:#000;
+    --product-radius:30px;
+    --van-primary-color: var(--prim);
+    --van-tabbar-item-active-color: var(--prim);
+    --van-tabs-default-color: var(--prim);
+    --van-tabs-bottom-bar-color: var(--prim);
+    --van-tab-active-text-color: var(--prim);
+    --van-field-error-message-color: var(--prim);
+    --van-button-primary-background-color: var(--prim);
+    --van-button-primary-border-color: var(--prim);
+    --van-number-keyboard-button-background-color: var(--prim);
+    --van-button-primary-background-color:var(--prim);
+}
+
+
+.theme6 {
+    --prim: #FFE196;
+    --fadePrim: #2D2B25;
+    --darkPrim: #FFE196;
+    --primlight: #FFB600;
+    --btnText: #000;
+    --bglight:#1C1C1C;
+    --danger:#FF4F50;
+    --info:#60616D;
+    --bg:#181818;
+    --bg2:#000000;
+    --bg3:#272b2e;
+    --text1:#fff;
+    --text2:#000;
+    --product-radius:2px;
+    --van-primary-color: var(--prim);
+    --van-tabbar-item-active-color: var(--prim);
+    --van-tabs-default-color: var(--prim);
+    --van-tabs-bottom-bar-color: var(--prim);
+    --van-tab-active-text-color: var(--prim);
+    --van-field-error-message-color: var(--prim);
+    --van-button-primary-background-color: var(--prim);
+    --van-button-primary-border-color: var(--prim);
+    --van-number-keyboard-button-background-color: var(--prim);
+    --van-button-primary-background-color:var(--prim);
+}
+
+
+.theme7 {
+    --prim: #D3FA51;
+    --fadePrim: #2D2B25;
+    --darkPrim: #D3FA51;
+    --primlight: #7CD400;
+    --btnText: #000;
+    --bglight:#1C1C1C;
+    --danger:#FF4F50;
+    --info:#60616D;
+    --bg:#181818;
+    --bg2:#000000;
+    --bg3:#272b2e;
+    --text1:#fff;
+    --text2:#000;
+    --product-radius:2px;
     --van-primary-color: var(--prim);
     --van-tabbar-item-active-color: var(--prim);
     --van-tabs-default-color: var(--prim);

+ 24 - 4
src/main/vue/src/views/company/CompanyTheme.vue

@@ -21,12 +21,27 @@
                             <el-form-item prop="logo" label="LOGO">
                                 <single-upload v-model="formData.logo"></single-upload>
                             </el-form-item>
+
+                            <el-form-item prop="description" label="描述">
+                                <el-input type="textarea" v-model="formData.description"></el-input>
+                            </el-form-item>
+
                             <el-form-item label="选择主题">
-                                <el-radio-group v-model="formData.theme">
+                                <!-- <el-radio-group v-model="formData.theme">
                                     <el-radio :label="item.value" v-for="(item, index) in themeOptions" :key="index">
                                         {{ item.label }}
                                     </el-radio>
-                                </el-radio-group>
+                                </el-radio-group> -->
+
+                                <el-select v-model="formData.theme" placeholder="请选择">
+                                    <el-option
+                                        v-for="item in themeOptions"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value"
+                                    >
+                                    </el-option>
+                                </el-select>
                             </el-form-item>
 
                             <el-form-item class="form-submit">
@@ -120,6 +135,7 @@ export default {
                 this.formData.logo = res.logo;
                 this.formData.bgImg = res.bgImg;
                 this.formData.bgColor = res.bgColor;
+                this.formData.description = res.description;
             }
         });
     },
@@ -128,6 +144,7 @@ export default {
             saving: false,
             formData: {
                 theme: 'theme1',
+                description: '',
                 logo: '',
                 bgImg: '',
                 bgColor: ''
@@ -138,7 +155,9 @@ export default {
                 { label: '主题2', value: 'theme2' },
                 { label: '主题3', value: 'theme3' },
                 { label: '主题4', value: 'theme4' },
-                { label: '主题5', value: 'theme5' }
+                { label: '主题5', value: 'theme5' },
+                { label: '主题6', value: 'theme6' },
+                { label: '主题7', value: 'theme7' }
             ],
             settings: [],
             collections: [],
@@ -163,7 +182,8 @@ export default {
                         theme: this.formData.theme,
                         logo: this.formData.logo,
                         bgImg: this.formData.bgImg,
-                        bgColor: this.formData.bgColor
+                        bgColor: this.formData.bgColor,
+                        description: this.formData.description
                     },
                     { body: 'json' }
                 )

+ 16 - 0
src/main/vue/vue.config.js

@@ -14,5 +14,21 @@ module.exports = {
         if (process.env.NODE_ENV === 'development') {
             config.output.filename('[name].[hash].js').end();
         }
+
+        const dir = path.resolve(__dirname, './src/assets/icons');
+
+        config.module
+            .rule('svg-sprite')
+            .test(/\.svg$/)
+            .include.add(dir)
+            .end()
+            .use('svg-sprite-loader')
+            .loader('svg-sprite-loader')
+            .options({ extract: false })
+            .end();
+
+        config.plugin('svg-sprite').use(require('svg-sprite-loader/plugin'), [{ plainSprite: true }]);
+
+        config.module.rule('svg').exclude.add(dir);
     }
 };

+ 237 - 15
src/main/vue/yarn.lock

@@ -1955,6 +1955,11 @@ ansi-regex@^5.0.1:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
   integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
 
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+  integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
+
 ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -2304,7 +2309,7 @@ bindings@^1.5.0:
   dependencies:
     file-uri-to-path "1.0.0"
 
-bluebird@^3.1.1, bluebird@^3.5.5:
+bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.5:
   version "3.7.2"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
   integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@@ -2362,7 +2367,7 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
-braces@^2.3.1, braces@^2.3.2:
+braces@^2.2.2, braces@^2.3.1, braces@^2.3.2:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
   integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
@@ -2648,6 +2653,17 @@ cfb@^1.1.4:
     adler-32 "~1.3.0"
     crc-32 "~1.2.0"
 
+chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
 chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@@ -3426,6 +3442,11 @@ deep-equal@^1.0.1:
     object-keys "^1.1.1"
     regexp.prototype.flags "^1.2.0"
 
+deepmerge@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050"
+  integrity sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==
+
 deepmerge@^1.2.0, deepmerge@^1.5.2:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
@@ -3611,7 +3632,7 @@ domain-browser@^1.1.1:
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
   integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
 
-domelementtype@1:
+domelementtype@1, domelementtype@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
   integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
@@ -3621,6 +3642,13 @@ domelementtype@^2.0.1, domelementtype@^2.2.0:
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
   integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
 
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+  dependencies:
+    domelementtype "1"
+
 domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
   version "4.3.1"
   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
@@ -3628,7 +3656,12 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
   dependencies:
     domelementtype "^2.2.0"
 
-domutils@^1.7.0:
+domready@1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/domready/-/domready-1.0.8.tgz#91f252e597b65af77e745ae24dd0185d5e26d58c"
+  integrity sha512-uIzsOJUNk+AdGE9a6VDeessoMCzF8RrZvJCX/W8QtyfgdR6Uofn/MvRonih3OtCO79b2VDzDOymuiABrQ4z3XA==
+
+domutils@^1.5.1, domutils@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
   integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
@@ -3788,6 +3821,11 @@ enhanced-resolve@^4.5.0:
     memory-fs "^0.5.0"
     tapable "^1.0.0"
 
+entities@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+  integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
 entities@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
@@ -3867,7 +3905,7 @@ escape-html@~1.0.3:
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
   integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
 
-escape-string-regexp@^1.0.5:
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
@@ -4051,7 +4089,7 @@ extend@~3.0.2:
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
-extglob@^2.0.4:
+extglob@^2.0.2, extglob@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
   integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
@@ -4501,11 +4539,23 @@ har-validator@~5.1.3:
     ajv "^6.12.3"
     har-schema "^2.0.0"
 
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==
+  dependencies:
+    ansi-regex "^2.0.0"
+
 has-bigints@^1.0.1, has-bigints@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
   integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
 
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+  integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==
+
 has-flag@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -4600,7 +4650,7 @@ hash.js@^1.0.0, hash.js@^1.0.3:
     inherits "^2.0.3"
     minimalistic-assert "^1.0.1"
 
-he@1.2.x, he@^1.1.0:
+he@1.2.x, he@^1.1.0, he@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
   integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
@@ -4695,6 +4745,18 @@ html-webpack-plugin@^3.2.0:
     toposort "^1.0.0"
     util.promisify "1.0.0"
 
+htmlparser2@^3.8.3:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+  integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+  dependencies:
+    domelementtype "^1.3.1"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^3.1.1"
+
 htmlparser2@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
@@ -4819,7 +4881,7 @@ ignore@^4.0.3:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-image-size@~0.5.0:
+image-size@^0.5.1, image-size@~0.5.0:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
   integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
@@ -5162,7 +5224,7 @@ is-path-inside@^2.1.0:
   dependencies:
     path-is-inside "^1.0.2"
 
-is-plain-obj@^1.0.0:
+is-plain-obj@^1.0.0, is-plain-obj@^1.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
   integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
@@ -5267,7 +5329,7 @@ isexe@^2.0.0:
   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
   integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
 
-isobject@^2.0.0:
+isobject@^2.0.0, isobject@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
   integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
@@ -5296,6 +5358,11 @@ jdenticon@^3.1.0:
   dependencies:
     canvas-renderer "~2.2.0"
 
+js-base64@^2.1.9:
+  version "2.6.4"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
+  integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
 js-message@1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47"
@@ -5407,7 +5474,7 @@ kind-of@^4.0.0:
   dependencies:
     is-buffer "^1.1.5"
 
-kind-of@^5.0.0:
+kind-of@^5.0.0, kind-of@^5.0.2:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
   integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
@@ -5671,6 +5738,13 @@ merge-descriptors@1.0.1:
   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
   integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
 
+merge-options@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-1.0.1.tgz#2a64b24457becd4e4dc608283247e94ce589aa32"
+  integrity sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==
+  dependencies:
+    is-plain-obj "^1.1"
+
 merge-source-map@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
@@ -5693,6 +5767,25 @@ methods@~1.1.2:
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
   integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
 
+micromatch@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.0.tgz#5102d4eaf20b6997d6008e3acfe1c44a3fa815e2"
+  integrity sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.2.2"
+    define-property "^1.0.0"
+    extend-shallow "^2.0.1"
+    extglob "^2.0.2"
+    fragment-cache "^0.2.1"
+    kind-of "^5.0.2"
+    nanomatch "^1.2.1"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
 micromatch@^3.1.10, micromatch@^3.1.4:
   version "3.1.10"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -5815,6 +5908,11 @@ mississippi@^3.0.0:
     stream-each "^1.1.0"
     through2 "^2.0.0"
 
+mitt@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.2.tgz#380e61480d6a615b660f07abb60d51e0a4e4bed6"
+  integrity sha512-3btxP0O9iGADGWAkteQ8mzDtEspZqu4I32y4GZYCV5BrwtzdcRpF4dQgNdJadCrbBx7Lu6Sq9AVrerMHR0Hkmw==
+
 mixin-deep@^1.2.0:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
@@ -5889,7 +5987,7 @@ nan@^2.12.1:
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916"
   integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==
 
-nanomatch@^1.2.9:
+nanomatch@^1.2.1, nanomatch@^1.2.9:
   version "1.2.13"
   resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
   integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
@@ -6759,6 +6857,11 @@ postcss-ordered-values@^4.1.2:
     postcss "^7.0.0"
     postcss-value-parser "^3.0.0"
 
+postcss-prefix-selector@^1.6.0:
+  version "1.16.0"
+  resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz#ad5b56f9a73a2c090ca7161049632c9d89bcb404"
+  integrity sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==
+
 postcss-reduce-initial@^4.0.3:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
@@ -6824,6 +6927,16 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
 
+postcss@^5.2.17:
+  version "5.2.18"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+  integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
+  dependencies:
+    chalk "^1.1.3"
+    js-base64 "^2.1.9"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
+
 postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6:
   version "7.0.39"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
@@ -6832,6 +6945,44 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.3
     picocolors "^0.2.1"
     source-map "^0.6.1"
 
+posthtml-parser@^0.2.0, posthtml-parser@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz#35d530de386740c2ba24ff2eb2faf39ccdf271dd"
+  integrity sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==
+  dependencies:
+    htmlparser2 "^3.8.3"
+    isobject "^2.1.0"
+
+posthtml-rename-id@^1.0:
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz#cf7f6eb37146bf1afac31e68f18c6cc19ae61433"
+  integrity sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==
+  dependencies:
+    escape-string-regexp "1.0.5"
+
+posthtml-render@^1.0.5, posthtml-render@^1.0.6:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.4.0.tgz#40114070c45881cacb93347dae3eff53afbcff13"
+  integrity sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==
+
+posthtml-svg-mode@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz#abd554face81223cab0cb367e18e4efd2a4e74b0"
+  integrity sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==
+  dependencies:
+    merge-options "1.0.1"
+    posthtml "^0.9.2"
+    posthtml-parser "^0.2.1"
+    posthtml-render "^1.0.6"
+
+posthtml@^0.9.2:
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.9.2.tgz#f4c06db9f67b61fd17c4e256e7e3d9515bf726fd"
+  integrity sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==
+  dependencies:
+    posthtml-parser "^0.2.0"
+    posthtml-render "^1.0.5"
+
 prepend-http@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
@@ -6984,7 +7135,7 @@ qs@~6.5.2:
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
   integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
 
-query-string@^4.1.0:
+query-string@^4.1.0, query-string@^4.3.2:
   version "4.3.4"
   resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
   integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==
@@ -7083,7 +7234,7 @@ read-pkg@^5.1.1:
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-readable-stream@^3.0.6, readable-stream@^3.6.0:
+readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
   integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -7888,7 +8039,7 @@ string_decoder@~1.1.1:
   dependencies:
     safe-buffer "~5.1.0"
 
-strip-ansi@^3.0.1:
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
   integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
@@ -7943,6 +8094,18 @@ stylehacks@^4.0.0:
     postcss "^7.0.0"
     postcss-selector-parser "^3.0.0"
 
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+  integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==
+
+supports-color@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==
+  dependencies:
+    has-flag "^1.0.0"
+
 supports-color@^5.3.0:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -7969,6 +8132,48 @@ supports-preserve-symlinks-flag@^1.0.0:
   resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
   integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
 
+svg-baker-runtime@^1.4.7:
+  version "1.4.7"
+  resolved "https://registry.yarnpkg.com/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz#f4720637f5b6202eef6378d81f1fead0815f8a4e"
+  integrity sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==
+  dependencies:
+    deepmerge "1.3.2"
+    mitt "1.1.2"
+    svg-baker "^1.7.0"
+
+svg-baker@^1.5.0, svg-baker@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/svg-baker/-/svg-baker-1.7.0.tgz#8367f78d875550c52fe4756f7303d5c5d7c2e9a7"
+  integrity sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==
+  dependencies:
+    bluebird "^3.5.0"
+    clone "^2.1.1"
+    he "^1.1.1"
+    image-size "^0.5.1"
+    loader-utils "^1.1.0"
+    merge-options "1.0.1"
+    micromatch "3.1.0"
+    postcss "^5.2.17"
+    postcss-prefix-selector "^1.6.0"
+    posthtml-rename-id "^1.0"
+    posthtml-svg-mode "^1.0.3"
+    query-string "^4.3.2"
+    traverse "^0.6.6"
+
+svg-sprite-loader@^6.0.11:
+  version "6.0.11"
+  resolved "https://registry.yarnpkg.com/svg-sprite-loader/-/svg-sprite-loader-6.0.11.tgz#a4d60cee3d74232a2c17d31c73a2008295f61220"
+  integrity sha512-TedsTf8wsHH6HgdwKjUveDZRC6q5gPloYV8A8/zZaRWP929J7x6TzQ6MvZFl+YYDJuJ0Akyuu/vNVJ+fbPuYXg==
+  dependencies:
+    bluebird "^3.5.0"
+    deepmerge "1.3.2"
+    domready "1.0.8"
+    escape-string-regexp "1.0.5"
+    loader-utils "^1.1.0"
+    svg-baker "^1.5.0"
+    svg-baker-runtime "^1.4.7"
+    url-slug "2.0.0"
+
 svg-tags@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
@@ -8153,6 +8358,11 @@ tough-cookie@~2.5.0:
     psl "^1.1.28"
     punycode "^2.1.1"
 
+traverse@^0.6.6:
+  version "0.6.7"
+  resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe"
+  integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==
+
 tryer@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
@@ -8249,6 +8459,11 @@ unicode-property-aliases-ecmascript@^2.0.0:
   resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
   integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
 
+unidecode@0.1.8:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/unidecode/-/unidecode-0.1.8.tgz#efbb301538bc45246a9ac8c559d72f015305053e"
+  integrity sha512-SdoZNxCWpN2tXTCrGkPF/0rL2HEq+i2gwRG1ReBvx8/0yTzC3enHfugOf8A9JBShVwwrRIkLX0YcDUGbzjbVCA==
+
 union-value@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
@@ -8353,6 +8568,13 @@ url-parse@^1.5.10:
     querystringify "^2.1.1"
     requires-port "^1.0.0"
 
+url-slug@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/url-slug/-/url-slug-2.0.0.tgz#a789d5aed4995c0d95af33377ad1d5c68d4d7027"
+  integrity sha512-aiNmSsVgrjCiJ2+KWPferjT46YFKoE8i0YX04BlMVDue022Xwhg/zYlnZ6V9/mP3p8Wj7LEp0myiTkC/p6sxew==
+  dependencies:
+    unidecode "0.1.8"
+
 url@^0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"