├── src ├── components │ ├── forms │ │ ├── index.js │ │ └── ContactForm │ │ │ ├── validationSchema.js │ │ │ └── index.js │ ├── Share │ │ ├── styles.sass │ │ └── index.js │ ├── Content │ │ └── index.js │ ├── Disqus │ │ └── index.js │ ├── Footer │ │ └── index.js │ ├── ProgressiveImageContainer │ │ └── index.js │ ├── Testimonials │ │ └── index.js │ ├── Offerings │ │ └── index.js │ ├── PostCard │ │ └── index.js │ ├── ArticleTemplate │ │ └── index.js │ ├── Pricing │ │ └── index.js │ ├── AboutPageTemplate │ │ └── index.js │ ├── ContactPageTemplate │ │ └── index.js │ ├── SearchBox │ │ └── index.js │ ├── Layout │ │ └── index.js │ ├── PricingPageTemplate │ │ └── index.js │ ├── NavBar │ │ └── index.js │ ├── HomePageTemplate │ │ └── index.js │ └── SEO │ │ └── index.js ├── pages │ ├── contact │ │ ├── success │ │ │ └── index.js │ │ └── index.md │ ├── 404.js │ ├── pricing │ │ └── index.md │ ├── blog │ │ └── lorem-ipsum-dolor-situm.md │ ├── tags │ │ └── index.js │ ├── about │ │ └── index.md │ └── index.md ├── cms │ ├── preview-templates │ │ ├── AboutPagePreview.js │ │ ├── ContactPagePreview.js │ │ ├── ArticlePreview.js │ │ ├── PricingPagePreview.js │ │ └── HomePagePreview.js │ └── cms.js ├── assets │ └── sass │ │ └── styles.sass └── templates │ ├── contact-page.js │ ├── about-page.js │ ├── pricing-page.js │ ├── home-page.js │ ├── tags.js │ ├── blog.js │ └── article-page.js ├── static ├── _headers ├── favicon.ico ├── img │ ├── coffee.png │ ├── tutorials.png │ ├── coffee-gear.png │ ├── meeting-space.png │ └── products-grid3.jpg ├── icons │ ├── icon-192x192.png │ └── icon-512x512.png ├── robots.txt └── admin │ └── config.yml ├── netlify.toml ├── .eslintrc ├── LICENSE ├── .gitignore ├── config.js ├── package.json ├── README.md ├── gatsby-node.js └── gatsby-config.js /src/components/forms/index.js: -------------------------------------------------------------------------------- 1 | export * from './ContactForm' 2 | -------------------------------------------------------------------------------- /static/_headers: -------------------------------------------------------------------------------- 1 | /sw.js # Gatsby's default service worker file path 2 | Cache-Control: no-cache 3 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v4iv/gatsby-starter-business/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /static/img/coffee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v4iv/gatsby-starter-business/HEAD/static/img/coffee.png -------------------------------------------------------------------------------- /static/img/tutorials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v4iv/gatsby-starter-business/HEAD/static/img/tutorials.png -------------------------------------------------------------------------------- /static/img/coffee-gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v4iv/gatsby-starter-business/HEAD/static/img/coffee-gear.png -------------------------------------------------------------------------------- /static/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v4iv/gatsby-starter-business/HEAD/static/icons/icon-192x192.png -------------------------------------------------------------------------------- /static/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v4iv/gatsby-starter-business/HEAD/static/icons/icon-512x512.png -------------------------------------------------------------------------------- /static/img/meeting-space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v4iv/gatsby-starter-business/HEAD/static/img/meeting-space.png -------------------------------------------------------------------------------- /static/img/products-grid3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v4iv/gatsby-starter-business/HEAD/static/img/products-grid3.jpg -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: */admin/ 3 | Disallow: */tags/ 4 | 5 | sitemap: https://gatsby-starter-business.netlify.com/sitemap.xml 6 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "public" 3 | command = "gatsby build" 4 | [build.environment] 5 | YARN_VERSION = "1.22.4" 6 | YARN_FLAGS = "--no-ignore-optional" 7 | RUBY_VERSION = "2.6.2" 8 | NODE_VERSION = "14.12.0" 9 | -------------------------------------------------------------------------------- /src/components/Share/styles.sass: -------------------------------------------------------------------------------- 1 | .social-links 2 | display: flex 3 | flex-direction: row 4 | flex-wrap: wrap 5 | justify-content: center 6 | align-content: center 7 | align-items: center 8 | margin: 15px 0 9 | 10 | .social-links > div 11 | margin: 5px 15px 12 | 13 | .share-count 14 | text-align: center 15 | -------------------------------------------------------------------------------- /src/components/Content/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export const HTMLContent = (props) => { 4 | const { content, className } = props 5 | 6 | return ( 7 |
8 | ) 9 | } 10 | 11 | const Content = ({ content, className }) => ( 12 |
{content}
13 | ) 14 | 15 | export default Content 16 | -------------------------------------------------------------------------------- /src/components/forms/ContactForm/validationSchema.js: -------------------------------------------------------------------------------- 1 | import * as Yup from 'yup' 2 | 3 | const validationSchema = Yup.object().shape({ 4 | name: Yup.string() 5 | .min(2, 'Too Short!') 6 | .max(50, 'Too Long!') 7 | .required('Name is Required!'), 8 | email: Yup.string() 9 | .email('Enter a Valid Email!') 10 | .required('Email is Required!'), 11 | message: Yup.string() 12 | .required('Message is Required!'), 13 | }) 14 | 15 | export default validationSchema 16 | -------------------------------------------------------------------------------- /src/pages/contact/success/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Layout from '../../../components/Layout' 3 | 4 | const SuccessPage = () => { 5 | return ( 6 | 7 |
8 |
9 |

10 | Success 11 |

12 |
13 |
14 |
15 | ) 16 | } 17 | 18 | export default SuccessPage 19 | -------------------------------------------------------------------------------- /src/pages/contact/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | templateKey: 'contact-page' 3 | title: Contact Us 4 | subtitle: We'd Love To Help You, Feel Free To Drop A Mail 5 | meta_title: Contact Us | Gatsby Starter Business 6 | meta_description: >- 7 | Cum sociis natoque penatibus et magnis dis parturient montes, nascetur 8 | ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam 9 | venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis 10 | consectetur purus sit amet fermentum. 11 | --- 12 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "extends": [ 4 | "standard", 5 | "standard-trailing-commas", 6 | "standard-react" 7 | ], 8 | "globals": { 9 | "graphql": true, 10 | "__PATH_PREFIX__": true, 11 | "fetch": true, 12 | "sessionStorage": true, 13 | "localStorage": true 14 | }, 15 | "rules": { 16 | "react/no-unused-prop-types": "off", 17 | "react/prop-types": "off", 18 | "camelcase": "off", 19 | "react/jsx-handler-names": "off", 20 | "react/jsx-closing-bracket-location": "off", 21 | "react/jsx-closing-tag-location": "off" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/components/Disqus/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDisqusComments from 'react-disqus-comments' 3 | 4 | const Disqus = (props) => { 5 | const { title, slug, siteUrl, disqusShortname } = props 6 | 7 | if (!disqusShortname) { 8 | return null 9 | } 10 | 11 | const url = siteUrl + slug 12 | 13 | return
14 | console.log('New Comment Available!:\n', comment.text)} 20 | /> 21 |
22 | } 23 | 24 | export default Disqus 25 | -------------------------------------------------------------------------------- /src/components/Footer/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Footer = (props) => { 4 | const { copyright } = props 5 | 6 | return ( 7 | 17 | ) 18 | } 19 | 20 | export default Footer 21 | -------------------------------------------------------------------------------- /src/cms/preview-templates/AboutPagePreview.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import AboutPageTemplate from '../../components/AboutPageTemplate' 4 | 5 | const AboutPagePreview = ({ entry, widgetFor }) => ( 6 | 12 | ) 13 | 14 | AboutPagePreview.propTypes = { 15 | entry: PropTypes.shape({ 16 | getIn: PropTypes.func, 17 | }), 18 | widgetFor: PropTypes.func, 19 | } 20 | 21 | export default AboutPagePreview 22 | -------------------------------------------------------------------------------- /src/components/ProgressiveImageContainer/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import _ from 'lodash' 3 | import Img from 'gatsby-image' 4 | 5 | const ProgressiveImageContainer = ({ image, alt, className }) => (typeof image === 'string') 6 | ? {alt} 11 | : (_.get(image, ['childImageSharp', 'fluid'])) 12 | ? {alt} 17 | : {alt} 21 | 22 | export default ProgressiveImageContainer 23 | -------------------------------------------------------------------------------- /src/cms/preview-templates/ContactPagePreview.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import ContactPageTemplate from '../../components/ContactPageTemplate' 4 | 5 | const ContactPagePreview = ({ entry, getAsset }) => { 6 | return ( 7 | 13 | ) 14 | } 15 | 16 | ContactPagePreview.propTypes = { 17 | entry: PropTypes.shape({ 18 | getIn: PropTypes.func, 19 | }), 20 | getAsset: PropTypes.func, 21 | } 22 | 23 | export default ContactPagePreview 24 | -------------------------------------------------------------------------------- /src/components/Testimonials/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | 4 | const Testimonials = (props) => { 5 | const { testimonials } = props 6 | 7 | return ( 8 |
9 | {testimonials.map((testimonial, idx) => ( 10 |
11 |
12 | {testimonial.quote} 13 |
14 | – {testimonial.author} 15 |
16 |
17 | ))} 18 |
19 | ) 20 | } 21 | Testimonials.propTypes = { 22 | testimonials: PropTypes.arrayOf( 23 | PropTypes.shape({ 24 | quote: PropTypes.string, 25 | author: PropTypes.string, 26 | }), 27 | ), 28 | } 29 | 30 | export default Testimonials 31 | -------------------------------------------------------------------------------- /src/assets/sass/styles.sass: -------------------------------------------------------------------------------- 1 | $primary: #00d1b2 2 | 3 | $primary-invert: #ffffff 4 | 5 | html, 6 | body, 7 | #___gatsby, 8 | #gatsby-focus-wrapper, 9 | #layout-wrapper 10 | height: 100% 11 | 12 | #layout-wrapper 13 | width: 100% 14 | display: flex 15 | flex-direction: column 16 | 17 | #content-wrapper 18 | flex: 1 19 | 20 | nav 21 | border-bottom: lightgray solid 0.1vmin 22 | 23 | .content .taglist 24 | list-style: none 25 | margin-bottom: 0 26 | margin-left: 0 27 | margin-right: 1.5rem 28 | margin-top: 1.5rem 29 | display: flex 30 | flex-wrap: wrap 31 | justify-content: left 32 | align-items: center 33 | li 34 | padding: 0 2rem 1rem 0 35 | margin-bottom: 1.5rem 36 | margin-top: 0 37 | 38 | .margin-top-0 39 | margin-top: 0 !important 40 | 41 | @import "~bulma" 42 | -------------------------------------------------------------------------------- /src/cms/cms.js: -------------------------------------------------------------------------------- 1 | import CMS from 'netlify-cms-app' 2 | import '../assets/sass/styles.sass' 3 | import HomePagePreview from './preview-templates/HomePagePreview' 4 | import AboutPagePreview from './preview-templates/AboutPagePreview' 5 | import ArticlePreview from './preview-templates/ArticlePreview' 6 | import PricingPagePreview from './preview-templates/PricingPagePreview' 7 | import ContactPagePreview from './preview-templates/ContactPagePreview' 8 | 9 | CMS.init({ 10 | config: { 11 | backend: { 12 | name: 'git-gateway', 13 | }, 14 | }, 15 | }) 16 | CMS.registerPreviewStyle('/styles.css') 17 | CMS.registerPreviewTemplate('home', HomePagePreview) 18 | CMS.registerPreviewTemplate('about', AboutPagePreview) 19 | CMS.registerPreviewTemplate('pricing', PricingPagePreview) 20 | CMS.registerPreviewTemplate('contact', ContactPagePreview) 21 | CMS.registerPreviewTemplate('blog', ArticlePreview) 22 | -------------------------------------------------------------------------------- /src/pages/404.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Layout from '../components/Layout' 3 | 4 | const NotFoundPage = () => ( 5 | 6 |
7 |
8 |
9 |
10 |
11 |
12 |

13 | 404: NOT FOUND 14 |

15 |

16 | You just hit a route that doesn't exist... the 17 | sadness. 18 |

19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | ) 27 | 28 | export default NotFoundPage 29 | -------------------------------------------------------------------------------- /src/cms/preview-templates/ArticlePreview.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import ArticleTemplate from '../../components/ArticleTemplate' 4 | 5 | const ArticlePreview = ({ entry, widgetFor }) => { 6 | return ( 7 |
8 |
9 |
10 | 18 |
19 |
20 |
21 | ) 22 | } 23 | 24 | ArticlePreview.propTypes = { 25 | entry: PropTypes.shape({ 26 | getIn: PropTypes.func, 27 | }), 28 | widgetFor: PropTypes.func, 29 | } 30 | 31 | export default ArticlePreview 32 | -------------------------------------------------------------------------------- /src/cms/preview-templates/PricingPagePreview.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import PricingPageTemplate from '../../components/PricingPageTemplate' 4 | 5 | const PricingPagePreivew = ({ entry, getAsset }) => { 6 | const entryPricingPlans = entry.getIn(['data', 'pricing', 'plans']) 7 | const pricingPlans = entryPricingPlans ? entryPricingPlans.toJS() : [] 8 | 9 | return ( 10 | 20 | ) 21 | } 22 | 23 | PricingPagePreivew.propTypes = { 24 | entry: PropTypes.shape({ 25 | getIn: PropTypes.func, 26 | }), 27 | getAsset: PropTypes.func, 28 | } 29 | 30 | export default PricingPagePreivew 31 | -------------------------------------------------------------------------------- /src/components/Offerings/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import ProgressiveImageContainer from '../ProgressiveImageContainer' 4 | 5 | const Offerings = (props) => { 6 | const { gridItems } = props 7 | return ( 8 |
9 | {gridItems.map((item, idx) => ( 10 |
11 |
12 |

13 | 17 |

18 |

{item.text}

19 |
20 |
21 | ))} 22 |
23 | ) 24 | } 25 | Offerings.propTypes = { 26 | gridItems: PropTypes.arrayOf( 27 | PropTypes.shape({ 28 | image: PropTypes.string, 29 | text: PropTypes.string, 30 | }), 31 | ), 32 | } 33 | 34 | export default Offerings 35 | -------------------------------------------------------------------------------- /src/cms/preview-templates/HomePagePreview.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import HomePageTemplate from '../../components/HomePageTemplate' 4 | 5 | const HomePagePreview = ({ entry, getAsset }) => { 6 | const entryBlurbs = entry.getIn(['data', 'offerings', 'blurbs']) 7 | const blurbs = entryBlurbs ? entryBlurbs.toJS() : [] 8 | 9 | const entryTestimonials = entry.getIn(['data', 'testimonials']) 10 | const testimonials = entryTestimonials ? entryTestimonials.toJS() : [] 11 | 12 | return ( 13 | 22 | ) 23 | } 24 | 25 | HomePagePreview.propTypes = { 26 | entry: PropTypes.shape({ 27 | getIn: PropTypes.func, 28 | }), 29 | getAsset: PropTypes.func, 30 | } 31 | 32 | export default HomePagePreview 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-20 Vaibhav Sharma 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/components/PostCard/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Link } from 'gatsby' 3 | 4 | const PostCard = (props) => { 5 | const { posts } = props 6 | 7 | return ( 8 |
9 | {posts 10 | .filter(post => post.node.frontmatter.templateKey === 'article-page') 11 | .map(({ node: post }) => ( 12 |
17 |

18 | 19 | {post.frontmatter.title} 20 | 21 | 22 | {post.frontmatter.date} 23 |

24 |

25 | {post.excerpt} 26 |
27 |
28 | 29 | Keep Reading → 30 | 31 |

32 |
33 | ))} 34 |
35 | ) 36 | } 37 | 38 | export default PostCard 39 | -------------------------------------------------------------------------------- /src/templates/contact-page.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { graphql } from 'gatsby' 4 | import ContactPageTemplate from '../components/ContactPageTemplate' 5 | import Layout from '../components/Layout' 6 | 7 | const ContactPage = (props) => { 8 | const { data: { markdownRemark: { frontmatter: { title, subtitle, meta_title, meta_description } } } } = props 9 | 10 | return ( 11 | 12 | 18 | 19 | ) 20 | } 21 | 22 | ContactPage.propTypes = { 23 | data: PropTypes.shape({ 24 | markdownRemark: PropTypes.shape({ 25 | frontmatter: PropTypes.object, 26 | }), 27 | }), 28 | } 29 | 30 | export default ContactPage 31 | 32 | export const contactPageQuery = graphql` 33 | query ContactPage($id: String!) { 34 | markdownRemark(id: { eq: $id }) { 35 | frontmatter { 36 | title 37 | subtitle 38 | meta_title 39 | meta_description 40 | heading 41 | } 42 | } 43 | } 44 | ` 45 | -------------------------------------------------------------------------------- /src/components/ArticleTemplate/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Content from '../Content' 3 | import { kebabCase } from 'lodash' 4 | import { Link } from 'gatsby' 5 | import ProgressiveImageContainer from '../ProgressiveImageContainer' 6 | 7 | const ArticleTemplate = (props) => { 8 | const { content, contentComponent, cover, tags, title } = props 9 | const PostContent = contentComponent || Content 10 | 11 | return ( 12 |
13 |

14 | {title} 15 |

16 | 20 | 21 |
22 |

Tags

23 |
    24 | {(tags && tags.length) 25 | ? tags.map(tag => ( 26 |
  • 27 | {tag} 28 |
  • 29 | )) 30 | : null} 31 |
32 |
33 |
34 |
35 | ) 36 | } 37 | 38 | export default ArticleTemplate 39 | -------------------------------------------------------------------------------- /src/templates/about-page.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import Helmet from 'react-helmet' 4 | import { graphql } from 'gatsby' 5 | import { HTMLContent } from '../components/Content' 6 | import AboutPageTemplate from '../components/AboutPageTemplate' 7 | import Layout from '../components/Layout' 8 | 9 | const AboutPage = (props) => { 10 | const { data: { markdownRemark: post } } = props 11 | 12 | return ( 13 | 14 | 15 | {post.frontmatter.meta_title} 16 | 17 | 18 | 23 | 24 | ) 25 | } 26 | 27 | AboutPage.propTypes = { 28 | data: PropTypes.object.isRequired, 29 | } 30 | 31 | export default AboutPage 32 | 33 | export const aboutPageQuery = graphql` 34 | query AboutPage($id: String!) { 35 | markdownRemark(id: { eq: $id }) { 36 | html 37 | frontmatter { 38 | title 39 | meta_title 40 | meta_description 41 | } 42 | } 43 | } 44 | ` 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # dotenv environment variables file 55 | .env 56 | 57 | # gatsby files 58 | .cache/ 59 | public 60 | 61 | # Mac files 62 | .DS_Store 63 | 64 | # Yarn 65 | yarn-error.log 66 | .pnp/ 67 | .pnp.js 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | #IDE 72 | .idea/ 73 | .vscode/ -------------------------------------------------------------------------------- /src/templates/pricing-page.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { graphql } from 'gatsby' 4 | import PricingPageTemplate from '../components/PricingPageTemplate' 5 | import Layout from '../components/Layout' 6 | 7 | const PricingPage = (props) => { 8 | const { data: { markdownRemark: { frontmatter: { title, meta_title, meta_description, pricing } } } } = props 9 | 10 | return ( 11 | 12 | 18 | 19 | ) 20 | } 21 | 22 | PricingPage.propTypes = { 23 | data: PropTypes.shape({ 24 | markdownRemark: PropTypes.shape({ 25 | frontmatter: PropTypes.object, 26 | }), 27 | }), 28 | } 29 | 30 | export default PricingPage 31 | 32 | export const pricingPageQuery = graphql` 33 | query PricingPage($id: String!) { 34 | markdownRemark(id: { eq: $id }) { 35 | frontmatter { 36 | title 37 | meta_title 38 | meta_description 39 | pricing { 40 | heading 41 | description 42 | plans { 43 | description 44 | items 45 | plan 46 | price 47 | } 48 | } 49 | } 50 | } 51 | } 52 | ` 53 | -------------------------------------------------------------------------------- /src/components/Pricing/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | 4 | const Pricing = (props) => { 5 | const { data } = props 6 | 7 | return ( 8 |
9 | {data.map(price => ( 10 |
11 |
12 |

13 | {price.plan} 14 |

15 |

16 | ${price.price} 17 |

18 |

{price.description}

19 |
    20 | {price.items.map(item => ( 21 |
  • 22 | {item} 23 |
  • 24 | ))} 25 |
26 |
27 |
28 | ))} 29 |
30 | ) 31 | } 32 | 33 | Pricing.propTypes = { 34 | data: PropTypes.arrayOf( 35 | PropTypes.shape({ 36 | plan: PropTypes.string, 37 | price: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), 38 | description: PropTypes.string, 39 | items: PropTypes.array, 40 | }), 41 | ), 42 | } 43 | 44 | export default Pricing 45 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | siteTitle: 'Gatsby Starter Business', // Site title. 3 | siteTitleAlt: 'Business', // Alternative site title for SEO. 4 | siteLogo: '/icons/icon-512x512.png', // Logo used for SEO and manifest. 5 | siteUrl: 'https://gatsby-starter-business.netlify.com', // Domain of your website without pathPrefix. 6 | pathPrefix: '', // Prefixes all links. For cases when deployed to example.github.io/gatsby-starter-business/. 7 | siteDescription: 'Leverage Gatsby Business Starter for your Business.', // Website description used for RSS feeds/meta description tag. 8 | siteRss: '/rss.xml', 9 | siteFBAppID: '', // FB Application ID for using app insights 10 | googleTagManagerID: '', // GTM tracking ID. 11 | disqusShortname: 'gatsby-business-starter', // Disqus shortname. 12 | userName: 'Vaibhav Sharma', 13 | userTwitter: 'vaibhaved', 14 | userLocation: 'Delhi NCR, India', 15 | userDescription: '', 16 | copyright: 'Copyright © Gatsby Starter Business 2018-2019. All Rights Reserved.', // Copyright string for the footer of the website and RSS feed. 17 | themeColor: '#00d1b2', // Used for setting manifest and progress theme colors. 18 | backgroundColor: '#ffffff', // Used for setting manifest background color. 19 | cookieConsent: 'This website uses cookies which are used to collect anonymous information to improve your browsing experience and for analytics and metrics.', // @TODO Add GDPR Cookie Consent 20 | } 21 | -------------------------------------------------------------------------------- /src/components/AboutPageTemplate/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Content from '../Content' 3 | import PropTypes from 'prop-types' 4 | 5 | const AboutPageTemplate = (props) => { 6 | const { title, content, contentComponent } = props 7 | const PageContent = contentComponent || Content 8 | 9 | return ( 10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |

18 | {title} 19 |

20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | 32 |
33 |
34 |
35 |
36 |
37 |
38 | ) 39 | } 40 | 41 | AboutPageTemplate.propTypes = { 42 | title: PropTypes.string.isRequired, 43 | content: PropTypes.string, 44 | contentComponent: PropTypes.func, 45 | } 46 | 47 | export default AboutPageTemplate 48 | -------------------------------------------------------------------------------- /src/components/ContactPageTemplate/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Helmet from 'react-helmet' 3 | import PropTypes from 'prop-types' 4 | import { ContactForm } from '../forms' 5 | 6 | const ContactPageTemplate = (props) => { 7 | const { title, subtitle, meta_title, meta_description } = props 8 | 9 | return ( 10 |
11 | 12 | {meta_title} 13 | 14 | 15 |
16 |
17 |
18 |
19 |
20 |
21 |

22 | {title} 23 |

24 |

25 | {subtitle} 26 |

27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | 36 |
37 |
38 |
39 | ) 40 | } 41 | 42 | ContactPageTemplate.propTypes = { 43 | title: PropTypes.string, 44 | subtitle: PropTypes.string, 45 | meta_title: PropTypes.string, 46 | meta_description: PropTypes.string, 47 | } 48 | 49 | export default ContactPageTemplate 50 | -------------------------------------------------------------------------------- /src/components/SearchBox/index.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | import { Link } from 'gatsby' 3 | import { Index } from 'elasticlunr' 4 | 5 | const SearchBox = props => { 6 | let index = null 7 | 8 | const { searchIndex } = props 9 | 10 | const [query, setQuery] = useState('') 11 | const [results, setResults] = useState([]) 12 | const [active, setActive] = useState(false) 13 | 14 | const search = evt => { 15 | const query = evt.target.value 16 | 17 | index = index || Index.load(searchIndex) 18 | 19 | setQuery(query) 20 | setActive(!!query) 21 | setResults( 22 | index 23 | .search(query, { expand: true }) // Accept partial matches 24 | // Map over each ID and return the full document 25 | .map(({ ref }) => index.documentStore.getDoc(ref)), 26 | ) 27 | } 28 | 29 | return ( 30 |
31 | 38 | 39 |
40 | {active && results.length 41 | ? results 42 | .filter(page => page.templateKey === 'article-page') 43 | .map(page => ( 44 | 45 | {page.title} 46 | 47 | )) 48 | : null} 49 |
50 |
51 | ) 52 | } 53 | 54 | export default SearchBox 55 | -------------------------------------------------------------------------------- /src/pages/pricing/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | templateKey: pricing-page 3 | title: Pricing 4 | meta_title: Pricing | Gatsby Starter Business 5 | meta_description: >- 6 | Cum sociis natoque penatibus et magnis dis parturient montes, nascetur 7 | ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam 8 | venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis 9 | consectetur purus sit amet fermentum. 10 | pricing: 11 | description: >- 12 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec porta justo justo, 13 | non semper odio cursus in. Curabitur ligula tortor, tristique non odio nec, imperdiet 14 | mattis leo. Vivamus aliquam rhoncus tortor vitae convallis. Aliquam non dui nibh. Nam 15 | a velit at enim sagittis pellentesque. 16 | heading: Monthly subscriptions 17 | plans: 18 | - description: Nulla faucibus, leo a condimentum aliquam, libero leo vehicula arcu 19 | items: 20 | - Lorem ipsum dolor sit amet 21 | - consectetur adipiscing elit 22 | - Nunc finibus sem a sem ultrices 23 | plan: Pro 24 | price: '50' 25 | - description: Mauris vitae dolor eu mauris malesuada cursus. 26 | items: 27 | - eget sagittis magna tempor 28 | - Quisque pulvinar lorem molestie 29 | - Proin at sagittis ex 30 | plan: Enterprise 31 | price: '80' 32 | - description: Praesent elit lectus, iaculis vel odio vitae, bibendum auctor lacus. 33 | items: 34 | - Pellentesque luctus neque id mauris accumsan 35 | - nec imperdiet justo eleifend 36 | - Sed eget ornare orci 37 | plan: Custom 38 | price: '??' 39 | --- 40 | 41 | -------------------------------------------------------------------------------- /src/templates/home-page.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { graphql } from 'gatsby' 4 | import HomePageTemplate from '../components/HomePageTemplate' 5 | import Layout from '../components/Layout' 6 | 7 | const HomePage = (props) => { 8 | const { data: { markdownRemark: { frontmatter: { title, meta_title, meta_description, heading, description, offerings, testimonials } } } } = props 9 | 10 | return ( 11 | 12 | 21 | 22 | ) 23 | } 24 | 25 | HomePage.propTypes = { 26 | data: PropTypes.shape({ 27 | markdownRemark: PropTypes.shape({ 28 | frontmatter: PropTypes.object, 29 | }), 30 | }), 31 | } 32 | 33 | export default HomePage 34 | 35 | export const pageQuery = graphql` 36 | query IndexPage($id: String!) { 37 | markdownRemark(id: { eq: $id }) { 38 | frontmatter { 39 | title 40 | meta_title 41 | meta_description 42 | heading 43 | description 44 | offerings { 45 | blurbs { 46 | image { 47 | childImageSharp { 48 | fluid(maxWidth: 500, quality: 72) { 49 | ...GatsbyImageSharpFluid 50 | } 51 | } 52 | publicURL 53 | } 54 | text 55 | } 56 | } 57 | testimonials { 58 | author 59 | quote 60 | } 61 | } 62 | } 63 | } 64 | ` 65 | -------------------------------------------------------------------------------- /src/components/Share/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | FacebookShareButton, 4 | LinkedinShareButton, 5 | TwitterShareButton, 6 | TelegramShareButton, 7 | RedditShareButton, 8 | FacebookShareCount, 9 | RedditShareCount, 10 | FacebookIcon, 11 | TwitterIcon, 12 | TelegramIcon, 13 | LinkedinIcon, 14 | RedditIcon, 15 | } from 'react-share' 16 | import './styles.sass' 17 | 18 | const Share = (props) => { 19 | const { title, slug, excerpt, mobile, siteUrl, pathPrefix } = props 20 | const realPrefix = pathPrefix === '/' ? '' : pathPrefix 21 | const url = siteUrl + realPrefix + slug 22 | 23 | const iconSize = mobile ? 36 : 48 24 | const filter = count => (count > 0 ? count : '') 25 | 26 | return ( 27 |
28 | 29 | 30 | 31 | {count =>
{filter(count)}
} 32 |
33 |
34 | 35 | 36 | 37 | 38 | 39 | 40 | {count =>
{filter(count)}
} 41 |
42 |
43 | 48 | 49 | 50 | 51 | 52 | 53 |
54 | ) 55 | } 56 | 57 | export default Share 58 | -------------------------------------------------------------------------------- /src/components/Layout/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Helmet from 'react-helmet' 3 | import '../../assets/sass/styles.sass' 4 | import config from '../../../config' 5 | import NavBar from '../NavBar' 6 | import Footer from '../Footer' 7 | 8 | const Layout = (props) => { 9 | return ( 10 | <> 11 | 60 | 61 | <>{props.children} 62 |