new skynet webpage integration

This commit is contained in:
Karol Wypchlo 2020-02-12 12:23:10 -05:00
parent 648a601ff4
commit 2a3f22c692
140 changed files with 20800 additions and 9413 deletions

View File

@ -1,11 +1,11 @@
{
"private": true,
"scripts": {
"client-dev": "yarn workspace siaviewnode-client dev -p 3000",
"server-dev": "yarn workspace siaviewnode-server dev",
"client-prod": "yarn workspace siaviewnode-client build && yarn workspace siaviewnode-client start -p 3000",
"server-prod": "yarn workspace siaviewnode-server build && yarn workspace siaviewnode-server start",
"dev": "concurrently \"yarn client-dev\" \"yarn server-dev\"",
"start:client": "yarn workspace sia-skynet start",
"start:server": "yarn workspace siaviewnode-server dev",
"build:client": "yarn workspace sia-skynet build",
"build:server": "yarn workspace siaviewnode-server build && yarn workspace siaviewnode-server start",
"dev": "concurrently \"yarn start:client\" \"yarn start:server\"",
"start": "NODE_ENV=production concurrently \"yarn client-prod\" \"yarn server-prod\""
},
"workspaces": {
@ -13,9 +13,6 @@
"packages/*"
]
},
"devDependencies": {
"lerna": "3.16.5"
},
"dependencies": {
"concurrently": "5.0.0"
}

View File

@ -0,0 +1,68 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Available Scripts
In the project directory, you can run:
### `yarn start`
Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
The page will reload if you make edits.<br />
You will also see any lint errors in the console.
### `yarn test`
Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
### `yarn build`
Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
### `yarn eject`
**Note: this is a one-way operation. Once you `eject`, you cant go back!**
If you arent satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point youre on your own.
You dont have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldnt feel obligated to use this feature. However we understand that this tool wouldnt be useful if you couldnt customize it when you are ready for it.
## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
To learn React, check out the [React documentation](https://reactjs.org/).
### Code Splitting
This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
### Analyzing the Bundle Size
This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
### Making a Progressive Web App
This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
### Advanced Configuration
This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
### Deployment
This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
### `yarn build` fails to minify
This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify

View File

@ -0,0 +1 @@
sia.staffonly.com

View File

@ -0,0 +1,22 @@
{
"files": {
"main.css": "/static/css/main.4771139d.chunk.css",
"main.js": "/static/js/main.73ef0a5e.chunk.js",
"main.js.map": "/static/js/main.73ef0a5e.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.8a6fc825.js",
"runtime-main.js.map": "/static/js/runtime-main.8a6fc825.js.map",
"static/js/2.0802306f.chunk.js": "/static/js/2.0802306f.chunk.js",
"static/js/2.0802306f.chunk.js.map": "/static/js/2.0802306f.chunk.js.map",
"index.html": "/index.html",
"precache-manifest.b9abe5362b3facc86d000a4ca8fff95f.js": "/precache-manifest.b9abe5362b3facc86d000a4ca8fff95f.js",
"service-worker.js": "/service-worker.js",
"static/css/main.4771139d.chunk.css.map": "/static/css/main.4771139d.chunk.css.map",
"static/js/2.0802306f.chunk.js.LICENSE.txt": "/static/js/2.0802306f.chunk.js.LICENSE.txt"
},
"entrypoints": [
"static/js/runtime-main.8a6fc825.js",
"static/js/2.0802306f.chunk.js",
"static/css/main.4771139d.chunk.css",
"static/js/main.73ef0a5e.chunk.js"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,13 @@
<svg width="263px" height="258px" viewBox="0 0 263 258" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Homepage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g transform="translate(-983.000000, -4278.000000)" id="Group-3">
<g transform="translate(1114.599987, 4407.025517) rotate(10.000000) translate(-1114.599987, -4407.025517) translate(994.099987, 4276.525517)">
<g id="Group-15" transform="translate(0.889504, 0.405409)">
<polygon id="Path-6" fill="#343734" points="120 130 2.27373675e-13 199.666667 2.27373675e-13 200 120 260 240 200 240 199.666667"></polygon>
<path d="M120,0 L0,66.6666667 L0,200 L120,260 L240,200 L240,66.6666667 L120,0 Z M240,66.6666667 L120,130 L0,66.6666667 M240,200 L120,130 L0,200" id="Path-9-Copy" stroke="#343734" stroke-width="2" stroke-linejoin="round"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1014 B

View File

@ -0,0 +1,29 @@
<svg width="24px" height="22px" viewBox="0 0 24 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<polyline id="path-1" points="0 36 3 39 8 34"></polyline>
<filter x="-167.7%" y="-268.3%" width="435.4%" height="628.3%" filterUnits="objectBoundingBox" id="filter-2">
<feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
<feOffset dx="0" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
<feMorphology radius="1" operator="erode" in="SourceAlpha" result="shadowInner"></feMorphology>
<feOffset dx="0" dy="0" in="shadowInner" result="shadowInner"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="shadowInner" operator="out" result="shadowOffsetOuter1"></feComposite>
<feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0.341176471 0 0 0 0 0.709803922 0 0 0 0 0.376470588 0 0 0 0.3 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="Homepage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linejoin="round">
<g id="State---Multiple" transform="translate(-319.000000, -358.000000)">
<g id="Group" transform="translate(271.000000, 80.000000)">
<g id="Group-4" transform="translate(16.000000, 240.000000)">
<g id="Group-5" transform="translate(40.000000, 12.000000)">
<g id="Rectangle-2">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
<use stroke="#57B560" stroke-width="2" xlink:href="#path-1"></use>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<svg viewBox="0 0 622 151" width="622" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><filter x="-1.7%" y="-1.7%" width="103.4%" height="103.4%" filterUnits="objectBoundingBox" id="a"><feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"/><feOffset in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feMorphology radius="1" in="SourceAlpha" result="shadowInner"/><feOffset in="shadowInner" result="shadowInner"/><feComposite in="shadowOffsetOuter1" in2="shadowInner" operator="out" result="shadowOffsetOuter1"/><feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"/><feColorMatrix values="0 0 0 0 0.341176471 0 0 0 0 0.709803922 0 0 0 0 0.376470588 0 0 0 0.3 0" in="shadowBlurOuter1"/></filter><path d="M384 768c212.077 0 384-171.923 384-384S596.077 0 384 0 0 171.923 0 384s171.923 384 384 384zm192-51.446c-91.832 53.02-252.238-52.89-358.277-236.554C111.684 296.336 100.168 104.466 192 51.446" id="b"/></defs><g fill="none" fill-rule="evenodd"><g stroke-linejoin="round" transform="translate(-73 -626)"><use fill="#000" filter="url(#a)" xlink:href="#b"/><use stroke="#57B560" stroke-width="2" xlink:href="#b"/></g><path d="M119.706-574.998l-.78.524C27.13-521.461 38.642-329.612 144.64-145.968 250.637 37.676 410.982 143.572 502.779 90.559l.218-.052C446.488 123.254 380.859 142 310.853 142 98.857 142-73-29.904-73-241.957c0-142.44 77.542-266.765 192.706-333.04z" fill="#57B560"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><link href="/static/css/main.4771139d.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function t(t){for(var n,i,l=t[0],a=t[1],f=t[2],c=0,s=[];c<l.length;c++)i=l[c],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(p&&p(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,l=1;l<r.length;l++){var a=r[l];0!==o[a]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/";var l=this["webpackJsonpsia-skynet"]=this["webpackJsonpsia-skynet"]||[],a=l.push.bind(l);l.push=t,l=l.slice();for(var f=0;f<l.length;f++)t(l[f]);var p=a;r()}([])</script><script src="/static/js/2.0802306f.chunk.js"></script><script src="/static/js/main.73ef0a5e.chunk.js"></script></body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

View File

@ -0,0 +1,26 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "ef03f3930b10c7310ff770db93919ecf",
"url": "/index.html"
},
{
"revision": "5f28351a343fe3ad0858",
"url": "/static/css/main.4771139d.chunk.css"
},
{
"revision": "903ce792802629eb2783",
"url": "/static/js/2.0802306f.chunk.js"
},
{
"revision": "bfc08a62983de46a4daec9f8c3c657d8",
"url": "/static/js/2.0802306f.chunk.js.LICENSE.txt"
},
{
"revision": "5f28351a343fe3ad0858",
"url": "/static/js/main.73ef0a5e.chunk.js"
},
{
"revision": "6d8a63896b260d6d8ed9",
"url": "/static/js/runtime-main.8a6fc825.js"
}
]);

View File

@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

View File

@ -0,0 +1,39 @@
/**
* Welcome to your Workbox-powered service worker!
*
* You'll need to register this file in your web app and you should
* disable HTTP caching for this file too.
* See https://goo.gl/nhQhGp
*
* The rest of the code is auto-generated. Please don't update this file
* directly; instead, make changes to your Workbox build configuration
* and re-run your build process.
* See https://goo.gl/2aRDsh
*/
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
"/precache-manifest.b9abe5362b3facc86d000a4ca8fff95f.js"
);
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
workbox.core.clientsClaim();
/**
* The workboxSW.precacheAndRoute() method efficiently caches and responds to
* requests for URLs in the manifest.
* See https://goo.gl/S9QRab
*/
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("/index.html"), {
blacklist: [/^\/_/,/\/[^/?]+\.[^/]+$/],
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,38 @@
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/*!
Copyright (c) 2017 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/** @license React v0.18.0
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.12.0
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.12.0
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
!function(e){function t(t){for(var n,i,l=t[0],a=t[1],f=t[2],c=0,s=[];c<l.length;c++)i=l[c],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(p&&p(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,l=1;l<r.length;l++){var a=r[l];0!==o[a]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/";var l=this["webpackJsonpsia-skynet"]=this["webpackJsonpsia-skynet"]||[],a=l.push.bind(l);l.push=t,l=l.slice();for(var f=0;f<l.length;f++)t(l[f]);var p=a;r()}([]);
//# sourceMappingURL=runtime-main.8a6fc825.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,49 @@
{
"name": "sia-skynet",
"version": "0.1.0",
"private": true,
"homepage": "https://sia.staffonly.com",
"dependencies": {
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"classnames": "^2.2.6",
"gh-pages": "^2.2.0",
"jsonp": "^0.2.1",
"node-sass": "^4.13.1",
"prop-types": "^15.7.2",
"react": "^16.12.0",
"react-countup": "^4.3.3",
"react-dom": "^16.12.0",
"react-dropzone": "^10.2.1",
"react-mailchimp-form": "^1.0.2",
"react-mailchimp-subscribe": "^2.1.0",
"react-reveal": "^1.2.2",
"react-scripts": "3.3.1",
"react-syntax-highlighter": "^12.2.1",
"react-visibility-sensor": "^5.1.1"
},
"scripts": {
"predeploy": "npm run build",
"deploy": "gh-pages -d build",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}

View File

@ -0,0 +1 @@
sia.staffonly.com

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,13 @@
<svg width="263px" height="258px" viewBox="0 0 263 258" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Homepage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g transform="translate(-983.000000, -4278.000000)" id="Group-3">
<g transform="translate(1114.599987, 4407.025517) rotate(10.000000) translate(-1114.599987, -4407.025517) translate(994.099987, 4276.525517)">
<g id="Group-15" transform="translate(0.889504, 0.405409)">
<polygon id="Path-6" fill="#343734" points="120 130 2.27373675e-13 199.666667 2.27373675e-13 200 120 260 240 200 240 199.666667"></polygon>
<path d="M120,0 L0,66.6666667 L0,200 L120,260 L240,200 L240,66.6666667 L120,0 Z M240,66.6666667 L120,130 L0,66.6666667 M240,200 L120,130 L0,200" id="Path-9-Copy" stroke="#343734" stroke-width="2" stroke-linejoin="round"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1014 B

View File

@ -0,0 +1,29 @@
<svg width="24px" height="22px" viewBox="0 0 24 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<polyline id="path-1" points="0 36 3 39 8 34"></polyline>
<filter x="-167.7%" y="-268.3%" width="435.4%" height="628.3%" filterUnits="objectBoundingBox" id="filter-2">
<feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
<feOffset dx="0" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
<feMorphology radius="1" operator="erode" in="SourceAlpha" result="shadowInner"></feMorphology>
<feOffset dx="0" dy="0" in="shadowInner" result="shadowInner"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="shadowInner" operator="out" result="shadowOffsetOuter1"></feComposite>
<feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0.341176471 0 0 0 0 0.709803922 0 0 0 0 0.376470588 0 0 0 0.3 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="Homepage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linejoin="round">
<g id="State---Multiple" transform="translate(-319.000000, -358.000000)">
<g id="Group" transform="translate(271.000000, 80.000000)">
<g id="Group-4" transform="translate(16.000000, 240.000000)">
<g id="Group-5" transform="translate(40.000000, 12.000000)">
<g id="Rectangle-2">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
<use stroke="#57B560" stroke-width="2" xlink:href="#path-1"></use>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<svg viewBox="0 0 622 151" width="622" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><filter x="-1.7%" y="-1.7%" width="103.4%" height="103.4%" filterUnits="objectBoundingBox" id="a"><feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"/><feOffset in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feMorphology radius="1" in="SourceAlpha" result="shadowInner"/><feOffset in="shadowInner" result="shadowInner"/><feComposite in="shadowOffsetOuter1" in2="shadowInner" operator="out" result="shadowOffsetOuter1"/><feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"/><feColorMatrix values="0 0 0 0 0.341176471 0 0 0 0 0.709803922 0 0 0 0 0.376470588 0 0 0 0.3 0" in="shadowBlurOuter1"/></filter><path d="M384 768c212.077 0 384-171.923 384-384S596.077 0 384 0 0 171.923 0 384s171.923 384 384 384zm192-51.446c-91.832 53.02-252.238-52.89-358.277-236.554C111.684 296.336 100.168 104.466 192 51.446" id="b"/></defs><g fill="none" fill-rule="evenodd"><g stroke-linejoin="round" transform="translate(-73 -626)"><use fill="#000" filter="url(#a)" xlink:href="#b"/><use stroke="#57B560" stroke-width="2" xlink:href="#b"/></g><path d="M119.706-574.998l-.78.524C27.13-521.461 38.642-329.612 144.64-145.968 250.637 37.676 410.982 143.572 502.779 90.559l.218-.052C446.488 123.254 380.859 142 310.853 142 98.857 142-73-29.904-73-241.957c0-142.44 77.542-266.765 192.706-333.04z" fill="#57B560"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

View File

@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

BIN
packages/sia-skynet/src/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,30 @@
import React from 'react'
import './App.scss'
import { HomeTop, HomeUpload, HomeBuilt, HomeSamples, HomeStay, HomeNetwork, Footer } from '../'
function App() {
return (
<div className="app">
<img className="top-swoosh" src="/images/top-swoosh.svg" alt="top swoosh" />
<div className="width">
<HomeTop />
<HomeUpload />
<HomeBuilt />
<HomeSamples />
</div>
<div className="home-white">
<div className="width">
<HomeStay />
<HomeNetwork />
</div>
</div>
<Footer />
</div>
)
}
export default App

View File

@ -0,0 +1,30 @@
@import '../../variables.scss';
.app {
position: relative;
overflow-x: hidden;
max-width: 100%;
}
.top-swoosh {
position: absolute;
left: 50%;
top: 0;
transform: translateX(-50%);
margin-left: 340px;
width: 622px;
max-width: none;
@media (min-width: $largebp) {
margin-left: 380px;
}
}
.home-white {
background: $white;
padding: 80px 0;
@media (min-width: $largebp) {
padding: 120px 0;
}
}

View File

@ -0,0 +1,28 @@
import React from 'react'
import classNames from 'classnames'
import './Button.scss'
export default function Button({ href, type, children, full, className, ...rest }) {
const classes = classNames('button', { full }, className)
if (href) {
return (
<a href={href} className={classes} {...rest}>
{children}
</a>
)
} else if (type) {
return (
<button type={type} className={classes} {...rest}>
{children}
</button>
)
} else {
return (
<button type="button" className={classes} {...rest}>
{children}
</button>
)
}
}

View File

@ -0,0 +1,22 @@
@import '../../variables.scss';
.button {
display: inline-block;
background: $green;
color: $white;
border-radius: 4px;
box-shadow: 0 0 16px 0 rgba(87, 181, 96, 0.1);
line-height: 48px;
font-weight: bold;
padding: 0 32px;
transition: 0.2s background-color, 0.2s color, 0.2s transform;
@media (min-width: $largebp) {
font-size: 18px;
}
&:hover {
background-color: $greenHover;
transform: translateY(-2px);
}
}

View File

@ -0,0 +1,7 @@
import React from 'react'
import './CircleIcon.scss'
export default function CircleIcon({ children }) {
return <div className="circle-icon">{children}</div>
}

View File

@ -0,0 +1,10 @@
.circle-icon {
width: 64px;
height: 64px;
border-radius: 32px;
box-shadow: 0 0 8px 0 rgba(23, 25, 23, 0.2);
border: solid 2px currentColor;
display: flex;
align-items: center;
justify-content: center;
}

View File

@ -0,0 +1,37 @@
export const python = `from siaskynet import Skynet
path = "./image.jpg"
skylink = Skynet.UploadFile(path)
print("Upload successful, skylink: " + skylink)`
export const curl = `curl -X POST "https://siasky.net/api/skyfile" -F file=@image.jpg`
export const node = `const skynet = require('@nebulous/skynet');
(async () => {
const path = "./image.jpg"
const skylink = await skynet.UploadFile(
path,
skynet.DefaultUploadOptions
)
console.log(\`Upload successful, skylink: \${skylink}\`)
})()`
export const go = `package main
import (
"fmt"
skynet "github.com/NebulousLabs/go-skynet"
)
func main() {
skylink, err := skynet.UploadFile("./image.jpg", skynet.DefaultUploadOptions)
if err != nil {
fmt.Printf("Unable to upload: %v\n", err.Error())
return
}
fmt.Printf("Upload successful, skylink: %v\n", skylink)
}`
export const ruby = ``
export const php = ``

View File

@ -0,0 +1,56 @@
import React, { useState } from 'react'
import SyntaxHighlighter from 'react-syntax-highlighter'
import classNames from 'classnames'
import './CodeExamples.scss'
import Colors from './Colors'
import { python, curl, node, go } from './Code'
export default function CodeExamples() {
const [active, setActive] = useState(1)
return (
<div className="code-examples">
<ul className="code-examples-tabs">
<li onClick={() => setActive(1)} className={classNames({ active: active === 1 })}>
Python
</li>
<li onClick={() => setActive(2)} className={classNames({ active: active === 2 })}>
CURL
</li>
<li onClick={() => setActive(3)} className={classNames({ active: active === 3 })}>
Node.js
</li>
<li onClick={() => setActive(4)} className={classNames({ active: active === 4 })}>
Go
</li>
</ul>
<div className="code-examples-body">
{active === 1 && (
<SyntaxHighlighter wrapLines showLineNumbers={true} language="python" style={Colors}>
{python}
</SyntaxHighlighter>
)}
{active === 2 && (
<SyntaxHighlighter wrapLines showLineNumbers={true} language="curl" style={Colors}>
{curl}
</SyntaxHighlighter>
)}
{active === 3 && (
<SyntaxHighlighter wrapLines showLineNumbers={true} language="node" style={Colors}>
{node}
</SyntaxHighlighter>
)}
{active === 4 && (
<SyntaxHighlighter wrapLines showLineNumbers={true} language="go" style={Colors}>
{go}
</SyntaxHighlighter>
)}
</div>
</div>
)
}

View File

@ -0,0 +1,64 @@
@import '../../variables.scss';
.code-examples-tabs {
border-top-left-radius: 12px;
border-top-right-radius: 12px;
display: flex;
align-items: flex-end;
height: 65px;
li {
display: block;
flex: 1;
color: $white60;
line-height: 57px;
padding: 0 16px;
cursor: pointer;
user-select: none;
background-color: #343734;
transition: 0.2s line-height, 0.2s background-color, 0.2s color;
text-align: center;
@media (min-width: $largebp) {
padding: 0 32px;
font-size: 18px;
}
}
li:hover,
li.active {
color: $white;
background-color: #171917;
line-height: 65px;
}
li:first-child {
border-top-left-radius: 12px;
}
li:last-child {
border-top-right-radius: 12px;
}
li.filler,
li.filler:hover {
flex: 1;
height: 57px;
border-top-right-radius: 12px;
background-color: #343734;
cursor: default;
}
}
.code-examples-body {
padding: 24px;
background-color: #171917;
border-bottom-left-radius: 12px;
border-bottom-right-radius: 12px;
font-size: 14px;
}
.react-syntax-highlighter-line-number {
color: $white50;
margin-right: 16px;
}

View File

@ -0,0 +1,108 @@
export default {
hljs: {
display: 'block',
overflowX: 'auto',
padding: '0.5em',
background: '#171917',
color: '#e6e1dc',
},
'hljs-comment': {
color: '#bc9458',
fontStyle: 'italic',
},
'hljs-quote': {
color: '#bc9458',
fontStyle: 'italic',
},
'hljs-keyword': {
color: '#c26230',
},
'hljs-selector-tag': {
color: '#c26230',
},
'hljs-string': {
color: '#a5c261',
},
'hljs-number': {
color: '#a5c261',
},
'hljs-regexp': {
color: '#a5c261',
},
'hljs-variable': {
color: '#a5c261',
},
'hljs-template-variable': {
color: '#a5c261',
},
'hljs-subst': {
color: '#519f50',
},
'hljs-tag': {
color: '#e8bf6a',
},
'hljs-name': {
color: '#e8bf6a',
},
'hljs-type': {
color: '#da4939',
},
'hljs-symbol': {
color: '#6d9cbe',
},
'hljs-bullet': {
color: '#6d9cbe',
},
'hljs-built_in': {
color: '#6d9cbe',
},
'hljs-builtin-name': {
color: '#6d9cbe',
},
'hljs-attr': {
color: '#6d9cbe',
},
'hljs-link': {
color: '#6d9cbe',
textDecoration: 'underline',
},
'hljs-params': {
color: '#d0d0ff',
},
'hljs-attribute': {
color: '#cda869',
},
'hljs-meta': {
color: '#9b859d',
},
'hljs-title': {
color: '#ffc66d',
},
'hljs-section': {
color: '#ffc66d',
},
'hljs-addition': {
backgroundColor: '#144212',
color: '#e6e1dc',
display: 'inline-block',
width: '100%',
},
'hljs-deletion': {
backgroundColor: '#600',
color: '#e6e1dc',
display: 'inline-block',
width: '100%',
},
'hljs-selector-class': {
color: '#9b703f',
},
'hljs-selector-id': {
color: '#8b98ab',
},
'hljs-emphasis': {
fontStyle: 'italic',
},
'hljs-strong': {
fontWeight: 'bold',
},
}

View File

@ -0,0 +1,15 @@
import React from 'react'
import './FAQ.scss'
export default function FAQ({ title, children }) {
return (
<div className="faq">
<div className="faq-dash" />
<div className="faq-text">
<h3>{title}</h3>
{children}
</div>
</div>
)
}

View File

@ -0,0 +1,41 @@
@import '../../variables.scss';
.faq {
display: flex;
margin-bottom: 30px;
}
.faq-text {
flex: 1;
margin-left: 16px;
h3 {
font-weight: 700;
color: $gray;
margin-bottom: 10px;
line-height: 1.78;
font-size: 16px;
@media (min-width: $largebp) {
font-size: 18px;
}
}
p {
color: $lightGray;
line-height: 1.7;
font-size: 13px;
@media (min-width: $largebp) {
font-size: 14px;
}
}
}
.faq-dash {
height: 2px;
width: 32px;
background: $green;
box-shadow: 0 0 8px 0 rgba(87, 181, 96, 0.3);
margin-top: 16px;
}

View File

@ -0,0 +1,92 @@
import React from 'react'
import Fade from 'react-reveal/Fade'
import Reveal from 'react-reveal/Reveal'
import { Arrow, FooterOrb, FooterCube, Built } from '../../svg'
import './Footer.scss'
import { Mailing } from '..'
export default function Footer() {
return (
<Reveal effect="active">
<footer className="footer">
<div className="width">
<Fade distance="40px" bottom>
<div className="footer-column">
<Built />
</div>
</Fade>
<div className="footer-column">
<Fade distance="40px" bottom>
<h2>Sia Elsewhere</h2>
<ul>
<li>
<a href="#">
Sia Jobs <Arrow />
</a>
</li>
<li>
<a href="https://skynet.luxor.tech">
Luxor Tech
<Arrow />
</a>
</li>
<li>
<a href="https://sialoop.net">
Sia Loop <Arrow />
</a>
</li>
<li>
<a href="https://skynet.tutemwesi.com">
Tutem Wesi <Arrow />
</a>
</li>
</ul>
</Fade>
</div>
<div className="footer-column">
<Fade distance="40px" bottom>
<h2>Social</h2>
<ul>
<li>
<a href="#">
Reddit
<Arrow />
</a>
</li>
<li>
<a href="#">
Twitter <Arrow />
</a>
</li>
<li>
<a href="#">
Discord <Arrow />
</a>
</li>
<li>
<a href="#">
Github <Arrow />
</a>
</li>
</ul>
</Fade>
</div>
<div className="footer-column">
<Fade distance="40px" bottom>
<h2>Stay up-to-date with Skynet updates</h2>
<Mailing id="check2" light />
</Fade>
</div>
</div>
<FooterCube className="footer-cube fadeInUp delay2" />
<FooterOrb className="footer-orb fadeInUp delay2" />
</footer>
</Reveal>
)
}

View File

@ -0,0 +1,100 @@
@import '../../variables.scss';
.footer {
background-color: #171917;
padding: 60px 0 100px;
overflow: hidden;
position: relative;
@media (min-width: $largebp) {
padding: 60px 0 140px;
}
.width {
@media (min-width: $largebp) {
display: flex;
justify-content: space-between;
}
}
.footer-column + .footer-column {
margin-top: 40px;
@media (min-width: $largebp) {
margin: 0 0 0 60px;
}
}
h2 {
font-size: 16px;
color: $white;
margin-bottom: 25px;
@media (min-width: $largebp) {
font-size: 18px;
}
}
li + li {
margin-top: 5px;
}
ul + h2 {
margin-top: 40px;
}
a {
color: $green;
display: inline-flex;
align-items: center;
transition: 0.2s color;
font-size: 13px;
@media (min-width: $largebp) {
font-size: 14px;
}
&:hover {
color: $white;
}
svg {
margin-left: 10px;
}
}
}
.footer-orb {
position: absolute;
right: 10px;
bottom: 100px;
margin-top: -13px;
margin-left: -13px;
animation: 8s floatLarge infinite;
@media (min-width: $largebp) {
margin-left: 180px;
right: auto;
left: 50%;
bottom: 90px;
}
}
.footer-cube {
position: absolute;
right: 30px;
top: 100%;
margin-top: -109px;
margin-left: -163px;
animation: 8s float infinite;
@media (min-width: $largebp) {
margin-left: -100px;
right: auto;
left: 50%;
}
}
.footer-built {
margin-top: 30px;
}

View File

@ -0,0 +1,39 @@
import React from 'react'
import Fade from 'react-reveal/Fade'
import './HomeBuilt.scss'
import { CircleIcon, CodeExamples } from '../'
import { Cylinder, SmallOrb } from '../../svg'
export default function HomeBuilt() {
return (
<div className="home-built">
<header className="home-built-header">
<Fade distance="40px" bottom>
<div className="home-built-divider">
<div className="small-divider" />
<div className="divider" />
<SmallOrb className="small-orb" />
<CircleIcon>
<Cylinder />
</CircleIcon>
<SmallOrb className="small-orb" />
<div className="divider" />
<div className="small-divider" />
</div>
</Fade>
<Fade distance="40px" bottom>
<h2>
Infrastructure built for
<br />
<strong>application developers</strong>
</h2>
</Fade>
</header>
<Fade distance="40px" bottom>
<CodeExamples />
</Fade>
</div>
)
}

View File

@ -0,0 +1,53 @@
@import '../../variables.scss';
.home-built {
padding-top: 80px;
@media (min-width: $largebp) {
padding-top: 150px;
}
}
.home-built-header {
text-align: center;
h2 {
text-align: center;
font-size: 32px;
margin-bottom: 50px;
@media (min-width: $largebp) {
margin-bottom: 70px;
}
}
}
.home-built-divider {
display: inline-flex;
align-items: center;
margin: 0 auto 32px;
@media (min-width: $largebp) {
margin-bottom: 40px;
}
.circle-icon {
margin: 0 14px;
}
.small-orb:first-of-type {
margin-left: 14px;
}
.small-orb:last-of-type {
margin-right: 14px;
}
.small-divider:first-of-type {
margin-right: 8px;
}
.small-divider:last-of-type {
margin-left: 8px;
}
}

View File

@ -0,0 +1,152 @@
import React, { Component } from 'react'
import CountUp from 'react-countup'
import VisibilitySensor from 'react-visibility-sensor'
import Fade from 'react-reveal/Fade'
import './HomeNetwork.scss'
import { CircleIcon, FAQ } from '../'
import { SmallOrb, LogoSolid, Arrow, Deco6, Deco7, Deco8 } from '../../svg'
const stats = [
{ name: 'TB Used', value: 664 },
{ name: 'TB Capacity', value: 2315 },
{ name: 'Hosts', value: 335 },
{ name: 'Storage/TB', value: 91, cent: true },
{ name: 'Bandwidth/TB', value: 18, cent: true },
]
export default class HomeNetwork extends Component {
state = {
visable: false,
}
onChange = isVisible => {
if (isVisible && !this.state.visable) {
this.setState({ visable: true })
}
}
render() {
return (
<div className="home-network">
<header className="home-network-header">
<Fade distance="40px" bottom>
<div className="home-network-divider">
<CircleIcon>
<LogoSolid />
</CircleIcon>
<SmallOrb />
<div className="divider"></div>
<div className="small-divider"></div>
</div>
</Fade>
<Fade distance="40px" bottom>
<h2>
Sia
<br />
<strong>Network</strong>
</h2>
</Fade>
</header>
<Fade distance="40px" bottom>
<VisibilitySensor onChange={this.onChange} partialVisibility offset={{ bottom: 100 }} scrollThrottle={50}>
<div className="home-network-stats">
{stats.map((stat, i) => (
<React.Fragment key={i}>
<div key={i} className="home-network-stat">
<div className="inner">
<h3>
{this.state.visable ? <CountUp end={stat.value} duration={3.2} /> : 0}
{stat.cent && '¢'}
</h3>
<span className="network-stat-name">{stat.name}</span>
</div>
</div>
{i !== 4 && <div className="divider" />}
</React.Fragment>
))}
<Deco6 className="deco-6" />
<Deco7 className="deco-7" />
<Deco8 className="deco-8" />
</div>
</VisibilitySensor>
</Fade>
<div className="home-network-columns">
<div className="home-network-column left">
<Fade distance="40px" bottom>
<p>
Skynet Webportal is a low cost server that sits between Skynet and everyday users, enabling them to
access Skynet content without needing to operate any special software. Once the Skylinks are generated,
they can be shared with anyone to fetch data from Skynet. The original uploader does not need to stay
online in order for the file to remain available. The Sia network handles all of the pinning,
guaranteeing both high speeds and excellent uptime. A typical Skynet download starts in under 500
milliseconds and can stream at rates as high as 1 gigabit per second. The Sia network serves as the
backend storage layer for Skynet.
</p>
</Fade>
<Fade distance="40px" bottom>
<p>
Sia is the leading decentralized cloud storage platform. No signups, no servers, no trusted third
parties. Sia leverages blockchain technology to create a data storage marketplace that is more robust
and more affordable than traditional cloud storage providers. Storage costs are as much as 10x lower
than traditional infrastructure, bandwidth costs as much as 100x lower, all without sacrificing
performance or reliability.
</p>
<p>
<a className="more" href="https://sia.tech/">
Learn more about Sia <Arrow />
</a>
</p>
</Fade>
</div>
<div className="home-network-column">
<Fade distance="40px" bottom>
<FAQ title="What does pinning mean?">
<p>
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer
took a galley of type and scrambled it to make.
</p>
</FAQ>
</Fade>
<Fade distance="40px" bottom>
<FAQ title="Is my data secure?">
<p>
Cras justo odio, dapibus ac facilisis in, egestas eget quam. Sed posuere consectetur est at lobortis.
</p>
</FAQ>
</Fade>
<Fade distance="40px" bottom>
<FAQ title="How does Sia compare to other decentralized storage solutions?">
<p>
Cras justo odio, dapibus ac facilisis in, egestas eget quam. Sed posuere consectetur est at lobortis.
</p>
</FAQ>
</Fade>
<Fade distance="40px" bottom>
<FAQ title="How long will my files be available?">
<p>
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer
took a galley of type and scrambled it to make a type specimen book.
</p>
</FAQ>
</Fade>
<Fade distance="40px" bottom>
<a className="more more-faq" href="https://support.sia.tech/">
View more faq
<Arrow />
</a>
</Fade>
</div>
</div>
</div>
)
}
}

View File

@ -0,0 +1,192 @@
@import '../../variables.scss';
.home-network {
padding: 80px 0;
@media (min-width: $largebp) {
padding: 120px 0;
}
}
.home-network-header {
h2 {
font-size: 32px;
margin-bottom: 36px;
}
}
.home-network-divider {
display: flex;
align-items: center;
color: $green;
margin-bottom: 32px;
@media (min-width: $largebp) {
margin-bottom: 40px;
}
.circle-icon {
box-shadow: 0 0 8px 0 rgba(87, 181, 96, 0.3);
margin-right: 14px;
}
.divider {
margin: 0 8px 0 14px;
}
}
.home-network-stats {
background: $green;
border-radius: 12px;
box-shadow: 0 4px 24px 0 rgba(87, 181, 96, 0.3);
padding: 32px 24px;
position: relative;
@media (min-width: $largebp) {
display: flex;
align-items: center;
padding: 40px 30px;
}
@media (min-width: $largebp) {
padding: 50px 20px;
}
.divider {
height: 2px;
width: 240px;
background: $black10;
margin: 20px auto;
@media (min-width: $largebp) {
height: 56px;
width: 2px;
}
}
}
.deco-6 {
position: absolute;
top: -185px;
right: 10px;
animation: 8s float infinite;
}
.deco-7 {
position: absolute;
top: -130px;
right: 35px;
animation: 6s float infinite;
}
.deco-8 {
position: absolute;
top: -65px;
right: -95px;
animation: 10s float infinite;
}
.home-network-stat {
text-align: center;
@media (min-width: $largebp) {
text-align: center;
width: calc(20% - 2px);
}
.inner {
@media (min-width: $largebp) {
margin: 0 auto;
display: inline-block;
text-align: left;
min-width: 110px;
}
}
h3 {
font-weight: 700;
color: $white;
font-size: 32px;
min-width: 10px;
@media (min-width: $largebp) {
font-size: 40px;
}
}
}
.network-stat-name {
font-size: 14px;
color: $white50;
}
.home-network-columns {
margin-top: 40px;
@media (min-width: $largebp) {
display: flex;
margin-top: 60px;
}
}
.home-network-column {
@media (min-width: $largebp) {
flex: 1;
display: flex;
flex-direction: column;
}
& + & {
margin-top: 40px;
@media (min-width: $largebp) {
margin: 0 0 0 30px;
}
}
&.left p {
color: $gray;
@media (min-width: $largebp) {
font-size: 18px;
}
}
&.left p + p {
margin-top: 30px;
@media (min-width: $largebp) {
margin-top: 40px;
}
}
.more {
color: $green;
font-size: 13px;
display: inline-flex;
align-items: center;
transition: 0.2s color;
&:hover {
color: $black;
}
@media (min-width: $largebp) {
font-size: 14px;
}
svg {
margin-left: 10px;
transition: 0.2s transform, 0.2s color;
}
&:hover svg {
transform: translateX(2px);
color: $black;
}
}
.more-faq {
margin-left: 48px;
}
}

View File

@ -0,0 +1,37 @@
import React from 'react'
import Fade from 'react-reveal/Fade'
import Reveal from 'react-reveal/Reveal'
import './HomeSamples.scss'
import { Sample } from '../'
const samples = [
{ type: 'HTML', url: '#' },
{ type: 'PDF', url: '#' },
{ type: 'Image', url: '#' },
{ type: 'Audio', url: '#' },
{ type: 'Video', url: '#' },
{ type: 'JSON', url: '#' },
{ type: 'Dapps', url: '#' },
]
export default function HomeSamples() {
return (
<div className="home-samples">
<Fade distance="40px" bottom>
<p>
Skynet has SDKs for popular programming languages which integrate seamlessly with existing applications. Above
are a few code snippets for uploading and downloading data from Skynet.
</p>
</Fade>
<Reveal effect="active">
<div className="home-samples-samples">
{samples.map((sample, i) => (
<Sample className={`fadeInUp delay${(i + 1) * 2}`} key={`${i}-${sample.url}`} {...sample} />
))}
</div>
</Reveal>
</div>
)
}

View File

@ -0,0 +1,36 @@
@import '../../variables.scss';
.home-samples {
text-align: center;
margin: 0;
padding: 60px 0;
@media (min-width: $largebp) {
padding: 65px 0 100px;
}
p {
margin: 0 auto 48px;
max-width: 460px;
@media (min-width: $largebp) {
font-size: 18px;
max-width: 560px;
}
}
.sample {
display: inline-block;
margin: 10px;
min-width: 124px;
text-align: center;
@media (min-width: $tinybp) {
margin: 10px 20px;
}
@media (min-width: $smallbp) {
margin: 10px 40px;
}
}
}

View File

@ -0,0 +1,93 @@
import React, { Component } from 'react'
import Fade from 'react-reveal/Fade'
import './HomeStay.scss'
import { SocialLink, CircleIcon, Mailing } from '../'
import { SmallOrb, Pyramid } from '../../svg'
export default class HomeStay extends Component {
render() {
return (
<div className="home-stay">
<header className="home-stay-header">
<Fade distance="40px" bottom>
<div className="home-stay-divider">
<CircleIcon>
<Pyramid />
</CircleIcon>
<SmallOrb />
<div className="divider" />
<div className="small-divider" />
</div>
</Fade>
<Fade distance="40px" bottom>
<h2>
Stay up to date with
<br />
<strong>Skynet updates</strong>
</h2>
</Fade>
</header>
<div className="home-stay-flex">
<div className="home-stay-left">
<Fade distance="40px" bottom>
<p>
Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras justo odio, dapibus ac
facilisis in.
</p>
</Fade>
<Fade distance="40px" bottom>
<Mailing id="check1" />
</Fade>
<Fade distance="40px" bottom>
<p className="disclaimer-text">
Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras justo odio, dapibus ac
facilisis in.
</p>
</Fade>
</div>
<ul className="home-stay-right">
<Fade distance="40px" bottom>
<li>
<SocialLink
icon="github"
url="https://github.com/NebulousLabs/skynet-webportal"
greenText="View project on Github"
title={
<>
NebulousLabs/<strong>Skynet-Webportal</strong>
</>
}
/>
</li>
</Fade>
<Fade distance="40px" bottom>
<li>
<SocialLink
icon="discord"
url="https://discord.gg/sia"
greenText="View project on Github"
title={<strong>/Sia</strong>}
/>
</li>
</Fade>
<Fade distance="40px" bottom>
<li>
<SocialLink
icon="twitter"
url="https://twitter.com/SiaTechHQ?s=20"
greenText="View project on Github"
title={<strong>@SiaTechHQ</strong>}
/>
</li>
</Fade>
</ul>
</div>
</div>
)
}
}

View File

@ -0,0 +1,73 @@
@import '../../variables.scss';
.home-stay-header {
h2 {
font-size: 32px;
margin-bottom: 36px;
}
}
.home-stay-divider {
display: flex;
align-items: center;
color: $green;
margin-bottom: 32px;
@media (min-width: $largebp) {
margin-bottom: 40px;
}
.circle-icon {
box-shadow: 0 0 8px 0 rgba(87, 181, 96, 0.3);
margin-right: 14px;
}
.divider {
margin: 0 8px 0 14px;
}
}
.home-stay-flex {
@media (min-width: $largebp) {
display: flex;
}
}
.home-stay-left {
@media (min-width: $largebp) {
flex: 1;
margin-right: 60px;
}
p {
max-width: 553px;
@media (min-width: $largebp) {
font-size: 18px;
}
}
.disclaimer-text {
font-size: 13px;
color: $lightGray;
line-height: 1.7;
max-width: 438px;
@media (min-width: $largebp) {
font-size: 14px;
}
}
}
.home-stay-right {
margin-top: 40px;
@media (min-width: $largebp) {
width: 305px;
margin-top: 0;
}
li + li {
margin-top: 24px;
}
}

View File

@ -0,0 +1,22 @@
import React from 'react'
import Reveal from 'react-reveal/Reveal'
import './HomeTop.scss'
import { Skynet, Deco1, Deco2 } from '../../svg'
export default function HomeTop() {
return (
<Reveal effect="active">
<div className="home-top">
<Skynet className="logo" />
<h1 className="fadeInUp delay2">Build the Future Web.</h1>
<p className="fadeInUp delay4">Skynet is a decentralized file sharing and content distribution protocol.</p>
<Deco1 className="deco-1 fadeInUp delay8" />
<Deco2 className="deco-2 fadeInUp delay8" />
</div>
</Reveal>
)
}

View File

@ -0,0 +1,69 @@
@import '../../variables.scss';
.home-top {
text-align: center;
padding: 60px 0 50px;
position: relative;
@media (min-width: $largebp) {
padding: 60px 0 70px;
}
.logo {
margin: 0 auto 35px;
transform: translateY(40px);
opacity: 0;
transition: 1s transform, 1s opacity;
}
&.active .logo {
transform: none;
opacity: 1;
}
h1 {
font-size: 44px;
line-height: 1.14;
margin-bottom: 38px;
@media (min-width: $largebp) {
font-size: 56px;
}
}
p {
font-size: 20px;
line-height: 1.33;
max-width: 560px;
margin: 0 auto;
@media (min-width: $largebp) {
font-size: 24px;
max-width: 670px;
}
}
}
.deco-1 {
position: absolute;
left: 100%;
bottom: 54%;
margin-left: -20px;
animation: 6s float infinite;
@media (min-width: 591px) {
margin-left: 100px;
}
}
.deco-2 {
position: absolute;
left: 100%;
bottom: 34%;
margin-left: -40px;
animation: 8s float infinite;
@media (min-width: 591px) {
margin-left: 50px;
}
}

View File

@ -0,0 +1,98 @@
import React, { Component } from 'react'
import classNames from 'classnames'
import Dropzone from 'react-dropzone'
import Reveal from 'react-reveal/Reveal'
import { Button, UploadFile } from '../'
import { Deco3, Deco4, Deco5 } from '../../svg'
import './HomeUpload.scss'
export default class HomeUpload extends Component {
state = { files: [] }
handleDrop = async acceptedFiles => {
this.setState({
files: [
...acceptedFiles.map(file => {
return { file, status: 'uploading' }
}),
...this.state.files,
],
})
acceptedFiles.forEach(async (file) => {
const url = `https://siasky.net/api/skyfile?filename=${file.name}`
const fd = new FormData()
fd.append("file", file)
const onComplete = (status, skylink) => {
this.setState((state) => {
const index = state.files.findIndex((f) => f.file === file);
return {
files: [
...state.files.slice(0, index),
{ ...state.files[index], status, url: `https://siasky.net/file/${skylink}` },
...state.files.slice(index + 1)
]
}
})
}
try {
const response = await fetch(url, {
method: "POST",
body: fd,
mode: "cors"
});
const { skylink } = await response.json();
onComplete('complete', skylink);
} catch(error) {
onComplete('error');
}
})
}
render() {
return (
<Reveal effect="active">
<div className="home-upload">
<div className="home-upload-box fadeInUp delay6">
<Dropzone onDrop={acceptedFiles => this.handleDrop(acceptedFiles)}>
{({ getRootProps, getInputProps, isDragActive }) => (
<>
<div
className={classNames('home-upload-dashed', { 'drop-active': isDragActive })}
{...getRootProps()}
>
<span className="home-upload-text">Drag &amp; drop your file(s) here to pin</span>
<Button>Browse</Button>
</div>
<input {...getInputProps()} className="offscreen" />
</>
)}
</Dropzone>
{this.state.files.length > 0 && (
<div className="home-uploaded-files">
{this.state.files.map((file, i) => {
return <UploadFile key={i} {...file} />
})}
</div>
)}
</div>
<p className="bottom-text fadeInUp delay8">
Once a file has been uploaded, a 46 byte link called a 'Skylink' is generated. That link can then be shared
with anyone to fetch the file from Skynet.
</p>
<Deco3 className="deco-3 fadeInUp delay8" />
<Deco4 className="deco-4 fadeInUp delay8" />
<Deco5 className="deco-5 fadeInUp delay8" />
</div>
</Reveal>
)
}
}

View File

@ -0,0 +1,107 @@
@import '../../variables.scss';
.home-upload {
position: relative;
.bottom-text {
color: $lightGray;
font-size: 13px;
text-align: center;
max-width: 670px;
margin: 25px auto 0;
@media (min-width: $largebp) {
font-size: 14px;
}
}
}
.home-upload-box {
background: $white;
border-radius: 12px;
box-shadow: 0 8px 24px 0 rgba(90, 94, 91, 0.15), 0 2px 4px 0 rgba(0, 0, 0, 0.05);
padding: 16px;
}
.home-upload-dashed {
border: 1px dashed #c5cec7;
border-radius: 4px;
padding: 0 20px;
height: 210px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
outline: none;
transition: 0.2s background-color, 0.2s border, 0.2s color;
&:hover {
background-color: rgba(0, 0, 0, 0.03);
cursor: pointer;
}
&:hover .button {
background-color: $greenHover;
transform: translateY(-2px);
}
&.drop-active {
background-color: $green;
border: 1px solid $green;
.button {
display: none;
}
}
.button {
margin-top: 15px;
}
}
.home-upload-text {
color: $gray;
display: block;
transition: 0.2s color;
@media (min-width: $largebp) {
font-size: 18px;
}
.drop-active & {
color: $white;
}
}
.deco-3 {
position: absolute;
top: -70px;
left: -5px;
animation: 8s float infinite;
}
.deco-4 {
position: absolute;
top: -32px;
left: -90px;
animation: 6s float infinite;
}
.deco-5 {
position: absolute;
top: 52px;
left: -56px;
animation: 10s float infinite;
}
.home-uploaded-files {
border: solid 1px #c5cec7;
padding: 0 40px;
margin-top: 10px;
border-radius: 4px;
.upload-file + .upload-file {
border-top: 1px solid rgba(197, 206, 199, 0.4);
}
}

View File

@ -0,0 +1,12 @@
import React from 'react'
import './LoadingSpinner.scss'
import { Loading } from '../../svg'
export default function LoadingSpinner() {
return (
<div className="loading-spinner">
<Loading />
</div>
)
}

View File

@ -0,0 +1,19 @@
@import '../../variables.scss';
@-webkit-keyframes spin {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes spin {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
.loading-spinner {
-webkit-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}

View File

@ -0,0 +1,54 @@
import React, { Component } from 'react'
import MailchimpSubscribe from 'react-mailchimp-subscribe'
import classNames from 'classnames'
import './Mailing.scss'
const url = 'https://tech.us11.list-manage.com/subscribe/post?u=5df238d9e852f9801b5f2c92e&amp;id=ab6bea4cc2'
const CustomForm = ({ status, message, onValidated, light, id }) => {
let email, user
const submit = () => {
if ((email, user, email.value.indexOf('@') > -1)) {
onValidated({
EMAIL: email.value,
USER: user.checked ? 'Yes' : 'No',
})
}
}
return (
<form className={classNames('home-stay-form', { light })} onSubmit={e => e.preventDefault()}>
<input ref={node => (email = node)} type="email" placeholder="Email Address" validate />
<div className="home-form-stay-existing">
<input ref={node => (user = node)} type="checkbox" id={id} />
<label htmlFor={id}>I have previous experience using Sia</label>
</div>
<button className="button" onClick={submit}>
Get Updates
</button>
{status === 'sending' && <p className="message">sending...</p>}
{status === 'error' && <p className="message red-text" dangerouslySetInnerHTML={{ __html: message }} />}
{status === 'success' && <p className="message" dangerouslySetInnerHTML={{ __html: message }} />}
</form>
)
}
export default function Mailing({ light, id }) {
return (
<MailchimpSubscribe
url={url}
render={({ subscribe, status, message }) => (
<CustomForm
id={id}
status={status}
message={message}
light={light}
onValidated={formData => subscribe(formData)}
/>
)}
/>
)
}

View File

@ -0,0 +1,109 @@
@import '../../variables.scss';
.home-stay-form {
max-width: 342px;
margin: 36px 0 24px;
.relative {
position: relative;
}
.message {
font-size: 12px;
margin-top: 10px;
color: $lightGray;
&.red-text {
color: $red;
}
}
input[type='email'] {
border-radius: 4px;
box-shadow: 0 2px 4px 0 rgba(90, 94, 91, 0.1);
border: solid 1px #cbd3cd;
padding: 12px 0 12px 16px;
transition: 0.2s border-color;
&:hover {
border-color: rgb(143, 143, 143);
}
&:focus {
border-color: $green;
}
}
input[type='checkbox'] {
width: 20px;
height: 20px;
border-radius: 3px;
border: 1px solid #cbd3cd;
margin-right: 8px;
display: inline-block;
vertical-align: middle;
margin: -2px 8px 0 0;
background-image: url('/images/green-check.svg');
background-repeat: no-repeat;
background-size: 28px;
background-position: top -300px center;
&:checked {
background-position: top -3px center;
}
}
button {
font-weight: 400;
@media (min-width: $largebp) {
font-size: 16px;
}
}
.email-error {
font-size: 12px;
margin-top: 8px;
color: $red;
}
}
.home-stay-form.light {
input[type='email'] {
box-shadow: 0 2px 4px 0 rgba(90, 94, 91, 0.1);
border-color: $white50;
color: $white;
&:hover {
border-color: $white;
}
&:focus {
border-color: $green;
}
}
input[type='checkbox'] {
border-color: $white50;
}
label {
color: $white50;
}
.message {
color: $white30;
&.red-text {
color: $red;
}
}
}
.home-form-stay-existing {
margin: 15px 0 20px 0;
label {
color: $darkGray;
}
}

View File

@ -0,0 +1,19 @@
import React from 'react'
import classNames from 'classnames'
import './Sample.scss'
import { Download } from '../../svg'
export default function Sample({ type, url, className }) {
return (
<div className={classNames('sample', className)}>
<a download href={url}>
<Download />
<span className="sample-name">
<strong>{type}</strong> Sample
</span>
<span className="sample-download">Download</span>
</a>
</div>
)
}

View File

@ -0,0 +1,48 @@
@import '../../variables.scss';
.sample {
display: block;
text-align: center;
a {
transition: 0.2s transform;
display: block;
}
a:hover {
transform: translateY(5px);
}
svg {
margin: 0 auto;
width: 34px;
height: 46px;
}
}
.sample-name {
color: $darkGray;
display: block;
@media (min-width: $largebp) {
font-size: 18px;
}
a:hover & {
color: $black;
}
}
.sample-download {
display: block;
color: $green;
font-size: 13px;
@media (min-width: $largebp) {
font-size: 14px;
}
a:hover & {
color: $greenHover;
}
}

View File

@ -0,0 +1,26 @@
import React from 'react'
import './SocialLink.scss'
import { Github, Discord, Twitter } from '../../svg'
export default function SocialLink({ icon, title, greenText, url }) {
const getIcon = () => {
if (icon === 'github') {
return <Github />
} else if (icon === 'discord') {
return <Discord />
} else if (icon === 'twitter') {
return <Twitter />
}
}
return (
<a href={url} className="social-link">
<span className="social-link-icon">{getIcon(icon)}</span>
<span className="social-link-text">
<span className="social-link-title">{title}</span>
<span className="social-link-green">{greenText}</span>
</span>
</a>
)
}

View File

@ -0,0 +1,42 @@
@import '../../variables.scss';
.social-link {
display: flex;
color: $darkGray;
}
.social-link-icon {
width: 32px;
transition: 0.2s transform;
a:hover & {
transform: scale(1.07);
}
svg {
width: 32px;
height: 32px;
}
}
.social-link-text {
flex: 1;
margin-left: 16px;
transition: 0.2s color;
}
.social-link-title {
display: block;
}
.social-link-green {
color: $green;
font-size: 14px;
display: inline-flex;
transition: 0.2s color;
a:hover & {
color: $darkGray;
}
}

View File

@ -0,0 +1,73 @@
import React, { Component } from 'react'
import './UploadFile.scss'
import { LoadingSpinner } from '../'
import { File, FileCheck, FileError, Copy } from '../../svg'
export default class UploadFile extends Component {
state = {
copied: false,
}
getIcon = () => {
const { status } = this.props
if (status === 'uploading' || status === 'processing') {
return <File />
} else if (status === 'error') {
return <FileError />
} else {
return <FileCheck />
}
}
copyToClipboard = e => {
this.urlRef.current.select()
document.execCommand('copy')
e.target.focus()
this.setState({ copied: true }, () => {
setTimeout(() => {
this.setState({ copied: false })
}, 1500)
})
}
urlRef = React.createRef()
render() {
const { file, url, status } = this.props
const copyText = this.state.copied ? 'Copied!' : 'Copy to clipboard'
return (
<div className="upload-file">
<div className="upload-file-icon">{this.getIcon()}</div>
<div className="upload-file-text">
<h3>{file.name}</h3>
<p>
{status === 'uploading' && 'Uploading...'}
{status === 'processing' && 'Processing...'}
{status === 'error' && <span className="red-text">Error processing file.</span>}
{status === 'complete' && (
<a href={url} className="url green-text">
{url}
</a>
)}
</p>
</div>
{(status === 'uploading' || status === 'processing') && (
<div className="upload-file-loading">
<LoadingSpinner />
</div>
)}
{status === 'complete' && (
<button onClick={this.copyToClipboard} className="upload-file-copy">
<p className="upload-file-copy-tooltip">{copyText}</p>
<Copy />
<textarea value={url} ref={this.urlRef} />
</button>
)}
</div>
)
}
}

View File

@ -0,0 +1,104 @@
@import '../../variables.scss';
.upload-file {
display: flex;
align-items: center;
padding: 20px 0;
}
.upload-file-icon {
display: block;
min-width: 36px;
width: 36px;
max-width: 36px;
}
.upload-file-text {
display: block;
margin: 0 18px;
flex: 1;
h3 {
margin-bottom: 5px;
font-size: 16px;
font-weight: 400;
@media (min-width: $largebp) {
font-size: 18px;
}
}
p {
font-size: 14px;
color: $lightGray;
}
a {
color: $green;
}
.url {
word-break: break-word;
&:hover {
text-decoration: underline;
}
}
}
.upload-file-loading,
.upload-file-copy {
margin-left: auto;
}
.upload-file-copy {
position: relative;
&:hover {
color: $green;
}
textarea {
position: absolute;
left: -999em;
}
}
.upload-file-copy-tooltip {
position: absolute;
bottom: 100%;
margin-bottom: 10px;
transform: translateX(-50%);
color: $white;
background: rgba(23, 25, 23, 0.9);
font-size: 14px;
white-space: nowrap;
line-height: 32px;
box-shadow: 0 2px 8px 0 rgba(23, 25, 23, 0.2);
border-radius: 4px;
width: 140px;
text-align: center;
opacity: 0;
left: -9999em;
transition: $fadeOff;
.upload-file-copy:hover & {
left: 50%;
opacity: 1;
transition: $fadeOn;
}
&::after {
width: 0;
height: 0;
border-style: solid;
border-width: 6px 6px 0 6px;
border-color: rgba(23, 25, 23, 0.9) transparent transparent transparent;
top: 100%;
left: 50%;
margin-left: -6px;
content: '';
position: absolute;
box-shadow: 0 2px 8px 0 rgba(23, 25, 23, 0.2);
}
}

View File

@ -0,0 +1,38 @@
import App from './App/App'
import Button from './Button/Button'
import CodeExamples from './CodeExamples/CodeExamples'
import Sample from './Sample/Sample'
import SocialLink from './SocialLink/SocialLink'
import CircleIcon from './CircleIcon/CircleIcon'
import FAQ from './FAQ/FAQ'
import UploadFile from './UploadFile/UploadFile'
import LoadingSpinner from './LoadingSpinner/LoadingSpinner'
import Footer from './Footer/Footer'
import Mailing from './Mailing/Mailing'
import HomeTop from './HomeTop/HomeTop'
import HomeUpload from './HomeUpload/HomeUpload'
import HomeBuilt from './HomeBuilt/HomeBuilt'
import HomeSamples from './HomeSamples/HomeSamples'
import HomeStay from './HomeStay/HomeStay'
import HomeNetwork from './HomeNetwork/HomeNetwork'
export {
App,
HomeTop,
HomeUpload,
Button,
HomeBuilt,
CodeExamples,
Sample,
HomeSamples,
HomeStay,
SocialLink,
CircleIcon,
HomeNetwork,
FAQ,
UploadFile,
LoadingSpinner,
Footer,
Mailing,
}

View File

@ -0,0 +1,242 @@
@import './variables.scss';
@font-face {
font-family: 'Haas Grot Disp';
src: url('/fonts/hinted-subset-HaasGrotDispR-55Roman.woff2') format('woff2'),
url('/fonts/hinted-subset-HaasGrotDispR-55Roman.woff') format('woff');
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'Haas Grot Disp';
src: url('/fonts/hinted-subset-HaasGrotDispR-65Medium.woff2') format('woff2'),
url('/fonts/hinted-subset-HaasGrotDispR-65Medium.woff') format('woff');
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: 'Haas Grot Text';
src: url('/fonts/hinted-subset-HaasGrotTextR-75Bold.woff2') format('woff2'),
url('/fonts/hinted-subset-HaasGrotTextR-75Bold.woff') format('woff');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'Haas Grot Text';
src: url('/fonts/hinted-subset-HaasGrotTextR-65Medium.woff2') format('woff2'),
url('/fonts/hinted-subset-HaasGrotTextR-65Medium.woff') format('woff');
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'Haas Grot Text';
src: url('/fonts/hinted-subset-HaasGrotTextR-55Roman.woff2') format('woff2'),
url('/fonts/hinted-subset-HaasGrotTextR-55Roman.woff') format('woff');
font-weight: normal;
font-style: normal;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-size: 16px;
font-weight: 400;
line-height: 1.78;
font-family: $font;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
background-color: $greenBg;
color: $darkGray;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: 500;
line-height: 1.25;
}
a {
text-decoration: none;
}
li {
list-style: none;
}
input,
select,
button,
textarea {
appearance: none;
border: none;
background: transparent;
outline: none;
font-family: $font;
font-size: 16px;
}
input[type='email'],
input[type='text'],
input[type='password'],
input[type='search'] {
display: block;
width: 100%;
}
a,
button,
label,
input[type='submit'],
input[type='checkbox'],
input[type='radio'] {
cursor: pointer;
}
img,
svg {
display: block;
max-width: 100%;
}
.red-text {
color: $red;
}
.green-text {
color: $green;
}
.dark-gray-text {
color: $darkGray;
}
.truncate {
width: 250px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: block;
}
.offscreen {
position: absolute;
left: -999em;
}
.width {
width: 90%;
max-width: 900px;
margin: 0 auto;
}
.divider {
width: 48px;
height: 2px;
background: currentColor;
}
.small-divider {
width: 8px;
height: 2px;
background: currentColor;
}
@keyframes float {
0% {
transform: translate(0, 0);
}
50% {
transform: translate(0, -20%);
}
100% {
transform: translate(0, 0);
}
}
@keyframes floatLarge {
0% {
transform: translate(0, 0);
}
50% {
transform: translate(0, -40%);
}
100% {
transform: translate(0, 0);
}
}
.fadeInUp {
transform: translateY(40px);
opacity: 0;
transition: 1s opacity, 1s transform;
.active & {
opacity: 1;
transform: none;
}
&.delay2 {
transition-delay: 0.2s;
}
&.delay3 {
transition-delay: 0.3s;
}
&.delay4 {
transition-delay: 0.4s;
}
&.delay5 {
transition-delay: 0.5s;
}
&.delay6 {
transition-delay: 0.6s;
}
&.delay7 {
transition-delay: 0.7s;
}
&.delay8 {
transition-delay: 0.8s;
}
&.delay9 {
transition-delay: 0.9s;
}
&.delay10 {
transition-delay: 1s;
}
&.delay11 {
transition-delay: 1.1s;
}
&.delay12 {
transition-delay: 1.2s;
}
&.delay13 {
transition-delay: 1.3s;
}
&.delay14 {
transition-delay: 1.4s;
}
}

View File

@ -0,0 +1,7 @@
import React from 'react'
import ReactDOM from 'react-dom'
import './global.scss'
import { App } from './components'
ReactDOM.render(<App />, document.getElementById('root'))

View File

@ -0,0 +1,9 @@
import React from 'react'
export default function Arrow({ className }) {
return (
<svg className={className} viewBox="0 0 15 7" width={15} height={7} xmlns="http://www.w3.org/2000/svg">
<path d="M0 6h12L7 1" stroke="currentColor" strokeWidth="2" fill="none" fillRule="evenodd" />
</svg>
)
}

View File

@ -0,0 +1,23 @@
import React from 'react'
export default function Built(props) {
return (
<svg width="74" height="65" viewBox="0 0 74 65" {...props}>
<g fill="none" fillRule="evenodd">
<path
d="M70.723 64.302a7.37 7.37 0 01-1.284-.378c-.773-.31-1.922-.92-2.798-1.486-1.213-.783-3.053-2.198-4.377-3.366-.197-.174-.5-.44-.675-.591a30.765 30.765 0 01-.6-.54l-.697-.645c-1.56-1.439-4.53-4.45-5.93-6.012a130.07 130.07 0 00-.74-.815c-.78-.853-1.041-1.162-1.034-1.223.006-.053.031-.057.397-.065l.391-.008.106.094c.059.052.287.301.508.554.386.442.631.71 1.102 1.207.12.126.358.385.529.574.695.773 2.875 2.99 3.775 3.84l.773.728c2.248 2.122 4.849 4.165 6.701 5.264.977.58 1.39.776 2.212 1.053.665.225.984.288 1.441.288.315 0 .407-.011.604-.073.656-.203 1.032-.63 1.236-1.404.227-.863.18-1.9-.156-3.475-.407-1.902-1.404-4.676-2.618-7.284l-.48-1.034a102.853 102.853 0 00-1.512-3.031l-.435-.804a102.52 102.52 0 00-1.62-2.902c-.849-1.456-1.166-1.992-1.27-2.14-.185-.263-.25-.411-.265-.604-.01-.135-.004-.182.03-.211.1-.082.099-.083 1.212 1.791a151.95 151.95 0 011.618 2.83c.154.277.322.574.373.661.05.087.218.397.371.69.153.292.372.706.486.919 2.905 5.452 4.814 10.273 5.253 13.263.137.933.157 1.79.057 2.457a2.6 2.6 0 01-.287.887c-.103.207-.17.297-.371.492-.424.413-.778.543-1.46.538a4.251 4.251 0 01-.566-.04zm-35.6-38.46l-.167-.267c-.05-.078-.212-.352-.361-.61-.428-.738-1.288-2.173-1.341-2.236a4.831 4.831 0 01-.225-.366l-.176-.309.007-.953.008-.953.183.342c.101.189.317.586.48.884.164.298.353.647.42.776.122.232.505.899.788 1.37.081.133.226.38.323.545.096.166.217.363.269.438.124.18.385.632.386.669 0 .026-.435.704-.495.77-.012.014-.056-.029-.1-.1zm12.844-7.816a15.927 15.927 0 01-.397-.454 46.908 46.908 0 00-.6-.69l-.894-1.005A102.4 102.4 0 0043 12.545c-1.017-1.063-3.083-3.11-3.403-3.37-.062-.05-.298-.267-.524-.48-.225-.214-.64-.589-.921-.833l-.77-.672c-.241-.21-.842-.701-1.5-1.228-1.467-1.172-3.393-2.41-4.442-2.857-1.46-.621-2.446-.748-3.135-.403-.473.237-.808.689-.977 1.317-.123.462-.164 1.581-.074 2.018.017.08.058.361.092.627.055.423.057.49.021.526-.045.044-1.114.5-1.173.499-.08-.001-.116-.066-.267-.476-.297-.805-.465-1.339-.54-1.717a10.455 10.455 0 00-.115-.522c-.038-.137-.135-.79-.186-1.25a13.667 13.667 0 01-.028-.905c-.003-.608.003-.723.058-.976.15-.702.369-1.111.759-1.423.366-.294.714-.4 1.308-.401.55 0 .946.077 1.605.318 1.856.676 4.035 2.07 6.575 4.205.32.27.662.554.758.633.097.08.404.35.683.604.28.252.555.498.614.546.17.138 1.753 1.635 2.5 2.365.378.368.993.989 1.368 1.379.375.39.73.754.789.81.059.054.342.352.63.66l.927.991c.222.237.589.637.815.89.226.252.508.563.625.69.203.219.786.879 1.255 1.42a95.017 95.017 0 011.823 2.12c.194.23.32.404.314.433-.007.04-.047.051-.195.058-.183.008-.185.008-.302-.115z"
fill="#8B8C8B"
/>
<g fill="#57B560">
<path d="M10.955 47.843c-3.147-.218-5.926-1.194-8.708-3.057a18.634 18.634 0 01-.64-.455 21.592 21.592 0 00-.406-.3 35.55 35.55 0 01-1.031-.848l-.13-.112.26-.267c.306-.313.935-.953 1.1-1.119l.825-.84a4399.636 4399.636 0 011.623-1.66c.047-.05.068-.034.509.4 1.054 1.037 2.124 1.78 3.564 2.472.306.147.57.267.588.267.017 0 .073.022.124.048.312.158 1.476.511 1.96.594l.52.088c.335.057 1.562.083 1.93.042.766-.086 1.517-.283 2.07-.543a4.835 4.835 0 001.2-.77c.665-.56 1.04-1.157 1.113-1.774.078-.653-.073-1.318-.415-1.828a3.3 3.3 0 00-.39-.443c-.363-.345-.711-.557-1.309-.8-.352-.142-.818-.26-1.708-.434l-1.086-.213-1.071-.212c-1.24-.242-2.214-.456-2.809-.617-1.057-.286-2.059-.616-2.692-.887l-.435-.185c-.4-.172-.97-.486-1.418-.783-.612-.405-1.24-1.016-1.626-1.584-.443-.65-.648-1.117-.907-2.063-.155-.57-.208-1.908-.107-2.745.11-.916.459-2.015.88-2.775.279-.503.385-.666.714-1.095.97-1.267 2.307-2.315 3.695-2.895.908-.38 1.885-.654 2.721-.762l.695-.09c.45-.057 2.034-.083 2.563-.042 1.672.132 2.948.401 4.458.941.526.188 1.62.69 2.244 1.032.29.157.548.306.782.45.135.083.272.165.304.182.198.107 1.55 1.03 1.642 1.12.053.053.077.018-.411.618-.279.344-.544.674-.637.795a44.636 44.636 0 00-.565.697l-.478.597c-.071.088-.215.268-.318.399-.104.13-.234.292-.29.358-.055.066-.178.218-.272.337a1.43 1.43 0 01-.192.218c-.012 0-.182-.136-.38-.303-.302-.256-.926-.73-1.182-.9-.966-.64-1.63-.972-2.592-1.295a11.186 11.186 0 00-2.156-.49c-.361-.042-1.381-.035-1.723.013-1.295.183-2.325.624-3.048 1.306a2.68 2.68 0 00-.872 1.779c-.05.522.072 1.098.31 1.478.136.215.465.58.61.677.057.038.156.107.22.153.308.223 1.21.592 1.694.692l.535.113c.32.068.596.124 1.998.408l.97.195c.263.054.712.144.999.201.287.057.697.142.912.187.215.046.495.101.623.123 1.097.19 2.707.695 3.402 1.066l.245.13c1.846.978 2.981 2.441 3.37 4.344.135.657.159.9.159 1.647 0 .533-.012.771-.052 1.01-.32 1.95-1.058 3.45-2.385 4.853-1.045 1.105-2.265 1.868-3.929 2.459-1.064.377-2.259.603-3.706.7-.466.03-1.588.03-2.055-.003zM25.88 33.702v-14.17h5.733v28.341H25.88zM28.326 16.627a4.613 4.613 0 01-.432-.111c-.955-.29-1.7-1.068-1.93-2.016-.402-1.65.727-3.245 2.45-3.462.326-.04.369-.04.728.012 1.161.169 2.062.954 2.374 2.071.068.243.079.333.08.705.001.399-.005.448-.092.748-.23.786-.691 1.351-1.426 1.748a3.68 3.68 0 01-.93.306 3.288 3.288 0 01-.822-.001zm19.67 31.215a20.2 20.2 0 01-1.921-.256c-.954-.198-1.92-.491-2.664-.81a2.324 2.324 0 00-.255-.098c-.042 0-1.005-.482-1.349-.675a14.43 14.43 0 01-3.826-3.124 10.298 10.298 0 01-.52-.628 30.045 30.045 0 00-.238-.33c-.303-.415-.573-.814-.573-.849a.283.283 0 00-.053-.088c-.147-.187-.579-1.008-.881-1.676-.546-1.207-.938-2.705-1.124-4.297-.043-.367-.043-2.24 0-2.618.218-1.903.66-3.419 1.462-5.008.205-.405.254-.496.49-.896a16.639 16.639 0 011.104-1.576c.314-.413 1.152-1.29 1.666-1.744.268-.237.846-.7 1.135-.91a20.14 20.14 0 011.109-.724c1.055-.594 1.854-.954 2.826-1.274.787-.259 1.748-.486 2.429-.573l.695-.089c.186-.024.705-.05 1.18-.059.855-.016 1.314.005 1.99.094.175.023.42.054.545.068.664.077 2.155.467 2.826.74.117.047.224.086.238.086.022 0 .304.119.72.304 1.104.493 2.243 1.208 3.27 2.051.19.157.889.801 1.076.992 1.531 1.566 2.728 3.55 3.367 5.588.261.83.486 1.837.542 2.427.015.16.042.392.06.518.025.166.037 2.282.044 7.846l.01 7.62-7.536-.005c-4.145-.002-7.675-.014-7.845-.027zm9.645-9.965c0-5.097.002-5.045-.24-6.081a8.79 8.79 0 00-1.259-2.829c-.725-1.062-1.812-2.064-2.907-2.68a13.402 13.402 0 00-1.21-.565c-.725-.254-1.163-.367-1.797-.463-.453-.068-.584-.076-1.272-.076-.685 0-.823.009-1.274.076-1.203.18-2.33.59-3.33 1.21-1.069.662-1.94 1.506-2.688 2.601-.082.12-.15.23-.15.245a.263.263 0 01-.053.094c-.059.075-.355.634-.466.88a8.535 8.535 0 00-.58 1.919c-.194 1.1-.196 1.826-.01 2.917.076.454.27 1.168.399 1.482.04.098.074.188.074.2 0 .026.195.44.34.723.672 1.305 1.758 2.485 3.033 3.293 1.297.823 2.705 1.28 4.3 1.397.07.005 2.146.011 4.61.014l4.48.005v-4.362z" />
</g>
<g fill="#8B8C8B">
<path d="M12.858 15.565a1.32 1.32 0 01-.906-.946c-.035-.14-.043-.398-.043-1.377v-1.205h-.647v-1.023h.647V9.776h1.264v1.238h1.012v1.023h-1.012v1.085c0 1.07.001 1.086.063 1.204a.56.56 0 00.16.18c.133.086.367.084.547-.003.09-.043.137-.055.145-.034l.153.403.142.372-.064.051a2.122 2.122 0 01-.602.28c-.236.058-.652.053-.859-.01zm-11.01-2.282l-.8-2.255.629-.007a9.34 9.34 0 01.641.004c.007.006.21.633.45 1.393.24.76.445 1.39.455 1.401.01.011.226-.613.482-1.386l.464-1.405H5.26l.464 1.406c.255.773.471 1.397.481 1.386.01-.01.192-.57.405-1.244l.44-1.393.055-.169h1.28l-.802 2.262-.804 2.261-.588-.007-.59-.007-.436-1.418c-.24-.78-.442-1.412-.45-1.405-.009.008-.212.646-.453 1.419l-.437 1.404-.589.007-.588.007-.8-2.254zM9.127 13.275v-2.261h1.32v4.522h-1.32v-2.261zM15.253 12.481V9.426h1.292v1.063c0 .585.01 1.064.024 1.064.013 0 .065-.05.116-.11.123-.147.45-.349.691-.427.267-.087.789-.108 1.052-.043a1.692 1.692 0 011.225 1.16c.045.143.051.327.06 1.782l.01 1.621h-1.265l-.008-1.433c-.008-1.43-.008-1.434-.073-1.588a.892.892 0 00-.498-.476.819.819 0 00-.392-.05c-.395.02-.675.188-.835.5l-.093.18-.008 1.433-.008 1.434h-1.29v-3.055zm-5.79-2.187c-.428-.207-.52-.728-.187-1.057.447-.44 1.198-.145 1.198.472 0 .505-.538.816-1.012.585z" />
</g>
<g fill="#8B8C8B">
<path d="M9.392 6.591a1.669 1.669 0 01-1.225-1.185c-.053-.195-.057-.303-.057-1.791V2.03h1.282v1.408c0 1.356.002 1.414.06 1.574a.919.919 0 00.442.49c.12.058.178.067.41.067.237 0 .292-.01.445-.076a.902.902 0 00.552-.68c.015-.087.028-.75.028-1.471V2.031h1.31v4.522h-1.31V6.27c0-.155-.003-.282-.008-.282-.004 0-.104.088-.22.195-.35.32-.717.452-1.251.449a2.547 2.547 0 01-.458-.04zm10.761-.01a1.329 1.329 0 01-.918-.946c-.035-.14-.044-.398-.044-1.377V3.054h-.655V2.03h.655V.793h1.281V2.03h1.026v1.023h-1.026v1.084c0 1.071.001 1.086.065 1.204a.562.562 0 00.16.181c.136.085.373.084.556-.004.09-.043.139-.054.147-.033l.155.403.144.371-.065.052a2.163 2.163 0 01-.61.279c-.24.058-.662.054-.87-.01zM13.836 4.292V2.031h1.338v4.522h-1.338V4.292zM16.342 3.498V.443h1.339v6.11h-1.339V3.498zM14.176 1.31c-.434-.207-.527-.728-.19-1.056.454-.441 1.216-.146 1.216.471 0 .504-.543.815-1.026.586zM2.043.444h1.34v1.103c0 .607.002 1.104.006 1.104s.098-.082.21-.182c.394-.355.734-.49 1.296-.511.447-.017.694.029 1.047.196.555.263.96.763 1.148 1.414.057.197.066.29.066.711 0 .548-.048.792-.23 1.167-.283.582-.848 1.03-1.45 1.148-.18.036-.708.05-.855.023-.45-.088-.832-.287-1.095-.57l-.143-.153v.66h-1.34V.443zm2.926 5.1c.44-.123.765-.459.876-.904.179-.716-.201-1.41-.876-1.599a1.68 1.68 0 00-.707-.002c-.374.107-.641.35-.796.721-.086.204-.108.673-.044.909.118.432.397.736.794.864.187.06.558.066.753.011z" />
</g>
</g>
</svg>
)
}

View File

@ -0,0 +1,17 @@
import React from 'react'
export default function Copy(props) {
return (
<svg width={18} height={18} viewBox="0 0 18 18" {...props}>
<path
d="M15 13v2a2 2 0 01-2 2H3a2 2 0 01-2-2V5a2 2 0 012-2h2m2.464 3.293L6.05 7.707a3 3 0 104.243 4.243l1.414-1.414h0m-1.414-7.072l1.414-1.414a3 3 0 114.243 4.243l-1.414 1.414h0M8.879 9.121L13.12 4.88"
stroke="currentColor"
strokeWidth={2}
fill="none"
fillRule="evenodd"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
)
}

Some files were not shown because too many files have changed in this diff Show More