Commit d9122238 authored by 吕祺's avatar 吕祺 ⛹🏽

first

parents
Pipeline #4792 failed with stage
in 1 minute and 26 seconds
{
"presets": ["next/babel"],
"plugins": ["transform-remove-strict-mode"]
}
\ No newline at end of file
node_modules/
.next/
out/
\ No newline at end of file
module.exports = {
root: true,
env: {
browser: true,
node: true
},
parserOptions: {
parser: 'babel-eslint',
ecmaVersion: 6,
sourceType: "module",
ecmaFeatures:{
"jsx":true,
"experimentalObjectRestSpread":true,
"modules":true
}
},
extends: [
'plugin:prettier/recommended',
'prettier'
],
plugins: [
'prettier'
],
// add your custom rules here
rules: {
'nuxt/no-cjs-in-config': 'off',
"import/no-dynamic-require": 0,
"global-require": 0,
"prefer-rest-params": 0,
"no-unused-vars": [2, { "args": "none" }],
"import/no-extraneous-dependencies": 0,
"no-nested-ternary": 0,
"no-restricted-syntax": 0,
"indent": ["error", 2, { "SwitchCase": 1 }],
"no-plusplus": [2, { "allowForLoopAfterthoughts": true }],
"arrow-parens": [2, "always", { "requireForBlockBody": true }],
// "comma-dangle": [1, "never"],
"func-names": 0,
// "strict": [2, "global"],
"new-cap": [2, { "capIsNew": false, "newIsCapExceptions": ["connection", "message"] }],
// "no-console": 2,
"no-debugger": 2,
"no-underscore-dangle": 0,
"camelcase": 2,
"no-param-reassign": 0,
"no-bitwise": 0,
"dot-notation": [2, { "allowPattern": "^([a-z]+(_[a-z]+)+)|([_A-Z]+)$" }],
"array-bracket-spacing": 1,
"arrow-spacing": [2, { "before": true, "after": true }],
"generator-star-spacing": [2, "after"],
// "space-before-function-paren": [2, { "anonymous": "always", "named": "never" }],
"no-mixed-operators": [
"error",
{
"groups": [
["&", "|", "^", "~", "<<", ">>", ">>>"],
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"]
]
}
],
"import/prefer-default-export": 0,
"class-methods-use-this": 0,
"no-template-curly-in-string": 0,
"no-empty": 0,
"no-global-assign": ["error", { "exceptions": ["onmessage"] }]
}
}
.next/
node_modules/
/npm-debug.log
.DS_Store
out/
.python-version
\ No newline at end of file
stages:
- build
- deploy
cache:
paths:
- out
- node_modules/
compile_articles_and_preview:
stage: build
# when: manual
environment:
name: release
only:
- master
script:
- yarn
- node utils/articleAggregate.js
- sh utils/imageCompress.sh
- sh utils/commit.sh
- npm run export
- rm -rf /home/gitlab-runner/deploy/cms/ficus/out #/home/gitlab-runner/deploy/official/out/
- cp -r out /home/gitlab-runner/deploy/cms/ficus/ #deploy/official
# - rm -r /home/gitlab-runner/deploy/official/out
# - cp -r out/ /home/gitlab-runner/deploy/official/
- echo "cms https://cmsadmin.gaorongvc.cn/ficus/admin"
# compress_images:
# stage: build
# # when: manual
# environment:
# name: release
# only:
# - master
# script:
# - yarn
# - sh utils/imageCompress.sh
# deploy:
# stage: deploy
# when: manual
# environment:
# name: release
# only:
# - master
# script:
# - yarn
# # - sh utils/imageCompress.sh
# - npm run export
# - rm -rf /home/gitlab-runner/deploy/cms/ficus/out #/home/gitlab-runner/deploy/official/out/
# - echo "预览页面已清除"
# - cp -r out /home/gitlab-runner/deploy/cms/ficus/ #deploy/official
# - /home/gitlab-runner/sh/ossutil64 cp -f out oss://gaorong-web/ -r
# preview:
# stage: deploy
# # when: manual
# environment:
# name: preview
# # artifacts:
# # name: 'package'
# # untracked: true
# # expire_in: 12 hours
# # paths:
# # - out
# script:
# - yarn
# # - sh utils/imageCompress.sh
# - npm run export
# - rm -rf /home/gitlab-runner/deploy/cms/official/out #/home/gitlab-runner/deploy/official/out/
# - cp -r out /home/gitlab-runner/deploy/cms/official/ #deploy/official
# # - rm -r /home/gitlab-runner/deploy/official/out
# # - cp -r out/ /home/gitlab-runner/deploy/official/
# - echo "预览网站:http://preview.gaorongvc.cn:9945/"
{
"semi": false,
"singleQuote": true,
"arrowParens": always
}
# 高榕官网项目 [![pipeline status](https://git.gaorongvc.cn/lq/official/badges/master/pipeline.svg)](https://git.gaorongvc.cn/lq/official/pipelines)
## 问题反馈
可在[此页面](https://git.gaorongvc.cn/lq/official/issues/new)添加issue并在[看板页](https://git.gaorongvc.cn/lq/official/-/boards)跟踪进展; 已经关闭的issue,如果检查后仍有问题,可以再次打开
提issue说明 https://git.gaorongvc.cn/lq/official/issues/3
### 点击交互测试
PC端,鼠标悬浮后是一个小手的就可以点击;移动端没有此提示
* 头部导航含左侧图标,手机端会是一个可点击的图标点开后出现一个可关闭弹窗
* 弹窗的关闭按钮,一般弹窗出现后只有这里可点击
* 投资企业页的官方网站可以点击
* 底部的语言切换、邮箱
* 首页案例切换右侧
* 了解更多按钮
* 投资企业页行业切换、案例logo
* 榕汇页中没有阅读更多标识的文章,点击弹窗简介弹窗
* 榕汇页、动态页、文章阅读页中的文章,点击跳转到对应文章
* 动态页搜索框
* 动态页阅读更多按钮
* 文章阅读页返回按钮,分享微博与邮箱按钮,微信按钮悬浮展示二维码不可点击
* 文章阅读页中的链接
* 首页3d旋转,拖动可左右旋转
### 屏幕宽度响应式测试:
针对不同屏幕宽度字体大小,布局等可能不一样,宽高比无法和设备一致,苹果手机的retina屏幕,会放大设备像素比相应的倍数
![cms图片2](resize.gif)
<br />
<br />
## 开发与运维
### 安装
项目目录下运行yarn 或者 npm install
### 运行
nvm use v16.20.0
开发测试: npm run dev, 访问 http://localhost:3000
部署:npm run export, 使用nextjs静态发布功能生成html等文件,产出目录在out, 提交代码或cms发布后全自动部署到阿里云,配置在.git-ci.yml。拷贝到阿里云对象存储空oss://gaorong-web ,并自动触发cdn刷新
手动发布:上线会提供预览环境,审阅后在[流水线](https://git.gaorongvc.cn/lq/official/pipelines)中打开对应项手动发布
发布问题:现在是增量更新,每次都往里面加内容的,文件越来越多所以有可能出现发布失败的情况,需要去把oss存储清空一下,清空时网站是打不开的,所以这种操作只能偶尔去做;发布是手动按钮,点进去可以retry重试
![重试按钮](retry.jpeg)
### CMS
cms访问需要代码库maintainer及以上权限,通过高榕gitlab认证访问,gitlab oauth认知应用需添加此回调地址 https://cmsadmin.gaorongvc.cn/static/admin/
测试改backend name 为test-repo,先export再用静态服务器运行(不能读取配置数据)
yamllint 语法检测 https://www.yamllint.com/
![cms图片](cms.png)
cms中以EN结尾的为对应中文的英文文案,支持markdown编辑,榕汇文章与动态可同步cms动态发布与更新,文章中图片会自动压缩
![cms图片2](cms2.png)
cms修改后,可进入流水线查看发布状态并手动上线 https://git.gaorongvc.cn/lq/official/pipelines
[添加文章示范](https://git.gaorongvc.cn/lq/official/wikis/%E5%AE%98%E7%BD%91%E6%96%87%E7%AB%A0%E5%BD%95%E5%85%A5markdown%E7%A4%BA%E8%8C%83)
[时间轴图片更新教程](https://git.gaorongvc.cn/lq/official/wikis/%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4%E8%BD%B4%E5%9B%BE%E7%89%87)
### 项目结构
#### components
通用组件,包含轮播图,文章,弹窗框等
#### content
是通过cms写入的配置文件,存放网页文案与图片信息,可以通过cms自动提交,也可以手动编辑提交,cms配置文件在static/admin/config.yml
#### pages
对应页面文件,包含基础样式,官网页面和错误页
#### static
存放字体,图片,通用脚本与netlify cms配置
#### utils
辅助脚本
#### .eslintrc.js .eslintignore
lint配置
#### .babelrc
babel自定义转码配置, 主要作用是移除代码中strict声明解决ie兼容性问题
#### postcss.config.js
样式文件兼容性处理
#### nextjs.config.js
nextjs配置文件
### 说明
* 使用git pull -r,避免使用merge保持提交历史的清晰
* 运行会出现点击头部导航会进入错误页的问题,需要手动添加html后缀,因为阿里云cdn只能使用静态html文件(有利于搜索优化),所以链接也使用html,静态生成的html没有问题
* 部分含图片的提交会触发Administrator的自动提交,描述为auto compress image,说明提交中的图片需要压缩
* 通常不需要做响应式处理转换rem,后面添加 /\* px \*/可以生成对应不同dpr的样式,添加 /\* no \*/不做任何转换
\ No newline at end of file
cms.png

23.4 KB

cms2.png

319 KB

.article-component-wrapper {
background: white;
float: left;
margin-left: 3%;
margin-bottom: 3%;
width: 30.3%;
cursor: pointer;
}
.modal-article .modal-wrapper {
padding: 40px 0; /* px */
}
.article-pic, .modal-article-pic {
width: 100%;
padding-bottom: 62.4%;
background-size: cover;
background-position: center;
}
.modal-article-pic {
padding-bottom: 43%;
margin-bottom: 32px; /* px */
}
.article-content-wrapper, .modal-article-content-wrapper {
position: relative;
}
.article-content-wrapper {
padding: 24px; /* px */
height: 220px; /* px */
}
.article-component-type {
position: absolute;
font-size: 14px; /* px */
font-weight: 500;
color: #A25641;
top: 16px; /* px */
}
.modal-article-content-wrapper .article-component-type {
top: 0;
margin-left: 48px; /* px */
}
.article-body-wrapper, .modal-article-body-wrapper {
position: relative;
top: 20px; /* px */
display: flex;
flex-direction: column;
justify-items: flex-start;
align-items: flex-start;
margin-bottom: 25px; /* px */
}
.article-body-wrapper {
height: 190px; /* px */
}
.article-title {
width: 100%;
font-size: 20px; /* px */
font-weight: 500;
line-height: 150%;
margin-bottom: 10px; /* px */
flex: none;
}
.modal-article-body-wrapper .article-title {
box-sizing: border-box;
padding: 8px 48px 25px 48px; /* px */
}
.modal-article-body-wrapper .article-date {
margin: 20px 48px 0 48px; /* px */
width: 100px; /* px */
}
.article-abstract {
color: #666;
font-size: 14px; /* px */
width: 100%;
line-height: 180%;
flex: auto;
overflow: hidden;
position: relative;
}
.modal-article-body-wrapper .article-abstract {
width: 100%;
box-sizing: border-box;
padding: 0 48px ; /* px */
font-size: 16px; /* px */
font-weight: 400;
}
.article-date {
flex: none;
margin-top: 20px; /* px */
color: #b3b3b3;
width: 100%;
}
.article-readmore {
float: right;
color: #A25641;
}
.article-line-wrapper a:first-child > .article-line-component-wrapper {
margin-left: 0;
margin-right: 3%;
}
@media screen and (max-width: 1200px) {
.article-component-wrapper {
width: 47%;
}
.article-title {
font-size: 18px; /* px */
}
}
@media screen and (max-width: 779px) {
.article-component-wrapper {
width: 97%;
margin-left: 3%;
margin-bottom: 32px;
}
.article-line-component-wrapper {
width: 100% !important;
margin-left: 0;
}
.article-title {
font-size: 16px; /* px */
}
}
\ No newline at end of file
import React from 'react'
import classnames from 'classnames'
/* eslint-disable no-unused-vars */
import Link from 'next/link'
import OverflowBox from 'overflowbox'
import Modal from '../Modal'
/* eslint-enable no-unused-vars */
import { yymmdd } from '../../utils/date'
import ronghuiPage from '../../content/ronghuiPage.md'
import './index.css'
export default class Article extends React.Component {
constructor(props) {
super(props)
this.state = {
showModal: false,
mounted: false
}
}
componentDidMount() {
this.setState({
mounted: true
})
}
renderContent() {
const {
attributes: { readMore, readMoreEN }
} = ronghuiPage
const { en, article, type, className, style } = this.props
const ronghuiReadMore =
type === 'article' && (en ? article.contentEN : article.content)
return (
<div
className={classnames({
'article-component-wrapper': true,
[className]: !!className
})}
onClick={(e) => this.openModal(true, e)}
style={style}
>
<div
className="article-pic"
style={{ backgroundImage: `url(${article.pic})` }}
></div>
<div className="article-content-wrapper">
{article.type && (
<div className="article-component-type">
{en === null ? '' : en ? article.typeEN : article.type}
</div>
)}
<div className="article-body-wrapper">
<div className="article-title">
{en === null ? '' : en ? article.titleEN : article.title}
</div>
<div className="article-abstract">
<OverflowBox
str={(en === null
? ''
: en
? article.abstractEN
: article.abstract
).replace(/\n/g, '')}
/>
</div>
<div className="article-date">
{yymmdd(new Date(article.createDate)).join('/')}
{ronghuiReadMore && (
<span className="article-readmore">
{en === null ? '' : en ? readMoreEN : readMore}
</span>
)}
</div>
</div>
</div>
</div>
)
}
openModal(p, e) {
e.stopPropagation()
this.setState({
showModal: p
})
}
render() {
const {
attributes: { readMore, readMoreEN }
} = ronghuiPage
const { en, article, type } = this.props
const { showModal, mounted } = this.state
const key = article.createDate.replace(/[^\d]/g, '')
const ronghuiReadMore =
type === 'article' && (en ? article.contentEN : article.content)
const ronghuiModal =
type === 'article' && (en ? !article.contentEN : !article.content)
return ronghuiModal ? (
<a style={{ display: 'block', color: 'black' }}>
{this.renderContent()}
{showModal && (
<Modal
className="modal-article"
onClose={(e) => {
this.openModal(null, e)
e.stopPropagation()
}}
>
<div className="modal-article-content-wrapper">
{article.type && (
<div className="article-component-type">
{en === null ? '' : en ? article.typeEN : article.type}
</div>
)}
<div className="modal-article-body-wrapper">
<div className="article-title">
{en === null ? '' : en ? article.titleEN : article.title}
</div>
<div
className="modal-article-pic"
style={{
backgroundImage: mounted ? `url(${article.pic})` : 'none'
}}
></div>
<div className="article-abstract">
{(en === null
? ''
: en
? article.abstractEN
: article.abstract
).replace(/\n/g, '')}
</div>
<div className="article-date">
{yymmdd(new Date(article.createDate)).join('/')}
{ronghuiReadMore && (
<span className="article-readmore">
{en === null ? '' : en ? readMoreEN : readMore}
</span>
)}
</div>
</div>
</div>
</Modal>
)}
</a>
) : (
<Link prefetch={false} href={`/post.html?t=${type}&d=${key}`}>
<a className="linka">{this.renderContent()}</a>
</Link>
)
}
}
.article-grid-wrapper {
margin-top: 3%;
margin-left: -3%;
}
.article-grid-wrapper::before, .article-grid-wrapper::after{
content: '';
display: block;
clear: both;
}
.article-grid-load-more {
border-top: solid 1px #d3d1d1;
border-bottom: solid 1px #d3d1d1;
text-align: center;
padding: 30px 0; /* px */
box-sizing: border-box;
cursor: pointer;
width: 100%;
color: #201714;
font-size: 16px; /* px */
font-weight: 500;
}
@media screen and (max-width: 780px) {
.article-grid-wrapper {
margin-top: 24px; /* px */
}
.article-grid-load-more {
padding: 22px 0; /* px */
}
}
\ No newline at end of file
import React from 'react'
import classnames from 'classnames'
import Article from '../Article'
import './index.css'
export default class ArticleGrid extends React.PureComponent {
static defaultProps = {
searchKey: ''
}
constructor(props) {
super(props)
const { articleList, en } = this.props
const articles = articleList.filter((a) =>
{
if(a.hide) return false
return en === null ? '' : en ? a.abstractEN : a.abstract
}
)
const showMoreBtn = articles.length > 6
this.state = {
num: showMoreBtn ? 6 : articles.length,
showMoreBtn,
articles
}
this.loadMore = this.loadMore.bind(this)
}
// getLength(en, articleList) {
// return articleList
// .filter((a) => (en === null ? '' : en ? a.abstractEN : ab.abstract))
// .reduce((sum, _) => sum + 1)
// }
componentWillReceiveProps(nextProps) {
if (
nextProps.articleList.length !== this.props.articleList.length ||
nextProps.en !== this.props.en
) {
const articles = nextProps.articleList.filter((a) =>
{
if(a.hide) return false
return nextProps.en === null ? '' : nextProps.en ? a.abstractEN : a.abstract
}
)
const showMoreBtn = articles.length > 6
this.setState({
num: showMoreBtn ? 6 : articles.length,
showMoreBtn,
articles
})
}
}
loadMore() {
const nextNum = this.state.num + 6
this.setState({
num: nextNum,
showMoreBtn: nextNum < this.state.articles.length
})
}
render() {
const { en, type, className, searchKey } = this.props
const { num, showMoreBtn, articles } = this.state
return (
<React.Fragment>
<div
className={classnames({
'article-grid-wrapper': true,
[className]: !!className
})}
>
{articles.slice(0, num).map((n) => {
const key = n.createDate.replace(/[^\d]/g, '')
return (
<Article key={key + searchKey} en={en} article={n} type={type} />
)
})}
</div>
{showMoreBtn && (
<div className="article-grid-load-more" onClick={this.loadMore}>
{en === null ? '' : en ? 'Load More' : '加载更多'}
</div>
)}
</React.Fragment>
)
}
}
.article-line-wrapper {
max-width: 824px; /* px */
width: 90%;
padding: 0 2%;
overflow: hidden;
margin: 48px auto; /* px */
}
.article-recommend-line {
display: inline-block;
margin-top: 0.8em;
border-top: solid 1px #d3d1d1; /* px */
opacity: .5;
width: 46%;
min-width: 30%;
flex: auto;
}
.article-recommend {
display: flex;
padding: 0;
font-size: 16px; /* px */
font-weight: 500;
box-sizing: border-box;
}
.article-recommend-text {
padding-left: 8px; /* px */
padding-right: 8px; /* px */
word-wrap: none;
word-break: keep-all;
box-sizing: border-box;
}
\ No newline at end of file
import React from 'react'
// eslint-disable-next-line no-unused-vars
import Article from '../Article'
import mediaQueryType from '../../utils/mediaQueryType'
import './index.css'
export default class ArticleLine extends React.PureComponent {
constructor(props) {
super(props)
this.state = {
num: 0,
width: 0
}
this.handleWindowResize = this.handleWindowResize.bind(this)
}
calcNum(type) {
if (type === 0)
return {
num: 2,
width: '95%'
}
else
return {
num: 2,
width: '47%'
}
}
handleWindowResize() {
const type = mediaQueryType(document.body.offsetWidth)
this.setState(this.calcNum(type))
}
componentWillMount() {
window.addEventListener('resize', this.handleWindowResize)
this.handleWindowResize()
}
componentWillUnmount() {
window.removeEventListener('resize', this.handleWindowResize)
}
render() {
const { en, type, articleList } = this.props
const { num, width } = this.state
if (type === 'article') {
return null
}
return (
<React.Fragment>
<div className="article-recommend article-line-wrapper">
<div className="article-recommend-line article-recommend-line-left"></div>
<span className="article-recommend-text">
{en ? 'Recommend' : '推荐阅读'}
</span>
<div className="article-recommend-line article-recommend-line-right"></div>
</div>
<div className="article-line-wrapper">
{articleList
.filter((article) => {
if (en) {
return article.abstractEN
}
return article.abstract
})
.slice(0, num)
.map((n) => {
const key = n.createDate.replace(/[^\d]/g, '')
return (
<Article
className="article-line-component-wrapper"
style={{ width }}
key={key}
en={en}
article={n}
type={type}
/>
)
})}
</div>
</React.Fragment>
)
}
}
import React from 'react'
import { getArr } from './util'
export default class Slice extends React.Component {
state = {
offset: 0,
isRolling: false,
prevDigit: 0,
}
componentDidMount = () => {
const { digit, height } = this.props
const offset = -digit * height
this.timer = setTimeout(() => {
this.setState({ offset, isRolling: true })
}, 100)
}
componentWillUnmount() {
clearTimeout(this.timer)
}
componentWillReceiveProps = nextProps => {
if (nextProps.digit !== this.props.digit) {
this.reset(this.props.digit)
//slice move in animation
const diff = nextProps.digit - this.props.digit
const offset =
diff > 0 ? -diff * this.props.height : -(diff + 10) * this.props.height
setTimeout(() => {
this.setState({ offset, isRolling: true })
}, 100)
}
}
reset = prevDigit => {
this.setState({ offset: 0, isRolling: false, prevDigit })
}
render() {
const { digit, width, height, delay } = this.props
const arr = getArr(this.state.prevDigit, digit)
return (
<div
className={`DigitRoll__Slice }`}
style={{
marginTop: this.state.offset + 'rem',
transition: this.state.isRolling ? `margin ${delay}s ease` : '',
}}
>
{arr.map((d, index) => (
<div
key={index}
className="DigitRoll__Cell"
style={{ height: height + 'rem', lineHeight: height + 'rem', width: width + 'em' }}
>
{d}
</div>
))}
</div>
)
}
}
\ No newline at end of file
.DigitRoll {
display: flex;
flex-direction: row-reverse;
overflow-y: hidden;
/* border: 1px solid; */
}
.DigitRoll__Slice {
display: flex;
flex-direction: column;
box-sizing: border-box;
}
.DigitRoll__Cell {
flex: none;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
div.DigitRoll__Divider {
font-size: 16px; /* px */
padding-left: 2px; /* px */
padding-right: 2px; /* px */
display: flex;
align-items: center;
align-items: flex-end;
padding-bottom: 0.04rem;
padding-bottom: 0.2rem\0;
box-sizing: border-box;
}
@media screen and (max-width: 780px) {
div.DigitRoll__Divider {
font-size: 12px; /* px */
padding-bottom: .08rem !important;
padding-bottom: .2rem\0 !important;
}
}
@media screen and (max-width: 440px) {
.en div.DigitRoll__Divider {
font-size: 12px; /* px */
padding-bottom: .04rem !important;
padding-bottom: .2rem\0 !important;
}
div.DigitRoll__Divider {
font-size: 12px; /* px */
padding-bottom: .0rem !important;
padding-bottom: .2rem\0 !important;
}
}
\ No newline at end of file
import React from 'react'
import Slice from './Slice'
import { formatDigit } from './util'
import './index.css'
export default class DigitRoll extends React.Component {
render() {
const {
num,
length,
height,
width,
divider = '',
delay,
className,
children
} = this.props
const numArr = formatDigit(num, length, divider)
const validDivider =
divider !== undefined &&
(typeof divider === 'string' || typeof divider === 'number')
return (
<div className="DigitRoll__Out" style={{ display: 'flex' }}>
<div
className={`DigitRoll ${className}`}
style={{ height: height + 'rem' }}
>
{numArr.map((d, index) => {
if (validDivider && index % 4 === 3) {
return null
// return <Divider key={index} divider={divider} height={height} />
}
return (
<Slice
key={index}
digit={d}
height={height}
width={width}
delay={delay}
/>
)
})}
</div>
<div className="DigitRoll__Divider" style={{ height: height + 'rem' }}>
{children}
</div>
</div>
)
}
}
DigitRoll.defaultProps = {
num: '000000',
height: 3,
width: 2,
delay: 2,
className: ''
}
// const Divider = ({ divider, height }) => (
// <div style={{ height: height + 'rem' }} className="DigitRoll__Divider">
// {divider}
// </div>
// )
// 456,6,',' => '000,456'
export const formatDigit = (num, length, divider) => {
let sum = '0' // in case some random input
if (typeof num === 'string') {
sum = num
} else if (typeof num === 'number') {
sum = num.toString()
}
// '1234' => '001234'
const _len = sum.length
const _fullLen = length && typeof length === 'number' ? length : _len
if (_len >= _fullLen) {
sum = sum.substring(_len - _fullLen, _len)
} else {
for (let i = 0; i < _fullLen - _len; i++) {
sum = '0' + sum
}
}
sum = sum.split('').reverse()
for (let i = sum.length - 1; i > 0; i--) {
if (i % 3 === 0) {
sum.splice(i, 0, divider)
}
}
return sum
}
const _getArr = (a, b) => new Array(b - a + 1).fill(0).map((i, index) => a + index)
//'9','2' => [9,0,1,2]
export const getArr = (x, y) => {
const a = parseInt(x, 10)
const b = parseInt(y, 10)
if (a === b) {
return [a]
}
if (a < b) {
return _getArr(a, b)
}
if (a >= b) {
return [..._getArr(a, 9), ..._getArr(0, b)]
}
}
\ No newline at end of file
@media screen and (min-width: 1441px) {
.footer-wrapper {
height: 480px; /* px */
padding: 162px 0;/* px */
}
.lang {
margin-bottom: 64px; /* px */
float: left;
}
.lang .lang-col-img {
margin-bottom: 32px; /* px */
}
.lang img {
float: left;
margin-bottom: 32px; /* no */
}
.lang span.lang-col {
float: left;
}
.lang span.lang-col1 {
clear: both;
}
.lang span.lang-col2 {
margin-top: 4px\0; /* px */
}
.footer-group1 {
width: 50%;
}
.contact {
float: right;
}
.footer-group2 {
width: 25%;
float: right;
height: 208px; /* px */
}
.address-row-wrapper {
float: left;
/* width: 100%; */
width: 246px; /* px */
margin-bottom: 52px; /* px */
}
.address-row-wrapper.row3 {
clear: both;
}
.address-row-wrapper.row2, .address-row-wrapper.row4 {
float: right;
}
}
\ No newline at end of file
@media screen and (max-width: 1440px) and (min-width: 831px){
.footer-wrapper {
height: 560px; /* px */
padding: 120px 0; /* px */
}
.lang {
margin-bottom: 64px; /* px */
}
.footer-group1 {
width: 204px; /* px */
}
.footer-group2 {
width: 45%;
float: right;
margin-top: 108px; /* px */
height: 208px; /* px */
}
.address-row-wrapper {
float: left;
/* width: 100%; */
width: 246px; /* px */
margin-bottom: 52px; /* px */
}
.address-row-wrapper.row3 {
clear: both;
}
.address-row-wrapper.row2, .address-row-wrapper.row4 {
float: right;
}
}
\ No newline at end of file
@media screen and (max-width:595px) {
.footer-wrapper {
height: 600px; /* px */
}
.lang {
margin-bottom: 32px; /* px */
}
.footer-group1 {
width: 100%;
margin-bottom: 50px; /* px */
}
.address-wrapper {
width: 100%;
}
.address-row-wrapper {
float: left;
width: 96%;
margin-bottom: 24px; /* px */
}
.address-row-wrapper > .col-left {
margin-right: 24px; /* px */
min-width: 48px; /* px */
}
.footer-group2 {
float: left;
}
.limitw.footer-limitw {
padding-left: 38px; /* px */
padding-right: 1px; /* px */
}
}
@media screen and (max-width:530px) {
.footer-rights {
text-align: left;
}
}
@media screen and (max-width:830px) and (min-width:596px) {
.footer-wrapper {
height: 460px; /* px */
padding: 64px 0; /* px */
}
.lang {
margin-bottom: 64px; /* px */
}
.footer-group1 {
width: 204px; /* px */
}
.address-wrapper {
width: 262px; /* px */
/* width: 100%; */
/* height: 100px; */
}
.footer-group2 {
float: right;
margin-top: 108px; /* px */
}
.address-row-wrapper {
float: left;
width: 100%;
margin-bottom: 52px; /* px */
}
}
\ No newline at end of file
.footer-wrapper {
position: relative;
box-sizing: border-box;
font-size: 14px; /* px */
width: 100%;
background-color: #201714;
background-image: url('/static/img/footer-tile.svg');
background-size: auto 100%;
color: white;
font-weight: 300;
padding: 64px 0; /* px */
}
.lang-col.lang-col-img {
display: inline-block;
vertical-align: middle;
margin-right: 24px; /* px */
width: 40px; /* px */
height: 40px; /* px */
background: url('/static/img/logo-yellow.svg');
background-size: cover;
background-repeat: none;
}
.lang span:not(.lang-col-img) {
display: inline-block;
box-sizing: border-box;
color: #FFCB05;
line-height: 24px; /* px */
text-align: center;
cursor: pointer;
}
.lang span.active {
border-bottom: solid 1px #FFCB05;
color: white;
}
.lang .lang-col1 {
margin-right: 16px; /* px */
}
.lang-col .active {
color: white;
}
.row-wrapper {
margin-bottom: 24px; /* px */
}
.row-wrapper > .col-left {
margin-right: 24px; /* px */
vertical-align: top;
display: inline-block;
min-width: 48px; /* px */
}
.row-wrapper > .col-right {
color: #FFCB05;
}
.row-wrapper > .col-right a {
text-decoration: none;
color: #FFCB05;
}
.footer-group1{
float: left;
}
.address-row-wrapper > .col-left {
margin-right: 16px; /* px */
margin-bottom: 8px; /* px */
color: white;
vertical-align: top;
display: inline-block;
}
.address-row-wrapper > .col-right {
display: inline-block;
color: white;
opacity: .5;
}
.footer-rights {
position: absolute;
overflow: hidden;
/* text-align: center; */
}
.footer-wrapper .footer-rights {
max-width: 336px; /* px */
}
.footer-rights-wrapper {
margin: 0 auto;
display: inline-block;
min-width: 100px; /* px */
overflow: hidden;
}
.footer-rights-item {
/* float: left; */
font-weight: 300;
font-size: 14px; /* px */
color: white;
opacity: .5;
margin-bottom: 24px; /* px */
}
.footer-rights-item a {
color: white;
cursor: pointer;
text-decoration: none;
}
.footer-rights-item a:hover {
text-decoration: underline;
}
\ No newline at end of file
import React from 'react'
import classnames from 'classnames'
// eslint-disable-next-line no-unused-vars
import { ThemeContext } from '../../pages/_app.js'
import footer from '../../content/foot.md'
import './index.css'
import './595.css'
import './830.css'
import './1440.css'
import './1440+.css'
export default class Footer extends React.Component {
genContactRow(left, right) {
return (
<div className="row-wrapper">
<span className="col-left">{left}</span>
<span className="col-right">{right}</span>
</div>
)
}
genAddressRow(left, right, idx) {
return (
<div
className={classnames({
'address-row-wrapper': true,
[`row${idx}`]: true
})}
>
<span className="col-left">{left}</span>
<span
className="col-right"
dangerouslySetInnerHTML={{ __html: right }}
></span>
</div>
)
}
render() {
const {
attributes: {
email,
emailEN,
emailStr,
phone,
phoneEN,
phoneStr,
fax,
faxEN,
faxStr,
wechat,
wechatEN,
// beijing,
// beijingEN,
// shanghai,
// shanghaiEN,
// shenzhen,
// shenzhenEN,
// xianggang,
// xianggangEN,
// beijingloc,
// beijinglocEN,
// shanghailoc,
// shanghailocEN,
// shenzhenloc,
// shenzhenlocEN,
// xianggangloc,
// xiangganglocEN,
wechatimg
}
} = footer
return (
<ThemeContext.Consumer>
{(val) => {
const { en, setLang } = val
return (
<div className="footer-wrapper">
<div className="limitw footer-limitw">
<div className="footer-group1">
<div className="lang">
<span className="lang-col lang-col-img"></span>
<span
onClick={(e) => {
e.stopPropagation()
setLang(false)
}}
className={classnames({
'lang-col': true,
'lang-col1': true,
active: !en
})}
>
中文
</span>
<span
onClick={(e) => {
e.stopPropagation()
setLang(true)
}}
className={classnames({
'lang-col': true,
'lang-col2': true,
active: en
})}
>
English
</span>
</div>
<div className="contact">
{this.genContactRow(
en === null ? '' : en ? emailEN : email,
<a href={'mailto:' + emailStr}>{emailStr}</a>
)}
{this.genContactRow(
en === null ? '' : en ? phoneEN : phone,
phoneStr
)}
{this.genContactRow(
en === null ? '' : en ? faxEN : fax,
faxStr
)}
{this.genContactRow(
en === null ? '' : en ? wechatEN : wechat,
<img src={wechatimg}></img>
)}
</div>
</div>
<div className="footer-group2 address-wrapper">
<div className="footer-rights">
<div className="footer-rights-wrapper">
<div className="footer-rights-item">
© {new Date().getFullYear()}
{en ? ' Gaorong Ventures' : ' 高榕创投'}
</div>
<div className="footer-rights-item">
{' '}
<a href="https://beian.miit.gov.cn/" target="_blank">ICP14020814</a>
</div>
<div className="footer-rights-item">
<a href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502038966">
京公网安备11010502038966
</a>
</div>
</div>
</div>
{/* {this.genAddressRow(
en === null ? '' : en ? beijingEN : beijing,
en === null ? '' : en ? beijinglocEN : beijingloc,
1
)}
{this.genAddressRow(
en === null ? '' : en ? shenzhenEN : shenzhen,
en === null ? '' : en ? shenzhenlocEN : shenzhenloc,
2
)}
{this.genAddressRow(
en === null ? '' : en ? shanghaiEN : shanghai,
en === null ? '' : en ? shanghailocEN : shanghailoc,
3
)}
{this.genAddressRow(
en === null ? '' : en ? xianggangEN : xianggang,
en === null ? '' : en ? xiangganglocEN : xianggangloc,
4
)}*/}
</div>
</div>
</div>
)
}}
</ThemeContext.Consumer>
)
}
}
.header-wrapper {
margin: 0 auto;
z-index: 1;
padding: 88px 0; /* no */
}
.header-logo {
display: inline-block;
width: 155px; /* px */
height: 60px; /* px */
font-size: 18px; /* px */
background-image: url('/static/img/newlogo.png');
background-size: cover;
cursor: pointer;
}
.header-collapse-btn {
cursor: pointer;
position: fixed;
height: 32px; /* px */
width: 32px; /* px */
right: 32px; /* px */
top: 52px; /* px */
z-index: 30;
background-image: url('/static/img/MenuBtn.svg');
background-size: cover;
}
.modal-header .modal-wrapper {
height: 100%;
width: 100%;
padding-left: 0;
}
.modal-header-content {
padding-top: 12%;
}
.modal-header-content > span.header-index {
float: right;
clear: both;
margin: 2% 0;
font-size: 24px; /* px */
}
.modal-header-bg {
position: absolute;
opacity: 0.5;
left: 0;
bottom: 0;
z-index: -1;
width: 100%;
height: 50%;
background-repeat: no-repeat;
background-position: bottom right;
background-size: contain;
background-image: url("/static/img/tree-mask-image.svg");
}
.modal-header-contact {
margin-top: 24%;
float: right;
clear: both;
}
.header-contact-wrapper {
float: right;
clear: both;
font-weight: normal;
margin-top: 16px; /* px */
}
.header-contact-top, .header-contact-bottom {
float: right;
clear: both;
font-size: 16px; /* px */
color: #444;
}
.header-contact-bottom {
margin-top: 12px; /* px */
}
.header-contact-bottom, .header-contact-bottom a {
color: #984c39;
text-decoration: none;
}
.header-index {
display: inline-block;
margin-left: 48px; /* no */
font-size: 18px; /* px */
line-height: 200%;
color: #444;
cursor: pointer;
}
.header-index.emphasis-warn{
background: #ffcb05;
line-height: 1;
padding: 4px 4px 0;
}
.header-index a {
color: #444;
text-decoration: none;
}
.navigator-wrapper .header-index:first-child {
margin-left: 0;
}
.header-index:hover {
color: #241712;
}
.header-index.active a {
color: #A25641;
/* border-bottom: solid 3px#FFCB05; /* px */
}
.header-index a:active {
color: #A25641;
/* border-bottom: solid 3px#FFCB05; /* px */
}
.header-index.active:after {
content: '';
display: block;
margin: auto;
height: 3px; /* px */
width: 100%;
background: #FFCB05;
}
/* .header-index:hover {
transition: border 1s;
border-bottom: solid 2px#FFCB05;
} */
.header-index:after {
content: '';
display: block;
/* margin: auto; */
height: 3px; /* px */
width: 0px;
background: transparent;
transition: width .7s ease, background-color .7s ease;
}
.header-index:hover:after {
width: 100%;
background: #FFCB05;
}
.navigator-wrapper {
/* max-width: 1000px; */
float: right;
font-weight: 400;
font-size: 20px; /* px */
}
.modal-header-lang {
clear: both;
float: right;
margin-top: 24px; /* px */
font-size: 16px; /* px */
}
.lang span.modal-header-col:not(.lang-col-img) {
color: #444;
}
@media screen and (max-width: 850px) {
.header-wrapper {
padding: 48px; /* px */
}
}
import React from 'react'
import Link from 'next/link'
import Head from 'next/head'
import classnames from 'classnames'
import { ThemeDecorator } from '../../pages/_app.js'
import head from '../../content/head.md'
// import footer from '../../content/foot.md'
import Modal from '../Modal'
import './index.css'
export class Header extends React.PureComponent {
constructor(props) {
super(props)
this.state = {
collapse: false,
showModal: false
}
this.handleWindowResize = this.handleWindowResize.bind(this)
this.renderLinks = this.renderLinks.bind(this)
this.renderCollapse = this.renderCollapse.bind(this)
}
genLink(en, curPage, path, txt, txtEN, query=null, emphasis=false) {
return (
<span
className={classnames({
'header-index': true,
'emphasis-warn': emphasis,
active: curPage === path
})}
>
<Link prefetch={false} href={{ pathname: '/' + path, query }}>
<a style={{ height: '100%', display: 'inline-block' }}>
{en === null ? '' : en ? txtEN : txt}
</a>
</Link>
</span>
)
}
handleWindowResize() {
this.setState({
collapse: document.body.offsetWidth < 850
})
}
componentDidMount() {
window.addEventListener('resize', this.handleWindowResize)
this.handleWindowResize()
}
componentWillUnmount() {
window.removeEventListener('resize', this.handleWindowResize)
}
openModal(p, e) {
e.stopPropagation()
setTimeout(() =>
this.setState({
showModal: p
})
)
}
genContactRow(top, bottom) {
return (
<div className="header-contact-wrapper">
<span className="header-contact-top">{top}</span>
<span className="header-contact-bottom">{bottom}</span>
</div>
)
}
renderCollapse(showModal, en) {
// const {
// attributes: { email, emailEN, emailStr, phone, phoneEN, phoneStr }
// } = footer
const { setLang } = this.props
if (showModal) {
return (
<Modal
className="modal-header"
onClose={(e) => {
this.openModal(null, e)
e.stopPropagation()
}}
>
<div className="modal-header-bg"></div>
<div className="modal-header-content">
{this.renderLinks()}
{/* <div className="modal-header-contact">
{this.genContactRow(
en === null ? '' : en ? emailEN : email,
<a href={'mailto:' + emailStr}>{emailStr}</a>
)}
{this.genContactRow(
en === null ? '' : en ? phoneEN : phone,
phoneStr
)}
</div> */}
<div className="lang modal-header-lang">
{/* <span className="lang-col lang-col-img modal-header-col"></span> */}
<span
onClick={(e) => {
e.stopPropagation()
setLang(false)
this.openModal(null, e)
}}
className={classnames({
'modal-header-col': true,
'lang-col': true,
'lang-col1': true,
active: !en
})}
>
中文
</span>
<span
onClick={(e) => {
e.stopPropagation()
setLang(true)
this.openModal(null, e)
}}
className={classnames({
'modal-header-col': true,
'lang-col': true,
'lang-col2': true,
active: en
})}
>
English
</span>
</div>
</div>
</Modal>
)
}
return (
<div
className="header-collapse-btn"
onClick={(e) => this.openModal(true, e)}
></div>
)
}
renderLinks() {
const {
attributes: {
home,
homeEN,
about,
aboutEN,
portfolio,
portfolioEN,
news,
newsEN,
}
} = head
const { en, curPage, setLang } = this.props
const { collapse } = this.state
return (
<React.Fragment>
{this.genLink(en, curPage, '', home, homeEN)}
{this.genLink(en, curPage + '.html', 'about.html', about, aboutEN)}
{this.genLink(
en,
curPage + '.html',
'portfolio.html',
portfolio,
portfolioEN
)}
{this.genLink(en, curPage + '.html', 'news.html', news, newsEN)}
{!collapse && en !== null && (
<span
className={classnames({
'header-index': true
})}
onClick={() => {
setLang(en ? false : true)
}}
>
{en ? '中文' : 'EN'}
</span>
)}
</React.Fragment>
)
}
render() {
const { collapse, showModal } = this.state
const { en, curPage } = this.props
return (
<div className="header-wrapper limitw">
{curPage !== 'post' && (
<Head>
<title>{en ? 'Gaorong Ventures' : '高榕创投'}</title>
</Head>
)}
<Link prefetch={false} href={{ pathname: '/' }}>
<a className="header-logo"></a>
</Link>
{collapse ? (
this.renderCollapse(showModal, en)
) : (
<span className="navigator-wrapper">{this.renderLinks()}</span>
)}
</div>
)
}
}
export default ThemeDecorator(Header)
.image-cycle-image1, .image-cycle-image2, .image-cycle-mask1, .image-cycle-mask2, .image-cycle-image-placeholder {
width: 100%;
height: 100%;
position: absolute;
bottom: 0; /* px */
right: 0; /* px */
background-repeat: no-repeat;
}
.image-cycle-image1, .image-cycle-image2, .image-cycle-image-placeholder {
background-size: auto 100%;
}
.image-cycle-image-placeholder {
opacity: 0;
transition: opacity 1s ease;
}
.image-cycle-image-show {
opacity: 1;
}
.image-cycle-image1 {
z-index: 1;
}
.image-cycle-image2 {
background-position: bottom right;
bottom: -10%;
z-index: 2;
box-sizing: border-box;
/* border-bottom: solid 1px white; */
}
.image-cycle-mask1 {
z-index: 3;
height: 100%;
background-position: bottom left;
background-size: contain;
background-image: url('/static/img/image-mask-face-right.svg');
}
.image-cycle-mask2 {
z-index: 3;
height: 100%;
background-position: bottom right;
bottom: -10%;
background-size: contain;
background-image: url('/static/img/image-mask-face-left.svg');
}
import React, { Component } from 'react'
import classnames from 'classnames'
import './index.css'
export default class ImageCycle extends Component {
constructor(props) {
super(props)
this.state = {
i1: 0,
i2: 1,
mobile: true,
mounted: false
}
this.imageList = props.imageList
if (this.imageList && this.imageList.length % 2 !== 0) {
this.imageList.push(this.imageList[Math.floor(this.imageList.length / 2)])
}
this.length = this.imageList.length
this.changeImg1 = this.changeImg1.bind(this)
this.changeImg2 = this.changeImg2.bind(this)
this.handleWindowResize = this.handleWindowResize.bind(this)
}
componentDidMount() {
this.timer2 = setInterval(this.changeImg2, 5000)
this.timer1 = setTimeout(() => {
this.changeImg1()
this.timer3 = setInterval(this.changeImg1, 5000)
}, 2500)
window.addEventListener('resize', this.handleWindowResize)
this.handleWindowResize()
this.setState({
mounted: true
})
}
handleWindowResize() {
this.setState({
mobile: document.body.offsetWidth < 780
})
}
componentWillUnmount() {
window.removeEventListener('resize', this.handleWindowResize)
clearTimeout(this.timer1)
clearInterval(this.timer2)
clearInterval(this.timer3)
}
changeImg1() {
this.setState({
i1: (this.state.i1 + 2) % this.length
})
}
changeImg2() {
this.setState({
i2: (this.state.i2 + 2) % this.length
})
}
render() {
const { i1, i2, mobile, mounted } = this.state
return (
<div className="image-text-column-col2">
{this.imageList.map((img, idx) => (
<div
key={idx}
className={classnames({
'image-cycle-image-show': i1 === idx || i2 === idx,
'image-cycle-image1': idx % 2 === 0,
'image-cycle-image2': idx % 2 === 1,
'image-cycle-image-placeholder': true
})}
style={{
backgroundImage: !mounted
? 'none'
: `url(${mobile ? img.image1 : img.image1_2})`
}}
></div>
))}
<div className="image-cycle-mask1"></div>
<div className="image-cycle-mask2"></div>
<div className="clear"></div>
</div>
)
}
}
.index-page-common {
width: 100%;
background: white;
overflow: hidden;
box-sizing: border-box;
position: relative;
}
.index-title {
color: #201714;
z-index: 0;
font-size: 64px; /* px */
line-height: 125%;
position: relative;
}
.en .index-title {
font-size: 48px; /* px */
}
.index-title.index-title-top {
/* color: white; */
font-size: 72px; /* px */
line-height: 1.2;
/* margin-top: 43vh; */
}
.en .index-title.index-title-top {
font-size: 56px; /* px */
}
.index-sub-title {
color: #444;
font-weight: 300;
font-size: 24px; /* px */
line-height: 167%; /* px */
text-align: justify;
margin-top: 24px; /* px */
}
.en .index-sub-title {
text-align: left;
max-width: 580px; /* px */
}
.en .index-title {
font-family: 'IBM Plex Serif' !important;
font-weight: 500;
}
.emphasis, .emphasis2, .yellow {
position: relative;
}
.zh .emphasis::before, .zh .emphasis2::before {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 1em; /* px */
border-bottom: solid 0.5em #FFDA57;
z-index: -1;
}
.yellow {
display: inline-block;
z-index: 0;
}
.yellow::before {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 100%;
border-bottom: solid 0.5em #FFDA57;
z-index: -1;
}
.zh .emphasis2::before {
width: 2em; /* px */
}
@media screen and (max-width: 780px) {
.index-title {
font-size: 32px; /* px */
}
.index-title-svg {
height: 40px; /* px */
}
.index-title-svg.index-title-two-line {
height: 80px; /* px */
}
.en .index-title {
font-size: 24px; /* px */
}
}
\ No newline at end of file
// eslint-disable-next-line no-unused-vars
import React from 'react'
import classnames from 'classnames'
import './index.css'
export function Title(props) {
let child = <span dangerouslySetInnerHTML={{ __html: props.children }}></span>
if (!props.en && /svg$/.test(props.children)) {
child = (
<React.Fragment>
<h1 className="title-decorate">
{props.children.slice(0, props.children.indexOf('.'))}
</h1>
<img
alt={props.children.slice(0, props.children.indexOf('.'))}
className={classnames({
'index-title-svg': true,
'index-title-two-line': / |/.test(props.children)
})}
src={`/static/img/${props.children}`}
/>
</React.Fragment>
)
}
return (
<div
className={classnames({
'index-title': true,
[props.className]: !!props.className
})}
>
{child}
</div>
)
}
export function SubTitle(props) {
return (
<div
style={props.style}
className={classnames({
'index-sub-title': true,
[props.className]: !!props.className
})}
dangerouslySetInnerHTML={{ __html: props.children }}
></div>
)
}
.index-portfolio-two-column-not-choosen {
height: 0;
}
.index-portfolio-text {
width: 25%;
position: relative;
height: 0;
}
.index-portfolio-text.index-portfolio-text-choosen {
margin-top: 9em;
border-top: solid 1px #201714; /* px */
/* border-bottom: solid 1px #201714; /* px */
}
.index-portfolio-text-choosen .index-portfolio-footer {
border-top: solid 1px #201714; /* px */
}
.index-portfolio-progress {
width: 0;
height: 0px;
background: #FFDA57;
position: relative;
top: -1px; /* px */
transition: width 3s ease;
}
.index-portfolio-text-choosen .index-portfolio-progress.index-portfolio-progress-show {
height: 1px;/* px */
width: 100%;
}
.index-portfolio-text-mask {
min-height: 346px; /* px */
overflow: hidden;
}
.index-portfolio-textwrapper {
position: relative;
width: 100%;
transition: margin 1s ease;
margin-left: 0;
overflow: hidden;
}
.index-portfolio-textcss-enter.index-portfolio-textwrapper {
margin-left: -300px; /* px */
}
.index-portfolio-textcss-enter-done.index-portfolio-textwrapper {
margin-left: 0;
}
.index-portfolio-index {
display: none;
position: absolute;
top: -2em;
font-size: 20px; /* px */
color: #B3B3B3;
}
.index-portfolio-text-choosen .index-portfolio-index {
display: block;
}
.index-portfolio-current {
color: #444;
margin-right: 2px; /* px */
}
.index-portfolio-img-wrapper {
/* float: right; */
position: absolute;
box-sizing: border-box;
margin-left: 27%;
margin-top: 6em;
/* padding-bottom: 80vh; */
height: 80%;
overflow: hidden;
width: 66%;
display: block;
max-width: 1304px; /* px */
background-size: cover;
background-position: center;
border-left: solid 1px white; /* px */
transition: padding-bottom 3s ease;
}
.index-portfolio-imgbg {
width: 100%;
height: 100%;
cursor: pointer;
border: solid 2px white; /* px */
margin: -1px; /* px */
box-sizing: border-box;
transform: scale(1);
background-size: cover;
background-position: center;
background-repeat: no-repeat;
transition: transform 3s ease;
}
.index-portfolio-next.index-portfolio-choosen {
position: absolute;
opacity: 0;
right: 10%;
top: 45%;
width: 100px; /* px */
height: 100px; /* px */
background: url('/static/img/arrow-right-white.svg');
background-size: cover;
transition: opacity 0.7s ease-out, right 0.7s ease;
cursor: pointer;
}
.index-portfolio-img-wrapper.index-portfolio-choosen:hover .index-portfolio-next.index-portfolio-choosen {
right: 8%;
opacity: 1;
}
.index-portfolio-img-wrapper.index-portfolio-choosen::before {
content: "";
position: absolute;
display: inline-block;
margin-top: 0px;
margin-left: 0px;
pointer-events: none;
height: 100%;
z-index: 1;
width: 10.5%;
background: url('/static/img/index-portfolio-mask.svg');
background-size: cover;
}
.index-portfolio-imgbg::after {
content: "";
position: absolute;
top: -1px; /* px */
right: -1px; /* px */
display: inline-block;
height: 101%;
width: 0; /* px */
transition: width 1s ease;
background: white;
background-size: cover;
}
.index-portfolio-imgcss-enter.index-portfolio-imgbg {
transform: scale(1.2);
}
.index-portfolio-imgcss-enter-done.index-portfolio-imgbg {
transform: scale(1);
}
.index-portfolio-imgcss-enter.index-portfolio-imgbg::before {
padding-bottom: 120%;
}
.index-portfolio-imgcss-enter.index-portfolio-imgbg::after {
width: 99%;
}
.index-portfolio-imgcss-enter-done.index-portfolio-imgbg::after {
width: 0;
}
.index-portfolio-imgcss-exit.index-portfolio-imgbg::after {
width: 0;
}
.index-portfolio-imgcss-exit-active.index-portfolio-imgbg::after {
width: 99%;
}
.DigitRoll {
font-size: 30px; /* px */
color:#444;
}
.index-portfolio-logo {
margin-top: 32px; /* px */
max-width: 160px; /* px */
}
.index-portfolio-description {
/* transform: translateY(-50%); */
font-weight: 300;
line-height: 180%;
min-height: 214px; /* px */
padding: 20% 0 10% 0; /* px */
font-size: 24px; /* px */
color: #444;
}
.en .index-portfolio-description {
font-size: 20px; /* px */
padding: 10% 0 0 0; /* px */
}
.index-portfolio-footer {
display: none;
margin-top: 16px; /* px */
font-size: 14px; /* px */
font-weight: 300;
width: 100%;
color: #B3B3B3;
}
.index-portfolio-img-preload {
width: 0;
height: 0;
opacity: 0;
}
.index-portfolio-text-choosen .index-portfolio-footer {
display: block;
}
.index-portfolio-with {
padding-top: 16px; /* px */
margin-bottom: 16px; /* px */
min-width: 196px; /* px */
}
.index-portfolio-days {
font-size: 40px; /* px */
color: #444;
margin-right: 9px; /* px */
}
@media screen and (min-width: 1100px) {
.en .index-portfolio-description {
font-size: 18px; /* px */
}
}
@media screen and (max-width: 1000px) and (min-width: 781px) {
.en .index-portfolio-logo {
margin-top: 12px; /* px */
max-width: 130px; /* px */
}
.en .index-portfolio-with {
padding-top: 1px; /* px */
margin-bottom: -1px; /* px */
}
}
@media screen and (max-width: 1000px) {
.en .index-portfolio-description {
padding: 5% 0 0 0;
}
.index-portfolio-img-wrapper.index-portfolio-choosen::before {
width: 14%;
}
.index-portfolio-description {
font-size: 20px; /* px */
}
.en .index-portfolio-description {
font-size: 18px; /* px */
}
}
@media screen and (max-width: 1100px) {
.en .index-portfolio-description {
font-size: 18px; /* px */
}
}
@media screen and (max-width: 900px) {
.en .index-portfolio-description {
font-size: 16px; /* px */
}
}
@media screen and (max-width: 780px) {
.index-portfolio-logo {
max-width: 132px; /* px */
}
.index-portfolio-text-mask {
min-height: 1px; /* px */
}
div.index-portfolio-description {
font-size: 16px; /* px */
padding: 12px 0; /* px */
min-height: 1px; /* px */
}
.en div.index-portfolio-description {
font-size: 14px; /* px */
}
.two-column .index-portfolio-img-wrapper {
position: static;
margin-left: 0;
height: 250px; /* px */
width: 100%;
float: none;
}
.index-portfolio-img-wrapper.index-portfolio-choosen::before {
height: 251px; /* px */
background-size: contain;
background-repeat: no-repeat;
}
.index-portfolio-next.index-portfolio-choosen {
top: 48vw;
right: 15%;
}
.index-portfolio-img-wrapper.index-portfolio-choosen:hover .index-portfolio-next.index-portfolio-choosen {
right: 12%;
}
.index-portfolio-imgbg {
height: 250px; /* px */
}
.index-portfolio-text {
width: 100%;
}
.index-portfolio-img-wrapper {
margin-top: 80px; /* px */
}
.index-portfolio-text.index-portfolio-text-choosen {
margin-top: 36px; /* px */
}
.index-portfolio-index {
font-size: 14px; /* px */
}
.DigitRoll {
font-size: 24px; /* px */
}
.index-portfolio-text.index-portfolio-text-choosen {
height: auto;
}
.index-portfolio-footer {
font-size: 13px; /* px */
}
}
import React from 'react'
import classnames from 'classnames'
import { CSSTransition } from 'react-transition-group'
import DigitRoll from '../DigitRoll'
import './index.css'
const seconds = 1000 * 60 * 60 * 24
export default class IndexPortfolioCycle extends React.Component {
constructor(props) {
super(props)
this.state = {
showIdx: 0,
showText: false,
showImg: false,
mobile: true,
mounted: false,
touchMoveX: 0
}
this.handleWindowResize = this.handleWindowResize.bind(this)
// this.handleTouchStart = this.handleTouchStart.bind(this)
// this.handleTouchMove = this.handleTouchMove.bind(this)
// this.handleTouchEnd = this.handleTouchEnd.bind(this)
}
componentDidMount() {
this.setState({
showImg: true,
showText: true,
mounted: true
})
window.addEventListener('resize', this.handleWindowResize)
this.handleWindowResize()
}
handleWindowResize() {
this.setState({
mobile: document.body.offsetWidth < 780
})
}
componentWillUnmount() {
window.removeEventListener('resize', this.handleWindowResize)
clearTimeout(this.nextPortfolioTimer)
clearTimeout(this.portfolioTimer)
}
// handleTouchStart(e) {
// this.startX = e.touches[0].screenX
// }
// handleTouchMove(e) {
// if (e.touches[0].screenX - this.startX < -40) {
// return this.nextPortfolio(this.state.showIdx, this.props.portfolio)
// }
// if (e.touches[0].screenX - this.startX > 0) {
// return
// }
// this.setState({
// touchMoveX: e.touches[0].screenX - this.startX
// })
// }
// handleTouchEnd(e) {
// this.setState({
// touchMoveX: 0
// })
// }
nextPortfolio(showIdx, portfolio) {
if (this.nextPortfolioTimer) return
clearTimeout(this.portfolioTimer)
this.setState({
showImg: false
})
this.nextPortfolioTimer = setTimeout(() => {
this.setState(
{
showImg: true,
showIdx: (showIdx + 1) % portfolio.length
},
() => {
this.nextPortfolioTimer = null
}
)
}, 1200)
}
render() {
const today = new Date()
const {
showImg,
showText,
showIdx,
mobile,
touchMoveX,
mounted
} = this.state
const { portfolio, en, gaorongWith, gaorongWithEN } = this.props
return portfolio.map((val, idx) => {
const date = new Date(val.sinceDate)
const dur = parseInt(Math.abs(today - date) / seconds)
return (
<div
key={idx}
style={{ marginLeft: `${touchMoveX}px` }}
className={classnames({
'two-column': true,
'index-portfolio-two-column-not-choosen': idx !== showIdx
})}
// onTouchStart={this.handleTouchStart}
// onTouchEnd={this.handleTouchEnd}
// onTouchMove={this.handleTouchMove}
>
<div
className={classnames({
'index-portfolio-img-wrapper': idx === showIdx,
'index-portfolio-choosen': idx === showIdx
})}
>
<CSSTransition
in={idx === showIdx && showImg}
timeout={{
enter: 0,
exit: 1000
}}
classNames="index-portfolio-imgcss"
onEnter={() => {
if (idx !== showIdx) return
this.portfolioTimer = setTimeout(
() =>
this.setState({
showImg: false
}),
5000
)
}}
onExited={() => {
if (idx !== showIdx) return
this.setState({
showImg: true,
showIdx: (showIdx + 1) % portfolio.length
})
}}
unmountOnExit
>
<div
className="index-portfolio-imgbg"
style={{
backgroundImage: `url(${mobile ? val.image : val.image2})`
}}
onClick={this.nextPortfolio.bind(this, showIdx, portfolio)}
></div>
</CSSTransition>
</div>
{
<div
className={classnames({
'index-portfolio-text': true,
'index-portfolio-text-choosen': idx === showIdx
})}
>
<div
className={classnames({
'index-portfolio-progress': true,
'index-portfolio-progress-show': showText
})}
/>
<div className="index-portfolio-index">
<span className="index-portfolio-current">{`0${idx + 1}`}</span>
/<span className="">{`0${portfolio.length}`}</span>
</div>
<div className="index-portfolio-text-mask">
<CSSTransition
in={idx === showIdx && showText}
timeout={0}
classNames="index-portfolio-textcss"
unmountOnExit
>
<div className="index-portfolio-textwrapper">
<img
src={mobile ? val.logo : val.logo2}
className="index-portfolio-logo"
/>
<div className="index-portfolio-description">
{en === null
? ''
: en
? val.descriptionEN
: val.description}
</div>
</div>
</CSSTransition>
</div>
<div className="index-portfolio-footer">
{mounted && (
<img
className="index-portfolio-img-preload"
src={mobile ? val.image : val.image2}
/>
)}
<div className="index-portfolio-with">
{en === null
? ''
: en
? `${gaorongWithEN}`
: `${gaorongWith} ${val.title}`}
</div>
<div>
{idx === showIdx && (
<DigitRoll
delay="1.2"
num={dur}
divider=","
height={'0.65'}
width="0.6"
>
{en === null ? '' : en ? 'days' : '天'}
</DigitRoll>
)}
</div>
</div>
</div>
}
</div>
)
})
}
}
.know-more {
line-height: 24px; /* px */
font-size: 24px; /* px */
color: #201714;
font-weight: 500;
cursor: pointer;
display: inline-block;
}
.en .know-more {
margin-top: 16px; /* px */
font-size: 18px; /* px */
}
.know-more:hover::after {
margin-left: 8px; /* px */
transition: margin-left 0.3s ease;
}
.know-more::after {
content: "";
display: inline-block;
margin-left: 4px; /* px */
width: 24px; /* px */
height: 24px; /* px */
background: url('/static/img/more.svg');
background-size: cover;
background-repeat: no-repeat;
vertical-align: bottom;
}
.en .know-more::after {
width: 20px; /* px */
height: 20px; /* px */
}
.know-more a {
color: #201714;
text-decoration: none;
}
@media screen and (max-width: 780px) {
.know-more {
font-size: 16px; /* px */
}
.know-more::after,
.en .know-more::after {
width: 16px; /* px */
height: 16px; /* px */
vertical-align: -2px; /* px */
}
}
\ No newline at end of file
import React from 'react'
import classnames from 'classnames'
import Link from 'next/link'
import './index.css'
export default function KnowMore(props) {
return (
<div
className={classnames({
'know-more': true,
[props.className]: !!props.className
})}
onClick={props.onClick}
>
{props.onClick ? (
<a>{props.content}</a>
) : (
<Link prefetch={false} href={{ pathname: '/' + props.path + '.html' }}>
<a>{props.content}</a>
</Link>
)}
</div>
)
}
.overlay {
z-index: 49;
position: fixed;
top: 0;
bottom: 0;
}
.overlay .modal-overlay {
position: fixed;
height: 100%;
width: 100%;
background: rgba(179, 179, 179, 0.8);
z-index: 50;
}
.overlay .modal-overlay .modal-content {
position: fixed;
z-index: 51;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.modal-wrapper {
margin: 0 auto;
padding: 48px 40px; /* px */
background: white;
position: fixed;
top: 50%;
transform: translateY(-50%);
left: 0;
right: 0;
width: 700px; /* px */
max-height: 100%;
overflow-y: auto;
box-sizing: border-box;
}
.modal-close {
position: absolute;
right: 24px; /* px */
top: 24px; /* px */
cursor: pointer;
z-index: 52;
width: 32px; /* px */
height: 32px; /* px */
background-image: url('/static/img/close.svg');
background-size: cover;
}
import React from 'react'
import ReactDOM from 'react-dom'
import classnames from 'classnames'
import './index.css'
export default class Modal extends React.Component {
render() {
const { className, children, wrapperClassName, onClose } = this.props
const content = (
<div className="overlay" onClick={onClose}>
<div
className={classnames({
'modal-overlay': true,
[className]: !!className
})}
>
<div
className="modal-content"
ref={(el) => {
this.modalContent = el
}}
// onClick={this.handleClickOverlay}
>
<div
className={classnames({
'modal-wrapper': true,
[wrapperClassName]: !!wrapperClassName
})}
onClick={(e) => e.stopPropagation()}
>
<div className="modal-close" onClick={onClose}></div>
{children}
</div>
</div>
</div>
</div>
)
return ReactDOM.createPortal(
content,
document.querySelector('#modal-anchor')
)
}
}
import React from 'react'
import isOverflow from '../utils/isOverflow'
export default class OverflowBox extends React.Component {
constructor(props) {
super(props)
this.state = {
check: true,
low: 0,
high: 500,
str: props.str
}
this.handleWindowResize = this.handleWindowResize.bind(this)
}
componentWillReceiveProps(nextProps) {
if (nextProps.str !== this.props.str) {
this.setState({
check: true,
low: 0,
high: 500,
str: nextProps.str
})
}
}
handleWindowResize() {
clearTimeout(this.timerResize)
this.timerResize = setTimeout(() => {
this.setState({
check: true
})
}, 200)
}
componentDidMount() {
window.addEventListener('resize', this.handleWindowResize)
// delay for this component mounted but page css not
this.timerOverflow = setTimeout(() => {
if (!isOverflow(this.el)) {
return this.setState({
check: false
})
}
this.setState({
str: this.props.str.slice(0, this.state.high)
})
}, 100)
}
componentWillUnmount() {
clearTimeout(this.timerOverflow)
clearTimeout(this.timerResize)
window.removeEventListener('resize', this.handleWindowResize)
}
componentDidUpdate() {
const { low, high, check } = this.state
// if (this.props.str.indexOf('t') === 0 && this.props.str.indexOf('te') !== 0 ) console.log(check, low, high, this.state.str)
if (!check) return
if (low + 1 < high) {
const mid = Math.floor((high + low) / 2)
this.setState(
{
str: this.props.str.slice(0, mid) + (mid === 0 ? '' : '...')
},
() => {
if (!this.state.check) return
if (!isOverflow(this.el)) {
// if (this.props.str.indexOf('t') === 0 && this.props.str.indexOf('te') !== 0 ){
// console.log(this.el)
// console.log('no overflow')
// }
this.setState({
low: mid
})
} else {
// if (this.props.str.indexOf('t') === 0 && this.props.str.indexOf('te') !== 0 ){
// console.log(this.el)
// console.log('overflow')
// }
this.setState({
high: mid
})
}
}
)
} else {
// if (this.props.str.indexOf('t') === 0 && this.props.str.indexOf('te') !== 0) {
// console.log(this.props.str, 'check')
// }
setTimeout(() => {
const str = this.props.str.slice(0, Math.floor((high + low) / 2))
this.setState({
low: 0,
high: 500,
check: false,
str: low >= 499 ? str : str.length === 0 ? '' : str + '...'
})
})
}
}
// const { len, step, checkMore } = this.state
// if (!checkMore) return
// if (len < 230 && !isOverflow(this.el)) {
// console.log(len)
// this.setState({
// str: this.props.str.slice(0, len + step),
// len: len + step,
// step: step * 2
// })
// } else if (isOverflow(this.el)) {
// this.setState({
// checkMore: false,
// str: this.props.str.slice(0, len - 8) + '...'
// })
// }
render() {
const { str } = this.state
return (
<div
ref={(el) => {
this.el = el
}}
style={{ overflow: 'hidden', height: '100%', position: 'absolute' }}
>
{str}
</div>
)
}
}
import React, { Component } from 'react'
import classnames from 'classnames'
import './index.css'
export default class TeamMember extends Component {
constructor(props) {
super(props)
}
render() {
const {p, idx, l, en} = this.props;
const portrait = l[idx].portrait
const portrait2 = l[idx].portrait_2
return (
<div className="team-member-wrapper">
<div
className={classnames({
'team-member-image': true,
[`team-member-image${idx}`]: true
})}
></div>
<div
className={classnames({
'team-member-name': true,
[`team-member-name${idx}`]: true
})}
>
{en === null ? '' : en ? p.nameEN : p.name}
</div>
<div
className={classnames({
'team-member-role': true,
[`team-member-role${idx}`]: true
})}
>
{en === null ? '' : en ? p.roleEN : p.role}
</div>
<div
className={classnames({
'team-member-content-wrapper': true,
[`team-member-content${idx}`]: true
})}
>
<div
className={classnames({
'team-member-saying': true
})}
>
{en === null ? '' : en ? p.sayingEN : p.saying}
</div>
</div>
<style jsx>{`
.team-member-image.team-member-image${idx} {
background-image: url('${portrait2}');
}
@media (max-width: 780px) {
.team-member-image.team-member-image${idx} {
background-image: url('${portrait}');
}
}
`}</style>
</div>
)
}
}
.team-member-wrapper {
display: inline-block;
margin-right: 24px; /* px */
/* position: relative; */
overflow: hidden;
width: 400px; /* px */
vertical-align: top;
}
.team-member-wrapper:nth-of-type(3n) {
margin-right: 0;
}
@media screen and (max-width: 1460px) {
.team-grid-wrapper .team-list-grid > .team-member-wrapper {
width: 30% !important;
}
}
@media screen and (max-width: 760px) {
div.team-list-grid {
padding-bottom: 9px; /* px */
}
div.team-grid-title {
font-size: 24px; /* px */
}
.team-grid-wrapper .team-list-grid > .team-member-wrapper {
width: 45% !important;
}
.team-member-wrapper:nth-of-type(2n+1) {
margin-right: 24px; /* px */
}
.team-member-wrapper:nth-of-type(2n) {
margin-right: 0px; /* px */
}
div.team-member-name {
font-size: 20px; /* px */
}
div.team-member-role {
font-size: 16px; /* px */
}
div.team-member-saying {
font-size: 14px; /* px */
}
}
.team-grid-wrapper {
position: relative;
/* margin-left:2%; */
/* background: #F9F9F9; */
}
.team-list-grid {
max-width: 1290px; /* px */
position: relative;
padding-bottom: 32px; /* px */
/* background-size: 100% 1%;
background-image: url('/static/img/gray.png');
background-repeat: repeat-y; */
/* background-position-x: 4%; /* px */
}
/* .team-grid-wrapper >.left-bg {
height: 160%;
} */
.team-grid-title {
font-size:32px; /* px */
line-height: 180%;
padding-top: 32px; /* px */
margin-bottom: 32px; /* px */
}
.team-member-image {
/* float: left; */
/* width: 28%; */
padding-bottom: 140%;
background-size: cover;
background-position: center;
}
.team-member-name {
margin-top: 16px; /* px */
font-size: 24px; /* px */
color: #201714;
line-height: 180%;
font-weight: 500;
}
.team-member-role {
font-size: 18px; /* px */
color: #B3B3B3;
}
.team-member-saying {
margin-top: 16px; /* px */
margin-bottom: 16px; /* px */
padding-top: 16px; /* px */
border-top: solid 1px #e3e2e2;
font-size: 20px; /* px */
line-height: 180%;
color: #A25641;
}
.team-member-saying-obsolete::before {
content: "";
display: inline-block;
width: 40px; /* px */
height: 26px; /* px */
background: url('/static/img/quote.svg');
background-repeat: no-repeat;
}
.team-member-summary {
font-size: 16px; /* px */
line-height: 180%;
color: #444;
margin-bottom: 24px; /* px */
}
.team-member-content-wrapper .know-more {
font-size: 16px; /* px */
}
.team-member-content-wrapper .know-more::after {
width: 16px; /* px */
height: 16px; /* px */
vertical-align: -2px; /* px */
}
\ No newline at end of file
import React from 'react'
import classnames from 'classnames'
import TeamMember from './TeamMember'
import './index.css'
export default class TeamMemberList extends React.PureComponent {
constructor(props) {
super(props)
}
render() {
const { partnerList, className, title, en } = this.props
return (
<div className="team-grid-wrapper">
<div className="left-bg"></div>
<div className="limitw">
<div className="team-grid-title">{title}</div>
<div
className={classnames({
'team-list-grid': true,
[className]: !!className
})}
>
{partnerList.map((p, idx, l) =>
<TeamMember p={p} idx={idx} l={l} en={en} ></TeamMember>
)}
</div>
</div>
</div>
)
}
}
.title {
color: #201714;
font-size: 32px; /* px */
line-height: 180%;
font-weight: 500;
}
.en .title {
font-family: 'IBM Plex Serif' !important;
line-height: 150%;
}
.sub-title {
color: #444;
font-size: 20px; /* px */
line-height: 180%;
margin-top: 32px; /* px */
margin-bottom: 40px; /* px */
text-align: justify;
}
.en .sub-title {
text-align: left;
font-size: 18px; /* px */
line-height: 150%;
}
@media screen and (max-width: 1088px) {
/* width for top image root in gray */
.title {
font-size: 24px; /* px */
}
.title-svg {
height: 24px; /* px */
}
.title-svg.title-two-line {
height: 54px; /* px */
}
.sub-title, .en .sub-title {
font-size: 16px; /* px */
}
}
@media screen and (max-width: 380px) {
.title-svg {
height: 20px; /* px */
}
}
// eslint-disable-next-line no-unused-vars
import React from 'react'
import classnames from 'classnames'
import './index.css'
function Title(props) {
const { en, children, className } = props
if (!en && /svg$/.test(children)) {
return (
<div
className={classnames({
title: true,
[className]: !!className
})}
>
<h1 className="title-decorate">
{children.slice(0, children.indexOf('.'))}
</h1>
<img
alt={children.slice(0, children.indexOf('.'))}
className={classnames({
'title-svg': true,
'title-two-line': / |/.test(children)
})}
src={`/static/img/${props.children}`}
/>
</div>
)
}
if (typeof children === 'object') {
return (
<div
className={classnames({
title: true,
[className]: !!className
})}
>
{children}
</div>
)
}
return (
<div
className={classnames({
title: true,
[className]: !!className
})}
dangerouslySetInnerHTML={{ __html: children }}
></div>
)
}
function SubTitle(props) {
const { children, className } = props
return (
<div
className={classnames({
'sub-title': true,
[className]: !!className
})}
dangerouslySetInnerHTML={{ __html: children }}
></div>
)
}
export { Title, SubTitle }
import React from 'react'
export default class Video extends React.PureComponent {
constructor(props) {
super(props)
this.state = {
mounted: false
}
this.mustPlay = this.mustPlay.bind(this)
}
componentDidMount() {
this.setState({
mounted: true
})
document.addEventListener('WeixinJSBridgeReady', this.mustPlay, false)
}
mustPlay() {
if (this.state.mounted) {
document.getElementById(this.props.id).play()
document.removeEventListener('WeixinJSBridgeReady', this.mustPlay, false)
} else {
setTimeout(this.mustPlay, 300)
}
}
componentWillUnmount() {
document.removeEventListener('WeixinJSBridgeReady', this.mustPlay, false)
}
render() {
const { poster, src, id, full } = this.props
const { mounted } = this.state
if (!full) {
return (
<video
id={id}
loop
muted={true}
playsInline={true}
webkit-playsinline="true"
x5-video-player-type="h5-page"
x5-video-player-fullscreen="true"
disableremoteplayback="true"
autoPlay
preload="auto"
poster={poster}
>
<source id="mp4" src={src} type="video/mp4" />
</video>
)
}
if (!mounted) {
return (
<video
data-object-fit="cover"
data-object-position="100% 0%"
id={id}
// loop
muted={true}
playsInline={true}
webkit-playsinline="true"
x5-video-player-type="h5-page"
x5-video-player-fullscreen="true"
disableremoteplayback="true"
autoPlay
preload="auto"
poster={poster}
></video>
)
}
return (
<video
data-object-fit="cover"
data-object-position="100% 0%"
id={id}
// loop
muted={true}
playsInline={true}
webkit-playsinline="true"
x5-video-player-type="h5-page"
x5-video-player-fullscreen="true"
disableremoteplayback="true"
autoPlay
preload="auto"
poster={poster}
>
<source id="mp4" src={src} type="video/mp4" />
</video>
)
}
}
---
title: 扎根创新创业领域 追求长期价值投资.svg
titleEN: We Partner with Exceptional Entrepreneurs to Achieve Long-term Value
subTitle: 高榕创投是中国最活跃的风险投资机构之一,致力于发现优秀创业者,与他们共建长期价值。高榕创投的愿景是「创」造美好生活,相信科技与创新的力量,将帮助人类实现更美好的未来。
subTitleEN: At Gaorong Ventures, we devote ourselves to creating better life
through innovation. We are dedicated in identifying the leading founders and
collaborating with them to achieve long-term value. Our vision is to empower
humanity to achieve its maximum potential and to bring the futuristic
blueprints to life through progressive technology and innovation.
image1: /static/img/partners.png
image1x2: /static/img/partners@2x.png
image2: /static/img/mountain.jpg
image2X2: /static/img/mountain-2x.jpg
birth: 诞生背景
birthEN: Background
title2: 互联网与实体经济融合的创新趋势
title2EN: A new integrative trend between the internet and the real economy
subTitle2: 2014年高榕创投成立时,中国互联网正从“上半场”走向互联网与实体经济融合的“下半场”。一批优秀创业者,正通过技术创新、模式创新以及产业融合创新,孕育伟大企业。<br/><br/>与此同时,中国的企业家精神正在不断传承。高榕创投成立伊始,定位于中国的创始人基金(China's
Founders'
Fund),除慈善基金、大学捐赠基金、母基金、家族办公室等全球顶级机构投资人外,高榕创投还邀请了包括腾讯、百度、淘宝、小米、美团、分众等在内的数十家互联网企业的创始人或核心高管成为出资人,一同寻找和助力优秀创业者。
subTitle2EN: In 2014, the internet industry in China underwent a crucial
transition from the "first stage" to the "second stage" that integrate with
the real economy. Concurrently, innovations in technology and business models
along with industrial integration enable outstanding founders to establish
great enterprises.<br/><br/>As we witnessed, China has the spirit to pursue
entrepreneurship inherently. Positioned as China's Founders' Fund upon
establishment, we have been proudly backed by a world-class group of
investors, including pension funds, university endowments, FoFs, and family
offices. Besides, our strategic investors, including the founders and senior
managers of Tencent, Baidu, Taobao, Xiaomi, Meituan, Focus Media, and other
renowned internet companies, make significant contributions to identify and
empower outstanding founders together with us.
philosophy: 投资哲学
philosophyEN: Philosophy
title3: 回归商业本源,追求长期价值投资
title3EN: We emphasize on long-term and durable value in investment decisions
subTitle3: 高榕团队坚守投资“本分”,通过回归商业本源的理性思考,自上而下的研究,以及对行业人脉长期持续的积累,尊重客观事实,严肃对待决策,为出资人和社会创造长期价值。
subTitle3EN: Here at Gaorong, we believe firmly in the true value of
investments. With deep understanding of respective nature of industries,
combined with top-down research and our extensive network through years of
accumulation, we form investment decisions to generate long-term and durable
value for our investors and community.
recognition: 行业认可
recognitionEN: Awards
awardList:
- award: 2021年中国创业投资机构TOP10
awardEN: 2021 China VC Firms TOP 10
source: 清科集团
sourceEN: Zero2IPO
- award: 2021年中国最受创业者欢迎创业投资机构TOP10
awardEN: 2021 China's Best VC Firms Voted by Entrepreneurs TOP 10
source: 36氪
sourceEN: 36Kr
- award: 2022年度中国最受LP认可创业投资机构TOP10
awardEN: 2022 China's Best VC Firms Voted by Limited Partners TOP 10
source: 36氪
sourceEN: 36Kr
- source: 创业邦
sourceEN: Cyzone
award: 2022年中国最受赞赏创业投资机构TOP10
awardEN: 2022 China's Most Admired VC Firms TOP 10
- award: 2020年全球新兴科技风险投资机构中国榜单TOP10
awardEN: 2020 Global New Technology VC Firms of China TOP 10
source: CB Insights
sourceEN: CB Insights
- award: 2021年中国最受LP关注创业投资机构TOP10
awardEN: 2021 China's Best VC Firms Voted by Limited Partners TOP 10
source: 投中
sourceEN: ChinaVenture
- award: 2020年度中国最佳回报创业投资机构TOP10
awardEN: 2020 China’s Best Return VC TOP 10
source: 投中
sourceEN: ChinaVenture
- award: 2022年VC基金最佳回报TOP5
awardEN: 2022 Best Return VC Firms TOP 5
source: 母基金研究中心
sourceEN: China-fof.com
- award: 2022五年期金牛创业投资持续卓越机构
awardEN: 2022 Golden Bull Award Outstanding VC Firms (Five-year Period)
source: 中国证券报
sourceEN: China Securities Journal
- award: 2019中国年度创投机构
awardEN: 2019 China Annual VC Firms
source: 中国创投委
sourceEN: China Venture Capital Association
- award: 2019中国最佳创业机构TOP3
awardEN: 2019 China's Best VC Firms TOP 3
source: 中国母基金联盟
sourceEN: China FOF Alliance
- award: 2022年度退出先锋创业投资机构TOP10
awardEN: 2022 Annual Exit-Pioneer TOP 10
source: 钛媒体
sourceEN: TMTPost
- award: 2021最佳投后赋能机构TOP10
awardEN: 2021 Best Value-added VC Firms TOP10
source: 36氪
sourceEN: 36Kr
- award: 2018年度退出-IPO奖(拼多多)
awardEN: 2018 Annual Exit Award - IPO (Pinduoduo)
source: 亚洲创业基金期刊
sourceEN: AVCJ
- award: 2023年全球最佳创投人(Midas List)TOP10(张震)
awardEN: The Midas List 2023 TOP10, Zhen Zhang
source: 福布斯
sourceEN: Forbes
- award: 2020年中国投资界回报之王(张震)
awardEN: China's Best Investor of Return in 2020, Zhen Zhang
source: 清科集团
sourceEN: Zero2IPO
- award: 2019中国最佳创业投资人TOP3(张震)
awardEN: 2019 China's Best VC Investors TOP3, Zhen Zhang
source: 投中
sourceEN: ChinaVenture
- award: 2018中国年度投资人(张震)
awardEN: China's Investor of the Year of 2018, Sole Winner, Zhen Zhang
source: 创业邦
sourceEN: Cyzone
- award: 2019年全球最佳创投人(Midas List)TOP30(高翔)
awardEN: The Midas List 2019 TOP30, Xiang Gao
source: 福布斯
sourceEN: Forbes
- award: 2022届最受创业者欢迎投资人(高翔)
awardEN: 2022 Best Investors Voted by Entrepreneurs, Xiang Gao
source: 36氪
sourceEN: 36Kr
- award: 2018年度投资家TOP10(高翔)
awardEN: China's TOP 10 Investors of the Year 2018, Xiang Gao
source: 创业家
sourceEN: The Founder
- award: 2023届最受创业者欢迎投资人(岳斌)
awardEN: 2023 Best Investors Voted by Entrepreneurs, Bin Yue
source: 36氪
sourceEN: 36Kr
- award: 2018 中国顶级风险投资人(岳斌)
awardEN: 2018 China VC Investors, Bin Yue
source: 界面
sourceEN: Jiemian
- award: 2021年度科技赛道最佳投手(岳斌)
awardEN: 2021 Best Tech Investors, Bin Yue
source: 虎嗅
sourceEN: Huxiu
- source: 36氪
award: 2023年36Under36了不起的投资人(韩锐)
sourceEN: 36Kr
awardEN: 36 Under 36 Amazing Investors of the Year 2023, Rui Han
- source: 清科集团
award: 2020年F40中国青年投资人(韩锐)
sourceEN: Zero2IPO
awardEN: 2020 F40 China's Young Investors, Rui Han
- source: 巴伦中国
award: 2022年40岁以下投资精英(韩锐)
sourceEN: Barron's
awardEN: Investors Under 40 of the Year 2022, Rui Han
---
---
errorTitle: 出错了.svg
errorTitleEN: Something is wrong
errorStr: 抱歉,没有找到你想访问的内容,请检查访问的地址是否正确。
errorStrEN: Sorry, content is not found. Please check your address.
errorImg: /static/img/mask-dotted.svg
backToHome: 返回首页
backToHomeEN: back to home
treeMask: /static/img/tree-mask-image.svg
---
---
email: 邮箱
emailEN: Email
emailStr: bp@gaorongvc.com
phone: 电话
phoneEN: Phone
phoneStr: 010-84442729
fax: 传真
faxEN: Fax
faxStr: 010-84442279
wechat: 微信
wechatEN: WeChat
beijing: 北京
beijingEN: Beijing
shanghai: 上海
shanghaiEN: Shanghai
shenzhen: 深圳
shenzhenEN: Shenzhen
xianggang: 香港
xianggangEN: Hong Kong
beijingloc: 北京市朝阳区望京启阳路<br/>金辉大厦41层4101
beijinglocEN: >-
4101, 41th Floor, Radiance Jinhui, Qiyang Road, Wangjing, Chaoyang District,
Beijing
shanghailoc: 上海市静安区南京西路1717号<br/>会德丰国际广场30楼3002
shanghailocEN: >-
Suite 3002, 30/F, Wheelock Square, 1717 Nanjing West Road, Jingan District,
Shanghai
shenzhenloc: 深圳市南山区深圳湾<br/>科技生态园7栋B座6层(东区)
shenzhenlocEN: >-
6th Floor, Block B Eastern, 7th Building, Shenzhen Bay Eco-Technology Park,
Nanshan District, Shenzhen
xianggangloc: 香港中环花园道3号<br/>中国工商银行大厦8楼805室
xiangganglocEN: 'Unit 805, 8/F, ICBC Tower, 3 Garden Road, Central, HONG KONG'
treeLogo: /static/img/footer-tree-mask.svg
footerMask: /static/img/footer-tile.svg
wechatimg: /static/img/qrcode.svg
---
---
metaDescription: 高榕创投是中国最活跃的风险投资机构之一,致力于发现优秀创业者,与他们共建长期价值。高榕创投由张震、高翔、岳斌三位创始合伙人于2014年1月创立,专注于早期和成长期投资,重点投资新科技、新消费、医疗健康等创新创业领域。
metaDescriptionEN: Gaorong Ventures is dedicated in identifying the leading
founders and collaborating with them to achieve long-term value. Founded by
Zhen Zhang, Xiang Gao, and Bin Yue in January 2014, Gaorong Ventures is focused
on early and growth-stage investments, with a specialty in new consumption,
new technology and healthcare.
title: 创造美好生活.svg
titleEN: <span class="yellow">Creating</span> Better Life<br/>through Innovation
subTitle: 相信科技和创新的力量,将帮助人类实现更美好的未来。
subTitleEN: Our vision is to empower humanity to achieve its maximum potential
and to bring the futuristic blueprints to life through progressive technology
and innovation.
gaorongWith: 高榕已陪伴
gaorongWithEN: Gaorong has accompanied for
videoPoster: /static/img/hero-poster.jpg
video: /static/img/hero.mp4
videoMobile: /static/img/hero-mobile.mp4
portfolio:
- titleEN: Pinduoduo
descriptionEN: As an innovative and fast growing "new e-commerce" platform,
Pinduoduo provides buyers with value-for-money merchandise and fun and
interactive shopping experiences.
logo2: /static/img/slide-pdd-logo@2x.png
sinceDate: 2015-06-04T16:00:00.000Z
logo: /static/img/slide-pdd-logo@2x.png
image2: /static/img/slide-pdd-image@2x.jpg
title: 拼多多
image: /static/img/slide-pdd-image.jpg
description: 作为新电商开创者,拼多多致力于为广大用户提供物有所值的商品和有趣互动的购物体验,助力美好生活。
- titleEN: BOSS Zhipin
descriptionEN: By assisting individuals’ development, BOSS Zhipin strives to
facilitate efficient allocation of human resources and create greater
value for society.
logo2: /static/img/bosszhipin-2x.png
sinceDate: 2016-05-23T10:11:05.288Z
logo: /static/img/bosszhipin-2x.png
image2: /static/img/abstract_bossipo_21-06-11.jpg
title: BOSS直聘
image: /static/img/abstract_bossipo_21-06-11.jpg
description: 通过帮助人的发展,促进人力资源更为合理地配置,为社会创造更大价值。
- titleEN: HUYA
descriptionEN: HUYA has created an engaging, interactive and immersive community
for game enthusiasts of China. Its rich and high-quality game live
streaming content is a magnet for users sharing common interests to
connect and share their passion on the platform.
logo2: /static/img/slide-huya-logo@2x.png
sinceDate: 2017-07-10T16:00:00.000Z
logo: /static/img/slide-huya-logo@2x.png
image2: /static/img/slide-huya-image@2x.jpg
title: 虎牙
image: /static/img/slide-huya-image.jpg
description: 技术驱动娱乐,虎牙直播通过弹幕式互动直播平台,为年轻人提供高清、流畅而丰富的视频直播服务,传递快乐,传播美好。
- titleEN: Roborock
descriptionEN: Roborock strives to create innovative products addressing various
household problems. The company's mission is to put advanced technology
into the home to make life easier.
logo2: /static/img/slide-roborock-logo-2x.png
sinceDate: 2015-08-03T16:00:00.000Z
logo: /static/img/slide-roborock-logo.png
image2: /static/img/slide-roborock-image-2x.jpg
title: 石头科技
image: /static/img/slide-roborock-image.jpg
description: 石头科技致力打造创新的智能家电产品,用科技简化生活。
- titleEN: Nuro
descriptionEN: Nuro's mission is to accelerate the benefits of robotics for
everyday life. Their first step is a self-driving vehicle designed for
local goods transportation.
logo2: /static/img/slide_nuro_logo.png
sinceDate: 2016-09-29T16:00:00.000Z
logo: /static/img/slide_nuro_logo.png
image2: /static/img/slide-nuro-image@2x.jpg
title: Nuro
image: /static/img/slide-nuro-image.jpg
description: 基于机器人和自动驾驶技术,Nuro 正重塑物流配送等应用场景,给更多人的生活带来便利。
- titleEN: YATSEN
descriptionEN: Yatsen's mission is to create an exciting new journey of beauty
discovery for consumers in China and around the world.
logo2: /static/img/slide-yatsen-logo-2x.png
sinceDate: 2018-05-29T16:00:00.000Z
logo: /static/img/slide-yatsen-logo.png
image2: /static/img/slide-yatsen-image-2x.jpg
title: 逸仙电商
image: /static/img/slide-yatsen-image.jpg
description: 逸仙电商致力为中国乃至全球消费者,创造一个令人兴奋的探索美的新旅程。
summaryTitle: 立足当下 俯仰未来.svg
summaryTitleEN: Building on the Present,<br/>Forging ahead into the Future
summarySubTitle: 高榕相信,互联网和科技将成为提升社会生产力的重大推力,带来产业效率的提升和生活方式的革新。
summarySubTitleEN: We believe in the significance of internet and technology in
driving productivity, industrial efficiency and innovative lifestyle, and in
exerting impact on the progress of the future.
summaryKnowmore: 了解更多
summaryKnowmoreEN: Read More
portfolioText: 投资企业
portfolioTextEN: Active Portfolio Companies
portfolioNum: 300+
unicornText: 10亿美金俱乐部公司
unicornTextEN: Companies Valued at Over $1 Billion
unicornNum: 30+
IPOText: 上市
IPOTextEN: IPOs
IPONum: "24"
assetText: 团队规模
assetTextEN: Team
assetNum: 70+
assetNumEN: 70+
portfolioSummary: 高榕创投专注于早期和成长期投资,重点投资新科技、新消费、医疗健康等创新创业领域。高榕创投成立伊始,定位于中国的创始人基金(China's
Founders'
Fund)。高榕创投背后的出资人包括慈善基金、大学捐赠基金、母基金、家族办公室等全球顶级机构投资人,以及金融、医疗、零售、广告、工业制造、农业等行业的企业巨头;此外,高榕创投还邀请了包括腾讯、百度、淘宝、小米、美团、分众等在内的数十家互联网企业的创始人或核心高管成为出资人,一同寻找和助力优秀创业者。
portfolioSummaryEN: Gaorong Ventures is focused on early and growth-stage
investments, with a specialty in new consumption, new technology and
healthcare. Positioned as China's Founders' Fund upon establishment, we have
been proudly backed by a world-class group of investors, including pension
funds, university endowments, FoFs, and family offices, and leading corporates
across multiple industries ranging from finance to internet and many more.
Besides, our strategic investors, including the founders and senior managers
of Tencent, Baidu, Taobao, Xiaomi, Meituan, Focus Media, and other renowned
internet companies, make significant contributions to identify and empower
outstanding founders together with us.
portfolioSummaryEntry: 了解更多
portfolioSummaryEntryEN: Read More
teamSummaryTitle: 参差多态 分秒进化.svg
teamSummaryTitleEN: Diversity in Our DNA
teamSummaryText: 高榕由张震、高翔、岳斌三位创始合伙人于2014年1月创立。高榕创投创始团队亲历了过去17年中国互联网的演进历程,对帮助早期和成长期企业发展有丰富经验和广泛资源。至今,高榕已搭建起一个由理性思考者、前瞻者、梦想家构成的多样化团队。
teamSummaryTextEN: Gaorong is founded by Zhen Zhang, Xiang Gao, and Bin
Yue in January 2014. In the past 17 years, the three founders witnessed the
advancements of the internet industry and gained extensive experience and
contacts in helping early to growth-stage companies. Our team is comprised of
rational, visionary and adventurous individuals that are highly
entrepreneurial with strong spirit of partnership.
teamSummaryEntry: 了解团队
teamSummaryEntryEN: Read More
teamImage: /static/img/index-partners.jpg
teamImagex2: /static/img/index-partners@2x.jpg
news3dImage: /static/img/timeline-cn.png
news3dImageEN: /static/img/timeline-en.png
news3dImageMobile: /static/img/timeline-mobile-cn.png
news3dImageENMobile: /static/img/timeline-mobile-en.png
newsSummaryTitle: 精进不止 日月刷新.svg
newsSummaryTitleEN: Milestones
newSummaryEntry: 了解动态
newSummaryEntryEN: Read More
ronghuiSummaryTitle: 一路同行 朝夕相伴.svg
ronghuiSummaryTitleEN: Your Companion<br/>Along the Way
ronghuiSummaryText: 「榕汇」是高榕发起的创新社群,希望搭建一个由顶尖企业家、优秀创业者、行业专家、意见领袖等构成的生态网络。高榕希望成为连接者,以「榕汇」为依托,为优秀创业者分享认知和洞察,实现资源连接。
ronghuiSummaryTextEN: Our exclusive community Ronghui aims to construct an
ecosystem of renowned entrepreneurs, founders, industry specialists, and
opinion leaders with in-depth industrial knowledge, offering a platform that
is conducive for accumulating diverse perspectives.
ronghuiSummaryEntry: 了解榕汇
ronghuiSummaryEntryEN: Read More
ronghuiImage: /static/img/2019.jpg
ronghuiImagex2: /static/img/2019@2x.jpg
---
---
home: 首页
homeEN: Home
about: 关于我们
portfolio: 投资企业
team: 团队
ronghui: 榕汇
news: 动态
warn: 严正声明
aboutEN: About
portfolioEN: Portfolio
teamEN: Team
ronghuiEN: Community
newsEN: News
warnEN: 严正声明
---
---
title: test
hide: false
createDate: 2024-03-01T08:42:59.862Z
abstract: test
abstractEN: test
content: "> test"
contentEN: test
pic: /static/img/camelsabove_zh-cn1389810021_uhd.0.b.jpg
---
---
title: 关于冒用高榕资本名义的严正声明
titleEN: 关于冒用高榕资本名义的严正声明
hide: true
createDate: 2024-01-24T01:41:33.435Z
abstract: 近期我司发现有不法分子通过网站、App、微信、微博等渠道,冒用高榕资本(包括但不限于高榕资本、Gaorong Capital、Banyan
Capital、高榕或者Gaorong)以及高榕资本工作人员(以下统称“高榕资本”)的名义,发布虚假信息,开展融资、理财、资本募集、产品销售等非法活动。
content: >-
近期我司发现有不法分子通过网站、App、微信、微博等渠道,冒用高榕资本(包括但不限于高榕资本、Gaorong Capital、Banyan
Capital、高榕或者Gaorong)以及高榕资本工作人员(以下统称“高榕资本”)的名义,发布虚假信息,开展融资、理财、资本募集、产品销售等非法活动。
**高榕资本特此郑重声明:**
高榕资本严格遵守相关法律法规及监管规范,旗下基金仅面向符合相关资质要求的合格投资人以非公开方式募集,不会以任何形式向任何主体承诺保底收益。高榕资本从未,也从未授权任何实体或个人以高榕资本名义通过任何公开方式(包括但不限于网站、APP、微信、微博等渠道)进行融资、理财、资本募集、产品销售等活动。
高榕资本与此类冒用高榕资本名义的实体或个人无任何法律或者商业上关系,其任何行为均与高榕资本无关。任何未经授权擅自冒用高榕资本名义的行为均系侵权行为,我司保留采取法律手段维护自身合法权益、追究侵权者法律责任的权利。
特别提醒广大公众提高警惕,切勿轻信此类虚假信息,以免遭受财产损失;如已遭遇此类情形请及时向公安机关、监管部门举报,以维护个人权益。
最后再次重申,有关高榕资本的信息请以如下官方渠道披露为准:
> 【官方网站】
>
> <https://www.gaorongvc.com/>
>
> 【官方微信公众号】
>
> 高榕资本
>
> ID:banyancapital
pic: /static/img/严正声明.jpg
---
---
news:
- title: 关于冒用高榕资本名义的严正声明
titleEN: 关于冒用高榕资本名义的严正声明
hide: true
createDate: 2024-01-24T01:41:33.435Z
abstract: >-
近期我司发现有不法分子通过网站、App、微信、微博等渠道,冒用高榕资本(包括但不限于高榕资本、Gaorong Capital、Banyan
Capital、高榕或者Gaorong)以及高榕资本工作人员(以下统称“高榕资本”)的名义,发布虚假信息,开展融资、理财、资本募集、产品销售等非法活动。
content: >-
近期我司发现有不法分子通过网站、App、微信、微博等渠道,冒用高榕资本(包括但不限于高榕资本、Gaorong Capital、Banyan
Capital、高榕或者Gaorong)以及高榕资本工作人员(以下统称“高榕资本”)的名义,发布虚假信息,开展融资、理财、资本募集、产品销售等非法活动。
**高榕资本特此郑重声明:**
高榕资本严格遵守相关法律法规及监管规范,旗下基金仅面向符合相关资质要求的合格投资人以非公开方式募集,不会以任何形式向任何主体承诺保底收益。高榕资本从未,也从未授权任何实体或个人以高榕资本名义通过任何公开方式(包括但不限于网站、APP、微信、微博等渠道)进行融资、理财、资本募集、产品销售等活动。
高榕资本与此类冒用高榕资本名义的实体或个人无任何法律或者商业上关系,其任何行为均与高榕资本无关。任何未经授权擅自冒用高榕资本名义的行为均系侵权行为,我司保留采取法律手段维护自身合法权益、追究侵权者法律责任的权利。
特别提醒广大公众提高警惕,切勿轻信此类虚假信息,以免遭受财产损失;如已遭遇此类情形请及时向公安机关、监管部门举报,以维护个人权益。
最后再次重申,有关高榕资本的信息请以如下官方渠道披露为准:
> 【官方网站】
>
> <https://www.gaorongvc.com/>
>
> 【官方微信公众号】
>
> 高榕资本
>
> ID:banyancapital
pic: /static/img/严正声明.jpg
---
\ No newline at end of file
---
title: 最新动态.svg
titleEN: News
searchPlaceholder: 搜索
searchPlaceholderEN: search
allNews: 全部动态
allNewsEN: All News
---
This diff is collapsed.
import yaml
def yaml_loader():
try:
with open("content/newsPage.md", "r") as stream:
data = yaml.load(stream, Loader=yaml.FullLoader)
l = data['news']
for idx, new in enumerate(l):
# print(idx, new['title'])
if(idx != -1):
with open('content/news/'+new['title'] + '.md', 'a') as outfile:
yaml.dump(new, outfile,default_flow_style=False,encoding='utf-8',allow_unicode=True, explicit_start=True, explicit_end=True)
# for workload in data:
# print(workload)
# with open(workload['workload']['name'] + '.yaml', 'a') as outfile:
# # if you put the variable "workload" in a list, you get the '-' in the yaml, as it denotes a list item.
# yaml.dump([workload], outfile)
except yaml.YAMLError as out:
print(out)
yaml_loader()
\ No newline at end of file
import os
import re
import sys
dir = r"C:\Users\lq\Downloads\newpic"
def renameall():
fileList = os.listdir(dir) #待修改文件夹
print("修改前:"+str(fileList)) #输出文件夹中包含的文件
currentpath = os.getcwd() #得到进程当前工作目录
os.chdir(dir) #将当前工作目录修改为待修改文件夹的位置
num=1 #名称变量
for fileName in fileList: #遍历文件夹中所有文件
pat="(.+)\.(jpg|png|gif|jpeg)" #匹配文件名正则表达式
pattern = re.findall(pat,fileName) #进行匹配
# print(str(num)+'.'+pattern[0])
print(pattern[0][0].replace("-min", "") + "." + pattern[0][1])
os.rename(fileName, pattern[0][0].replace("-min", "") + "." + pattern[0][1])
# os.rename(fileName,(str(num)+'.'+pattern[0])) #文件重新命名
# num = num+1 #改变编号,继续下一项
# print("---------------------------------------------------")
# os.chdir(currentpath) #改回程序运行前的工作目录
# sys.stdin.flush() #刷新
# print("修改后:"+str(os.listdir(dir))) #输出修改后文件夹中包含的文件
renameall()
const withCss = require('@zeit/next-css')
const RemoveStrictPlugin = require('remove-strict-webpack-plugin')
// const StringReplacePlugin = require('string-replace-webpack-plugin')
// const exec = require('child_process').exec
module.exports = withCss({
webpack: (cfg) => {
cfg.module.rules.push({
test: /\.md$/,
use: 'frontmatter-markdown-loader'
})
// breaks sourcemap
// cfg.plugins.push(new RemoveStrictPlugin())
// cfg.plugins.push({
// apply: (compiler) => {
// compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => {
// exec(
// './removeStrict.sh',
// (err, stdout, stderr) => {
// if (stdout) process.stdout.write(stdout)
// if (stderr) process.stderr.write(stderr)
// }
// )
// })
// }
// })
// cfg.module.rules.push({
// test: /\.js$/,
// loader: StringReplacePlugin.replace({
// replacements: [
// {
// pattern: /"use strict"/gi,
// replacement: function(match, p1, offset, string) {
// console.log(match)
// return ''
// }
// }
// ]
// }),
// include: /node_modules\\*/
// })
return cfg
}
})
{
"name": "awesome-kitties",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start",
"exportwatch": "nodemon -e js,css,json,md,png,jpg,svg --exec \"npm run export\" --ignore .next/ --ignore out/",
"export": "npm run build && next export",
"lintfix": "eslint --fix --ext .js,.vue --ignore-path .gitignore ."
},
"keywords": [],
"author": "",
"license": "ISC",
"browserslist": [
"> 0.001%"
],
"dependencies": {
"@babel/plugin-proposal-decorators": "^7.4.4",
"@zeit/next-css": "^1.0.1",
"@zeit/next-less": "^1.0.1",
"classnames": "^2.2.6",
"core-decorators": "^0.20.0",
"digit-roll-react": "^1.1.0",
"js-yaml": "^4.0.0",
"less": "^3.9.0",
"marked": "^0.7.0",
"next": "^9.0.3",
"overflowbox": "^1.0.1",
"qrcode.react": "^0.9.3",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-fastclick": "^3.0.2",
"react-tap-event-plugin": "^3.0.3",
"react-transition-group": "^4.2.2",
"respond.js": "^1.4.2",
"string-replace-webpack-plugin": "^0.1.3"
},
"devDependencies": {
"autoprefixer": "^9.6.1",
"babel-plugin-transform-remove-strict-mode": "^0.0.2",
"babel-preset-react-app": "^9.0.0",
"eruda": "^1.5.8",
"eslint": "^6.0.1",
"eslint-config-prettier": "^6.0.0",
"eslint-plugin-prettier": "^3.1.0",
"frontmatter-markdown-loader": "^1.7.0",
"images": "^3.0.2",
"postcss-adaptive": "^0.5.0",
"postcss-px2rem": "^0.3.0",
"prettier": "^1.18.2",
"remove-strict-webpack-plugin": "^0.1.2",
"string-replace-loader": "^2.2.0"
},
"nodemonConfig": {
"watch": [
"pages/",
"static/",
"content/",
"common/"
],
"ignore": [
"out/*",
".next/*"
]
}
}
This diff is collapsed.
// _document is only rendered on the server side and not on the client side
// Event handlers like onClick can't be added to this file
import Document, { Head, Main, NextScript } from 'next/document'
// import * as Sentry from '@sentry/browser'
// process.on('unhandledRejection', err => {
// Sentry.captureException(err)
// })
// process.on('uncaughtException', err => {
// Sentry.captureException(err)
// })
export default class MyDocument extends Document {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx)
return { ...initialProps }
}
render() {
return (
<html>
<meta name="viewport" content="width=device-width, initial-scale=1.0"></meta>
<meta httpEquiv="X-UA-Compatible" content="IE=Edge,chrome=1"></meta>
<meta name="keywords" content="高榕创投,高榕资本,Gaorong Venture,Gaorong Capital,高榕,Banyan Capital"/>
<Head>
<link rel="icon" type="image/x-icon" href="../static/favicon.ico" />
<script src='/static/px2rem.js'></script>
<script src='/static/statepolyfill.js'></script>
<script type="text/javascript" src='/static/babel-polyfill7.4.4.min.js'></script>
</Head>
<body className="custom_class">
<script src="/static/respond.matchmedia.addListener.min.js"></script>
<script src="/static/respond.min.js"></script>
<Main />
<NextScript />
<script type="text/javascript" crossOrigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js?flags=gated&features=es2015%2CPromise"></script>
{/* <script src="/static/eruda.min.js"></script>
<script>eruda.init();</script> */}
</body>
</html>
)
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
@media screen and (min-width: 1440px) {
.index-ronghui-img {
margin: 0 auto;
padding-bottom: 400px;
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
retry.jpeg

55.9 KB

This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
!function(){"use strict";if("undefined"!=typeof window){var t=window.navigator.userAgent.match(/Edge\/(\d{2})\./),n=!!t&&16<=parseInt(t[1],10);if(!("objectFit"in document.documentElement.style!=!1)||n){var o=function(t,e,i){var n,o,l,a,d;if((i=i.split(" ")).length<2&&(i[1]=i[0]),"x"===t)n=i[0],o=i[1],l="left",a="right",d=e.clientWidth;else{if("y"!==t)return;n=i[1],o=i[0],l="top",a="bottom",d=e.clientHeight}if(n!==l&&o!==l){if(n!==a&&o!==a)return"center"===n||"50%"===n?(e.style[l]="50%",void(e.style["margin-"+l]=d/-2+"px")):void(0<=n.indexOf("%")?(n=parseInt(n))<50?(e.style[l]=n+"%",e.style["margin-"+l]=d*(n/-100)+"px"):(n=100-n,e.style[a]=n+"%",e.style["margin-"+a]=d*(n/-100)+"px"):e.style[l]=n);e.style[a]="0"}else e.style[l]="0"},l=function(t){var e=t.dataset?t.dataset.objectFit:t.getAttribute("data-object-fit"),i=t.dataset?t.dataset.objectPosition:t.getAttribute("data-object-position");e=e||"cover",i=i||"50% 50%";var n=t.parentNode;return function(t){var e=window.getComputedStyle(t,null),i=e.getPropertyValue("position"),n=e.getPropertyValue("overflow"),o=e.getPropertyValue("display");i&&"static"!==i||(t.style.position="relative"),"hidden"!==n&&(t.style.overflow="hidden"),o&&"inline"!==o||(t.style.display="block"),0===t.clientHeight&&(t.style.height="100%"),-1===t.className.indexOf("object-fit-polyfill")&&(t.className=t.className+" object-fit-polyfill")}(n),function(t){var e=window.getComputedStyle(t,null),i={"max-width":"none","max-height":"none","min-width":"0px","min-height":"0px",top:"auto",right:"auto",bottom:"auto",left:"auto","margin-top":"0px","margin-right":"0px","margin-bottom":"0px","margin-left":"0px"};for(var n in i)e.getPropertyValue(n)!==i[n]&&(t.style[n]=i[n])}(t),t.style.position="absolute",t.style.width="auto",t.style.height="auto","scale-down"===e&&(e=t.clientWidth<n.clientWidth&&t.clientHeight<n.clientHeight?"none":"contain"),"none"===e?(o("x",t,i),void o("y",t,i)):"fill"===e?(t.style.width="100%",t.style.height="100%",o("x",t,i),void o("y",t,i)):(t.style.height="100%",void("cover"===e&&t.clientWidth>n.clientWidth||"contain"===e&&t.clientWidth<n.clientWidth?(t.style.top="0",t.style.marginTop="0",o("x",t,i)):(t.style.width="100%",t.style.height="auto",t.style.left="0",t.style.marginLeft="0",o("y",t,i))))},e=function(t){if(void 0===t||t instanceof Event)t=document.querySelectorAll("[data-object-fit]");else if(t&&t.nodeName)t=[t];else{if("object"!=typeof t||!t.length||!t[0].nodeName)return!1;t=t}for(var e=0;e<t.length;e++)if(t[e].nodeName){var i=t[e].nodeName.toLowerCase();if("img"===i){if(n)continue;t[e].complete?l(t[e]):t[e].addEventListener("load",function(){l(this)})}else"video"===i?0<t[e].readyState?l(t[e]):t[e].addEventListener("loadedmetadata",function(){l(this)}):l(t[e])}return!0};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e(),window.addEventListener("resize",e),window.objectFitPolyfill=e}else window.objectFitPolyfill=function(){return!1}}}();
\ No newline at end of file
This diff is collapsed.
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";if(a.matchMedia&&a.matchMedia("all").addListener)return!1;var b=a.matchMedia,c=b("only all").matches,d=!1,e=0,f=[],g=function(){a.clearTimeout(e),e=a.setTimeout(function(){for(var c=0,d=f.length;d>c;c++){var e=f[c].mql,g=f[c].listeners||[],h=b(e.media).matches;if(h!==e.matches){e.matches=h;for(var i=0,j=g.length;j>i;i++)g[i].call(a,e)}}},30)};a.matchMedia=function(e){var h=b(e),i=[],j=0;return h.addListener=function(b){c&&(d||(d=!0,a.addEventListener("resize",g,!0)),0===j&&(j=f.push({mql:h,listeners:i})),i.push(b))},h.removeListener=function(a){for(var b=0,c=i.length;c>b;b++)i[b]===a&&i.splice(b,1)},h}}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b<t.length;b++){var c=t[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!p[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(w(c.styleSheet.rawCssText,e,f),p[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!s||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}x()};y(),c.update=y,c.getEmValue=u,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
\ No newline at end of file
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b<t.length;b++){var c=t[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!p[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(w(c.styleSheet.rawCssText,e,f),p[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!s||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}x()};y(),c.update=y,c.getEmValue=u,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment