WIP: Pricing page
This commit is contained in:
@@ -1,8 +1,13 @@
|
|||||||
// @flow
|
// @flow
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
import breakpoint from 'styled-components-breakpoint';
|
||||||
import Grid from 'styled-components-grid';
|
import Grid from 'styled-components-grid';
|
||||||
import { Helmet } from 'react-helmet';
|
import { Helmet } from 'react-helmet';
|
||||||
import Hero from './components/Hero';
|
import Header from './components/Header';
|
||||||
|
import Content from './components/Content';
|
||||||
|
import Button from './components/Button';
|
||||||
|
import Notice from '../../shared/components/Notice';
|
||||||
|
|
||||||
export default function Pricing() {
|
export default function Pricing() {
|
||||||
return (
|
return (
|
||||||
@@ -10,13 +15,179 @@ export default function Pricing() {
|
|||||||
<Helmet>
|
<Helmet>
|
||||||
<title>Pricing</title>
|
<title>Pricing</title>
|
||||||
</Helmet>
|
</Helmet>
|
||||||
<Hero>
|
<Header background="#00adff">
|
||||||
<h1>Pricing</h1>
|
<h1>Our Pricing</h1>
|
||||||
<p>
|
<p>Our pricing is simple. You’ll only pay for what you use.</p>
|
||||||
Explore Outline with a 14 day trial, free forever for teams smaller
|
</Header>
|
||||||
than 5.
|
<Content>
|
||||||
</p>
|
<Grid>
|
||||||
</Hero>
|
<Plan
|
||||||
|
size={{ desktop: 1 / 2 }}
|
||||||
|
itemScope
|
||||||
|
itemType="http://schema.org/Product"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<Name itemprop="name">Free</Name>
|
||||||
|
<Price>
|
||||||
|
<span itemprop="priceCurrency" content="USD">
|
||||||
|
$
|
||||||
|
</span>
|
||||||
|
<span itemprop="price">0</span>
|
||||||
|
</Price>
|
||||||
|
</div>
|
||||||
|
<div itemprop="description">
|
||||||
|
<h4>Top features:</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Upto 5 team members</li>
|
||||||
|
<li>Unlimited documents</li>
|
||||||
|
<li>All integrations</li>
|
||||||
|
<li>API access</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</Plan>
|
||||||
|
<Plan
|
||||||
|
size={{ desktop: 1 / 2 }}
|
||||||
|
itemScope
|
||||||
|
itemType="http://schema.org/Product"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<Name itemprop="name">Standard</Name>
|
||||||
|
<Price>
|
||||||
|
<span itemprop="priceCurrency" content="USD">
|
||||||
|
$
|
||||||
|
</span>
|
||||||
|
<span itemprop="price">5</span>{' '}
|
||||||
|
<Period>per seat per month</Period>
|
||||||
|
</Price>
|
||||||
|
</div>
|
||||||
|
<div itemprop="description">
|
||||||
|
<h4>Top features:</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Unlimited team members</li>
|
||||||
|
<li>Unlimited documents</li>
|
||||||
|
<li>Unlimited version history</li>
|
||||||
|
<li>Email support</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<Notice>
|
||||||
|
Note: Outline is currently in Beta. This plan is currently free
|
||||||
|
until public release in Q1 2019.
|
||||||
|
</Notice>
|
||||||
|
</Plan>
|
||||||
|
</Grid>
|
||||||
|
</Content>
|
||||||
|
<Content>
|
||||||
|
<h2>Self Hosted</h2>
|
||||||
|
<p>Host your own instance on-premise or in the cloud</p>
|
||||||
|
<Grid>
|
||||||
|
<Plan
|
||||||
|
size={{ desktop: 1 / 2 }}
|
||||||
|
itemScope
|
||||||
|
itemType="http://schema.org/Product"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<Name itemprop="name">Open Source</Name>
|
||||||
|
<Price>
|
||||||
|
<span itemprop="priceCurrency" content="USD">
|
||||||
|
$
|
||||||
|
</span>
|
||||||
|
<span itemprop="price">0</span>
|
||||||
|
</Price>
|
||||||
|
</div>
|
||||||
|
<p itemprop="description">
|
||||||
|
Outline’s codebase is open source. If you wish to run the service
|
||||||
|
on your own infrastructure you can do so.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<Button>GitHub</Button>
|
||||||
|
</p>
|
||||||
|
</Plan>
|
||||||
|
<Plan
|
||||||
|
size={{ desktop: 1 / 2 }}
|
||||||
|
itemScope
|
||||||
|
itemType="http://schema.org/Product"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<Name itemprop="name">Enterprise</Name>
|
||||||
|
<Price>
|
||||||
|
<span itemprop="priceCurrency" content="USD">
|
||||||
|
$
|
||||||
|
</span>
|
||||||
|
<span itemprop="price">199</span> <Period>per month</Period>
|
||||||
|
</Price>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p itemprop="description">
|
||||||
|
Run Outline on your own infrastructure. Get dedicated support with
|
||||||
|
setup, maintainence, and product issues.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<Button>Contact Us</Button>
|
||||||
|
</p>
|
||||||
|
</Plan>
|
||||||
|
</Grid>
|
||||||
|
</Content>
|
||||||
</Grid>
|
</Grid>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Plan = styled(Grid.Unit)`
|
||||||
|
padding: 2em 0;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
display: none;
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: ${props => props.theme.smoke};
|
||||||
|
transform: skewX(2deg);
|
||||||
|
z-index: -1;
|
||||||
|
margin: 0 2em;
|
||||||
|
|
||||||
|
${breakpoint('tablet')`
|
||||||
|
display: block;
|
||||||
|
`};
|
||||||
|
}
|
||||||
|
|
||||||
|
${breakpoint('tablet')`
|
||||||
|
padding: 2em 6em;
|
||||||
|
`};
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
li {
|
||||||
|
&:before {
|
||||||
|
content: '✓';
|
||||||
|
margin-right: 6px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: ${props => props.theme.primary};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Name = styled.h3`
|
||||||
|
text-align: center;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Price = styled.h2`
|
||||||
|
text-align: center;
|
||||||
|
font-size: 2.5em;
|
||||||
|
min-height: 90px;
|
||||||
|
margin-top: 0;
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Period = styled.p`
|
||||||
|
font-size: 13px;
|
||||||
|
color: ${props => props.theme.slateDark};
|
||||||
|
`;
|
||||||
|
|||||||
15
server/pages/components/Button.js
Normal file
15
server/pages/components/Button.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
// @flow
|
||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
const Button = styled.a`
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10px 20px;
|
||||||
|
color: ${props => props.theme.white};
|
||||||
|
background: ${props => props.theme.black};
|
||||||
|
border-radius: 4px;
|
||||||
|
font-weight: 600;
|
||||||
|
height: 56px;
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default Button;
|
||||||
@@ -10,7 +10,7 @@ import { fadeAndScaleIn } from '../../../shared/styles/animations';
|
|||||||
import {
|
import {
|
||||||
developers,
|
developers,
|
||||||
changelog,
|
changelog,
|
||||||
features,
|
pricing,
|
||||||
about,
|
about,
|
||||||
integrations,
|
integrations,
|
||||||
privacy,
|
privacy,
|
||||||
@@ -42,18 +42,18 @@ function TopNavigation({ sessions, loggedIn }: Props) {
|
|||||||
<OutlineLogo size={18} fill="#000" /> Outline
|
<OutlineLogo size={18} fill="#000" /> Outline
|
||||||
</Brand>
|
</Brand>
|
||||||
<Menu>
|
<Menu>
|
||||||
<MenuItemDesktop>
|
|
||||||
<a href={features()}>Features</a>
|
|
||||||
</MenuItemDesktop>
|
|
||||||
<MenuItemDesktop>
|
<MenuItemDesktop>
|
||||||
<a href={integrations()}>Integrations</a>
|
<a href={integrations()}>Integrations</a>
|
||||||
</MenuItemDesktop>
|
</MenuItemDesktop>
|
||||||
|
<MenuItem>
|
||||||
|
<a href={pricing()}>Pricing</a>
|
||||||
|
</MenuItem>
|
||||||
<MenuItemDesktop>
|
<MenuItemDesktop>
|
||||||
<a href={changelog()}>Changelog</a>
|
<a href={changelog()}>Changelog</a>
|
||||||
</MenuItemDesktop>
|
</MenuItemDesktop>
|
||||||
<MenuItem>
|
<MenuItemDesktop>
|
||||||
<a href={developers()}>API</a>
|
<a href={developers()}>API</a>
|
||||||
</MenuItem>
|
</MenuItemDesktop>
|
||||||
{loggedIn ? (
|
{loggedIn ? (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
{process.env.SUBDOMAINS_ENABLED === 'true' &&
|
{process.env.SUBDOMAINS_ENABLED === 'true' &&
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// @flow
|
// @flow
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
|
import Button from './Button';
|
||||||
import { signin } from '../../../shared/utils/routeHelpers';
|
import { signin } from '../../../shared/utils/routeHelpers';
|
||||||
import Flex from '../../../shared/components/Flex';
|
import Flex from '../../../shared/components/Flex';
|
||||||
import GoogleLogo from '../../../shared/components/GoogleLogo';
|
import GoogleLogo from '../../../shared/components/GoogleLogo';
|
||||||
@@ -71,17 +72,6 @@ const Spacer = styled.span`
|
|||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const Button = styled.a`
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
padding: 10px 20px;
|
|
||||||
color: ${props => props.theme.white};
|
|
||||||
background: ${props => props.theme.black};
|
|
||||||
border-radius: 4px;
|
|
||||||
font-weight: 600;
|
|
||||||
height: 56px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const LastLogin = styled.p`
|
const LastLogin = styled.p`
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
|||||||
@@ -57,6 +57,10 @@ export function features(): string {
|
|||||||
return `${process.env.URL}/#features`;
|
return `${process.env.URL}/#features`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function pricing(): string {
|
||||||
|
return `${process.env.URL}/pricing`;
|
||||||
|
}
|
||||||
|
|
||||||
export function developers(): string {
|
export function developers(): string {
|
||||||
return `${process.env.URL}/developers`;
|
return `${process.env.URL}/developers`;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user