├── .eslintrc ├── .gitignore ├── README.md ├── deploy.js ├── index.html ├── index.js ├── package.json ├── src └── Home │ ├── Banner.jsx │ ├── BannerImage.jsx │ ├── Footer.jsx │ ├── Header.jsx │ ├── Page1.jsx │ ├── Page2.jsx │ ├── Page3.jsx │ ├── Page4.jsx │ ├── Page5.jsx │ ├── data.js │ ├── index.jsx │ └── static │ ├── custom.less │ ├── default.less │ ├── footer.less │ ├── header.less │ ├── home.less │ ├── responsive.less │ └── style.js └── webpack.config.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "eslint-config-airbnb", 3 | "parser": "babel-eslint", 4 | "rules": { 5 | "import/no-unresolved": 0, 6 | "react/jsx-no-target-blank": 0, 7 | "jsx-a11y/anchor-is-valid": 0, 8 | "react/jsx-no-comment-textnodes": 0, 9 | "react/require-default-props": 0 10 | } 11 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### ant v 2 | 3 | ant v 里的 landing page. 4 | 5 | 脚手架使用的是: [antd-init](https://github.com/ant-design/antd-init); 6 | 7 | ## preview 8 | 9 | https://antv.alipay.com/zh-cn/index.html 10 | 11 | https://ant-motion.github.io/ant-v-landing-page/ 12 | 13 | 14 | ## install 15 | ``` 16 | $ npm i 17 | ``` 18 | 19 | ## Development 20 | 21 | ``` 22 | $ npm start 23 | ``` -------------------------------------------------------------------------------- /deploy.js: -------------------------------------------------------------------------------- 1 | var ghPages = require('gh-pages'); 2 | var path = require('path'); 3 | ghPages.publish(path.join(process.cwd(), 'dist'), { 4 | depth: 1, 5 | logger: function (message) { 6 | console.log(message); 7 | } 8 | }, function (err) { 9 | if (err) { 10 | throw err; 11 | } 12 | console.log('Site has been published.'); 13 | }); -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Demo 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import Home from './src/Home'; 4 | 5 | function App() { 6 | return ( 7 | 8 | ); 9 | } 10 | 11 | ReactDOM.render(, document.getElementById('root')); 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "entry": { 4 | "index": "./index.js" 5 | }, 6 | "dependencies": { 7 | "antd": "^3.0.0", 8 | "enquire-js": "^0.1.0", 9 | "prop-types": "^15.6.0", 10 | "rc-queue-anim": "^1.4.0", 11 | "rc-scroll-anim": "^2.1.0", 12 | "rc-tween-one": "^1.5.5", 13 | "react": "^16.1.1", 14 | "react-document-title": "^2.0.3", 15 | "react-dom": "^16.1.1", 16 | "react-github-button": "^0.1.11" 17 | }, 18 | "devDependencies": { 19 | "atool-build": "^1.0.2", 20 | "atool-test-mocha": "^0.1.7", 21 | "babel-eslint": "^8.0.2", 22 | "babel-plugin-import": "^1.6.2", 23 | "babel-plugin-transform-runtime": "^6.23.0", 24 | "babel-runtime": "^6.26.0", 25 | "dora": "^0.4.5", 26 | "dora-plugin-webpack": "^1.0.0", 27 | "eslint": "^4.11.0", 28 | "eslint-config-airbnb": "^16.1.0", 29 | "eslint-plugin-import": "^2.8.0", 30 | "eslint-plugin-jsx-a11y": "^6.0.2", 31 | "eslint-plugin-react": "^7.5.1", 32 | "expect": "^21.2.1", 33 | "gh-pages": "^1.1.0", 34 | "pre-commit": "^1.2.2", 35 | "redbox-react": "^1.5.0" 36 | }, 37 | "pre-commit": [ 38 | "lint" 39 | ], 40 | "scripts": { 41 | "build": "atool-build && cp index.html dist", 42 | "lint": "eslint --ext .js,.jsx src/", 43 | "eslint-fix": "eslint --fix src/ --ext .js,.jsx", 44 | "start": "dora --plugins webpack", 45 | "test": "atool-test-mocha ./**/__tests__/*-test.js", 46 | "deploy": "rm -rf dist && npm run build && node ./deploy.js" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/Home/Banner.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import QueueAnim from 'rc-queue-anim'; 4 | import { Button } from 'antd'; 5 | import { Element } from 'rc-scroll-anim'; 6 | import BannerImage from './BannerImage'; 7 | import { assets } from './data'; 8 | 9 | class Banner extends React.PureComponent { 10 | static propTypes = { 11 | className: PropTypes.string, 12 | isMobile: PropTypes.bool, 13 | navToShadow: PropTypes.func, 14 | } 15 | static defaultProps = { 16 | className: 'banner', 17 | } 18 | render() { 19 | const { className, isMobile, navToShadow } = this.props; 20 | return ( 21 | 22 |
23 |
24 | {isMobile ? 25 | 26 | : 27 | } 28 |
29 | 34 |

让数据栩栩如生

35 |

36 | AntV 是蚂蚁金服全新一代数据可视化解决方案,致力于提供一套简单方便、专业可靠、无限可能的数据可视化最佳实践。 37 |

38 | 39 | 42 | 43 |
44 |
45 |
46 | ); 47 | } 48 | } 49 | 50 | export default Banner; 51 | -------------------------------------------------------------------------------- /src/Home/BannerImage.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import TweenOne from 'rc-tween-one'; 3 | import SvgDrawPlugin from 'rc-tween-one/lib/plugin/SvgDrawPlugin'; 4 | 5 | TweenOne.plugins.push(SvgDrawPlugin); 6 | 7 | let delay = 0; 8 | function setAddDelay() { 9 | delay += 100; 10 | return delay; 11 | } 12 | 13 | const duration = 400; 14 | 15 | const animate = { 16 | scale: { 17 | scale: 0, 18 | opacity: 0, 19 | type: 'from', 20 | ease: 'easeOutQuad', 21 | duration, 22 | }, 23 | alpha: { 24 | opacity: 0, 25 | type: 'from', 26 | ease: 'easeOutQuad', 27 | duration, 28 | }, 29 | y: { 30 | y: -30, 31 | opacity: 0, 32 | type: 'from', 33 | ease: 'easeOutQuad', 34 | duration, 35 | }, 36 | yBig: { 37 | y: -120, 38 | opacity: 0, 39 | type: 'from', 40 | ease: 'easeOutQuad', 41 | duration, 42 | }, 43 | draw: { 44 | style: { SVGDraw: 0 }, 45 | type: 'from', 46 | ease: 'easeOutQuad', 47 | }, 48 | loop: { 49 | yoyo: true, 50 | repeat: -1, 51 | duration: 2500, 52 | }, 53 | }; 54 | 55 | export default function BannerImage() { 56 | return ( 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | ); 377 | } 378 | -------------------------------------------------------------------------------- /src/Home/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Row, Col } from 'antd'; 3 | 4 | function Footer() { 5 | return ( 6 | 124 | ); 125 | } 126 | 127 | 128 | export default Footer; 129 | -------------------------------------------------------------------------------- /src/Home/Header.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Button } from 'antd'; 3 | 4 | export default function Header(props) { 5 | return ( 6 |
7 | 8 | 9 | AntV 10 | 11 |
12 | 13 |
14 |
15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /src/Home/Page1.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import QueueAnim from 'rc-queue-anim'; 3 | import { Row, Col } from 'antd'; 4 | import { page1 } from './data'; 5 | 6 | export default function Page1() { 7 | const children = page1.map((card, i) => ( 8 | 9 | 10 |

{card.title}

11 | 12 |
13 | {card.title} 14 | {card.description} 15 |
16 |
17 | 18 | )); 19 | 20 | return ( 21 |
22 | 28 | {children} 29 | 30 |
); 31 | } 32 | -------------------------------------------------------------------------------- /src/Home/Page2.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import QueueAnim from 'rc-queue-anim'; 3 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; 4 | 5 | export default function Page2() { 6 | return ( 7 | 8 | 14 |

AntV 可视化解决方案

15 | 16 | 17 |

已全面全新升级,主要包含 G2、G6、F2 以及一套完整的图表使用和设计规范。

18 |

得益于丰富的业务场景和用户需求挑战,AntV 经历多年积累与不断打磨,已支撑整个阿里集团内外 2000+ 业务系统,通过了百万级 UV 产品的严苛考验后方敢与君见。

19 |
20 |
21 |
); 22 | } 23 | -------------------------------------------------------------------------------- /src/Home/Page3.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import QueueAnim from 'rc-queue-anim'; 3 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; 4 | import { Row, Col } from 'antd'; 5 | import { page3 } from './data'; 6 | 7 | export default function Page3() { 8 | const children = page3.map((card, i) => ( 9 | 14 | 15 |
{card.title}
16 |
{card.description}
17 | 18 | )); 19 | return ( 20 | 21 | 28 | {children} 29 | 30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /src/Home/Page4.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { Carousel } from 'antd'; 4 | import QueueAnim from 'rc-queue-anim'; 5 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; 6 | import { page4, assets } from './data'; 7 | 8 | export default function Page4(props) { 9 | const children = page4.map((item, i) => ( 10 | 11 | 12 |
13 | {!props.isMobile && } 14 | {item.comment} 15 |
16 |

{item.name}

17 |

{item.profile}

18 |
19 | )); 20 | return ( 21 | 22 | 28 |
29 | 30 | {children} 31 | 32 |
33 |
34 |
35 | ); 36 | } 37 | 38 | Page4.propTypes = { 39 | isMobile: PropTypes.bool, 40 | }; 41 | -------------------------------------------------------------------------------- /src/Home/Page5.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import QueueAnim from 'rc-queue-anim'; 3 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack'; 4 | import { Row, Col } from 'antd'; 5 | import { page5 } from './data'; 6 | 7 | export default function Page5() { 8 | const children = page5.map((img, i) => ( 9 | 18 | 19 | 20 | )); 21 | return ( 22 | 23 | 29 |

2000+用户正在使用

30 | 31 | 35 | {children} 36 | 37 |
38 |
39 | ); 40 | } 41 | -------------------------------------------------------------------------------- /src/Home/data.js: -------------------------------------------------------------------------------- 1 | export const assets = 'https://gw.alipayobjects.com/os/s/prod/antv/assets'; 2 | const base = 'https://antv.alipay.com/'; 3 | export const page1 = [ 4 | { 5 | img: `${assets}/image/icon/g2-c94ef.svg`, 6 | href: `${base}zh-cn/g2/3.x/index.html`, 7 | title: 'G2', 8 | description: ' 是以数据为驱动,具有高度的易用性和扩展性的可视化图形语法。', 9 | }, 10 | { 11 | img: `${assets}/image/icon/g6-b4554.svg`, 12 | title: 'G6', 13 | href: `${base}zh-cn/g6/1.x/index.html`, 14 | description: ' 是一套便捷、动态和富有交互的流程图和关系分析的图表库。', 15 | }, 16 | { 17 | img: `${assets}/image/icon/f2-d360c.svg`, 18 | title: 'F2', 19 | href: `${base}zh-cn/f2/3.x/index.html`, 20 | description: ' 是一套精简、高性能、易扩展的的移动端图表库。', 21 | }, 22 | ]; 23 | 24 | export const page3 = [ 25 | { 26 | img: `${assets}/image/home/features-simple-9617c.svg`, 27 | title: '简单方便', 28 | description: '从数据出发,仅需几行代码就可以轻松获得想要的图表展示效果。', 29 | }, 30 | { 31 | img: `${assets}/image/home/features-professional-1c6d1.svg`, 32 | title: '专业可靠', 33 | description: '大量产品实践之上,提供绘图引擎,完备图形语法以及专业设计规范。', 34 | }, 35 | { 36 | img: `${assets}/image/home/features-powerful-243e3.svg`, 37 | title: '无限可能', 38 | description: '任何图表,都可以基于图形语法灵活绘制,满足你无限的创意。', 39 | }, 40 | ]; 41 | 42 | export const page4 = [ 43 | { 44 | name: '陈为', 45 | profile: '浙江大学计算机学院 CAD & CG 国家重点实验室教授 可视化专家', 46 | avatar: 'https://os.alipayobjects.com/rmsportal/CcFeLxXurbQmwrT.jpg', 47 | comment: '在多年可视化设计与开发的积累基础上,蚂蚁金服团队推出了 AntV 产品,这是工业界在基础可视化语法与实践方面发出的最强声音,也是工业界与学术界一道推进可视化研发进展的最佳利器。', 48 | }, 49 | { 50 | name: '林峰', 51 | profile: '爱烹饪的数据可视化攻城狮', 52 | avatar: 'https://zos.alipayobjects.com/rmsportal/wtkIALmYDSmOIiAalkdv.jpg', 53 | comment: 'G2 是面粉,ECharts 是面条,皆微小但美好,因小食材怀大梦想,助力共筹东方巨龙崛起之盛宴,迎四海饕客。', 54 | }, 55 | ]; 56 | 57 | export const page5 = [ 58 | `${assets}/image/home/aliyun-f111c.png`, 59 | `${assets}/image/home/alipay-fceea.png`, 60 | `${assets}/image/home/tmall-cb94f.png`, 61 | `${assets}/image/home/taobao-ade5b.png`, 62 | `${assets}/image/home/mybank-da103.png`, 63 | `${assets}/image/home/jd-23e52.png`, 64 | `${assets}/image/home/yunos-2edef.png`, 65 | `${assets}/image/home/cainiao-40fc8.png`, 66 | ]; 67 | -------------------------------------------------------------------------------- /src/Home/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import DocumentTitle from 'react-document-title'; 3 | import { enquireScreen } from 'enquire-js'; 4 | import Header from './Header'; 5 | import Banner from './Banner'; 6 | import Page1 from './Page1'; 7 | import Page2 from './Page2'; 8 | import Page3 from './Page3'; 9 | import Page4 from './Page4'; 10 | import Page5 from './Page5'; 11 | import Footer from './Footer'; 12 | import './static/style'; 13 | 14 | 15 | let isMobile = false; 16 | enquireScreen((b) => { 17 | isMobile = b; 18 | }); 19 | 20 | 21 | class Home extends React.PureComponent { 22 | state = { 23 | isMobile, 24 | showShadow: false, 25 | }; 26 | 27 | componentDidMount() { 28 | enquireScreen((b) => { 29 | this.setState({ 30 | isMobile: !!b, 31 | }); 32 | }); 33 | } 34 | navToShadow = (e) => { 35 | this.setState({ showShadow: e.mode === 'leave' }); 36 | } 37 | render() { 38 | return ( 39 | [ 40 |
, 41 | , 42 | , 43 | , 44 | , 45 | , 46 | , 47 |