Feature/website (#5)

* Add basic website
* Add website deploy action
This commit is contained in:
Daniel Lautzenheiser 2022-09-30 08:59:03 -06:00 committed by GitHub
parent de040e6727
commit 27659baca6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
150 changed files with 20752 additions and 7 deletions

16
.github/workflows/website.yml vendored Normal file
View File

@ -0,0 +1,16 @@
name: Website Publish
on:
push:
branches:
- dev
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: enriikke/gatsby-gh-pages-action@v2
with:
access-token: ${{ secrets.ACCESS_TOKEN }}
working-dir: 'website'

View File

@ -1,7 +0,0 @@
[build]
base = "/"
ignore = "git diff --quiet HEAD^ HEAD -- . ':!website/'"
[build.environment]
YARN_FLAGS = "--frozen-lockfile"
YARN_VERSION = "1.22.4"

BIN
simple-cms-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 KiB

14
website/.babelrc Normal file
View File

@ -0,0 +1,14 @@
{
"presets": ["babel-preset-gatsby"],
"plugins": [
[
"prismjs",
{
"languages": ["javascript", "css", "markup", "yaml", "json"],
"plugins": ["line-numbers"],
"theme": "tomorrow",
"css": true
}
]
]
}

3
website/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
.cache
public
dist

View File

@ -0,0 +1,4 @@
{
"default": false,
"MD032": true
}

1
website/.nvmrc Normal file
View File

@ -0,0 +1 @@
--lts

19
website/README.md Normal file
View File

@ -0,0 +1,19 @@
# Simple CMS Website & Docs
This directory builds netlifycms.org. If you'd like to propose changes to the site or docs, you'll find the source files in here.
## Local development
The site is built with [GatsbyJS](https://gatsbyjs.org/).
To run the site locally, you'll need to have [Node](https://nodejs.org) and [Yarn](https://yarnpkg.com/en/) installed on your computer.
From your terminal window, `cd` into the `website` directory of the repo, and run
```bash
yarn
yarn start
```
Then visit http://localhost:8000/ - Gatsby will automatically reload CSS or
refresh the page when stylesheets or content changes.

0
website/data/.keep Normal file
View File

11
website/data/docs.yml Normal file
View File

@ -0,0 +1,11 @@
styleoverrides: '/docs.css'
headline: Netlify builds, deploys, and hosts your front end.
bottomcta:
hook: Want to get started quick?
btns:
- type: primary
btntext: View our Templates
linksto: https://app.netlify.com/signup/templates
- type: secondary
btntext: Read our Tutorials
linksto: /tags/tutorial/

6
website/data/global.yaml Normal file
View File

@ -0,0 +1,6 @@
footer:
buttons:
- name: "Twitter"
url: "https://twitter.com/SimpleCMSOrg"
- name: "GitHub"
url: "https://github.com/SimpleCMS/simple-cms"

41
website/data/landing.yaml Normal file
View File

@ -0,0 +1,41 @@
hero:
headline: "Open source content management for your Git workflow"
subhead: "Use Simple CMS with any static site generator for a faster and more flexible web project"
devfeatures:
- feature: "Static + content management = ♥"
description: "Get the speed, security, and scalability of a static site, while still providing a convenient editing interface for content."
- feature: "An integrated part of your Git workflow"
description: "Content is stored in your Git repository alongside your code for easier versioning, multi-channel publishing, and the option to handle content updates directly in Git."
- feature: "An extensible CMS built on React"
description: "Simple CMS is built as a single-page React app. Create custom-styled previews, UI widgets, and editor plugins or add backends to support different Git platform APIs."
cta:
primaryhook: "Getting started is simple and free."
primary: "Choose a template thats pre-configured with a static site generator and deploys to a global CDN in one click."
button: "[Get started](/docs/start-with-a-template/)"
editors:
hook: "A CMS that developers and content editors can agree on"
intro: "You get to implement modern front end tools to deliver a faster, safer, and more scalable site. Editors get a friendly UI and intuitive workflow that meets their content management requirements."
features:
- feature: "Editor-friendly user interface"
description: "The web-based app includes rich-text editing, real-time preview, and drag-and-drop media uploads."
imgpath: "feature-editor.svg"
- feature: "Intuitive workflow for content teams"
description: "Writers and editors can easily manage content from draft to review to publish across any number of custom content types."
imgpath: "feature-workflow.svg"
- feature: "Instant access without GitHub account"
description: "With [Git Gateway](/docs/git-gateway-backend/#git-gateway-with-netlify-identity), you can add CMS access for any team member — even if they dont have a GitHub account. "
imgpath: "feature-access.svg"
community:
hook: "Supported by a growing community"
features:
- feature: "Built on the Jamstack"
description: "Simple CMS is based on client-side JavaScript, reusable APIs and prebuilt Markup. Compared to server-side CMS like WordPress, this means better performance, higher security, lower cost of scaling, and a better developer experience. You can learn more about the Jamstack on [jamstack.org](https://jamstack.org)."
- feature: "Support when you need it"
description: "Get up and running with comprehensive [documentation](/docs) and templates or work through difficult problems in our [community chat](https://netlifycms.org/chat)."
- feature: "A community-driven project you can help evolve"
description: "Simple CMS is built by a community of more than 100 contributors — and you can help. Read the [contributing guide](/docs/contributor-guide) to join in."
contributors: "Made possible by awesome contributors"

View File

@ -0,0 +1,7 @@
notifications:
- loud: true
message: We have a community chat - join now to ask questions and discuss the
project with other devs!
published: false
title: Chat shoutout
url: https://netlifycms.org/chat

5
website/data/updates.yml Normal file
View File

@ -0,0 +1,5 @@
updates:
- date: 2022-10-30T00:00:00.000Z
version: 1.0.0
description: The first major release of Simple CMS with an all-new UI, revamped
documentation and much more.

View File

@ -0,0 +1,9 @@
// Make scroll behavior of internal links smooth
exports.onClientEntry = () => {
const SmoothScroll = require('smooth-scroll');
new SmoothScroll('a[href*="#"]', {
offset() {
return document.querySelector('#header').offsetHeight;
},
});
};

76
website/gatsby-config.js Normal file
View File

@ -0,0 +1,76 @@
const fs = require('fs');
const yaml = require('js-yaml');
const pkg = require('./package.json');
const staticConfig = yaml.load(fs.readFileSync('./site.yml', 'utf8'));
module.exports = {
siteMetadata: {
title: 'Simple CMS | Open-Source Content Management System',
description: 'Open source content management for your Git workflow',
siteUrl: pkg.homepage,
menu: staticConfig.menu,
},
plugins: [
{
resolve: 'gatsby-plugin-manifest',
options: {
name: 'SimpleCMS',
short_name: 'SimpleCMS',
start_url: '/',
background_color: '#ffffff',
theme_color: '#ffffff',
display: 'standalone',
icon: 'static/img/favicon/icon-512x512.png',
},
},
{
resolve: 'gatsby-source-filesystem',
options: {
path: `${__dirname}/content`,
name: 'content',
},
},
{
resolve: 'gatsby-source-filesystem',
options: {
path: `${__dirname}/data`,
name: 'data',
},
},
{
resolve: 'gatsby-transformer-remark',
options: {
// prettier-ignore
plugins: [
'gatsby-remark-autolink-headers',
{
resolve: "gatsby-remark-external-links",
options: {
target: "_blank",
rel: "noopener noreferrer"
}
},
{
resolve: 'gatsby-remark-prismjs',
options: {
noInlineHighlight: true,
},
},
],
},
},
'gatsby-transformer-yaml',
'gatsby-transformer-json',
'gatsby-plugin-emotion',
'gatsby-plugin-react-helmet',
'gatsby-plugin-catch-links',
{
resolve: 'gatsby-plugin-netlify-cms',
options: {
modulePath: `${__dirname}/src/cms/cms.js`,
},
},
],
};

104
website/gatsby-node.js Normal file
View File

@ -0,0 +1,104 @@
const path = require('path');
const { createFilePath } = require('gatsby-source-filesystem');
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions;
const docPage = path.resolve('./src/templates/doc-page.js');
const blogPost = path.resolve('./src/templates/blog-post.js');
// get all markdown with a frontmatter path field and title
const allMarkdown = await graphql(`
{
allMarkdownRemark(filter: { frontmatter: { title: { ne: null } } }) {
edges {
node {
fields {
slug
}
frontmatter {
title
}
}
}
}
}
`);
if (allMarkdown.errors) {
console.error(allMarkdown.errors); // eslint-disable-line no-console
throw Error(allMarkdown.errors);
}
allMarkdown.data.allMarkdownRemark.edges.forEach(({ node }) => {
const { slug } = node.fields;
let template = docPage;
if (slug.includes('blog/')) {
template = blogPost;
}
createPage({
path: slug,
component: template,
context: {
slug,
},
});
});
};
function pad(n) {
return n >= 10 ? n : `0${n}`;
}
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions;
if (node.internal.type === 'MarkdownRemark') {
const value = createFilePath({ node, getNode });
const { relativePath } = getNode(node.parent);
let slug = value;
if (relativePath.includes('blog/')) {
const date = new Date(node.frontmatter.date);
const year = date.getFullYear();
const month = date.getMonth() + 1;
const filename = path.basename(relativePath, '.md');
slug = `/blog/${year}/${pad(month)}/${filename}`;
createNodeField({
node,
name: 'date',
value: date.toJSON(),
});
}
// used for doc posts
createNodeField({
node,
name: 'slug',
value: slug,
});
// used to create GitHub edit link
createNodeField({
node,
name: 'path',
value: relativePath,
});
}
};
exports.onCreateWebpackConfig = ({ actions }) => {
actions.setWebpackConfig({
resolve: {
extensions: ['.ts', '.tsx', '.js', '.json'],
alias: {
moment$: 'moment/moment.js',
},
},
});
};

53
website/package.json Normal file
View File

@ -0,0 +1,53 @@
{
"name": "simple-cms-site",
"version": "1.0.0",
"description": "Simple CMS documentation website built with Gatsby",
"scripts": {
"start": "gatsby develop",
"build": "gatsby build && rm -rf dist && mv public dist",
"lint": "markdownlint 'content/docs/**/*.md'",
"reset": "rm -rf .cache"
},
"author": "",
"homepage": "https://www.netlifycms.org/",
"license": "MIT",
"dependencies": {
"@emotion/cache": "^10.0.29",
"@emotion/core": "^10.0.35",
"@emotion/styled": "^10.0.27",
"dayjs": "^1.8.23",
"emotion-theming": "^10.0.27",
"gatsby": "3.14.6",
"gatsby-plugin-catch-links": "3.14.0",
"gatsby-plugin-emotion": "^4.0.0",
"gatsby-plugin-manifest": "3.14.0",
"gatsby-plugin-netlify-cms": "5.14.0",
"gatsby-plugin-react-helmet": "4.14.0",
"gatsby-remark-autolink-headers": "4.11.0",
"gatsby-remark-external-links": "^0.0.4",
"gatsby-remark-prismjs": "5.11.0",
"gatsby-source-filesystem": "3.14.0",
"gatsby-transformer-json": "3.14.0",
"gatsby-transformer-remark": "4.11.0",
"gatsby-transformer-yaml": "3.14.0",
"js-yaml": "^4.0.0",
"lodash": "^4.17.15",
"moment": "^2.24.0",
"netlify-cms-app": "^2.15.72",
"prismjs": "^1.21.0",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-github-btn": "^1.1.1",
"react-helmet": "^6.0.0",
"react-markdown": "^6.0.0",
"smooth-scroll": "^16.1.2"
},
"devDependencies": {
"babel-plugin-prismjs": "^2.0.1",
"babel-preset-gatsby": "^1.0.0",
"eslint": "^7.4.0",
"eslint-plugin-import": "^2.20.1",
"markdownlint-cli": "^0.31.0"
},
"private": true
}

22
website/site.yml Normal file
View File

@ -0,0 +1,22 @@
menu:
docs:
- name: Intro
title: Intro to Simple CMS
- name: Accounts
title: Account Settings
- name: Configuration
title: Configuring your Site
- name: Media
title: Media
- name: Workflow
title: Workflow
- name: Collections
title: Collections
- name: Fields
title: Fields
- name: Guides
title: Platform Guides
- name: Customization
title: Customizing Simple CMS
- name: Contributing
title: Community

140
website/src/cms/cms.js Normal file
View File

@ -0,0 +1,140 @@
import React from 'react';
import CMS from 'netlify-cms-app';
import dayjs from 'dayjs';
import Prism from 'prismjs';
import { CacheProvider } from '@emotion/core';
import createCache from '@emotion/cache';
import BlogPostTemplate from '../components/blog-post-template';
import { LayoutTemplate as Layout } from '../components/layout';
import DocsTemplate from '../components/docs-template';
import WidgetDoc from '../components/widget-doc';
import WhatsNew from '../components/whats-new';
import Notification from '../components/notification';
import Community from '../components/community';
import siteConfig from '../../site.yml';
let emotionCache;
function getEmotionCache() {
const previewPaneIframe = document.querySelector('iframe[class*="PreviewPaneFrame"]');
const previewPaneHeadEl = previewPaneIframe.contentWindow.document.querySelector('head');
if (!emotionCache || emotionCache.sheet.container !== previewPaneHeadEl) {
emotionCache = createCache({ container: previewPaneHeadEl });
}
return emotionCache;
}
function PreviewContainer({ children, highlight }) {
return (
<CacheProvider value={getEmotionCache()}>
<Layout>{highlight ? <Highlight>{children}</Highlight> : children}</Layout>
</CacheProvider>
);
}
class Highlight extends React.Component {
constructor(props) {
super(props);
this.ref = React.createRef();
}
highlight() {
setTimeout(() => {
if (this.ref.current) {
Prism.highlightAllUnder(this.ref.current);
}
});
}
componentDidMount() {
this.highlight();
}
componentDidUpdate() {
this.highlight();
}
render() {
return <div ref={this.ref}>{this.props.children}</div>;
}
}
function BlogPostPreview({ entry, widgetFor }) {
const data = entry.get('data');
return (
<PreviewContainer highlight={true}>
<BlogPostTemplate
title={data.get('title')}
author={data.get('author')}
date={dayjs(data.get('date')).format('MMMM D, YYYY')}
body={widgetFor('body')}
/>
</PreviewContainer>
);
}
function CommunityPreview({ entry }) {
const { title, headline, subhead, sections } = entry.get('data').toJS();
return (
<PreviewContainer>
<Community title={title} headline={headline} subhead={subhead} sections={sections} />
</PreviewContainer>
);
}
function DocsPreview({ entry, widgetFor }) {
return (
<PreviewContainer highlight={true}>
<DocsTemplate title={entry.getIn(['data', 'title'])} body={widgetFor('body')} />
</PreviewContainer>
);
}
function WidgetDocPreview({ entry, widgetFor }) {
return (
<PreviewContainer highlight={true}>
<WidgetDoc visible={true} label={entry.get('label')} body={widgetFor('body')} />
</PreviewContainer>
);
}
function ReleasePreview({ entry }) {
return (
<PreviewContainer highlight={true}>
<WhatsNew
updates={entry
.getIn(['data', 'updates'])
.map(release => ({
version: release.get('version'),
date: dayjs(release.get('date')).format('MMMM D, YYYY'),
description: release.get('description'),
}))
.toJS()}
/>
</PreviewContainer>
);
}
function NotificationPreview({ entry }) {
return (
<PreviewContainer>
{entry
.getIn(['data', 'notifications'])
.filter(notif => notif.get('published'))
.map((notif, idx) => (
<Notification key={idx} url={notif.get('url')} loud={notif.get('loud')}>
{notif.get('message')}
</Notification>
))}
</PreviewContainer>
);
}
CMS.registerPreviewTemplate('blog', BlogPostPreview);
siteConfig.menu.docs.forEach(group => {
CMS.registerPreviewTemplate(`docs_${group.name}`, DocsPreview);
});
CMS.registerPreviewTemplate('widget_docs', WidgetDocPreview);
CMS.registerPreviewTemplate('releases', ReleasePreview);
CMS.registerPreviewTemplate('notifications', NotificationPreview);
CMS.registerPreviewTemplate('community', CommunityPreview);

View File

@ -0,0 +1,27 @@
import React from 'react';
import { css } from '@emotion/core';
import Container from './container';
import Markdown from './markdown';
import MetaInfo from './meta-info';
import Page from './page';
export default function BlogPostTemplate({ title, author, date, body, html }) {
return (
<Container size="sm">
<Page as="article">
<h1
css={css`
margin-bottom: 0;
`}
>
{title}
</h1>
<MetaInfo>
by {author} on {date}
</MetaInfo>
<Markdown body={body} html={html} />
</Page>
</Container>
);
}

View File

@ -0,0 +1,34 @@
import { css } from '@emotion/core';
import styled from '@emotion/styled';
import theme from '../theme';
// prettier-ignore
const Button = styled.button`
display: inline-block;
background-image: linear-gradient(0deg, #97bf2f 14%, #4bc9fa 94%);
color: ${theme.colors.darkGray};
border-radius: ${theme.radii[1]};
font-size: ${theme.fontsize[3]};
font-weight: 700;
padding: ${theme.space[2]} ${theme.space[3]};
border: 2px solid ${theme.colors.darkGreen};
cursor: pointer;
${p => p.block && css`
display: block;
width: 100%;
`};
${p => p.outline && css`
background: none;
font-weight: 500;
`};
${p => p.active && css`
background: ${theme.colors.darkGreen};
color: white;
`};
`;
export default Button;

View File

@ -0,0 +1,20 @@
import React from 'react';
import styled from '@emotion/styled';
const ChatLink = styled.a`
z-index: 100;
position: fixed;
bottom: 10px;
right: 10px;
cursor: pointer;
`;
function ChatButton() {
return (
<ChatLink href="/chat" target="_blank" rel="noopener noreferrer">
<img src="/img/slack.svg" />
</ChatLink>
);
}
export default ChatButton;

View File

@ -0,0 +1,59 @@
import React from 'react';
import styled from '@emotion/styled';
import theme from '../theme';
const StyledCommunityChannelsList = styled.ul`
margin-left: 0;
li {
list-style-type: none;
margin-bottom: 24px;
}
a {
display: block;
font-weight: inherit;
position: relative;
&:focus,
&:active,
&:hover {
&:before {
display: block;
}
}
&:before {
display: none;
content: '';
position: absolute;
width: 3px;
height: 100%;
background-color: ${theme.colors.darkGreen};
left: -16px;
}
}
p {
color: ${theme.colors.gray};
margin-bottom: 0;
}
`;
function CommunityChannelsList({ channels }) {
return (
<StyledCommunityChannelsList>
{channels.map(({ title, description, url }, idx) => (
<li key={idx}>
<a href={url} target="_blank" rel="noopener noreferrer">
<strong>{title}</strong>
<p>{description}</p>
</a>
</li>
))}
</StyledCommunityChannelsList>
);
}
export default CommunityChannelsList;

View File

@ -0,0 +1,55 @@
import React from 'react';
import { css } from '@emotion/core';
import Markdownify from './markdownify';
import PageHero from './page-hero';
import HeroTitle from './hero-title';
import Lead from './lead';
import Container from './container';
import SectionLabel from './section-label';
import Page from './page';
import Grid from './grid';
import CommunityChannelsList from './community-channels-list';
import theme from '../theme';
function Community({ headline, subhead, sections }) {
return (
<>
<PageHero>
<div
css={css`
margin-bottom: 20px;
`}
>
<HeroTitle>
<Markdownify source={headline} />
</HeroTitle>
<Lead light>
<Markdownify source={subhead} />
</Lead>
</div>
</PageHero>
<Container>
<Page>
<Grid cols={2}>
<div
css={css`
margin-bottom: ${theme.space[5]};
`}
>
{sections.map(({ title: sectionTitle, channels }, channelIdx) => (
<React.Fragment key={channelIdx}>
<SectionLabel>{sectionTitle}</SectionLabel>
<CommunityChannelsList channels={channels} />
</React.Fragment>
))}
</div>
</Grid>
</Page>
</Container>
</>
);
}
export default Community;

View File

@ -0,0 +1,32 @@
import styled from '@emotion/styled';
import { css } from '@emotion/core';
import { mq } from '../utils';
import theme from '../theme';
const Container = styled.div`
margin-left: auto;
margin-right: auto;
max-width: 1280px;
padding-left: ${theme.space[4]};
padding-right: ${theme.space[4]};
${p =>
p.size === 'sm' &&
css`
max-width: 800px;
`};
${p =>
p.size === 'md' &&
css`
max-width: 1024px;
`};
${mq[3]} {
padding-left: ${theme.space[5]};
padding-right: ${theme.space[5]};
}
`;
export default Container;

View File

@ -0,0 +1,101 @@
import React, { useState } from 'react';
import { Link } from 'gatsby';
import styled from '@emotion/styled';
import Button from './button';
import TableOfContents from './table-of-contents';
import { mq } from '../utils';
import theme from '../theme';
const Menu = styled.nav`
margin-bottom: ${theme.space[5]};
`;
const MenuBtn = styled(Button)`
${mq[1]} {
display: none;
}
`;
const MenuContent = styled.div`
display: ${p => (p.isOpen ? 'block' : 'none')};
background: white;
padding: ${theme.space[3]};
${mq[1]} {
display: block;
background: transparent;
padding: 0;
}
`;
const MenuSection = styled.div`
margin-bottom: ${theme.space[3]};
`;
const SectionTitle = styled.h3`
font-size: ${theme.fontsize[4]};
margin-bottom: ${theme.space[2]};
`;
const SectionList = styled.ul``;
const MenuItem = styled.li``;
const NavLink = styled(Link)`
display: block;
/* font-weight: $regular; */
font-size: ${theme.fontsize[3]};
color: ${theme.colors.gray};
line-height: ${theme.lineHeight[1]};
text-transform: capitalize;
transition: color 0.2s ease;
padding: ${theme.space[2]} 0;
&.active {
color: ${theme.colors.darkGreen};
font-weight: bold;
}
&:hover {
color: ${theme.colors.darkGreen};
}
`;
function DocsNav({ items, location }) {
const [isMenuOpen, setMenuOpen] = useState(false);
function toggleMenu() {
setMenuOpen(isOpen => !isOpen);
}
return (
<Menu>
<MenuBtn onClick={toggleMenu} block>
{isMenuOpen ? <span>&times;</span> : <span>&#9776;</span>} {isMenuOpen ? 'Hide' : 'Show'}{' '}
Navigation
</MenuBtn>
<MenuContent isOpen={isMenuOpen}>
{items.map(item => (
<MenuSection key={item.title}>
<SectionTitle>{item.title}</SectionTitle>
<SectionList>
{item.group.edges.map(({ node }) => (
<MenuItem key={node.fields.slug}>
<NavLink to={node.fields.slug} activeClassName="active">
{node.frontmatter.title}
</NavLink>
{location.pathname === node.fields.slug && <TableOfContents />}
</MenuItem>
))}
</SectionList>
</MenuSection>
))}
</MenuContent>
</Menu>
);
}
export default DocsNav;
export { NavLink };

View File

@ -0,0 +1,42 @@
import React from 'react';
import Container from './container';
import SidebarLayout from './sidebar-layout';
import EditLink from './edit-link';
import Widgets from './widgets';
import Markdown from './markdown';
import DocsNav from './docs-nav';
function DocsSidebar({ docsNav, location }) {
return (
<aside>
<DocsNav items={docsNav} location={location} />
</aside>
);
}
export default function DocsTemplate({
title,
filename,
body,
html,
showWidgets,
widgets,
showSidebar,
docsNav,
location,
group,
}) {
return (
<Container size="md">
<SidebarLayout sidebar={showSidebar && <DocsSidebar docsNav={docsNav} location={location} />}>
<article data-docs-content>
{filename && <EditLink collection={`docs_${group}`} filename={filename} />}
<h1>{title}</h1>
<Markdown body={body} html={html} />
{showWidgets && <Widgets widgets={widgets} location={location} />}
</article>
</SidebarLayout>
</Container>
);
}

View File

@ -0,0 +1,56 @@
import React, { useState, useEffect, memo } from 'react';
import styled from '@emotion/styled';
import theme from '../theme';
import searchIcon from '../img/search.svg';
const SearchForm = styled.form`
> span {
width: 100%;
}
`;
const SearchField = styled.input`
color: white;
font-size: ${theme.fontsize[3]};
border-radius: ${theme.radii[1]};
background-color: rgba(255, 255, 255, 0.1);
background-image: url(${searchIcon});
background-repeat: no-repeat;
background-position: ${theme.space[2]} 50%;
border: 0;
appearance: none;
width: 100%;
padding: ${theme.space[2]};
padding-left: 30px;
outline: 0;
`;
function DocSearch() {
const [enabled, setEnabled] = useState(true);
useEffect(() => {
if (window.docsearch) {
window.docsearch({
apiKey: '08d03dc80862e84c70c5a1e769b13019',
indexName: 'simplecms',
inputSelector: '#algolia-search',
debug: false, // Set debug to true if you want to inspect the dropdown
});
} else {
setEnabled(false);
}
}, []);
if (!enabled) {
return null;
}
return (
<SearchForm>
<SearchField type="search" placeholder="Search the docs" id="algolia-search" />
</SearchForm>
);
}
export default memo(DocSearch);

View File

@ -0,0 +1,46 @@
import React from 'react';
import { css } from '@emotion/core';
function EditLink({ collection, filename }) {
return (
<div
css={css`
float: right;
a {
font-weight: 700;
}
#pencil {
fill: #0b91c4;
}
`}
>
<a href={`/admin/#/edit/${collection}/${filename}`} target="_blank" rel="noopener noreferrer">
<svg
version="1.1"
id="pencil"
xmlns="http://www.w3.org/2000/svg"
xmlnsXlink="http://www.w3.org/1999/xlink"
x="0px"
y="0px"
width="14px"
height="14px"
viewBox="0 0 512 512"
enableBackground="new 0 0 512 512"
xmlSpace="preserve"
>
<path
d="M398.875,248.875L172.578,475.187l-22.625-22.625L376.25,226.265L398.875,248.875z M308.375,158.39L82.063,384.687
l45.266,45.25L353.625,203.64L308.375,158.39z M263.094,113.125L36.828,339.437l22.625,22.625L285.75,135.765L263.094,113.125z
M308.375,67.875L285.719,90.5L421.5,226.265l22.625-22.625L308.375,67.875z M376.25,0L331,45.25l135.75,135.766L512,135.781
L376.25,0z M32,453.5V480h26.5L32,453.5 M0,376.25L135.766,512H0V376.25L0,376.25z"
/>
</svg>{' '}
Edit this page
</a>
</div>
);
}
export default EditLink;

View File

@ -0,0 +1,125 @@
import React, { useState, useEffect } from 'react';
import moment from 'moment';
import styled from '@emotion/styled';
import Markdownify from './markdownify';
import theme from '../theme';
const Root = styled.div`
text-align: center;
background: ${theme.colors.darkerGray};
background-image: linear-gradient(
-17deg,
${theme.colors.darkerGray} 17%,
${theme.colors.darkGray} 94%
);
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
padding: 24px;
padding-top: 40px;
max-width: 446px;
`;
const Title = styled.h2`
font-size: 36px;
color: white;
`;
const Cal = styled.div`
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5);
margin: 24px auto;
max-width: 250px;
`;
const Month = styled.div`
background: ${theme.colors.green};
color: ${theme.colors.gray};
font-weight: bold;
text-transform: uppercase;
letter-spacing: 4px;
font-size: 14px;
padding: 8px;
`;
const Day = styled.div`
font-size: 104px;
line-height: 1.3;
font-weight: bold;
color: white;
border: 1px solid ${theme.colors.gray};
border-top: none;
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
`;
const CalDates = styled.p`
color: white;
font-weight: bold;
font-size: ${theme.fontsize[4]};
margin-bottom: ${theme.space[3]};
`;
const CalCta = styled.div``;
function EventBox({ title, cta }) {
const [loading, setLoading] = useState(true);
const [eventDate, setEventDate] = useState('');
useEffect(() => {
const eventbriteToken = 'C5PX65CJBVIXWWLNFKLO';
const eventbriteOrganiser = '14281996019';
const url = `https://www.eventbriteapi.com/v3/events/search/?token=${eventbriteToken}&organizer.id=${eventbriteOrganiser}&expand=venue%27`;
fetch(url)
.then(res => res.json())
.then(data => {
const eventDate = data.events[0].start.utc;
setEventDate(eventDate);
setLoading(false);
})
.catch(err => {
console.log(err); // eslint-disable-line no-console
// TODO: set state to show error message
setLoading(false);
});
}, []);
const eventDateMoment = moment(eventDate);
const offset = eventDateMoment.isDST() ? -7 : -8;
const month = eventDateMoment.format('MMMM');
const day = eventDateMoment.format('DD');
const datePrefix = eventDateMoment.format('dddd, MMMM Do');
const dateSuffix = eventDateMoment.utcOffset(offset).format('h a');
const ellip = <span>&hellip;</span>;
return (
<Root>
<Title>{title}</Title>
<Cal>
<Month>{loading ? 'loading' : month}</Month>
<Day>{loading ? ellip : day}</Day>
</Cal>
<CalDates>
{loading ? (
ellip
) : (
<span>
{datePrefix} at {dateSuffix} PT
</span>
)}
</CalDates>
<CalCta>
<Markdownify source={cta} />
</CalCta>
</Root>
);
}
export default EventBox;

View File

@ -0,0 +1,46 @@
import React from 'react';
import styled from '@emotion/styled';
import Markdownify from './markdownify';
import theme from '../theme';
const Box = styled.div`
margin-bottom: ${theme.space[5]};
img {
margin-bottom: ${theme.space[3]};
margin-left: -${theme.space[2]};
}
`;
const Title = styled.h3`
color: ${p => (p.kind === 'light' ? theme.colors.white : theme.colors.gray)};
font-size: ${theme.fontsize[4]};
`;
const Text = styled.p`
font-size: 18px;
a {
font-weight: 700;
}
`;
function FeatureItem({ feature, description, imgpath, kind }) {
return (
<Box>
{imgpath && <img src={require(`../img/${imgpath}`).default} alt="" />}
<Title kind={kind}>
<Markdownify source={feature} />
</Title>
<Text>
<Markdownify source={description} />
</Text>
</Box>
);
}
function Features({ items, kind }) {
return items.map(item => <FeatureItem kind={kind} {...item} key={item.feature} />);
}
export default Features;

View File

@ -0,0 +1,97 @@
import React from 'react';
import styled from '@emotion/styled';
import Container from './container';
import theme from '../theme';
import { mq } from '../utils';
const Root = styled.footer`
background: white;
padding-top: ${theme.space[4]};
padding-bottom: ${theme.space[5]};
`;
const FooterGrid = styled.div`
text-align: center;
${mq[2]} {
display: flex;
align-items: center;
text-align: left;
}
`;
const FooterButtons = styled.div`
margin-bottom: ${theme.space[3]};
${mq[2]} {
margin-bottom: 0;
}
`;
const SocialButton = styled.a`
display: inline-block;
padding: ${theme.space[1]} ${theme.space[3]};
background-color: ${theme.colors.lightishGray};
color: white;
font-weight: 700;
font-size: ${theme.fontsize[2]};
border-radius: ${theme.radii[1]};
margin-right: ${theme.space[2]};
&:active,
&:hover {
background-color: ${theme.colors.darkGreen};
}
`;
const Info = styled.div`
font-size: ${theme.fontsize[1]};
color: ${theme.colors.gray};
opacity: 0.5;
${mq[2]} {
padding-left: ${theme.space[4]};
}
a {
font-weight: 700;
color: ${theme.colors.gray};
}
`;
function Footer({ buttons }) {
return (
<Root>
<Container>
<FooterGrid>
<FooterButtons>
{buttons.map(btn => (
<SocialButton href={btn.url} key={btn.url}>
{btn.name}
</SocialButton>
))}
</FooterButtons>
<Info>
<p>
<a
href="https://github.com/SimpleCMS/simple-cms/blob/master/LICENSE"
className="text-link"
>
Distributed under MIT License
</a>{' '}
·{' '}
<a
href="https://github.com/SimpleCMS/simple-cms/blob/master/CODE_OF_CONDUCT.md"
className="text-link"
>
Code of Conduct
</a>
</p>
</Info>
</FooterGrid>
</Container>
</Root>
);
}
export default Footer;

View File

@ -0,0 +1,32 @@
import React, { PureComponent } from 'react';
class GitHubStarButton extends PureComponent {
async componentDidMount() {
const gitHubButtonModule = await import('github-buttons/dist/react');
this.GitHubButton = gitHubButtonModule.default;
this.forceUpdate();
}
render() {
const GitHubButton = this.GitHubButton;
if (!GitHubButton) {
return null;
}
return (
<GitHubButton
href="https://github.com/SimpleCMS/simple-cms"
data-icon="octicon-star"
data-show-count="true"
aria-label="Star SimpleCMS/simple-cms on GitHub"
>
Star
</GitHubButton>
);
}
}
export default GitHubStarButton;

View File

@ -0,0 +1,14 @@
import styled from '@emotion/styled';
import { mq } from '../utils';
import theme from '../theme';
const Grid = styled.div`
${mq[2]} {
display: grid;
grid-template-columns: repeat(${p => p.cols}, 1fr);
grid-gap: ${theme.space[7]};
}
`;
export default Grid;

View File

@ -0,0 +1,248 @@
import React, { useState, useEffect } from 'react';
import { Link, graphql, StaticQuery } from 'gatsby';
import styled from '@emotion/styled';
import { css } from '@emotion/core';
import GitHubButton from 'react-github-btn';
import Container from './container';
import Notifications from './notifications';
import DocSearch from './docsearch';
import logo from '../img/simple-cms-logo.svg';
import searchIcon from '../img/search.svg';
import theme from '../theme';
import { mq } from '../utils';
const StyledHeader = styled.header`
background: ${theme.colors.darkerGray};
padding-top: ${theme.space[3]};
padding-bottom: ${theme.space[3]};
transition: background 0.2s ease, padding 0.2s ease, box-shadow 0.2s ease;
${mq[2]} {
position: sticky;
top: 0;
width: 100%;
z-index: ${theme.zIndexes.header};
${p =>
!p.collapsed &&
css`
background: #2a2c34;
padding-top: ${theme.space[5]};
padding-bottom: ${theme.space[5]};
`};
${p =>
p.hasNotifications &&
css`
padding-top: 0;
`};
}
`;
const HeaderContainer = styled(Container)`
display: flex;
align-items: center;
flex-wrap: wrap;
`;
const Logo = styled.div`
flex: 1 0 50%;
${mq[1]} {
flex: 0 0 auto;
margin-right: ${theme.space[5]};
}
`;
const MenuActions = styled.div`
flex: 1 0 50%;
display: flex;
justify-content: flex-end;
${mq[1]} {
display: none;
}
`;
const MenuBtn = styled.button`
background: none;
border: 0;
color: white;
padding: ${theme.space[3]};
font-size: ${theme.fontsize[4]};
line-height: 1;
`;
const SearchBtn = styled(MenuBtn)``;
const ToggleArea = styled.div`
display: ${p => (p.open ? 'block' : 'none')};
flex: 1;
width: 100%;
margin-top: ${theme.space[3]};
${mq[1]} {
display: block;
width: auto;
margin-top: 0;
}
`;
const SearchBox = styled(ToggleArea)`
${mq[1]} {
flex: 1;
max-width: 200px;
margin-right: ${theme.space[3]};
}
`;
const Menu = styled(ToggleArea)`
${mq[1]} {
flex: 0 0 auto;
margin-left: auto;
}
`;
const MenuList = styled.ul`
${mq[1]} {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
}
`;
const MenuItem = styled.li`
margin-bottom: ${theme.space[3]};
${mq[1]} {
margin-bottom: 0;
&:not(:last-child) {
margin-right: ${theme.space[3]};
}
}
`;
const NavLink = styled(Link)`
color: white;
text-decoration: none;
font-weight: 600;
`;
const StyledLink = styled(props => <Link {...props} />)`
display: flex;
`;
const NOTIFS_QUERY = graphql`
query notifs {
file(relativePath: { regex: "/notifications/" }) {
childDataYaml {
notifications {
published
loud
message
url
}
}
}
}
`;
function Header({ hasHeroBelow }) {
const [scrolled, setScrolled] = useState(false);
const [isNavOpen, setNavOpen] = useState(false);
const [isSearchOpen, setSearchOpen] = useState(false);
useEffect(() => {
// TODO: use raf to throttle events
window.addEventListener('scroll', handleScroll);
return () => {
window.removeEventListener('scroll', handleScroll);
};
}, []);
function handleScroll() {
const currentWindowPos = document.documentElement.scrollTop || document.body.scrollTop;
const scrolled = currentWindowPos > 0;
setScrolled(scrolled);
}
function handleMenuBtnClick() {
setNavOpen(s => !s);
setSearchOpen(false);
}
function handleSearchBtnClick() {
setSearchOpen(s => !s);
setNavOpen(false);
}
return (
<StaticQuery query={NOTIFS_QUERY}>
{data => {
const notifications = data.file.childDataYaml.notifications.filter(
notif => notif.published,
);
const collapsed = !hasHeroBelow || scrolled;
const hasNotifications = notifications.length > 0;
return (
<StyledHeader collapsed={collapsed} id="header" hasNotifications={hasNotifications}>
<Notifications notifications={notifications} />
<HeaderContainer>
<Logo>
<StyledLink to="/">
<img src={logo} alt="Simple CMS logo" />
</StyledLink>
</Logo>
<MenuActions>
<SearchBtn onClick={handleSearchBtnClick}>
{isSearchOpen ? <span>&times;</span> : <img src={searchIcon} alt="search" />}
</SearchBtn>
<MenuBtn onClick={handleMenuBtnClick}>
{isNavOpen ? <span>&times;</span> : <span>&#9776;</span>}
</MenuBtn>
</MenuActions>
<SearchBox open={isSearchOpen}>
<DocSearch />
</SearchBox>
<Menu open={isNavOpen}>
<MenuList>
<MenuItem
css={css`
margin-top: 8px;
`}
>
<GitHubButton
href="https://github.com/SimpleCMS/simple-cms"
data-icon="octicon-star"
data-show-count="true"
aria-label="Star SimpleCMS/simple-cms on GitHub"
>
Star
</GitHubButton>
</MenuItem>
<MenuItem>
<NavLink to="/docs/intro/">Docs</NavLink>
</MenuItem>
<MenuItem>
<NavLink to="/docs/contributor-guide/">Contributing</NavLink>
</MenuItem>
<MenuItem>
<NavLink to="/community/">Community</NavLink>
</MenuItem>
<MenuItem>
<NavLink to="/blog/">Blog</NavLink>
</MenuItem>
</MenuList>
</Menu>
</HeaderContainer>
</StyledHeader>
);
}}
</StaticQuery>
);
}
export default Header;

View File

@ -0,0 +1,17 @@
import styled from '@emotion/styled';
import theme from '../theme';
import { mq } from '../utils';
const HeroTitle = styled.h1`
color: ${theme.colors.green};
font-size: ${theme.fontsize[6]};
margin-bottom: ${theme.space[1]};
${mq[2]} {
font-size: ${theme.fontsize[7]};
margin-bottom: ${theme.space[2]};
}
`;
export default HeroTitle;

View File

@ -0,0 +1,37 @@
import React from 'react';
import styled from '@emotion/styled';
import Container from './container';
import Page from './page';
import theme from '../theme';
const Header = styled.header`
text-align: center;
padding-top: ${theme.space[7]};
padding-bottom: ${theme.space[7]};
`;
const Title = styled.h2`
font-size: ${theme.fontsize[6]};
`;
const Text = styled.div`
max-width: 710px;
margin: 0 auto;
`;
function HomeSection({ title, text, children, ...props }) {
return (
<Page as="section" {...props}>
<Container>
<Header>
<Title>{title}</Title>
{text && <Text>{text}</Text>}
</Header>
{children}
</Container>
</Page>
);
}
export default HomeSection;

View File

@ -0,0 +1,71 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { graphql, StaticQuery } from 'gatsby';
import { ThemeProvider } from 'emotion-theming';
import Header from './header';
import Footer from './footer';
import GlobalStyles from '../global-styles';
import theme from '../theme';
const LAYOUT_QUERY = graphql`
query layoutQuery {
site {
siteMetadata {
title
description
}
}
footer: file(relativePath: { regex: "/global/" }) {
childDataYaml {
footer {
buttons {
url
name
}
}
}
}
}
`;
export function LayoutTemplate({ children }) {
return (
<ThemeProvider theme={theme}>
<GlobalStyles />
{children}
</ThemeProvider>
);
}
function Layout({ hasPageHero, children }) {
return (
<StaticQuery query={LAYOUT_QUERY}>
{data => {
const { title, description } = data.site.siteMetadata;
return (
<LayoutTemplate
title={title}
description={description}
hasPageHero={hasPageHero}
footerButtons={data.footer.childDataYaml.footer.buttons}
>
<Helmet defaultTitle={title} titleTemplate={`%s | ${title}`}>
<meta name="description" content={description} />
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,700,900|Roboto+Mono:400,700"
/>
</Helmet>
<Header hasHeroBelow={hasPageHero} />
{children}
<Footer buttons={data.footer.childDataYaml.footer.buttons} />
</LayoutTemplate>
);
}}
</StaticQuery>
);
}
export default Layout;

View File

@ -0,0 +1,10 @@
import styled from '@emotion/styled';
const Lead = styled.p`
font-size: 20px;
margin-bottom: 24px;
${p => p.light && 'color: white;'};
`;
export default Lead;

View File

@ -0,0 +1,137 @@
import React from 'react';
import styled from '@emotion/styled';
import theme from '../theme';
const StyledMarkdown = styled.div`
> :first-of-type {
margin-top: 0;
}
> :last-child {
margin-bottom: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
line-height: ${theme.lineHeight[1]};
margin-top: 2em;
margin-bottom: 0.25em;
}
h1 {
font-size: ${theme.fontsize[6]};
}
h2 {
font-size: ${theme.fontsize[5]};
}
h3 {
font-size: ${theme.fontsize[4]};
}
h4 {
font-size: ${theme.fontsize[3]};
}
ol,
ul {
margin-left: ${theme.space[3]};
}
ul {
list-style: disc;
}
ol {
list-style: decimal;
}
li {
margin-bottom: 0;
}
ol,
ul,
p {
font-size: 18px;
margin-bottom: 1rem;
}
a {
font-weight: bold;
&:hover {
text-decoration: underline;
}
}
table {
border: 0;
background: #f7f7f7;
border-radius: 4px;
margin-top: 40px;
margin-bottom: 40px;
width: 100%;
text-align: left;
display: block;
overflow: auto;
}
tbody tr {
&:nth-of-type(odd) {
background: #fdfdfd;
}
}
th,
td {
padding: 8px;
}
th {
font-weight: 700;
font-size: 18px;
}
td {
font-size: 14px;
}
iframe {
width: 100%;
}
pre {
border-radius: ${theme.radii[2]};
margin-bottom: ${theme.space[4]};
margin-top: ${theme.space[4]};
}
pre > code {
font-size: ${theme.fontsize[2]};
line-height: ${theme.lineHeight[0]};
}
*:not(pre) > code {
color: inherit;
background: #e6e6e6;
border-radius: 2px;
padding: 2px 6px;
white-space: nowrap;
font-size: ${theme.fontsize[2]};
}
`;
function Markdown({ body, html }) {
if (body) {
return <StyledMarkdown>{body}</StyledMarkdown>;
}
return <StyledMarkdown dangerouslySetInnerHTML={{ __html: html }} />;
}
export default Markdown;

View File

@ -0,0 +1,8 @@
import React, { Fragment } from 'react';
import Markdown from 'react-markdown';
function Markdownify({ source }) {
return <Markdown components={{ '**': Fragment, p: Fragment }}>{source}</Markdown>;
}
export default Markdownify;

View File

@ -0,0 +1,10 @@
import styled from '@emotion/styled';
import theme from '../theme';
const MetaInfo = styled.p`
font-size: ${theme.fontsize[2]};
margin-bottom: ${theme.space[4]};
`;
export default MetaInfo;

View File

@ -0,0 +1,49 @@
import React from 'react';
import styled from '@emotion/styled';
import { css } from '@emotion/core';
import theme from '../theme';
const Notif = styled.a`
background-color: ${theme.colors.darkerGray};
color: white;
display: block;
padding: ${theme.space[2]} ${theme.space[3]};
margin-bottom: ${theme.space[3]};
text-align: center;
/* prettier-ignore */
${p =>
p.loud &&
css`
background-color: ${theme.colors.green};
color: ${theme.colors.darkerGray};
`}
em {
font-style: normal;
color: #8b8b8b;
padding: 0 8px;
}
sup,
sub {
font-size: initial;
vertical-align: initial;
}
.text-link {
text-decoration: underline;
color: ${theme.colors.green};
}
`;
function Notification({ url, loud, children }) {
return (
<Notif href={url} loud={loud} target="_blank" rel="noopener noreferrer">
{children}
</Notif>
);
}
export default Notification;

View File

@ -0,0 +1,13 @@
import React from 'react';
import Notification from './notification';
function Notifications({ notifications }) {
return notifications.map((node, i) => (
<Notification key={i} url={node.url} loud={node.loud}>
{node.message}
</Notification>
));
}
export default Notifications;

View File

@ -0,0 +1,30 @@
import React from 'react';
import { css } from '@emotion/core';
import Container from './container';
import theme from '../theme';
import { mq } from '../utils';
function PageHero({ children }) {
return (
<section
css={css`
background: ${theme.colors.darkerGray};
background-image: linear-gradient(to bottom, #2a2c34 0%, ${theme.colors.darkerGray} 20%);
color: ${theme.colors.blueGray};
position: relative;
padding-top: ${theme.space[6]};
padding-bottom: ${theme.space[6]};
${mq[3]} {
padding-top: ${theme.space[6]};
padding-bottom: ${theme.space[8]};
}
`}
>
<Container>{children}</Container>
</section>
);
}
export default PageHero;

View File

@ -0,0 +1,16 @@
import styled from '@emotion/styled';
import theme from '../theme';
import { mq } from '../utils';
const Page = styled.div`
padding-top: ${theme.space[5]};
padding-bottom: ${theme.space[5]};
${mq[1]} {
padding-top: ${theme.space[6]};
padding-bottom: ${theme.space[6]};
}
`;
export default Page;

View File

@ -0,0 +1,68 @@
import React from 'react';
import moment from 'moment';
import styled from '@emotion/styled';
import { css } from '@emotion/core';
import Markdownify from '../components/markdownify';
import theme from '../theme';
const ReleaseLink = styled.a`
color: white;
display: block;
padding: ${theme.space[2]} ${theme.space[3]};
border-radius: ${theme.radii[1]};
height: 100%;
&:hover {
background: ${theme.colors.darkGray};
}
`;
const Version = styled.span`
background: ${theme.colors.shadeBlue};
font-size: ${theme.fontsize[1]};
padding: 0 ${theme.space[1]};
border-radius: ${theme.radii[1]};
font-weight: 700;
margin-right: ${theme.space[2]};
color: ${theme.colors.gray};
`;
function Release({ version, versionPrevious, date, description, url }) {
const displayDate = moment(date).format('MMMM D, YYYY');
const defaultUrl = `https://github.com/SimpleCMS/simple-cms/compare/simple-cms@${versionPrevious}...simple-cms@${version}`;
return (
<li
css={css`
flex: 1;
`}
>
<ReleaseLink href={url || defaultUrl}>
<div
css={css`
margin-bottom: ${theme.space[1]};
`}
>
<Version>{version}</Version>
<span
css={css`
font-size: ${theme.fontsize[1]};
color: rgba(255, 255, 255, 0.6);
`}
>
{displayDate}
</span>
</div>
<span
css={css`
font-size: ${theme.fontsize[2]};
`}
>
<Markdownify source={description} />
</span>
</ReleaseLink>
</li>
);
}
export default Release;

View File

@ -0,0 +1,23 @@
import styled from '@emotion/styled';
import theme from '../theme';
const SectionLabel = styled.h3`
color: ${theme.colors.gray};
font-size: ${theme.fontsize[1]};
font-weight: 600;
letter-spacing: 1.5px;
text-transform: uppercase;
margin-bottom: ${theme.space[4]};
&:after {
background: ${theme.colors.darkGreen};
content: ' ';
display: block;
height: 2px;
margin-top: 5px;
width: ${theme.space[5]};
}
`;
export default SectionLabel;

View File

@ -0,0 +1,30 @@
import React from 'react';
import { css } from '@emotion/core';
import styled from '@emotion/styled';
import Page from './page';
import { mq } from '../utils';
const Children = styled.div`
overflow: hidden;
padding-left: 2rem;
`;
function SidebarLayout({ sidebar, children }) {
return (
<Page
css={css`
${mq[1]} {
display: grid;
grid-template-columns: ${sidebar ? '300px' : ''} minmax(0, 1fr);
grid-gap: 2rem;
}
`}
>
{sidebar && <div>{sidebar}</div>}
<Children>{children}</Children>
</Page>
);
}
export default SidebarLayout;

View File

@ -0,0 +1,62 @@
import React, { useState, useEffect } from 'react';
import styled from '@emotion/styled';
import theme from '../theme';
const TocList = styled.ol`
margin: ${theme.space[2]} 0;
padding-left: ${theme.space[3]};
border-left: 2px solid ${theme.colors.lightestGray};
list-style-type: none;
`;
const TocLink = styled.a`
display: block;
font-size: ${theme.fontsize[2]};
color: ${theme.colors.gray};
transition: color 0.2s;
line-height: ${theme.lineHeight[1]};
margin: ${theme.space[2]} 0;
&:hover {
color: ${theme.colors.darkGreen};
}
`;
/**
* Maually get table of contents since tableOfContents from markdown
* nodes have code added.
*
* https://github.com/gatsbyjs/gatsby/issues/5436
*/
function TableOfContents() {
const [headings, setHeadings] = useState([]);
useEffect(() => {
// TODO: we should be generating headings during the build
const contentHeadings = document.querySelectorAll('[data-docs-content] h2');
const headings = [];
contentHeadings.forEach(h => {
headings.push({
id: h.id,
text: h.innerText,
});
});
setHeadings(headings);
}, []);
return (
headings.length > 0 && (
<TocList>
{headings.map(h => (
<li key={h.id}>
<TocLink href={`#${h.id}`}>{h.text}</TocLink>
</li>
))}
</TocList>
)
);
}
export default TableOfContents;

View File

@ -0,0 +1,17 @@
import React from 'react';
import { Helmet } from 'react-helmet';
function TwitterMeta({ title, description, image, imageAlt }) {
return (
<Helmet>
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@SimpleCMSOrg" />
{title && <meta name="twitter:title" content={title} />}
{description && <meta name="twitter:description" content={description} />}
{image && <meta name="twitter:image" content={image} />}
{image && imageAlt && <meta name="twitter:image:alt" content={imageAlt} />}
</Helmet>
);
}
export default TwitterMeta;

View File

@ -0,0 +1,111 @@
import React, { useState } from 'react';
import styled from '@emotion/styled';
import theme from '../theme';
import screenshotEditor from '../img/screenshot-editor.jpg';
const VideoLink = styled.a`
position: relative;
cursor: pointer;
display: block;
&:hover {
div {
background-color: ${theme.colors.blue};
box-shadow: 0 6px 18px 0 rgba(0, 0, 0, 0.15), 0 2px 6px 0 rgba(0, 0, 0, 0.3);
transform: scale(1.1);
}
svg {
fill: #fff;
}
}
&:active {
div {
transform: scale(0.9);
}
}
img,
iframe {
width: 100%;
border-radius: ${theme.radii[2]};
box-shadow: 0 10px 30px 0 rgba(0, 0, 0, 0.15), 0 3px 9px 0 rgba(0, 0, 0, 0.3);
}
`;
const VideoButton = styled.div`
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 90px;
height: 90px;
margin: auto;
color: ${theme.colors.blue};
background-color: rgba(255, 255, 255, 0.85);
box-shadow: 0 3px 9px 0 rgba(0, 0, 0, 0.05), 0 1px 3px 0 rgba(0, 0, 0, 0.15);
border-radius: 100px;
transition: 0.1s;
svg {
position: absolute;
left: 30px;
top: 24px;
width: 44px;
height: 44px;
fill: #3a69c7;
}
`;
/**
* We should be able to import complete inline svg's rather than base64, this
* component is a stopgap for now. Source in '../img/play.svg'.
*/
function PlayIcon({ className }) {
return (
<svg className={className} viewBox="0 0 43 44">
<path
d="M41.5156904,23.7808694 L2.91022212,43.5125531 C1.92667513,44.0152549 0.721832431,43.6254529 0.219130636,42.6419059 C0.07510106,42.3601089 -3.51395713e-15,42.048155 -3.55271368e-15,41.7316838 L-1.77635684e-15,2.26831623 C-2.40215499e-15,1.16374673 0.8954305,0.268316226 2,0.268316226 C2.31647127,0.268316226 2.62842512,0.343417285 2.91022212,0.487446861 L41.5156904,20.2191306 C42.4992374,20.7218324 42.8890394,21.9266751 42.3863376,22.9102221 C42.1949001,23.2847739 41.8902421,23.5894318 41.5156904,23.7808694 Z"
id="Triangle"
fillRule="nonzero"
/>
</svg>
);
}
function VideoEmbed() {
const [toggled, setToggled] = useState(false);
function toggleVideo() {
return setToggled(true);
}
const embedcode = (
<iframe
title="Simple CMS video"
width={560}
height={315}
src="https://www.youtube-nocookie.com/embed/p6h-rYSVX90?rel=0&showinfo=0&autoplay=1"
frameBorder={0}
allow="autoplay; encrypted-media"
allowFullScreen
/>
);
const imgPlaceholder = <img src={screenshotEditor} alt="Simple CMS editor" />;
return (
<VideoLink onClick={toggleVideo}>
{toggled ? embedcode : imgPlaceholder}
{!toggled && (
<VideoButton>
<PlayIcon />
</VideoButton>
)}
</VideoLink>
);
}
export default VideoEmbed;

View File

@ -0,0 +1,29 @@
import React from 'react';
import { css } from '@emotion/core';
import Container from './container';
import Release from './release';
import Grid from './grid';
import theme from '../theme';
function WhatsNew({ updates }) {
return (
<section
css={css`
background: ${theme.colors.lightishGray};
padding-top: ${theme.space[6]};
padding-bottom: ${theme.space[5]};
`}
>
<Container>
<Grid as="ol" cols={3}>
{updates.slice(0, 3).map((item, idx) => (
<Release {...item} versionPrevious={updates[idx + 1].version} key={item.version} />
))}
</Grid>
</Container>
</section>
);
}
export default WhatsNew;

View File

@ -0,0 +1,18 @@
import React from 'react';
import Markdown from './markdown';
function WidgetDoc({ visible, label, body, html }) {
if (!visible) {
return null;
}
return (
<div>
<h3>{label}</h3>
<Markdown html={html} body={body} />
</div>
);
}
export default WidgetDoc;

View File

@ -0,0 +1,81 @@
import React, { useState, useEffect, useRef } from 'react';
import styled from '@emotion/styled';
import WidgetDoc from './widget-doc';
import Button from './button';
import theme from '../theme';
const WidgetsNav = styled.nav`
margin-bottom: 1rem;
> button {
margin-right: 8px;
margin-bottom: 8px;
}
`;
const WidgetsContent = styled.div`
background: ${theme.colors.lightGray};
padding: ${theme.space[3]};
border-radius: 4px;
`;
function Widgets({ widgets, location }) {
const initialLoadRef = useRef(true);
const navRef = useRef(null);
const [currentWidget, setWidget] = useState(null);
useEffect(() => {
const hash = location.hash ? location.hash.replace('#', '') : '';
const widgetsContainHash = widgets.edges.some(w => w.node.frontmatter.title === hash);
if (widgetsContainHash) {
setWidget(hash);
if (initialLoadRef.current) {
navRef.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
} else {
setWidget(widgets.edges[0].node.frontmatter.title);
}
initialLoadRef.current = false;
}, [widgets, location.hash]);
function handleWidgetChange(event, title) {
event.preventDefault();
setWidget(title);
window.history.pushState(null, null, `#${title}`);
}
return (
<section>
<WidgetsNav ref={navRef}>
{widgets.edges.map(({ node }) => {
const { label, title } = node.frontmatter;
return (
<Button
key={title}
active={currentWidget === title}
onClick={event => handleWidgetChange(event, title)}
outline
>
{label}
</Button>
);
})}
</WidgetsNav>
<WidgetsContent>
{widgets.edges.map(({ node }) => {
const { frontmatter, html } = node;
const { title, label } = frontmatter;
const isVisible = currentWidget === title;
return <WidgetDoc key={label} visible={isVisible} label={label} html={html} />;
})}
</WidgetsContent>
</section>
);
}
export default Widgets;

View File

@ -0,0 +1,98 @@
import React from 'react';
import { Global, css } from '@emotion/core';
import theme from './theme';
const globalStyles = css`
* {
box-sizing: border-box;
}
body {
color: ${theme.colors.gray};
font-family: ${theme.fontFamily};
line-height: ${theme.lineHeight[2]};
font-size: ${theme.fontsize[3]};
background: ${theme.colors.shadeBlue};
margin: 0;
-webkit-font-smoothing: antialiased;
}
img {
max-width: 100%;
}
ol,
ul {
list-style: none;
margin: 0;
padding: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
line-height: ${theme.lineHeight[1]};
margin-top: 0;
margin-bottom: 0.5em;
}
h1 {
font-size: 36px;
}
h2 {
font-size: 28px;
}
h3 {
font-size: 24px;
}
p {
margin-top: 0;
margin-bottom: 0;
}
a {
color: ${theme.colors.darkGreen};
text-decoration: none;
}
.gitter-open-chat-button {
&,
&:visited {
padding: ${theme.space[3]} ${theme.space[4]};
font-family: ${theme.fontFamily};
font-size: ${theme.fontsize[3]};
letter-spacing: 0.5px;
line-height: 1;
color: ${theme.colors.gray};
background-color: ${theme.colors.green};
box-shadow: 0 2px 16px 0 rgba(68, 74, 87, 0.15), 0 1px 4px 0 rgba(68, 74, 87, 0.3);
}
&:hover {
background-color: ${theme.colors.lightGreen};
box-shadow: 0 2px 16px 0 rgba(68, 74, 87, 0.25), 0 1px 4px 0 rgba(68, 74, 87, 0.5);
}
&:focus {
box-shadow: 0 0 6px 3px rgba(62, 160, 127, 0.6);
transition: none;
}
&:active {
color: ${theme.colors.lightGray};
}
}
`;
function GlobalStyles() {
return <Global styles={globalStyles} />;
}
export default GlobalStyles;

37
website/src/html.js Normal file
View File

@ -0,0 +1,37 @@
import React from 'react';
import ChatButton from './components/chat-button';
class HTML extends React.Component {
render() {
return (
<html {...this.props.htmlAttributes}>
<head>
<meta charSet="utf-8" />
<meta httpEquiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-touch-icon.png" />
<link rel="icon" type="image/png" href="/img/favicon/favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="/img/favicon/favicon-16x16.png" sizes="16x16" />
<link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#96cf05" />
<meta name="apple-mobile-web-app-title" content="Simple CMS" />
<meta name="application-name" content="Simple CMS" />
{this.props.headComponents}
<link
rel="stylesheet"
href="https://unpkg.com/docsearch.js@2.5.2/dist/cdn/docsearch.min.css"
/>
</head>
<body {...this.props.bodyAttributes}>
{this.props.preBodyComponents}
<div key={'body'} id="___gatsby" dangerouslySetInnerHTML={{ __html: this.props.body }} />
{this.props.postBodyComponents}
<ChatButton />
<script src="//unpkg.com/docsearch.js@2.4.1/dist/cdn/docsearch.min.js" />
</body>
</html>
);
}
}
export default HTML;

1
website/src/img/bow.svg Normal file
View File

@ -0,0 +1 @@
<svg width="1440" height="26" viewBox="0 0 1440 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>bow</title><desc>Created with Sketch.</desc><g id="landing" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="cms-landing-v6" transform="translate(0.000000, -666.000000)" fill="#FFF"><g id="hero-(green)"><g id="background"><path d="M0,692 L1440,692 L1440,666.431373 C1440,666.431373 1080,692 720,692 C360,692 0,666.431373 0,666.431373 L0,692 Z" id="bow"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 548 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

BIN
website/src/img/demo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

View File

@ -0,0 +1 @@
<svg width="318" height="198" viewBox="0 0 318 198" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>access</title><defs><linearGradient x1="0%" y1="22.8125%" y2="76.1545%" id="c"><stop stop-color="#EBECEF" offset="0%"/><stop stop-color="#F5F5F5" offset="100%"/></linearGradient><rect id="b" width="300" height="180" rx="6"/><filter x="-6%" y="-7.8%" width="112%" filterUnits="objectBoundingBox" id="a"><feOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur stdDeviation="1.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.147843071 0" in="shadowBlurOuter1" result="shadowMatrixOuter1"/><feOffset dy="3" in="SourceAlpha" result="shadowOffsetOuter2"/><feGaussianBlur stdDeviation="4.5" in="shadowOffsetOuter2" result="shadowBlurOuter2"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0974298007 0" in="shadowBlurOuter2" result="shadowMatrixOuter2"/><feMerge><feMergeNode in="shadowMatrixOuter1"/><feMergeNode in="shadowMatrixOuter2"/></feMerge></filter><rect id="e" x="94" y="35" width="100" height="110" rx="3"/><filter x="-18%" y="-12.7%" width="136%" height="132.7%" filterUnits="objectBoundingBox" id="d"><feOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur stdDeviation="1.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.147843071 0" in="shadowBlurOuter1" result="shadowMatrixOuter1"/><feOffset dy="3" in="SourceAlpha" result="shadowOffsetOuter2"/><feGaussianBlur stdDeviation="4.5" in="shadowOffsetOuter2" result="shadowBlurOuter2"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0974298007 0" in="shadowBlurOuter2" result="shadowMatrixOuter2"/><feMerge><feMergeNode in="shadowMatrixOuter1"/><feMergeNode in="shadowMatrixOuter2"/></feMerge></filter></defs><g transform="translate(9 6)" fill="none"><use fill="#000" filter="url(#a)" xlink:href="#b"/><use fill="url(#c)" xlink:href="#b"/><use fill="#000" filter="url(#d)" xlink:href="#e"/><use fill="#FFF" xlink:href="#e"/><circle fill="#AEB1BD" cx="144" cy="54" r="9"/><path fill="#EFF0F4" d="M102 72h84v12h-84z"/><path fill="#D4D6DD" d="M108 76h26v4h-26z"/><path fill="#EFF0F4" d="M102 88h84v12h-84z"/><path fill="#D4D6DD" d="M108 92h38v4h-38z"/><path fill="#3A69C7" d="M102 104h84v12h-84z"/><path fill="#FFF" d="M134 108h20v4h-20z"/><path fill="#D4D6DD" d="M129 131h30v4h-30z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1 @@
<svg width="318" height="198" viewBox="0 0 318 198" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>editor</title><defs><rect id="b" width="300" height="180" rx="6"/><filter x="-6%" y="-7.8%" width="112%" filterUnits="objectBoundingBox" id="a"><feOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur stdDeviation="1.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.147843071 0" in="shadowBlurOuter1" result="shadowMatrixOuter1"/><feOffset dy="3" in="SourceAlpha" result="shadowOffsetOuter2"/><feGaussianBlur stdDeviation="4.5" in="shadowOffsetOuter2" result="shadowBlurOuter2"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0974298007 0" in="shadowBlurOuter2" result="shadowMatrixOuter2"/><feMerge><feMergeNode in="shadowMatrixOuter1"/><feMergeNode in="shadowMatrixOuter2"/></feMerge></filter><linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="c"><stop stop-color="#4779DD" offset="0%"/><stop stop-color="#3A69C7" offset="100%"/></linearGradient></defs><g transform="translate(9 6)" fill="none" fill-rule="evenodd"><use fill="#000" filter="url(#a)" xlink:href="#b"/><use fill="#FFF" xlink:href="#b"/><path d="M0 19h149v161H6c-3.3137 0-6-2.6863-6-6V19z" fill="#EFF0F4"/><path fill="#AEB1BD" d="M10 31h18v4H10z"/><path fill="#FFF" d="M10 39h129v12H10z"/><path fill="#D4D6DD" d="M16 43h44v4H16z"/><path fill="#AEB1BD" d="M10 59h10v4H10z"/><path fill="#FFF" d="M10 67h129v12H10z"/><path fill="#D4D6DD" d="M16 71h26v4H16z"/><path fill="#AEB1BD" d="M10 87h35v4H10z"/><path fill="#FFF9E5" d="M10 95h42v27.7686H10z"/><circle fill="#FFC500" cx="31" cy="110.4463" r="7.8099"/><path d="M10 110.1683c4.6101 2.4917 9.3585 3.7375 14.245 3.7375 7.33 0 10.2112-5.0507 15.7083-5.0507 3.6648 0 7.6803 1.5082 12.0467 4.5246v9.3889H10v-12.6003z" fill="#D4D6DD"/><path d="M10 115.257c4.6503-2.702 8.896-4.0531 12.7373-4.0531 5.7618 0 11.322 4.9766 15.525 4.9766 2.8018 0 7.3811-2.196 13.7377-6.588v13.1761H10v-7.5116z" fill="#9AA1AE"/><path fill="#AEB1BD" d="M10 131h10v4H10z"/><path fill="#FFF" d="M10 139h129v41H10z"/><path fill="#D4D6DD" d="M16 145h117v4H16zm0 6h117v4H16zm0 6h83v4H16zm0 10h117v4H16zm0 6h43v4H16z"/><path fill="#9AA1AE" d="M61 172h2v6h-2z"/><path fill="#AEB1BD" d="M179 31h91v8h-91z"/><path fill="#D4D6DD" d="M213 42h24v4h-24z"/><path fill="#FFF9E5" d="M164 56h121v80H164z"/><circle fill="#FFC500" cx="224.5" cy="100.5" r="22.5"/><path d="M164 99.6992c13.2815 7.1784 26.9613 10.7676 41.0393 10.7676 21.117 0 29.4178-14.5508 45.2548-14.5508 10.558 0 22.1266 4.345 34.7059 13.0352V136H164V99.6992z" fill="#D4D6DD"/><path d="M164 114.3594c13.3973-7.7845 25.6291-11.6768 36.6955-11.6768 16.5995 0 32.6183 14.3374 44.7266 14.3374 8.0722 0 21.2648-6.3266 39.5779-18.98V136H164v-21.6406z" fill="#9AA1AE"/><path fill="#D4D6DD" d="M164 145h121v4H164zm0 6h121v4H164zm0 6h85.8376v4H164zm0 10h121v4H164zm0 6h44.4701v4H164z"/><path fill="#9AA1AE" d="M210 172h2v6h-2z"/><path d="M6 0h288c3.3137 0 6 2.6863 6 6v13H0V6c0-3.3137 2.6863-6 6-6z" fill="url(#c)"/></g></svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -0,0 +1 @@
<svg width="17" height="16" viewBox="0 0 17 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>Shape Copy</title><desc>Created with Sketch.</desc><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="jamstack-landing" transform="translate(-1053.000000, -48.000000)" fill="#FFF"><g id="header" transform="translate(250.000000, 40.000000)"><path d="M811.198938,8 C806.671816,8 803,11.6725529 803,16.2027524 C803,19.8271171 805.349142,22.9014191 808.607399,23.9861654 C809.017371,24.0610108 809.167011,23.8082793 809.167011,23.5909199 C809.167011,23.3961167 809.159837,22.8793756 809.15625,22.1950012 C806.875265,22.6907241 806.39406,21.0953885 806.39406,21.0953885 C806.021497,20.1485424 805.483921,19.8958109 805.483921,19.8958109 C804.739308,19.3877847 805.540292,19.3970122 805.540292,19.3970122 C806.363312,19.4549405 806.796345,20.2428682 806.796345,20.2428682 C807.528146,21.4952477 808.715529,21.1333238 809.182898,20.9241667 C809.257205,20.394097 809.469366,20.0321731 809.703563,19.8276298 C807.882772,19.6200106 805.968713,18.9171812 805.968713,15.7731601 C805.968713,14.8775781 806.288492,14.1455282 806.812744,13.5723967 C806.727675,13.3647775 806.446331,12.5312248 806.892176,11.401879 C806.892176,11.401879 807.58093,11.1814438 809.147025,12.2431212 C809.800931,12.061134 810.502497,11.9698841 811.199962,11.9668082 C811.896403,11.9698841 812.597456,12.061134 813.2529,12.2431212 C814.818482,11.1814438 815.505699,11.401879 815.505699,11.401879 C815.953081,12.5312248 815.671225,13.3652901 815.587181,13.5723967 C816.111945,14.1460408 816.430187,14.8780907 816.430187,15.7731601 C816.430187,18.9243581 814.513053,19.61796 812.686113,19.8204528 C812.980781,20.0747223 813.24265,20.5755715 813.24265,21.3404304 C813.24265,22.4369673 813.232401,23.3207587 813.232401,23.5909199 C813.232401,23.8098172 813.379991,24.0645993 813.796626,23.9851401 C817.051807,22.8983433 819.3989,19.8260919 819.3989,16.2027524 C819.3989,11.6725529 815.727596,8 811.198938,8 L811.198938,8 Z" id="Shape-Copy"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
<svg width="14" height="13" viewBox="0 0 14 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>heart</title><desc>Created with Sketch.</desc><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="jamstack-landing" transform="translate(-713.000000, -3752.000000)" fill="#FB6D77"><g id="articles" transform="translate(0.000000, 2345.000000)"><path d="M725.879238,1413.84495 C727.525503,1412.19869 727.286611,1409.22984 725.019692,1408.06452 C724.069878,1407.57625 722.919023,1407.55603 721.944531,1407.99308 C721.192974,1408.33013 720.67604,1408.8388 720.338716,1409.42467 C720.200205,1409.66532 719.853604,1409.66829 719.715278,1409.42754 C719.400776,1408.88009 718.929673,1408.39989 718.257251,1408.06377 C717.091367,1407.48106 715.657183,1407.56475 714.597246,1408.32326 C712.751148,1409.64445 712.595381,1412.22912 714.129854,1413.7635 C715.615991,1415.49762 717.211323,1417.11317 719.263379,1418.9961 C719.696074,1419.38965 720.358291,1419.39893 720.792471,1419 C722.423057,1417.51525 724.153467,1415.82056 725.879239,1413.84486 L725.879238,1413.84495 Z" id="heart"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

3
website/src/img/play.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="43px" height="44px" viewBox="0 0 43 44">
<path d="M41.5156904,23.7808694 L2.91022212,43.5125531 C1.92667513,44.0152549 0.721832431,43.6254529 0.219130636,42.6419059 C0.07510106,42.3601089 -3.51395713e-15,42.048155 -3.55271368e-15,41.7316838 L-1.77635684e-15,2.26831623 C-2.40215499e-15,1.16374673 0.8954305,0.268316226 2,0.268316226 C2.31647127,0.268316226 2.62842512,0.343417285 2.91022212,0.487446861 L41.5156904,20.2191306 C42.4992374,20.7218324 42.8890394,21.9266751 42.3863376,22.9102221 C42.1949001,23.2847739 41.8902421,23.5894318 41.5156904,23.7808694 Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0" y="0" viewBox="0 0 56.966 56.966" xml:space="preserve" width="16" height="12" enable-background="new 0 0 56.966 56.966"><path d="M55.146,51.887L41.588,37.786c3.486-4.144,5.396-9.358,5.396-14.786c0-12.682-10.318-23-23-23s-23,10.318-23,23 s10.318,23,23,23c4.761,0,9.298-1.436,13.177-4.162l13.661,14.208c0.571,0.593,1.339,0.92,2.162,0.92 c0.779,0,1.518-0.297,2.079-0.837C56.255,54.982,56.293,53.08,55.146,51.887z M23.984,6c9.374,0,17,7.626,17,17s-7.626,17-17,17 s-17-7.626-17-17S14.61,6,23.984,6z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 630 B

View File

@ -0,0 +1,921 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="182" height="72" viewBox="0 100 1280 440" enable-background="new 0 0 1280 640" xml:space="preserve">
<path class="no-fill" fill="none" opacity="1.000000" stroke="none" d="
M783.000000,641.000000
C522.033875,641.000000 261.567780,641.000000 1.050843,641.000000
C1.050843,427.728333 1.050843,214.456650 1.050843,1.092481
C427.549469,1.092481 854.098938,1.092481 1280.824219,1.092481
C1280.824219,214.333221 1280.824219,427.666595 1280.824219,641.000000
C1115.123169,641.000000 949.311584,641.000000 783.000000,641.000000
M64.000557,320.196991
C64.340988,324.113739 64.163689,328.161774 65.117630,331.922913
C68.138870,343.834839 71.210541,355.758484 74.948448,367.458496
C80.925453,386.167114 90.907585,402.888519 102.921257,418.238251
C116.688789,435.828888 133.172119,450.683167 152.605713,461.849762
C160.990952,466.667877 169.872360,470.827118 178.926697,474.223969
C190.050858,478.397339 201.480072,481.897980 212.995956,484.831543
C219.408585,486.465118 226.322098,486.011566 232.910431,487.100372
C248.099548,489.610657 263.146606,487.599915 278.013733,485.260803
C287.986267,483.691742 297.577362,479.760620 307.379944,477.033173
C320.360229,473.421570 332.266968,467.345306 343.293976,459.919708
C353.585419,452.989471 363.273773,445.064819 372.679474,436.943085
C384.391174,426.830200 393.829620,414.514130 401.719666,401.352081
C407.827393,391.163300 412.524139,380.018585 416.866241,368.914825
C420.627380,359.296631 424.255096,349.315521 425.692596,339.175934
C427.604340,325.690918 428.291565,311.857422 427.733765,298.246185
C427.171173,284.517761 425.398376,270.660553 422.351318,257.270416
C420.041626,247.120499 414.914093,237.609146 411.012817,227.824661
C404.182678,210.694275 393.549133,195.915741 380.958527,182.801315
C371.531708,172.982285 360.721069,164.437668 350.126923,155.816772
C345.008759,151.651917 339.268555,147.970078 333.282501,145.216263
C323.214539,140.584625 312.567352,137.220413 302.453308,132.678497
C289.356079,126.796936 275.393951,125.459808 261.462189,124.131126
C253.702454,123.391068 245.813721,124.054878 237.984024,123.985710
C224.534637,123.866913 211.432053,126.135857 198.571503,129.829880
C192.325058,131.624084 186.106689,133.634689 180.086365,136.068619
C171.847473,139.399490 163.321548,142.431656 155.807404,147.040771
C146.244919,152.906326 137.541290,160.180847 128.521606,166.920502
C115.667244,176.525482 105.202560,188.528900 96.263199,201.629395
C83.843300,219.830582 74.272469,239.672897 69.242256,261.181366
C66.337685,273.600830 65.390160,286.515656 64.114471,299.262878
C63.454178,305.860901 63.998310,312.579437 64.000557,320.196991
M700.000549,267.709198
C701.003601,261.993408 701.442383,256.094971 703.212341,250.627457
C704.349854,247.113678 706.999023,243.754944 709.763367,241.176620
C714.504150,236.754898 720.838928,238.534729 726.591248,237.882950
C733.326843,237.119751 740.355835,245.447449 740.902527,251.138641
C741.627380,258.685516 741.869019,266.296082 741.954529,273.883362
C742.110413,287.714264 742.082520,301.549042 741.938965,315.380219
C741.903870,318.762207 742.807922,320.161072 746.434265,320.070099
C755.095093,319.852936 763.767822,319.871704 772.429871,320.063141
C775.882568,320.139465 777.121338,319.070282 777.067017,315.512878
C776.886292,303.682861 776.580811,291.828918 777.132080,280.021881
C777.566406,270.721069 775.747253,261.493286 778.716919,252.026627
C782.402710,240.277084 798.962158,232.505234 809.311035,239.192749
C811.104492,240.351700 812.786316,242.021698 813.895569,243.837006
C817.093872,249.071365 817.925720,255.027191 817.961060,261.019958
C818.067383,279.018463 817.931274,297.018646 818.110168,315.015991
C818.126709,316.681702 819.667053,319.745422 820.574280,319.773651
C831.322266,320.108551 842.084412,319.989258 853.001038,319.989258
C853.001038,297.391876 853.205383,275.405060 852.864807,253.426697
C852.773865,247.560730 851.258667,241.666763 849.976562,235.878845
C846.333313,219.432281 834.250732,210.943253 819.354736,207.404999
C810.181213,205.225998 800.282654,205.301300 790.440063,208.662613
C781.420532,211.742844 774.118896,216.502090 768.164978,222.235458
C747.071045,201.623550 724.357544,202.101212 700.253174,215.786057
C699.768738,207.124359 698.104004,206.620041 690.837158,206.937241
C683.850830,207.242172 676.840515,207.034073 669.841125,206.989441
C666.565369,206.968552 664.989624,208.452454 664.991394,211.766724
C665.009888,246.598343 664.968567,281.430145 665.142822,316.260895
C665.149109,317.511871 667.185364,319.803802 668.322876,319.834137
C678.762878,320.112610 689.213440,319.998077 700.000549,319.998077
C700.000549,302.591827 700.000549,285.631531 700.000549,267.709198
M914.003357,337.499115
C914.003357,329.017212 914.003357,320.535309 914.003357,312.361572
C919.192261,315.128754 923.545776,319.072876 928.323975,319.681274
C940.558167,321.238983 952.859192,322.985840 965.196411,318.231506
C975.435486,314.285767 983.314026,308.298981 990.075928,299.737915
C996.716797,291.330078 999.005249,281.461212 1000.631897,271.665649
C1001.669922,265.414520 1001.176270,258.643829 999.500671,251.794693
C997.329773,242.921234 994.460327,235.010117 989.268677,227.517410
C983.349426,218.974640 975.429321,213.426147 965.970154,210.092941
C960.254028,208.078705 954.148743,206.721985 948.118408,206.178497
C942.611328,205.682175 936.968079,206.655319 931.390503,207.058380
C930.907410,207.093292 930.511536,207.810196 929.998535,208.037445
C924.400696,210.517303 918.787598,212.962708 913.193787,215.410858
C912.741882,207.120819 912.617981,207.003113 904.294739,207.003098
C897.629944,207.003082 890.957092,207.203522 884.303101,206.935455
C879.548035,206.743851 877.904480,208.564453 877.929871,213.304977
C878.078308,240.962982 878.002808,268.622223 878.002686,296.281036
C878.002625,315.942139 878.006592,335.603210 877.996643,355.264313
C877.995422,357.642517 877.659180,360.054260 881.311279,360.026611
C891.777161,359.947388 902.243896,359.998718 914.003357,359.998718
C914.003357,352.574524 914.003357,345.536469 914.003357,337.499115
M492.718292,180.027328
C492.211884,180.453384 491.766235,181.001892 491.190216,181.287643
C475.116425,189.262009 469.481415,203.500595 468.115784,220.141785
C467.946014,222.210541 469.788605,224.378433 469.925446,226.549118
C470.780426,240.114548 479.437927,247.803864 490.548187,252.985992
C497.395874,256.179901 504.948181,257.914581 512.258118,260.051453
C519.605835,262.199402 527.160889,263.690216 534.403931,266.126373
C539.233459,267.750793 543.999084,270.066772 548.151184,272.986389
C550.145508,274.388702 552.294922,278.608124 551.551819,280.343140
C548.216797,288.130707 543.025635,292.321136 533.834229,291.952789
C523.411743,291.535126 512.728333,293.813110 502.689911,289.018219
C496.341949,285.986023 489.780548,283.375610 483.564789,280.101624
C480.133972,278.294525 477.620270,278.959839 475.919037,282.620483
C473.532593,287.755463 470.739777,292.704742 468.043732,297.691803
C465.481476,302.431335 466.155365,306.386658 470.658722,308.831024
C475.161316,311.274963 480.086609,312.932678 484.627991,315.313873
C494.389801,320.432251 505.304688,321.272400 515.766052,322.594666
C524.098267,323.647827 532.829590,323.715393 541.651306,321.457703
C548.943787,319.591461 556.269958,318.249695 563.151917,315.002808
C575.711609,309.077209 587.384338,294.259521 586.931274,279.181030
C586.781311,274.189484 586.983948,269.350555 585.365356,264.161224
C582.716736,255.669708 577.084290,250.667831 570.544739,245.801697
C561.703369,239.222687 550.859680,237.773712 540.888794,234.209961
C532.666260,231.271103 523.756165,230.315735 515.328125,227.870163
C510.104248,226.354355 505.285492,222.200073 504.966888,217.990692
C504.588837,212.995987 507.714233,208.096329 512.872009,205.579178
C522.631409,200.816238 533.038269,200.951141 543.004456,203.296753
C552.191040,205.458878 560.864441,209.800949 570.394104,213.422241
C570.772705,212.550812 571.494324,210.998413 572.128601,209.411087
C574.449036,203.604324 576.521484,197.686661 579.101685,191.998718
C581.916626,185.793289 581.694275,185.488098 576.076477,182.435684
C566.150696,177.042603 555.096069,174.488907 544.403992,173.447083
C527.257507,171.776321 509.656555,171.599075 492.718292,180.027328
M697.659180,338.845398
C696.822083,339.762909 695.792114,340.567200 695.177307,341.615143
C687.777954,354.226837 680.458618,366.885468 673.079468,379.509094
C668.092773,388.040009 663.044312,396.534882 658.222412,404.708801
C654.663574,399.262360 651.184570,394.332306 648.120483,389.156647
C643.481812,381.321289 639.211914,373.268433 634.637512,365.393829
C629.812988,357.088623 624.912659,348.822968 619.808533,340.688690
C618.818787,339.111389 616.783203,337.248779 615.153992,337.173950
C607.232483,336.810181 599.285095,337.009583 591.270874,337.009583
C591.270874,375.904846 591.270874,414.283905 591.270874,452.704163
C600.936951,452.704163 610.329590,452.704163 620.244873,452.704163
C620.244873,432.481262 620.244873,412.549652 620.244873,391.910706
C630.442505,408.673584 640.177917,424.676636 650.028442,440.868927
C654.986694,440.868927 660.297363,440.868927 665.167297,440.868927
C674.998047,424.542725 684.653503,408.507568 694.999939,391.324951
C694.999939,394.261932 694.999939,395.851807 694.999878,397.441650
C694.999634,414.431152 694.935791,431.421295 695.107300,448.409058
C695.122742,449.939087 696.609131,452.742645 697.494629,452.776062
C706.240967,453.106110 715.004700,452.975586 723.678406,452.975586
C723.678406,413.991150 723.678406,375.611664 723.678406,337.000031
C716.547424,337.000031 709.735840,336.933044 702.927429,337.048401
C701.281433,337.076263 699.645569,337.706635 697.659180,338.845398
M1178.050659,297.488983
C1173.984375,292.795288 1170.044556,287.978821 1165.722900,283.533295
C1165.033325,282.823975 1162.024536,283.165619 1161.118530,284.062531
C1154.391235,290.720947 1145.625854,292.262512 1136.968994,293.843140
C1134.858032,294.228546 1132.397461,292.648987 1130.087891,292.007690
C1126.405273,290.985168 1122.440430,290.539673 1119.089600,288.862000
C1113.614014,286.120483 1110.280762,281.181061 1107.597290,274.998688
C1109.763916,274.998688 1111.377197,274.998688 1112.990479,274.998688
C1136.989868,274.998718 1160.989380,275.007416 1184.988770,274.984406
C1187.206787,274.982300 1190.141235,275.717285 1189.969971,271.960388
C1189.569946,263.183472 1190.212646,254.528198 1187.398804,245.693314
C1184.952515,238.012634 1181.594116,231.257217 1176.623901,225.313248
C1168.269531,215.322083 1157.004761,209.510071 1144.493164,207.230072
C1134.472046,205.403885 1124.345093,205.641190 1114.017578,208.653763
C1104.461182,211.441376 1096.045410,215.508530 1089.030762,222.107315
C1078.324707,232.178665 1072.473022,244.821854 1072.029175,259.670410
C1071.764893,268.505524 1071.559692,277.382202 1075.880005,285.560852
C1078.242798,290.033447 1080.077637,294.890656 1083.040283,298.920197
C1090.993652,309.737366 1102.174194,317.097137 1114.895142,319.496155
C1126.885376,321.757416 1139.690308,321.565094 1151.902588,320.260132
C1164.151367,318.951294 1174.627441,312.332367 1183.253052,302.853516
C1181.646729,301.149475 1180.145020,299.556458 1178.050659,297.488983
M790.578918,358.009674
C800.390686,360.744324 811.247681,359.832397 819.950928,366.714691
C820.924988,367.484985 824.819336,366.366882 825.747192,365.016602
C827.694031,362.183380 828.645142,358.641205 829.860901,355.337097
C831.159363,351.808167 832.291626,348.218079 833.454590,344.778412
C830.571960,343.246582 828.534973,341.889923 826.306641,341.028778
C817.923523,337.789215 809.393555,335.678772 800.296936,334.721802
C783.756348,332.981598 768.337097,334.832123 754.398987,344.295227
C746.641296,349.562195 743.130066,357.846375 741.175171,366.490662
C739.724670,372.904663 740.724548,379.800201 744.187073,385.434723
C746.983765,389.985718 750.759766,394.497070 755.176514,397.377441
C765.461365,404.084656 777.730103,405.767883 789.345276,409.086517
C794.527466,410.567108 799.546021,412.717987 804.488953,414.903656
C807.758362,416.349304 808.389832,419.111969 807.187500,422.506531
C805.506958,427.251129 801.804077,429.801117 796.268982,430.045135
C793.463867,430.168793 790.679810,430.768738 787.780457,431.167908
C785.563599,430.805237 783.106506,430.083710 780.642700,430.060394
C773.389893,429.991699 766.858826,427.874390 760.524170,424.408539
C756.529236,422.222748 752.051514,420.919434 748.165649,419.369965
C745.600464,425.009247 743.674927,429.570099 741.474243,433.994141
C738.962280,439.043884 739.416626,444.075531 743.657532,445.706696
C752.674805,449.175079 761.763855,453.040619 771.184753,454.737244
C784.902832,457.207825 798.895630,457.037628 812.292114,451.976868
C815.368042,450.814850 818.365295,449.288513 821.146423,447.530518
C829.611267,442.179718 835.287903,435.061798 837.252808,424.750519
C838.777710,416.748596 837.828186,409.478180 834.014221,402.650604
C826.993408,390.082367 813.503296,388.205017 801.562195,384.112946
C793.978699,381.514191 785.972656,380.175568 778.261353,377.912964
C773.309204,376.459930 771.025391,372.786713 772.035095,367.574432
C772.804810,363.601013 775.318787,361.482574 779.428101,360.805115
C782.913879,360.230469 786.292419,359.004730 790.578918,358.009674
M575.987793,355.653534
C572.364380,351.788025 569.298645,347.085052 565.005066,344.225952
C555.140198,337.657104 543.773438,334.587585 532.007690,334.111725
C517.667969,333.531830 503.936249,335.889557 491.398529,343.847748
C477.978455,352.365997 468.313263,363.774078 465.248657,379.285736
C462.921051,391.066986 462.829803,403.051178 466.677460,415.144562
C470.352295,426.694794 477.301544,435.575714 486.052429,442.744537
C496.730988,451.492523 509.973907,455.179474 523.763611,455.942322
C535.877075,456.612396 547.677795,454.543518 558.420715,448.853455
C563.916138,445.942780 568.746704,441.699554 573.642090,437.765411
C576.173523,435.731049 577.042725,432.685699 574.377747,430.152069
C569.923645,425.917542 565.272827,421.858795 560.411743,418.105713
C559.232910,417.195618 556.003052,416.953308 555.258545,417.784790
C549.404358,424.323181 542.165649,428.247314 533.671143,429.619965
C522.909302,431.358948 513.309265,428.136444 505.072723,421.220367
C494.848663,412.635254 492.880554,400.884308 494.188110,388.559265
C494.787628,382.908417 496.986694,377.538635 501.085938,372.822784
C507.257599,365.722748 514.224670,361.380676 523.780518,360.483948
C534.578430,359.470581 543.965210,361.561951 552.085144,369.082306
C557.913696,374.480530 556.241394,374.948303 562.433044,369.716705
C567.258057,365.639740 571.494873,360.866577 575.987793,355.653534
M1018.002808,307.472992
C1018.002808,309.970795 1018.220215,312.492126 1017.953308,314.961090
C1017.523621,318.934753 1019.022339,320.214294 1023.018433,320.084198
C1031.501953,319.807953 1040.010132,319.762878 1048.489502,320.097076
C1052.928833,320.272064 1054.121582,318.847504 1054.097534,314.465179
C1053.922363,282.494263 1054.003296,250.521896 1054.003296,218.549988
C1054.003296,203.230118 1053.942627,187.909836 1054.044067,172.590637
C1054.070557,168.575485 1052.984985,166.686478 1048.424316,166.893066
C1040.115356,167.269455 1031.766479,167.251602 1023.455322,166.900009
C1018.923279,166.708267 1017.901794,168.313202 1017.915466,172.599854
C1018.057495,217.226868 1018.002808,261.854492 1018.002808,307.472992
M604.002502,236.500000
C604.002502,262.645538 603.992493,288.791046 604.020996,314.936554
C604.023376,317.127075 603.219055,319.983276 606.987793,319.990448
C617.580750,320.010529 628.173706,319.997437 638.999573,319.997437
C638.999573,283.169495 638.980591,246.890823 639.035217,210.612259
C639.039612,207.676453 637.719177,206.936295 635.060547,206.966812
C626.568542,207.064270 618.072937,207.105545 609.582336,206.957809
C605.571960,206.888046 603.879028,208.465317 603.958862,212.519440
C604.109741,220.176956 604.002502,227.839523 604.002502,236.500000
M608.599670,160.998871
C607.743591,161.822220 606.885071,162.643066 606.031921,163.469391
C600.113281,169.202011 598.977539,180.200821 603.324890,186.911346
C608.245728,194.507111 615.457458,195.975693 623.874146,196.178894
C630.932251,196.349274 640.672180,190.137878 642.751099,181.790466
C645.296326,171.570679 639.072632,159.382675 629.410095,158.257416
C622.822510,157.490250 615.536560,156.155121 608.599670,160.998871
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M63.999424,319.720276
C63.998310,312.579437 63.454178,305.860901 64.114471,299.262878
C65.390160,286.515656 66.337685,273.600830 69.242256,261.181366
C74.272469,239.672897 83.843300,219.830582 96.263199,201.629395
C105.202560,188.528900 115.667244,176.525482 128.521606,166.920502
C137.541290,160.180847 146.244919,152.906326 155.807404,147.040771
C163.321548,142.431656 171.847473,139.399490 180.086365,136.068619
C186.106689,133.634689 192.325058,131.624084 198.571503,129.829880
C211.432053,126.135857 224.534637,123.866913 237.984024,123.985710
C245.813721,124.054878 253.702454,123.391068 261.462189,124.131126
C275.393951,125.459808 289.356079,126.796936 302.453308,132.678497
C312.567352,137.220413 323.214539,140.584625 333.282501,145.216263
C339.268555,147.970078 345.008759,151.651917 350.126923,155.816772
C360.721069,164.437668 371.531708,172.982285 380.958527,182.801315
C393.549133,195.915741 404.182678,210.694275 411.012817,227.824661
C414.914093,237.609146 420.041626,247.120499 422.351318,257.270416
C425.398376,270.660553 427.171173,284.517761 427.733765,298.246185
C428.291565,311.857422 427.604340,325.690918 425.692596,339.175934
C424.255096,349.315521 420.627380,359.296631 416.866241,368.914825
C412.524139,380.018585 407.827393,391.163300 401.719666,401.352081
C393.829620,414.514130 384.391174,426.830200 372.679474,436.943085
C363.273773,445.064819 353.585419,452.989471 343.293976,459.919708
C332.266968,467.345306 320.360229,473.421570 307.379944,477.033173
C297.577362,479.760620 287.986267,483.691742 278.013733,485.260803
C263.146606,487.599915 248.099548,489.610657 232.910431,487.100372
C226.322098,486.011566 219.408585,486.465118 212.995956,484.831543
C201.480072,481.897980 190.050858,478.397339 178.926697,474.223969
C169.872360,470.827118 160.990952,466.667877 152.605713,461.849762
C133.172119,450.683167 116.688789,435.828888 102.921257,418.238251
C90.907585,402.888519 80.925453,386.167114 74.948448,367.458496
C71.210541,355.758484 68.138870,343.834839 65.117630,331.922913
C64.163689,328.161774 64.340988,324.113739 63.999424,319.720276
M373.803070,264.161163
C374.540649,265.063049 375.228424,266.011658 376.024048,266.859039
C380.390961,271.510010 384.857544,272.103058 390.835663,268.866821
C394.899231,266.667023 396.925262,261.473236 395.901093,256.367157
C394.867981,251.216583 390.827637,249.390701 386.713470,247.395813
C384.988373,246.559357 383.019623,245.259781 382.211853,243.645309
C373.359100,225.950943 362.050842,210.180756 347.264618,196.897125
C329.417358,180.863541 309.211853,169.471756 285.802979,163.674896
C269.441223,159.623138 253.142990,157.333633 236.155579,158.958618
C218.780930,160.620636 202.009598,164.340561 186.356079,171.733170
C156.188004,185.980545 132.665710,207.724762 117.004974,237.363831
C109.242599,252.054688 103.114296,267.461334 101.922722,284.330902
C101.233727,294.085205 100.680733,303.851501 100.283485,313.621216
C100.228317,314.977875 101.109901,317.276947 102.089310,317.619293
C107.100960,319.371124 112.057945,315.515747 111.856613,310.140381
C111.170479,291.821472 114.529312,274.226746 120.947701,257.130157
C121.985123,254.366760 123.305466,252.783432 126.666801,252.820740
C141.827621,252.989029 156.992355,252.988235 172.153336,252.826797
C175.953064,252.786362 177.157364,254.259933 177.012848,257.839386
C176.831528,262.330566 177.195847,266.847931 176.927277,271.330200
C176.685104,275.371918 177.953918,277.137756 182.244629,276.855804
C186.889908,276.550598 191.576233,276.924713 196.234528,276.742981
C199.317886,276.622650 200.359665,277.839966 200.266113,280.834900
C200.110123,285.828522 200.031189,290.842133 200.307068,295.825928
C200.520233,299.676239 199.355209,301.133148 195.285645,300.993530
C186.797852,300.702301 178.288971,301.060059 169.797302,300.832397
C166.129456,300.734070 164.823700,301.806183 164.905304,305.612335
C165.133789,316.271362 165.160690,326.943359 164.853775,337.598358
C164.786545,339.932068 163.566772,342.792297 161.906250,344.417175
C156.572708,349.636261 150.784134,354.390259 145.171524,359.324127
C141.680984,362.392609 138.262344,365.547882 134.683929,368.510193
C129.761963,372.584778 128.176666,372.238251 125.403580,366.452881
C123.826569,363.162781 122.046677,359.832428 121.310089,356.320526
C120.721245,353.513000 121.383606,350.374695 121.843933,347.438629
C122.169853,345.359833 123.700989,343.347687 123.617043,341.351074
C123.405602,336.322662 118.303612,331.066437 113.547096,330.297241
C108.687645,329.511383 103.682655,332.154724 101.120216,336.860352
C98.948997,340.847534 100.459381,346.477936 103.841942,350.554291
C106.635559,353.920898 109.290100,357.701569 110.843727,361.745422
C116.749146,377.116455 125.232292,390.950378 135.985001,403.218323
C151.515823,420.937714 170.117142,434.541290 192.116150,443.590637
C210.865234,451.303101 230.447021,454.663086 250.364731,454.521057
C262.617218,454.433716 275.009308,451.750275 287.051575,448.983002
C311.931061,443.265778 333.063507,430.160370 351.341492,412.755798
C367.760681,397.121155 379.816040,378.262604 387.345184,356.819946
C390.510986,347.803833 393.681488,338.467926 394.591095,329.059021
C395.844391,316.095062 394.830933,302.922302 395.032654,289.842743
C395.163361,281.369476 394.579041,281.154846 386.128876,283.122772
C384.672028,283.462036 383.572754,285.236115 382.247131,286.268982
C381.018219,287.226532 379.723419,288.831482 378.430237,288.858887
C368.104126,289.077667 357.769897,288.886139 347.441803,289.050476
C343.847870,289.107635 342.829773,287.597534 342.903564,284.263031
C343.058380,277.268311 342.808624,270.263733 343.009216,263.271362
C343.104492,259.950256 341.906586,258.992371 338.675476,259.032013
C326.180634,259.185364 313.670227,258.761353 301.191132,259.230377
C294.441406,259.484070 289.702911,258.295258 286.452271,251.529907
C284.608643,247.692810 284.765503,245.634430 287.565704,242.934265
C293.202148,237.499130 298.843689,232.049026 304.122314,226.275177
C305.717865,224.529953 306.867950,221.722794 306.946014,219.359879
C307.259491,209.872818 307.060089,200.369171 307.074646,190.871689
C307.084381,184.515427 307.703156,184.014328 313.075165,186.990326
C329.363647,196.013855 344.031219,207.146301 355.090576,222.277634
C364.102905,234.608261 374.254211,246.651154 373.803070,264.161163
z" />
<path class="no-fill" fill="#a3b5c4" opacity="1.000000" stroke="none" d="
M700.000549,268.190216
C700.000549,285.631531 700.000549,302.591827 700.000549,319.998077
C689.213440,319.998077 678.762878,320.112610 668.322876,319.834137
C667.185364,319.803802 665.149109,317.511871 665.142822,316.260895
C664.968567,281.430145 665.009888,246.598343 664.991394,211.766724
C664.989624,208.452454 666.565369,206.968552 669.841125,206.989441
C676.840515,207.034073 683.850830,207.242172 690.837158,206.937241
C698.104004,206.620041 699.768738,207.124359 700.253174,215.786057
C724.357544,202.101212 747.071045,201.623550 768.164978,222.235458
C774.118896,216.502090 781.420532,211.742844 790.440063,208.662613
C800.282654,205.301300 810.181213,205.225998 819.354736,207.404999
C834.250732,210.943253 846.333313,219.432281 849.976562,235.878845
C851.258667,241.666763 852.773865,247.560730 852.864807,253.426697
C853.205383,275.405060 853.001038,297.391876 853.001038,319.989258
C842.084412,319.989258 831.322266,320.108551 820.574280,319.773651
C819.667053,319.745422 818.126709,316.681702 818.110168,315.015991
C817.931274,297.018646 818.067383,279.018463 817.961060,261.019958
C817.925720,255.027191 817.093872,249.071365 813.895569,243.837006
C812.786316,242.021698 811.104492,240.351700 809.311035,239.192749
C798.962158,232.505234 782.402710,240.277084 778.716919,252.026627
C775.747253,261.493286 777.566406,270.721069 777.132080,280.021881
C776.580811,291.828918 776.886292,303.682861 777.067017,315.512878
C777.121338,319.070282 775.882568,320.139465 772.429871,320.063141
C763.767822,319.871704 755.095093,319.852936 746.434265,320.070099
C742.807922,320.161072 741.903870,318.762207 741.938965,315.380219
C742.082520,301.549042 742.110413,287.714264 741.954529,273.883362
C741.869019,266.296082 741.627380,258.685516 740.902527,251.138641
C740.355835,245.447449 733.326843,237.119751 726.591248,237.882950
C720.838928,238.534729 714.504150,236.754898 709.763367,241.176620
C706.999023,243.754944 704.349854,247.113678 703.212341,250.627457
C701.442383,256.094971 701.003601,261.993408 700.000549,268.190216
z" />
<path class="no-fill" fill="#a3b5c4" opacity="1.000000" stroke="none" d="
M914.003357,337.998749
C914.003357,345.536469 914.003357,352.574524 914.003357,359.998718
C902.243896,359.998718 891.777161,359.947388 881.311279,360.026611
C877.659180,360.054260 877.995422,357.642517 877.996643,355.264313
C878.006592,335.603210 878.002625,315.942139 878.002686,296.281036
C878.002808,268.622223 878.078308,240.962982 877.929871,213.304977
C877.904480,208.564453 879.548035,206.743851 884.303101,206.935455
C890.957092,207.203522 897.629944,207.003082 904.294739,207.003098
C912.617981,207.003113 912.741882,207.120819 913.193787,215.410858
C918.787598,212.962708 924.400696,210.517303 929.998535,208.037445
C930.511536,207.810196 930.907410,207.093292 931.390503,207.058380
C936.968079,206.655319 942.611328,205.682175 948.118408,206.178497
C954.148743,206.721985 960.254028,208.078705 965.970154,210.092941
C975.429321,213.426147 983.349426,218.974640 989.268677,227.517410
C994.460327,235.010117 997.329773,242.921234 999.500671,251.794693
C1001.176270,258.643829 1001.669922,265.414520 1000.631897,271.665649
C999.005249,281.461212 996.716797,291.330078 990.075928,299.737915
C983.314026,308.298981 975.435486,314.285767 965.196411,318.231506
C952.859192,322.985840 940.558167,321.238983 928.323975,319.681274
C923.545776,319.072876 919.192261,315.128754 914.003357,312.361572
C914.003357,320.535309 914.003357,329.017212 914.003357,337.998749
M913.001160,259.949951
C913.663269,264.413422 913.934204,268.977936 915.056396,273.322571
C919.551941,290.726929 932.385742,293.948395 946.534058,291.484619
C951.012024,290.704803 956.060425,287.278290 958.790222,283.554596
C965.463379,274.451721 967.400940,264.486725 963.340759,252.921021
C960.051270,243.550812 953.568604,238.419678 945.375244,236.369949
C937.125977,234.306259 928.753723,236.094330 921.619324,242.549271
C916.433289,247.241470 915.774292,253.529709 913.001160,259.949951
z" />
<path class="no-fill" fill="#a3b5c4" opacity="1.000000" stroke="none" d="
M493.107117,179.990189
C509.656555,171.599075 527.257507,171.776321 544.403992,173.447083
C555.096069,174.488907 566.150696,177.042603 576.076477,182.435684
C581.694275,185.488098 581.916626,185.793289 579.101685,191.998718
C576.521484,197.686661 574.449036,203.604324 572.128601,209.411087
C571.494324,210.998413 570.772705,212.550812 570.394104,213.422241
C560.864441,209.800949 552.191040,205.458878 543.004456,203.296753
C533.038269,200.951141 522.631409,200.816238 512.872009,205.579178
C507.714233,208.096329 504.588837,212.995987 504.966888,217.990692
C505.285492,222.200073 510.104248,226.354355 515.328125,227.870163
C523.756165,230.315735 532.666260,231.271103 540.888794,234.209961
C550.859680,237.773712 561.703369,239.222687 570.544739,245.801697
C577.084290,250.667831 582.716736,255.669708 585.365356,264.161224
C586.983948,269.350555 586.781311,274.189484 586.931274,279.181030
C587.384338,294.259521 575.711609,309.077209 563.151917,315.002808
C556.269958,318.249695 548.943787,319.591461 541.651306,321.457703
C532.829590,323.715393 524.098267,323.647827 515.766052,322.594666
C505.304688,321.272400 494.389801,320.432251 484.627991,315.313873
C480.086609,312.932678 475.161316,311.274963 470.658722,308.831024
C466.155365,306.386658 465.481476,302.431335 468.043732,297.691803
C470.739777,292.704742 473.532593,287.755463 475.919037,282.620483
C477.620270,278.959839 480.133972,278.294525 483.564789,280.101624
C489.780548,283.375610 496.341949,285.986023 502.689911,289.018219
C512.728333,293.813110 523.411743,291.535126 533.834229,291.952789
C543.025635,292.321136 548.216797,288.130707 551.551819,280.343140
C552.294922,278.608124 550.145508,274.388702 548.151184,272.986389
C543.999084,270.066772 539.233459,267.750793 534.403931,266.126373
C527.160889,263.690216 519.605835,262.199402 512.258118,260.051453
C504.948181,257.914581 497.395874,256.179901 490.548187,252.985992
C479.437927,247.803864 470.780426,240.114548 469.925446,226.549118
C469.788605,224.378433 467.946014,222.210541 468.115784,220.141785
C469.481415,203.500595 475.116425,189.262009 491.190216,181.287643
C491.766235,181.001892 492.211884,180.453384 493.107117,179.990189
z" />
<path class="no-fill" fill="#68C4E2" opacity="1.000000" stroke="none" d="
M697.832153,338.452667
C699.645569,337.706635 701.281433,337.076263 702.927429,337.048401
C709.735840,336.933044 716.547424,337.000031 723.678406,337.000031
C723.678406,375.611664 723.678406,413.991150 723.678406,452.975586
C715.004700,452.975586 706.240967,453.106110 697.494629,452.776062
C696.609131,452.742645 695.122742,449.939087 695.107300,448.409058
C694.935791,431.421295 694.999634,414.431152 694.999878,397.441650
C694.999939,395.851807 694.999939,394.261932 694.999939,391.324951
C684.653503,408.507568 674.998047,424.542725 665.167297,440.868927
C660.297363,440.868927 654.986694,440.868927 650.028442,440.868927
C640.177917,424.676636 630.442505,408.673584 620.244873,391.910706
C620.244873,412.549652 620.244873,432.481262 620.244873,452.704163
C610.329590,452.704163 600.936951,452.704163 591.270874,452.704163
C591.270874,414.283905 591.270874,375.904846 591.270874,337.009583
C599.285095,337.009583 607.232483,336.810181 615.153992,337.173950
C616.783203,337.248779 618.818787,339.111389 619.808533,340.688690
C624.912659,348.822968 629.812988,357.088623 634.637512,365.393829
C639.211914,373.268433 643.481812,381.321289 648.120483,389.156647
C651.184570,394.332306 654.663574,399.262360 658.222412,404.708801
C663.044312,396.534882 668.092773,388.040009 673.079468,379.509094
C680.458618,366.885468 687.777954,354.226837 695.177307,341.615143
C695.792114,340.567200 696.822083,339.762909 697.832153,338.452667
z" />
<path class="no-fill" fill="#a3b5c4" opacity="1.000000" stroke="none" d="
M1178.347046,297.726196
C1180.145020,299.556458 1181.646729,301.149475 1183.253052,302.853516
C1174.627441,312.332367 1164.151367,318.951294 1151.902588,320.260132
C1139.690308,321.565094 1126.885376,321.757416 1114.895142,319.496155
C1102.174194,317.097137 1090.993652,309.737366 1083.040283,298.920197
C1080.077637,294.890656 1078.242798,290.033447 1075.880005,285.560852
C1071.559692,277.382202 1071.764893,268.505524 1072.029175,259.670410
C1072.473022,244.821854 1078.324707,232.178665 1089.030762,222.107315
C1096.045410,215.508530 1104.461182,211.441376 1114.017578,208.653763
C1124.345093,205.641190 1134.472046,205.403885 1144.493164,207.230072
C1157.004761,209.510071 1168.269531,215.322083 1176.623901,225.313248
C1181.594116,231.257217 1184.952515,238.012634 1187.398804,245.693314
C1190.212646,254.528198 1189.569946,263.183472 1189.969971,271.960388
C1190.141235,275.717285 1187.206787,274.982300 1184.988770,274.984406
C1160.989380,275.007416 1136.989868,274.998718 1112.990479,274.998688
C1111.377197,274.998688 1109.763916,274.998688 1107.597290,274.998688
C1110.280762,281.181061 1113.614014,286.120483 1119.089600,288.862000
C1122.440430,290.539673 1126.405273,290.985168 1130.087891,292.007690
C1132.397461,292.648987 1134.858032,294.228546 1136.968994,293.843140
C1145.625854,292.262512 1154.391235,290.720947 1161.118530,284.062531
C1162.024536,283.165619 1165.033325,282.823975 1165.722900,283.533295
C1170.044556,287.978821 1173.984375,292.795288 1178.347046,297.726196
M1127.098877,233.448639
C1126.430298,233.964386 1125.806396,234.852570 1125.086182,234.939240
C1116.218018,236.006531 1108.822510,243.463074 1107.482422,252.909882
C1123.794922,252.909882 1140.094849,252.909882 1156.189941,252.909882
C1152.296509,238.479507 1141.843994,233.241669 1127.098877,233.448639
z" />
<path class="no-fill" fill="#68C4E2" opacity="1.000000" stroke="none" d="
M790.148682,358.038391
C786.292419,359.004730 782.913879,360.230469 779.428101,360.805115
C775.318787,361.482574 772.804810,363.601013 772.035095,367.574432
C771.025391,372.786713 773.309204,376.459930 778.261353,377.912964
C785.972656,380.175568 793.978699,381.514191 801.562195,384.112946
C813.503296,388.205017 826.993408,390.082367 834.014221,402.650604
C837.828186,409.478180 838.777710,416.748596 837.252808,424.750519
C835.287903,435.061798 829.611267,442.179718 821.146423,447.530518
C818.365295,449.288513 815.368042,450.814850 812.292114,451.976868
C798.895630,457.037628 784.902832,457.207825 771.184753,454.737244
C761.763855,453.040619 752.674805,449.175079 743.657532,445.706696
C739.416626,444.075531 738.962280,439.043884 741.474243,433.994141
C743.674927,429.570099 745.600464,425.009247 748.165649,419.369965
C752.051514,420.919434 756.529236,422.222748 760.524170,424.408539
C766.858826,427.874390 773.389893,429.991699 780.642700,430.060394
C783.106506,430.083710 785.563599,430.805237 787.780457,431.167908
C790.679810,430.768738 793.463867,430.168793 796.268982,430.045135
C801.804077,429.801117 805.506958,427.251129 807.187500,422.506531
C808.389832,419.111969 807.758362,416.349304 804.488953,414.903656
C799.546021,412.717987 794.527466,410.567108 789.345276,409.086517
C777.730103,405.767883 765.461365,404.084656 755.176514,397.377441
C750.759766,394.497070 746.983765,389.985718 744.187073,385.434723
C740.724548,379.800201 739.724670,372.904663 741.175171,366.490662
C743.130066,357.846375 746.641296,349.562195 754.398987,344.295227
C768.337097,334.832123 783.756348,332.981598 800.296936,334.721802
C809.393555,335.678772 817.923523,337.789215 826.306641,341.028778
C828.534973,341.889923 830.571960,343.246582 833.454590,344.778412
C832.291626,348.218079 831.159363,351.808167 829.860901,355.337097
C828.645142,358.641205 827.694031,362.183380 825.747192,365.016602
C824.819336,366.366882 820.924988,367.484985 819.950928,366.714691
C811.247681,359.832397 800.390686,360.744324 790.148682,358.038391
z" />
<path class="no-fill" fill="#68C4E2" opacity="1.000000" stroke="none" d="
M575.990479,356.028198
C571.494873,360.866577 567.258057,365.639740 562.433044,369.716705
C556.241394,374.948303 557.913696,374.480530 552.085144,369.082306
C543.965210,361.561951 534.578430,359.470581 523.780518,360.483948
C514.224670,361.380676 507.257599,365.722748 501.085938,372.822784
C496.986694,377.538635 494.787628,382.908417 494.188110,388.559265
C492.880554,400.884308 494.848663,412.635254 505.072723,421.220367
C513.309265,428.136444 522.909302,431.358948 533.671143,429.619965
C542.165649,428.247314 549.404358,424.323181 555.258545,417.784790
C556.003052,416.953308 559.232910,417.195618 560.411743,418.105713
C565.272827,421.858795 569.923645,425.917542 574.377747,430.152069
C577.042725,432.685699 576.173523,435.731049 573.642090,437.765411
C568.746704,441.699554 563.916138,445.942780 558.420715,448.853455
C547.677795,454.543518 535.877075,456.612396 523.763611,455.942322
C509.973907,455.179474 496.730988,451.492523 486.052429,442.744537
C477.301544,435.575714 470.352295,426.694794 466.677460,415.144562
C462.829803,403.051178 462.921051,391.066986 465.248657,379.285736
C468.313263,363.774078 477.978455,352.365997 491.398529,343.847748
C503.936249,335.889557 517.667969,333.531830 532.007690,334.111725
C543.773438,334.587585 555.140198,337.657104 565.005066,344.225952
C569.298645,347.085052 572.364380,351.788025 575.990479,356.028198
z" />
<path class="no-fill" fill="#a3b5c4" opacity="1.000000" stroke="none" d="
M1018.002808,306.977478
C1018.002808,261.854492 1018.057495,217.226868 1017.915466,172.599854
C1017.901794,168.313202 1018.923279,166.708267 1023.455322,166.900009
C1031.766479,167.251602 1040.115356,167.269455 1048.424316,166.893066
C1052.984985,166.686478 1054.070557,168.575485 1054.044067,172.590637
C1053.942627,187.909836 1054.003296,203.230118 1054.003296,218.549988
C1054.003296,250.521896 1053.922363,282.494263 1054.097534,314.465179
C1054.121582,318.847504 1052.928833,320.272064 1048.489502,320.097076
C1040.010132,319.762878 1031.501953,319.807953 1023.018433,320.084198
C1019.022339,320.214294 1017.523621,318.934753 1017.953308,314.961090
C1018.220215,312.492126 1018.002808,309.970795 1018.002808,306.977478
z" />
<path class="no-fill" fill="#a3b5c4" opacity="1.000000" stroke="none" d="
M604.002502,236.000000
C604.002502,227.839523 604.109741,220.176956 603.958862,212.519440
C603.879028,208.465317 605.571960,206.888046 609.582336,206.957809
C618.072937,207.105545 626.568542,207.064270 635.060547,206.966812
C637.719177,206.936295 639.039612,207.676453 639.035217,210.612259
C638.980591,246.890823 638.999573,283.169495 638.999573,319.997437
C628.173706,319.997437 617.580750,320.010529 606.987793,319.990448
C603.219055,319.983276 604.023376,317.127075 604.020996,314.936554
C603.992493,288.791046 604.002502,262.645538 604.002502,236.000000
z" />
<path class="no-fill" fill="#a3b5c4" opacity="1.000000" stroke="none" d="
M609.012939,160.974777
C615.536560,156.155121 622.822510,157.490250 629.410095,158.257416
C639.072632,159.382675 645.296326,171.570679 642.751099,181.790466
C640.672180,190.137878 630.932251,196.349274 623.874146,196.178894
C615.457458,195.975693 608.245728,194.507111 603.324890,186.911346
C598.977539,180.200821 600.113281,169.202011 606.031921,163.469391
C606.885071,162.643066 607.743591,161.822220 609.012939,160.974777
z" />
<path class="no-fill" fill="#6EC5E3" opacity="1.000000" stroke="none" d="
M373.601624,263.811279
C374.254211,246.651154 364.102905,234.608261 355.090576,222.277634
C344.031219,207.146301 329.363647,196.013855 313.075165,186.990326
C307.703156,184.014328 307.084381,184.515427 307.074646,190.871689
C307.060089,200.369171 307.259491,209.872818 306.946014,219.359879
C306.867950,221.722794 305.717865,224.529953 304.122314,226.275177
C298.843689,232.049026 293.202148,237.499130 287.565704,242.934265
C284.765503,245.634430 284.608643,247.692810 286.452271,251.529907
C289.702911,258.295258 294.441406,259.484070 301.191132,259.230377
C313.670227,258.761353 326.180634,259.185364 338.675476,259.032013
C341.906586,258.992371 343.104492,259.950256 343.009216,263.271362
C342.808624,270.263733 343.058380,277.268311 342.903564,284.263031
C342.829773,287.597534 343.847870,289.107635 347.441803,289.050476
C357.769897,288.886139 368.104126,289.077667 378.430237,288.858887
C379.723419,288.831482 381.018219,287.226532 382.247131,286.268982
C383.572754,285.236115 384.672028,283.462036 386.128876,283.122772
C394.579041,281.154846 395.163361,281.369476 395.032654,289.842743
C394.830933,302.922302 395.844391,316.095062 394.591095,329.059021
C393.681488,338.467926 390.510986,347.803833 387.345184,356.819946
C379.816040,378.262604 367.760681,397.121155 351.341492,412.755798
C333.063507,430.160370 311.931061,443.265778 287.051575,448.983002
C275.009308,451.750275 262.617218,454.433716 250.364731,454.521057
C230.447021,454.663086 210.865234,451.303101 192.116150,443.590637
C170.117142,434.541290 151.515823,420.937714 135.985001,403.218323
C125.232292,390.950378 116.749146,377.116455 110.843727,361.745422
C109.290100,357.701569 106.635559,353.920898 103.841942,350.554291
C100.459381,346.477936 98.948997,340.847534 101.120216,336.860352
C103.682655,332.154724 108.687645,329.511383 113.547096,330.297241
C118.303612,331.066437 123.405602,336.322662 123.617043,341.351074
C123.700989,343.347687 122.169853,345.359833 121.843933,347.438629
C121.383606,350.374695 120.721245,353.513000 121.310089,356.320526
C122.046677,359.832428 123.826569,363.162781 125.403580,366.452881
C128.176666,372.238251 129.761963,372.584778 134.683929,368.510193
C138.262344,365.547882 141.680984,362.392609 145.171524,359.324127
C150.784134,354.390259 156.572708,349.636261 161.906250,344.417175
C163.566772,342.792297 164.786545,339.932068 164.853775,337.598358
C165.160690,326.943359 165.133789,316.271362 164.905304,305.612335
C164.823700,301.806183 166.129456,300.734070 169.797302,300.832397
C178.288971,301.060059 186.797852,300.702301 195.285645,300.993530
C199.355209,301.133148 200.520233,299.676239 200.307068,295.825928
C200.031189,290.842133 200.110123,285.828522 200.266113,280.834900
C200.359665,277.839966 199.317886,276.622650 196.234528,276.742981
C191.576233,276.924713 186.889908,276.550598 182.244629,276.855804
C177.953918,277.137756 176.685104,275.371918 176.927277,271.330200
C177.195847,266.847931 176.831528,262.330566 177.012848,257.839386
C177.157364,254.259933 175.953064,252.786362 172.153336,252.826797
C156.992355,252.988235 141.827621,252.989029 126.666801,252.820740
C123.305466,252.783432 121.985123,254.366760 120.947701,257.130157
C114.529312,274.226746 111.170479,291.821472 111.856613,310.140381
C112.057945,315.515747 107.100960,319.371124 102.089310,317.619293
C101.109901,317.276947 100.228317,314.977875 100.283485,313.621216
C100.680733,303.851501 101.233727,294.085205 101.922722,284.330902
C103.114296,267.461334 109.242599,252.054688 117.004974,237.363831
C132.665710,207.724762 156.188004,185.980545 186.356079,171.733170
C202.009598,164.340561 218.780930,160.620636 236.155579,158.958618
C253.142990,157.333633 269.441223,159.623138 285.802979,163.674896
C309.211853,169.471756 329.417358,180.863541 347.264618,196.897125
C362.050842,210.180756 373.359100,225.950943 382.211853,243.645309
C383.019623,245.259781 384.988373,246.559357 386.713470,247.395813
C390.827637,249.390701 394.867981,251.216583 395.901093,256.367157
C396.925262,261.473236 394.899231,266.667023 390.835663,268.866821
C384.857544,272.103058 380.390961,271.510010 376.024048,266.859039
C375.228424,266.011658 374.540649,265.063049 373.601624,263.811279
M204.086639,435.512756
C210.453171,437.272766 216.721054,439.865051 223.205109,440.633606
C241.173065,442.763275 259.108276,443.404602 277.096741,439.390533
C299.234955,434.450439 318.735718,424.687653 336.084747,410.285278
C341.277313,405.974670 341.251678,405.251465 335.997772,400.669525
C327.742279,393.469971 319.598236,386.142761 311.359863,378.923370
C299.603424,368.621155 303.878510,368.741730 292.292084,380.095947
C290.493469,381.858551 287.747345,383.446564 285.327118,383.629486
C278.870087,384.117462 272.339905,384.036926 265.862000,383.715179
C261.209229,383.484070 259.314392,385.128204 260.083649,389.741547
C260.852203,394.350555 258.554810,395.284668 254.371918,395.226929
C239.055893,395.015259 223.735229,395.141571 208.416321,395.131744
C199.800415,395.126221 200.907990,395.653503 200.871155,387.668762
C200.838928,380.685120 199.650024,374.442566 193.411514,369.777344
C189.055634,366.520020 185.543671,362.133881 181.656097,358.250580
C174.633652,351.235870 174.635300,351.236969 167.058334,357.271271
C166.670197,357.580383 166.196823,357.785858 165.822388,358.108368
C157.016434,365.692963 148.251022,373.325104 139.400055,380.856720
C136.672028,383.178131 136.418625,385.342316 138.898270,387.993378
C145.022675,394.541077 150.767075,401.474335 157.205826,407.691681
C170.398773,420.431030 186.091644,429.187988 204.086639,435.512756
M189.504349,347.996643
C192.728287,351.207245 195.952240,354.417877 199.176178,357.628479
C199.736893,357.378723 200.297623,357.128937 200.858337,356.879181
C200.858337,351.698547 201.058548,346.507599 200.793228,341.340607
C200.591003,337.401855 202.027390,336.099487 205.952591,336.137970
C222.281311,336.298004 238.613434,336.293732 254.942215,336.135315
C258.872528,336.097168 260.250702,337.461151 260.152832,341.366730
C259.944214,349.693329 260.243500,358.033051 260.014801,366.358612
C259.904877,370.360382 261.802704,371.810822 265.339996,371.876404
C270.004333,371.962921 274.713318,372.312592 279.319855,371.800446
C281.919434,371.511444 284.852325,370.264465 286.767761,368.504883
C293.020569,362.760864 299.027283,356.723663 304.785461,350.482574
C306.416779,348.714447 307.595947,345.905884 307.734680,343.502441
C308.127777,336.692963 307.676941,329.838257 307.950867,323.017120
C308.116058,318.903748 306.403870,317.816895 302.636169,317.999298
C297.815186,318.232727 292.966705,317.887024 288.144165,318.103912
C284.826172,318.253113 283.845947,316.994293 283.884430,313.768097
C284.031433,301.438782 284.118164,289.102600 283.826141,276.778473
C283.751923,273.646393 282.685364,270.291229 281.208313,267.496490
C278.969788,263.261078 276.119263,259.315491 273.214020,255.485458
C272.268311,254.238708 270.354767,253.045303 268.855835,253.009811
C259.362885,252.785034 249.861603,252.942444 240.364136,252.856552
C237.775986,252.833160 236.782440,253.856018 236.834427,256.405945
C236.932922,261.236359 236.679398,266.079132 236.914368,270.900085
C237.140869,275.547455 235.096466,277.174957 230.641739,276.931244
C226.155090,276.685760 221.637863,277.005707 217.150085,276.770996
C213.812454,276.596436 212.798996,277.935577 212.853012,281.131012
C212.999420,289.793610 212.794708,298.462250 212.953629,307.124390
C213.020248,310.755676 211.759567,312.195282 208.020218,312.115814
C199.192505,311.928070 190.357193,312.128113 181.526932,312.015228
C178.433701,311.975677 177.091797,312.948364 176.932510,316.274200
C176.059525,334.499359 175.987686,334.495911 189.504349,347.996643
M245.856842,170.442535
C236.495071,171.583374 227.142944,172.814087 217.766617,173.819061
C214.212967,174.199966 212.860947,175.938431 212.880417,179.365646
C212.944733,190.696289 212.997147,202.028778 212.847656,213.357834
C212.800400,216.939484 214.298065,218.038589 217.638611,217.924133
C222.465439,217.758774 227.304749,217.973434 232.133255,217.834946
C235.503876,217.738266 237.034760,219.014236 236.902878,222.514954
C236.733627,227.007736 237.052094,231.522736 236.794937,236.007202
C236.579971,239.756134 237.529114,241.415176 241.729218,241.261536
C250.382736,240.945038 259.065186,241.382462 267.714600,241.013977
C270.287140,240.904388 273.329865,239.740692 275.223877,238.027954
C281.272308,232.558395 287.059143,226.765442 292.558380,220.742554
C294.300293,218.834808 295.665710,215.843109 295.754883,213.296738
C296.110352,203.144745 295.790283,192.971069 295.954407,182.809204
C296.003235,179.785172 294.922882,178.334427 292.098022,177.404373
C277.351166,172.549149 262.175415,170.543961 245.856842,170.442535
M321.927368,318.081635
C320.939636,319.483459 319.173950,320.845184 319.099274,322.294067
C318.782715,328.436829 318.615570,334.631378 319.066162,340.757568
C319.550476,347.342529 318.086273,352.573547 312.693268,356.931824
C308.592346,360.245941 309.188843,362.111847 313.326263,365.623718
C324.207428,374.859924 335.143982,384.042938 345.710388,393.630798
C349.033508,396.646118 351.120758,396.275574 353.278473,393.070587
C358.266815,385.661163 363.458313,378.355225 367.931335,370.638641
C379.698975,350.337891 384.757355,328.303650 384.072845,304.874390
C383.977051,301.594086 383.148590,300.010559 379.532593,300.063782
C368.881195,300.220673 358.224945,300.200928 347.572876,300.067169
C344.191284,300.024719 342.631592,301.127838 342.848450,304.666779
C343.041504,307.817780 342.727325,311.000671 342.935242,314.149750
C343.143250,317.300171 341.774170,318.188782 338.833923,318.100464
C333.511902,317.940643 328.181580,318.056427 321.927368,318.081635
M132.906082,241.161758
C145.896606,241.163300 158.888931,241.044754 171.876511,241.240906
C175.682800,241.298401 177.366638,240.366486 177.076172,236.246521
C176.749008,231.606277 177.086380,226.923126 176.968918,222.262802
C176.887695,219.040878 178.276764,217.775879 181.462677,217.861099
C186.455429,217.994614 191.457886,217.781769 196.449448,217.935837
C199.423615,218.027634 200.836990,216.781525 200.842880,213.901978
C200.863678,203.742905 200.876633,193.583618 200.828979,183.424728
C200.816513,180.765610 199.823181,179.139816 196.794922,180.504532
C191.505920,182.888107 186.009399,184.904495 180.973343,187.738464
C166.201538,196.051071 153.793030,207.337753 142.665985,219.972870
C138.312943,224.915909 134.791306,230.625610 131.222748,236.198563
C130.420212,237.451874 127.890282,240.153168 132.906082,241.161758
M295.129028,279.610809
C295.130676,286.942169 295.216156,294.274872 295.099670,301.604340
C295.038605,305.446198 296.691376,307.002655 300.504852,306.950378
C309.167542,306.831665 317.834381,306.824524 326.496674,306.957581
C329.925903,307.010254 331.285492,305.691223 331.240570,302.252716
C331.120941,293.090118 331.107971,283.923401 331.253265,274.761505
C331.302826,271.636139 330.044708,270.728455 327.106201,270.773834
C319.110321,270.897369 311.111206,270.808838 303.113373,270.808533
C295.126740,270.808228 295.126740,270.810425 295.129028,279.610809
M188.979218,248.499146
C188.979797,252.817657 188.723175,257.160980 189.135895,261.439728
C189.261566,262.742523 191.202042,264.880341 192.361618,264.914215
C201.986938,265.195343 211.628006,265.202637 221.252731,264.911163
C222.481720,264.873962 224.641403,262.672241 224.678787,261.422638
C224.961761,251.964005 224.855377,242.492508 224.794373,233.025528
C224.776672,230.281296 223.555786,228.902054 220.466309,228.959534
C211.548996,229.125427 202.624847,229.104446 193.706741,228.955215
C190.326981,228.898666 188.815552,230.044388 188.940964,233.549881
C189.107132,238.194611 188.980408,242.849808 188.979218,248.499146
M234.490936,384.018036
C237.656876,384.017639 240.830460,383.880219 243.986511,384.056763
C246.941986,384.222076 248.185394,383.231781 248.138062,380.105896
C247.994247,370.610229 248.010529,361.110321 248.115372,351.613770
C248.146988,348.750519 246.987030,347.858429 244.250565,347.889343
C235.087189,347.992920 225.920303,348.025940 216.758224,347.875336
C213.549057,347.822601 212.827789,349.244904 212.860855,352.098480
C212.968979,361.428406 212.992065,370.761749 212.851135,380.090790
C212.803970,383.212860 214.045898,384.150696 216.999863,384.065582
C222.494049,383.907349 227.995987,384.018646 234.490936,384.018036
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M203.726532,435.348328
C186.091644,429.187988 170.398773,420.431030 157.205826,407.691681
C150.767075,401.474335 145.022675,394.541077 138.898270,387.993378
C136.418625,385.342316 136.672028,383.178131 139.400055,380.856720
C148.251022,373.325104 157.016434,365.692963 165.822388,358.108368
C166.196823,357.785858 166.670197,357.580383 167.058334,357.271271
C174.635300,351.236969 174.633652,351.235870 181.656097,358.250580
C185.543671,362.133881 189.055634,366.520020 193.411514,369.777344
C199.650024,374.442566 200.838928,380.685120 200.871155,387.668762
C200.907990,395.653503 199.800415,395.126221 208.416321,395.131744
C223.735229,395.141571 239.055893,395.015259 254.371918,395.226929
C258.554810,395.284668 260.852203,394.350555 260.083649,389.741547
C259.314392,385.128204 261.209229,383.484070 265.862000,383.715179
C272.339905,384.036926 278.870087,384.117462 285.327118,383.629486
C287.747345,383.446564 290.493469,381.858551 292.292084,380.095947
C303.878510,368.741730 299.603424,368.621155 311.359863,378.923370
C319.598236,386.142761 327.742279,393.469971 335.997772,400.669525
C341.251678,405.251465 341.277313,405.974670 336.084747,410.285278
C318.735718,424.687653 299.234955,434.450439 277.096741,439.390533
C259.108276,443.404602 241.173065,442.763275 223.205109,440.633606
C216.721054,439.865051 210.453171,437.272766 203.726532,435.348328
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M189.254333,347.746460
C175.987686,334.495911 176.059525,334.499359 176.932510,316.274200
C177.091797,312.948364 178.433701,311.975677 181.526932,312.015228
C190.357193,312.128113 199.192505,311.928070 208.020218,312.115814
C211.759567,312.195282 213.020248,310.755676 212.953629,307.124390
C212.794708,298.462250 212.999420,289.793610 212.853012,281.131012
C212.798996,277.935577 213.812454,276.596436 217.150085,276.770996
C221.637863,277.005707 226.155090,276.685760 230.641739,276.931244
C235.096466,277.174957 237.140869,275.547455 236.914368,270.900085
C236.679398,266.079132 236.932922,261.236359 236.834427,256.405945
C236.782440,253.856018 237.775986,252.833160 240.364136,252.856552
C249.861603,252.942444 259.362885,252.785034 268.855835,253.009811
C270.354767,253.045303 272.268311,254.238708 273.214020,255.485458
C276.119263,259.315491 278.969788,263.261078 281.208313,267.496490
C282.685364,270.291229 283.751923,273.646393 283.826141,276.778473
C284.118164,289.102600 284.031433,301.438782 283.884430,313.768097
C283.845947,316.994293 284.826172,318.253113 288.144165,318.103912
C292.966705,317.887024 297.815186,318.232727 302.636169,317.999298
C306.403870,317.816895 308.116058,318.903748 307.950867,323.017120
C307.676941,329.838257 308.127777,336.692963 307.734680,343.502441
C307.595947,345.905884 306.416779,348.714447 304.785461,350.482574
C299.027283,356.723663 293.020569,362.760864 286.767761,368.504883
C284.852325,370.264465 281.919434,371.511444 279.319855,371.800446
C274.713318,372.312592 270.004333,371.962921 265.339996,371.876404
C261.802704,371.810822 259.904877,370.360382 260.014801,366.358612
C260.243500,358.033051 259.944214,349.693329 260.152832,341.366730
C260.250702,337.461151 258.872528,336.097168 254.942215,336.135315
C238.613434,336.293732 222.281311,336.298004 205.952591,336.137970
C202.027390,336.099487 200.591003,337.401855 200.793228,341.340607
C201.058548,346.507599 200.858337,351.698547 200.858337,356.879181
C200.297623,357.128937 199.736893,357.378723 199.176178,357.628479
C195.952240,354.417877 192.728287,351.207245 189.254333,347.746460
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M246.290344,170.326050
C262.175415,170.543961 277.351166,172.549149 292.098022,177.404373
C294.922882,178.334427 296.003235,179.785172 295.954407,182.809204
C295.790283,192.971069 296.110352,203.144745 295.754883,213.296738
C295.665710,215.843109 294.300293,218.834808 292.558380,220.742554
C287.059143,226.765442 281.272308,232.558395 275.223877,238.027954
C273.329865,239.740692 270.287140,240.904388 267.714600,241.013977
C259.065186,241.382462 250.382736,240.945038 241.729218,241.261536
C237.529114,241.415176 236.579971,239.756134 236.794937,236.007202
C237.052094,231.522736 236.733627,227.007736 236.902878,222.514954
C237.034760,219.014236 235.503876,217.738266 232.133255,217.834946
C227.304749,217.973434 222.465439,217.758774 217.638611,217.924133
C214.298065,218.038589 212.800400,216.939484 212.847656,213.357834
C212.997147,202.028778 212.944733,190.696289 212.880417,179.365646
C212.860947,175.938431 214.212967,174.199966 217.766617,173.819061
C227.142944,172.814087 236.495071,171.583374 246.290344,170.326050
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M322.391052,318.069397
C328.181580,318.056427 333.511902,317.940643 338.833923,318.100464
C341.774170,318.188782 343.143250,317.300171 342.935242,314.149750
C342.727325,311.000671 343.041504,307.817780 342.848450,304.666779
C342.631592,301.127838 344.191284,300.024719 347.572876,300.067169
C358.224945,300.200928 368.881195,300.220673 379.532593,300.063782
C383.148590,300.010559 383.977051,301.594086 384.072845,304.874390
C384.757355,328.303650 379.698975,350.337891 367.931335,370.638641
C363.458313,378.355225 358.266815,385.661163 353.278473,393.070587
C351.120758,396.275574 349.033508,396.646118 345.710388,393.630798
C335.143982,384.042938 324.207428,374.859924 313.326263,365.623718
C309.188843,362.111847 308.592346,360.245941 312.693268,356.931824
C318.086273,352.573547 319.550476,347.342529 319.066162,340.757568
C318.615570,334.631378 318.782715,328.436829 319.099274,322.294067
C319.173950,320.845184 320.939636,319.483459 322.391052,318.069397
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M132.459503,241.148285
C127.890282,240.153168 130.420212,237.451874 131.222748,236.198563
C134.791306,230.625610 138.312943,224.915909 142.665985,219.972870
C153.793030,207.337753 166.201538,196.051071 180.973343,187.738464
C186.009399,184.904495 191.505920,182.888107 196.794922,180.504532
C199.823181,179.139816 200.816513,180.765610 200.828979,183.424728
C200.876633,193.583618 200.863678,203.742905 200.842880,213.901978
C200.836990,216.781525 199.423615,218.027634 196.449448,217.935837
C191.457886,217.781769 186.455429,217.994614 181.462677,217.861099
C178.276764,217.775879 176.887695,219.040878 176.968918,222.262802
C177.086380,226.923126 176.749008,231.606277 177.076172,236.246521
C177.366638,240.366486 175.682800,241.298401 171.876511,241.240906
C158.888931,241.044754 145.896606,241.163300 132.459503,241.148285
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M295.128662,279.128052
C295.126740,270.810425 295.126740,270.808228 303.113373,270.808533
C311.111206,270.808838 319.110321,270.897369 327.106201,270.773834
C330.044708,270.728455 331.302826,271.636139 331.253265,274.761505
C331.107971,283.923401 331.120941,293.090118 331.240570,302.252716
C331.285492,305.691223 329.925903,307.010254 326.496674,306.957581
C317.834381,306.824524 309.167542,306.831665 300.504852,306.950378
C296.691376,307.002655 295.038605,305.446198 295.099670,301.604340
C295.216156,294.274872 295.130676,286.942169 295.128662,279.128052
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M188.979385,247.999817
C188.980408,242.849808 189.107132,238.194611 188.940964,233.549881
C188.815552,230.044388 190.326981,228.898666 193.706741,228.955215
C202.624847,229.104446 211.548996,229.125427 220.466309,228.959534
C223.555786,228.902054 224.776672,230.281296 224.794373,233.025528
C224.855377,242.492508 224.961761,251.964005 224.678787,261.422638
C224.641403,262.672241 222.481720,264.873962 221.252731,264.911163
C211.628006,265.202637 201.986938,265.195343 192.361618,264.914215
C191.202042,264.880341 189.261566,262.742523 189.135895,261.439728
C188.723175,257.160980 188.979797,252.817657 188.979385,247.999817
z" />
<path class="no-fill" fill="#e6ebef" opacity="1.000000" stroke="none" d="
M233.992828,384.017883
C227.995987,384.018646 222.494049,383.907349 216.999863,384.065582
C214.045898,384.150696 212.803970,383.212860 212.851135,380.090790
C212.992065,370.761749 212.968979,361.428406 212.860855,352.098480
C212.827789,349.244904 213.549057,347.822601 216.758224,347.875336
C225.920303,348.025940 235.087189,347.992920 244.250565,347.889343
C246.987030,347.858429 248.146988,348.750519 248.115372,351.613770
C248.010529,361.110321 247.994247,370.610229 248.138062,380.105896
C248.185394,383.231781 246.941986,384.222076 243.986511,384.056763
C240.830460,383.880219 237.656876,384.017639 233.992828,384.017883
z" />
</svg>

After

Width:  |  Height:  |  Size: 58 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1 @@
<svg width="1440" height="85" viewBox="0 0 1440 85" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>wavy-divider</title><desc>Created with Sketch.</desc><defs><linearGradient x1="50%" y1="29.903%" x2="50%" y2="100%" id="linearGradient-1"><stop stop-color="#000" stop-opacity=".021" offset="0%"/><stop stop-color="#000" stop-opacity="0" offset="100%"/></linearGradient></defs><g id="landing" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="cms-landing-v6" transform="translate(0.000000, -1205.000000)" fill="url(#linearGradient-1)"><g id="triptych" transform="translate(0.000000, 1205.000000)"><path d="M-1.35525272e-20,85 L1440,85 L1440,61 C1440,61 1440,11 1080,11 C720,11 718,47 358,47 C-2,47 -2.27373675e-13,0.647058824 -2.27373675e-13,0.647058824 L-1.35525272e-20,85 Z" id="wavy-divider"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 883 B

74
website/src/pages/blog.js Normal file
View File

@ -0,0 +1,74 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { Link, graphql } from 'gatsby';
import { css } from '@emotion/core';
import Layout from '../components/layout';
import Container from '../components/container';
import MetaInfo from '../components/meta-info';
import Page from '../components/page';
import Lead from '../components/lead';
import theme from '../theme';
function Blog({ data }) {
return (
<Layout>
<Helmet>
<title>Blog</title>
<meta name="description" content="Recent news and updates about Simple CMS." />
</Helmet>
<Page>
<Container size="sm">
<h1>Simple CMS Blog</h1>
{data.allMarkdownRemark.edges.map(({ node }) => (
<article
key={node.id}
css={css`
margin-bottom: ${theme.space[5]};
`}
>
<h2
css={css`
margin-bottom: 0;
`}
>
<Link to={node.fields.slug}>{node.frontmatter.title}</Link>
</h2>
<MetaInfo>
by {node.frontmatter.author} on {node.frontmatter.date}
</MetaInfo>
<Lead>{node.frontmatter.description}</Lead>
</article>
))}
{/* TODO: pagination */}
</Container>
</Page>
</Layout>
);
}
export default Blog;
export const pageQuery = graphql`
query blogList {
allMarkdownRemark(
filter: { fields: { slug: { regex: "/blog/" } } }
sort: { order: DESC, fields: [frontmatter___date] }
) {
edges {
node {
id
frontmatter {
title
description
author
date(formatString: "MMMM D, YYYY")
}
fields {
slug
}
}
}
}
}
`;

View File

@ -0,0 +1,39 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { graphql } from 'gatsby';
import Layout from '../components/layout';
import Community from '../components/community';
function CommunityPage({ data }) {
const { title, headline, subhead, sections } = data.markdownRemark.frontmatter;
return (
<Layout hasPageHero>
<Helmet title={title} />
<Community headline={headline} subhead={subhead} sections={sections} />
</Layout>
);
}
export const pageQuery = graphql`
query communityPage {
markdownRemark(fileAbsolutePath: { regex: "/community/" }) {
frontmatter {
title
headline
subhead
sections {
title
channels {
title
description
url
}
}
}
}
}
`;
export default CommunityPage;

246
website/src/pages/index.js Normal file
View File

@ -0,0 +1,246 @@
import React from 'react';
import { graphql } from 'gatsby';
import styled from '@emotion/styled';
import { css } from '@emotion/core';
import Layout from '../components/layout';
import Markdownify from '../components/markdownify';
import PageHero from '../components/page-hero';
import HeroTitle from '../components/hero-title';
import VideoEmbed from '../components/video-embed';
import WhatsNew from '../components/whats-new';
import Lead from '../components/lead';
import Features from '../components/features';
import HomeSection from '../components/home-section';
import Grid from '../components/grid';
import theme from '../theme';
import { mq } from '../utils';
const MarkdownButton = styled.span`
a {
white-space: nowrap;
display: inline-block;
color: white;
text-transform: uppercase;
font-weight: 700;
font-size: ${theme.fontsize[3]};
letter-spacing: 0.5px;
line-height: ${theme.lineHeight[1]};
background-color: ${theme.colors.blue};
background-image: linear-gradient(-180deg, #4a7fdd 0%, #3a69c7 100%);
box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.3), 0 1px 3px 0 rgba(0, 0, 0, 0.6);
border-radius: ${theme.radii[1]};
padding: ${theme.space[2]} ${theme.space[3]};
transition: 0.2s;
text-decoration: none;
&:hover {
transform: scale(1.05);
box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.5), 0 1px 3px 0 rgba(0, 0, 0, 1);
}
&:active {
transform: scale(0.95);
box-shadow: none;
}
}
`;
// const ContribList = styled.div`
// display: flex;
// flex-wrap: wrap;
// img {
// height: 32px;
// width: 32px;
// border-radius: 10rem;
// margin-right: ${theme.space[1]};
// margin-bottom: ${theme.space[1]};
// transition: 0.1s;
// &:hover {
// transform: scale(1.3);
// box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.25), 0 4px 12px 0 rgba(0, 0, 0, 0.25);
// }
// }
// `;
function HomePage({ data }) {
const landing = data.landing.childDataYaml;
const updates = data.updates.childDataYaml;
// const contribs = data.contribs.childDataJson;
return (
<Layout hasPageHero>
<PageHero>
<div
css={css`
margin-bottom: ${theme.space[7]};
`}
>
<HeroTitle>
<Markdownify source={landing.hero.headline} />
</HeroTitle>
<Lead>
<Markdownify source={landing.hero.subhead} />
</Lead>
<Lead>
<MarkdownButton>
<Markdownify source={landing.cta.button} />
</MarkdownButton>
</Lead>
</div>
<Grid cols={2}>
<div>
<Features items={landing.hero.devfeatures} kind="light" />
</div>
<div>
<VideoEmbed />
</div>
</Grid>
</PageHero>
<section
css={css`
background: white;
${mq[2]} {
position: absolute;
left: 50%;
transform: translate(-50%, -75%);
width: 880px;
border-radius: 8px;
}
`}
>
<div
css={css`
padding: ${theme.space[4]} ${theme.space[5]};
color: ${theme.colors.lightishGray};
${mq[2]} {
display: flex;
}
`}
>
<Lead
css={css`
margin-right: 2rem;
font-size: 18px;
${mq[2]} {
margin-bottom: 0;
}
`}
>
<strong>
<Markdownify source={landing.cta.primaryhook} />
</strong>{' '}
<Markdownify source={landing.cta.primary} />
</Lead>
<MarkdownButton>
<Markdownify source={landing.cta.button} />
</MarkdownButton>
</div>
</section>
<WhatsNew updates={updates.updates} />
<HomeSection
title={<Markdownify source={landing.editors.hook} />}
text={<Markdownify source={landing.editors.intro} />}
>
<Grid cols={3}>
<Features items={landing.editors.features} />
</Grid>
</HomeSection>
{/* <HomeSection
css={css`
background: white;
`}
title={<Markdownify source={landing.community.hook} />}
>
<Grid cols={2}>
<div>
<Features items={landing.community.features} />
</div>
<div>
<h3
css={css`
font-size: 18px;
`}
>
{landing.community.contributors}
</h3>
<ContribList>
{contribs.contributors.map(user => (
<a href={user.profile} title={user.name} key={user.login}>
<img src={user.avatar_url.replace('v=4', 's=32')} alt={user.login} />
</a>
))}
</ContribList>
</div>
</Grid>
</HomeSection> */}
</Layout>
);
}
export const pageQuery = graphql`
query homeQuery {
updates: file(relativePath: { regex: "/updates/" }) {
childDataYaml {
updates {
date
description
version
# url
}
}
}
landing: file(relativePath: { regex: "/landing/" }) {
childDataYaml {
hero {
headline
subhead
devfeatures {
feature
description
}
}
cta {
primary
primaryhook
button
}
editors {
hook
intro
features {
feature
imgpath
description
}
}
community {
hook
features {
feature
description
}
contributors
}
}
}
}
`;
// contribs: file(relativePath: { regex: "/contributors/" }) {
// childDataJson {
// contributors {
// name
// profile
// avatar_url
// login
// }
// }
// }
export default HomePage;

View File

@ -0,0 +1,55 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { graphql } from 'gatsby';
import { trimStart, trimEnd } from 'lodash';
import TwitterMeta from '../components/twitter-meta';
import Layout from '../components/layout';
import BlogPostTemplate from '../components/blog-post-template';
function BlogPost({ data }) {
const { html, frontmatter } = data.markdownRemark;
const { author, title, date, description, meta_description, twitter_image, canonical_url } =
frontmatter;
const { siteUrl } = data.site.siteMetadata;
const twitterImageUrl =
twitter_image && `${trimEnd(siteUrl, '/')}/${trimStart(twitter_image, '/')}`;
const desc = meta_description || description;
return (
<Layout>
<Helmet>
<title>{title}</title>
{desc && <meta name="description" content={desc} />}
{canonical_url && <link rel="canonical" href={canonical_url} />}
</Helmet>
<TwitterMeta title={title} description={desc} image={twitterImageUrl} />
<BlogPostTemplate title={title} author={author} date={date} html={html} />
</Layout>
);
}
export default BlogPost;
export const pageQuery = graphql`
query blogPost($slug: String!) {
site {
siteMetadata {
siteUrl
}
}
markdownRemark(fields: { slug: { eq: $slug } }) {
frontmatter {
title
description
# meta_description
date(formatString: "MMMM D, YYYY")
author
twitter_image
# canonical_url
}
html
}
}
`;

View File

@ -0,0 +1,113 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { graphql } from 'gatsby';
import 'prismjs/themes/prism-tomorrow.css';
import Layout from '../components/layout';
import DocsTemplate from '../components/docs-template';
function filenameFromPath(p) {
return p.split('/').slice(-1)[0].split('.')[0];
}
function toMenu(menu, nav) {
return menu.map(group => ({
title: group.title,
group: nav.group.find(g => g.fieldValue === group.name),
}));
}
function DocPage({ data, location }) {
const {
nav,
page: { frontmatter, html, fields },
widgets,
menu,
} = data;
const { title, group } = frontmatter;
const docsNav = toMenu(menu.siteMetadata.menu.docs, nav);
const showWidgets = location.pathname.indexOf('/docs/widgets') !== -1;
const filename = filenameFromPath(fields.path);
return (
<Layout>
<Helmet title={title} />
<DocsTemplate
title={title}
filename={filename}
html={html}
showWidgets={showWidgets}
widgets={widgets}
docsNav={docsNav}
location={location}
group={group}
showSidebar
/>
</Layout>
);
}
export const pageQuery = graphql`
query docPage($slug: String!) {
page: markdownRemark(fields: { slug: { eq: $slug } }) {
fields {
path
}
frontmatter {
title
group
}
html
}
nav: allMarkdownRemark(
sort: { fields: [frontmatter___weight], order: ASC }
filter: {
frontmatter: { title: { ne: null }, group: { ne: null } }
fields: { slug: { regex: "/docs/" } }
}
) {
group(field: frontmatter___group) {
fieldValue
edges {
node {
fields {
slug
}
frontmatter {
title
group
}
tableOfContents
}
}
}
}
menu: site {
siteMetadata {
menu {
docs {
name
title
}
}
}
}
widgets: allMarkdownRemark(
sort: { fields: [frontmatter___label], order: ASC }
filter: { frontmatter: { label: { ne: null } }, fields: { slug: { regex: "/widgets/" } } }
) {
edges {
node {
frontmatter {
title
label
}
html
}
}
}
}
`;
export default DocPage;

37
website/src/theme.js Normal file
View File

@ -0,0 +1,37 @@
module.exports = {
colors: {
white: '#fff',
black: '#000',
lightestGray: '#E6E6E6',
lighterGray: '#F7F8F8',
lightGray: '#F6F6F6',
lightishGray: '#51555D',
gray: '#313D3E',
darkGray: '#2F3132',
darkerGray: '#1E1F21',
blueGray: '#BCC2CE',
lightGreen: '#97bf2f',
green: '#4bc9fa',
darkGreen: '#0b91c4',
darkerGreen: '#628013',
shadeBlue: '#EFF0F4',
blue: '#3A69C7',
},
fontWeight: {
thin: 100,
light: 300,
regular: 400,
semibold: 500,
bold: 700,
black: 900,
},
fontFamily: "'Roboto', -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif",
fontsize: ['10px', '12px', '14px', '16px', '18px', '24px', '32px', '42px', '64px'],
lineHeight: [1, 1.3, 1.7],
space: [0, '4px', '8px', '16px', '24px', '40px', '64px', '104px', '152px'],
radii: [0, '4px', '8px'],
breakpoints: [480, 768, 960, 1200, 1280],
zIndexes: {
header: 100,
},
};

7
website/src/utils.js Normal file
View File

@ -0,0 +1,7 @@
import theme from './theme';
export const mq = theme.breakpoints.map(bp => `@media (min-width: ${bp}px)`);
export function themeGet(key, initial) {
return props => props.theme[key] || initial;
}

View File

@ -0,0 +1,32 @@
extends: existence
message: "'%s' is redundant."
ignorecase: true
level: error
action:
name: edit
params:
- split
- " "
- "0"
tokens:
- ABM missile
- ACT test
- ABM missiles
- ABS braking system
- ATM machine
- CD disc
- CPI Index
- GPS system
- GUI interface
- HIV virus
- ISBN number
- LCD display
- PDF format
- PIN number
- RAS syndrome
- RIP in peace
- please RSVP
- SALT talks
- SAT test
- UPC codes
- YAML language

View File

@ -0,0 +1,193 @@
extends: existence
message: "'%s' is not needed."
ignorecase: true
level: warning
tokens:
- absolutely
- accidentally
- additionally
- allegedly
- alternatively
- angrily
- anxiously
- approximately
- awkwardly
- badly
- barely
- beautifully
- blindly
- boldly
- bravely
- brightly
- briskly
- bristly
- busily
- calmly
- carefully
- carelessly
- cautiously
- cheerfully
- clearly
- closely
- coldly
- completely
- consequently
- correctly
- courageously
- crinkly
- cruelly
- crumbly
- cuddly
- currently
- daily
- daringly
- deadly
- deceptively
- definitely
- deliberately
- doubtfully
- eagerly
- early
- easily
- elegantly
- enormously
- enthusiastically
- equally
- especially
- eventually
- exactly
- exceedingly
- exclusively
- extremely
- fairly
- faithfully
- fatally
- fiercely
- finally
- fondly
- foolishly
- fortunately
- frankly
- frantically
- generously
- gently
- giggly
- gladly
- gracefully
- greedily
- happily
- hastily
- healthily
- heartily
- helpfully
- honestly
- hopefully
- hungrily
- hurriedly
- immediately
- impatiently
- innocently
- inquisitively
- interestingly
- irritably
- jiggly
- joyously
- justly
- kindly
- lately
- lazily
- likely
- lonely
- loosely
- loudly
- loudly
- luckily
- madly
- mentally
- monthly
- mortally
- mostly
- mysteriously
- neatly
- nervously
- nightly
- noisily
- normally
- obediently
- occasionally
- openly
- painfully
- particularly
- patiently
- perfectly
- politely
- poorly
- powerfully
- presumably
- previously
- promptly
- punctually
- quickly
- quietly
- rapidly
- rarely
- really
- recently
- recklessly
- regularly
- remarkably
- reluctantly
- repeatedly
- rightfully
- roughly
- rudely
- sadly
- safely
- selfishly
- seriously
- sharply
- shortly
- shyly
- significantly
- silently
- simply
- sleepily
- slowly
- smelly
- smoothly
- softly
- solemnly
- sparkly
- speedily
- stealthily
- sternly
- stupidly
- substantially
- successfully
- suddenly
- surprisingly
- suspiciously
- swiftly
- tenderly
- tensely
- thankfully
- thoughtfully
- tightly
- timely
- truthfully
- unexpectedly
- unfortunately
- usually
- very
- victoriously
- violently
- vivaciously
- warmly
- weakly
- wearily
- weekly
- wildly
- wisely
- worldly
- wrinkly
- yearly

View File

@ -0,0 +1,53 @@
extends: existence
message: "'%s' is archaic."
ignorecase: true
level: error
tokens:
- alack
- anent
- begat
- belike
- betimes
- boughten
- brocage
- brokage
- camarade
- chiefer
- chiefest
- Christiana
- completely obsolescent
- cozen
- divers
- deflexion
- fain
- forsooth
- foreclose from
- haply
- howbeit
- illumine
- in sooth
- maugre
- meseems
- methinks
- nigh
- peradventure
- perchance
- saith
- shew
- sistren
- spake
- to wit
- verily
- whilom
- withal
- wot
- enclosed please find
- please find enclosed
- enclosed herewith
- enclosed herein
- inforce
- ex postfacto
- foreclose from
- forewent
- for ever
- bona fides

View File

@ -0,0 +1,781 @@
extends: existence
message: Avoid cliches such as '%s'.
ignorecase: true
level: warning
tokens:
- a chip off the old block
- a clean slate
- a dark and stormy night
- a far cry
- a fate worse than death
- a fine kettle of fish
- a loose cannon
- a penny saved is a penny earned
- a tough row to hoe
- a word to the wise
- ace in the hole
- acid test
- add insult to injury
- against all odds
- air your dirty laundry
- alas and alack
- all fun and games
- all hell broke loose
- all in a day's work
- all talk, no action
- all thumbs
- all your eggs in one basket
- all's fair in love and war
- all's well that ends well
- almighty dollar
- American as apple pie
- an axe to grind
- another day, another dollar
- armed to the teeth
- as luck would have it
- as old as time
- as the crow flies
- at loose ends
- at my wits end
- at the end of the day
- avoid like the plague
- babe in the woods
- back against the wall
- back in the saddle
- back to square one
- back to the drawing board
- bad to the bone
- badge of honor
- bald faced liar
- bald-faced lie
- ballpark figure
- banging your head against a brick wall
- baptism by fire
- barking up the wrong tree
- bat out of hell
- be all and end all
- beat a dead horse
- beat around the bush
- been there, done that
- beggars can't be choosers
- behind the eight ball
- bend over backwards
- benefit of the doubt
- bent out of shape
- best thing since sliced bread
- bet your bottom dollar
- better half
- better late than never
- better mousetrap
- better safe than sorry
- between a rock and a hard place
- between a rock and a hard place
- between Scylla and Charybdis
- between the devil and the deep blue see
- betwixt and between
- beyond the pale
- bide your time
- big as life
- big cheese
- big fish in a small pond
- big man on campus
- bigger they are the harder they fall
- bird in the hand
- bird's eye view
- birds and the bees
- birds of a feather flock together
- bit the hand that feeds you
- bite the bullet
- bite the dust
- bitten off more than he can chew
- black as coal
- black as pitch
- black as the ace of spades
- blast from the past
- bleeding heart
- blessing in disguise
- blind ambition
- blind as a bat
- blind leading the blind
- blissful ignorance
- blood is thicker than water
- blood sweat and tears
- blow a fuse
- blow off steam
- blow your own horn
- blushing bride
- boils down to
- bolt from the blue
- bone to pick
- bored stiff
- bored to tears
- bottomless pit
- boys will be boys
- bright and early
- brings home the bacon
- broad across the beam
- broken record
- brought back to reality
- bulk large
- bull by the horns
- bull in a china shop
- burn the midnight oil
- burning question
- burning the candle at both ends
- burst your bubble
- bury the hatchet
- busy as a bee
- but that's another story
- by hook or by crook
- call a spade a spade
- called onto the carpet
- calm before the storm
- can of worms
- can't cut the mustard
- can't hold a candle to
- case of mistaken identity
- cast aspersions
- cat got your tongue
- cat's meow
- caught in the crossfire
- caught red-handed
- chase a red herring
- checkered past
- chomping at the bit
- cleanliness is next to godliness
- clear as a bell
- clear as mud
- close to the vest
- cock and bull story
- cold shoulder
- come hell or high water
- comparing apples and oranges
- compleat
- conspicuous by its absence
- cool as a cucumber
- cool, calm, and collected
- cost a king's ransom
- count your blessings
- crack of dawn
- crash course
- creature comforts
- cross that bridge when you come to it
- crushing blow
- cry like a baby
- cry me a river
- cry over spilt milk
- crystal clear
- crystal clear
- curiosity killed the cat
- cut and dried
- cut through the red tape
- cut to the chase
- cute as a bugs ear
- cute as a button
- cute as a puppy
- cuts to the quick
- cutting edge
- dark before the dawn
- day in, day out
- dead as a doornail
- decision-making process
- devil is in the details
- dime a dozen
- divide and conquer
- dog and pony show
- dog days
- dog eat dog
- dog tired
- don't burn your bridges
- don't count your chickens
- don't look a gift horse in the mouth
- don't rock the boat
- don't step on anyone's toes
- don't take any wooden nickels
- down and out
- down at the heels
- down in the dumps
- down the hatch
- down to earth
- draw the line
- dressed to kill
- dressed to the nines
- drives me up the wall
- dubious distinction
- dull as dishwater
- duly authorized
- dyed in the wool
- eagle eye
- ear to the ground
- early bird catches the worm
- easier said than done
- easy as pie
- eat your heart out
- eat your words
- eleventh hour
- even the playing field
- every dog has its day
- every fiber of my being
- everything but the kitchen sink
- eye for an eye
- eyes peeled
- face the music
- facts of life
- fair weather friend
- fall by the wayside
- fan the flames
- far be it from me
- fast and loose
- feast or famine
- feather your nest
- feathered friends
- few and far between
- fifteen minutes of fame
- fills the bill
- filthy vermin
- fine kettle of fish
- first and foremost
- fish out of water
- fishing for a compliment
- fit as a fiddle
- fit the bill
- fit to be tied
- flash in the pan
- flat as a pancake
- flip your lid
- flog a dead horse
- fly by night
- fly the coop
- follow your heart
- for all intents and purposes
- for free
- for the birds
- for what it's worth
- force of nature
- force to be reckoned with
- forgive and forget
- fox in the henhouse
- free and easy
- free as a bird
- fresh as a daisy
- full steam ahead
- fun in the sun
- garbage in, garbage out
- gentle as a lamb
- get a kick out of
- get a leg up
- get down and dirty
- get the lead out
- get to the bottom of
- get with the program
- get your feet wet
- gets my goat
- gilding the lily
- gilding the lily
- give and take
- go against the grain
- go at it tooth and nail
- go for broke
- go him one better
- go the extra mile
- go with the flow
- goes without saying
- good as gold
- good deed for the day
- good things come to those who wait
- good time was had by all
- good times were had by all
- greased lightning
- greek to me
- green thumb
- green-eyed monster
- grist for the mill
- growing like a weed
- hair of the dog
- hand to mouth
- happy as a clam
- happy as a lark
- hasn't a clue
- have a nice day
- have a short fuse
- have high hopes
- have the last laugh
- haven't got a row to hoe
- he's got his hands full
- head honcho
- head over heels
- hear a pin drop
- heard it through the grapevine
- heart's content
- heavy as lead
- hem and haw
- high and dry
- high and mighty
- high as a kite
- his own worst enemy
- his work cut out for him
- hit paydirt
- hither and yon
- Hobson's choice
- hold your head up high
- hold your horses
- hold your own
- hold your tongue
- honest as the day is long
- horns of a dilemma
- horns of a dilemma
- horse of a different color
- hot under the collar
- hour of need
- I beg to differ
- icing on the cake
- if the shoe fits
- if the shoe were on the other foot
- if you catch my drift
- in a jam
- in a jiffy
- in a nutshell
- in a pig's eye
- in a pinch
- in a word
- in hot water
- in light of
- in the final analysis
- in the gutter
- in the last analysis
- in the nick of time
- in the thick of it
- in your dreams
- innocent bystander
- it ain't over till the fat lady sings
- it goes without saying
- it takes all kinds
- it takes one to know one
- it's a small world
- it's not what you know, it's who you know
- it's only a matter of time
- ivory tower
- Jack of all trades
- jockey for position
- jog your memory
- joined at the hip
- judge a book by its cover
- jump down your throat
- jump in with both feet
- jump on the bandwagon
- jump the gun
- jump to conclusions
- just a hop, skip, and a jump
- just the ticket
- justice is blind
- keep a stiff upper lip
- keep an eye on
- keep it simple, stupid
- keep the home fires burning
- keep up with the Joneses
- keep your chin up
- keep your fingers crossed
- kick the bucket
- kick up your heels
- kick your feet up
- kid in a candy store
- kill two birds with one stone
- kiss of death
- knock it out of the park
- knock on wood
- knock your socks off
- know him from Adam
- know the ropes
- know the score
- knuckle down
- knuckle sandwich
- knuckle under
- labor of love
- ladder of success
- land on your feet
- lap of luxury
- last but not least
- last but not least
- last hurrah
- last-ditch effort
- law of the jungle
- law of the land
- lay down the law
- leaps and bounds
- let sleeping dogs lie
- let the cat out of the bag
- let the good times roll
- let your hair down
- let's talk turkey
- letter perfect
- lick your wounds
- lies like a rug
- life's a bitch
- life's a grind
- light at the end of the tunnel
- lighter than a feather
- lighter than air
- like clockwork
- like father like son
- like taking candy from a baby
- like there's no tomorrow
- lion's share
- live and learn
- live and let live
- long and short of it
- long lost love
- look before you leap
- look down your nose
- look what the cat dragged in
- looking a gift horse in the mouth
- looks like death warmed over
- loose cannon
- lose your head
- lose your temper
- loud as a horn
- lounge lizard
- loved and lost
- low man on the totem pole
- luck of the draw
- luck of the Irish
- make a mockery of
- make hay while the sun shines
- make money hand over fist
- make my day
- make the best of a bad situation
- make the best of it
- make your blood boil
- male chauvinism
- man of few words
- man's best friend
- mark my words
- meaningful dialogue
- missed the boat on that one
- moment in the sun
- moment of glory
- moment of truth
- moment of truth
- money to burn
- more in sorrow than in anger
- more power to you
- more sinned against than sinning
- more than one way to skin a cat
- movers and shakers
- moving experience
- my better half
- naked as a jaybird
- naked truth
- neat as a pin
- needle in a haystack
- needless to say
- neither here nor there
- never look back
- never say never
- nip and tuck
- nip in the bud
- nip it in the bud
- no guts, no glory
- no love lost
- no pain, no gain
- no skin off my back
- no stone unturned
- no time like the present
- no use crying over spilled milk
- nose to the grindstone
- not a hope in hell
- not a minute's peace
- not in my backyard
- not playing with a full deck
- not the end of the world
- not written in stone
- nothing to sneeze at
- nothing ventured nothing gained
- now we're cooking
- off the top of my head
- off the wagon
- off the wall
- old hat
- olden days
- older and wiser
- older than dirt
- older than Methuselah
- on a roll
- on cloud nine
- on pins and needles
- on the bandwagon
- on the money
- on the nose
- on the rocks
- on the same page
- on the spot
- on the tip of my tongue
- on the wagon
- on thin ice
- once bitten, twice shy
- one bad apple doesn't spoil the bushel
- one born every minute
- one brick short
- one foot in the grave
- one in a million
- one red cent
- only game in town
- open a can of worms
- open and shut case
- open the flood gates
- opportunity doesn't knock twice
- out of pocket
- out of sight, out of mind
- out of the frying pan into the fire
- out of the woods
- out on a limb
- over a barrel
- over the hump
- pain and suffering
- pain in the
- panic button
- par for the course
- part and parcel
- party pooper
- pass the buck
- patience is a virtue
- pay through the nose
- penny pincher
- perfect storm
- pig in a poke
- pile it on
- pillar of the community
- pin your hopes on
- pitter patter of little feet
- plain as day
- plain as the nose on your face
- play by the rules
- play your cards right
- playing the field
- playing with fire
- pleased as punch
- plenty of fish in the sea
- point with pride
- poor as a church mouse
- pot calling the kettle black
- presidential timber
- pretty as a picture
- pull a fast one
- pull your punches
- pulled no punches
- pulling your leg
- pure as the driven snow
- put it in a nutshell
- put one over on you
- put the cart before the horse
- put the pedal to the metal
- put your best foot forward
- put your foot down
- quantum jump
- quantum leap
- quick as a bunny
- quick as a lick
- quick as a wink
- quick as lightning
- quiet as a dormouse
- rags to riches
- raining buckets
- raining cats and dogs
- rank and file
- rat race
- reap what you sow
- red as a beet
- red herring
- redound to one's credit
- redound to the benefit of
- reinvent the wheel
- rich and famous
- rings a bell
- ripe old age
- ripped me off
- rise and shine
- road to hell is paved with good intentions
- rob Peter to pay Paul
- roll over in the grave
- rub the wrong way
- ruled the roost
- running in circles
- sad but true
- sadder but wiser
- salt of the earth
- scared stiff
- scared to death
- sea change
- sealed with a kiss
- second to none
- see eye to eye
- seen the light
- seize the day
- set the record straight
- set the world on fire
- set your teeth on edge
- sharp as a tack
- shirked his duties
- shoot for the moon
- shoot the breeze
- shot in the dark
- shoulder to the wheel
- sick as a dog
- sigh of relief
- signed, sealed, and delivered
- sink or swim
- six of one, half a dozen of another
- six of one, half a dozen of the other
- skating on thin ice
- slept like a log
- slinging mud
- slippery as an eel
- slow as molasses
- smart as a whip
- smooth as a baby's bottom
- sneaking suspicion
- snug as a bug in a rug
- sow wild oats
- spare the rod, spoil the child
- speak of the devil
- spilled the beans
- spinning your wheels
- spitting image of
- spoke with relish
- spread like wildfire
- spring to life
- squeaky wheel gets the grease
- stands out like a sore thumb
- start from scratch
- stick in the mud
- still waters run deep
- stitch in time
- stop and smell the roses
- straight as an arrow
- straw that broke the camel's back
- stretched to the breaking point
- strong as an ox
- stubborn as a mule
- stuff that dreams are made of
- stuffed shirt
- sweating blood
- sweating bullets
- take a load off
- take one for the team
- take the bait
- take the bull by the horns
- take the plunge
- takes one to know one
- takes two to tango
- than you can shake a stick at
- the cream of the crop
- the cream rises to the top
- the more the merrier
- the real deal
- the real McCoy
- the red carpet treatment
- the same old story
- the straw that broke the camel's back
- there is no accounting for taste
- thick as a brick
- thick as thieves
- thin as a rail
- think outside of the box
- thinking outside the box
- third time's the charm
- this day and age
- this hurts me worse than it hurts you
- this point in time
- thought leaders?
- three sheets to the wind
- through thick and thin
- throw in the towel
- throw the baby out with the bathwater
- tie one on
- tighter than a drum
- time and time again
- time is of the essence
- tip of the iceberg
- tired but happy
- to coin a phrase
- to each his own
- to make a long story short
- to the best of my knowledge
- toe the line
- tongue in cheek
- too good to be true
- too hot to handle
- too numerous to mention
- touch with a ten foot pole
- tough as nails
- trial and error
- trials and tribulations
- tried and true
- trip down memory lane
- twist of fate
- two cents worth
- two peas in a pod
- ugly as sin
- under the counter
- under the gun
- under the same roof
- under the weather
- until the cows come home
- unvarnished truth
- up the creek
- uphill battle
- upper crust
- upset the applecart
- vain attempt
- vain effort
- vanquish the enemy
- various and sundry
- vested interest
- viable alternative
- waiting for the other shoe to drop
- wakeup call
- warm welcome
- watch your p's and q's
- watch your tongue
- watching the clock
- water under the bridge
- wax eloquent
- wax poetic
- we've got a situation here
- weather the storm
- weed them out
- week of Sundays
- went belly up
- wet behind the ears
- what goes around comes around
- what you see is what you get
- when it rains, it pours
- when push comes to shove
- when the cat's away
- when the going gets tough, the tough get going
- whet (?:the|your) appetite
- white as a sheet
- whole ball of wax
- whole hog
- whole nine yards
- wild goose chase
- will wonders never cease?
- wisdom of the ages
- wise as an owl
- wolf at the door
- wool pulled over our eyes
- words fail me
- work like a dog
- world weary
- worst nightmare
- worth its weight in gold
- writ large
- wrong side of the bed
- yanking your chain
- yappy as a dog
- years young
- you are what you eat
- you can run but you can't hide
- you only live once
- you're the boss
- young and foolish
- young and vibrant

View File

@ -0,0 +1,6 @@
extends: existence
message: "'%s' is hyperbolic."
level: error
nonword: true
tokens:
- '[a-z]+[!?]{2,}'

View File

@ -0,0 +1,119 @@
extends: existence
message: "'%s' Use more direct language."
ignorecase: true
level: warning
tokens:
- a number of
- accede to
- adjacent to
- adversely impact
- all things considered
- along the lines of
- already existing
- as a matter of fact
- as a means of
- as far as I'm concerned
- as of yet
- as to
- as yet
- at the present time
- at this time
- because of the fact that
- by means of
- by virtue of
- by virtue of the fact that
- close proximity
- comply with
- due to the fact that
- each and every
- factual evidence
- first and foremost
- for all intents and purposes
- for the most part
- for the purpose of
- have a tendency to
- honest truth
- if and when
- in a manner of speaking
- in a timely manner
- in a very real sense
- in accordance with
- in addition
- in all likelihood
- in an effort to
- in between
- in excess of
- in lieu of
- in light of the fact that
- in many cases
- in my opinion
- in order to
- in regard to
- in some instances
- in terms of
- in the case of
- in the event that
- in the final analysis
- in the nature of
- in the near future
- in the process of
- incumbent upon
- is applicable to
- is responsible for
- it is essential
- it seems that
- it was
- not certain
- not many
- not often
- not unless
- not unlike
- null and void
- on the contrary
- on the other hand
- one particular
- owing to the fact that
- pass away
- pertaining to
- point in time
- portion
- prior to
- prioritize
- provided that
- put simply
- readily apparent
- refer back
- should you wish
- span across
- so to speak
- successfully complete
- the month of
- the point I am trying to make
- time period
- to a certain degree
- took advantage of
- until such time as
- utilization
- utilize
- various different
- what I mean to say is
- whether or not
- with respect to
- with the exception of
- would argue that
- increasingly less
- advancing backwards
- alludes explicitly to
- explicitly alludes to
- totally obsolete
- completely obsolete
- generally always
- usually always
- increasingly less
- build down
- conspicuous absence
- exact estimate
- found missing
- intense apathy
- mandatory choice
- organized mess

View File

@ -0,0 +1,37 @@
extends: existence
message: "'%s' is jargon."
ignorecase: true
level: error
description:
tokens:
- in the affirmative
- in the negative
- agendize
- per your order
- per your request
- disincentivize
- at the end of the day
- back to the drawing board
- hit the ground running
- get the ball rolling
- low-hanging fruit
- thrown under the bus
- think outside the box
- let's touch base
- get my manager's blessing
- it's on my radar
- ping me
- i don't have the bandwidth
- no brainer
- par for the course
- bang for your buck
- synergy
- move the goal post
- apples to apples
- win-win
- circle back around
- all hands on deck
- take this offline
- drill-down
- elephant in the room
- on my plate

View File

@ -0,0 +1,180 @@
extends: existence
message: "'%s' is passive voice. Use active voice."
ignorecase: true
level: warning
raw:
- \b(am|are|were|being|is|been|was|be)\b\s*
tokens:
- "[\\w]+ed"
- awoken
- beat
- become
- been
- begun
- bent
- beset
- bet
- bid
- bidden
- bitten
- bled
- blown
- born
- bought
- bound
- bred
- broadcast
- brought
- burnt
- burst
- cast
- chosen
- clung
- come
- cost
- crept
- cut
- dealt
- dived
- done
- drawn
- dreamt
- driven
- drunk
- dug
- eaten
- fallen
- fed
- felt
- fit
- fled
- flown
- flung
- forbidden
- foregone
- forgiven
- forgotten
- forsaken
- fought
- found
- frozen
- given
- gone
- gotten
- ground
- grown
- heard
- held
- hidden
- hit
- hung
- hurt
- kept
- knelt
- knit
- known
- laid
- lain
- leapt
- learnt
- led
- left
- lent
- let
- lighted
- lost
- made
- meant
- met
- misspelt
- mistaken
- mown
- overcome
- overdone
- overtaken
- overthrown
- paid
- pled
- proven
- put
- quit
- read
- rid
- ridden
- risen
- run
- rung
- said
- sat
- sawn
- seen
- sent
- set
- sewn
- shaken
- shaven
- shed
- shod
- shone
- shorn
- shot
- shown
- shrunk
- shut
- slain
- slept
- slid
- slit
- slung
- smitten
- sold
- sought
- sown
- sped
- spent
- spilt
- spit
- split
- spoken
- spread
- sprung
- spun
- stolen
- stood
- stridden
- striven
- struck
- strung
- stuck
- stung
- stunk
- sung
- sunk
- swept
- swollen
- sworn
- swum
- swung
- taken
- taught
- thought
- thrived
- thrown
- thrust
- told
- torn
- trodden
- understood
- upheld
- upset
- wed
- wept
- withheld
- withstood
- woken
- won
- worn
- wound
- woven
- written
- wrung

View File

@ -0,0 +1,111 @@
extends: existence
message: "Use simpler words instead of '%s'."
ignorecase: true
level: warning
tokens:
- abundance
- accelerate
- accentuate
- accompany
- accomplish
- accorded
- accrue
- acquiesce
- acquire
- adjustment
- admissible
- advantageous
- advise
- aforementioned
- aggregate
- alleviate
- allocate
- ameliorate
- anticipate
- apparent
- appreciable
- ascertain
- assistance
- attain
- authorize
- belated
- bestow
- cease
- commence
- concerning
- consequently
- constitutes
- demonstrate
- depart
- designate
- discontinue
- economical
- eliminate
- elucidate
- employ
- endeavor
- equitable
- equivalent
- evidenced
- exclusively
- expedite
- expend
- expiration
- facilitate
- feasible
- forfeit
- formulate
- however
- impacted
- implement
- inception
- indicate
- indication
- initiate
- irregardless
- magnitude
- methodology
- monitor
- necessitate
- nevertheless
- notwithstanding
- numerous
- objective
- obligate
- obtain
- optimum
- overall
- participate
- particulars
- portion
- possess
- preclude
- prioritize
- procure
- proficiency
- purchase
- regarding
- relocate
- remainder
- remuneration
- reside
- residence
- retain
- satisfy
- shall
- solicit
- strategize
- subsequent
- substantial
- sufficient
- terminate
- therefore
- transpire
- utilization
- utilize
- validate
- witnessed
- decimate
- effete
- fulsome
- impassionate

View File

@ -0,0 +1,27 @@
Based on [write-good](https://github.com/btford/write-good).
> Naive linter for English prose for developers who can't write good and wanna learn to do other stuff good too.
```
The MIT License (MIT)
Copyright (c) 2014 Brian Ford
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

View File

@ -0,0 +1,12 @@
Copyright © 20142015, Jordan Suchow, Michael Pacer, and Lara A. Ross
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,13 @@
extends: substitution
message: Consider using '%s' instead of '%s'.
ignorecase: true
level: error
action:
name: replace
swap:
my resume: my résumé
your resume: your résumé
his resume: his résumé
her resume: her résumé
a resume: a résumé
the resume: the résumé

View File

@ -0,0 +1,46 @@
extends: substitution
message: Avoid gender bias by using '%s' instead of '%s'.
ignorecase: true
level: error
action:
name: replace
swap:
(?:alumnae|alumni): graduates
(?:alumna|alumnus): graduate
air(?:m[ae]n|wom[ae]n): pilot(s)
anchor(?:m[ae]n|wom[ae]n): anchor(s)
authoress: author
camera(?:m[ae]n|wom[ae]n): camera operator(s)
chair(?:m[ae]n|wom[ae]n): chair(s)
congress(?:m[ae]n|wom[ae]n): member(s) of congress
door(?:m[ae]|wom[ae]n): concierge(s)
draft(?:m[ae]n|wom[ae]n): drafter(s)
fire(?:m[ae]n|wom[ae]n): firefighter(s)
fisher(?:m[ae]n|wom[ae]n): fisher(s)
fresh(?:m[ae]n|wom[ae]n): first-year student(s)
garbage(?:m[ae]n|wom[ae]n): waste collector(s)
ladylike: courteous
landlord: building manager
mail(?:m[ae]n|wom[ae]n): mail carriers
man and wife: husband and wife
man enough: strong enough
mankind: human kind
manmade: manufactured
men and women: people
news(?:m[ae]n|wom[ae]n): journalist(s)
ombuds(?:man|woman): ombuds
oneupmanship: upstaging
poetess: poet
police(?:m[ae]n|wom[ae]n): police officer(s)
repair(?:m[ae]n|wom[ae]n): technician(s)
sales(?:m[ae]n|wom[ae]n): salesperson or sales people
service(?:m[ae]n|wom[ae]n): soldier(s)
steward(?:ess)?: flight attendant
tribes(?:m[ae]n|wom[ae]n): tribe member(s)
waitress: waiter
woman doctor: doctor
woman scientist[s]?: scientist(s)
work(?:m[ae]n|wom[ae]n): worker(s)
(?:he|she): they
(?:him|her): them
(?:his/hers): their

View File

@ -0,0 +1,357 @@
extends: substitution
message: Prefer '%s' over '%s'
ignorecase: true
action:
name: replace
swap:
'(?:cell phone|cell-phone)': cellphone
'(?:cliquey|cliquy)': cliquish
'(?:pygmean|pygmaen)': pygmy
'(?:retributional|retributionary)': retributive
'(?:revokable|revokeable)': revocable
abolishment: abolition
accessary: accessory
accreditate: accredit
accruement: accrual
accusee: accused
acquaintanceship: acquaintance
acquitment: acquittal
administrate: administer
administrated: administered
administrating: administering
adulterate: adulterous
advisatory: advisory
advocator: advocate
aggrievance: grievance
allegator: alleger
allusory: allusive
amative: amorous
amortizement: amortization
amphiboly: amphibology
anecdotalist: anecdotist
anilinctus: anilingus
anticipative: anticipatory
antithetic: antithetical
applicative: applicable
applicatory: applicable
applier: applicator
approbative: approbatory
arbitrager: arbitrageur
arsenous: arsenious
ascendance: ascendancy
ascendence: ascendancy
ascendency: ascendancy
auctorial: authorial
averral: averment
barbwire: barbed wire
benefic: beneficent
benignant: benign
bestowment: bestowal
betrothment: betrothal
blamableness: blameworthiness
butt naked: buck naked
camarade: comrade
carta blanca: carte blanche
casualities: casualties
casuality: casualty
catch on fire: catch fire
catholicly: catholically
cease fire: ceasefire
channelize: channel
chaplainship: chaplaincy
chrysalid: chrysalis
chrysalids: chrysalises
cigaret: cigarette
coemployee: coworker
cognitional: cognitive
cohabitate: cohabit
cohabitor: cohabitant
collodium: collodion
collusory: collusive
commemoratory: commemorative
commonty: commonage
communicatory: communicative
compensative: compensatory
complacence: complacency
complicitous: complicit
computate: compute
conciliative: conciliatory
concomitancy: concomitance
condonance: condonation
confirmative: confirmatory
congruency: congruence
connotate: connote
consanguineal: consanguine
conspicuity: conspicuousness
conspiratorialist: conspirator
constitutionist: constitutionalist
contingence: contigency
contributary: contributory
contumacity: contumacy
conversible: convertible
conveyal: conveyance
copartner: partner
copartnership: partnership
corroboratory: corroborative
cotemporaneous: contemporaneous
cotemporary: contemporary
criminate: incriminate
culpatory: inculpatory
cumbrance: encumbrance
cumulate: accumulate
curatory: curative
daredeviltry: daredevilry
deceptious: deceptive
defamative: defamatory
defraudulent: fraudulent
degeneratory: degenerative
delimitate: delimit
delusory: delusive
denouncement: denunciation
depositee: depositary
depreciative: depreciatory
deprival: deprivation
derogative: derogatory
destroyable: destructible
detoxicate: detoxify
detractory: detractive
deviancy: deviance
deviationist: deviant
digamy: deuterogamy
digitalize: digitize
diminishment: diminution
diplomatist: diplomat
disassociate: dissociate
disciplinatory: disciplinary
discriminant: discriminating
disenthrone: dethrone
disintegratory: disintegrative
dismission: dismissal
disorientate: disorient
disorientated: disoriented
disquieten: disquiet
distraite: distrait
divergency: divergence
dividable: divisible
doctrinary: doctrinaire
documental: documentary
domesticize: domesticate
duplicatory: duplicative
duteous: dutiful
educationalist: educationist
educatory: educative
enigmatas: enigmas
enlargen: enlarge
enswathe: swathe
epical: epic
erotism: eroticism
ethician: ethicist
ex officiis: ex officio
exculpative: exculpatory
exigeant: exigent
exigence: exigency
exotism: exoticism
expedience: expediency
expediential: expedient
extensible: extendable
eying: eyeing
fiefdom: fief
flagrance: flagrancy
flatulency: flatulence
fraudful: fraudulent
funebrial: funereal
geographical: geographic
geometrical: geometric
gerry-rigged: jury-rigged
goatherder: goatherd
gustatorial: gustatory
habitude: habit
henceforward: henceforth
hesitance: hesitancy
heterogenous: heterogeneous
hierarchic: hierarchical
hindermost: hindmost
honorand: honoree
hypostasize: hypostatize
hysteric: hysterical
idolatrize: idolize
impanel: empanel
imperviable: impervious
importunacy: importunity
impotency: impotence
imprimatura: imprimatur
improprietous: improper
inalterable: unalterable
incitation: incitement
incommunicative: uncommunicative
inconsistence: inconsistency
incontrollable: uncontrollable
incurment: incurrence
indow: endow
indue: endue
inhibitive: inhibitory
innavigable: unnavigable
innovational: innovative
inquisitional: inquisitorial
insistment: insistence
insolvable: unsolvable
instillment: instillation
instinctual: instinctive
insuror: insurer
insurrectional: insurrectionary
interpretate: interpret
intervenience: intervention
ironical: ironic
jerry-rigged: jury-rigged
judgmatic: judgmental
labyrinthian: labyrinthine
laudative: laudatory
legitimatization: legitimation
legitimatize: legitimize
legitimization: legitimation
lengthways: lengthwise
life-sized: life-size
liquorice: licorice
lithesome: lithe
lollipop: lollypop
loth: loath
lubricous: lubricious
maihem: mayhem
medicinal marijuana: medical marijuana
meliorate: ameliorate
minimalize: minimize
mirk: murk
mirky: murky
misdoubt: doubt
monetarize: monetize
moveable: movable
narcism: narcissism
neglective: neglectful
negligency: negligence
neologizer: neologist
neurologic: neurological
nicknack: knickknack
nictate: nictitate
nonenforceable: unenforceable
normalcy: normality
numbedness: numbness
omittable: omissible
onomatopoetic: onomatopoeic
opinioned: opined
optimum advantage: optimal advantage
orientate: orient
outsized: outsize
oversized: oversize
overthrowal: overthrow
pacificist: pacifist
paederast: pederast
parachronism: anachronism
parti-color: parti-colored
participative: participatory
party-colored: parti-colored
pediatrist: pediatrician
penumbrous: penumbral
perjorative: pejorative
permissory: permissive
permutate: permute
personation: impersonation
pharmaceutic: pharmaceutical
pleuritis: pleurisy
policy holder: policyholder
policyowner: policyholder
politicalize: politicize
precedency: precedence
preceptoral: preceptorial
precipitance: precipitancy
precipitant: precipitate
preclusory: preclusive
precolumbian: pre-Columbian
prefectoral: prefectorial
preponderately: preponderantly
preserval: preservation
preventative: preventive
proconsulship: proconsulate
procreational: procreative
procurance: procurement
propelment: propulsion
propulsory: propulsive
prosecutive: prosecutory
protectory: protective
provocatory: provocative
pruriency: prurience
psychal: psychical
punitory: punitive
quantitate: quantify
questionary: questionnaire
quiescency: quiescence
rabbin: rabbi
reasonability: reasonableness
recidivistic: recidivous
recriminative: recriminatory
recruital: recruitment
recurrency: recurrence
recusance: recusancy
recusation: recusal
recusement: recusal
redemptory: redemptive
referrable: referable
referrible: referable
refutatory: refutative
remitment: remittance
remittal: remission
renouncement: renunciation
renunciable: renounceable
reparatory: reparative
repudiative: repudiatory
requitement: requital
rescindment: rescission
restoral: restoration
reticency: reticence
reviewal: review
revisal: revision
revisional: revisionary
revolute: revolt
saliency: salience
salutiferous: salutary
sensatory: sensory
sessionary: sessional
shareowner: shareholder
sicklily: sickly
signator: signatory
slanderize: slander
societary: societal
sodomist: sodomite
solicitate: solicit
speculatory: speculative
spiritous: spirituous
statutorial: statutory
submergeable: submersible
submittal: submission
subtile: subtle
succuba: succubus
sufficience: sufficiency
suppliant: supplicant
surmisal: surmise
suspendible: suspendable
synthetize: synthesize
systemize: systematize
tactual: tactile
tangental: tangential
tautologous: tautological
tee-shirt: T-shirt
thenceforward: thenceforth
transiency: transience
transposal: transposition
unfrequent: infrequent
unreasonability: unreasonableness
unrevokable: irrevocable
unsubstantial: insubstantial
usurpature: usurpation
variative: variational
vegetive: vegetative
vindicative: vindictive
vituperous: vituperative
vociferant: vociferous
volitive: volitional
wolverene: wolverine
wolvish: wolfish

View File

@ -0,0 +1,38 @@
extends: substitution
message: "Consider using '%s' instead of '%s'."
ignorecase: true
level: error
action:
name: replace
swap:
affrontery: effrontery
analyzation: analysis
annoyment: annoyance
confirmant: confirmand
confirmants: confirmands
conversate: converse
crained: cranded
discomforture: discomfort|discomfiture
dispersement: disbursement|dispersal
doubtlessly: doubtless|undoubtedly
forebearance: forbearance
improprietous: improper
inclimate: inclement
inimicable: inimical
irregardless: regardless
minimalize: minimize
minimalized: minimized
minimalizes: minimizes
minimalizing: minimizing
optimalize: optimize
paralyzation: paralysis
pettifogger: pettifog
proprietous: proper
relative inexpense: relatively low price|affordability
seldomly: seldom
thusly: thus
uncategorically: categorically
undoubtably: undoubtedly|indubitably
unequivocable: unequivocal
unmercilessly: mercilessly
unrelentlessly: unrelentingly|relentlessly

Some files were not shown because too many files have changed in this diff Show More