Changelog
We’re building in public. Here’s what we’ve been changing recently.
diff --git a/server/pages/Home.js b/server/pages/Home.js
index a7f49386..597a8e3d 100644
--- a/server/pages/Home.js
+++ b/server/pages/Home.js
@@ -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;
diff --git a/server/pages/Integration.js b/server/pages/Integration.js
new file mode 100644
index 00000000..97e6c99a
--- /dev/null
+++ b/server/pages/Integration.js
@@ -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 (
+
+
+ {integation.name} Integration
+
+
+ {integation.name} Integration
+ {integation.description}
+
+
+
+
+
+
+ );
+}
diff --git a/server/pages/Integrations.js b/server/pages/Integrations.js
new file mode 100644
index 00000000..7b972379
--- /dev/null
+++ b/server/pages/Integrations.js
@@ -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 (
+
+
+ Integrations
+
+
+
+ {map(categories, (integrations, category) => (
+
+
{category}
+
+ {integrations.map(i => (
+
+
+
+ {i.name}
+ {i.description}
+
+
+ ))}
+
+
+ ))}
+
+
+ );
+}
+
+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;
diff --git a/server/pages/components/Header.js b/server/pages/components/Header.js
index 64a22b45..49747413 100644
--- a/server/pages/components/Header.js
+++ b/server/pages/components/Header.js
@@ -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 (
-
+
{children}
);
@@ -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;
diff --git a/server/pages/components/IntegrationMenu.js b/server/pages/components/IntegrationMenu.js
new file mode 100644
index 00000000..ac018898
--- /dev/null
+++ b/server/pages/components/IntegrationMenu.js
@@ -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 (
+
+ );
+}
diff --git a/server/pages/components/Navigation.js b/server/pages/components/Navigation.js
index 84308237..20bd4713 100644
--- a/server/pages/components/Navigation.js
+++ b/server/pages/components/Navigation.js
@@ -11,6 +11,7 @@ import {
changelog,
features,
about,
+ integrations,
privacy,
githubUrl,
twitterUrl,
@@ -42,14 +43,11 @@ function TopNavigation({ sessions, loggedIn }: Props) {
Features
- About
+ Integrations
Changelog
-
- Twitter
-
@@ -109,6 +107,9 @@ function BottomNavigation() {
+
);
}
@@ -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);
}
}
diff --git a/server/routes.js b/server/routes.js
index b0378c4d..50ef5cb6 100644
--- a/server/routes.js
+++ b/server/routes.js
@@ -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, ));
router.get('/pricing', ctx => renderpage(ctx, ));
router.get('/developers', ctx => renderpage(ctx, ));
router.get('/privacy', ctx => renderpage(ctx, ));
+router.get('/integrations/:slug', ctx =>
+ renderpage(ctx, )
+);
+router.get('/integrations', ctx => renderpage(ctx, ));
router.get('/changelog', async ctx => {
const data = await fetch(
'https://api.github.com/repos/outline/outline/releases'
diff --git a/shared/styles/base.js b/shared/styles/base.js
index a69e38e0..c6d722ee 100644
--- a/shared/styles/base.js
+++ b/shared/styles/base.js
@@ -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;
diff --git a/shared/utils/routeHelpers.js b/shared/utils/routeHelpers.js
index a1d761df..623ff511 100644
--- a/shared/utils/routeHelpers.js
+++ b/shared/utils/routeHelpers.js
@@ -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`;
}