From 00f71eba7726c969a5191f2e10fb37677802aa81 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Tue, 29 Jun 2021 07:09:57 -0700 Subject: [PATCH] Added landing page. --- bodyshop_translations.babel | 73 ++ client/package.json | 4 + client/src/assets/ImEX Online Logo - Dark.png | Bin 0 -> 37330 bytes client/src/assets/ImEX Online Logo.png | Bin 0 -> 37416 bytes client/src/landing/home/Banner0.jsx | 53 + client/src/landing/home/Content0.jsx | 49 + client/src/landing/home/Content1.jsx | 70 ++ client/src/landing/home/Content12.jsx | 60 + client/src/landing/home/Content3.jsx | 94 ++ client/src/landing/home/Content4.jsx | 59 + client/src/landing/home/Footer1.jsx | 69 ++ client/src/landing/home/LandingNavigator.jsx | 182 +++ client/src/landing/home/Pricing1.jsx | 73 ++ client/src/landing/home/Pricing2.jsx | 114 ++ client/src/landing/home/data.source.js | 1013 +++++++++++++++++ client/src/landing/home/documentation.md | 4 + client/src/landing/home/index.jsx | 142 +++ .../landing/home/less/LandingNavigator.less | 187 +++ .../src/landing/home/less/antMotionStyle.less | 14 + client/src/landing/home/less/banner0.less | 84 ++ client/src/landing/home/less/common.less | 42 + client/src/landing/home/less/content.less | 44 + client/src/landing/home/less/content0.less | 55 + client/src/landing/home/less/content1.less | 76 ++ client/src/landing/home/less/content12.less | 52 + client/src/landing/home/less/content3.less | 52 + client/src/landing/home/less/content4.less | 37 + client/src/landing/home/less/custom.less | 35 + client/src/landing/home/less/edit.less | 0 client/src/landing/home/less/footer1.less | 98 ++ client/src/landing/home/less/pricing1.less | 85 ++ client/src/landing/home/less/pricing2.less | 59 + client/src/landing/home/utils.js | 18 + client/src/pages/landing/landing.page.jsx | 4 +- client/src/translations/en_us/common.json | 7 + client/src/translations/es/common.json | 7 + client/src/translations/fr/common.json | 7 + client/yarn.lock | 96 +- 38 files changed, 3113 insertions(+), 5 deletions(-) create mode 100644 client/src/assets/ImEX Online Logo - Dark.png create mode 100644 client/src/assets/ImEX Online Logo.png create mode 100644 client/src/landing/home/Banner0.jsx create mode 100644 client/src/landing/home/Content0.jsx create mode 100644 client/src/landing/home/Content1.jsx create mode 100644 client/src/landing/home/Content12.jsx create mode 100644 client/src/landing/home/Content3.jsx create mode 100644 client/src/landing/home/Content4.jsx create mode 100644 client/src/landing/home/Footer1.jsx create mode 100644 client/src/landing/home/LandingNavigator.jsx create mode 100644 client/src/landing/home/Pricing1.jsx create mode 100644 client/src/landing/home/Pricing2.jsx create mode 100644 client/src/landing/home/data.source.js create mode 100644 client/src/landing/home/documentation.md create mode 100644 client/src/landing/home/index.jsx create mode 100644 client/src/landing/home/less/LandingNavigator.less create mode 100644 client/src/landing/home/less/antMotionStyle.less create mode 100644 client/src/landing/home/less/banner0.less create mode 100644 client/src/landing/home/less/common.less create mode 100644 client/src/landing/home/less/content.less create mode 100644 client/src/landing/home/less/content0.less create mode 100644 client/src/landing/home/less/content1.less create mode 100644 client/src/landing/home/less/content12.less create mode 100644 client/src/landing/home/less/content3.less create mode 100644 client/src/landing/home/less/content4.less create mode 100644 client/src/landing/home/less/custom.less create mode 100644 client/src/landing/home/less/edit.less create mode 100644 client/src/landing/home/less/footer1.less create mode 100644 client/src/landing/home/less/pricing1.less create mode 100644 client/src/landing/home/less/pricing2.less create mode 100644 client/src/landing/home/utils.js diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 922f4c878..122e04306 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -24129,6 +24129,79 @@ + + landing + + + labels + + + features + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + managemyshop + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + pricing + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + menus diff --git a/client/package.json b/client/package.json index eeafdb4e5..f3843a26b 100644 --- a/client/package.json +++ b/client/package.json @@ -19,6 +19,7 @@ "craco-less": "^1.17.1", "dinero.js": "^1.8.1", "dotenv": "^9.0.2", + "enquire-js": "^0.2.1", "env-cmd": "^10.1.0", "exifr": "^7.0.0", "firebase": "^8.6.0", @@ -35,6 +36,8 @@ "preval.macro": "^5.0.0", "prop-types": "^15.7.2", "query-string": "^7.0.0", + "rc-queue-anim": "^1.8.5", + "rc-scroll-anim": "^2.7.6", "react": "^17.0.1", "react-big-calendar": "^0.33.2", "react-color": "^2.19.3", @@ -49,6 +52,7 @@ "react-resizable": "^3.0.1", "react-router-dom": "^5.2.0", "react-scripts": "^4.0.3", + "react-sublime-video": "^0.2.5", "react-virtualized": "^9.22.3", "recharts": "^2.0.7", "redux": "^4.1.0", diff --git a/client/src/assets/ImEX Online Logo - Dark.png b/client/src/assets/ImEX Online Logo - Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a750669826ccaa708aae4625bbd79d0162f868 GIT binary patch literal 37330 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 literal 0 HcmV?d00001 diff --git a/client/src/assets/ImEX Online Logo.png b/client/src/assets/ImEX Online Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0719589ecb6279c18d0e978021ac47986f65a9be GIT binary patch literal 37416 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 + +
+ {typeof dataSource.title.children === 'string' && + dataSource.title.children.match(isImg) ? ( + img + ) : ( + dataSource.title.children + )} +
+
+ {dataSource.content.children} +
+ +
+ + + + + ); + } +} +export default Banner; diff --git a/client/src/landing/home/Content0.jsx b/client/src/landing/home/Content0.jsx new file mode 100644 index 000000000..ab9e51526 --- /dev/null +++ b/client/src/landing/home/Content0.jsx @@ -0,0 +1,49 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import { Row, Col } from 'antd'; +import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; +import { getChildrenToRender } from './utils'; + +class Content extends React.PureComponent { + render() { + const { dataSource, isMobile, ...props } = this.props; + const { + wrapper, + titleWrapper, + page, + OverPack: overPackData, + childWrapper, + } = dataSource; + return ( +
+
+
+ {titleWrapper.children.map(getChildrenToRender)} +
+ + + {childWrapper.children.map((block, i) => { + const { children: item, ...blockProps } = block; + return ( + +
+ {item.children.map(getChildrenToRender)} +
+ + ); + })} +
+
+
+
+ ); + } +} + +export default Content; diff --git a/client/src/landing/home/Content1.jsx b/client/src/landing/home/Content1.jsx new file mode 100644 index 000000000..66e6425ee --- /dev/null +++ b/client/src/landing/home/Content1.jsx @@ -0,0 +1,70 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import TweenOne from 'rc-tween-one'; +import { Row, Col } from 'antd'; +import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; + +function Content1(props) { + const { ...tagProps } = props; + const { dataSource, isMobile } = tagProps; + delete tagProps.dataSource; + delete tagProps.isMobile; + const animType = { + queue: isMobile ? 'bottom' : 'right', + one: isMobile + ? { + scaleY: '+=0.3', + opacity: 0, + type: 'from', + ease: 'easeOutQuad', + } + : { + x: '-=30', + opacity: 0, + type: 'from', + ease: 'easeOutQuad', + }, + }; + return ( +
+ + + + img + + + +

+ {dataSource.title.children} +

+
+ {dataSource.content.children} +
+
+
+
+ ); +} + +export default Content1; diff --git a/client/src/landing/home/Content12.jsx b/client/src/landing/home/Content12.jsx new file mode 100644 index 000000000..b828b4c48 --- /dev/null +++ b/client/src/landing/home/Content12.jsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { Row, Col } from 'antd'; +import { TweenOneGroup } from 'rc-tween-one'; +import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; +import { getChildrenToRender } from './utils'; + +class Content12 extends React.PureComponent { + getChildrenToRender = (data) => + data.map((item) => { + return ( + +
+ + img + +
+ + ); + }); + + render() { + const { ...props } = this.props; + const { dataSource } = props; + delete props.dataSource; + delete props.isMobile; + const childrenToRender = this.getChildrenToRender( + dataSource.block.children + ); + return ( +
+
+
+ {dataSource.titleWrapper.children.map(getChildrenToRender)} +
+ + + {childrenToRender} + + +
+
+ ); + } +} + +export default Content12; diff --git a/client/src/landing/home/Content3.jsx b/client/src/landing/home/Content3.jsx new file mode 100644 index 000000000..49fe071ce --- /dev/null +++ b/client/src/landing/home/Content3.jsx @@ -0,0 +1,94 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import TweenOne from 'rc-tween-one'; +import { Row, Col } from 'antd'; +import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; +import { getChildrenToRender } from './utils'; + +class Content3 extends React.PureComponent { + getDelay = (e, b) => (e % b) * 100 + Math.floor(e / b) * 100 + b * 100; + + render() { + const { ...props } = this.props; + const { dataSource, isMobile } = props; + delete props.dataSource; + delete props.isMobile; + let clearFloatNum = 0; + const children = dataSource.block.children.map((item, i) => { + const childObj = item.children; + const delay = isMobile ? i * 50 : this.getDelay(i, 24 / item.md); + const liAnim = { + opacity: 0, + type: 'from', + ease: 'easeOutQuad', + delay, + }; + const childrenAnim = { ...liAnim, x: '+=10', delay: delay + 100 }; + clearFloatNum += item.md; + clearFloatNum = clearFloatNum > 24 ? 0 : clearFloatNum; + return ( + + + img + +
+ + {childObj.title.children} + + + {childObj.content.children} + +
+
+ ); + }); + return ( +
+
+
+ {dataSource.titleWrapper.children.map(getChildrenToRender)} +
+ + + + {children} + + + +
+
+ ); + } +} + +export default Content3; diff --git a/client/src/landing/home/Content4.jsx b/client/src/landing/home/Content4.jsx new file mode 100644 index 000000000..836ca4d14 --- /dev/null +++ b/client/src/landing/home/Content4.jsx @@ -0,0 +1,59 @@ +import React from 'react'; +import TweenOne from 'rc-tween-one'; +import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; +import VideoPlay from 'react-sublime-video'; +import { getChildrenToRender } from './utils'; + +function Content4(props) { + const { ...tagProps } = props; + const { dataSource, isMobile } = tagProps; + delete tagProps.dataSource; + delete tagProps.isMobile; + const animation = { + y: '+=30', + opacity: 0, + type: 'from', + ease: 'easeOutQuad', + }; + const videoChildren = dataSource.video.children.video; + const videoNameArray = videoChildren.split('.'); + const type = videoNameArray[videoNameArray.length - 1]; + return ( +
+
+
+ {dataSource.titleWrapper.children.map(getChildrenToRender)} +
+ + + {isMobile ? ( + + ) : ( + + + + )} + + +
+
+ ); +} + +export default Content4; diff --git a/client/src/landing/home/Footer1.jsx b/client/src/landing/home/Footer1.jsx new file mode 100644 index 000000000..fe64b1219 --- /dev/null +++ b/client/src/landing/home/Footer1.jsx @@ -0,0 +1,69 @@ +import React from 'react'; +import TweenOne from 'rc-tween-one'; +import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; +import QueueAnim from 'rc-queue-anim'; +import { Row, Col } from 'antd'; +import { getChildrenToRender } from './utils'; +import { isImg } from './utils'; + +class Footer extends React.Component { + static defaultProps = { + className: 'footer1', + }; + + getLiChildren = (data) => + data.map((item, i) => { + const { title, childWrapper, ...itemProps } = item; + return ( + +

+ {typeof title.children === 'string' && + title.children.match(isImg) ? ( + img + ) : ( + title.children + )} +

+
+ {childWrapper.children.map(getChildrenToRender)} +
+ + ); + }); + + render() { + const { ...props } = this.props; + const { dataSource } = props; + delete props.dataSource; + delete props.isMobile; + const childrenToRender = this.getLiChildren(dataSource.block.children); + return ( +
+ + + {childrenToRender} + + +
+
+ {dataSource.copyright.children} +
+
+
+
+
+ ); + } +} + +export default Footer; diff --git a/client/src/landing/home/LandingNavigator.jsx b/client/src/landing/home/LandingNavigator.jsx new file mode 100644 index 000000000..2c0a840ae --- /dev/null +++ b/client/src/landing/home/LandingNavigator.jsx @@ -0,0 +1,182 @@ +import React, { useState } from "react"; +import TweenOne from "rc-tween-one"; +import { Anchor, Menu } from "antd"; +import { getChildrenToRender } from "./utils"; +import ImexOnlineLogoLight from "../../assets/ImEX Online Logo.png"; +import { Link } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +const { Item, SubMenu } = Menu; + +export default function LandingNavigator({ dataSource, isMobile, ...props }) { + const [state, setState] = useState({ phoneOpen: undefined }); + const { t } = useTranslation(); + const { phoneOpen } = state; + + const phoneClick = () => { + const phoneOpen = !state.phoneOpen; + setState({ + phoneOpen, + }); + }; + + const moment = phoneOpen === undefined ? 300 : null; + return ( + +
+ + img + + {isMobile && ( + //Unknown what this menu does. +
{ + phoneClick(); + }} + > + + + +
+ )} + { + if (state.phoneOpen) { + e.target.style.height = "auto"; + } + }, + ease: "easeInOutQuad", + } + : null + } + moment={moment} + reverse={!!phoneOpen} + > + + + + {t("landing.labels.features")} + + + + + {t("landing.labels.pricing")} + + + + + {t("landing.labels.managemyshop")} + + + + +
+
+ ); +} + +// +// {a.children.map(getChildrenToRender)} +// +// } +// popupClassName="header0-item-child" +// > +// {subItem.map(($item, ii) => { +// const { children: childItem } = $item; +// const child = childItem.href ? ( +//
+// {childItem.children.map(getChildrenToRender)} +// +// ) : ( +//
+// {childItem.children.map(getChildrenToRender)} +//
+// ); +// return ( +// +// {child} +// +// ); +// })} +// +// subItem: [ +// { +// name: "sub0", +// className: "item-sub", +// children: { +// className: "item-sub-item", +// children: [ +// { +// name: "image0", +// className: "item-image", +// children: +// "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", +// }, +// { +// name: "title", +// className: "item-title", +// children: "Ant Design", +// }, +// { +// name: "content", +// className: "item-content", +// children: "企业级 UI 设计体系", +// }, +// ], +// }, +// }, +// { +// name: "sub1", +// className: "item-sub", +// children: { +// className: "item-sub-item", +// children: [ +// { +// name: "image0", +// className: "item-image", +// children: +// "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", +// }, +// { +// name: "title", +// className: "item-title", +// children: "Ant Design", +// }, +// { +// name: "content", +// className: "item-content", +// children: "企业级 UI 设计体系", +// }, +// ], +// }, +// }, +// ], diff --git a/client/src/landing/home/Pricing1.jsx b/client/src/landing/home/Pricing1.jsx new file mode 100644 index 000000000..f74dcf901 --- /dev/null +++ b/client/src/landing/home/Pricing1.jsx @@ -0,0 +1,73 @@ +import React from 'react'; +import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; +import QueueAnim from 'rc-queue-anim'; +import { Row, Col, Button } from 'antd'; +import { getChildrenToRender } from './utils'; + +class Pricing1 extends React.PureComponent { + getChildrenToRender = (item) => { + const { + wrapper, + topWrapper, + name, + buttonWrapper, + line, + content, + money, + } = item.children; + return ( + + +
+
+ {name.children} +
+

+ {money.children} +

+
+
+ {content.children} +
+ +
+ +
+
+ + ); + }; + + render() { + const { ...props } = this.props; + const { dataSource } = props; + delete props.dataSource; + delete props.isMobile; + const { block } = dataSource; + const childrenToRender = block.children.map(this.getChildrenToRender); + return ( +
+
+
+ {dataSource.titleWrapper.children.map(getChildrenToRender)} +
+ + + {childrenToRender} + + +
+
+ ); + } +} + +export default Pricing1; diff --git a/client/src/landing/home/Pricing2.jsx b/client/src/landing/home/Pricing2.jsx new file mode 100644 index 000000000..31eb70548 --- /dev/null +++ b/client/src/landing/home/Pricing2.jsx @@ -0,0 +1,114 @@ +import React from 'react'; +import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; +import QueueAnim from 'rc-queue-anim'; +import { Table } from 'antd'; +import { getChildrenToRender, isImg } from './utils'; + +class Pricing2 extends React.PureComponent { + getColumns = (columns) => { + return columns.map((item) => { + const { childWrapper, ...$item } = item; + return { + align: 'center', + ...$item, + title: ( +
+ {childWrapper.children.map(getChildrenToRender)} +
+ ), + }; + }); + }; + + getDataSource = (dataSource, columns) => + dataSource.map((item, i) => { + const obj = { key: i.toString() }; + item.children.forEach(($item, ii) => { + if (columns[ii]) { + obj[columns[ii].key] = ( +
+ {typeof $item.children === 'string' && + $item.children.match(isImg) ? ( + img + ) : ( + $item.children + )} +
+ ); + } + }); + return obj; + }); + + getMobileChild = (table) => { + const { columns, dataSource, ...tableProps } = table; + const names = columns.children.filter( + (item) => item.key.indexOf('name') >= 0 + ); + const newColumns = columns.children.filter( + (item) => item.key.indexOf('name') === -1 + ); + return newColumns.map((item, i) => { + const items = [].concat(names[0], item).filter((c) => c); + if (items.length > 1) { + items[0].colSpan = 0; + items[1].colSpan = 2; + } + const dataSources = dataSource.children.map(($item) => { + const child = $item.children.filter( + (c) => c.name.indexOf('name') === -1 + ); + const n = $item.children.filter((c) => c.name.indexOf('name') >= 0); + return { + ...$item, + children: [].concat(n[0], child[i]).filter((c) => c), + }; + }); + const props = { + ...tableProps, + columns: this.getColumns(items), + dataSource: this.getDataSource(dataSources, items), + }; + return ( + + ); + }); + }; + + render() { + const { dataSource, isMobile, ...props } = this.props; + const { Table: table, wrapper, page, titleWrapper } = dataSource; + const { columns, dataSource: tableData, ...$table } = table; + const tableProps = { + ...$table, + columns: this.getColumns(columns.children), + dataSource: this.getDataSource(tableData.children, columns.children), + }; + const childrenToRender = isMobile ? ( + this.getMobileChild(table) + ) : ( +
+ ); + return ( +
+
+
+ {titleWrapper.children.map(getChildrenToRender)} +
+ + + {childrenToRender} + + +
+
+ ); + } +} + +export default Pricing2; diff --git a/client/src/landing/home/data.source.js b/client/src/landing/home/data.source.js new file mode 100644 index 000000000..4033ddc07 --- /dev/null +++ b/client/src/landing/home/data.source.js @@ -0,0 +1,1013 @@ +import React from "react"; +export const Nav00DataSource = { + wrapper: { className: "header0 home-page-wrapper" }, + page: { className: "home-page" }, + logo: { + className: "header0-logo", + children: "https://os.alipayobjects.com/rmsportal/mlcYmsRilwraoAe.svg", + }, + Menu: { + className: "header0-menu", + children: [ + { + name: "item0", + className: "header0-item", + children: { + href: "#", + children: [{ children: "导航一", name: "text" }], + }, + subItem: [ + { + name: "sub0", + className: "item-sub", + children: { + className: "item-sub-item", + children: [ + { + name: "image0", + className: "item-image", + children: + "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", + }, + { + name: "title", + className: "item-title", + children: "Ant Design", + }, + { + name: "content", + className: "item-content", + children: "企业级 UI 设计体系", + }, + ], + }, + }, + { + name: "sub1", + className: "item-sub", + children: { + className: "item-sub-item", + children: [ + { + name: "image0", + className: "item-image", + children: + "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", + }, + { + name: "title", + className: "item-title", + children: "Ant Design", + }, + { + name: "content", + className: "item-content", + children: "企业级 UI 设计体系", + }, + ], + }, + }, + ], + }, + { + name: "item1", + className: "header0-item", + children: { + href: "#", + children: [{ children: "导航二", name: "text" }], + }, + }, + { + name: "item2", + className: "header0-item", + children: { + href: "#", + children: [{ children: "导航三", name: "text" }], + }, + }, + { + name: "item3", + className: "header0-item", + children: { + href: "#", + children: [{ children: "导航四", name: "text" }], + }, + }, + ], + }, + mobileMenu: { className: "header0-mobile-menu" }, +}; + +export const Banner00DataSource = { + wrapper: { className: "banner0" }, + textWrapper: { className: "banner0-text-wrapper" }, + title: { + className: "banner0-title", + children: "https://zos.alipayobjects.com/rmsportal/HqnZZjBjWRbjyMr.png", + }, + content: { + className: "banner0-content", + children: "一个高效的页面动画解决方案", + }, + button: { className: "banner0-button", children: "Learn More" }, +}; +export const Content40DataSource = { + wrapper: { className: "home-page-wrapper content4-wrapper" }, + page: { className: "home-page content4" }, + OverPack: { playScale: 0.3, className: "" }, + titleWrapper: { + className: "title-wrapper", + children: [ + { + name: "title", + children: "蚂蚁金融云提供专业的服务", + className: "title-h1", + }, + { + name: "content", + className: "title-content content4-title-content", + children: "科技想象力,金融创造力", + }, + ], + }, + video: { + className: "content4-video", + children: { + video: "https://os.alipayobjects.com/rmsportal/EejaUGsyExkXyXr.mp4", + image: "https://zos.alipayobjects.com/rmsportal/HZgzhugQZkqUwBVeNyfz.jpg", + }, + }, +}; +export const Content00DataSource = { + wrapper: { className: "home-page-wrapper content0-wrapper" }, + page: { className: "home-page content0" }, + OverPack: { playScale: 0.3, className: "" }, + titleWrapper: { + className: "title-wrapper", + children: [{ name: "title", children: "产品与服务" }], + }, + childWrapper: { + className: "content0-block-wrapper", + children: [ + { + name: "block0", + className: "content0-block", + md: 8, + xs: 24, + children: { + className: "content0-block-item", + children: [ + { + name: "image", + className: "content0-block-icon", + children: + "https://zos.alipayobjects.com/rmsportal/WBnVOjtIlGWbzyQivuyq.png", + }, + { + name: "title", + className: "content0-block-title", + children: "一站式业务接入", + }, + { name: "content", children: "支付、结算、核算接入产品效率翻四倍" }, + ], + }, + }, + { + name: "block1", + className: "content0-block", + md: 8, + xs: 24, + children: { + className: "content0-block-item", + children: [ + { + name: "image", + className: "content0-block-icon", + children: + "https://zos.alipayobjects.com/rmsportal/YPMsLQuCEXtuEkmXTTdk.png", + }, + { + name: "title", + className: "content0-block-title", + children: "一站式事中风险监控", + }, + { + name: "content", + children: "在所有需求配置环节事前风险控制和质量控制能力", + }, + ], + }, + }, + { + name: "block2", + className: "content0-block", + md: 8, + xs: 24, + children: { + className: "content0-block-item", + children: [ + { + name: "image", + className: "content0-block-icon", + children: + "https://zos.alipayobjects.com/rmsportal/EkXWVvAaFJKCzhMmQYiX.png", + }, + { + name: "title", + className: "content0-block-title", + children: "一站式数据运营", + }, + { + name: "content", + children: "沉淀产品接入效率和运营小二工作效率数据", + }, + ], + }, + }, + ], + }, +}; +export const Content10DataSource = { + wrapper: { className: "home-page-wrapper content1-wrapper" }, + OverPack: { className: "home-page content1", playScale: 0.3 }, + imgWrapper: { className: "content1-img", md: 10, xs: 24 }, + img: { + children: "https://zos.alipayobjects.com/rmsportal/nLzbeGQLPyBJoli.png", + }, + textWrapper: { className: "content1-text", md: 14, xs: 24 }, + title: { className: "content1-title", children: "企业资源管理" }, + content: { + className: "content1-content", + children: + "云资源集中编排、弹性伸缩、持续发布和部署,高可用及容灾。云资源集中编排、弹性伸缩、持续发布和部署,高可用及容灾。云资源集中编排、弹性伸缩、持续发布和部署,高可用及容灾。", + }, +}; +export const Pricing20DataSource = { + wrapper: { className: "home-page-wrapper pricing2-wrapper" }, + page: { className: "home-page pricing2" }, + OverPack: { playScale: 0.3, className: "pricing2-content-wrapper" }, + titleWrapper: { + className: "pricing2-title-wrapper", + children: [ + { name: "title", children: "价目表", className: "pricing2-title-h1" }, + ], + }, + Table: { + name: "tabsTitle", + size: "default", + className: "pricing2-table", + columns: { + children: [ + { + dataIndex: "name", + key: "name", + name: "empty", + childWrapper: { + children: [ + { name: "name", children: " " }, + { name: "content", children: " " }, + ], + }, + }, + { + dataIndex: "free", + key: "free", + name: "free", + childWrapper: { + className: "pricing2-table-name-block", + children: [ + { + name: "name", + className: "pricing2-table-name", + children: "Free", + }, + { + name: "content", + className: "pricing2-table-money", + children: "¥0", + }, + { name: "button", children: { href: "#", children: "免费试用" } }, + ], + }, + }, + { + dataIndex: "basic", + key: "basic", + name: "basic", + childWrapper: { + className: "pricing2-table-name-block", + children: [ + { + name: "name", + className: "pricing2-table-name", + children: "Basic", + }, + { + name: "content", + className: "pricing2-table-money", + children: "¥550", + }, + { name: "button", children: { href: "#", children: "立即购买" } }, + ], + }, + }, + { + dataIndex: "pro", + key: "pro", + name: "pro", + childWrapper: { + className: "pricing2-table-name-block", + children: [ + { + name: "name", + className: "pricing2-table-name", + children: "Pro", + }, + { + name: "content", + className: "pricing2-table-money", + children: "¥2,200", + }, + { + name: "button", + children: { href: "#", type: "primary", children: "立即购买" }, + }, + ], + }, + }, + { + dataIndex: "unlimited", + key: "unlimited", + name: "unlimited", + childWrapper: { + className: "pricing2-table-name-block", + children: [ + { + name: "name", + className: "pricing2-table-name", + children: "Unlimited", + }, + { + name: "content", + className: "pricing2-table-money", + children: "¥5,600", + }, + { name: "button", children: { href: "#", children: "立即购买" } }, + ], + }, + }, + ], + }, + dataSource: { + children: [ + { + name: "list0", + children: [ + { + className: "pricing2-table-content-name", + name: "name", + children: "实例系列1", + }, + { + children: "Limited", + name: "content0", + className: "pricing2-table-content", + }, + { + children: "Unlimited", + name: "content1", + className: "pricing2-table-content", + }, + { + children: "Unlimited", + name: "content2", + className: "pricing2-table-content", + }, + { + children: "Unlimited", + name: "content3", + className: "pricing2-table-content", + }, + ], + }, + { + name: "list1", + children: [ + { + className: "pricing2-table-content-name", + name: "name", + children: "实例系列2", + }, + { + children: "Limited", + name: "content0", + className: "pricing2-table-content", + }, + { + children: "Unlimited", + name: "content1", + className: "pricing2-table-content", + }, + { + children: "Unlimited", + name: "content2", + className: "pricing2-table-content", + }, + { + children: "Unlimited", + name: "content3", + className: "pricing2-table-content", + }, + ], + }, + { + name: "list2", + children: [ + { + className: "pricing2-table-content-name", + name: "name", + children: "固定宽带计费", + }, + { + name: "content0", + children: "50GB", + className: "pricing2-table-content", + }, + { + name: "content1", + children: "250GB", + className: "pricing2-table-content", + }, + { + name: "content2", + children: "600GB", + className: "pricing2-table-content", + }, + { + name: "content3", + children: "Unlimited", + className: "pricing2-table-content", + }, + ], + }, + { + name: "list3", + children: [ + { + className: "pricing2-table-content-name", + name: "name", + children: "闲置负载均衡", + }, + { + children: "-", + name: "content0", + className: "pricing2-table-content", + }, + { + name: "content1", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", + className: "pricing2-table-content", + }, + { + name: "content2", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", + className: "pricing2-table-content", + }, + { + name: "content3", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", + className: "pricing2-table-content", + }, + ], + }, + { + name: "list4", + children: [ + { + className: "pricing2-table-content-name", + name: "name", + children: "4核", + }, + { + name: "content0", + children: "-", + className: "pricing2-table-content", + }, + { + name: "content1", + children: "-", + className: "pricing2-table-content", + }, + { + name: "content2", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", + className: "pricing2-table-content", + }, + { + name: "content3", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", + className: "pricing2-table-content", + }, + ], + }, + { + name: "list5", + children: [ + { + className: "pricing2-table-content-name", + name: "name", + children: "系统盘(线性计费)", + }, + { + name: "content0", + children: "-", + className: "pricing2-table-content", + }, + { + name: "content1", + children: "-", + className: "pricing2-table-content", + }, + { + name: "content2", + children: "-", + className: "pricing2-table-content", + }, + { + name: "content3", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", + className: "pricing2-table-content", + }, + ], + }, + ], + }, + }, +}; +export const Pricing11DataSource = { + wrapper: { className: "home-page-wrapper pricing1-wrapper" }, + page: { className: "home-page pricing1" }, + OverPack: { playScale: 0.3, className: "pricing1-content-wrapper" }, + titleWrapper: { + className: "pricing1-title-wrapper", + children: [ + { name: "title", children: "价目表", className: "pricing1-title-h1" }, + ], + }, + block: { + className: "pricing1-block-wrapper", + children: [ + { + name: "block0", + className: "pricing1-block", + md: 8, + xs: 24, + children: { + wrapper: { className: "pricing1-block-box " }, + topWrapper: { className: "pricing1-top-wrapper" }, + name: { className: "pricing1-name", children: "Free" }, + money: { className: "pricing1-money", children: "¥0" }, + content: { + className: "pricing1-content", + children: ( + + 140-500Mbps +
140 GB-50TB(含) +
14500GB流量包 +
14国内按峰值宽带账单 +
14弹性计算 +
14云服务器 ECS{" "} +
+ ), + }, + line: { className: "pricing1-line" }, + buttonWrapper: { + className: "pricing1-button-wrapper", + children: { + a: { + className: "pricing1-button", + href: "#", + children: "免费试用", + }, + }, + }, + }, + }, + { + name: "block1", + className: "pricing1-block", + md: 8, + xs: 24, + children: { + wrapper: { className: "pricing1-block-box active" }, + topWrapper: { className: "pricing1-top-wrapper" }, + name: { className: "pricing1-name", children: "Starter" }, + money: { className: "pricing1-money", children: "¥199" }, + content: { + className: "pricing1-content", + children: ( + + 14500-5Gbps +
+ 1410 GB-50TB(含) +
+ 141TB流量包 +
+ 14国内按峰值宽带账单 +
+ 14弹性计算 +
+ 云服务器 ECS +
+ ), + }, + line: { className: "pricing1-line" }, + buttonWrapper: { + className: "pricing1-button-wrapper", + children: { + a: { + className: "pricing1-button", + href: "#", + children: "立即购买", + }, + }, + }, + }, + }, + { + name: "block2", + className: "pricing1-block", + md: 8, + xs: 24, + children: { + wrapper: { className: "pricing1-block-box " }, + topWrapper: { className: "pricing1-top-wrapper" }, + name: { className: "pricing1-name", children: "Pro" }, + money: { className: "pricing1-money", children: "¥999" }, + content: { + className: "pricing1-content", + children: ( + + 14大于5Gbps +
+ 1450 GB-100TB(含) +
+ 145TB流量包 +
+ 14国内按峰值宽带账单 +
+ 14弹性计算 +
+ 14云服务器 ECS +
+ ), + }, + line: { className: "pricing1-line" }, + buttonWrapper: { + className: "pricing1-button-wrapper", + children: { + a: { + className: "pricing1-button", + href: "#", + children: "立即购买", + }, + }, + }, + }, + }, + ], + }, +}; +export const Content30DataSource = { + wrapper: { className: "home-page-wrapper content3-wrapper" }, + page: { className: "home-page content3" }, + OverPack: { playScale: 0.3 }, + titleWrapper: { + className: "title-wrapper", + children: [ + { + name: "title", + children: "蚂蚁金融云提供专业的服务", + className: "title-h1", + }, + { + name: "content", + className: "title-content", + children: "基于阿里云强大的基础资源", + }, + ], + }, + block: { + className: "content3-block-wrapper", + children: [ + { + name: "block0", + className: "content3-block", + md: 8, + xs: 24, + children: { + icon: { + className: "content3-icon", + children: + "https://zos.alipayobjects.com/rmsportal/ScHBSdwpTkAHZkJ.png", + }, + textWrapper: { className: "content3-text" }, + title: { className: "content3-title", children: "企业资源管理" }, + content: { + className: "content3-content", + children: + "云资源集中编排、弹性伸缩、持续发布和部署,高可用及容灾。", + }, + }, + }, + { + name: "block1", + className: "content3-block", + md: 8, + xs: 24, + children: { + icon: { + className: "content3-icon", + children: + "https://zos.alipayobjects.com/rmsportal/NKBELAOuuKbofDD.png", + }, + textWrapper: { className: "content3-text" }, + title: { className: "content3-title", children: "云安全" }, + content: { + className: "content3-content", + children: + "按金融企业安全要求打造的完整云上安全体系,全方位保障金融应用及数据安全。", + }, + }, + }, + { + name: "block2", + className: "content3-block", + md: 8, + xs: 24, + children: { + icon: { + className: "content3-icon", + children: + "https://zos.alipayobjects.com/rmsportal/xMSBjgxBhKfyMWX.png", + }, + textWrapper: { className: "content3-text" }, + title: { className: "content3-title", children: "云监控" }, + content: { + className: "content3-content", + children: + "分布式云环境集中监控,统一资源及应用状态视图,智能分析及故障定位。", + }, + }, + }, + { + name: "block3", + className: "content3-block", + md: 8, + xs: 24, + children: { + icon: { + className: "content3-icon", + children: + "https://zos.alipayobjects.com/rmsportal/MNdlBNhmDBLuzqp.png", + }, + textWrapper: { className: "content3-text" }, + title: { className: "content3-title", children: "移动" }, + content: { + className: "content3-content", + children: + "一站式移动金融APP开发及全面监控;丰富可用组件,动态发布和故障热修复。", + }, + }, + }, + { + name: "block4", + className: "content3-block", + md: 8, + xs: 24, + children: { + icon: { + className: "content3-icon", + children: + "https://zos.alipayobjects.com/rmsportal/UsUmoBRyLvkIQeO.png", + }, + textWrapper: { className: "content3-text" }, + title: { className: "content3-title", children: "分布式中间件" }, + content: { + className: "content3-content", + children: + "金融级联机交易处理中间件,大规模分布式计算机,数万笔/秒级并发能力,严格保证交易数据统一性。", + }, + }, + }, + { + name: "block5", + className: "content3-block", + md: 8, + xs: 24, + children: { + icon: { + className: "content3-icon", + children: + "https://zos.alipayobjects.com/rmsportal/ipwaQLBLflRfUrg.png", + }, + textWrapper: { className: "content3-text" }, + title: { className: "content3-title", children: "大数据" }, + content: { + className: "content3-content", + children: + "一站式、全周期大数据协同工作平台,PB级数据处理、毫秒级数据分析工具。", + }, + }, + }, + ], + }, +}; +export const Content120DataSource = { + wrapper: { className: "home-page-wrapper content12-wrapper" }, + page: { className: "home-page content12" }, + OverPack: { playScale: 0.3, className: "" }, + titleWrapper: { + className: "title-wrapper", + children: [ + { + name: "image", + children: + "https://gw.alipayobjects.com/zos/rmsportal/PiqyziYmvbgAudYfhuBr.svg", + className: "title-image", + }, + { name: "title", children: "特别鸣谢", className: "title-h1" }, + ], + }, + block: { + className: "img-wrapper", + children: [ + { + name: "block0", + className: "block", + md: 8, + xs: 24, + children: { + wrapper: { className: "block-content" }, + img: { + children: + "https://gw.alipayobjects.com/zos/rmsportal/TFicUVisNHTOEeMYXuQF.svg", + }, + }, + }, + { + name: "block1", + className: "block", + md: 8, + xs: 24, + children: { + wrapper: { className: "block-content" }, + img: { + children: + "https://gw.alipayobjects.com/zos/rmsportal/hkLGkrlCEkGZeMQlnEkD.svg", + }, + }, + }, + { + name: "block2", + className: "block", + md: 8, + xs: 24, + children: { + wrapper: { className: "block-content" }, + img: { + children: + "https://gw.alipayobjects.com/zos/rmsportal/bqyPRSZmhvrsfJrBvASi.svg", + }, + }, + }, + { + name: "block3", + className: "block", + md: 8, + xs: 24, + children: { + wrapper: { className: "block-content" }, + img: { + children: + "https://gw.alipayobjects.com/zos/rmsportal/UcsyszzOabdCYDkoPPnM.svg", + }, + }, + }, + { + name: "block4", + className: "block", + md: 8, + xs: 24, + children: { + wrapper: { className: "block-content" }, + img: { + children: + "https://gw.alipayobjects.com/zos/rmsportal/kRBeaICGexAmVjqBEqgw.svg", + }, + }, + }, + { + name: "block5", + className: "block", + md: 8, + xs: 24, + children: { + wrapper: { className: "block-content" }, + img: { + children: + "https://gw.alipayobjects.com/zos/rmsportal/ftBIiyJcCHpHEioRvPsV.svg", + }, + }, + }, + ], + }, +}; +export const Footer10DataSource = { + wrapper: { className: "home-page-wrapper footer1-wrapper" }, + OverPack: { className: "footer1", playScale: 0.2 }, + block: { + className: "home-page", + gutter: 0, + children: [ + { + name: "block0", + xs: 24, + md: 6, + className: "block", + title: { + className: "logo", + children: + "https://zos.alipayobjects.com/rmsportal/qqaimmXZVSwAhpL.svg", + }, + childWrapper: { + className: "slogan", + children: [ + { + name: "content0", + children: "Animation specification and components of Ant Design.", + }, + ], + }, + }, + { + name: "block1", + xs: 24, + md: 6, + className: "block", + title: { children: "产品" }, + childWrapper: { + children: [ + { name: "link0", href: "#", children: "产品更新记录" }, + { name: "link1", href: "#", children: "API文档" }, + { name: "link2", href: "#", children: "快速入门" }, + { name: "link3", href: "#", children: "参考指南" }, + ], + }, + }, + { + name: "block2", + xs: 24, + md: 6, + className: "block", + title: { children: "关于" }, + childWrapper: { + children: [ + { href: "#", name: "link0", children: "FAQ" }, + { href: "#", name: "link1", children: "联系我们" }, + ], + }, + }, + { + name: "block3", + xs: 24, + md: 6, + className: "block", + title: { children: "资源" }, + childWrapper: { + children: [ + { href: "#", name: "link0", children: "Ant Design" }, + { href: "#", name: "link1", children: "Ant Motion" }, + ], + }, + }, + ], + }, + copyrightWrapper: { className: "copyright-wrapper" }, + copyrightPage: { className: "home-page" }, + copyright: { + className: "copyright", + children: ( + + ©2018 by Ant Motion All Rights + Reserved + + ), + }, +}; diff --git a/client/src/landing/home/documentation.md b/client/src/landing/home/documentation.md new file mode 100644 index 000000000..ad58ffcce --- /dev/null +++ b/client/src/landing/home/documentation.md @@ -0,0 +1,4 @@ +# 如何使用: + +- umi 里如何使用[请查看](https://landing.ant.design/docs/use/umi)。 +- 其它脚手架使用[请查看](https://landing.ant.design/docs/use/getting-started)。 diff --git a/client/src/landing/home/index.jsx b/client/src/landing/home/index.jsx new file mode 100644 index 000000000..2374e41c2 --- /dev/null +++ b/client/src/landing/home/index.jsx @@ -0,0 +1,142 @@ +/* eslint no-undef: 0 */ +/* eslint arrow-parens: 0 */ +import React from "react"; +import { enquireScreen } from "enquire-js"; +import { Anchor } from "antd"; +import LandingNavigator from "./LandingNavigator"; +import Banner0 from "./Banner0"; +import Content4 from "./Content4"; +import Content0 from "./Content0"; +import Content1 from "./Content1"; +import Pricing2 from "./Pricing2"; +import Pricing1 from "./Pricing1"; +import Content3 from "./Content3"; +import Content12 from "./Content12"; +import Footer1 from "./Footer1"; + +import { + Nav00DataSource, + Banner00DataSource, + Content40DataSource, + Content00DataSource, + Content10DataSource, + Pricing20DataSource, + Pricing11DataSource, + Content30DataSource, + Content120DataSource, + Footer10DataSource, +} from "./data.source"; +import "./less/antMotionStyle.less"; + +let isMobile; +enquireScreen((b) => { + isMobile = b; +}); + +const { location = {} } = typeof window !== "undefined" ? window : {}; + +export default class Home extends React.Component { + constructor(props) { + super(props); + this.state = { + isMobile, + show: !location.port, // 如果不是 dva 2.0 请删除 + }; + } + + componentDidMount() { + // 适配手机屏幕; + enquireScreen((b) => { + this.setState({ isMobile: !!b }); + }); + // dva 2.0 样式在组件渲染之后动态加载,导致滚动组件不生效;线上不影响; + /* 如果不是 dva 2.0 请删除 start */ + if (location.port) { + // 样式 build 时间在 200-300ms 之间; + setTimeout(() => { + this.setState({ + show: true, + }); + }, 500); + } + /* 如果不是 dva 2.0 请删除 end */ + } + + render() { + const children = [ + , + , + , + , + , + , + , + , + , + , + ]; + return ( +
{ + this.dom = d; + }} + > + + {this.state.show && children} + {/* 如果不是 dva 2.0 替换成 {children} end */} + +
+ ); + } +} diff --git a/client/src/landing/home/less/LandingNavigator.less b/client/src/landing/home/less/LandingNavigator.less new file mode 100644 index 000000000..3c662defc --- /dev/null +++ b/client/src/landing/home/less/LandingNavigator.less @@ -0,0 +1,187 @@ +@header0: header0; + +.@{header0} { + background: @template-nav-bg-color; + width: 100%; + z-index: 1; + box-shadow: 0 5px 8px fade(#000, 15); + position: relative; + top: 0; + + .home-page { + padding: 0 24px; + } + + &-logo { + display: inline-block; + position: relative; + width: 150px; + line-height: 64px; + + & img { + vertical-align: middle; + display: inline-block; + } + + & a { + display: block; + } + } + + &-menu { + float: right; + + .ant-menu { + line-height: 62px; + height: 64px; + + a { + display: block; + } + } + } + + &-item { + &-block { + padding: 0 8px; + + >* { + display: inline-block; + } + } + } + + &-item, + &-item-child, + &-menu { + + .ant-menu-sub .ant-menu-item, + .ant-menu-inline .ant-menu-item { + height: auto; + line-height: 1.5; + } + + .item { + &-sub-item { + display: block; + padding: 8px 24px; + } + + &-image { + float: left; + margin-right: 16px; + margin-top: 4px; + position: relative; + z-index: 1; + } + + &-title { + font-size: 14px; + color: #fff; + margin-left: 46px; + } + + &-content { + font-size: 12px; + color: fade(#fff, 75); + margin-left: 46px; + } + } + } +} + +@media screen and (max-width: 767px) { + .@{header0} { + &-logo { + z-index: 101; + } + + &.home-page-wrapper .home-page { + padding: 0 24px; + } + + &-menu { + height: auto; + float: inherit; + position: relative; + left: -24px; + width: ~"calc(100% + 48px)"; + opacity: 0; + transition: opacity .3s @ease-in-out; + + & li { + padding: 0 24px; + + &.ant-menu-submenu { + padding: 0; + } + } + .item { + &-sub-item { + padding: 8px 0; + } + } + } + + &-mobile-menu { + width: 16px; + height: 14px; + cursor: pointer; + position: absolute; + top: 24px; + right: 24px; + z-index: 100; + + em { + display: block; + width: 100%; + height: 2px; + background: #fff; + margin-top: 4px; + transition: transform .3s @ease-in-out, opacity .3s @ease-in-out; + } + + :first-child { + margin-top: 0; + } + } + + .ant-menu { + height: auto; + overflow: hidden; + + .ant-menu-item-selected { + border: none; + } + } + + & .open { + height: auto; + + .@{header0}-mobile-menu { + em { + &:nth-child(1) { + transform: translateY(6px) rotate(45deg); + } + + &:nth-child(2) { + opacity: 0; + } + + &:nth-child(3) { + transform: translateY(-6px) rotate(-45deg); + } + } + } + + >.@{header0}-menu { + opacity: 1; + pointer-events: auto; + } + } + &-item-block { + height: 40px; + line-height: 40px; + } + } +} diff --git a/client/src/landing/home/less/antMotionStyle.less b/client/src/landing/home/less/antMotionStyle.less new file mode 100644 index 000000000..f254f0346 --- /dev/null +++ b/client/src/landing/home/less/antMotionStyle.less @@ -0,0 +1,14 @@ +@import "./common.less"; +@import "./custom.less"; +@import "./content.less"; +@import "./LandingNavigator.less"; +@import "./banner0.less"; +@import "./content4.less"; +@import "./content0.less"; +@import "./content1.less"; +@import "./pricing2.less"; +@import "./pricing1.less"; +@import "./content3.less"; +@import "./content12.less"; +@import "./footer1.less"; +@import "./edit.less"; diff --git a/client/src/landing/home/less/banner0.less b/client/src/landing/home/less/banner0.less new file mode 100644 index 000000000..829bb9c4b --- /dev/null +++ b/client/src/landing/home/less/banner0.less @@ -0,0 +1,84 @@ +@banner0: banner0; +.@{banner0} { + // 如果在第一屏且导航位置为 relative, 一屏为 height: calc(~"100vh - 64px"); + width: 100%; + height: 100vh; + position: relative; + text-align: center; + border-color: #666; + background-image: url("https://zos.alipayobjects.com/rmsportal/gGlUMYGEIvjDOOw.jpg"); + background-size: cover; + background-attachment: fixed; + background-position: center; + & &-text-wrapper { + display: inline-block; + position: absolute; + top: 20%; + margin: auto; + left: 0; + right: 0; + font-size: 14px; + color: @template-text-color-light; + width: 550px; + >.queue-anim-leaving { + position: relative !important; + } + } + & &-title { + width: 350px; + left: 30px; + min-height: 60px; + margin: auto; + display: inline-block; + font-size: 40px; + position: relative; + } + & &-content { + margin-bottom: 20px; + word-wrap: break-word; + min-height: 24px; + } + & &-button { + border: 1px solid #fff; + color: #fff; + background: transparent; + box-shadow: 0 0 0 transparent; + font-size: 16px; + height: 40px; + transition: background .45s @ease-out, box-shadow .45s @ease-out; + &:hover { + color: #fff; + border-color: #fff; + background: rgba(255, 255, 255, 0.1); + box-shadow: 0 0 10px rgba(50, 250, 255, 0.75); + } + &:focus { + color: #fff; + border-color: #fff; + } + &.queue-anim-leaving { + width: auto; + } + } + & &-icon { + bottom: 20px; + font-size: 24px; + position: absolute; + left: 50%; + margin-left: -12px; + color: @template-text-color-light; + } +} + +@media screen and (max-width: 767px) { + .@{banner0} { + background-attachment: inherit; + & &-text-wrapper { + width: 90%; + } + & &-title { + width: 90%; + left: 0; + } + } +} diff --git a/client/src/landing/home/less/common.less b/client/src/landing/home/less/common.less new file mode 100644 index 000000000..a0ca2a04c --- /dev/null +++ b/client/src/landing/home/less/common.less @@ -0,0 +1,42 @@ + +// @import "~antd/lib/style/v2-compatible-reset.less"; + +body { + word-wrap: break-word; +} + +body, +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; +} + +/* .content-wrapper > .tween-one-leaving, +.queue-anim-leaving { + // position: absolute !important; + // width: 100%; +} */ + +.video { + max-width: 800px; +} + +#react-content { + min-height: 100%; +} +.home-page-wrapper p { + padding: 0; + margin: 0; +} diff --git a/client/src/landing/home/less/content.less b/client/src/landing/home/less/content.less new file mode 100644 index 000000000..c5ebf367c --- /dev/null +++ b/client/src/landing/home/less/content.less @@ -0,0 +1,44 @@ +@homepage: home-page; +.@{homepage}-wrapper { + width: 100%; + position: relative; + overflow: hidden; + .@{homepage} { + height: 100%; + max-width: 1200px; + position: relative; + margin: auto; + will-change: transform; + } + .title-wrapper > h1, > h1 { + font-size: 32px; + color: @text-color; + margin-bottom: 16px; + } + .title-wrapper { + margin: 0 auto 64px; + text-align: center; + } +} + +.@{homepage} { + padding: 128px 24px; +} + +@media screen and (max-width: 767px) { + .@{homepage}-wrapper { + .@{homepage} { + padding: 56px 24px; + >h1 { + font-size: 24px; + margin: 0 auto 32px; + &.title-h1 { + margin-bottom: 8px; + } + } + >p { + margin-bottom: 32px; + } + } + } +} diff --git a/client/src/landing/home/less/content0.less b/client/src/landing/home/less/content0.less new file mode 100644 index 000000000..0a97b2ef5 --- /dev/null +++ b/client/src/landing/home/less/content0.less @@ -0,0 +1,55 @@ +@content0: content0; + +.@{content0}-wrapper { + min-height: 446px; + overflow: hidden; + + .@{content0} { + height: 100%; + padding: 64px 24px; + + >.title-wrapper { + margin: 0 auto 48px; + } + + &-block { + padding: 0 4%; + display: inline-block; + text-align: center; + min-height: 200px; + margin-bottom: 24px; + img { + width: 100%; + } + + &-wrapper { + position: relative; + height: 100%; + top: 25%; + padding: 20px 0; + } + + &.queue-anim-leaving { + position: relative !important; + } + + &-icon { + width: 100px; + height: 100px; + margin: auto; + } + + &-title { + line-height: 32px; + margin: 10px auto; + font-size: 24px; + } + } + } +} + +@media screen and (max-width: 767px) { + .@{content0}-wrapper { + min-height: 880px; + } +} diff --git a/client/src/landing/home/less/content1.less b/client/src/landing/home/less/content1.less new file mode 100644 index 000000000..4d03ff366 --- /dev/null +++ b/client/src/landing/home/less/content1.less @@ -0,0 +1,76 @@ +@content1: content1; +.@{content1}-wrapper { + height: 360px; + .@{content1} { + height: 100%; + padding: 0 24px; + &-img { + height: 100%; + transform-origin: top; + padding: 0 32px; + display: flex; + align-items: center; + justify-content: center; + span { + display: block; + width: 250px; + img { + display: block; + } + } + } + &-text { + padding: 0 32px; + height: 100%; + .@{content1}-content, + .@{content1}-title { + position: relative !important; + } + .@{content1}-title { + font-size: 32px; + font-weight: normal; + color: #404040; + margin-top: 120px; + } + .content { + margin-top: 20px; + } + } + } +} + +@media screen and (max-width: 767px) { + .@{content1}-wrapper { + height: 600px; + .@{content1} { + &-img { + height: 200px; + padding: 0; + text-align: center; + margin-top: 64px; + span { + display: inline-block; + width: 180px; + height: 200px; + line-height: 200px; + margin: auto; + } + } + &-text { + height: auto; + margin-bottom: 20px; + text-align: center; + padding: 0; + .@{content1}-content, + .@{content1}-title { + width: 100%; + top: auto; + } + .@{content1}-title { + margin: 32px auto 16px; + font-size: 24px; + } + } + } + } +} diff --git a/client/src/landing/home/less/content12.less b/client/src/landing/home/less/content12.less new file mode 100644 index 000000000..4d4f05f53 --- /dev/null +++ b/client/src/landing/home/less/content12.less @@ -0,0 +1,52 @@ +@content12: content12; +.@{content12}-wrapper { + background-color: #fafafa; + min-height: 470px; + .@{content12} { + padding: 64px 24px; + >p { + text-align: center; + } + } + .img-wrapper { + margin: 0 auto; + left: 0; + right: 0; + .block { + margin-bottom: 40px; + .block-content { + display: flex; + border-radius: 4px; + text-align: center; + position: relative; + overflow: hidden; + border: none; + height: 64px; + align-items: center; + transition: box-shadow .3s @ease-out, transform .3s @ease-out; + & > span { + width: 100%; + display: block; + } + } + } + } +} + +@media screen and (max-width: 767px) { + .@{content12}-wrapper { + overflow: hidden; + .@{content12} { + ul { + li { + display: block; + width: 100%; + padding: 2%; + span { + height: 168px; + } + } + } + } + } +} diff --git a/client/src/landing/home/less/content3.less b/client/src/landing/home/less/content3.less new file mode 100644 index 000000000..24ee0e4f7 --- /dev/null +++ b/client/src/landing/home/less/content3.less @@ -0,0 +1,52 @@ +@content3: content3; +.@{content3}-wrapper { + min-height: 764px; + .@{content3} { + height: 100%; + overflow: hidden; + & .title-content { + text-align: center; + } + &-block-wrapper { + position: relative; + .@{content3}-block { + display: inline-block; + padding: 48px 24px; + vertical-align: top; + .@{content3}-icon { + display: inline-block; + width: 15%; + vertical-align: top; + } + .@{content3}-text { + width: 85%; + display: inline-block; + padding-left: 8%; + } + &.clear-both { + clear: both; + } + } + } + } +} + +@media screen and (max-width: 767px) { + .@{content3}-wrapper { + min-height: 1080px; + .@{content3} { + &-block-wrapper { + margin: 20px auto; + height: auto; + .@{content3}-block { + .@{content3}-title { + font-size: 20px; + } + &.queue-anim-leaving { + position: relative !important; + } + } + } + } + } +} diff --git a/client/src/landing/home/less/content4.less b/client/src/landing/home/less/content4.less new file mode 100644 index 000000000..c700bfb2a --- /dev/null +++ b/client/src/landing/home/less/content4.less @@ -0,0 +1,37 @@ +@content4: content4; +.@{content4}-wrapper { + min-height: 720px; + background: #fafafa; + .@{content4} { + height: 100%; + overflow: hidden; + &-video { + border-radius: 4px; + overflow: hidden; + max-width: 800px; + margin: auto; + background: #fff; + box-shadow: 0 4px 8px rgba(0, 0, 0, .15); + video { + display: block; + margin: auto; + } + } + } +} + +@media screen and (max-width: 767px) { + .@{content4}-wrapper { + min-height: 350px; + .@{content4} { + overflow: hidden; + width: 90%; + margin: auto; + &-video { + top: 15%; + background: url("https://zos.alipayobjects.com/rmsportal/HZgzhugQZkqUwBVeNyfz.jpg") no-repeat center; + background-size: cover; + } + } + } +} diff --git a/client/src/landing/home/less/custom.less b/client/src/landing/home/less/custom.less new file mode 100644 index 000000000..710e47c9d --- /dev/null +++ b/client/src/landing/home/less/custom.less @@ -0,0 +1,35 @@ +@import "~antd/lib/style/themes/default.less"; + +@line-color: #e9e9e9; + +@shadow-color: rgba(0, 0, 0, 0.15); + +@bottom-bar-bg-color: #262626; +@bottom-bar-line-color: #000; + +@template-bg-color: #001529; +@template-bg-color-light: #ececec; +@template-nav-bg-color: #001529; +@template-text-color: #ccc; +@template-text-title-color: #bcbcbc; +@template-text-color-light: #fff; +@template-footer-text-color: #999; + +@animate-duration: .45s; + +/* 详细页图片或框框的样式; +*/ +.page-shadow() { + box-shadow: 0 5px 8px @shadow-color; +} + +.page-pro() { + border-radius: 6px; + border: 1px solid @line-color; + transform: translateY(0); + transition: transform .3s @ease-out, box-shadow .3s @ease-out; + &:hover { + .page-shadow(); + transform: translateY(-5px); + } +} diff --git a/client/src/landing/home/less/edit.less b/client/src/landing/home/less/edit.less new file mode 100644 index 000000000..e69de29bb diff --git a/client/src/landing/home/less/footer1.less b/client/src/landing/home/less/footer1.less new file mode 100644 index 000000000..8d8579b8a --- /dev/null +++ b/client/src/landing/home/less/footer1.less @@ -0,0 +1,98 @@ +.footer1-wrapper { + background: @template-bg-color; + overflow: hidden; + position: relative; + min-height: 360px; + color: @template-footer-text-color; + .footer1 { + .home-page { + padding: 64px 24px 80px; + } + } + .block { + padding: 0 32px; + .logo { + max-width: 180px; + } + .slogan { + font-size: 12px; + margin-top: -20px; + } + >h2 { + margin-bottom: 24px; + color: @template-text-color; + } + a { + color: @template-footer-text-color; + margin-bottom: 12px; + float: left; + clear: both; + &:hover { + color: @primary-color; + } + } + } + .copyright-wrapper { + width: 100%; + border-top: 1px solid fade(@line-color, 10); + .home-page { + padding: 0 24px; + overflow: hidden; + } + .copyright { + height: 80px; + text-align: center; + line-height: 80px; + } + } +} + +@media screen and (max-width: 767px) { + .footer1 { + min-height: 550px; + &-wrapper { + .footer1 { + .home-page { + padding: 64px 24px 32px; + } + } + } + .logo { + margin: 0 auto 24px; + } + .block { + text-align: center; + margin-bottom: 32px; + padding: 0; + } + >ul { + width: 90%; + margin: 20px auto 0; + padding: 10px 0; + >li { + width: 100%; + h2 { + margin-bottom: 10px; + } + li { + display: inline-block; + margin-right: 10px; + } + } + } + .copyright { + &-wrapper { + .home-page { + padding: 0; + .copyright { + font-size: 12px; + } + } + } + + span { + width: 90%; + } + } + } +} diff --git a/client/src/landing/home/less/pricing1.less b/client/src/landing/home/less/pricing1.less new file mode 100644 index 000000000..ef736351f --- /dev/null +++ b/client/src/landing/home/less/pricing1.less @@ -0,0 +1,85 @@ +@pricing1: pricing1; +.@{pricing1}-wrapper { + min-height: 760px; + .@{pricing1} { + >p { + text-align: center; + } + &-content-wrapper { + min-height: 400px; + } + &-block-box { + width: 260px; + border-radius: 4px; + background: #eef0f3; + text-align: center; + color: #666; + min-height: 400px; + margin: auto; + border: 1px solid transparent; + .page-pro(); + &.active { + border-color: @primary-color; + background: #fff; + .@{pricing1} { + &-top-wrapper { + background: @primary-color; + } + &-name, + &-money, + &-button { + color: #fff; + } + &-button { + background: @primary-color; + } + } + } + } + &-block { + margin-bottom: 24px; + } + &-top-wrapper { + width: 100%; + padding: 16px 24px; + } + &-name { + font-size: 14px; + } + &-money { + font-family: 'Helvetica Neue', sans-serif; + font-size: 32px; + color: #666; + } + &-content { + font-size: 12px; + line-height: 2; + font-weight: 300; + margin: 32px 24px 48px; + } + &-line { + display: block; + height: 1px; + background: #d9d9d9; + margin: 0 24px; + } + &-button-wrapper { + margin: 18px 24px; + } + &-button { + padding: 0 24px; + } + } + &.home-page-wrapper { + .@{pricing1}-title-wrapper { + margin-bottom: 64px; + text-align: center; + } + } +} + +@media screen and (max-width: 767px) { + .@{pricing1}-wrapper { + padding-bottom: 0; + } +} diff --git a/client/src/landing/home/less/pricing2.less b/client/src/landing/home/less/pricing2.less new file mode 100644 index 000000000..69b193ef7 --- /dev/null +++ b/client/src/landing/home/less/pricing2.less @@ -0,0 +1,59 @@ +@pricing2: pricing2; + +.@{pricing2}-wrapper { + min-height: 760px; + + .@{pricing2} { + >p { + text-align: center; + } + + &-content-wrapper { + min-height: 400px; + } + + &-table-name-block { + text-align: center; + color: #666; + width: 100%; + } + + &-table-name { + font-size: 24px; + } + + &-table-money { + font-size: 16px; + margin: 8px 0 16px; + } + + &-table-content { + text-align: center; + color: #666; + + &-name { + color: #666; + text-align: center; + } + } + } + + &.home-page-wrapper { + .@{pricing2}-title-wrapper { + margin-bottom: 64px; + text-align: center; + } + } +} + +@media screen and (max-width: 767px) { + .@{pricing2} { + &-wrapper { + padding-bottom: 0; + } + + &-table { + margin-bottom: 24px; + } + } +} diff --git a/client/src/landing/home/utils.js b/client/src/landing/home/utils.js new file mode 100644 index 000000000..57cf9cb18 --- /dev/null +++ b/client/src/landing/home/utils.js @@ -0,0 +1,18 @@ + +import React from 'react'; +import { Button } from 'antd'; + +export const isImg = /^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?/; +export const getChildrenToRender = (item, i) => { + let tag = item.name.indexOf('title') === 0 ? 'h1' : 'div'; + tag = item.href ? 'a' : tag; + let children = typeof item.children === 'string' && item.children.match(isImg) + ? React.createElement('img', { src: item.children, alt: 'img' }) + : item.children; + if (item.name.indexOf('button') === 0 && typeof item.children === 'object') { + children = React.createElement(Button, { + ...item.children + }); + } + return React.createElement(tag, { key: i.toString(), ...item }, children); +}; diff --git a/client/src/pages/landing/landing.page.jsx b/client/src/pages/landing/landing.page.jsx index 03085daf5..4f98800fd 100644 --- a/client/src/pages/landing/landing.page.jsx +++ b/client/src/pages/landing/landing.page.jsx @@ -3,6 +3,7 @@ import { connect } from "react-redux"; import { Redirect } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { selectCurrentUser } from "../../redux/user/user.selectors"; +import LandingPageStatic from "../../landing/home/index"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, @@ -13,5 +14,6 @@ export default connect(mapStateToProps, null)(LandingPage); export function LandingPage({ currentUser }) { if (currentUser.authorized) return ; - return ; + return ; + //return ; } diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 3b6e66bf4..ce6095b2b 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -1423,6 +1423,13 @@ "voided": "Job voided successfully." } }, + "landing": { + "labels": { + "features": "Features", + "managemyshop": "Manage my Shop", + "pricing": "Pricing" + } + }, "menus": { "currentuser": { "languageselector": "Language", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index c22819cda..3b3b79188 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -1423,6 +1423,13 @@ "voided": "" } }, + "landing": { + "labels": { + "features": "", + "managemyshop": "", + "pricing": "" + } + }, "menus": { "currentuser": { "languageselector": "idioma", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 6021200d5..44b471439 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -1423,6 +1423,13 @@ "voided": "" } }, + "landing": { + "labels": { + "features": "", + "managemyshop": "", + "pricing": "" + } + }, "menus": { "currentuser": { "languageselector": "La langue", diff --git a/client/yarn.lock b/client/yarn.lock index 86d239f03..544b8042a 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -3472,7 +3472,7 @@ babel-preset-react-app@^10.0.0: babel-plugin-macros "2.8.0" babel-plugin-transform-react-remove-prop-types "0.4.24" -babel-runtime@^6.26.0: +babel-runtime@6.x, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -4892,6 +4892,13 @@ deep-diff@^0.3.5: resolved "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz" integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ= +deep-eql@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + deep-equal@^1.0.1: version "1.1.1" resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" @@ -5313,6 +5320,18 @@ enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" +enquire-js@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/enquire-js/-/enquire-js-0.2.1.tgz#f2478cf5808d42f54e8231f20fa133493e7f0fcb" + integrity sha512-4vbcWD0ncK6VQ5M5giOImQb2hFPrKDZH5U+uRX9S6e9vfC6Q5PX6A38PVS6RMnCdr/luDTtJjjLuJinH/+a+Lw== + dependencies: + enquire.js "^2.1.6" + +enquire.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/enquire.js/-/enquire.js-2.1.6.tgz#3e8780c9b8b835084c3f60e166dbc3c2a3c89814" + integrity sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ= + enquirer@^2.3.5: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" @@ -10179,7 +10198,7 @@ prompts@2.4.0, prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -10335,7 +10354,7 @@ raf-schd@^4.0.2: resolved "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz" integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== -raf@^3.4.0, raf@^3.4.1: +raf@3.x, raf@^3.4.0, raf@^3.4.1, raf@~3.4.0: version "3.4.1" resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== @@ -10552,6 +10571,16 @@ rc-progress@~3.1.0: "@babel/runtime" "^7.10.1" classnames "^2.2.6" +rc-queue-anim@^1.8.5: + version "1.8.5" + resolved "https://registry.yarnpkg.com/rc-queue-anim/-/rc-queue-anim-1.8.5.tgz#01ef3872bdfa0b70bb915ef9a637fc404244a589" + integrity sha512-vTbZXBu7L3NcXUPjkFN7R80BE+1VYL1QBI10EioYYqZMk6A0iVbjoVAgfoK/Z4gIIxp399gJ8LqbMnQA1AhcXA== + dependencies: + babel-runtime "6.x" + prop-types "^15.6.0" + rc-tween-one "^2.5.0" + react-lifecycles-compat "^3.0.4" + rc-rate@~2.9.0: version "2.9.1" resolved "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.1.tgz" @@ -10571,6 +10600,18 @@ rc-resize-observer@^1.0.0: rc-util "^5.0.0" resize-observer-polyfill "^1.5.1" +rc-scroll-anim@^2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/rc-scroll-anim/-/rc-scroll-anim-2.7.6.tgz#f7e6622f2930ca3e1e258f7275bc2e1c26ce791c" + integrity sha512-VwXJYXjZy9TtH1wcQIG7/yjt/Ay3VEjQl/TITaWzK9O7ujjOXRVOYY/tqKshmBMgaJ2oGeFQNmCN8zTwXguq0g== + dependencies: + babel-runtime "6.x" + prop-types "^15.6.0" + raf "3.x" + rc-tween-one "^2.4.0" + react-lifecycles-compat "^3.0.4" + tween-functions "1.x" + rc-select@^12.0.0, rc-select@~12.1.6: version "12.1.10" resolved "https://registry.npmjs.org/rc-select/-/rc-select-12.1.10.tgz" @@ -10687,6 +10728,30 @@ rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.1: rc-motion "^2.0.0" rc-util "^5.5.0" +rc-tween-one@^1.2.5: + version "1.8.1" + resolved "https://registry.yarnpkg.com/rc-tween-one/-/rc-tween-one-1.8.1.tgz#5b3b464b9bf2c369efc16c816cccf57bc16ae253" + integrity sha512-Avg8EXHdt6ABV9WnmTmh6zEaAzUvl4bFZKbP3y6BE8UGBGp1qUhlIgCB83gL+5eA0VECdM/b9PsEBRrcxzSpGw== + dependencies: + babel-runtime "6.x" + deep-eql "~3.0.1" + prop-types "^15.6.1" + raf "~3.4.0" + style-utils "~0.1.13" + tween-functions "~1.2.0" + +rc-tween-one@^2.4.0, rc-tween-one@^2.5.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/rc-tween-one/-/rc-tween-one-2.7.3.tgz#c9d3c44743e25c654d65c22ec3934afd79923fae" + integrity sha512-n4OPRLO6VMZHj61unq5KKxHMMfBz52bxob94fN3U5M9GqFg3H+T3TXnpHPnAK+cq/xBGo70ik2vB4Fpjo/txcA== + dependencies: + babel-runtime "6.x" + prop-types "^15.6.1" + raf "~3.4.0" + react-lifecycles-compat "^3.0.4" + style-utils "~0.2.0" + tween-functions "~1.2.0" + rc-upload@~4.3.0: version "4.3.1" resolved "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.1.tgz" @@ -11064,6 +11129,14 @@ react-smooth@^2.0.0: raf "^3.4.0" react-transition-group "2.9.0" +react-sublime-video@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/react-sublime-video/-/react-sublime-video-0.2.5.tgz#c967b8e9a374b36d6a5d1b63b93fa6ec02e54842" + integrity sha1-yWe46aN0s21qXRtjuT+m7ALlSEI= + dependencies: + prop-types "^15.5.10" + rc-tween-one "^1.2.5" + react-transition-group@2, react-transition-group@2.9.0: version "2.9.0" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" @@ -12441,6 +12514,16 @@ style-loader@1.3.0: loader-utils "^2.0.0" schema-utils "^2.7.0" +style-utils@~0.1.13: + version "0.1.24" + resolved "https://registry.yarnpkg.com/style-utils/-/style-utils-0.1.24.tgz#fc0675d79a0b201bf86fc5d5a1dd202f838de544" + integrity sha512-MVZSKubpU/vIfpmOsi8/0ckWxb0WmGBmyNoEDGWZM9cM8n8sCL6DJftl3lEf8Uy5zKQ9+O1XdJxscWTDosCQpQ== + +style-utils@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/style-utils/-/style-utils-0.2.1.tgz#c78fe6696214f4ab12701959f09553e9d81dd45b" + integrity sha512-eKRIfWnUSdBqe2ko+qisUwBSlfWpHru89geRqzmScpDhkPW1ksmE04d//nDcXeF+TVK5cnBG90mMmHgxyxXleQ== + styled-components@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.0.tgz" @@ -12848,6 +12931,11 @@ tty-browserify@0.0.0: resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= +tween-functions@1.x, tween-functions@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tween-functions/-/tween-functions-1.2.0.tgz#1ae3a50e7c60bb3def774eac707acbca73bbc3ff" + integrity sha1-GuOlDnxguz3vd06scHrLynO7w/8= + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -12862,7 +12950,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8: +type-detect@4.0.8, type-detect@^4.0.0: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==