diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 0000000..27105a9
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,35 @@
+version: 2
+jobs:
+ current:
+ docker:
+ - image: circleci/node:10.16.0
+ working_directory: ~/marp
+ steps:
+ - run: node --version
+
+ - checkout
+
+ - restore_cache:
+ keys:
+ - v1-dependencies-{{ .Environment.CIRCLE_JOB }}-{{ checksum "yarn.lock" }}-{{ .Branch }}
+ - v1-dependencies-{{ .Environment.CIRCLE_JOB }}-{{ checksum "yarn.lock" }}-
+ - v1-dependencies-{{ .Environment.CIRCLE_JOB }}-
+
+ - run: yarn install
+ - run: yarn audit
+
+ - save_cache:
+ key: v1-dependencies-{{ .Environment.CIRCLE_JOB }}-{{ checksum "yarn.lock" }}-{{ .Branch }}
+ paths:
+ - node_modules
+ - ~/.cache/yarn
+
+ - run:
+ name: Prettier formatting
+ command: yarn format:check
+
+workflows:
+ version: 2
+ build:
+ jobs:
+ - current
diff --git a/.gitignore b/.gitignore
index 958760c..0eabd9c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
+# Website gatsby
+/website/.cache/
+/website/public
+
# Created by https://www.gitignore.io/api/node,windows,macos,linux,sublimetext,emacs,vim,visualstudiocode
### Emacs ###
diff --git a/.node-version b/.node-version
index ceeec56..f0da094 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-v10.13.0
+v10.16.0
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..c518ba7
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,6 @@
+.git/
+.vscode/
+/website/.cache/
+/website/public
+node_modules
+package.json
diff --git a/.prettierrc.yml b/.prettierrc.yml
new file mode 100644
index 0000000..f8e77b2
--- /dev/null
+++ b/.prettierrc.yml
@@ -0,0 +1,3 @@
+semi: false
+singleQuote: true
+trailingComma: es5
diff --git a/LICENSE b/LICENSE
index 8bc6c35..6346151 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2018 Marp team (marp-team@marp.app)
+Copyright (c) 2018-2019 Marp team (marp-team@marp.app)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/netlify.toml b/netlify.toml
index ef19db7..0be4f6d 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -1,8 +1,3 @@
[build]
- publish = "public"
- command = ""
-
-# TODO: Remove branch context after than merged #11
-[context.gatsby]
publish = "website/public"
command = "cd website && yarn build"
diff --git a/package.json b/package.json
index 1c63bd3..6f0dc1e 100644
--- a/package.json
+++ b/package.json
@@ -16,5 +16,16 @@
"repository": {
"type": "git",
"url": "https://github.com/marp-team/marp"
+ },
+ "workspaces": [
+ "website"
+ ],
+ "scripts": {
+ "format": "prettier \"**/*.{css,html,js,json,jsx,md,scss,ts,tsx,yaml,yml}\"",
+ "format:check": "yarn -s --mutex file format -c"
+ },
+ "devDependencies": {
+ "prettier": "^1.17.1",
+ "typescript": "^3.5.1"
}
}
diff --git a/public/_redirects b/public/_redirects
deleted file mode 100644
index cba6bd3..0000000
--- a/public/_redirects
+++ /dev/null
@@ -1,2 +0,0 @@
-https://marp.netlify.com/* https://marp.app/:splat 301!
-/* https://github.com/marp-team/marp 302
diff --git a/tsconfig.base.json b/tsconfig.base.json
new file mode 100644
index 0000000..8f72cb8
--- /dev/null
+++ b/tsconfig.base.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "esModuleInterop": true,
+ "lib": ["es2016", "es2017", "dom"],
+ "module": "commonjs",
+ "noEmit": true,
+ "noImplicitAny": false,
+ "resolveJsonModule": true,
+ "strict": true,
+ "target": "es2015"
+ }
+}
diff --git a/website/blog/2019-06-06-the-story-of-marp-next/the-story-of-marp-next.md b/website/blog/2019-06-06-the-story-of-marp-next/the-story-of-marp-next.md
new file mode 100644
index 0000000..3e066c9
--- /dev/null
+++ b/website/blog/2019-06-06-the-story-of-marp-next/the-story-of-marp-next.md
@@ -0,0 +1,210 @@
+---
+author: Yuki Hattori
+date: 2019-06-06
+github: yhatt
+title: The story of Marp Next
+---
+
+The first version of [Marp](https://yhatt.github.io/marp/) was released at almost 3 years ago. At first, it was started from a simple tool for personal usage called "mdSlide". And now, Marp has been used by a lot of users who would recognize the real value of the presentation writer. Marp is amassed around [8,000 stars](https://github.com/yhatt/marp/stargazers) until now.
+
+However, our headache brought from lacked maintainability to develop. We had received so many requests to the old Marp app, and it has to evolve to keep providing the best writing environment of presentation deck.
+
+Today, I'm so excited to introduce the story of Marp Next! The full-rewritten Marp is not only just a writer. To be usable in various situations, we build **a brand-new Marp ecosystem** consisted of multiple modules. They are developed with JavaScript and TypeScript, and much more maintainable than the previous Marp.
+
+
+
+# Marp ecosystem
+
+Marp Next has two core components: **[Marpit]** framework and **[Marp Core]**. Tools by Marp ecosystem are usually based on these.
+
+## Marpit
+
+**[Marpit]** is _the skinny framework_ for creating HTML slide deck from Markdown. It is designed to convert Markdown into only minimum assets consisted of static HTML and CSS, and the output can convert into PDF slide deck by printing through Chrome / Chromium.
+
+Marpit has created for using as the base of Marp ecosystem, but it is also independent framework. You may integrate Marpit's Markdown conversion with your tool, even if it's not Marp: [reveal.js](https://codesandbox.io/embed/nw80vrxvpp), [WebSlides](https://codesandbox.io/embed/j3wo2091yw), and so on.
+
+One of real-world use cases is [MetaBake](https://www.metabake.org) project. It provides Marpit integration from our early phase, to be easy to build web page with presentation style. ([See example](https://github.com/metabake/mbake/tree/master/examples/slidesEx))
+
+[marpit]: https://marpit.marp.app/
+
+### [Marpit Markdown]: Keep compatibillity with a plain Markdown document
+
+We had received [many requests][issues] to the old Marp, about the additional syntax to help creating beautiful slide deck. On the other hand, we also have received a request that [must respect Markdown syntax strictly](https://github.com/yhatt/marp/issues/87). We have to deal with these contradicted issues.
+
+Additional syntax provided by Marpit should never break [CommonMark](https://commonmark.org/) document. Thus, the result of rendering keeps looking nice even if you open the Marpit Markdown in a general Markdown editor. And you can even extend the additional syntax via [markdown-it plugins](https://marpit.marp.app/usage?id=extend-marpit-by-plugins) if you need.
+
+[marpit markdown]: https://marpit.marp.app/markdown
+[issues]: https://github.com/yhatt/marp/issues
+
+### [Theme CSS]: Design your deck with clean markup
+
+Marpit has the theming system to allow designing everything of slides by CSS.
+
+The old Marp had the _limited_ theming system and required deep diving to internal for customization: Build system, [Sass], the logic of Marp app, and so on. So we had to create a brand-new theming system for easy customization of theme with only general CSS knowledge.
+
+Marpit's it only requires a pure CSS, and no additional knowledges! You have only to focus styling HTML semantic elements. It means that you can create theme CSS from now!
+
+In addition, Marpit has the pixel-perfect slide system like PowerPoint and Keynote. Theme creator never needs to worry about the responsive layout, and could provide design exactly as the author wanted with less effort.
+
+[theme css]: https://marpit.marp.app/theme-css
+[sass]: https://sass-lang.com/
+
+### [Inline SVG slide] (Experimental)
+
+Our unique idea is wrapping each slides by inline SVG. It might feel a bit strange, but makes many advantages.
+
+- Supports pixel-perfect scaling via style definition and **realizes Zero-JS slide deck**.
+- Isolates Markdown contents and prevents that injected DOM by Marpit's advanced feature breaks design defined in theme CSS.
+
+Thanks to the power of SVG, we can keep a framework simple and maintainable. [Marp Core] is based on inline SVG slide by default.
+
+[inline svg slide]: https://marpit.marp.app/inline-svg
+
+## Marp Core
+
+**[Marp Core]** is a base converter for our projects extended from Marpit. In short, it is a battery-included Marpit.
+
+Marpit only has bare essential features, so it might have not enough to start writing your deck. Marp Core provides the practical syntax, additional features, and built-in themes.
+
+Many of the features are based on the old desktop app, and have improved to be suitable to Marpit. Of course, we added the new features for creating more beautiful deck.
+
+[marp core]: https://github.com/marp-team/marp-core
+
+- Built-in themes (Default, Gaia, and _new_ UNCOVER theme)
+- Included Emoji support 😁
+- [KaTeX](https://katex.org/) Math typesetting
+- Auto scaling features (_new_)
+ - Fitting header via `` annotation
+ - Scale-down overflowed fence, code, and math block
+
+# Applications
+
+## Marp CLI
+
+[marp cli]: https://github.com/marp-team/marp-cli
+
+**[Marp CLI]** is a CLI interface of Marpit and Marp Core converter. It's a Swiss-Army knife for Marp slide deck!
+
+[![](https://raw.githubusercontent.com/marp-team/marp-cli/master/docs/images/marp-cli.gif)][marp cli]
+
+You can use it right now by running `npx @marp-team/marp-cli` if [Node.js](https://nodejs.org/) is installed.
+
+- Export to HTML, PDF, and image
+- Watch the change of your Markdown and theme (`--watch`)
+- Open preview window for presentation (`--preview`)
+- Full-customizable engine based on Marpit framework
+
+Marp had a text editor originally, but you might think that want to write the slide deck with your favorite editor. If you use Vim, you would feel uncomfortable not to be usable Vim style key-binding. From now on, use Marp CLI's watch mode together with original Vim!
+
+And Marp CLI can create really practicable static HTML as like as a presentation mode! It is powered by deep integration with [Bespoke.js](https://github.com/bespokejs/bespoke).
+
+Thanks to [Netlify], [Now], and more hosting services, Marp CLI also brings a efficient Git management for creating slide deck just like [GitPitch]. I've created [an example slide](https://yhatt-marp-cli-example.netlify.com/) managed via [GitHub repository](https://github.com/yhatt/marp-cli-example) as a good starter to help writing your slide deck. Try to use it via "Deploy to Netlify" button on [README](https://github.com/yhatt/marp-cli-example/blob/master/README.md#usage)!
+
+[netlify]: https://www.netlify.com/
+[now]: https://zeit.co/now/
+[gitpitch]: https://gitpitch.com/
+
+## Marp Web (_tech demo_)
+
+**[Marp Web]** is a Web interface of Marp presentation writer. It allows writing your slide deck as like as a traditional desktop app.
+
+> The current Marp Web is just a tech demo. We are planning to re-implement Marp Web based on well-known framework (like React) for building SPA.
+
+[marp web]: https://web.marp.app/
+
+### Progressive Web Apps
+
+It made [some strong oppositions by users that is using Marp in offline](https://github.com/yhatt/marp/issues/174#issuecomment-294594856) when an idea of migration to web-based app is proposed for keeping maintainability of Marp. It was caused that a thinking of PWA was not general at that time.
+
+And 2 years later, the time has come to use PWA! After the first access to **[https://web.marp.app/][marp web]**, Marp Web would be ready to use in both of online and offline. Online resources to use the web interface would be cached in your browser, and use them when network is offline.
+
+[][marp web]
+
+### Use via any devices
+
+By migrating to the web-based app, Marp will be able using in mobile device: Android and iOS. That's sure it's well suited to the tablet device like iPad.
+
+
+
+Marp Web would work also in Chrome OS well. Marp especially has many users in the field of education, and supporting Chrome OS that has large share in its field is meaningful.
+
+### Blazing-fast live preview ⚡️
+
+We think Marp's important feature is a blazing-fast live preview. In the web-based app, realizing the same feature had many difficulties.
+
+In currently published tech-demo, you can try Marp's really fast preview on the web. The preview applies as soon as typing, and it would not block your typing even if you have a large Markdown slides over than 100 pages.
+
+# Integrations
+
+The modulized Marp Core brought Marp integrations for some tools.
+
+## [Marp for VS Code][marp vscode]
+
+Honestly, I don't think to want to make a new editor because there are many great Markdown editors in the world. I had been thinking it would be awesome if Marp could integrate with a something else powerful Markdown editor. And now, Marp can use in [Visual Studio Code](https://code.visualstudio.com/)!
+
+[][marp vscode]
+
+It was realized because VS Code is using the same Markdown engine (markdown-it) as Marpit framework. Of course you can export slides as PDF and HTML easily, powered by [Marp CLI].
+
+[marp vscode]: https://marketplace.visualstudio.com/items?itemName=marp-team.marp-vscode
+
+## [Marp React] & [Marp Vue] (In development)
+
+[marp react]: https://github.com/marp-team/marp-react
+[marp vue]: https://github.com/marp-team/marp-vue
+
+Marp's blazing fast live-preview is not only for ours! We provide Marp renderer component into [React][marp react] and [Vue][marp vue]. Both Marp React and Marp Vue have supported the incremental update using framework's virtual DOM, and they are been easy to build your app.
+
+Especially, Marp React would become to the base of the future of [Marp Web].
+
+# Migration plan
+
+## Desktop app ([yhatt/marp](https://github.com/yhatt/marp))
+
+If you are using an old Marp application, **you should migrate to use Marp Next tools.** I NEVER recommend continue to use the old Marp, because _its maintainance has stopped 2 years ago and there is concern about security issues._
+
+In future, the main interface would become to Marp Web. We have bet to PWA technology that has a lot of advantages. The desktop app is planned as "Marp Desktop" but it just may become a wrapper of Web interface.
+
+I would stop publishing the old Marp and archive its repository if Marp Web has grown to become replacable the old Marp.
+
+## Your slide deck
+
+Your Markdown slides written in the old Marp syntax should rewrite to suit to the brand-new Marp ecosystem.
+
+In a new Marp, we have reconsidered Markdown syntax based on feedback to the old Marp app. So, some syntaxs are losing compatibillity.
+
+### Syntax
+
+- In Marp Core, non-whitelisted HTML elements are disabled by default because of security reason. Currently our whitelist includes only ` ` element. Some Marp Next tools has provided preference to enable HTML, but you should take care for enabling HTML in untrusted Markdown.
+
+### Directives
+
+- Directives would be parsed by YAML parser tuned for Marp (Marpit). Thus spot directive prefix `*` is changed to `_` for keeping YAML syntax.
+- Slide size is no longer changeable by Markdown. So `size` directive is removed too. Instead use theme CSS.
+- `page_number` directive is renamed to `paginate`.
+- `template` directive is renewed to use `class` directive. It can define HTML class per slides.
+- `prerender` directive is removed. It brings user confusing about exported PDF quality.
+
+### Image
+
+- Background image `![bg]()` has no filter applied by default. Try using `![bg opacity]()` if you want.
+- The inline image is no longer scalable by percentage `![50%]()`. (It's not supported in Firefox) Instead you can use `width` (`w`) and `height` (`w`) keyword to resize image.
+- `![center]()` won't work. It requires changing image to the block element and brings confusion to theme author. You can tweak style if you want.
+
+```html
+
+```
+
+# Try Marp Next!
+
+Marp Next just focuses to build the ecosystem for Markdown slide deck with pure open source. We expect to expand Marp productivity together with open source community.
+
+We still have stood at the beginning of the brand-new ecosystem. Are you interested to Marp team and our ecosystem? We welcome to start your contribution! See [our contributing guideline](https://github.com/marp-team/marp/blob/master/.github/CONTRIBUTING.md) and get started!
+
+> PS. I've started [Patreon](https://www.patreon.com/yhatt) and stood in a line of [GitHub Sponsors](https://github.com/sponsors). These are also good contribution if you want to help my working for open source.
diff --git a/website/gatsby-browser.js b/website/gatsby-browser.js
new file mode 100644
index 0000000..08f47ea
--- /dev/null
+++ b/website/gatsby-browser.js
@@ -0,0 +1,6 @@
+const { layoutFocusTarget } = require('./symbol')
+
+exports.onRouteUpdate = () => {
+ const focusTarget = window[layoutFocusTarget]
+ if (focusTarget) focusTarget.focus()
+}
diff --git a/website/gatsby-config.js b/website/gatsby-config.js
new file mode 100644
index 0000000..e409c4b
--- /dev/null
+++ b/website/gatsby-config.js
@@ -0,0 +1,55 @@
+const autoprefixer = require('autoprefixer')
+
+module.exports = {
+ siteMetadata: {
+ title: 'Marp: Markdown Presentation Ecosystem',
+ description:
+ 'Marp is the ecosystem to write your presentation with plain Markdown.',
+ keywords: ['markdown', 'slide', 'deck', 'presentation', 'marp', 'marpit'],
+ },
+ plugins: [
+ 'gatsby-plugin-typescript',
+ 'gatsby-plugin-sharp',
+ 'gatsby-plugin-react-helmet',
+ {
+ resolve: 'gatsby-plugin-sass',
+ options: {
+ cssLoaderOptions: {
+ postCssPlugins: [autoprefixer()],
+ camelCase: true,
+ },
+ },
+ },
+ {
+ resolve: 'gatsby-source-filesystem',
+ options: {
+ path: `${__dirname}/blog`,
+ name: 'blog-pages',
+ },
+ },
+ {
+ resolve: 'gatsby-transformer-remark',
+ options: {
+ excerpt_separator: '',
+ plugins: [
+ 'gatsby-remark-autolink-headers',
+ {
+ resolve: 'gatsby-remark-external-links',
+ options: { target: '_blank', rel: 'noopener' },
+ },
+ 'gatsby-remark-prismjs',
+ {
+ resolve: `gatsby-remark-images`,
+ options: {
+ maxWidth: 1200,
+ quality: 65,
+ withWebp: true,
+ wrapperStyle: 'margin-top:2rem;margin-bottom:2rem;',
+ },
+ },
+ 'gatsby-remark-copy-linked-files',
+ ],
+ },
+ },
+ ],
+}
diff --git a/website/gatsby-node.js b/website/gatsby-node.js
new file mode 100644
index 0000000..ab6fcdf
--- /dev/null
+++ b/website/gatsby-node.js
@@ -0,0 +1,43 @@
+const path = require('path')
+const { createFilePath } = require('gatsby-source-filesystem')
+const blogTpl = path.resolve('src/templates/blog.tsx')
+
+exports.createPages = ({ actions, graphql }) => {
+ const { createPage } = actions
+
+ return graphql(`
+ {
+ allMarkdownRemark(
+ sort: { order: DESC, fields: [frontmatter___date] }
+ limit: 1000
+ ) {
+ edges {
+ node {
+ fields {
+ path
+ }
+ }
+ }
+ }
+ }
+ `).then(result => {
+ if (result.errors) return Promise.reject(result.errors)
+
+ result.data.allMarkdownRemark.edges.forEach(({ node }) =>
+ createPage({ path: node.fields.path, component: blogTpl })
+ )
+ })
+}
+
+exports.onCreateNode = ({ node, actions, getNode }) => {
+ const { createNodeField } = actions
+
+ if (node.internal.type === `MarkdownRemark`) {
+ const date = new Date(node.frontmatter.date)
+ const slug = path.basename(createFilePath({ node, getNode }))
+
+ createNodeField({ node, name: 'slug', value: slug })
+ createNodeField({ node, name: 'path', value: `/blog/${slug}` })
+ createNodeField({ node, name: 'reserved', value: date > new Date() })
+ }
+}
diff --git a/website/package.json b/website/package.json
new file mode 100644
index 0000000..75d4ee9
--- /dev/null
+++ b/website/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "@marp-team/marp-website",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "build": "yarn run -s clean && gatsby build",
+ "check-ts": "tsc",
+ "clean": "rimraf .cache public",
+ "start": "gatsby develop"
+ },
+ "dependencies": {
+ "autoprefixer": "^9.6.0",
+ "gatsby": "^2.8.5",
+ "gatsby-plugin-react-helmet": "^3.0.12",
+ "gatsby-plugin-sass": "^2.0.11",
+ "gatsby-plugin-sharp": "^2.1.3",
+ "gatsby-plugin-typescript": "^2.0.15",
+ "gatsby-remark-autolink-headers": "^2.0.16",
+ "gatsby-remark-copy-linked-files": "^2.0.13",
+ "gatsby-remark-external-links": "^0.0.4",
+ "gatsby-remark-images": "^3.0.14",
+ "gatsby-remark-prismjs": "^3.2.10",
+ "gatsby-source-filesystem": "^2.0.38",
+ "gatsby-transformer-remark": "^2.3.12",
+ "node-sass": "^4.12.0",
+ "normalize.css": "^8.0.1",
+ "prismjs": "^1.16.0",
+ "react": "^16.8.6",
+ "react-dom": "^16.8.6",
+ "react-helmet": "^5.2.1",
+ "react-sticky": "^6.0.3"
+ },
+ "devDependencies": {
+ "rimraf": "^2.6.3"
+ }
+}
diff --git a/website/src/components/assets/marp-logo.svg b/website/src/components/assets/marp-logo.svg
new file mode 100644
index 0000000..11c2cea
--- /dev/null
+++ b/website/src/components/assets/marp-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/website/src/components/blog.tsx b/website/src/components/blog.tsx
new file mode 100644
index 0000000..898d72c
--- /dev/null
+++ b/website/src/components/blog.tsx
@@ -0,0 +1,143 @@
+import { Link, graphql } from 'gatsby'
+import React from 'react'
+import Button from './button'
+import Contents from './contents'
+import { combineClass } from './utils'
+import style from './style/blog.module.scss'
+
+interface BlogBaseProps {
+ fields: {
+ path: string
+ reserved: boolean
+ }
+ frontmatter: {
+ author: string
+ date: string
+ github?: string
+ title: string
+ }
+ key?: any
+}
+
+export interface BlogProps extends BlogBaseProps {
+ html: string
+}
+
+export interface BlogExcerptedProps extends BlogBaseProps {
+ excerpt: string
+}
+
+const Meta: React.FC<{
+ author: string
+ date: string
+ github?: string
+ reserved: boolean
+}> = ({ author, date, github, reserved }) => (
+
+
+ by
+
+ {github ? (
+
+
+
+ {author}
+
+ ) : (
+ author
+ )}
+
+ {reserved && (
+ <>
+ Reserved
+ >
+ )}
+
+)
+
+const BlogBase: React.FC = ({
+ fields: { path, reserved },
+ frontmatter: { author, date, github, title },
+ children,
+ ...props
+}) => (
+
+
+