diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7255088
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,70 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# dotenv environment variables file
+.env
+.env.*
+
+# gatsby files
+.cache/
+public
+
+# Mac files
+.DS_Store
+
+# Yarn
+yarn-error.log
+.pnp/
+.pnp.js
+# Yarn Integrity file
+.yarn-integrity
diff --git a/CNAME b/CNAME
index 95a661b..09ead30 100644
--- a/CNAME
+++ b/CNAME
@@ -1 +1 @@
-runningbeta.io
\ No newline at end of file
+runningbeta.io
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 315a44e..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2017 runningbeta
-
-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.
diff --git a/README.md b/README.md
index 9b3e85f..c55568e 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,97 @@
-# runningbeta.io π
+# Gatsby 2.0 starter
-Ethereum focused dev team
+[](https://github.com/sindresorhus/xo)
+[](https://travis-ci.org/fabien0102/gatsby-starter)
+[](https://ci.appveyor.com/project/fabien0102/gatsby-starter/branch/master)
+[](https://codeclimate.com/github/fabien0102/gatsby-starter)
+[](https://codeclimate.com/github/fabien0102/gatsby-starter/coverage)
+
+Demo:
+
+Storybook:
+
+Gatsby 2.0 starter for generate awesome static website working with a nice env development.
+
+## Warning
+
+This starter is currently in wip (see progression to #What's inside session).
+
+## Getting started
+
+Install this starter (assuming Gatsby is installed) by running from your CLI:
+
+```bash
+$ gatsby new my-website https://github.com/fabien0102/gatsby-starter
+```
+
+Run `npm start` (or press `F5` if you are on VSCode) to hot-serve your website on .
+
+Run `npm run build` to create static site ready to host (`/public`)
+
+## What's inside?
+
+- [ ] Gatsby 2.0 (alpha)
+ - [x] sharp
+ - [x] offline support
+ - [ ] google analytics
+ - [x] manifest
+ - [x] typescript
+ - [x] blog in markdown
+- [x] Best practices tools
+ - [x] [Jest](https://facebook.github.io/jest/) / [Enzyme](http://airbnb.io/enzyme/)
+ - [x] [Storybook](https://storybooks.js.org/)
+ - [x] [Typescript](https://www.typescriptlang.org/) / [tslint](https://palantir.github.io/tslint/)
+ - [x] [xo linter](https://github.com/sindresorhus/xo)
+ - [x] [Remark-lint](https://github.com/wooorm/remark-lint)
+ - [x] [Husky](https://github.com/typicode/husky) & [lint-staged](https://github.com/okonet/lint-staged) for autofix each commit
+ - [x] Travis/AppVeyor config (unix-osx-windows CI)
+ - [x] Code climate config
+- [x] SEO
+ - [x] [Helmet](https://github.com/nfl/react-helmet)
+- [x] [Semantic-ui](http://react.semantic-ui.com) for styling
+- [x] Lazyboy tools
+ - [x] [plop](https://github.com/amwmedia/plop) templates -> `npm run generate`
+
+## Files structure
+
+ .
+ βββ data // website data (included into graphQL)
+ β βββ author.json // list of blog authors
+ β βββ avatars // authors avatars
+ β βββ blog // all blog data (posts, images)
+ βββ gatsby-config.js // gatsby configuration
+ βββ gatsby-node.js // gatsby node hooks
+ βββ generators // generators (`npm run generate`)
+ β βββ blog-post-generator.js // `blog post` generator
+ β βββ component-generator.js // `component` generator
+ β βββ page-generator.js // `page` generator
+ β βββ plopfile.js // generators entry
+ β βββ templates // all templates (handlebar notation)
+ β βββ utils.js // utils scripts for generators
+ βββ package.json
+ βββ public // output folder (in .gitignore)
+ βββ README.md // this file
+ βββ src // sources
+ β βββ components // all react components
+ β βββ css // styles
+ β βββ declarations.d.ts // declarations for no typescript modules/files
+ β βββ graphql-types.d.ts // graphql types (`npm run graphql-types`)
+ β βββ html.tsx // main html (required)
+ β βββ layouts // layouts
+ β β βββ default.tsx // default layout (required)
+ β βββ pages // all pages
+ β βββ templates // all templates (used for procedural page creation, see `gatsby-node.js`)
+ βββ tools // miscs tools for dev
+ β βββ update-post-date.js // update post date hook
+ βββ tsconfig.json // typescript configuration
+ βββ tslint.json // tslint configuration
+ βββ package-lock.json // npm lock file
+
+## Plop generators - `npm run generate`
+
+To avoid any boring copy/paste, this starter-kit have many generators to permit
+simple bootstrap of current file pattern (eg. components/pages/blog posts). e.g. to add a new blog post first add the authors to data/authors.json and add authors' images to the data/avatars folder. Next execute 'npm run generate' and select 'Blog post'. Follow the prompts for a new post. Each blog post requires an image be added to the /data/blog/ folder prior to running 'gatsby develop'.
+
+You can add/delete/modify any generators into `/generators` folder.
+
+Be lazy and have fun!
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..b42d854
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,26 @@
+# Test against the latest version of this Node.js version
+environment:
+ nodejs_version: "8"
+
+platform:
+ - x64
+
+# Install scripts. (runs after repo cloning)
+install:
+ # Get the latest stable version of Node.js or io.js
+ - ps: Install-Product node $env:nodejs_version $env:platform
+ # install global modules
+ - npm i -g windows-build-tools
+ # install modules
+ - npm install
+
+# Post-install test scripts.
+test_script:
+ # Output useful info for debugging.
+ - node --version
+ - npm --version
+ # run tests
+ - npm test
+
+# Don't actually build.
+build: off
\ No newline at end of file
diff --git a/data/author.json b/data/author.json
new file mode 100644
index 0000000..18501d6
--- /dev/null
+++ b/data/author.json
@@ -0,0 +1,9 @@
+[
+ {
+ "id": "Fabien BERNARD",
+ "bio": "JavaScript Developer with β₯ #Craftman #Lean #JS #FRP. Member at @GatsbyJS.",
+ "avatar": "avatars/fabien0102.jpg",
+ "twitter": "@fabien0102",
+ "github": "@fabien0102"
+ }
+]
\ No newline at end of file
diff --git a/data/avatars/fabien0102.jpg b/data/avatars/fabien0102.jpg
new file mode 100644
index 0000000..895b4dc
Binary files /dev/null and b/data/avatars/fabien0102.jpg differ
diff --git a/data/blog/2017-04-18--welcoming/index.md b/data/blog/2017-04-18--welcoming/index.md
new file mode 100644
index 0000000..b253d31
--- /dev/null
+++ b/data/blog/2017-04-18--welcoming/index.md
@@ -0,0 +1,30 @@
+---
+title: Welcoming
+createdDate: '2017-04-18'
+updatedDate: '2017-05-06'
+author: Fabien BERNARD
+tags:
+ - starter
+ - gatsby
+image: pexels-photo-253092.jpeg
+draft: false
+---
+
+Welcome to gatsby-starter!
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tristique lacus vitae diam posuere faucibus. In hac habitasse platea dictumst. Ut id arcu non risus tincidunt commodo. Sed felis leo, pharetra non porttitor sodales, sodales dictum tortor. Vivamus vel neque interdum, egestas urna ac, finibus tellus. Morbi et rhoncus ligula, nec volutpat dolor. Cras efficitur ipsum a facilisis laoreet. Duis ut libero eget mi convallis maximus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque blandit sit amet erat vel semper.
+
+Ut egestas nisl in nunc accumsan, et interdum erat finibus. Fusce commodo ex nec imperdiet fermentum. Suspendisse non nulla eu eros rutrum vestibulum. Curabitur sit amet tortor venenatis, efficitur felis non, commodo urna. Aliquam ut auctor risus. Nullam nec felis pellentesque, tincidunt erat ut, aliquam neque. Ut elementum aliquam leo.
+
+Pellentesque sit amet purus a erat tincidunt elementum. Mauris lobortis egestas tellus, vel blandit tortor pellentesque at. Suspendisse potenti. Aenean vehicula, dolor ac interdum fermentum, velit elit fermentum nisi, in hendrerit nisi dolor semper est. Cras ullamcorper eros nec lacus maximus, a tincidunt ipsum feugiat. Quisque dignissim bibendum orci nec vestibulum. Phasellus accumsan eleifend posuere. Aliquam urna neque, auctor id accumsan nec, viverra vel tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sagittis libero ut porttitor lobortis. Nam nec felis tellus. Praesent ipsum ipsum, consectetur non hendrerit non, egestas et felis.
+
+Donec pretium facilisis orci, vitae blandit ex gravida a. Etiam a augue urna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce finibus urna lectus, eu iaculis massa tempus non. Maecenas in lectus massa. In ut ipsum eleifend, condimentum libero ut, ultricies massa. Integer viverra fringilla sem. Mauris nulla mi, accumsan sed hendrerit ut, tincidunt quis neque. Nullam egestas sem neque, id porta nunc sagittis quis.
+
+Morbi libero sem, molestie nec volutpat ac, volutpat eget dui. Phasellus ante turpis, blandit accumsan facilisis volutpat, bibendum vehicula metus. Fusce pellentesque orci ac imperdiet vestibulum. Aenean aliquam et elit sit amet eleifend. Vivamus libero lacus, porta quis neque a, tincidunt cursus lorem. Nulla placerat gravida nulla, in vestibulum risus lobortis ut. Proin sit amet varius arcu. Sed tincidunt vitae lectus vitae pretium. Fusce malesuada nec diam blandit pharetra. Vivamus fringilla elit ut odio sollicitudin, a convallis nulla dictum. Proin porta nisi eu cursus hendrerit. Donec vel tortor at magna maximus placerat gravida nec ligula.
+
+```javascript
+const plop = "coucou";
+const toto = "tata";
+```
+
+coucou `plop` comment tu vasΒ ?
diff --git a/data/blog/2017-04-18--welcoming/pexels-photo-253092.jpeg b/data/blog/2017-04-18--welcoming/pexels-photo-253092.jpeg
new file mode 100644
index 0000000..ec87eed
Binary files /dev/null and b/data/blog/2017-04-18--welcoming/pexels-photo-253092.jpeg differ
diff --git a/data/blog/2017-05-02--article-1/index.md b/data/blog/2017-05-02--article-1/index.md
new file mode 100644
index 0000000..857388f
--- /dev/null
+++ b/data/blog/2017-05-02--article-1/index.md
@@ -0,0 +1,17 @@
+---
+title: 'Article #1'
+createdDate: '2017-05-02'
+updatedDate: '2017-05-06'
+author: Fabien BERNARD
+tags:
+ - test
+image: pexels-photo-59628.jpeg
+draft: false
+---
+
+My awesome article
+
+## TODO
+
+- [x] Replace image
+- [ ] Write an awesome article
diff --git a/data/blog/2017-05-02--article-1/pexels-photo-59628.jpeg b/data/blog/2017-05-02--article-1/pexels-photo-59628.jpeg
new file mode 100644
index 0000000..84ac932
Binary files /dev/null and b/data/blog/2017-05-02--article-1/pexels-photo-59628.jpeg differ
diff --git a/data/blog/2017-05-02--article-2/cup-of-coffee-laptop-office-macbook-89786.jpeg b/data/blog/2017-05-02--article-2/cup-of-coffee-laptop-office-macbook-89786.jpeg
new file mode 100644
index 0000000..b4fd374
Binary files /dev/null and b/data/blog/2017-05-02--article-2/cup-of-coffee-laptop-office-macbook-89786.jpeg differ
diff --git a/data/blog/2017-05-02--article-2/index.md b/data/blog/2017-05-02--article-2/index.md
new file mode 100644
index 0000000..ef94ef4
--- /dev/null
+++ b/data/blog/2017-05-02--article-2/index.md
@@ -0,0 +1,17 @@
+---
+title: 'Article #2'
+createdDate: '2017-05-02'
+updatedDate: '2017-05-06'
+author: Fabien BERNARD
+tags:
+ - test
+image: cup-of-coffee-laptop-office-macbook-89786.jpeg
+draft: false
+---
+
+My awesome article
+
+## TODO
+
+- [x] Replace image
+- [ ] Write an awesome article
diff --git a/gatsby-browser.tsx b/gatsby-browser.tsx
new file mode 100644
index 0000000..6aa6434
--- /dev/null
+++ b/gatsby-browser.tsx
@@ -0,0 +1,9 @@
+import * as React from "react";
+import { Provider } from "react-redux";
+
+import { store } from "./src/store";
+
+export const wrapRootElement = ({ element }) =>
+
+ {element}
+ ;
diff --git a/gatsby-config.js b/gatsby-config.js
new file mode 100644
index 0000000..a2760a2
--- /dev/null
+++ b/gatsby-config.js
@@ -0,0 +1,86 @@
+module.exports = {
+ siteMetadata: {
+ title: 'RunningBeta | Blockchain, Ethereum, Smart Contracts',
+ googleVerification: 'abcdefz',
+ disqus: 'gatsby-typescript'
+ },
+ mapping: {
+ 'MarkdownRemark.frontmatter.author': 'AuthorJson'
+ },
+ plugins: [
+ // Expose `/data` to graphQL layer
+ {
+ resolve: 'gatsby-source-filesystem',
+ options: {
+ name: 'data',
+ path: `${__dirname}/data`
+ }
+ },
+
+ {
+ resolve: 'gatsby-plugin-google-analytics',
+ options: {
+ trackingId: 'YOUR_GOOGLE_ANALYTICS_TRACKING_ID',
+ // Puts tracking script in the head instead of the body
+ head: false,
+ // Setting this parameter is optional
+ anonymize: true,
+ // Setting this parameter is also optional
+ respectDNT: true
+ }
+ },
+
+ // Parse all markdown files (each plugin add/parse some data into graphQL layer)
+ {
+ resolve: 'gatsby-transformer-remark',
+ options: {
+ plugins: [
+ {
+ resolve: 'gatsby-remark-images',
+ options: {
+ maxWidth: 690,
+ backgroundColor: '#f7f0eb'
+ }
+ },
+ 'gatsby-remark-prismjs',
+ 'gatsby-remark-copy-linked-files',
+ 'gatsby-remark-autolink-headers'
+ ]
+ }
+ },
+
+ // Parse all images files
+ 'gatsby-transformer-sharp',
+ 'gatsby-plugin-sharp',
+
+ // Parse JSON files
+ 'gatsby-transformer-json',
+
+ // Add typescript stack into webpack
+ 'gatsby-plugin-typescript',
+
+ // This plugin takes your configuration and generates a
+ // web manifest file so your website can be added to your
+ // homescreen on Android.
+ /* eslint-disable camelcase */
+ {
+ resolve: 'gatsby-plugin-manifest',
+ options: {
+ name: 'Gatsby website',
+ short_name: 'Gatsby website',
+ start_url: '/',
+ background_color: '#f7f7f7',
+ theme_color: '#191919',
+ display: 'minimal-ui'
+ }
+ },
+ /* eslint-enable camelcase */
+
+ // This plugin generates a service worker and AppShell
+ // html file so the site works offline and is otherwise
+ // resistant to bad networks. Works with almost any
+ // site!
+ // `gatsby-plugin-offline`
+ 'gatsby-plugin-remove-serviceworker'
+ ]
+};
diff --git a/gatsby-node.js b/gatsby-node.js
new file mode 100644
index 0000000..f572ee8
--- /dev/null
+++ b/gatsby-node.js
@@ -0,0 +1,115 @@
+const path = require("path");
+const slash = require("slash");
+const { kebabCase, uniq, get, compact, times } = require("lodash");
+
+// Don't forget to update hard code values into:
+// - `templates/blog-page.tsx:23`
+// - `pages/blog.tsx:26`
+// - `pages/blog.tsx:121`
+const POSTS_PER_PAGE = 10;
+const cleanArray = arr => compact(uniq(arr));
+
+// Create slugs for files.
+// Slug will used for blog page path.
+exports.onCreateNode = ({ node, actions, getNode }) => {
+ const { createNodeField } = actions;
+ let slug;
+ switch (node.internal.type) {
+ case `MarkdownRemark`:
+ const fileNode = getNode(node.parent);
+ const [basePath, name] = fileNode.relativePath.split("/");
+ slug = `/${basePath}/${name}/`;
+ break;
+ }
+ if (slug) {
+ createNodeField({ node, name: `slug`, value: slug });
+ }
+};
+
+// Implement the Gatsby API `createPages`.
+// This is called after the Gatsby bootstrap is finished
+// so you have access to any information necessary to
+// programatically create pages.
+exports.createPages = ({ graphql, actions }) => {
+ const { createPage } = actions;
+
+ return new Promise((resolve, reject) => {
+ const templates = ["blogPost", "tagsPage", "blogPage"].reduce(
+ (mem, templateName) => {
+ return Object.assign({}, mem, {
+ [templateName]: path.resolve(
+ `src/templates/${kebabCase(templateName)}.tsx`
+ )
+ });
+ },
+ {}
+ );
+
+ graphql(
+ `
+ {
+ posts: allMarkdownRemark {
+ edges {
+ node {
+ fields {
+ slug
+ }
+ frontmatter {
+ tags
+ }
+ }
+ }
+ }
+ }
+ `
+ ).then(result => {
+ if (result.errors) {
+ return reject(result.errors);
+ }
+ const posts = result.data.posts.edges.map(p => p.node);
+
+ // Create blog pages
+ posts
+ .filter(post => post.fields.slug.startsWith("/blog/"))
+ .forEach(post => {
+ createPage({
+ path: post.fields.slug,
+ component: slash(templates.blogPost),
+ context: {
+ slug: post.fields.slug
+ }
+ });
+ });
+
+ // Create tags pages
+ posts
+ .reduce(
+ (mem, post) => cleanArray(mem.concat(get(post, "frontmatter.tags"))),
+ []
+ )
+ .forEach(tag => {
+ createPage({
+ path: `/blog/tags/${kebabCase(tag)}/`,
+ component: slash(templates.tagsPage),
+ context: {
+ tag
+ }
+ });
+ });
+
+ // Create blog pagination
+ const pageCount = Math.ceil(posts.length / POSTS_PER_PAGE);
+ times(pageCount, index => {
+ createPage({
+ path: `/blog/page/${index + 1}/`,
+ component: slash(templates.blogPage),
+ context: {
+ skip: index * POSTS_PER_PAGE
+ }
+ });
+ });
+
+ resolve();
+ });
+ });
+};
diff --git a/gatsby-ssr.tsx b/gatsby-ssr.tsx
new file mode 100644
index 0000000..44e1718
--- /dev/null
+++ b/gatsby-ssr.tsx
@@ -0,0 +1,14 @@
+import * as React from "react";
+import { Provider } from "react-redux";
+import { renderToString } from "react-dom/server";
+
+import { store } from "./src/store";
+
+exports.replaceRenderer = ({ bodyComponent, replaceBodyHTMLString }) => {
+ const ConnectedBody = () => (
+
+ {bodyComponent}
+
+ );
+ replaceBodyHTMLString(renderToString());
+};
diff --git a/generators/component-generator.js b/generators/component-generator.js
new file mode 100644
index 0000000..96220a2
--- /dev/null
+++ b/generators/component-generator.js
@@ -0,0 +1,126 @@
+const {unflatten} = require('flat');
+const {pascalCase, sentenceCase} = require('change-case');
+const {inputRequired, addWithCustomData} = require('./utils');
+
+const MAX_PROPS = 10;
+
+const propsPrompts = [];
+[...new Array(MAX_PROPS)].forEach((v, i) => {
+ propsPrompts.push(
+ {
+ type: 'confirm',
+ name: '_props',
+ message: () => (i === 0 ? 'Do you have props?' : 'Other props?'),
+ when: data => i === 0 || data._props
+ },
+ {
+ type: 'input',
+ name: `props.${i}.name`,
+ message: 'Props name?',
+ validate: inputRequired('props name'),
+ when: data => data._props
+ },
+ {
+ type: 'input',
+ name: `props.${i}.type`,
+ message: 'Props type?',
+ validate: inputRequired('props type'),
+ when: data => data._props
+ },
+ {
+ type: 'confirm',
+ name: `props.${i}.required`,
+ message: 'Props is required?',
+ when: data => data._props
+ }
+ );
+});
+
+module.exports = plop => {
+ plop.addHelper('propsHelper', text => `{${text}}`);
+ plop.setGenerator('component', {
+ prompts: [
+ {
+ type: 'input',
+ name: 'name',
+ message: 'Component name?',
+ validate: inputRequired('name')
+ },
+ {
+ type: 'input',
+ name: 'description',
+ message: 'Component description?',
+ default: data => `${sentenceCase(data.name)} component.`
+ },
+ ...propsPrompts,
+ {
+ type: 'checkbox',
+ name: 'files',
+ message: 'Wish files do you generate?',
+ choices: data => [
+ {
+ name: `${pascalCase(data.name)}.tsx`,
+ value: 'component',
+ checked: true
+ },
+ {
+ name: `${pascalCase(data.name)}.test.tsx`,
+ value: 'test',
+ checked: true
+ },
+ {
+ name: `${pascalCase(data.name)}.stories.tsx`,
+ value: 'stories',
+ checked: true
+ }
+ ]
+ }
+ ],
+ actions: data => {
+ // Parse data for easy templating
+ data = unflatten(data);
+ data.props = data.props || [];
+ data.haveRequiredProps = data.props.reduce(
+ (mem, prop) => mem || prop.required,
+ false
+ );
+
+ data.props = data.props.map(prop =>
+ Object.assign({}, prop, {optional: !prop.required})
+ );
+
+ const basePath = (data.files.length === 0) ?
+ '../src/components/' :
+ '../src/components/{{pascalCase name}}/';
+
+ const actions = [];
+
+ [
+ {
+ condition: 'component', actions: [
+ {path: `${basePath}{{pascalCase name}}.tsx`, templateFile: 'templates/component-tsx.template'}
+ ]
+ },
+ {
+ condition: 'test', actions: [
+ {path: `${basePath}{{pascalCase name}}.test.tsx`, templateFile: 'templates/component-test-tsx.template'}
+ ]
+ },
+ {
+ condition: 'stories', actions: [
+ {path: `${basePath}{{pascalCase name}}.stories.tsx`, templateFile: 'templates/component-stories-tsx.template'},
+ {path: `${basePath}README.md`, templateFile: 'templates/component-readme-md.template'}
+ ]
+ }
+ ].forEach(a => {
+ if (data.files.includes(a.condition)) {
+ a.actions.forEach(i => {
+ actions.push(addWithCustomData(plop, i, data));
+ });
+ }
+ });
+
+ return actions;
+ }
+ });
+};
diff --git a/generators/page-generator.js b/generators/page-generator.js
new file mode 100644
index 0000000..5bba38b
--- /dev/null
+++ b/generators/page-generator.js
@@ -0,0 +1,21 @@
+const {inputRequired} = require('./utils');
+
+module.exports = plop => {
+ plop.setGenerator('page', {
+ prompts: [
+ {
+ type: 'input',
+ name: 'name',
+ message: 'Page name?',
+ validate: inputRequired('name')
+ }
+ ],
+ actions: [
+ {
+ type: 'add',
+ path: '../src/pages/{{camelCase name}}.tsx',
+ templateFile: 'templates/page-tsx.template'
+ }
+ ]
+ });
+};
diff --git a/generators/plopfile.js b/generators/plopfile.js
new file mode 100644
index 0000000..7cefb61
--- /dev/null
+++ b/generators/plopfile.js
@@ -0,0 +1,10 @@
+/**
+ * Plopfile generator
+ *
+ * https://github.com/amwmedia/plop
+ */
+
+module.exports = plop => {
+ plop.load('./component-generator.js');
+ plop.load('./page-generator.js');
+};
diff --git a/generators/templates/component-readme-md.template b/generators/templates/component-readme-md.template
new file mode 100644
index 0000000..e87a90b
--- /dev/null
+++ b/generators/templates/component-readme-md.template
@@ -0,0 +1,7 @@
+# {{pascalCase name}} component
+
+{{description}}
+
+## Source
+
+ <{{pascalCase name}}{{#each props}}{{#if required}} {{name}}={{propsHelper name}} {{/if}}{{/each}} />
diff --git a/generators/templates/component-stories-tsx.template b/generators/templates/component-stories-tsx.template
new file mode 100644
index 0000000..0548ab1
--- /dev/null
+++ b/generators/templates/component-stories-tsx.template
@@ -0,0 +1,28 @@
+/* tslint:disable no-var-requires */
+const withReadme = (require("storybook-readme/with-readme") as any).default;
+const {{pascalCase name}}Readme = require("./README.md");
+
+import * as React from "react";
+import { storiesOf } from "@storybook/react";
+import { action } from "@storybook/addon-actions";
+import {{pascalCase name}} from "./{{pascalCase name}}";
+
+storiesOf("{{pascalCase name}}", module)
+ .addDecorator(withReadme({{pascalCase name}}Readme))
+ {{#if haveRequiredProps}}
+ .add("default", () => {
+ {{#each props}}
+ {{#if required}}
+ const {{name}}: {{{type}}} = null; // TODO assign real value
+ {{/if}}
+ {{/each}}
+
+ return (
+ <{{pascalCase name}}{{#each props}}{{#if required}} {{name}}={{propsHelper name}}{{/if}}{{/each}} />
+ );
+ });
+ {{else}}
+ .add("default", () => (
+ <{{pascalCase name}} />
+ ));
+ {{/if}}
diff --git a/generators/templates/component-test-tsx.template b/generators/templates/component-test-tsx.template
new file mode 100644
index 0000000..8ed7d4f
--- /dev/null
+++ b/generators/templates/component-test-tsx.template
@@ -0,0 +1,23 @@
+import { render, configure } from "enzyme";
+import "jest";
+import * as React from "react";
+import {{pascalCase name}} from "./{{pascalCase name}}";
+
+// Configure enzyme with react 16 adapter
+const Adapter: any = require("enzyme-adapter-react-16");
+configure({ adapter: new Adapter() });
+
+describe("{{pascalCase name}} component", () => {
+ it("should render correctly", () => {
+ {{#if haveRequiredProps}}
+ {{#each props}}
+ {{#if required}}
+ const {{name}}: {{{type}}} = null; // TODO assign real value
+ {{/if}}
+ {{/each}}
+
+ {{/if}}
+ const wrapper = render(<{{pascalCase name}}{{#each props}}{{#if required}} {{name}}={{propsHelper name}}{{/if}}{{/each}} />);
+ expect(wrapper).toMatchSnapshot();
+ });
+});
diff --git a/generators/templates/component-tsx.template b/generators/templates/component-tsx.template
new file mode 100644
index 0000000..0ec9e13
--- /dev/null
+++ b/generators/templates/component-tsx.template
@@ -0,0 +1,15 @@
+import * as React from "react";
+
+{{#if props}}
+interface {{pascalCase name}}Props extends React.HTMLProps {
+{{#each props}}
+ {{name}}{{#if optional}}?{{/if}}: {{{type}}};
+{{/each}}
+}
+
+{{/if}}
+export default ({{#if props}}props: {{pascalCase name}}Props{{/if}}) => {
+ return (
+ My awesome component
+ );
+};
diff --git a/generators/templates/page-tsx.template b/generators/templates/page-tsx.template
new file mode 100644
index 0000000..f2fad99
--- /dev/null
+++ b/generators/templates/page-tsx.template
@@ -0,0 +1,13 @@
+import * as React from "react";
+import { Header, Icon, Grid } from "semantic-ui-react";
+
+export default () =>
+
+
+
+
+
+
+
+
+ ;
diff --git a/generators/utils.js b/generators/utils.js
new file mode 100644
index 0000000..1601fbc
--- /dev/null
+++ b/generators/utils.js
@@ -0,0 +1,49 @@
+const path = require('path');
+const fs = require('fs');
+const mkdirp = require('mkdirp');
+
+/**
+ * Input validator - ensure input is not empty.
+ *
+ * @param {string} name Input name
+ * @return {boolean|string}
+ */
+const inputRequired = name => {
+ return value => (/.+/.test(value) ? true : `${name} is required`);
+};
+
+/**
+ * Action `add` with custom data
+ *
+ * Same feature as `add` type action but with data argument.
+ * Note: I donβt have implement the "file already exists" security
+ *
+ * @param {any} plop - plop instance
+ * @param {object} action
+ * @param {string} action.path
+ * @param {string} action.templateFile
+ * @param {object} data
+ */
+const addWithCustomData = function (plop, action, data) {
+ const makeDestPath = p => path.resolve(plop.getDestBasePath(), p);
+ const makeTmplPath = p => path.resolve(plop.getPlopfilePath(), p);
+
+ return function () {
+ try {
+ const fileDestPath = makeDestPath(
+ plop.renderString(action.path || '', data)
+ );
+ const template = fs.readFileSync(
+ makeTmplPath(action.templateFile),
+ 'utf-8'
+ );
+ mkdirp.sync(path.dirname(fileDestPath));
+ fs.writeFileSync(fileDestPath, plop.renderString(template, data));
+ return `add ${fileDestPath}`;
+ } catch (error) {
+ return error.message;
+ }
+ };
+};
+
+module.exports = {inputRequired, addWithCustomData};
diff --git a/img/ama-dablam.jpg b/img/ama-dablam.jpg
deleted file mode 100644
index f14c238..0000000
Binary files a/img/ama-dablam.jpg and /dev/null differ
diff --git a/img/avatar/krebernisak.png b/img/avatar/krebernisak.png
deleted file mode 100644
index d1194dd..0000000
Binary files a/img/avatar/krebernisak.png and /dev/null differ
diff --git a/img/avatar/krebernisak.svg b/img/avatar/krebernisak.svg
deleted file mode 100644
index f9791a4..0000000
--- a/img/avatar/krebernisak.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/img/avatar/vbradvica.svg b/img/avatar/vbradvica.svg
deleted file mode 100644
index 3725d7a..0000000
--- a/img/avatar/vbradvica.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/img/ethereum.svg b/img/ethereum.svg
deleted file mode 100644
index df3d581..0000000
--- a/img/ethereum.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/img/favicon.ico b/img/favicon.ico
deleted file mode 100644
index 067545c..0000000
Binary files a/img/favicon.ico and /dev/null differ
diff --git a/img/favicon.png b/img/favicon.png
deleted file mode 100644
index 2294ff3..0000000
Binary files a/img/favicon.png and /dev/null differ
diff --git a/img/featured/ethereum.svg b/img/featured/ethereum.svg
deleted file mode 100644
index 6d0ad34..0000000
--- a/img/featured/ethereum.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/img/featured/kittyland-io.svg b/img/featured/kittyland-io.svg
deleted file mode 100644
index 1e834d2..0000000
--- a/img/featured/kittyland-io.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
\ No newline at end of file
diff --git a/img/featured/kittyland-org.svg b/img/featured/kittyland-org.svg
deleted file mode 100644
index 8433242..0000000
--- a/img/featured/kittyland-org.svg
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
\ No newline at end of file
diff --git a/img/featured/ozone.png b/img/featured/ozone.png
deleted file mode 100644
index 3c13054..0000000
Binary files a/img/featured/ozone.png and /dev/null differ
diff --git a/img/featured/tolar.png b/img/featured/tolar.png
deleted file mode 100644
index 8886f44..0000000
Binary files a/img/featured/tolar.png and /dev/null differ
diff --git a/img/icons/social/github.svg b/img/icons/social/github.svg
deleted file mode 100644
index 491fb39..0000000
--- a/img/icons/social/github.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
\ No newline at end of file
diff --git a/img/icons/social/github_white.png b/img/icons/social/github_white.png
deleted file mode 100755
index b72535e..0000000
Binary files a/img/icons/social/github_white.png and /dev/null differ
diff --git a/img/icons/social/linkedin.svg b/img/icons/social/linkedin.svg
deleted file mode 100644
index 4f46896..0000000
--- a/img/icons/social/linkedin.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
\ No newline at end of file
diff --git a/img/icons/social/linkedin_white.png b/img/icons/social/linkedin_white.png
deleted file mode 100755
index 89de0dd..0000000
Binary files a/img/icons/social/linkedin_white.png and /dev/null differ
diff --git a/img/icons/social/twitter.svg b/img/icons/social/twitter.svg
deleted file mode 100644
index 3267fc9..0000000
--- a/img/icons/social/twitter.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
diff --git a/img/icons/social/twitter_white.png b/img/icons/social/twitter_white.png
deleted file mode 100755
index 0efde87..0000000
Binary files a/img/icons/social/twitter_white.png and /dev/null differ
diff --git a/img/matterhorn-sky-tiny.jpg b/img/matterhorn-sky-tiny.jpg
deleted file mode 100755
index 352139b..0000000
Binary files a/img/matterhorn-sky-tiny.jpg and /dev/null differ
diff --git a/img/matterhorn-sky.jpg b/img/matterhorn-sky.jpg
deleted file mode 100644
index a79beaa..0000000
Binary files a/img/matterhorn-sky.jpg and /dev/null differ
diff --git a/img/matterhorn-sky.webp b/img/matterhorn-sky.webp
deleted file mode 100644
index 9a88a2a..0000000
Binary files a/img/matterhorn-sky.webp and /dev/null differ
diff --git a/img/matterhorn.jpg b/img/matterhorn.jpg
deleted file mode 100644
index 5b9a4b1..0000000
Binary files a/img/matterhorn.jpg and /dev/null differ
diff --git a/img/mountains-animals-set/Fonts.txt b/img/mountains-animals-set/Fonts.txt
deleted file mode 100755
index 5e7d12d..0000000
--- a/img/mountains-animals-set/Fonts.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-FONTS:
-
-
-- QUICKSAND by Andrew Paglinawan: http://www.fontsquirrel.com/fonts/quicksand
-
-- Antonio, Vernon Adams
-: http://www.fontsquirrel.com/fonts/antonio
\ No newline at end of file
diff --git a/img/mountains-animals-set/License free.txt b/img/mountains-animals-set/License free.txt
deleted file mode 100644
index bb46e14..0000000
--- a/img/mountains-animals-set/License free.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-IMPORTANT NOTICE: This license only applies if you downloaded this vector as
-an unsubscribed user. If you are a premium user (ie, you pay a subscription)
-you are bound to the license terms described in the accompanying file
-"License premium.txt".
-
----------------------
-
-You must attribute the image to its author:
-
-In order to use a vector or a part of it, you must attribute it to Freepik,
-so we will be able to continue creating new graphic resources every day.
-
-
-How to attribute it?
-
-For websites:
-
-Please, copy this code on your website to accredit the author:
-Designed by Freepik
-
-For printing:
-
-Paste this text on the final work so the authorship is known.
-- For example, in the acknowledgements chapter of a book:
-"Designed by Freepik"
-
-
-You are free to use this image:
-
-- For both personal and commercial projects and to modify it.
-- In a website or presentation template or application or as part of your design.
-
-You are not allowed to:
-
-- Sub-license, resell or rent it.
-- Include it in any online or offline archive or database.
-
-The full terms of the license are described in section 7 of the Freepik
-terms of use, available online in the following link:
-
- http://www.freepik.com/terms_of_use
-
-The terms described in the above link have precedence over the terms described
-in the present document. In case of disagreement, the Freepik Terms of Use
-will prevail.
diff --git a/img/mountains-animals-set/License premium.txt b/img/mountains-animals-set/License premium.txt
deleted file mode 100644
index bb59e74..0000000
--- a/img/mountains-animals-set/License premium.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-IMPORTANT NOTICE: This license only applies if you downloaded this vector as
-a subscribed (or "premium") user. If you are an unsubscribed user (or "free"
-user) you are bound to the license terms described in the accompanying file
-"License free.txt".
-
----------------------
-
-You can download from your profile in Freepik a personalized license stating
-your right to use this vector as a "premium" user:
-
- https://profile.freepik.com/my_downloads
-
-You are free to use this image:
-
-- For both personal and commercial projects and to modify it.
-- In a website or presentation template or application or as part of your design.
-
-You are not allowed to:
-
-- Sub-license, resell or rent it.
-- Include it in any online or offline archive or database.
-
-The full terms of the license are described in sections 7 and 8 of the Freepik
-terms of use, available online in the following link:
-
- http://www.freepik.com/terms_of_use
-
-The terms described in the above link have precedence over the terms described
-in the present document. In case of disagreement, the Freepik Terms of Use
-will prevail.
diff --git a/img/mountains-animals-set/mountains.ai b/img/mountains-animals-set/mountains.ai
deleted file mode 100755
index 77d217e..0000000
--- a/img/mountains-animals-set/mountains.ai
+++ /dev/null
@@ -1,2514 +0,0 @@
-%PDF-1.5
%βγΟΣ
-1 0 obj
<>/OCGs[7 0 R 38 0 R 64 0 R 65 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<>stream
-
-
-
-
- application/pdf
-
-
- mountains
-
-
-
-
- 2014-06-13T14:23:31+02:00
- 2014-06-13T14:23:31+02:00
- 2014-06-13T00:40:09+02:00
- Adobe Illustrator CS6 (Macintosh)
-
-
-
- 256
- 256
- JPEG
- /9j/4AAQSkZJRgABAgEAZABkAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAZAAAAAEA
AQBkAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A6nk3DdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVVbe2nuJOEKFmpWg8K0r+OCUgOaREnkrrp0nAu7BVSX0pR3FCAW/4bIHIP
sZcCktuq3Xozt6aivJxQ0265Iy2sIreirLbWZnKGXjHzYc6g/Aq8ge3XI8Uq5J4RbZ0w+nO6yBlg
JFRuCVAJ3r77YPF5eaeDmhZoJYeHqCnNQ699jlgkDyYEUp4UOxV2KuxV2KuxV2KuxV2KuxV2KuxV
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
XYq7FXYq7FXYq7FXYq7FXYq//9k=
-
-
-
-
-
- uuid:d5499e11-f407-4c21-9782-d52a208e09f1
- xmp.did:04BF9AEA8D2068118083C98DC9A270B7
- uuid:5D20892493BFDB11914A8590D31508C8
- proof:pdf
-
- xmp.iid:02BF9AEA8D2068118083C98DC9A270B7
- xmp.did:02BF9AEA8D2068118083C98DC9A270B7
- uuid:5D20892493BFDB11914A8590D31508C8
- proof:pdf
-
-
-
-
- saved
- xmp.iid:0180117407206811822ACEF007843B1E
- 2014-05-12T13:14:18+02:00
- Adobe Illustrator CS6 (Macintosh)
- /
-
-
- saved
- xmp.iid:04BF9AEA8D2068118083C98DC9A270B7
- 2014-06-13T00:40:08+02:00
- Adobe Illustrator CS6 (Macintosh)
- /
-
-
-
-
-
- Document
- Print
-
-
- False
- True
- 1
-
- 800.000000
- 800.000000
- Pixels
-
-
-
- Cyan
- Magenta
- Yellow
- Black
-
-
-
-
-
- Grupo de muestras por defecto
- 0
-
-
-
- White
- RGB
- PROCESS
- 255
- 255
- 255
-
-
- Black
- RGB
- PROCESS
- 29
- 29
- 27
-
-
- CMYK Red
- RGB
- PROCESS
- 227
- 6
- 19
-
-
- CMYK Yellow
- RGB
- PROCESS
- 255
- 237
- 0
-
-
- CMYK Green
- RGB
- PROCESS
- 0
- 150
- 64
-
-
- CMYK Cyan
- RGB
- PROCESS
- 0
- 159
- 227
-
-
- CMYK Blue
- RGB
- PROCESS
- 49
- 39
- 131
-
-
- CMYK Magenta
- RGB
- PROCESS
- 230
- 0
- 126
-
-
- C=15 M=100 Y=90 K=10
- RGB
- PROCESS
- 190
- 22
- 34
-
-
- C=0 M=90 Y=85 K=0
- RGB
- PROCESS
- 230
- 51
- 42
-
-
- C=0 M=80 Y=95 K=0
- RGB
- PROCESS
- 233
- 78
- 27
-
-
- C=0 M=50 Y=100 K=0
- RGB
- PROCESS
- 243
- 146
- 0
-
-
- C=0 M=35 Y=85 K=0
- RGB
- PROCESS
- 249
- 178
- 51
-
-
- C=5 M=0 Y=90 K=0
- RGB
- PROCESS
- 252
- 234
- 16
-
-
- C=20 M=0 Y=100 K=0
- RGB
- PROCESS
- 222
- 220
- 0
-
-
- C=50 M=0 Y=100 K=0
- RGB
- PROCESS
- 149
- 193
- 31
-
-
- C=75 M=0 Y=100 K=0
- RGB
- PROCESS
- 58
- 170
- 53
-
-
- C=85 M=10 Y=100 K=10
- RGB
- PROCESS
- 0
- 141
- 54
-
-
- C=90 M=30 Y=95 K=30
- RGB
- PROCESS
- 0
- 102
- 51
-
-
- C=75 M=0 Y=75 K=0
- RGB
- PROCESS
- 47
- 172
- 102
-
-
- C=80 M=10 Y=45 K=0
- RGB
- PROCESS
- 0
- 161
- 154
-
-
- C=70 M=15 Y=0 K=0
- RGB
- PROCESS
- 54
- 169
- 225
-
-
- C=85 M=50 Y=0 K=0
- RGB
- PROCESS
- 29
- 113
- 184
-
-
- C=100 M=95 Y=5 K=0
- RGB
- PROCESS
- 45
- 46
- 131
-
-
- C=100 M=100 Y=25 K=25
- RGB
- PROCESS
- 41
- 35
- 92
-
-
- C=75 M=100 Y=0 K=0
- RGB
- PROCESS
- 102
- 36
- 131
-
-
- C=50 M=100 Y=0 K=0
- RGB
- PROCESS
- 149
- 27
- 129
-
-
- C=35 M=100 Y=35 K=10
- RGB
- PROCESS
- 163
- 25
- 91
-
-
- C=10 M=100 Y=50 K=0
- RGB
- PROCESS
- 214
- 11
- 82
-
-
- C=0 M=95 Y=20 K=0
- RGB
- PROCESS
- 231
- 29
- 115
-
-
- C=25 M=25 Y=40 K=0
- RGB
- PROCESS
- 203
- 187
- 160
-
-
- C=40 M=45 Y=50 K=5
- RGB
- PROCESS
- 164
- 138
- 123
-
-
- C=50 M=50 Y=60 K=25
- RGB
- PROCESS
- 123
- 106
- 88
-
-
- C=55 M=60 Y=65 K=40
- RGB
- PROCESS
- 99
- 78
- 66
-
-
- C=25 M=40 Y=65 K=0
- RGB
- PROCESS
- 202
- 158
- 103
-
-
- C=30 M=50 Y=75 K=10
- RGB
- PROCESS
- 177
- 127
- 74
-
-
- C=35 M=60 Y=80 K=25
- RGB
- PROCESS
- 147
- 96
- 55
-
-
- C=40 M=65 Y=90 K=35
- RGB
- PROCESS
- 125
- 78
- 36
-
-
- C=40 M=70 Y=100 K=50
- RGB
- PROCESS
- 104
- 60
- 17
-
-
- C=50 M=70 Y=80 K=70
- RGB
- PROCESS
- 67
- 41
- 24
-
-
-
-
-
- Grays
- 1
-
-
-
- C=0 M=0 Y=0 K=100
- RGB
- PROCESS
- 29
- 29
- 27
-
-
- C=0 M=0 Y=0 K=90
- RGB
- PROCESS
- 60
- 60
- 59
-
-
- C=0 M=0 Y=0 K=80
- RGB
- PROCESS
- 87
- 87
- 86
-
-
- C=0 M=0 Y=0 K=70
- RGB
- PROCESS
- 112
- 111
- 111
-
-
- C=0 M=0 Y=0 K=60
- RGB
- PROCESS
- 135
- 135
- 135
-
-
- C=0 M=0 Y=0 K=50
- RGB
- PROCESS
- 157
- 157
- 156
-
-
- C=0 M=0 Y=0 K=40
- RGB
- PROCESS
- 178
- 178
- 178
-
-
- C=0 M=0 Y=0 K=30
- RGB
- PROCESS
- 198
- 198
- 198
-
-
- C=0 M=0 Y=0 K=20
- RGB
- PROCESS
- 218
- 218
- 218
-
-
- C=0 M=0 Y=0 K=10
- RGB
- PROCESS
- 237
- 237
- 237
-
-
- C=0 M=0 Y=0 K=5
- RGB
- PROCESS
- 246
- 246
- 246
-
-
-
-
-
- Brights
- 1
-
-
-
- C=0 M=100 Y=100 K=0
- RGB
- PROCESS
- 227
- 6
- 19
-
-
- C=0 M=75 Y=100 K=0
- RGB
- PROCESS
- 234
- 91
- 12
-
-
- C=0 M=10 Y=95 K=0
- RGB
- PROCESS
- 255
- 222
- 0
-
-
- C=85 M=10 Y=100 K=0
- RGB
- PROCESS
- 0
- 152
- 58
-
-
- C=100 M=90 Y=0 K=0
- RGB
- PROCESS
- 39
- 52
- 139
-
-
- C=60 M=90 Y=0 K=0
- RGB
- PROCESS
- 130
- 54
- 140
-
-
-
-
-
-
-
-
- Adobe PDF library 10.01
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-endstream
endobj
3 0 obj
<>
endobj
9 0 obj
<>/Resources<>/Properties<>/XObject<>>>/Thumb 75 0 R/TrimBox[0.0 0.0 800.0 800.0]/Type/Page>>
endobj
67 0 obj
<>stream
-HWΛd·
άχWτάΤsIYd\L =A