Authored by yyq

Merge branch 'develop' of git.yoho.cn:fe/xianyu-ufo-app-web into develop

@@ -3,6 +3,7 @@ import config from 'config'; @@ -3,6 +3,7 @@ import config from 'config';
3 import { 3 import {
4 sign 4 sign
5 } from './utils'; 5 } from './utils';
  6 +import { Toast } from 'cube-ui';
6 7
7 axios.defaults.baseURL = config.axiosBaseUrl; 8 axios.defaults.baseURL = config.axiosBaseUrl;
8 axios.defaults.responseType = config.axiosResponseType; 9 axios.defaults.responseType = config.axiosResponseType;
@@ -10,10 +11,23 @@ axios.defaults.headers = { @@ -10,10 +11,23 @@ axios.defaults.headers = {
10 'X-Requested-With': 'XMLHttpRequest' 11 'X-Requested-With': 'XMLHttpRequest'
11 }; 12 };
12 13
  14 +axios.interceptors.response.use(function(response) {
  15 + if (response.data.code === 9999991 || response.data.code === 9999992) {
  16 + Toast.$create({
  17 + type: 'warn',
  18 + mask: true,
  19 + txt: response.data.message
  20 + });
  21 + }
  22 + return response;
  23 +}, function(error) {
  24 + return Promise.reject(error);
  25 +});
  26 +
13 const errHandle = (error, store) => { 27 const errHandle = (error, store) => {
14 console.log(error); 28 console.log(error);
15 29
16 - if (error.response && error.response.status == 401) { 30 + if (error.response && error.response.status === 401) {
17 store.dispatch('setNeedLogin', { needLogin: true }); 31 store.dispatch('setNeedLogin', { needLogin: true });
18 } 32 }
19 33
@@ -28,7 +42,7 @@ const request = (options, store) => { @@ -28,7 +42,7 @@ const request = (options, store) => {
28 return axios(options).then((res) => { 42 return axios(options).then((res) => {
29 return res.data; 43 return res.data;
30 }, error => { 44 }, error => {
31 - return errHandle(error, store) 45 + return errHandle(error, store);
32 }); 46 });
33 }; 47 };
34 48
@@ -87,11 +87,9 @@ export default { @@ -87,11 +87,9 @@ export default {
87 87
88 <style lang="scss"> 88 <style lang="scss">
89 .layout { 89 .layout {
90 - position: absolute;  
91 - top: 0;  
92 - left: 0;  
93 - right: 0;  
94 - bottom: 0; 90 + position: relative;
  91 + width: 100%;
  92 + height: 100%;
95 overflow: hidden; 93 overflow: hidden;
96 font-size: 24px; 94 font-size: 24px;
97 display: flex; 95 display: flex;
@@ -109,4 +107,6 @@ export default { @@ -109,4 +107,6 @@ export default {
109 overflow: scroll; 107 overflow: scroll;
110 } 108 }
111 } 109 }
  110 +
  111 +
112 </style> 112 </style>
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 </a> 30 </a>
31 </li> 31 </li>
32 <li> 32 <li>
33 - <img :src="pageData.bottom"> 33 + <div class="bottom-space"></div>
34 </li> 34 </li>
35 </ul> 35 </ul>
36 </div> 36 </div>
@@ -888,6 +888,12 @@ export default { @@ -888,6 +888,12 @@ export default {
888 width: 100%; 888 width: 100%;
889 float: left; 889 float: left;
890 } 890 }
  891 +
  892 + .bottom-space {
  893 + width: 100%;
  894 + height: 80px;
  895 + display: block;
  896 + }
891 } 897 }
892 898
893 .tab-container { 899 .tab-container {
@@ -14,11 +14,18 @@ @@ -14,11 +14,18 @@
14 </div> 14 </div>
15 <img :src="item.image" alt=""/> 15 <img :src="item.image" alt=""/>
16 </li> 16 </li>
  17 + <li>
  18 + <img :src="images.rule">
  19 + </li>
  20 + <li>
  21 + <a href="javascript:void(0)" class="button-more" @click="gotoProductPool">
  22 + <img :src="images.more">
  23 + </a>
  24 + </li>
17 </ul> 25 </ul>
18 </LayoutApp> 26 </LayoutApp>
19 </template> 27 </template>
20 28
21 -  
22 <script> 29 <script>
23 import productData from './saleProduct.json'; 30 import productData from './saleProduct.json';
24 31
@@ -26,8 +33,9 @@ export default { @@ -26,8 +33,9 @@ export default {
26 name: 'Strategy', 33 name: 'Strategy',
27 data() { 34 data() {
28 return { 35 return {
29 - productList: []  
30 - } 36 + productList: [],
  37 + images: {}
  38 + };
31 }, 39 },
32 methods: { 40 methods: {
33 goBack() { 41 goBack() {
@@ -42,10 +50,23 @@ export default { @@ -42,10 +50,23 @@ export default {
42 productId: linkItem.linkId 50 productId: linkItem.linkId
43 } 51 }
44 }); 52 });
  53 + },
  54 + gotoProductPool() {
  55 + this.$router.push({
  56 + name: 'List',
  57 + query: {
  58 + productPool: 445
  59 + }
  60 + });
45 } 61 }
46 }, 62 },
47 - mounted() { 63 + activated() {
48 this.productList = productData.imageList; 64 this.productList = productData.imageList;
  65 + this.images = {
  66 + rule: productData.imageList[0].rule,
  67 + more: productData.imageList[0].more
  68 + };
  69 + console.log(this.productList)
49 } 70 }
50 }; 71 };
51 </script> 72 </script>
@@ -56,6 +77,11 @@ ul { @@ -56,6 +77,11 @@ ul {
56 list-style: none; 77 list-style: none;
57 margin: 0; 78 margin: 0;
58 padding: 0; 79 padding: 0;
  80 + background-image: url("//ad.yoho.cn/html5/2019/10/activity/007/base/repeat_bg.jpg?imageslim");
  81 + background-repeat: repeat-y;
  82 + background-size: 100% auto;
  83 + overflow: hidden;
  84 + -webkit-overflow-scrolling: touch;
59 85
60 li { 86 li {
61 position: relative; 87 position: relative;
@@ -83,6 +109,13 @@ ul { @@ -83,6 +109,13 @@ ul {
83 background-color: transparent; 109 background-color: transparent;
84 } 110 }
85 } 111 }
  112 +
  113 + .button-more {
  114 + display: block;
  115 + width: 530px;
  116 + height: 45px;
  117 + margin: 20px auto 60px auto;
  118 + }
86 } 119 }
87 } 120 }
88 </style> 121 </style>
1 { 1 {
2 "imageList": [ 2 "imageList": [
3 { 3 {
4 - "image": "//cdn.yoho.cn/saleList/bg/1p_01.jpg?imageView2/2/w/750/format/jpg", 4 + "image": "//cdn.yoho.cn/saleList/bg/1p_02.jpg?imageView2/2/w/750/format/jpg",
  5 + "rule": "//ad.yoho.cn/html5/2019/10/activity/007/base/list_rule.png",
  6 + "more": "//ad.yoho.cn/html5/2019/10/activity/007/base/btn_more.png",
5 "urls": [ 7 "urls": [
6 { 8 {
7 "left": "2rem", 9 "left": "2rem",
@@ -127,7 +127,7 @@ export default { @@ -127,7 +127,7 @@ export default {
127 this.$store.dispatch('reportYas', { 127 this.$store.dispatch('reportYas', {
128 params: { 128 params: {
129 appop: 'XY_UFO_SHOW_EVENT', 129 appop: 'XY_UFO_SHOW_EVENT',
130 - param: reportParams 130 + param: {DATA:reportParams}
131 } 131 }
132 }); 132 });
133 133
@@ -59,6 +59,7 @@ export default { @@ -59,6 +59,7 @@ export default {
59 PAGE_URL: '', 59 PAGE_URL: '',
60 listYasParams: {}, 60 listYasParams: {},
61 homeYasParams: [], 61 homeYasParams: [],
  62 + guessLikeId: 0,
62 listScrollY: 0, 63 listScrollY: 0,
63 options: { 64 options: {
64 pullUpLoad: true, 65 pullUpLoad: true,
@@ -80,7 +81,7 @@ export default { @@ -80,7 +81,7 @@ export default {
80 isFetching: false, 81 isFetching: false,
81 error: null, 82 error: null,
82 page: 0, // 当前页 83 page: 0, // 当前页
83 - page_size: 10, // 每页数量 84 + page_size: 20, // 每页数量
84 page_total: 0, // 总共多少页 85 page_total: 0, // 总共多少页
85 total: 0, // 总共多少条 86 total: 0, // 总共多少条
86 endReached: false, // 到达底部 87 endReached: false, // 到达底部
@@ -162,6 +163,13 @@ export default { @@ -162,6 +163,13 @@ export default {
162 appop: 'XY_UFO_MAIN_START' 163 appop: 'XY_UFO_MAIN_START'
163 } 164 }
164 }); 165 });
  166 + // 初始化 选中类目
  167 + const [firstNav] = this.navList;
  168 + if(firstNav) {
  169 + const {url = ''} = firstNav;
  170 + this.selectedCategory = queryString.parse(url);
  171 + }
  172 +
165 this.refreshProductList(this.active); 173 this.refreshProductList(this.active);
166 }, 174 },
167 methods: { 175 methods: {
@@ -238,11 +246,26 @@ export default { @@ -238,11 +246,26 @@ export default {
238 // console.log(this.homeYasParams) 246 // console.log(this.homeYasParams)
239 this.$store.dispatch('reportYas', { 247 this.$store.dispatch('reportYas', {
240 params: { 248 params: {
241 - param: this.homeYasParams, 249 + param: {DATA:this.homeYasParams},
242 appop: 'XY_UFO_SHOW_EVENT' 250 appop: 'XY_UFO_SHOW_EVENT'
243 } 251 }
244 }); 252 });
245 }, 253 },
  254 + reportTabYas() {
  255 + let guessLikeTabParams = this.listYasParams;
  256 + delete guessLikeTabParams.I_INDEX;
  257 + // 防止重复上报
  258 + if(this.guessLikeId !== guessLikeTabParams.TAB_ID) {
  259 + this.guessLikeId = guessLikeTabParams.TAB_ID
  260 + console.log('guesslisttab',guessLikeTabParams)
  261 + this.$store.dispatch('reportYas', {
  262 + params: {
  263 + param: guessLikeTabParams,
  264 + appop: 'XY_UFO_MAIN_EVENT'
  265 + }
  266 + });
  267 + }
  268 + },
246 async guessLikeListParams(params) { 269 async guessLikeListParams(params) {
247 if (params && typeof params === 'object' && Object.keys(params).length) { 270 if (params && typeof params === 'object' && Object.keys(params).length) {
248 this.listYasParams = Object.assign({}, { 271 this.listYasParams = Object.assign({}, {
@@ -259,8 +282,9 @@ export default { @@ -259,8 +282,9 @@ export default {
259 this.selectedCategory = params; 282 this.selectedCategory = params;
260 this.active = Number(index); 283 this.active = Number(index);
261 this.isShow && this.$refs.scroll.scrollTo(this.navTop); 284 this.isShow && this.$refs.scroll.scrollTo(this.navTop);
262 - // this.setYasParam({index, ...params});  
263 await this.guessLikeListParams({index, ...params}); 285 await this.guessLikeListParams({index, ...params});
  286 + // tab点击
  287 + this.reportTabYas()
264 // 商品列表曝光 288 // 商品列表曝光
265 this.productList.list.length > 0 && this.listScrollY > 0 && this.$refs.product && this.$refs.product.yasShowEvent(this.yasHeight); 289 this.productList.list.length > 0 && this.listScrollY > 0 && this.$refs.product && this.$refs.product.yasShowEvent(this.yasHeight);
266 }, 290 },
@@ -294,7 +318,6 @@ export default { @@ -294,7 +318,6 @@ export default {
294 await this.fetchList(this.searchParams); 318 await this.fetchList(this.searchParams);
295 319
296 // 列表上报数据 320 // 列表上报数据
297 - // this.setYasParam({index: 0, ...this.searchParams});  
298 this.guessLikeListParams({index: 0, ...this.searchParams}); 321 this.guessLikeListParams({index: 0, ...this.searchParams});
299 }, 322 },
300 323
@@ -102,4 +102,14 @@ export default { @@ -102,4 +102,14 @@ export default {
102 width: 100%; 102 width: 100%;
103 background-color: white; 103 background-color: white;
104 } 104 }
  105 +
  106 +@supports (bottom: env(safe-area-inset-bottom)) {
  107 + .content {
  108 + height: calc(env(safe-area-inset-bottom) + 100% + 88px);
  109 + }
  110 +
  111 + .footer {
  112 + height: calc(env(safe-area-inset-bottom) + 100px);
  113 + }
  114 +}
105 </style> 115 </style>
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 import { createNamespacedHelpers } from 'vuex'; 10 import { createNamespacedHelpers } from 'vuex';
11 const {mapState, mapActions} = createNamespacedHelpers('home/bindAccount'); 11 const {mapState, mapActions} = createNamespacedHelpers('home/bindAccount');
12 12
13 -export default { 13 +export default {
14 name: 'bind', 14 name: 'bind',
15 props: { 15 props: {
16 data: { 16 data: {
1 <template> 1 <template>
2 <LayoutApp title="闲鱼潮玩转攻略" :show-back="true" :back-action="goBack"> 2 <LayoutApp title="闲鱼潮玩转攻略" :show-back="true" :back-action="goBack">
3 - <ul>  
4 - <li v-for="(item, index) in dataList" :key="index">  
5 - <div v-if="item.urls && item.urls.length > 0" class="link-container">  
6 - <a href="javascript:;"  
7 - v-for="linkItem in item.urls"  
8 - :key="linkItem.link"  
9 - :style="{left: linkItem.left, top: linkItem.top, width: linkItem.width, height: linkItem.height}"  
10 - @click="jumpTo"  
11 - :data-item="JSON.stringify(linkItem)"  
12 - >  
13 - </a>  
14 - </div>  
15 - <img :src="item.image" alt=""/>  
16 - </li>  
17 - </ul> 3 + <div class="body-warpper">
  4 + <ul>
  5 + <li v-for="(item, index) in dataList" :key="index">
  6 + <div v-if="item.urls && item.urls.length > 0" class="link-container">
  7 + <a href="javascript:;"
  8 + v-for="linkItem in item.urls"
  9 + :key="linkItem.link"
  10 + :style="{left: linkItem.left, top: linkItem.top, width: linkItem.width, height: linkItem.height}"
  11 + @click="jumpTo"
  12 + :data-item="JSON.stringify(linkItem)"
  13 + >
  14 + </a>
  15 + </div>
  16 + <img :src="item.image" alt=""/>
  17 + </li>
  18 + </ul>
  19 + </div>
  20 +
  21 +
18 </LayoutApp> 22 </LayoutApp>
19 </template> 23 </template>
20 24
@@ -57,6 +61,15 @@ export default { @@ -57,6 +61,15 @@ export default {
57 </script> 61 </script>
58 62
59 <style lang="scss" scoped> 63 <style lang="scss" scoped>
  64 +.body-warpper {
  65 + position: relative;
  66 + width: 100%;
  67 + height: 100%;
  68 + overflow-x: hidden;
  69 + overflow-y: scroll;
  70 + -webkit-overflow-scrolling: touch;
  71 +}
  72 +
60 ul { 73 ul {
61 width: 100%; 74 width: 100%;
62 list-style: none; 75 list-style: none;
1 <template> 1 <template>
2 <LayoutApp :title="currentTitle" :show-back="true" :back-action="goBack"> 2 <LayoutApp :title="currentTitle" :show-back="true" :back-action="goBack">
3 - <ul>  
4 - <li v-for="(item, index) in currentList" :key="index">  
5 - <img :src="item.image" alt=""/>  
6 - </li>  
7 - </ul> 3 + <div class="body-warpper">
  4 + <ul>
  5 + <li v-for="(item, index) in currentList" :key="index">
  6 + <img :src="item.image" alt=""/>
  7 + </li>
  8 + </ul>
  9 + </div>
8 10
9 </LayoutApp> 11 </LayoutApp>
10 </template> 12 </template>
@@ -54,6 +56,15 @@ export default { @@ -54,6 +56,15 @@ export default {
54 </script> 56 </script>
55 57
56 <style lang="scss" scoped> 58 <style lang="scss" scoped>
  59 +.body-warpper {
  60 + position: relative;
  61 + width: 100%;
  62 + height: 100%;
  63 + overflow-x: hidden;
  64 + overflow-y: scroll;
  65 + -webkit-overflow-scrolling: touch;
  66 +}
  67 +
57 ul { 68 ul {
58 width: 100%; 69 width: 100%;
59 list-style: none; 70 list-style: none;
@@ -78,7 +78,7 @@ export default { @@ -78,7 +78,7 @@ export default {
78 }, 78 },
79 searchGoods: function() { 79 searchGoods: function() {
80 this.addLocalWord(); 80 this.addLocalWord();
81 - this.yasInput({type: 0, index: 0}); 81 + this.yasInput({type: 0, index: 0, query: this.query});
82 this.$router.push({ 82 this.$router.push({
83 name: 'List', 83 name: 'List',
84 query: { 84 query: {
@@ -94,6 +94,7 @@ export default { @@ -94,6 +94,7 @@ export default {
94 let query = parameters.query; 94 let query = parameters.query;
95 95
96 this.addLocalWord(query); 96 this.addLocalWord(query);
  97 + param.query = query;
97 this.yasInput(param); 98 this.yasInput(param);
98 this.$router.push({ 99 this.$router.push({
99 name: 'List', 100 name: 'List',
@@ -136,10 +137,10 @@ export default { @@ -136,10 +137,10 @@ export default {
136 params: { 137 params: {
137 param: { 138 param: {
138 SEARCH_POS: this.SEARCH_POS, 139 SEARCH_POS: this.SEARCH_POS,
139 - KEYWORD: this.query, 140 + KEYWORD: param.query,
140 POS_ID: param.type, 141 POS_ID: param.type,
141 TYPE_ID: 1, 142 TYPE_ID: 1,
142 - FLR_INDEX: param.index + 1, 143 + FLR_INDEX: param.type ? param.index + 1 : 0,
143 }, 144 },
144 appop: 'XY_UFO_HOME_KEYWORD_SEARCH_C' 145 appop: 'XY_UFO_HOME_KEYWORD_SEARCH_C'
145 } 146 }
@@ -21,8 +21,10 @@ @@ -21,8 +21,10 @@
21 class="actions" 21 class="actions"
22 :order="order" 22 :order="order"
23 @on-action=" 23 @on-action="
24 - action =>  
25 - onInSaleOrderAction({ action, order, isInSale: true }) 24 + action => {
  25 + onInSaleOrderAction({ action, order, isInSale: true });
  26 + onAction({ action, order, isInSale: true });
  27 + }
26 " 28 "
27 /> 29 />
28 </div> 30 </div>
@@ -51,6 +53,7 @@ import OrderActions from "../components/order-actions"; @@ -51,6 +53,7 @@ import OrderActions from "../components/order-actions";
51 import CountDown from "../components/count-down"; 53 import CountDown from "../components/count-down";
52 54
53 import orderInSaleActionMixin from "../mixin/order-in-sale-action"; 55 import orderInSaleActionMixin from "../mixin/order-in-sale-action";
  56 +import orderActionMixin from "../mixin/order-action";
54 57
55 const IN_SALE_STORE_PATH = "order/inSaleOrderList"; 58 const IN_SALE_STORE_PATH = "order/inSaleOrderList";
56 59
@@ -65,7 +68,7 @@ const { @@ -65,7 +68,7 @@ const {
65 68
66 export default { 69 export default {
67 // 订单操作 70 // 订单操作
68 - mixins: [orderInSaleActionMixin], 71 + mixins: [orderInSaleActionMixin, orderActionMixin],
69 data() { 72 data() {
70 return { 73 return {
71 scrollY: 0 74 scrollY: 0
@@ -526,6 +526,8 @@ textarea { @@ -526,6 +526,8 @@ textarea {
526 526
527 html, 527 html,
528 body { 528 body {
  529 + width: 100%;
  530 + height: 100%;
529 font-size: 24px; 531 font-size: 24px;
530 font-family: "PingFang SC", "HiraginoSansGB-W3", "SanFranciscoText-Regular", Helvetica, Roboto, "Heiti SC", "黑体", Arial; 532 font-family: "PingFang SC", "HiraginoSansGB-W3", "SanFranciscoText-Regular", Helvetica, Roboto, "Heiti SC", "黑体", Arial;
531 line-height: 1.4; 533 line-height: 1.4;
@@ -537,6 +539,24 @@ body { @@ -537,6 +539,24 @@ body {
537 -moz-user-select: none; 539 -moz-user-select: none;
538 -ms-user-select: none; 540 -ms-user-select: none;
539 user-select: none; 541 user-select: none;
  542 +
  543 +}
  544 +
  545 +#app {
  546 + position: relative;
  547 + width: 100%;
  548 + height: 100%;
  549 +}
  550 +
  551 +/* 支持iphoneX下方安全区域 */
  552 +@supports (bottom: env(safe-area-inset-bottom)) {
  553 + body {
  554 + margin-bottom: env(safe-area-inset-bottom);
  555 + }
  556 +
  557 + #app {
  558 + height: calc(100% + env(safe-area-inset-bottom));
  559 + }
540 } 560 }
541 561
542 /* stylelint-disable */ 562 /* stylelint-disable */
@@ -12,7 +12,7 @@ const isTest = process.env.NODE_ENV === 'test3'; @@ -12,7 +12,7 @@ const isTest = process.env.NODE_ENV === 'test3';
12 const domains = { 12 const domains = {
13 // api: 'http://api.yoho.cn/', 13 // api: 'http://api.yoho.cn/',
14 // service: 'http://service.yoho.cn/', 14 // service: 'http://service.yoho.cn/',
15 - // ufo: 'http://2.yobobuy.cn', 15 + // ufo: 'http://2.yohobuy.com',
16 16
17 // liveApi: 'http://testapi.live.yohops.com:9999/', 17 // liveApi: 'http://testapi.live.yohops.com:9999/',
18 // singleApi: 'http://api-test3.yohops.com:9999/', 18 // singleApi: 'http://api-test3.yohops.com:9999/',
@@ -168,9 +168,25 @@ const login = { @@ -168,9 +168,25 @@ const login = {
168 }, 168 },
169 taobaoCallback(req, res, next) { 169 taobaoCallback(req, res, next) {
170 passport.authenticate('taobao', (err, user) => { 170 passport.authenticate('taobao', (err, user) => {
  171 + let redirectUrl = loginPage;
  172 + let referUrl = {};
  173 + let refer;
  174 +
  175 + if (req.cookies.ali_backurl) {
  176 + try {
  177 + referUrl = JSON.parse(req.cookies.ali_backurl);
  178 + } catch(e) {
  179 + log.debug(JSON.stringify(e));
  180 + }
  181 +
  182 + refer = handleReferUrl(referUrl.b || '');
  183 + }
  184 +
  185 + redirectUrl += '?nodownload=1&refer=' + encodeURIComponent(refer || homePage);
  186 +
171 if (err || !user) { 187 if (err || !user) {
172 log.error(`[authenticate error] source_type: taobao | err: ${JSON.stringify(err)}`); 188 log.error(`[authenticate error] source_type: taobao | err: ${JSON.stringify(err)}`);
173 - return res.redirect(loginPage); 189 + return res.redirect(redirectUrl);
174 } 190 }
175 191
176 const model = req.ctx(passportModel); 192 const model = req.ctx(passportModel);
@@ -180,19 +196,6 @@ const login = { @@ -180,19 +196,6 @@ const login = {
180 sourceType: 'taobao', 196 sourceType: 'taobao',
181 sourceTypeSecond: req.yoho.isAliApp ? 'xianyu' : '' 197 sourceTypeSecond: req.yoho.isAliApp ? 'xianyu' : ''
182 }).then(result => { 198 }).then(result => {
183 - let redirectUrl = loginPage;  
184 - let referUrl = {};  
185 -  
186 - if (req.cookies.ali_backurl) {  
187 - try {  
188 - referUrl = JSON.parse(req.cookies.ali_backurl);  
189 - } catch(e) {  
190 - log.debug(JSON.stringify(e));  
191 - }  
192 -  
193 - redirectUrl += '?refer=' + encodeURIComponent(handleReferUrl(referUrl.b || ''));  
194 - }  
195 -  
196 if (result.code === 200) { 199 if (result.code === 200) {
197 if (_.get(result, 'data.is_bind') === 'N') { 200 if (_.get(result, 'data.is_bind') === 'N') {
198 redirectUrl = referUrl.b ? referUrl.b : homePage; 201 redirectUrl = referUrl.b ? referUrl.b : homePage;
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <title>{{title}}</title> 5 <title>{{title}}</title>
6 <meta name="keywords" content=""> 6 <meta name="keywords" content="">
7 <meta name="description" content=""> 7 <meta name="description" content="">
8 - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> 8 + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, viewport-fit=cover">
9 <meta name="apple-mobile-web-app-status-bar-style" content="black"> 9 <meta name="apple-mobile-web-app-status-bar-style" content="black">
10 <meta content="yes" name="apple-mobile-web-app-capable"> 10 <meta content="yes" name="apple-mobile-web-app-capable">
11 <meta content="telephone=no" name="format-detection"> 11 <meta content="telephone=no" name="format-detection">
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <title>{{title}} {{#unless noYohoTitle}}{{yohoTitle}}{{/unless}}</title> 5 <title>{{title}} {{#unless noYohoTitle}}{{yohoTitle}}{{/unless}}</title>
6 <meta name="keywords" content="{{keywords}}"> 6 <meta name="keywords" content="{{keywords}}">
7 <meta name="description" content="{{description}}"> 7 <meta name="description" content="{{description}}">
8 - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> 8 + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no,viewport-fit=cover">
9 <meta name="apple-mobile-web-app-status-bar-style" content="black"> 9 <meta name="apple-mobile-web-app-status-bar-style" content="black">
10 <meta content="telephone=no" name="format-detection"> 10 <meta content="telephone=no" name="format-detection">
11 <meta content="email=no" name="format-detection"> 11 <meta content="email=no" name="format-detection">