Authored by yyq

save

... ... @@ -60,7 +60,7 @@
import {Scroll, Sticky, Loading} from 'cube-ui';
import CubeStickyEle from 'cube-ui/src/components/sticky/sticky-ele.vue';
import FavTabBlock from './components/fav-tab-block';
import WaterFall from './components/water-fall';
import WaterFall from './components/scroll-reveal';
import {createNamespacedHelpers} from 'vuex';
const {mapActions} = createNamespacedHelpers('user');
... ... @@ -120,13 +120,11 @@
}
},
activated() {
console.log('activated');
if (this.$route.params.id !== this.autherInfo.authorUid) {
this.init(this.$route.params);
}
},
beforeRouteUpdate(to, from, next) {
console.log('beforeRouteUpdate');
if (this.$route.params.id !== to.params.labelId) {
this.init(to.params);
}
... ... @@ -207,7 +205,7 @@
this._listTimer && clearTimeout(this._listTimer);
this._listTimer = setTimeout(() => {
this.fetchList();
}, 100);
}, 50);
}
},
changeTab(index) {
... ... @@ -256,6 +254,7 @@
if (this[syncServiceName]) {
this.syncing = true;
result = await this[syncServiceName](assign({
limit: 20,
page: info.page,
lastedTime: info.lastedTime || ''
}, this.autherInfo));
... ...
<template>
<div class="author-page">
<LayoutHeader class="fix-header" theme="white">
<div ref="headerAuthor" class="header-author">
<div class="h-name flex">{{baseData.nickName}}</div>
<div class="h-more">
<div class="flex">
<WidgetAvatar v-if="baseData.headIco" class="h-headico" :src="baseData.headIco" :width="100" :height="100"></WidgetAvatar>
</div>
<div v-if="!isOwner" class="h-follow flex">
<WidgetFollow class="widget-follow" :author-uid="autherInfo.authorUid" :follow="isAttention" @on-follow="follow => onFollow(follow)"></WidgetFollow>
</div>
</div>
</div>
</LayoutHeader>
<div class="main-content">
<div ref="authorProfile" class="author-profile">
<span class="avatar-box">
<WidgetAvatar v-if="baseData.headIco" :src="baseData.headIco" :width="100" :height="100"></WidgetAvatar>
</span>
<div class="author-section">
<ul class="author-fans">
<li v-for="(item, key) in fansList" :key="key">
<span class="num">{{baseData[key] || 0}}</span>
<p class="name"><span>{{item}}</span></p>
</li>
</ul>
<div class="operate-wrap">
<router-link v-if="isOwner" class="operate-btn btn-user-edit" to="//m.yohobuy.com/home/mydetails?openby:yohobuy={'action':'go.mineinfo'}">编辑个人资料</router-link>
<WidgetFollow v-else class="operate-btn" :author-uid="autherInfo.authorUid" :follow="isAttention" @on-follow="follow => onFollow(follow)"></WidgetFollow>
</div>
</div>
</div>
<p v-if="baseData.signature" class="author-desc">{{baseData.signature}}</p>
<FavTabBlock :tabs-num="tabsNum" :active-index="activeIndex" @change="changeTab"></FavTabBlock>
<div class="contant-list">
<WaterFall class="pannel-wrap" :list="list" :pos="scrollY" :query="linkQueryString"></WaterFall>
</div>
<div v-if="loadStatus" class="loading">
<Loading v-if="loadStatus === 1" class="load-icon" :size="20"></Loading>
<p v-else class="load-text">没有更多了</p>
</div>
</div>
</div>
</template>
<script>
import {assign, get} from 'lodash';
import {Scroll, Sticky, Loading} from 'cube-ui';
import CubeStickyEle from 'cube-ui/src/components/sticky/sticky-ele.vue';
import FavTabBlock from './components/fav-tab-block';
import WaterFall from './components/scroll-reveal';
import {createNamespacedHelpers} from 'vuex';
const {mapActions} = createNamespacedHelpers('user');
export default {
name: 'userpage',
data() {
return {
autherInfo: {},
scrollEvents: ['scroll'],
scrollY: 0,
fansList: {
attCount: '关注',
fansCount: '粉丝',
praiseAndfavorite: '获赞与收藏'
},
baseData: {},
isAttention: false,
isOwner: false,
tabsNum: [0, 0],
activeIndex: 0,
fetchInfo: {},
loadStatus: ''
}
},
mounted() {
let $dom = this.$refs.headerAuthor;
if (!this.$route.params.id) {
try {
this.$sdk.getUser().then(res => {
if (get(res, 'uid') > 0) {
this.$route.params.id = res.uid;
this.autherInfo = assign({}, this.autherInfo, {
authorUid: res.uid
});
} else {
this.$sdk.goLogin();
}
});
} catch(e){
console.log(e);
}
}
if ($dom.offsetHeight) {
this._animeDuration = 300;
import('animejs').then(({default: anime}) => {
this._animeEl = anime({
targets: $dom,
translateY: -$dom.offsetHeight,
easing: 'easeInOutSine',
duration: this._animeDuration,
autoplay: false
});
});
}
window.onscroll = (e) => {
this.scrollHandler(document.documentElement.scrollTop || document.body.scrollTop);
}
},
activated() {
if (this.$route.params.id !== this.autherInfo.authorUid) {
this.init(this.$route.params);
}
},
beforeRouteUpdate(to, from, next) {
if (this.$route.params.id !== to.params.labelId) {
this.init(to.params);
}
next();
},
watch: {
scrollY(top) {
let animePlayed = false;
if (top > this.$refs.authorProfile.offsetHeight) {
animePlayed = true;
}
if (!this._animePlayed === !animePlayed) {
return;
}
let start;
let self = this;
function step(timestamp) {
if (!start) {
start = timestamp
};
let progress = Math.floor(timestamp - start);
self._animeEl.seek(animePlayed ? progress : self._animeDuration - progress);
if (progress < self._animeDuration) {
window.requestAnimationFrame(step);
}
};
window.requestAnimationFrame(step);
this._animePlayed = animePlayed;
}
},
computed: {
list() {
return get(this.fetchInfo, `${this.activeIndex}.list`) || [];
},
linkQueryString() {
return assign({}, this.autherInfo, {
type: ['publish', 'fav'][this.activeIndex]
})
},
linkTpl() {
return `/grass/article/{articleId}?authorUid=${this.autherInfo.authorUid}&authorType=${this.autherInfo.authorType}&type=${['publish', 'fav'][this.activeIndex]}`;
},
waterFallType() {
return ['publish', 'fav'][this.activeIndex];
}
},
methods: {
...mapActions(['autherBaseInfo', 'autherAritcleNum', 'autherPubList', 'autherFavList', 'autherMineBaseInfo', 'autherMineAritcleNum', 'autherMinePubList', 'autherMineFavList']),
init(params) {
params = params || {};
this._apiNamePre = 'auther';
if (!params.id) {
this._apiNamePre += 'Mine';
}
this.autherInfo = {
authorUid: params.id,
authorType: params.type || 1
};
this.fetchBaseInfo();
this.fetchList();
},
scrollHandler(y) {
this.scrollY = y;
if (this.scrollY + 1000 > this.$el.offsetHeight) {
this._listTimer && clearTimeout(this._listTimer);
this._listTimer = setTimeout(() => {
this.fetchList();
}, 50);
}
},
changeTab(index) {
if (this.activeIndex !== index) {
this.activeIndex = index;
this.fetchList();
}
},
fetchBaseInfo() {
this[this._apiNamePre + 'BaseInfo'](this.autherInfo).then(res => {
if (res.code === 200) {
this.baseData = res.data;
this.isOwner = +res.data.userType === 1;
this.isAttention = res.data.hasAttention === 'Y';
}
});
this[this._apiNamePre + 'AritcleNum'](this.autherInfo).then(res => {
this.tabsNum = [get(res, 'data.articleCount'), get(res, 'data.favoriteCount')];
});
},
async fetchList() {
this.fetchInfo = this.fetchInfo || [];
if (this.syncing) {
return;
}
let info = this.fetchInfo[this.activeIndex] || {};
let result;
info.page = info.page || 1;
if (info.page > info.totalPage) {
return;
}
let syncServiceName;
if (this.activeIndex === 1) {
syncServiceName = this._apiNamePre + 'FavList';
} else {
syncServiceName = this._apiNamePre + 'PubList';
}
if (this[syncServiceName]) {
this.syncing = true;
result = await this[syncServiceName](assign({
limit: 20,
page: info.page,
lastedTime: info.lastedTime || ''
}, this.autherInfo));
this.syncing = false;
}
if (result.code === 200) {
info.list = (info.list || []).concat(result.data.list || []);
info.page++;
info.totalPage = result.data.totalPage;
info.lastedTime = result.data.lastedTime;
if (info.list.length) {
info.list[0]._type = `${info.list[0].articleId}_${this.activeIndex}`;
}
}
if (info.page > info.totalPage) {
this.loadStatus = 2;
} else {
this.loadStatus = 1;
}
this.fetchInfo[this.activeIndex] = info;
this.fetchInfo = {...this.fetchInfo};
},
goUserInfoEdit() {
if (this.$yoho.isYohoBuy) {
this.$yoho.goMineInfo();
}
},
onFollow(follow) {
this.isAttention = follow;
}
},
components: {
CubeScroll: Scroll,
CubeSticky: Sticky,
CubeStickyEle,
Loading,
FavTabBlock,
WaterFall
}
};
</script>
<style lang="scss">
.author-page {
box-sizing: border-box;
color: #4a4a4a;
padding-top: 40PX;
}
.fix-header {
position: fixed;
top: 0;
z-index: 100;
}
.main-content {
width: 100%;
height: 100%;
overflow: scroll;
}
.header-author {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
.flex {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.h-name {
font-size: 36px;
font-weight: 500;
}
.h-more {
width: 100%;
height: 100%;
position: absolute;
top: 100%;
left: 0;
}
.h-headico {
width: 60px;
height: 60px;
}
.h-follow {
position: absolute;
top: 0;
right: -130px;
}
}
.header-share {
margin-right: 26px;
color: #222;
font-weight: bold;
}
.author-profile {
padding: 24px 30px;
display: flex;
justify-content: space-between;
overflow: hidden;
.avatar-box {
width: 150px;
height: 150px;
overflow: hidden;
border-radius: 50%;
> img {
width: 100%;
height: 100%;
display: block;
}
}
}
.author-section {
display: flex;
flex-direction: column;
justify-content: space-between;
}
.author-fans {
display: flex;
justify-content: flex-end;
padding-top: 4px;
padding-right: 54px;
li {
margin-left: 140px;
position: relative;
&:first-child {
margin-left: 0;
}
.num {
font-size: 28px;
font-weight: 500;
padding-bottom: 6px;
display: block;
}
.name {
position: absolute;
font-size: 20px;
font-weight: 300;
color: #9b9b9b;
margin-left: 50%;
word-break: keep-all;
white-space: nowrap;
> * {
position: relative;
left: -50%;
}
}
}
}
.operate-wrap {
text-align: right;
.operate-btn {
width: calc(100% - 20px);
font-size: 23px;
line-height: 48px;
display: inline-block;
}
.btn-user-edit {
color: #222;
border: 1px solid #4a4a4a;
border-radius: 8px;
text-align: center;
}
}
.author-desc {
margin: 20px 30px;
font-size: 24px;
font-weight: 300;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.loading {
padding: 20px 0;
.load-icon > span {
margin: auto;
}
.load-text {
text-align: center;
}
}
</style>
... ...
<template>
<div class="wf-item" :class="temporary ? 'wf-temp' : ''" @click="onClick">
<div v-if="temporary"></div>
<div v-else class="wf-item-mid">
<div class="layer-image" :style="`height: ${data.blockWidth * data.scale}px`">
<ImageFormat :mode="1" :src="data.coverImage" :width="imgWidth" :height="Math.floor(data.scale * imgWidth)"></ImageFormat>
</div>
<div v-if="data.content" class="description">
<p>{{data.content}}</p>
</div>
<div class="attribution">
<div class="auther">
<span class="avatar">
<WidgetAvatar :src="data.authorHeadIco" :width="70" :height="70"></WidgetAvatar>
</span>
<span class="name">{{data.authorName}}</span>
</div>
<div class="fav">
<WidgetFav :articleId="data.articleId" :num="data.praiseCount" :option="favOption"></WidgetFav>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
imgWidth: 350,
favOption: {
iconFontSize: 26,
textAlign: 'normal'
}
}
},
props: {
data: {
type: Object,
default() {
return {};
}
},
temporary: {
type: Boolean,
default: false
}
},
methods: {
onClick() {
this.$emit('click', this.data);
}
}
};
</script>
<style lang="css">
.wf-item {
width: 100%;
padding: 10px;
font-size: 24px;
overflow: hidden;
.wf-item-mid {
border-radius: 4px;
box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.15);
overflow: hidden;
}
.layer-image {
background-color: #f4f4f4;
min-height: 100px;
> img {
width: 100%;
height: 100%;
display: block;
}
}
.description {
line-height: 1.5;
padding: 10px 20px;
> p {
word-break: break-all;
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
}
.attribution {
display: flex;
justify-content: space-between;
padding: 20px;
}
.avatar {
width: 60px;
height: 60px;
border-radius: 50%;
display: inline-block;
vertical-align: middle;
overflow: hidden;
> img {
width: 100%;
height: 100%;
}
}
.name {
max-width: 170px;
display: inline-block;
vertical-align: middle;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.fav {
line-height: 60px;
}
}
.wf-temp {
height: 0;
overflow: hidden;
position: absolute;
}
</style>
... ...
<template>
<div class="sr-list">
<div class="sr-col" v-for="(col, index) in colsList" :key="index" :style="`width:${100/cols}%`">
<template v-if="col.length">
<ArticleItem v-for="item in col" :key="item.articleId" class="sr-item" :data="item" @click="toArticle"></ArticleItem>
</template>
<ArticleItem class="sr-temp" :temporary="true"></ArticleItem>
</div>
</div>
</template>
<script>
import ArticleItem from './author-article-item';
import {assign, get, forEach, fill} from 'lodash';
import {getArticleImageSize} from 'utils/image-handler';
export default {
data() {
return {
colsList: [],
loadedIndex: 0,
colsHeight: []
}
},
props: {
list: {
type: Array,
default: []
},
cols: {
type: Number,
default: 2
},
query: Object
},
created() {
this.reset();
},
mounted() {
this.$cols = this.$el.getElementsByClassName('sr-col');
this.getCoverImgWidth();
import('scrollreveal').then(({default: ScrollReveal}) => {
this.ScrollReveal = ScrollReveal();
this.ScrollReveal.reveal('.sr-item');
});
},
watch: {
list(newList, oldList) {
if (oldList.length > newList.length ||
get(oldList, '[0]._type') !== get(newList, '[0]._type')) {
this.reset();
}
this.$nextTick(() => {
this.calcListLayout();
});
}
},
methods: {
getCoverImgWidth() {
let imgWidth = this.$el.offsetWidth / this.cols;
let $item = this.$el.getElementsByClassName('sr-temp');
if ($item && $item.length) {
let _w = $item[0].offsetWidth;
let $img = $item[0].children;
(_w > 0) && (imgWidth = _w);
if ($img && $img.length) {
_w = $img[0].offsetWidth;
(_w > 0) && (imgWidth = _w);
}
}
this.imgBlockWidth = imgWidth;
},
calcListLayout(single) {
this.loadedIndex = this.loadedIndex || 0;
let num = this.list.length - this.loadedIndex;
if (num <= 0) {
return;
}
forEach(this.$cols, (col, index) => {
this.colsHeight[index] = col.offsetHeight;
});
let minHeight = Math.min.apply(null, this.colsHeight);
let minIndex = this.colsHeight.indexOf(minHeight);
let end = 1;
if (!single) {
end = Math.max.apply(null, [1, num - Math.floor(this.cols * 2)]);
}
for (let i = 0; i < end; i++) {
let item = this.list[this.loadedIndex + i];
if (item) {
let index = (minIndex + i) % this.cols;
this.colsList[index] = this.colsList[index] || [];
this.colsList[index].push(this.clacCoverSize(item));
}
}
this.colsList = [...this.colsList];
this.loadedIndex += end;
this.$nextTick(() => {
this.ScrollReveal.sync();;
this.calcListLayout(true);
});
},
clacCoverSize(item) {
let {width, height} = getArticleImageSize({
width: item.imageWidth,
height: item.imageHeight
});
return assign(item, {
imageWidth: width,
imageHeight: height,
scale: height / width,
blockWidth: this.imgBlockWidth
});
},
reset() {
this.loadedIndex = 0;
let list = [];
for (let i = 0; i < this.cols; i++) {
list[i] = [];
}
this.colsList = list;
},
toArticle({articleId}) {
this.$router.push({
name: 'article',
params: {id: articleId},
query: this.query
});
}
},
components: {
ArticleItem
}
};
</script>
<style lang="css">
.sr-list {
padding: 0 20px;
display: flex;
align-items: flex-start;
.sr-col {
flex-grow: 1;
position: relative;
}
}
</style>
... ...
... ... @@ -14,5 +14,14 @@ export default [{
component: () => import(/* webpackChunkName: "author" */ './author'),
meta: {
keepAlive: true
},
},
{
path: '/author2/:type/:id',
alias: '/author2/:type/:id',
name: 'author2',
component: () => import(/* webpackChunkName: "author2" */ './author2'),
meta: {
keepAlive: true
}
}];
... ...
... ... @@ -58,20 +58,22 @@ export default {
return result;
},
async autherPubList(actions, {authorUid, authorType, page, lastedTime}) {
async autherPubList(actions, {authorUid, authorType, limit, page, lastedTime}) {
const result = await this.$api.get('/api/grass/userPublishedArticleList', {
authorUid,
authorType,
limit,
page,
lastedTime
});
return result;
},
async autherFavList(actions, {authorUid, authorType, page, lastedTime}) {
async autherFavList(actions, {authorUid, authorType, limit, page, lastedTime}) {
const result = await this.$api.get('/api/grass/userFavouriteArticleList', {
authorUid,
authorType,
limit,
page,
lastedTime
});
... ... @@ -92,18 +94,20 @@ export default {
return result;
},
async autherMinePubList(actions, {authorType, page, lastedTime}) {
async autherMinePubList(actions, {authorType, limit, page, lastedTime}) {
const result = await this.$api.get('/api/grass/minePublishedArticleList', {
authorType,
limit,
page,
lastedTime
});
return result;
},
async autherMineFavList(actions, {authorType, page, lastedTime}) {
async autherMineFavList(actions, {authorType, limit, page, lastedTime}) {
const result = await this.$api.get('/api/grass/mineFavouriteArticleList', {
authorType,
limit,
page,
lastedTime
});
... ...
... ... @@ -22,6 +22,7 @@ module.exports = {
params: {
authorUid: {type: Number, require: true},
authorType: {type: Number, require: true},
limit: {type: Number},
page: {type: Number},
lastedTime: {type: Number}
}
... ... @@ -32,6 +33,7 @@ module.exports = {
params: {
authorUid: {type: Number, require: true},
authorType: {type: Number, require: true},
limit: {type: Number},
page: {type: Number},
lastedTime: {type: Number}
}
... ... @@ -59,6 +61,7 @@ module.exports = {
params: {
authorUid: {type: Number, require: true, alias: 'uid'},
authorType: {type: Number, require: true},
limit: {type: Number},
page: {type: Number},
lastedTime: {type: Number}
}
... ... @@ -69,6 +72,7 @@ module.exports = {
params: {
authorUid: {type: Number, require: true, alias: 'uid'},
authorType: {type: Number, require: true},
limit: {type: Number},
page: {type: Number},
lastedTime: {type: Number}
}
... ...
... ... @@ -6128,6 +6128,19 @@
"integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
"dev": true
},
"is-dom-node": {
"version": "1.0.4",
"resolved": "http://npm.yohops.com/is-dom-node/-/is-dom-node-1.0.4.tgz",
"integrity": "sha1-q7GK9xM/Hmh2EM/rJ02hztNC8cU="
},
"is-dom-node-list": {
"version": "1.2.1",
"resolved": "http://npm.yohops.com/is-dom-node-list/-/is-dom-node-list-1.2.1.tgz",
"integrity": "sha1-FB3tDGbedZ0JdoANITcLuQjylQ8=",
"requires": {
"is-dom-node": "^1.0.4"
}
},
"is-extendable": {
"version": "0.1.1",
"resolved": "http://npm.yohops.com/is-extendable/-/is-extendable-0.1.1.tgz",
... ... @@ -7061,6 +7074,11 @@
"is-plain-obj": "^1.1.0"
}
},
"miniraf": {
"version": "1.0.0",
"resolved": "http://npm.yohops.com/miniraf/-/miniraf-1.0.0.tgz",
"integrity": "sha1-XYjhCLvctVtKL/PaM38koTozd+E="
},
"mississippi": {
"version": "3.0.0",
"resolved": "http://npm.yohops.com/mississippi/-/mississippi-3.0.0.tgz",
... ... @@ -8994,6 +9012,11 @@
"xtend": "^4.0.1"
}
},
"rematrix": {
"version": "0.3.0",
"resolved": "http://npm.yohops.com/rematrix/-/rematrix-0.3.0.tgz",
"integrity": "sha1-Tz+RVqqA3tioyiN4X0jGAStt6ko="
},
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "http://npm.yohops.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
... ... @@ -9502,6 +9525,16 @@
"ajv-keywords": "^3.1.0"
}
},
"scrollreveal": {
"version": "4.0.5",
"resolved": "http://npm.yohops.com/scrollreveal/-/scrollreveal-4.0.5.tgz",
"integrity": "sha1-z4PMXZh03A2S75yJqIlOV/P44DQ=",
"requires": {
"miniraf": "1.0.0",
"rematrix": "0.3.0",
"tealight": "0.3.6"
}
},
"scss-tokenizer": {
"version": "0.2.3",
"resolved": "http://npm.yohops.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
... ... @@ -10841,6 +10874,15 @@
"inherits": "2"
}
},
"tealight": {
"version": "0.3.6",
"resolved": "http://npm.yohops.com/tealight/-/tealight-0.3.6.tgz",
"integrity": "sha1-FMgHHOPBiJcqXLfYpWaMooILQpI=",
"requires": {
"is-dom-node": "^1.0.4",
"is-dom-node-list": "^1.2.1"
}
},
"term-size": {
"version": "1.2.0",
"resolved": "http://npm.yohops.com/term-size/-/term-size-1.2.0.tgz",
... ...
... ... @@ -46,6 +46,7 @@
"lottie-web": "^5.4.2",
"qiniu": "^7.2.1",
"request-promise": "^4.2.2",
"scrollreveal": "^4.0.5",
"serve-favicon": "^2.5.0",
"source-map": "^0.7.3",
"uuid": "^3.3.2",
... ...
... ... @@ -2060,7 +2060,6 @@ date-now@^0.1.4:
dayjs@^1.8.5:
version "1.8.5"
resolved "http://npm.yohops.com/dayjs/-/dayjs-1.8.5.tgz#0b066770f89a20022218544989f3d23e5e8db29a"
integrity sha1-CwZncPiaIAIiGFRJifPSPl6Nspo=
de-indent@^1.0.2:
version "1.0.2"
... ... @@ -3868,6 +3867,16 @@ is-directory@^0.3.1:
version "0.3.1"
resolved "http://npm.yohops.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
is-dom-node-list@^1.2.1:
version "1.2.1"
resolved "http://npm.yohops.com/is-dom-node-list/-/is-dom-node-list-1.2.1.tgz#141ded0c66de759d0976800d21370bb908f2950f"
dependencies:
is-dom-node "^1.0.4"
is-dom-node@^1.0.4:
version "1.0.4"
resolved "http://npm.yohops.com/is-dom-node/-/is-dom-node-1.0.4.tgz#abb18af7133f1e687610cfeb274da1ced342f1c5"
is-extendable@^0.1.0, is-extendable@^0.1.1:
version "0.1.1"
resolved "http://npm.yohops.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
... ... @@ -4313,7 +4322,6 @@ lodash.debounce@^4.0.8:
lodash.findkey@^4.6.0:
version "4.6.0"
resolved "http://npm.yohops.com/lodash.findkey/-/lodash.findkey-4.6.0.tgz#83058e903b51cbb759d09ccf546dea3ea39c4718"
integrity sha1-gwWOkDtRy7dZ0JzPVG3qPqOcRxg=
lodash.kebabcase@^4.1.1:
version "4.1.1"
... ... @@ -4669,6 +4677,10 @@ minipass@^2.2.1, minipass@^2.3.4:
safe-buffer "^5.1.2"
yallist "^3.0.0"
miniraf@1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/miniraf/-/miniraf-1.0.0.tgz#5d88e108bbdcb55b4a2ff3da337f24a13a3377e1"
minizlib@^1.1.1:
version "1.2.1"
resolved "http://npm.yohops.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
... ... @@ -6056,6 +6068,10 @@ remark@^10.0.1:
remark-stringify "^6.0.0"
unified "^7.0.0"
rematrix@0.3.0:
version "0.3.0"
resolved "http://npm.yohops.com/rematrix/-/rematrix-0.3.0.tgz#4f3f9156aa80ded8a8ca23785f48c6012b6dea4a"
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "http://npm.yohops.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
... ... @@ -6292,6 +6308,14 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"
scrollreveal@^4.0.5:
version "4.0.5"
resolved "http://npm.yohops.com/scrollreveal/-/scrollreveal-4.0.5.tgz#cf83cc5d9874dc0d92ef9c89a8894e57f3f8e034"
dependencies:
miniraf "1.0.0"
rematrix "0.3.0"
tealight "0.3.6"
scss-tokenizer@^0.2.3:
version "0.2.3"
resolved "http://npm.yohops.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
... ... @@ -6980,6 +7004,13 @@ tar@^4:
safe-buffer "^5.1.2"
yallist "^3.0.2"
tealight@0.3.6:
version "0.3.6"
resolved "http://npm.yohops.com/tealight/-/tealight-0.3.6.tgz#14c8071ce3c188972a5cb7d8a5668ca2820b4292"
dependencies:
is-dom-node "^1.0.4"
is-dom-node-list "^1.2.1"
term-size@^1.2.0:
version "1.2.0"
resolved "http://npm.yohops.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
... ...