- UUID - id field of the document
+ UUID - id field of the document
URI identifier - Human readable identifier used in Outline
- URLs (e.g. outline-api-i48ZEZc5zjXndcP)
+ URLs (e.g. outline-api-i48ZEZc5zjXndcP)
@@ -360,14 +225,14 @@ export default function Pricing() {
This method allows you to publish a new document under an existing
collection. By default a document is set to the parent collection
root. If you want to create a subdocument, you can pass{' '}
- parentDocument to set parent document.
+ parentDocument to set parent document.
- ID of the collection to which the document is
+ ID of the collection to which the document is
created
}
@@ -387,7 +252,7 @@ export default function Pricing() {
id="parentDocument"
description={
- ID of the parent document within the collection
+ ID of the parent document within the collection
}
/>
@@ -395,7 +260,7 @@ export default function Pricing() {
id="publish"
description={
- true by default. Pass false to
+ true by default. Pass false to
create a draft.
}
@@ -422,7 +287,7 @@ export default function Pricing() {
id="publish"
description={
- Pass true to publish a draft.
+ Pass true to publish a draft.
}
/>
@@ -430,7 +295,7 @@ export default function Pricing() {
id="autosave"
description={
- Pass true to signify an autosave. This skips
+ Pass true to signify an autosave. This skips
creating a revision.
}
@@ -439,7 +304,7 @@ export default function Pricing() {
id="done"
description={
- Pass true to signify the end of an editing
+ Pass true to signify the end of an editing
session. This will trigger documents.update hooks.
}
@@ -630,14 +495,6 @@ export default function Pricing() {
-
-
- List team`s users. This endpoint is only available for admin
- users.
-
-
-
-
List all your currently shared document links.
@@ -666,13 +523,22 @@ export default function Pricing() {
-
+
);
}
-const MethodList = styled.ul`
- margin-bottom: 80px;
+const MenuItem = styled.a`
+ display: flex;
+ align-items: center;
+ font-size: 16px;
+ color: ${props => props.theme.text};
+`;
+
+const List = styled.ul`
+ list-style: none;
+ margin: 0;
+ padding: 0;
`;
const Methods = (props: { children: React.Node }) => {
@@ -680,16 +546,26 @@ const Methods = (props: { children: React.Node }) => {
const methods = children.map(child => child.props.method);
return (
-
);
+
const PaginationArguments = () => [
,
,
diff --git a/server/pages/developers/index.js b/server/pages/developers/index.js
new file mode 100644
index 000000000..a9afed8dd
--- /dev/null
+++ b/server/pages/developers/index.js
@@ -0,0 +1,169 @@
+// @flow
+import * as React from 'react';
+import Grid from 'styled-components-grid';
+import { Helmet } from 'react-helmet';
+import styled from 'styled-components';
+import Header from '../components/Header';
+import Content from '../components/Content';
+
+export default function Pricing() {
+ return (
+
+
+ Developers - Outline
+
+
+
Developers
+
Outline is built on an open, best-in-class, API
+
+
+
+
+
+
+
+
+ As developers, it’s our mission to make the API as great as
+ possible. While Outline is still in public beta, we might make
+ small adjustments, including breaking changes to the API.
+
+
+
Making requests
+
+ Outline’s API follows simple RPC style conventions where each API
+ endpoint is a method on{' '}
+ https://www.getoutline.com/api/<METHOD>. Both{' '}
+ GET and POST methods are supported but
+ it’s recommeded that you make all call using POST.
+ Only HTTPS is supported in production.
+
+
+
+ For GET requests query string parameters are expected
+ (e.g.
+ /api/document.info?id=...&token=...). When making{' '}
+ POST requests, request parameters are parsed
+ depending on Content-Type header. To make a call
+ using JSON payload, one must pass{' '}
+ Content-Type: application/json header:
+
+ To access private API endpoints, you must provide a valid API key.
+ You can create new API keys in your{' '}
+ account settings. Be
+ careful when handling your keys as they give access to all of your
+ documents.
+
+
+
+ To authenticate with Outline API, you can supply the API key as a
+ header (Authorization: Bearer YOUR_API_KEY) or as
+ part of the payload using token parameter. If you’re
+ making GET requests, header based authentication is
+ recommended so that your keys don’t leak into logs.
+
+
+
+ Some API endpoints allow unauhenticated requests for public
+ resources and they can be called without an API key.
+
+
+
Errors
+
+
+ All successful API requests will be returned with 200{' '}
+ status code and ok: true in the response payload. If
+ there’s an error while making the request, appropriate status code
+ is returned with the error message:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/server/pages/integrations/Menu.js b/server/pages/integrations/Menu.js
new file mode 100644
index 000000000..87428cc72
--- /dev/null
+++ b/server/pages/integrations/Menu.js
@@ -0,0 +1,57 @@
+// @flow
+import * as React from 'react';
+import styled from 'styled-components';
+import { map, groupBy } from 'lodash';
+
+type Props = {
+ integrations: *,
+ active: string,
+};
+
+export default function IntegrationMenu({ integrations, active }: Props) {
+ const categories = groupBy(integrations, i => i.category);
+
+ return (
+
+ );
+}
+
+const MenuItem = styled.a`
+ display: flex;
+ align-items: center;
+ font-size: 16px;
+ font-weight: ${props => (props.active ? '600' : 'inherit')};
+ color: ${props => props.theme.text};
+`;
+
+const Logo = styled.img`
+ user-select: none;
+ height: 18px;
+ border-radius: 2px;
+ margin-right: 8px;
+`;
+
+const List = styled.ul`
+ list-style: none;
+ margin: 0;
+ padding: 0;
+`;
diff --git a/server/pages/integrations/airtable.md b/server/pages/integrations/airtable.md
new file mode 100644
index 000000000..ebe3c5059
--- /dev/null
+++ b/server/pages/integrations/airtable.md
@@ -0,0 +1,7 @@
+In an Outline document, paste a share link to an [Airtable](https://airtable.com) table and it will be immediately converted into an interactive, live embed.
+
+Embedding a table in your knowledge base will stay upto date with your original data source automatically.
+
+
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/codepen.md b/server/pages/integrations/codepen.md
new file mode 100644
index 000000000..f6edae4fb
--- /dev/null
+++ b/server/pages/integrations/codepen.md
@@ -0,0 +1,5 @@
+In an Outline document, paste a share link to a [Codepen](https://codepen.io) card and it will be immediately converted into an embedded version where you can view the source or the result.
+
+Pen's can be anything from a simple code snippet, to an embedded 3D graphic, visualization and more.
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/content.json b/server/pages/integrations/content.json
new file mode 100644
index 000000000..130ee3c3c
--- /dev/null
+++ b/server/pages/integrations/content.json
@@ -0,0 +1,100 @@
+[
+ {
+ "slug": "figma",
+ "name": "Figma",
+ "url": "https://figma.com",
+ "category": "Design",
+ "description": "Figma is a collaborative interface design tool"
+ },
+ {
+ "slug": "framer",
+ "name": "Framer",
+ "url": "https://framer.com",
+ "category": "Design",
+ "description": "Framer is an interactive design and prototyping tool"
+ },
+ {
+ "slug": "invision",
+ "name": "InVision",
+ "url": "https://invision.com",
+ "category": "Design",
+ "description": "InVision is an online design and prototyping tool"
+ },
+ {
+ "slug": "marvel",
+ "name": "Marvel",
+ "url": "https://marvelapp.com",
+ "category": "Design",
+ "description": "The all-in-one platform powering design"
+ },
+ {
+ "slug": "airtable",
+ "name": "Airtable",
+ "url": "https://airtable.com",
+ "category": "Collaboration",
+ "description": "Part spreadsheet, part database, and entirely flexible"
+ },
+ {
+ "slug": "lucidchart",
+ "name": "Lucidchart",
+ "url": "https://lucidchart.com",
+ "category": "Collaboration",
+ "description": "Create flowcharts and technical diagrams with ease"
+ },
+ {
+ "slug": "realtime-board",
+ "name": "Realtime Board",
+ "url": "https://realtimeboard.com",
+ "category": "Collaboration",
+ "description": "Simple whiteboarding for cross-functional team collaboration"
+ },
+ {
+ "slug": "slack",
+ "name": "Slack",
+ "url": "https://slack.com",
+ "category": "Collaboration",
+ "description": "Chat, collaboration, and file sharing for teams"
+ },
+ {
+ "slug": "trello",
+ "name": "Trello",
+ "url": "https://trello.com",
+ "category": "Collaboration",
+ "description": "Boards, lists, and cards to organize your projects"
+ },
+ {
+ "slug": "typeform",
+ "name": "Typeform",
+ "url": "https://typeform.com",
+ "category": "Collaboration",
+ "description": "Data collection tool and surveys, for professionals"
+ },
+ {
+ "slug": "codepen",
+ "name": "Codepen",
+ "url": "https://codepen.io",
+ "category": "Developers",
+ "description": "A social development environment and editor"
+ },
+ {
+ "slug": "github-gist",
+ "name": "GitHub Gist",
+ "url": "https://gist.github.com",
+ "category": "Developers",
+ "description": "Sharable code snippets, hosted by GitHub"
+ },
+ {
+ "slug": "mode-analytics",
+ "name": "Mode Analytics",
+ "url": "https://modeanalytics.com",
+ "category": "Developers",
+ "description": "Connect and analyze data from any data source"
+ },
+ {
+ "slug": "numeracy",
+ "name": "Numeracy",
+ "url": "https://numeracy.io",
+ "category": "Developers",
+ "description": "A SQL pad for writing, iterating, and exploring data"
+ }
+]
\ No newline at end of file
diff --git a/server/pages/integrations/figma.md b/server/pages/integrations/figma.md
new file mode 100644
index 000000000..407a31686
--- /dev/null
+++ b/server/pages/integrations/figma.md
@@ -0,0 +1,7 @@
+In an Outline document, paste a link to a [Figma](https://figma.com) design and we will instantly convert it to an interactive, live preview.
+
+Because Figma is an online design tool you can see design work happening in realtime, right within Outline. Embed design specs, product designs, or marketing materials easily.
+
+
+
+> This integration works without any additional settings or authentication.
\ No newline at end of file
diff --git a/server/pages/integrations/framer.md b/server/pages/integrations/framer.md
new file mode 100644
index 000000000..1d9ea984c
--- /dev/null
+++ b/server/pages/integrations/framer.md
@@ -0,0 +1,7 @@
+In an Outline document, paste a link to a [Framer](https://framer.com) design or prototype hosted on Framer Cloud and it will be instantly turned into an interactive, live preview.
+
+Host your prototypes, designs, and mocks inside Outline to document your product or design system. [Learn more about sharing links](https://blog.framer.com/framer-cloud-access-d6bdb192510d) with Framer cloud.
+
+
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/github-gist.md b/server/pages/integrations/github-gist.md
new file mode 100644
index 000000000..696256d0b
--- /dev/null
+++ b/server/pages/integrations/github-gist.md
@@ -0,0 +1,5 @@
+In an Outline document, paste a link to a public [Gist](https://gist.github.com) and it will be immediately converted into an embedded version. Embedding code in your knowledge base is a great way to document best practices.
+
+Outline also supports native code blocks, simply start a line with three backticks (```) to create a code block with syntax highlighting.
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/index.js b/server/pages/integrations/index.js
new file mode 100644
index 000000000..698de4137
--- /dev/null
+++ b/server/pages/integrations/index.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 './content';
+
+const categories = groupBy(integrations, i => i.category);
+
+function Integrations() {
+ return (
+
+
+ Integrations
+
+
+
Integrations
+
+ Outline is designed to integrate with your existing workflow and
+ tools.
+
+ ))}
+
+
+ );
+}
+
+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/integrations/invision.md b/server/pages/integrations/invision.md
new file mode 100644
index 000000000..a05b98265
--- /dev/null
+++ b/server/pages/integrations/invision.md
@@ -0,0 +1,7 @@
+In an Outline document, paste a share link to an [InVision](https://invision.com) prototype and it will be immediately converted into an interactive, live embed.
+
+Embedding prototypes in your knowledge base is a great way to create product specs or document user feedback. [Learn more about sharing links](https://support.invisionapp.com/hc/en-us/sections/200697249-Sharing-Prototypes) from InVision.
+
+
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/lucidchart.md b/server/pages/integrations/lucidchart.md
new file mode 100644
index 000000000..56040c6c1
--- /dev/null
+++ b/server/pages/integrations/lucidchart.md
@@ -0,0 +1,7 @@
+In an Outline document, paste a share link to a [Lucidchart](https://lucidchart.com) diagram or chart and it will be immediately converted into an interactive embedded version.
+
+Embed diagrams in your knowledge base to commuicate flows, technical diagrams, and more alongside your written documentation
+
+
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/marvel.md b/server/pages/integrations/marvel.md
new file mode 100644
index 000000000..04e70916c
--- /dev/null
+++ b/server/pages/integrations/marvel.md
@@ -0,0 +1,7 @@
+In an Outline document, paste a share link to a [Marvel](https://marvelapp.com) prototype and it will be immediately converted into an interactive, live embed.
+
+Embedding prototypes in your knowledge base is a great way to create product specs with engineers or document user feedback.
+
+
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/mode-analytics.md b/server/pages/integrations/mode-analytics.md
new file mode 100644
index 000000000..affa50600
--- /dev/null
+++ b/server/pages/integrations/mode-analytics.md
@@ -0,0 +1,3 @@
+In an Outline document, paste a link to a public [Mode Analytics](https://modeanalytics.com) report and it will be converted into an interactive, embedded graph or table. Embedded graphs are perfect for communicating business metrics and KPI's.
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/numeracy.md b/server/pages/integrations/numeracy.md
new file mode 100644
index 000000000..51d7b86f3
--- /dev/null
+++ b/server/pages/integrations/numeracy.md
@@ -0,0 +1,5 @@
+In an Outline document, paste a link to any [Numeracy](https://numeracy.co) chart and it will be converted into an interactive, embedded chart or table. Embedding graphs are perfect for communicating business metrics and KPI's.
+
+
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/realtime-board.md b/server/pages/integrations/realtime-board.md
new file mode 100644
index 000000000..fd99b0784
--- /dev/null
+++ b/server/pages/integrations/realtime-board.md
@@ -0,0 +1,7 @@
+In an Outline document, paste a share link to a [Realtime Board](https://realtimeboard.com/) whiteboard and it will be immediately converted into a realtime, interactive embed.
+
+Embedded whiteboards in your knowledge base to commuicate plans and ideas, technical diagrams, designs, timelines and more alongside your written documentation
+
+
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/slack.md b/server/pages/integrations/slack.md
new file mode 100644
index 000000000..e01d1de8b
--- /dev/null
+++ b/server/pages/integrations/slack.md
@@ -0,0 +1,20 @@
+## Sign In with Slack
+
+Sign In with Slack means your team doesn't have to worry about invites, passwords, or managing new team members. Everyone on your team can login with their existing Slack account and will automatically join your private knowledgebase.
+
+> Note: Your team will also get a matching custom subdomain that you can link to from elsewhere.
+
+
+## Search your Knowledgebase
+
+Optionally [Connect to Slack](https://www.getoutline.com/settings/integrations/slack) to enable the `/outline` slack command. Once enabled team members can easily search your wiki from within Slack by typing `/outline search term`.
+
+
+
+## Notifications
+
+Outline can optionally post into any Slack #channel when documents are created or edited. You can also choose to route notifications based on the Collection.
+
+
+
+> To setup channel notifications head to [your integration settings](https://www.getoutline.com/settings/integrations/slack) in the Outline admin
diff --git a/server/pages/integrations/trello.md b/server/pages/integrations/trello.md
new file mode 100644
index 000000000..fcd0bcfb4
--- /dev/null
+++ b/server/pages/integrations/trello.md
@@ -0,0 +1,5 @@
+In an Outline document, paste a share link to a [Trello](https://trello.com) card and it will be immediately converted into an embedded preview.
+
+Embed trello cards in your knowledge base to commuicate roadmap items, ideas, and more alongside your written documentation. Not sure how? [Learn more about sharing from Trello](https://help.trello.com/article/824-sharing-links-to-cards-and-boards).
+
+> This integration works without any additional settings or authentication.
diff --git a/server/pages/integrations/typeform.md b/server/pages/integrations/typeform.md
new file mode 100644
index 000000000..d44aef076
--- /dev/null
+++ b/server/pages/integrations/typeform.md
@@ -0,0 +1,5 @@
+In an Outline document, paste a share link to a [Typeform survey](https://typeform.com) and it will be immediately converted into an embedded version of the survey. All you have to do is share the doc and wait for responses to roll in.
+
+
+
+> This integration works without any additional settings or authentication.
diff --git a/server/routes.js b/server/routes.js
index b0378c4d8..303d4b001 100644
--- a/server/routes.js
+++ b/server/routes.js
@@ -1,5 +1,7 @@
// @flow
import * as React from 'react';
+import fs from 'fs-extra';
+import { find } from 'lodash';
import path from 'path';
import Koa from 'koa';
import Router from 'koa-router';
@@ -18,7 +20,11 @@ import About from './pages/About';
import Changelog from './pages/Changelog';
import Privacy from './pages/Privacy';
import Pricing from './pages/Pricing';
-import Api from './pages/Api';
+import Integrations from './pages/integrations';
+import integrations from './pages/integrations/content';
+import Integration from './pages/integrations/Integration';
+import Developers from './pages/developers';
+import Api from './pages/developers/Api';
import SubdomainSignin from './pages/SubdomainSignin';
const isProduction = process.env.NODE_ENV === 'production';
@@ -34,7 +40,11 @@ const renderapp = async ctx => {
};
// serve static assets
-koa.use(serve(path.resolve(__dirname, '../public')));
+koa.use(
+ serve(path.resolve(__dirname, '../public'), {
+ maxage: 60 * 60 * 24 * 30 * 1000,
+ })
+);
router.get('/_health', ctx => (ctx.body = 'OK'));
@@ -54,8 +64,24 @@ if (process.env.NODE_ENV === 'production') {
// static pages
router.get('/about', ctx => renderpage(ctx, ));
router.get('/pricing', ctx => renderpage(ctx, ));
-router.get('/developers', ctx => renderpage(ctx, ));
+router.get('/developers', ctx => renderpage(ctx, ));
+router.get('/developers/api', ctx => renderpage(ctx, ));
router.get('/privacy', ctx => renderpage(ctx, ));
+router.get('/integrations/:slug', async ctx => {
+ const slug = ctx.params.slug;
+ const integration = find(integrations, i => i.slug === slug);
+ if (!integration) throw new Error('Not found');
+
+ const content = await fs.readFile(
+ path.resolve(__dirname, `pages/integrations/${slug}.md`)
+ );
+
+ return 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/components/OutlineLogo.js b/shared/components/OutlineLogo.js
new file mode 100644
index 000000000..c35510f11
--- /dev/null
+++ b/shared/components/OutlineLogo.js
@@ -0,0 +1,25 @@
+// @flow
+import * as React from 'react';
+
+type Props = {
+ size?: number,
+ fill?: string,
+ className?: string,
+};
+
+function OutlineLogo({ size = 32, fill = '#333', className }: Props) {
+ return (
+
+ );
+}
+
+export default OutlineLogo;
diff --git a/shared/components/OutlineLogo/index.js b/shared/components/OutlineLogo/index.js
deleted file mode 100644
index 8bbc2f850..000000000
--- a/shared/components/OutlineLogo/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// @flow
-import * as React from 'react';
-import logo from './logo.png';
-
-function OutlineLogo() {
- return ;
-}
-
-export default OutlineLogo;
diff --git a/shared/components/OutlineLogo/logo.png b/shared/components/OutlineLogo/logo.png
deleted file mode 100644
index 59fc4a62b..000000000
Binary files a/shared/components/OutlineLogo/logo.png and /dev/null differ
diff --git a/shared/styles/base.js b/shared/styles/base.js
index a69e38e01..d07806396 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;
@@ -71,8 +77,8 @@ export default `
hr {
border: 0;
- height: 0;
- border-top: 1px solid rgba(0, 0, 0, 0.1);
- border - bottom: 1px solid rgba(255, 255, 255, 0.3);
-}
+ height: 0;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3);
+ }
`;
diff --git a/shared/utils/routeHelpers.js b/shared/utils/routeHelpers.js
index a1d761dfd..623ff511c 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`;
}