Adding content pages [wip]

This commit is contained in:
Tom Moor 2018-12-20 07:19:05 -08:00
parent 3a9a5f5ed3
commit 6ebb652481
31 changed files with 322 additions and 19 deletions

Binary file not shown.

BIN
public/images/airtable.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
public/images/codepen.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
public/images/figma.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
public/images/framer.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
public/images/github-gist.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
public/images/invision.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
public/images/loom.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
public/images/lucidchart.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
public/images/marvel.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
public/images/mode-analytics.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
public/images/numeracy.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
public/images/realtime-board.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
public/images/slack.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
public/images/trello.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
public/images/typeform.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
public/images/vimeo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
public/images/youtube.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,138 @@
[
{
"slug": "figma",
"name": "Figma",
"url": "https://figma.com",
"category": "Design",
"description": "Figma is a collaborative interface design tool",
"content": "Embed interactive Figma designs into your Outline docs. Paste a link to a Figma public share link to instantly convert into a rich preview."
},
{
"slug": "framer",
"name": "Framer",
"url": "https://framer.com",
"category": "Design",
"description": "Framer is an interactive design and prototyping tool",
"content": "Embed interactive Framer prototypes into your Outline docs. Paste a link to a Framer cloud link to instantly convert into an interactive embed."
},
{
"slug": "invision",
"name": "InVision",
"url": "https://invision.com",
"category": "Design",
"description": "InVision is an online design and prototyping tool",
"content": "Embed interactive InVision prototypes into your Outline docs. Paste an InVision share link to instantly convert into an interactive prototype."
},
{
"slug": "marvel",
"name": "Marvel",
"url": "https://marvelapp.com",
"category": "Design",
"description": "The all-in-one platform powering design",
"content": "Marvel prototypes inside your Outline docs. Paste a Marvel link to instantly convert into an interactive prototype."
},
{
"slug": "airtable",
"name": "Airtable",
"url": "https://airtable.com",
"category": "Collaboration",
"description": "Part spreadsheet, part database, and entirely flexible",
"content": "Embed interactive tables into your Outline docs. Paste a link to an Airtable public share link to instantly convert into a rich preview."
},
{
"slug": "lucidchart",
"name": "Lucidchart",
"url": "https://lucidchart.com",
"category": "Collaboration",
"description": "Create flowcharts and technical diagrams with ease",
"content": "Embed an interactive chart inside your Outline doc. Paste a link to any shared Lucidchart to instantly convert into a rich preview."
},
{
"slug": "realtime-board",
"name": "Realtime Board",
"url": "https://realtimeboard.com",
"category": "Collaboration",
"description": "Simple whiteboarding for cross-functional team collaboration",
"content": "Embed an interactive whiteboard inside your Outline doc. Paste a link to any shared Realtime Board to instantly convert to a board."
},
{
"slug": "slack",
"name": "Slack",
"url": "https://slack.com",
"category": "Collaboration",
"description": "Chat, collaboration, and file sharing for teams",
"content": ""
},
{
"slug": "trello",
"name": "Trello",
"url": "https://trello.com",
"category": "Collaboration",
"description": "Boards, lists, and cards to organize your projects",
"content": ""
},
{
"slug": "typeform",
"name": "Typeform",
"url": "https://typeform.com",
"category": "Collaboration",
"description": "Data collection tool and surveys, for professionals",
"content": ""
},
{
"slug": "codepen",
"name": "Codepen",
"url": "https://codepen.io",
"category": "Developers",
"description": "A social development environment and editor",
"content": ""
},
{
"slug": "github-gist",
"name": "GitHub Gist",
"url": "https://gist.github.com",
"category": "Developers",
"description": "Sharable code snippets, hosted by GitHub",
"content": ""
},
{
"slug": "numeracy",
"name": "Numeracy",
"url": "https://numeracy.io",
"category": "Developers",
"description": "A SQL pad for writing, iterating, and exploring data",
"content": ""
},
{
"slug": "mode-analytics",
"name": "Mode Analytics",
"url": "https://modeanalytics.com",
"category": "Developers",
"description": "Connect and analyze data from anywhere",
"content": ""
},
{
"slug": "loom",
"name": "Loom",
"url": "https://useloom.com",
"category": "Media",
"description": "Get your message across with instantly shareable videos",
"content": ""
},
{
"slug": "youtube",
"name": "YouTube",
"url": "https://youtube.com",
"category": "Media",
"description": "A popular little website for sharing videos",
"content": ""
},
{
"slug": "vimeo",
"name": "Vimeo",
"url": "https://vimeo.com",
"category": "Media",
"description": "A customizable and embeddable video player",
"content": ""
}
]

View File

@ -38,7 +38,7 @@ export default function About() {
<Helmet>
<title>About Us</title>
</Helmet>
<Header>
<Header background="#F22C5F">
<h1>About Us</h1>
<p>The team behind Outline</p>
</Header>

View File

@ -60,7 +60,7 @@ export default function Pricing() {
<Helmet>
<title>API Documentation - Outline</title>
</Helmet>
<Header>
<Header background="#AA34F0">
<h1>Documentation</h1>
<p>The API is the heart and soul of Outline.</p>
</Header>

View File

@ -21,7 +21,7 @@ function Changelog({ releases }: { releases: Release[] }) {
<Helmet>
<title>Changelog</title>
</Helmet>
<Header>
<Header background="#00ADFF">
<h1>Changelog</h1>
<p>
Were building in public. Heres what weve been changing recently.

View File

@ -166,7 +166,7 @@ const Mask = styled.div`
`;
const Features = styled.div`
background: hsl(180, 58%, 85%);
background: #00adff;
padding: 0 2em;
width: 100%;
`;
@ -200,7 +200,7 @@ const Feature = styled(Grid.Unit)`
`;
const Footer = styled.div`
background: hsl(127, 58%, 85%);
background: #aa34f0;
text-align: left;
width: 100%;
padding: 4em 2em;
@ -210,6 +210,10 @@ const Footer = styled.div`
margin-top: 0;
}
p {
margin-bottom: 0;
}
${breakpoint('tablet')`
margin: 2em 0;
padding: 6em 4em;

View File

@ -0,0 +1,29 @@
// @flow
import * as React from 'react';
import { find } from 'lodash';
import Grid from 'styled-components-grid';
import { Helmet } from 'react-helmet';
import Header from './components/Header';
import Content from './components/Content';
import IntegrationMenu from './components/IntegrationMenu';
import integrations from '../config/integrations';
export default function Integration({ slug }: { slug: string }) {
const integation = find(integrations, i => i.slug === slug);
return (
<Grid>
<Helmet>
<title>{integation.name} Integration</title>
</Helmet>
<Header>
<h1>{integation.name} Integration</h1>
<p>{integation.description}</p>
</Header>
<Content>
<IntegrationMenu integrations={integrations} />
<div />
</Content>
</Grid>
);
}

View File

@ -0,0 +1,77 @@
// @flow
import * as React from 'react';
import { map, groupBy } from 'lodash';
import styled from 'styled-components';
import Grid from 'styled-components-grid';
import { Helmet } from 'react-helmet';
import Header from './components/Header';
import Content from './components/Content';
import integrations from '../config/integrations';
const categories = groupBy(integrations, i => i.category);
function Integrations() {
return (
<Grid>
<Helmet>
<title>Integrations</title>
</Helmet>
<Header background="#FFB500">
<h1>Integrations</h1>
<p>
Outline is designed to integrate with your existing workflow and
tools.
</p>
</Header>
<Content>
{map(categories, (integrations, category) => (
<div key={category}>
<h2>{category}</h2>
<Category>
{integrations.map(i => (
<Grid.Unit size={{ desktop: 1 / 4 }} key={i.slug}>
<Integration href={`/integrations/${i.slug}`}>
<Logo src={`/images/${i.slug}.png`} alt={i.name} />
<h3>{i.name}</h3>
<p>{i.description}</p>
</Integration>
</Grid.Unit>
))}
</Category>
</div>
))}
</Content>
</Grid>
);
}
const Logo = styled.img`
height: 60px;
border-radius: 4px;
`;
const Category = styled(Grid)`
margin: 0 -1em;
`;
const Integration = styled.a`
display: block;
padding: 2em 2em 1em;
margin: 1em;
border-radius: 4px;
border: 2px solid ${props => props.theme.slateLight};
color: ${props => props.theme.text};
font-size: 16px;
transition: background 200ms ease-in-out;
h3,
p {
margin: 0.5em 0;
}
&:hover {
background: ${props => props.theme.slateLight};
}
`;
export default Integrations;

View File

@ -1,15 +1,17 @@
// @flow
import * as React from 'react';
import breakpoint from 'styled-components-breakpoint';
import styled from 'styled-components';
import Centered from './Centered';
type Props = {
children: React.Node,
background?: string,
};
const Header = ({ children }: Props) => {
const Header = ({ children, background }: Props) => {
return (
<Wrapper>
<Wrapper background={background}>
<Centered>{children}</Centered>
</Wrapper>
);
@ -17,9 +19,13 @@ const Header = ({ children }: Props) => {
const Wrapper = styled.div`
width: 100%;
padding: 2em;
background: ${props => props.theme.contentHeaderBackground};
padding: 8em 0 3em;
margin-top: -70px;
margin-bottom: 2em;
text-align: center;
background: ${props => props.background || 'transparent'};
z-index: -1;
p {
font-size: 22px;
@ -29,9 +35,17 @@ const Wrapper = styled.div`
}
h1 {
font-size: 3.5em;
font-size: 2em;
margin: 0 0 0.1em;
}
${breakpoint('tablet')`
padding: 8em 3em 3em 3em;
h1 {
font-size: 4em;
}
`};
`;
export default Header;

View File

@ -0,0 +1,24 @@
// @flow
import { map, groupBy } from 'lodash';
import * as React from 'react';
export default function IntegrationMenu({ integrations }) {
const categories = groupBy(integrations, i => i.category);
return (
<nav>
{map(categories, (integrations, category) => (
<React.Fragment>
<h3>{category}</h3>
<ul>
{integrations.map(i => (
<li>
<a href={`/integrations/${i.slug}`}>{i.name}</a>
</li>
))}
</ul>
</React.Fragment>
))}
</nav>
);
}

View File

@ -11,6 +11,7 @@ import {
changelog,
features,
about,
integrations,
privacy,
githubUrl,
twitterUrl,
@ -42,14 +43,11 @@ function TopNavigation({ sessions, loggedIn }: Props) {
<a href={features()}>Features</a>
</MenuItemDesktop>
<MenuItemDesktop>
<a href={about()}>About</a>
<a href={integrations()}>Integrations</a>
</MenuItemDesktop>
<MenuItemDesktop>
<a href={changelog()}>Changelog</a>
</MenuItemDesktop>
<MenuItemDesktop>
<a href={twitterUrl()}>Twitter</a>
</MenuItemDesktop>
<MenuItem>
<a href={developers()}>API</a>
</MenuItem>
@ -109,6 +107,9 @@ function BottomNavigation() {
<div>
<a href={privacy()}>Privacy</a>
</div>
<div>
<a href={about()}>About</a>
</div>
</BottomNav>
);
}
@ -118,11 +119,11 @@ const MenuLinkStyle = props => `
font-weight: 500;
a {
color: ${props.theme.slate};
color: rgba(0, 0, 0, 0.6);
}
a:hover {
color: ${props.theme.slateDark};
color: rgba(0, 0, 0, 0.4);
text-decoration: underline;
}
`;
@ -142,17 +143,17 @@ const MenuItem = styled.li`
props.highlighted &&
`
position: relative;
border: 2px solid ${props.theme.slate};
border: 2px solid rgba(0, 0, 0, 0.6);
border-radius: 4px;
padding: 6px 8px;
margin-top: -6px;
margin-bottom: -6px;
&:hover {
border: 2px solid ${props.theme.slateDark};
border: 2px solid rgba(0, 0, 0, 0.4);
> a {
color: ${props.theme.slateDark};
color: rgba(0, 0, 0, 0.4);
}
}

View File

@ -18,6 +18,8 @@ import About from './pages/About';
import Changelog from './pages/Changelog';
import Privacy from './pages/Privacy';
import Pricing from './pages/Pricing';
import Integrations from './pages/Integrations';
import Integration from './pages/Integration';
import Api from './pages/Api';
import SubdomainSignin from './pages/SubdomainSignin';
@ -56,6 +58,10 @@ router.get('/about', ctx => renderpage(ctx, <About />));
router.get('/pricing', ctx => renderpage(ctx, <Pricing />));
router.get('/developers', ctx => renderpage(ctx, <Api />));
router.get('/privacy', ctx => renderpage(ctx, <Privacy />));
router.get('/integrations/:slug', ctx =>
renderpage(ctx, <Integration slug={ctx.params.slug} />)
);
router.get('/integrations', ctx => renderpage(ctx, <Integrations />));
router.get('/changelog', async ctx => {
const data = await fetch(
'https://api.github.com/repos/outline/outline/releases'

View File

@ -2,6 +2,11 @@
import theme from './theme';
export default `
@font-face {
font-family: 'Lato';
src: url('/fonts/LatoLatin-Semibold.woff') format('woff');
}
* {
box-sizing: border-box;
}
@ -46,6 +51,7 @@ export default `
h4,
h5,
h6 {
font-family: 'Lato', -apple-system, BlinkMacSystemFont;
font-weight: 500;
line-height: 1.25;
margin-top: 1em;

View File

@ -73,6 +73,10 @@ export function about(): string {
return `${process.env.URL}/about`;
}
export function integrations(): string {
return `${process.env.URL}/integrations`;
}
export function privacy(): string {
return `${process.env.URL}/privacy`;
}