16
.github/workflows/website.yml
vendored
Normal 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'
|
@ -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
After Width: | Height: | Size: 453 KiB |
14
website/.babelrc
Normal 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
@ -0,0 +1,3 @@
|
|||||||
|
.cache
|
||||||
|
public
|
||||||
|
dist
|
4
website/.markdownlint.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"default": false,
|
||||||
|
"MD032": true
|
||||||
|
}
|
1
website/.nvmrc
Normal file
@ -0,0 +1 @@
|
|||||||
|
--lts
|
19
website/README.md
Normal 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
11
website/data/docs.yml
Normal 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
@ -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
@ -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 that’s 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 don’t 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"
|
||||||
|
|
7
website/data/notifications.yml
Normal 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
@ -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.
|
9
website/gatsby-browser.js
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -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);
|
27
website/src/components/blog-post-template.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
34
website/src/components/button.js
Normal 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;
|
20
website/src/components/chat-button.js
Normal 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;
|
59
website/src/components/community-channels-list.js
Normal 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;
|
55
website/src/components/community.js
Normal 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;
|
32
website/src/components/container.js
Normal 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;
|
101
website/src/components/docs-nav.js
Normal 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>×</span> : <span>☰</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 };
|
42
website/src/components/docs-template.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
56
website/src/components/docsearch.js
Normal 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);
|
46
website/src/components/edit-link.js
Normal 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;
|
125
website/src/components/event-box.js
Normal 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>…</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;
|
46
website/src/components/features.js
Normal 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;
|
97
website/src/components/footer.js
Normal 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;
|
32
website/src/components/github-button.js
Normal 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;
|
14
website/src/components/grid.js
Normal 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;
|
248
website/src/components/header.js
Normal 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>×</span> : <img src={searchIcon} alt="search" />}
|
||||||
|
</SearchBtn>
|
||||||
|
<MenuBtn onClick={handleMenuBtnClick}>
|
||||||
|
{isNavOpen ? <span>×</span> : <span>☰</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;
|
17
website/src/components/hero-title.js
Normal 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;
|
37
website/src/components/home-section.js
Normal 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;
|
71
website/src/components/layout.js
Normal 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;
|
10
website/src/components/lead.js
Normal 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;
|
137
website/src/components/markdown.js
Normal 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;
|
8
website/src/components/markdownify.js
Normal 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;
|
10
website/src/components/meta-info.js
Normal 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;
|
49
website/src/components/notification.js
Normal 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;
|
13
website/src/components/notifications.js
Normal 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;
|
30
website/src/components/page-hero.js
Normal 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;
|
16
website/src/components/page.js
Normal 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;
|
68
website/src/components/release.js
Normal 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;
|
23
website/src/components/section-label.js
Normal 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;
|
30
website/src/components/sidebar-layout.js
Normal 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;
|
62
website/src/components/table-of-contents.js
Normal 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;
|
17
website/src/components/twitter-meta.js
Normal 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;
|
111
website/src/components/video-embed.js
Normal 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;
|
29
website/src/components/whats-new.js
Normal 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;
|
18
website/src/components/widget-doc.js
Normal 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;
|
81
website/src/components/widgets.js
Normal 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;
|
98
website/src/global-styles.js
Normal 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
@ -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
@ -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 |
1
website/src/img/collab.svg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
website/src/img/demo.gif
Normal file
After Width: | Height: | Size: 2.5 MiB |
1
website/src/img/feature-access.svg
Normal 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 |
1
website/src/img/feature-editor.svg
Normal 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 |
1
website/src/img/feature-workflow.svg
Normal file
After Width: | Height: | Size: 8.1 KiB |
1
website/src/img/github.svg
Normal 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 |
1
website/src/img/heart.svg
Normal 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 |
1
website/src/img/helix.svg
Normal file
After Width: | Height: | Size: 24 KiB |
1
website/src/img/netlify-logo.svg
Normal file
After Width: | Height: | Size: 14 KiB |
3
website/src/img/play.svg
Normal 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 |
BIN
website/src/img/screenshot-content.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
website/src/img/screenshot-editor.jpg
Normal file
After Width: | Height: | Size: 100 KiB |
BIN
website/src/img/screenshot-editor.png
Normal file
After Width: | Height: | Size: 362 KiB |
BIN
website/src/img/screenshot-editorial.png
Normal file
After Width: | Height: | Size: 103 KiB |
BIN
website/src/img/screenshot-identity.png
Normal file
After Width: | Height: | Size: 24 KiB |
1
website/src/img/search.svg
Normal 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 |
921
website/src/img/simple-cms-logo.svg
Normal 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 |
1
website/src/img/smashing-logo.svg
Normal file
After Width: | Height: | Size: 15 KiB |
1
website/src/img/wavy-divider.svg
Normal 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
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
39
website/src/pages/community.js
Normal 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
@ -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;
|
55
website/src/templates/blog-post.js
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
113
website/src/templates/doc-page.js
Normal 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
@ -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
@ -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;
|
||||||
|
}
|
32
website/src/writing-guide/styles/Avoid/Acronyms.yml
Normal 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
|
193
website/src/writing-guide/styles/Avoid/Adverbs.yml
Normal 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
|
53
website/src/writing-guide/styles/Avoid/Archaisms.yml
Normal 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
|
781
website/src/writing-guide/styles/Avoid/Cliches.yml
Normal 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
|
6
website/src/writing-guide/styles/Avoid/Hyperbole.yml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
extends: existence
|
||||||
|
message: "'%s' is hyperbolic."
|
||||||
|
level: error
|
||||||
|
nonword: true
|
||||||
|
tokens:
|
||||||
|
- '[a-z]+[!?]{2,}'
|
119
website/src/writing-guide/styles/Avoid/Indirect.yml
Normal 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
|
37
website/src/writing-guide/styles/Avoid/Jargon.yml
Normal 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
|
180
website/src/writing-guide/styles/Avoid/Passive.yml
Normal 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
|
111
website/src/writing-guide/styles/Avoid/Simplify.yml
Normal 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
|
27
website/src/writing-guide/styles/README.md
Normal 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.
|
||||||
|
```
|
12
website/src/writing-guide/styles/README_proselint.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Copyright © 2014–2015, 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.
|
13
website/src/writing-guide/styles/Replace/Diacritical.yml
Normal 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é
|
46
website/src/writing-guide/styles/Replace/GenderBias.yml
Normal 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
|
357
website/src/writing-guide/styles/Replace/Needless.yml
Normal 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
|
38
website/src/writing-guide/styles/Replace/Nonwords.yml
Normal 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
|