├── .babelrc ├── .editorconfig ├── .envrc.example ├── .gitignore ├── LICENSE ├── README.md ├── circle.yml ├── env.config.js ├── jsconfig.json ├── package-lock.json ├── package.json ├── src ├── components │ ├── shared │ │ ├── auth │ │ │ ├── components │ │ │ │ ├── footer.js │ │ │ │ ├── quotes.js │ │ │ │ ├── social-buttons.js │ │ │ │ └── style.js │ │ │ ├── forgot-password.js │ │ │ ├── set-password.js │ │ │ ├── signin.js │ │ │ └── signup.js │ │ ├── cli.js │ │ ├── cta.js │ │ ├── footer.js │ │ ├── header │ │ │ ├── hexagons.svg │ │ │ ├── index.js │ │ │ ├── site-nav.js │ │ │ └── user-nav.js │ │ ├── testimonials │ │ │ ├── icon.svg │ │ │ └── index.js │ │ └── youTube.js │ └── ui │ │ ├── avatar.js │ │ ├── button.js │ │ ├── github-button.js │ │ ├── grid.js │ │ ├── head.js │ │ ├── hexagon.js │ │ ├── input-list.js │ │ ├── input.js │ │ ├── link.js │ │ ├── loader.js │ │ ├── logo │ │ ├── index.js │ │ └── logo.svg │ │ ├── markdown.js │ │ ├── menu.js │ │ ├── modal.js │ │ ├── nav-link.js │ │ ├── nav.js │ │ ├── page │ │ ├── index.js │ │ └── styles │ │ │ ├── font-awesome.js │ │ │ └── normalize.js │ │ ├── router.js │ │ ├── scroll-manager.js │ │ ├── sidebar.js │ │ ├── slider.js │ │ └── text.js ├── index.html ├── index.js ├── services │ ├── auth.service.js │ ├── request.service.js │ └── ui.service.js ├── static │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── img │ │ ├── enterprise │ │ │ ├── afm_logo.png │ │ │ ├── altibox_logo.png │ │ │ ├── aws_logo.png │ │ │ ├── bank.svg │ │ │ ├── check-circle.svg │ │ │ ├── code-1.svg │ │ │ ├── cursor-double-click.svg │ │ │ ├── dnb_logo.jpg │ │ │ ├── graduation-cap.svg │ │ │ ├── server-check.svg │ │ │ ├── transformation.svg │ │ │ └── window-code.svg │ │ ├── features │ │ │ ├── clouds.jpg │ │ │ └── dashboard.png │ │ ├── og-image.png │ │ ├── slack-invite │ │ │ ├── og-image.png │ │ │ ├── syncano-slack.svg │ │ │ └── twitter-image.png │ │ ├── syncano-logo-dark.png │ │ └── testimonials │ │ │ ├── artur-czmiel.png │ │ │ ├── artur-czmiel@2x.png │ │ │ ├── halvor-lande.png │ │ │ ├── halvor-lande@2x.png │ │ │ ├── ingar-bentzen.png │ │ │ ├── ingar-bentzen@2x.png │ │ │ ├── nikolai-fasting.png │ │ │ ├── nikolai-fasting@2x.png │ │ │ ├── stale-husby.png │ │ │ ├── stale-husby@2x.png │ │ │ ├── sven-sunde.png │ │ │ └── sven-sunde@2x.png │ └── sitemap.xml ├── stores │ ├── auth.store.js │ ├── messages.store.js │ ├── pending.store.js │ └── ui.store.js └── views │ ├── enterprise │ ├── components │ │ ├── book-meeting.js │ │ ├── enterpriseComponents.js │ │ ├── enterpriseCta.js │ │ ├── enterpriseFeatures.js │ │ ├── enterpriseGraph.js │ │ └── enterpriseTestimonials.js │ └── index.js │ ├── faq.js │ ├── features │ ├── components │ │ ├── automation-sdk-section.js │ │ ├── cloud-os-section.js │ │ ├── community-section.js │ │ ├── content-nav │ │ │ ├── content-nav-item.js │ │ │ ├── icon-0.svg │ │ │ ├── icon-1.svg │ │ │ ├── icon-2.svg │ │ │ ├── icon-3.svg │ │ │ └── index.js │ │ └── registries-section │ │ │ ├── hexagons.svg │ │ │ ├── icon-db.svg │ │ │ ├── icon-fb.svg │ │ │ ├── icon-sentry.svg │ │ │ ├── icon-stripe.svg │ │ │ ├── icon-twitter.svg │ │ │ └── index.js │ ├── featuresPage.service.js │ ├── featuresPage.store.js │ ├── helpers.js │ └── index.js │ ├── landing │ ├── index.js │ └── sections │ │ ├── faq.js │ │ ├── features │ │ ├── icon-automation-sdk.svg │ │ ├── icon-cloud-os.svg │ │ ├── icon-community.svg │ │ ├── icon-socket-registry.svg │ │ └── index.js │ │ ├── innovation.js │ │ └── sockets │ │ ├── hexagons.svg │ │ ├── icon-db.svg │ │ ├── icon-fb.svg │ │ ├── icon-firebase.svg │ │ ├── icon-google-analytics.svg │ │ ├── icon-parse.svg │ │ ├── icon-segment.svg │ │ ├── icon-sentry.svg │ │ ├── icon-slack.svg │ │ ├── icon-stripe.svg │ │ ├── icon-twitter.svg │ │ └── index.js │ ├── missing.js │ ├── pricing │ ├── components │ │ ├── arrow.svg │ │ ├── pricing-estimate.js │ │ └── pricing-table.js │ ├── index.js │ └── sections │ │ ├── faq.js │ │ └── scaling.js │ ├── signin.js │ ├── signup.js │ ├── slack-invite │ ├── index.js │ ├── slackInvite.service.js │ └── slackInviteForm.js │ ├── sockets │ ├── components │ │ ├── details.js │ │ ├── hexagon.js │ │ ├── icon.svg │ │ ├── list-item.js │ │ ├── list.js │ │ ├── search.js │ │ ├── sidebar.js │ │ └── sort-list.js │ ├── index.js │ ├── sockets.service.js │ └── sockets.store.js │ └── terms │ ├── acceptable-use-policy.js │ ├── components │ └── sidebar.js │ ├── general-terms.js │ ├── privacy-policy.js │ ├── syncano-performance-insights.js │ └── terms-of-service.js ├── syncano ├── .gitignore └── syncano.yml ├── yarn.lock └── zefir.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "zefir/babel" 4 | ], 5 | "plugins": [ 6 | ["transform-define", "./env.config.js"] 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.envrc.example: -------------------------------------------------------------------------------- 1 | export HELLO_FACEBOOK= 2 | export HELLO_GOOGLE= 3 | export HELLO_GITHUB= 4 | export HELLO_REDIRECT_URI= 5 | export DASHBOARD_URL= 6 | export API_URL= 7 | export ANALYTICS_WRITE_KEY= 8 | export OPTIMIZELY_KEY= 9 | export SYNCANO_REGISTRY_URL=https://socket-registry.syncano.link 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Build 7 | .zefir 8 | 9 | # Dependency directories 10 | node_modules 11 | 12 | # Other 13 | .DS_Store 14 | Thumbs.db 15 | .envrc 16 | .vscode 17 | 18 | # Syncano 19 | syncano/.dist 20 | syncano/.bundles 21 | syncano/**/scripts/.bundles 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Syncano 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # syncano.com 2 | [![Slack](https://img.shields.io/badge/chat-on_slack-blue.svg)](https://www.syncano.io/#/slack-invite/) 3 | [![CircleCI](https://circleci.com/gh/Syncano/syncano.com/tree/master.svg?style=shield)](https://circleci.com/gh/Syncano/syncano.com/tree/master) 4 | 5 | [Syncano.com](https://www.syncano.io/) Website 6 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | environment: 3 | YARN_VERSION: 0.17.10 4 | PATH: "${PATH}:${HOME}/.yarn/bin" 5 | 6 | dependencies: 7 | pre: 8 | - case $CIRCLE_NODE_INDEX in 0) NODE_VERSION=7 ;; 1) NODE_VERSION=6 ;; 2) NODE_VERSION=4 ;; esac; nvm install $NODE_VERSION && nvm alias default $NODE_VERSION 9 | - | 10 | if [[ ! -e ~/.yarn/bin/yarn || $(yarn --version) != "${YARN_VERSION}" ]]; then 11 | curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version $YARN_VERSION 12 | fi 13 | cache_directories: 14 | - ~/.yarn 15 | - ~/.yarn-cache 16 | override: 17 | - yarn 18 | - yarn global add syncano-cli@beta 19 | # the line below is a hack for permissions issues in zefir package. remove when fixed. 20 | - chmod -R u+x node_modules 21 | test: 22 | override: 23 | - yarn run build 24 | 25 | deployment: 26 | production: 27 | branch: syncano-ascend-master 28 | commands: 29 | - syncano-cli deploy 30 | - syncano-cli hosting config staging --cname syncano.rocks 31 | - syncano-cli hosting config production --cname syncano.io 32 | - syncano-cli hosting sync production 33 | staging: 34 | branch: syncano-ascend 35 | commands: 36 | - syncano-cli deploy 37 | - syncano-cli hosting config staging --cname syncano.rocks 38 | - syncano-cli hosting config production --cname syncano.io 39 | - syncano-cli hosting sync staging 40 | 41 | experimental: 42 | notify: 43 | branches: 44 | only: 45 | - syncano-ascend 46 | -------------------------------------------------------------------------------- /env.config.js: -------------------------------------------------------------------------------- 1 | const ENV = { 2 | 'syncano-ascend': 'ASCEND', 3 | 'syncano-ascend-master': 'PRODUCTION', 4 | devel: 'STAGING', 5 | master: 'PRODUCTION' 6 | }[process.env.CIRCLE_BRANCH || 'devel'] 7 | 8 | const envVars = [ 9 | 'HELLO_FACEBOOK', 10 | 'HELLO_GOOGLE', 11 | 'HELLO_GITHUB', 12 | 'HELLO_REDIRECT_URI', 13 | 'DASHBOARD_URL', 14 | 'ANALYTICS_WRITE_KEY', 15 | 'OPTIMIZELY_KEY', 16 | 'API_URL', 17 | 'SYNCANO_REGISTRY_URL' 18 | ] 19 | 20 | const variables = envVars 21 | .reduce((env, key) => { 22 | const name = ENV ? `${ENV}_${key}` : key 23 | const value = process.env[name] || process.env[key] 24 | 25 | return Object.assign({}, env, { 26 | [`process.env.${key}`]: value 27 | }) 28 | }, {}) 29 | 30 | module.exports = variables 31 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "experimentalDecorators": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "syncano.com", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "zefir", 7 | "build": "zefir build", 8 | "start": "zefir start" 9 | }, 10 | "dependencies": { 11 | "axios": "0.16.1", 12 | "color": "^2.0.0", 13 | "hellojs": "1.14.1", 14 | "js-cookie": "^2.1.4", 15 | "lodash.get": "^4.4.2", 16 | "md5": "^2.2.1", 17 | "mobx": "^3.1.9", 18 | "mobx-react": "^4.1.8", 19 | "rc-slider": "^8.2.0", 20 | "react": "^15.5.4", 21 | "react-dom": "^15.5.4", 22 | "react-github-button": "0.1.11", 23 | "react-hexagon": "1.1.1", 24 | "react-marked-markdown": "^1.4.2", 25 | "react-rotating-text": "^1.2.0", 26 | "react-router": "~4.2.0", 27 | "react-sticky": "^5.0.8", 28 | "svg-react-loader": "0.4.0", 29 | "syncano-cli": "beta", 30 | "zefir": "beta" 31 | }, 32 | "devDependencies": { 33 | "babel-eslint": "^7.2.3", 34 | "babel-plugin-inline-react-svg": "0.4.0", 35 | "babel-plugin-transform-define": "^1.2.0", 36 | "html-webpack-plugin": "^2.30.1", 37 | "mobx-react-devtools": "^4.2.11", 38 | "standard": "^10.0.2" 39 | }, 40 | "standard": { 41 | "parser": "babel-eslint" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/components/shared/auth/components/footer.js: -------------------------------------------------------------------------------- 1 | const Footer = ({toggleModal, smallSpacing}) => ( 2 |
6 |
7 | By signing up you confirm that you accept our Terms of Use 8 |
9 | 10 |
11 | Already a member? { 12 | window.analytics.track('Sign in Website') 13 | toggleModal('signin') 14 | }}>Sign in here 15 |
16 |
17 | ) 18 | 19 | export default Footer 20 | -------------------------------------------------------------------------------- /src/components/shared/auth/components/social-buttons.js: -------------------------------------------------------------------------------- 1 | import {connect} from 'zefir/utils' 2 | import Button from '../../../ui/button' 3 | import InputList from '../../../ui/input-list' 4 | import Grid from '../../../ui/grid' 5 | 6 | const SocialButtons = ({authViaGithub, authViaGoogle, authViaFacebook, messages}) => ( 7 |
8 |
9 |
10 | 14 |
15 |
16 | 21 |
22 |
23 | 27 |
28 |
29 | 30 | 31 | 32 | 73 |
74 | ) 75 | 76 | SocialButtons.init = ({ 77 | stores: {messages}, 78 | services: {auth: {socialAuth}} 79 | }) => ({ 80 | messages, 81 | authViaFacebook: socialAuth.bind(null, 'facebook'), 82 | authViaGithub: socialAuth.bind(null, 'github'), 83 | authViaGoogle: socialAuth.bind(null, 'google') 84 | }) 85 | 86 | export default connect(SocialButtons) 87 | -------------------------------------------------------------------------------- /src/components/shared/auth/components/style.js: -------------------------------------------------------------------------------- 1 | export default () => ( 2 |
3 | 156 |
157 | ) 158 | -------------------------------------------------------------------------------- /src/components/shared/auth/forgot-password.js: -------------------------------------------------------------------------------- 1 | import {connect} from 'zefir/utils' 2 | import Button from '../../ui/button' 3 | import Input from '../../ui/input' 4 | import InputList from '../../ui/input-list' 5 | import Style from './components/style' 6 | 7 | const ForgotPasswordForm = ({ 8 | email, password, toggleSignInModal, resetPassword, messages 9 | }) => ( 10 |
11 |
12 | 13 | 14 | 15 | 16 |
17 | 22 |
23 | 24 | {messages.has('auth.forgot-password.success') ? ( 25 |
{messages.get('auth.forgot-password.success')}
26 | ) : ''} 27 |
28 |
29 |
30 | Remember your password? Sign in here 31 |
32 |
33 | 34 | 149 |
150 | ) 151 | 152 | export default CLI 153 | -------------------------------------------------------------------------------- /src/components/shared/cta.js: -------------------------------------------------------------------------------- 1 | import {connect} from 'zefir/utils' 2 | import Button from '../ui/button' 3 | import Hexagon from '../ui/hexagon' 4 | import {MatchAsGuest} from '../ui/router' 5 | 6 | const CTA = ({toggleSignUpModal}) => ( 7 | ( 8 |
9 |

Ready to get started?

10 |

Try Syncano for free for 30 days. No credit card required.

11 | 12 |
13 | 14 | {/* TODO: Will be replaced with modal form */} 15 | {/* */} 16 |
17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 | 75 |
76 | )} /> 77 | ) 78 | 79 | CTA.init = ({ 80 | services: {ui: {toggleModal}} 81 | }) => ({ 82 | toggleSignUpModal: e => { 83 | window.analytics.track('Sign up Website') 84 | toggleModal('signup') 85 | } 86 | }) 87 | 88 | export default connect(CTA) 89 | -------------------------------------------------------------------------------- /src/components/shared/header/user-nav.js: -------------------------------------------------------------------------------- 1 | import Nav from '../../ui/nav' 2 | import {MatchAsGuest, MatchAsMember} from '../../ui/router' 3 | 4 | const UserNav = ({theme, toggleSignUp, toggleSignIn, pageStatus}) => ( 5 |
6 | ( 7 | 14 | )} /> 15 | 16 | ( 17 | 23 | )} /> 24 | 25 | 124 |
125 | ) 126 | 127 | export default UserNav 128 | -------------------------------------------------------------------------------- /src/components/shared/youTube.js: -------------------------------------------------------------------------------- 1 | /* 2 | Usage: 3 | 4 | 10 | */ 11 | 12 | const YouTube = ({ video, autoplay, rel, showInfo }) => ( 13 |