[
  {
    "path": ".commitlintrc.js",
    "content": "module.exports = {\n  extends: ['@commitlint/config-conventional'],\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [pauliescanlon]\nko_fi: pauliescanlon\n"
  },
  {
    "path": ".gitignore",
    "content": "wip-readme.md\ndemo/src/pages/source-days.mdx\ndemo/src/pages/source-list.mdx\ndemo/src/pages/source-months.mdx\ndemo/src/pages/source-tags.mdx\ndemo/src/pages/source-words.mdx\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# Typescript v1 declaration files\ntypings/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# dotenv environment variables file\n.env\n\n# gatsby files\n.cache/\npublic\n\n# Mac files\n.DS_Store\n\n# Yarn\nyarn-error.log\n.pnp/\n.pnp.js\n# Yarn Integrity file\n.yarn-integrity\n\n.netlify/\n"
  },
  {
    "path": ".husky/commit-msg",
    "content": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx commitlint --edit \n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpm run prettier\n"
  },
  {
    "path": ".prettierignore",
    "content": "demo/.cache\ndemo/public"
  },
  {
    "path": ".prettierrc.js",
    "content": "module.exports = {\n  semi: false,\n  trailingComma: 'all',\n  singleQuote: true,\n  printWidth: 120,\n  tabWidth: 2,\n  proseWrap: 'always',\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/README.md",
    "content": "<a href=\"https://gatsbythemeterminal.gatsbyjs.io/\" target=\"_blank\">\n<img src=\"https://gatsbythemeterminal.gatsbyjs.io/images/terminal-open-graph-image.jpg\" alt=\"gatsby-theme-termninal main image\" />\n</a>\n\n## gatsby-theme-terminal\n\nGatsby Theme Terminal aims to be a **zero component theme**. It provides _data_ components to aid in the abstraction of\npresentational and data layers which together provide the most flexibility\n\nThe theme handles the data but how it's displayed is up to you!\n\nYou can create any page layout or component combination you like using your own components or components provided by\n[theme-ui/components](https://theme-ui.com/components)\n\n## 👀 Preview\n\n- [Live Demo](https://gatsbythemeterminal.gatsbyjs.io/)\n\n## 🚀 Getting started\n\nTo help you get started you can either clone the starter\n[gatsby-starter-terminal](https://github.com/PaulieScanlon/gatsby-starter-terminal) or read the below.\n\n### Install\n\n```\nnpm install @pauliescanlon/gatsby-theme-terminal\n```\n\n### Install Peer Dependencies\n\n```\nnpm install @mdx-js/mdx @mdx-js/react gatsby gatsby-plugin-mdx gatsby-source-filesystem react react-dom\n```\n\n## Setup\n\n### gatsby-config.js\n\nAdd the `siteMetaData` and `@pauliescanlon/gatsby-theme-terminal` to your `gatsby-config.js`\n\n```\n// gatsby-config.js\nmodule.exports = {\n  siteMetadata: {\n    name: \"Your blog title\",\n    description: \"I like tech\",\n    keywords: [\"tech\", \"blog\", \"boop\"],\n    siteUrl: 'https://gatsby-theme-terminal.netlify.com',\n    siteImage: 'name-of-open-graph-image.jpg', // pop an image in the static folder to use it as the og:image,\n    profileImage: 'name-of-profile-image.jpg'\n    lang: `eng`,\n    config: {\n      sidebarWidth: 240 // optional,\n    },\n  },\n  plugins: ['@pauliescanlon/gatsby-theme-terminal']\n}\n```\n\n### directory structure\n\nTo add pages create `.mdx` files in the `src/pages` directory. You need at least one file called `index.mdx` located at\n`src/pages` or you'll see a GraphQL error.\n\n<!-- prettier-ignore -->\n```\n|-- src\n    |-- pages\n        |-- index.mdx\n        |-- about.mdx\n        |-- contact.mdx \n\n```\n\n### frontmatter setup\n\n#### Pages\n\nPages must include `navigationLabel` in the `frontmatter`\n\n```\n// src/pages/about.mdx\n---\nnavigationLabel: About\n---\n\n# About\n\nThis is about page\n\n```\n\n#### Theme options\n\nAdditional `.mdx` can be sourced from _anywhere_ outside the `pages` directory but you need to tell the theme where to\nsource these files from.\n\nUse the `source` option in `gatsby-config.js`\n\n```\n// gatsby-config.js\n...\n  plugins: [\n    {\n      resolve: `@pauliescanlon/gatsby-theme-terminal`,\n      options: {\n        source: [\n          {\n            name: \"posts\",\n            dir: \"posts\",\n          },\n          {\n            name: \"projects\",\n            dir: \"projects\",\n          },\n        ] // can be an object or array of objects\n\n      },\n    },\n  ],\n}\n```\n\nThen create the relevant files and directories\n\n<!-- prettier-ignore -->\n```\n|-- src\n    |-- pages\n    ...\n    |-- posts \n      |--2020\n        |--02\n          |-- some-post.mdx\n          |-- featuredImage: markus-spiske-466ENaLuhLY-unsplash.jpg\n          |-- markus-spiske-FXFz-sW0uwo-unsplash.jpg\n    |-- projects\n      |-- some-project.mdx  \n\n```\n\nAny file that is _not_ sourced from `pages` can contain any of the following `frontmatter` but a `title` is required,\nthis is how the theme distinguishes between pages and other `.mdx` files\n\n<!-- prettier-ignore -->\n```\n// src/posts/2020/02/some-post.mdx\n---\ntitle: Some Post\ntags: [\"JavaScript\", \"React\", \"GatsbyJs\", \"HTML\", \"CSS\", \"theme-ui\"]\ndate: 2020-01-01\ndateModified: 20-20-2020\nauthor: Paul Scanlon\nstatus: draft // => means it won't be rendered\nisPrivate: // => it will be rendered but you can use this prop as a filter\nurl: \"https://example.com\"  // => could be an external url\nmisc: \"Ahoy\" // => use how you wish\npinned: false // => Could be used as a filter for pinned posts\nfeaturedImage: markus-spiske-466ENaLuhLY-unsplash.jpg\nfeaturedImageUrl: https://via.placeholder.com/936x528\nembeddedImages:\n  - markus-spiske-FXFz-sW0uwo-unsplash.jpg\nembeddedImageUrls:\n  - https://via.placeholder.com/468x264\n---\n```\n\n### Embedded Images\n\nBy using the The `<GatsbyImage />` component from `gatsby-plugin-image` you can pass the image data queried by GraphQL\nand pass it on via the `image` prop\n\nThe `gatsbyImageData`, data is available via `props.embedded.image(n)`\n\n```\n<GatsbyImage image={props.embedded.image1} />\n```\n\nYou can also use the Theme UI `<Image />` component by passing it a `src`\n\n```\n<Image src={props.embedded.image1.gatsbyImageData.images.fallback.src} />\n```\n\n`image1` in this example would be `markus-spiske-FXFz-sW0uwo-unsplash.jpg`\n\nEmbeddedImages can also be sourced from a remote url, in this case use the `<Image />` component and pass it the same\nprops\n\n```\n<Image src={props.embedded.image2.gatsbyImageData.images.fallback.src} />\n```\n\n### markdown\n\nThe theme supports the complete markdown spec and you can see how to use markdown in the\n[demo](https://gatsbythemeterminal.gatsbyjs.io/markdown/)\n\n### theme-ui/components\n\nThe theme supports _all_ the components provided by [theme-ui/components](https://theme-ui.com/components) and you can\nsee in the [demo](https://gatsbythemeterminal.gatsbyjs.io/theme-ui-components/) how they are used.\n\n### gatsby-theme-terminal/components\n\nThe theme also comes with it's own components _but_... These are purely to provide access to the source nodes. What you\nchoose to render is completely up to you!\n\nFor example to display a list of _all_ files sourced from the `source` theme option you _could_ do something like this.\nThis component can be used in ANY `.mdx` file 😎\n\n```javascript\n<SourceList>\n  {(source) => (\n    <ul>\n      {source.map((edge, index) => {\n        const {\n          frontmatter: { title },\n        } = edge.node\n        return <li key={index}>{title}</li>\n      })}\n    </ul>\n  )}\n</SourceList>\n```\n\nYou can see more about how to use the theme components in the\n[demo](https://gatsbythemeterminal.gatsbyjs.io/components/)\n\n### Component Shadowing\n\nThere is very little to shadow because almost everything is exposed by the components but you might want to add your own\nlogo.\n\nTo do this create the following directories `@pauliescanlon/gatsby-theme-terminal/components/Logo` in the `src`\ndirectory of your project and then create a `Logo.js` file. You can do anything you like in here.\n\n```\n|-- src\n    |-- @pauliescanlon\n      |-- gatsby-theme-terminal\n        |-- components\n          |-- Logo\n            |-- Logo.js\n```\n\nIf you would like to customize any part of the theme you can do so by shadowing the theme file.\n\nTo do this create the following directory `src/gatsby-plugin-theme-ui` and then create an `index.js`\n\n```javascript\n// src/gatsby-plugin-theme-ui/index.js\n\nimport baseTheme from '@pauliescanlon/gatsby-theme-terminal/src/gatsby-plugin-theme-ui'\n\nexport default {\n  ...baseTheme,\n  colors: {\n    ...baseTheme.colors,\n    primary: '#FF4081',\n    secondary: '#03A9F4',\n    success: '#FFEB3B',\n    background: '#232323',\n    surface: '#393939',\n  },\n}\n```\n\n### favicon\n\nfavicon(s) need to be saved in `static/images` and named `favicon-16x16.png` and `favicon-32x32.png` along with an\n`.icon` file called `favicon.ico`\n\nIf you're using **gatsby-theme-terminal** in your project i'd love to hear from you\n[@pauliescanlon](https://twitter.com/PaulieScanlon)\n\n[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P31B7G8)\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/gatsby-browser.js",
    "content": "const React = require('react')\nconst { PageElement } = require('./src/components/page-element')\n\nconst anchorScroll = (location) => {\n  const anchor = document.querySelectorAll(`a[href=\"${location.hash}\"]`)[0]\n  if (location && location.hash && anchor) {\n    const item = document.querySelectorAll(`a[href=\"${location.hash}\"]`)[0].offsetTop\n    const mainNavHeight = document.querySelector(`header`).offsetHeight\n\n    setTimeout(() => {\n      window.scrollTo({\n        top: item - mainNavHeight,\n        behavior: 'smooth',\n      })\n    }, 50)\n  }\n}\n\nexports.onRouteUpdate = ({ location }) => {\n  anchorScroll(location)\n  return true\n}\n\nexports.wrapPageElement = ({ element }) => {\n  return <PageElement>{element}</PageElement>\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/gatsby-config.js",
    "content": "const path = require('path')\n\nmodule.exports = (themeOptions) => {\n  const { source } = themeOptions\n\n  let filesystemSources = []\n\n  if (source) {\n    const sourceFilesystemOption = (item) => {\n      if (source) {\n        return {\n          resolve: `gatsby-source-filesystem`,\n          options: {\n            name: `${item.name}`,\n            path: path.resolve(`src/${item.dir}`),\n          },\n        }\n      }\n    }\n\n    if (Array.isArray(source)) {\n      for (let item of source) {\n        filesystemSources.push(sourceFilesystemOption(item))\n      }\n    } else {\n      filesystemSources.push(sourceFilesystemOption(source))\n    }\n  }\n\n  return {\n    siteMetadata: {\n      name: ``,\n      description: ``,\n      keywords: [],\n      siteUrl: ``,\n      siteImage: ``,\n      profileImage: ``,\n      lang: ``,\n      config: {\n        sidebarWidth: 260,\n      },\n    },\n    plugins: [\n      `gatsby-plugin-react-helmet`,\n      `gatsby-plugin-image`,\n      `gatsby-transformer-sharp`,\n      {\n        resolve: `gatsby-plugin-sharp`,\n        options: {\n          defaults: {\n            quality: 70,\n            formats: ['auto', 'webp', 'avif'],\n            placeholder: 'blurred',\n          },\n        },\n      },\n      `gatsby-plugin-theme-ui`,\n      {\n        resolve: `gatsby-plugin-mdx`,\n        options: {\n          defaultLayouts: {\n            default: require.resolve(`./src/layouts/page-layout.js`),\n          },\n        },\n      },\n\n      // Demo pages\n      {\n        resolve: 'gatsby-source-filesystem',\n        options: {\n          name: 'pages',\n          path: path.resolve(`src/pages`),\n        },\n      },\n      // Demo 'src/whatever' the user has defined in options.source\n      ...filesystemSources,\n    ],\n  }\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/gatsby-node.js",
    "content": "const { createFilePath, createRemoteFileNode } = require('gatsby-source-filesystem')\n\nconst path = require('path')\n\nexports.createSchemaCustomization = async ({ actions }) => {\n  const { createTypes } = actions\n\n  createTypes(`\n    type Mdx implements Node {\n      frontmatter: Frontmatter\n      featuredImageUrl: File @link(from: \"fields.featuredImageUrl\")\n      embeddedImageUrls: [File] @link(from: \"fields.embeddedImageUrls\")\n    }\n\n    type Frontmatter @dontInfer {\n        title: String\n        navigationLabel: String\n        tags: [String]\n        date: String\n        dateModified: String\n        author: String\n        status: String\n        isPrivate: Boolean\n        url: String\n        misc: String\n        pinned: Boolean\n        featuredImage: File @fileByRelativePath\n        featuredImageUrl: String\n        embeddedImages: [File] @fileByRelativePath\n        embeddedImageUrls: [String]\n    }\n  `)\n\n  // Logs out all typeDefs\n  // actions.printTypeDefinitions({ path: './typeDefs.txt' })\n}\n\nexports.onCreateNode = async (\n  { node, actions: { createNodeField, createNode }, getNode, store, cache, createNodeId },\n  themeOptions,\n) => {\n  const { source } = themeOptions\n\n  if (node.internal.type === 'Mdx') {\n    let basePath = ''\n\n    if (Array.isArray(source)) {\n      source.map((item) => {\n        const { name, dir } = item\n        if (node.fileAbsolutePath.includes(name)) {\n          basePath = `/${dir}`\n        }\n      })\n    } else {\n      if (node.fileAbsolutePath.includes(source.name)) {\n        basePath = `/${source.dir}`\n      }\n    }\n\n    const value = createFilePath({ node, getNode })\n\n    await createNodeField({\n      node,\n      name: 'slug',\n      value: node.frontmatter.navigationLabel ? value : `${basePath}${value}`,\n    })\n\n    if (node.frontmatter.featuredImageUrl) {\n      let featuredImageUrl = await createRemoteFileNode({\n        url: node.frontmatter.featuredImageUrl,\n        parentNodeId: node.id,\n        createNode,\n        createNodeId,\n        cache,\n        store,\n      })\n\n      if (featuredImageUrl) {\n        createNodeField({ node, name: 'featuredImageUrl', value: featuredImageUrl.id })\n      }\n    }\n\n    if (node.frontmatter.embeddedImageUrls) {\n      let embeddedImageUrls = await Promise.all(\n        node.frontmatter.embeddedImageUrls.map((url) => {\n          return createRemoteFileNode({\n            url,\n            parentNodeId: node.id,\n            createNode,\n            createNodeId,\n            cache,\n            store,\n          })\n        }),\n      )\n      if (embeddedImageUrls) {\n        createNodeField({\n          node,\n          name: 'embeddedImageUrls',\n          value: embeddedImageUrls.map((embeddedImageUrl) => {\n            return embeddedImageUrl.id\n          }),\n        })\n      }\n    }\n  }\n}\n\nexports.createPages = async ({ graphql, actions, reporter }, themeOptions) => {\n  const { source } = themeOptions\n  const { createPage } = actions\n\n  if (!source) return\n\n  const result = await graphql(`\n    query {\n      allMdx(\n        filter: { frontmatter: { status: { ne: \"draft\" }, navigationLabel: { eq: null } } }\n        sort: { order: DESC, fields: [frontmatter___date] }\n      ) {\n        edges {\n          node {\n            id\n            frontmatter {\n              title\n              navigationLabel\n            }\n            fields {\n              slug\n            }\n          }\n        }\n      }\n    }\n  `)\n\n  if (result.errors) {\n    reporter.panicOnBuild('🚨  ERROR: Loading \"createPages\" query')\n  }\n\n  const data = result.data.allMdx.edges\n\n  data.forEach(({ node }) => {\n    createPage({\n      path: node.fields.slug,\n      component: path.join(__dirname, `src/layouts/source-layout.js`),\n      context: {\n        id: node.id,\n      },\n    })\n  })\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/gatsby-ssr.js",
    "content": "const React = require('react')\nconst { PageElement } = require('./src/components/page-element')\n\nexports.wrapPageElement = ({ element }) => {\n  return <PageElement>{element}</PageElement>\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/index.js",
    "content": "// Data Components\nexport { Main } from './src/components/main'\n\n// Data Components\nexport { SourceDays } from './src/components/source-days'\nexport { SourceList } from './src/components/source-list'\nexport { SourceMonths } from './src/components/source-months'\nexport { SourceTags } from './src/components/source-tags'\nexport { SourceWords } from './src/components/source-words'\n\n// Data\nexport { useConfig } from './src/data/use-config'\nexport { useNavigation } from './src/data/use-navigation'\nexport { useDates } from './src/data/use-dates'\nexport { useTags } from './src/data/use-tags'\nexport { useWords } from './src/data/use-words'\nexport { useSource } from './src/data/use-source'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/package.json",
    "content": "{\n  \"name\": \"@pauliescanlon/gatsby-theme-terminal\",\n  \"description\": \"A zero component Gatsby theme for developers\",\n  \"version\": \"2.0.0\",\n  \"author\": \"Paul Scanlon <pauliescanlon@gmail.com>\",\n  \"dependencies\": {\n    \"@emotion/react\": \"^11.4.0\",\n    \"@theme-ui/color\": \"^0.11.3\",\n    \"@theme-ui/prism\": \"^0.11.3\",\n    \"date-fns\": \"^2.23.0\",\n    \"gatsby-plugin-image\": \"^2.0.0\",\n    \"gatsby-plugin-mdx\": \"^3.0.0\",\n    \"gatsby-plugin-react-helmet\": \"^5.0.0\",\n    \"gatsby-plugin-sharp\": \"^4.0.0\",\n    \"gatsby-plugin-theme-ui\": \"^0.11.3\",\n    \"gatsby-source-filesystem\": \"^4.0.0\",\n    \"gatsby-transformer-sharp\": \"^4.0.0\",\n    \"husky\": \"^7.0.1\",\n    \"prettier\": \"^2.3.2\",\n    \"prop-types\": \"15.7.2\",\n    \"react-helmet\": \"^6.1.0\",\n    \"theme-ui\": \"^0.11.3\"\n  },\n  \"peerDependencies\": {\n    \"@mdx-js/mdx\": \"^1.6.22\",\n    \"@mdx-js/react\": \"^1.6.22\",\n    \"gatsby\": \"^4.0.0\",\n    \"gatsby-plugin-mdx\": \"^3.0.0\",\n    \"gatsby-source-filesystem\": \"^4.0.0\",\n    \"react\": \"^17.0.0\",\n    \"react-dom\": \"^17.0.0\"\n  },\n  \"keywords\": [\n    \"gatsby\",\n    \"gatsby-theme\",\n    \"gatsby-plugin\"\n  ],\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"gatsby build\",\n    \"develop\": \"gatsby develop\",\n    \"format\": \"prettier --write \\\"**/*.{js,jsx,json}\\\"\",\n    \"start\": \"npm run develop\",\n    \"serve\": \"gatsby serve\",\n    \"clean\": \"gatsby clean\",\n    \"test\": \"echo \\\"Write tests! -> https://gatsby.dev/unit-testing\\\" && exit 1\",\n    \"publish\": \"npm login\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/pauliescanlon/gatsby-theme-terminal.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/pauliescanlon/gatsby-theme-terminal/issues\"\n  },\n  \"homepage\": \"https://gatsby-theme-terminal.netlify.com/\",\n  \"main\": \"index.js\"\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/logo/index.js",
    "content": "export { Logo } from './logo'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/logo/logo.js",
    "content": "/** @jsx jsx */\nimport { jsx } from 'theme-ui'\n\nexport const Logo = () => <span />\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/main/index.js",
    "content": "export { Main } from './main'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/main/main.js",
    "content": "import React, { Fragment, useContext } from 'react'\nimport PropTypes from 'prop-types'\nimport { MDXProvider } from '@mdx-js/react'\nimport Prism from '@theme-ui/prism'\nimport { Link as GatsbyLink } from 'gatsby'\n\nimport { Context } from '../../context'\nimport { Nav } from '../nav'\nimport { useConfig } from '../../data'\n\n// Mdx components\nimport * as themeUiComponents from 'theme-ui'\nimport { GatsbyImage, getImage } from 'gatsby-plugin-image'\n\nimport { Container, Box, Close, Image, MenuButton, Link } from 'theme-ui'\nimport { transparentize } from '@theme-ui/color'\n\n// Theme specific components\nimport { Logo } from '../logo'\nimport { SiteMetaData } from '../site-metadata'\nimport { SourceList } from '../source-list'\nimport { SourceDays } from '../source-days'\nimport { SourceMonths } from '../source-months'\nimport { SourceWords } from '../source-words'\nimport { SourceTags } from '../source-tags'\n\nconst components = {\n  a: ({ href, children }) => {\n    // If it's an external url use Link and target _blank\n    if (href.match(/^(http|https):/g)) {\n      return (\n        <Link href={href} target=\"_blank\" rel=\"noopener\">\n          {children}\n        </Link>\n      )\n    }\n    // if it's a # use Link which will fires an anchorScroll in gatsby-browser\n    if (href.match(/#/gi)) {\n      return <Link href={href}>{children}</Link>\n    }\n    // if it's anything else use GatsbyLink\n    return (\n      <Link as={GatsbyLink} to={href}>\n        {children}\n      </Link>\n    )\n  },\n  pre: ({ children }) => <Fragment>{children}</Fragment>,\n  code: Prism,\n  Fragment,\n  SiteMetaData,\n  SourceList,\n  SourceDays,\n  SourceMonths,\n  SourceWords,\n  SourceTags,\n  GatsbyImage: (props) => <GatsbyImage alt={props.alt} image={getImage(props.image)} />,\n  ...themeUiComponents,\n}\n\nexport const Main = ({ children }) => {\n  const {\n    site: {\n      siteMetadata: {\n        config: { sidebarWidth },\n      },\n    },\n  } = useConfig()\n\n  const {\n    state: { isNavOpen },\n    dispatch,\n  } = useContext(Context)\n\n  return (\n    <Fragment>\n      <Box\n        as=\"header\"\n        sx={{\n          alignItems: 'center',\n          backgroundColor: 'background',\n          borderBottom: (theme) => `${theme.borderWidths[1]}px solid ${theme.colors.surface}`,\n          display: 'flex',\n          justifyContent: 'space-between',\n          height: (theme) => `${theme.space[5]}px`,\n          ml: [0, 0, 0, sidebarWidth],\n          overflow: 'hidden',\n          position: 'fixed',\n          px: [3, 4],\n          width: ['100%', '100%', '100%', `calc(100% - ${sidebarWidth}px)`],\n          zIndex: 997,\n        }}\n      >\n        <Box\n          sx={{\n            alignItems: 'center',\n            display: ['flex', 'flex', 'flex', 'none'],\n          }}\n        >\n          <Logo />\n        </Box>\n        <Box\n          sx={{\n            alignItems: 'center',\n            display: ['flex', 'flex', 'flex', 'none'],\n            flexBasis: '100%',\n            justifyContent: 'flex-end',\n          }}\n        >\n          <MenuButton aria-label=\"Toggle Menu\" onClick={() => dispatch({ type: 'openNav' })} />\n        </Box>\n      </Box>\n      <Container\n        sx={{\n          margin: '0 auto',\n          maxWidth: 1200,\n        }}\n      >\n        <Box\n          sx={{\n            backgroundColor: 'background',\n            height: '100%',\n            left: [\n              isNavOpen ? '0px' : `-${sidebarWidth}px`,\n              isNavOpen ? '0px' : `-${sidebarWidth}px`,\n              isNavOpen ? '0px' : `-${sidebarWidth}px`,\n              '0px',\n            ],\n            position: 'fixed',\n            transition: '.3s ease-in-out left',\n            width: sidebarWidth,\n            zIndex: 999,\n          }}\n        >\n          <Box\n            sx={{\n              borderRight: (theme) => `${theme.borderWidths[1]}px solid ${theme.colors.surface}`,\n              height: '100%',\n              left: [\n                `${isNavOpen ? 0 : `-${sidebarWidth}px`}`,\n                `${isNavOpen ? 0 : `-${sidebarWidth}px`}`,\n                `${isNavOpen ? 0 : `-${sidebarWidth}px`}`,\n                0,\n              ],\n              transition: '.3s ease-in-out left',\n              position: 'relative',\n            }}\n          >\n            <Nav />\n          </Box>\n        </Box>\n        <Box\n          role=\"button\"\n          tabIndex=\"0\"\n          sx={{\n            backgroundColor: transparentize('black', 0.2),\n            display: [isNavOpen ? 'flex' : 'none', isNavOpen ? 'flex' : 'none', isNavOpen ? 'flex' : 'none', 'none'],\n            height: '100%',\n            justifyContent: 'flex-end',\n            px: [3, 4],\n            py: 2,\n            position: 'fixed',\n            transition: '.2s linear background-color',\n            width: '100%',\n            zIndex: 998,\n            ':focus': {\n              outline: 'none',\n              backgroundColor: transparentize('black', 0.4),\n            },\n          }}\n          onClick={() => dispatch({ type: 'closeNav' })}\n          onKeyDown={(event) => (event.key === 'Enter' ? dispatch({ type: 'closeNav' }) : {})}\n        >\n          <Close />\n        </Box>\n        <MDXProvider components={components}>\n          <Box\n            as=\"main\"\n            sx={{\n              display: 'block',\n              ml: [0, 0, 0, sidebarWidth],\n              px: [3, 4],\n              py: 6,\n              transition: '.3s ease-in-out margin-left',\n            }}\n          >\n            {children}\n          </Box>\n        </MDXProvider>\n      </Container>\n    </Fragment>\n  )\n}\n\nMain.propTypes = {\n  /** React children */\n  children: PropTypes.any,\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/nav/index.js",
    "content": "export { Nav } from './nav'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/nav/nav.js",
    "content": "import React, { Fragment } from 'react'\nimport { Box, NavLink } from 'theme-ui'\nimport { Link as GatsbyLink } from 'gatsby'\n\nimport { useNavigation } from '../../data'\nimport { Logo } from '../logo'\n\nexport const Nav = () => {\n  const {\n    allMdx: { edges },\n  } = useNavigation()\n\n  const navigation = edges.reduce((routes, route) => {\n    return route.node.fields.slug === '/' ? [route, ...routes] : [...routes, route]\n  }, [])\n\n  return (\n    <Fragment>\n      <Box\n        sx={{\n          alignItems: 'center',\n          display: 'flex',\n          height: (theme) => `${theme.space[5]}px`,\n          justifyContent: ['flex-start', 'flex-start', 'flex-start', 'flex-end'],\n          overFlow: 'hidden',\n          px: 4,\n        }}\n      >\n        <Logo />\n      </Box>\n      <Box\n        as=\"nav\"\n        sx={{\n          height: '100%',\n          py: 3,\n          px: 4,\n        }}\n      >\n        <Box\n          as=\"ul\"\n          sx={{\n            listStyle: 'none',\n            mt: 2,\n            p: 0,\n          }}\n        >\n          {navigation.map((route, index) => {\n            const {\n              frontmatter: { navigationLabel },\n              fields: { slug },\n            } = route.node\n\n            return (\n              <Box\n                key={index}\n                as=\"li\"\n                sx={{\n                  textAlign: ['left', 'left', 'left', 'right'],\n                }}\n              >\n                <NavLink as={GatsbyLink} to={slug}>\n                  {navigationLabel}\n                </NavLink>\n              </Box>\n            )\n          })}\n        </Box>\n      </Box>\n    </Fragment>\n  )\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/page-element/index.js",
    "content": "export { PageElement } from './page-element'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/page-element/page-element.js",
    "content": "import React, { useEffect } from 'react'\nimport { Global, css } from '@emotion/react'\nimport { Fragment } from 'react'\n\nimport { useConfig } from '../../data'\n\nexport const PageElement = ({ children }) => {\n  useEffect(() => {\n    window.scrollTo({ top: 0 })\n  }, [])\n\n  const {\n    site: {\n      siteMetadata: { siteUrl },\n    },\n  } = useConfig()\n\n  return (\n    <Fragment>\n      <Global\n        styles={css`\n          @font-face {\n            font-family: 'Inconsolata';\n            src: url('${siteUrl}/fonts/Inconsolata-Regular.woff2') format('woff2');\n            font-weight: 400;\n            font-style: normal;\n          }\n          @font-face {\n            font-family: 'Inconsolata';\n            src: url('${siteUrl}/fonts/Inconsolata-Bold.woff2') format('woff2');\n            font-weight: 700;\n            font-style: normal;\n          }\n        `}\n      />\n      {children}\n    </Fragment>\n  )\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/seo/index.js",
    "content": "export { Seo } from './seo'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/seo/seo.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Helmet } from 'react-helmet'\n\nexport const Seo = ({ type, title, titleTemplate, description, siteUrl, canonical, image, path, keywords, lang }) => {\n  const formatTitleTemplate = `${title} ${titleTemplate ? `| ${titleTemplate}` : ''}`\n\n  return (\n    <Helmet>\n      <html lang={lang} />\n      <title>{formatTitleTemplate}</title>\n      <link rel=\"canonical\" href={`${siteUrl}${canonical}`} />\n      <meta name=\"description\" content={description} />\n      <meta name=\"image\" content={image} />\n      <meta name=\"image:alt\" content={description} />\n      <meta name=\"gatsby-theme\" content=\"@pauliescanlon/gatsby-theme-terminal\" />\n      <meta name=\"keywords\" content={keywords ? keywords.join(', ') : null} />\n\n      {/* Facebook */}\n      <meta property=\"og:type\" content={type} />\n      <meta property=\"og:title\" content={formatTitleTemplate} />\n      <meta property=\"og:url\" content={`${siteUrl}${path ? path : ''}`} />\n      <meta property=\"og:description\" content={description} />\n      <meta property=\"og:image\" content={image} />\n      <meta property=\"og:image:alt\" content={description}></meta>\n\n      {/* Twitter */}\n      <meta name=\"twitter:card\" content=\"summary_large_image\" />\n      <meta name=\"twitter:title\" content={formatTitleTemplate} />\n      <meta name=\"twitter:url\" content={`${siteUrl}${path ? path : ''}`} />\n      <meta name=\"twitter:description\" content={description} />\n      <meta name=\"twitter:image\" content={image} />\n      <meta name=\"twitter:image:alt\" content={description}></meta>\n\n      {/* favicon */}\n      <link\n        rel=\"icon\"\n        type=\"image/png\"\n        sizes=\"16x16\"\n        href={`${siteUrl}/images/favicon-16x16.png`}\n        data-react-helmet=\"true\"\n      />\n      <link\n        rel=\"icon\"\n        type=\"image/png\"\n        sizes=\"32x32\"\n        href={`${siteUrl}/images/favicon-32x32.png`}\n        data-react-helmet=\"true\"\n      />\n    </Helmet>\n  )\n}\n\nSeo.propTypes = {\n  /** The type of meta - useful for Facebook */\n  type: PropTypes.oneOf(['website', 'article']),\n  /** The site title */\n  title: PropTypes.string.isRequired,\n  /** The site individual route */\n  titleTemplate: PropTypes.string.isRequired,\n  /** The site description */\n  description: PropTypes.string.isRequired,\n  /** The site URL */\n  siteUrl: PropTypes.string.isRequired,\n  /** The canonical URL */\n  canonical: PropTypes.string.isRequired,\n  /** Image url to use for opengraph image */\n  image: PropTypes.string,\n  /** Absolute URL path */\n  path: PropTypes.string.isRequired,\n  /** Keywords to use in meta keywords */\n  keywords: PropTypes.arrayOf(PropTypes.string),\n  /** Lang to use as meta lang */\n  lang: PropTypes.string,\n}\n\nSeo.defaultProps = {\n  lang: 'en',\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/site-metadata/index.js",
    "content": "export { SiteMetaData } from './site-metadata'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/site-metadata/site-metadata.js",
    "content": "import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { useConfig } from '../../data'\n\nexport const SiteMetaData = ({ children }) => {\n  const {\n    site: { siteMetadata },\n  } = useConfig()\n\n  return <Fragment>{children(siteMetadata)}</Fragment>\n}\n\nSiteMetaData.propTypes = {\n  /** React children */\n  children: PropTypes.func,\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-article/index.js",
    "content": "export { SourceArticle } from './source-article'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-article/source-article.js",
    "content": "import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { MDXRenderer } from 'gatsby-plugin-mdx'\nimport { MDXProvider } from '@mdx-js/react'\nimport { Heading, Badge, Text, Flex, Box, Divider, Alert } from '@theme-ui/components'\nimport { mix } from '@theme-ui/color'\nimport { format } from 'date-fns'\n\nimport { Main } from '../main'\nimport { GatsbyImage } from 'gatsby-plugin-image'\n\nconst formatDate = (date) => format(new Date(date), 'd-MMM-u')\n\nexport const SourceArticle = ({\n  title,\n  tags,\n  date,\n  dateModified,\n  author,\n  isPrivate,\n  featuredImage,\n  featuredImageUrl,\n  embedded,\n  body,\n  timeToRead,\n  wordCount,\n  slug,\n}) => {\n  return (\n    <Main>\n      {title ? (\n        <Fragment>\n          {isPrivate && (\n            <Fragment>\n              <Alert variant=\"error\" sx={{ mb: 4 }}>\n                This is a private post\n              </Alert>\n            </Fragment>\n          )}\n\n          <Box sx={{ mb: 4 }}>\n            {featuredImage && featuredImage.childImageSharp && (\n              <GatsbyImage alt={`${title}-image`} image={featuredImage.childImageSharp.gatsbyImageData} />\n            )}\n            {featuredImageUrl && featuredImageUrl.childImageSharp && (\n              <GatsbyImage alt={`${title}-image`} image={featuredImageUrl.childImageSharp.gatsbyImageData} />\n            )}\n          </Box>\n\n          <Heading as=\"h1\" variant=\"styles.h1\" sx={{ mb: 4 }}>\n            {title}\n          </Heading>\n          <Flex sx={{ flexWrap: 'wrap', mb: 1 }}>\n            <Box\n              sx={{\n                width: ['100%', '50%'],\n              }}\n            >\n              {date && (\n                <Text as=\"div\" sx={{ color: 'muted' }}>\n                  Date published: {formatDate(date)}\n                </Text>\n              )}\n            </Box>\n            <Box\n              sx={{\n                width: ['100%', '50%'],\n              }}\n            >\n              {dateModified && (\n                <Text\n                  as=\"div\"\n                  sx={{\n                    color: 'muted',\n                    textAlign: ['left', 'right'],\n                  }}\n                >\n                  Date modified: {formatDate(dateModified)}\n                </Text>\n              )}\n            </Box>\n          </Flex>\n\n          <Flex sx={{ flexWrap: 'wrap', mb: 3 }}>\n            <Box\n              sx={{\n                width: ['100%', '50%'],\n              }}\n            >\n              <Text as=\"div\" sx={{ color: 'muted' }}>{`${timeToRead} min read / ${wordCount.words} words`}</Text>\n            </Box>\n            {author && (\n              <Box\n                sx={{\n                  width: ['100%', '50%'],\n                }}\n              >\n                <Text as=\"div\" sx={{ color: 'muted', textAlign: ['left', 'right'] }}>\n                  Author: {author}\n                </Text>\n              </Box>\n            )}\n          </Flex>\n        </Fragment>\n      ) : null}\n\n      {tags ? (\n        <Box sx={{ mb: 3 }}>\n          {tags.map((tag, index) => (\n            <Badge\n              key={index}\n              variant=\"primary\"\n              sx={{\n                mb: 2,\n                mr: 2,\n                color: mix('muted', 'primary', `${index / tags.length}`),\n                borderColor: mix('muted', 'primary', `${index / tags.length}`),\n              }}\n            >\n              {tag}\n            </Badge>\n          ))}\n        </Box>\n      ) : null}\n\n      <MDXProvider>\n        <MDXRenderer embedded={embedded}>{body}</MDXRenderer>\n      </MDXProvider>\n    </Main>\n  )\n}\n\nSourceArticle.propTypes = {\n  /** Title frommatter\" */\n  title: PropTypes.string,\n  /** Tags from frontmatter */\n  tags: PropTypes.arrayOf(PropTypes.string),\n  /** Date from frontmatter */\n  date: PropTypes.string,\n  /** DateModified from frontmatter */\n  dateModified: PropTypes.string,\n  /** Author from frontmatter */\n  author: PropTypes.string,\n  /** isPrivate from frontMatter */\n  isPrivate: PropTypes.bool,\n  /** FeaturedImage from frontmatter */\n  featuredImage: PropTypes.any,\n  /** featuredImageUrl from frontmatter */\n  featuredImageUrl: PropTypes.any,\n  /** embeddedImage array from SourceLayout */\n  embedded: PropTypes.any,\n  /** body from SourceLayout */\n  body: PropTypes.any,\n  /** timeToRead from SourceLayout */\n  timeToRead: PropTypes.number,\n  /** wordCount from SourceLayout */\n  wordCount: PropTypes.shape({\n    words: PropTypes.number,\n  }),\n  /** slug from SourceLayout */\n  slug: PropTypes.string,\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-days/index.js",
    "content": "export { SourceDays } from './source-days'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-days/source-days.js",
    "content": "import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { useDates } from '../../data'\nimport { graphql, useStaticQuery } from 'gatsby'\n\nconst name = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']\n\nconst abbreviation = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']\n\nconst initial = ['m', 't', 'w', 't', 'f', 's', 's']\n\nconst createDayObject = (day, year) => {\n  return {\n    year: year,\n    name: name[day],\n    abbreviation: abbreviation[day],\n    initial: initial[day],\n    number: day === 0 ? 7 : day,\n    count: -1,\n    percent: 0,\n  }\n}\n\nexport const SourceDays = ({ filter, children }) => {\n  const defaultValues = name.map((_, index) => createDayObject(index, 0))\n\n  const count = useDates(filter)\n    .reduce((items, item) => {\n      const {\n        node: {\n          frontmatter: { date },\n        },\n      } = item\n\n      let day = new Date(date).getDay()\n      let year = new Date(date).getFullYear()\n      items[year] = items[year] || [...defaultValues]\n      items[year].push(createDayObject(day, year))\n\n      return items\n    }, [])\n    .map((year) => {\n      let yearValue = year.reduce((a, b) => (b.year !== 0 ? (a = b.year) : null))\n      return Object.values(\n        year.reduce((items, item) => {\n          const { name } = item\n          items[name] = items[name] || {\n            ...item,\n            year: yearValue,\n          }\n          items[name].count += 1\n          return items\n        }, {}),\n      )\n    })\n\n  const days = Object.values(\n    count.map((year) => {\n      let total = year.reduce((a, b) => ({ count: a.count + b.count }))\n      return year.map((day) => {\n        return {\n          ...day,\n          percent: Math.round((day.count / total.count) * 100),\n        }\n      })\n    }),\n  )\n\n  return <Fragment>{days.length ? children(days) : null}</Fragment>\n}\n\nSourceDays.propTypes = {\n  /** A string used as a filter for the allMdx GraphQL query */\n  filter: PropTypes.string,\n  /** React children */\n  children: PropTypes.func,\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-list/index.js",
    "content": "export { SourceList } from './source-list'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-list/source-list.js",
    "content": "import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { useSource } from '../../data'\n\nexport const SourceList = ({ filter, children }) => {\n  return <Fragment>{children(useSource(filter))}</Fragment>\n}\n\nSourceList.propTypes = {\n  /** A string used as a filter for the allMdx GraphQL query */\n  filter: PropTypes.string,\n  /** React children */\n  children: PropTypes.func,\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-months/index.js",
    "content": "export { SourceMonths } from './source-months'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-months/source-months.js",
    "content": "import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { useDates } from '../../data'\n\nconst name = [\n  'january',\n  'february',\n  'march',\n  'april',\n  'may',\n  'june',\n  'july',\n  'august',\n  'september',\n  'october',\n  'november',\n  'december',\n]\n\nconst abbreviation = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']\n\nconst initial = ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd']\n\nconst createMonthObject = (month, year) => {\n  return {\n    year: year,\n    name: name[month],\n    abbreviation: abbreviation[month],\n    initial: initial[month],\n    count: -1,\n    percent: 0,\n  }\n}\n\nexport const SourceMonths = ({ filter, children }) => {\n  const defaultValues = name.map((_, index) => createMonthObject(index, 0))\n\n  const count = useDates(filter)\n    .reduce((items, item) => {\n      let month = new Date(item.node.frontmatter.date).getMonth()\n      let year = new Date(item.node.frontmatter.date).getFullYear()\n      items[year] = items[year] || [...defaultValues]\n      items[year].push(createMonthObject(month, year))\n\n      return items\n    }, [])\n    .map((year) => {\n      let yearValue = year.reduce((a, b) => (b.year !== 0 ? (a = b.year) : null))\n\n      return Object.values(\n        year.reduce((items, item) => {\n          const { name } = item\n          items[name] = items[name] || {\n            ...item,\n            year: yearValue,\n          }\n          items[name].count += 1\n          return items\n        }, {}),\n      )\n    })\n\n  const months = Object.values(\n    count.map((year) => {\n      let total = year.reduce((a, b) => ({ count: a.count + b.count }))\n      return year.map((month) => {\n        return {\n          ...month,\n          percent: Math.round((month.count / total.count) * 100),\n        }\n      })\n    }),\n  )\n\n  return <Fragment>{months.length ? children(months) : null}</Fragment>\n}\n\nSourceMonths.propTypes = {\n  /** A string used as a filter for the allMdx GraphQL query */\n  filter: PropTypes.string,\n  /** React children */\n  children: PropTypes.func,\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-tags/index.js",
    "content": "export { SourceTags } from './source-tags'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-tags/source-tags.js",
    "content": "import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { useTags } from '../../data'\n\nexport const SourceTags = ({ filter, children }) => {\n  const count = Object.values(\n    useTags(filter)\n      .filter((edge) => edge.node.frontmatter.tags)\n      .reduce((items, item) => {\n        const { tags } = item.node.frontmatter\n        tags.forEach((tag) => {\n          items.push({\n            name: tag,\n            count: 1,\n            percent: 1,\n          })\n        })\n        return items\n      }, [])\n      .reduce((items, item) => {\n        const { count, name } = item\n        items[name] = items[name] || { count: 0, name }\n        items[name].count += count\n\n        return items\n      }, []),\n  )\n\n  const total = count.reduce((a, b) => a + b.count, 0)\n\n  const tags = count.map((item) => {\n    return {\n      ...item,\n      percent: Math.round((item.count / total) * 100),\n    }\n  })\n\n  return <Fragment>{tags.length ? children(tags) : null}</Fragment>\n}\n\nSourceTags.propTypes = {\n  /** A string used as a filter for the allMdx GraphQL query */\n  filter: PropTypes.string,\n  /** React children */\n  children: PropTypes.func,\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-words/index.js",
    "content": "export { SourceWords } from './source-words'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/components/source-words/source-words.js",
    "content": "import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { useWords } from '../../data'\n\nconst name = [\n  'january',\n  'february',\n  'march',\n  'april',\n  'may',\n  'june',\n  'july',\n  'august',\n  'september',\n  'october',\n  'november',\n  'december',\n]\n\nconst abbreviation = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']\n\nconst initial = ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd']\n\nconst createMonthObject = (month, year, words) => {\n  return {\n    year: year,\n    name: name[month],\n    abbreviation: abbreviation[month],\n    initial: initial[month],\n    words: words,\n  }\n}\n\nexport const SourceWords = ({ filter, children }) => {\n  const defaultValues = name.map((_, index) => createMonthObject(index, 0, 0))\n\n  const mdx = useWords(filter)\n\n  const wordCountTotal = mdx.reduce((a, b) => a + b.node.wordCount.words, 0)\n\n  const wordCountAverage = Math.round(wordCountTotal / mdx.length)\n\n  const timeToReadTotal = mdx.reduce((a, b) => a + b.node.timeToRead, 0)\n\n  const timeToReadAverage = Math.round(timeToReadTotal / mdx.length)\n\n  const wordCountHighest = Math.max(...mdx.map((item) => item.node.wordCount.words))\n\n  const wordCountLowest = Math.min(...mdx.map((item) => item.node.wordCount.words))\n\n  const wordCountByMonth = mdx\n    .reduce((items, item) => {\n      let month = new Date(item.node.frontmatter.date).getMonth()\n      let year = new Date(item.node.frontmatter.date).getFullYear()\n      let words = item.node.wordCount.words\n      items[year] = items[year] || [...defaultValues]\n      items[year].push(createMonthObject(month, year, words))\n\n      return items\n    }, [])\n    .map((year) => {\n      let yearValue = year.reduce((a, b) => (b.year !== 0 ? (a = b.year) : null))\n\n      return Object.values(\n        year.reduce((items, item) => {\n          const { name, words } = item\n          items[name] = items[name] || {\n            ...item,\n            year: yearValue,\n          }\n          items[name].words += words\n          return items\n        }, {}),\n      )\n    })\n\n  return (\n    <Fragment>\n      {mdx.length\n        ? children({\n            wordCountTotal: wordCountTotal,\n            wordCountAverage: wordCountAverage,\n            wordCountHighest: wordCountHighest,\n            wordCountLowest: wordCountLowest,\n            timeToReadTotal: timeToReadTotal,\n            timeToReadAverage: timeToReadAverage,\n            sourceTotal: mdx.length,\n            wordCountByMonth: wordCountByMonth,\n          })\n        : null}\n    </Fragment>\n  )\n}\n\nSourceWords.propTypes = {\n  /** A string used as a filter for the allMdx GraphQL query */\n  filter: PropTypes.string,\n  /** React children */\n  children: PropTypes.func,\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/context/index.js",
    "content": "import React from 'react'\n//https://medium.com/@seantheurgel/react-hooks-as-state-management-usecontext-useeffect-usereducer-a75472a862fe\n\nconst initialState = { isNavOpen: false }\n\nconst reducer = (state, actions) => {\n  switch (actions.type) {\n    case 'openNav':\n      return { ...state, isNavOpen: true }\n\n    case 'closeNav':\n      return { ...state, isNavOpen: false }\n\n    default:\n      return\n  }\n}\n\nexport const Context = React.createContext(initialState)\n\nexport const ContextProvider = ({ children }) => {\n  const [state, dispatch] = React.useReducer(reducer, initialState)\n\n  return <Context.Provider value={{ state, dispatch }}>{children}</Context.Provider>\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/data/index.js",
    "content": "export { useConfig } from './use-config'\nexport { useNavigation } from './use-navigation'\nexport { useDates } from './use-dates'\nexport { useTags } from './use-tags'\nexport { useWords } from './use-words'\nexport { useSource } from './use-source'\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/data/use-config.js",
    "content": "import { useStaticQuery, graphql } from 'gatsby'\n\nexport const useConfig = () => {\n  return useStaticQuery(\n    graphql`\n      query {\n        site {\n          siteMetadata {\n            name\n            description\n            keywords\n            siteUrl\n            siteImage\n            profileImage\n            lang\n            config {\n              sidebarWidth\n            }\n          }\n        }\n      }\n    `,\n  )\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/data/use-dates.js",
    "content": "import { useStaticQuery, graphql } from 'gatsby'\n\nexport const useDates = (filter) => {\n  const query = useStaticQuery(graphql`\n    query dates {\n      allMdx(\n        filter: { frontmatter: { status: { ne: \"draft\" }, navigationLabel: { eq: null } } }\n        sort: { order: DESC, fields: [frontmatter___date] }\n      ) {\n        edges {\n          node {\n            frontmatter {\n              date\n              status\n              isPrivate\n            }\n            fields {\n              slug\n            }\n          }\n        }\n      }\n    }\n  `)\n\n  if (!filter) return query.allMdx.edges.filter((edge) => edge.node.frontmatter.isPrivate !== true)\n\n  return query.allMdx.edges\n    .map((edge) => edge)\n    .filter((edge) => edge.node.fields.slug.includes(filter) && edge.node.frontmatter.isPrivate !== true)\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/data/use-navigation.js",
    "content": "import { useStaticQuery, graphql } from 'gatsby'\n\nexport const useNavigation = () => {\n  return useStaticQuery(\n    graphql`\n      query navigation {\n        allMdx(filter: { frontmatter: { navigationLabel: { ne: null } } }) {\n          edges {\n            node {\n              id\n              fields {\n                slug\n              }\n              frontmatter {\n                title\n                navigationLabel\n              }\n            }\n          }\n        }\n      }\n    `,\n  )\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/data/use-source.js",
    "content": "import { useStaticQuery, graphql } from 'gatsby'\n\nexport const useSource = (filter) => {\n  const query = useStaticQuery(graphql`\n    query source {\n      allMdx(\n        filter: { frontmatter: { status: { ne: \"draft\" }, navigationLabel: { eq: null } } }\n        sort: { order: DESC, fields: [frontmatter___date] }\n      ) {\n        edges {\n          node {\n            id\n            body\n            excerpt\n            timeToRead\n            wordCount {\n              words\n            }\n            frontmatter {\n              title\n              tags\n              date\n              dateModified\n              author\n              status\n              isPrivate\n              url\n              misc\n              pinned\n              featuredImage {\n                childImageSharp {\n                  gatsbyImageData(layout: FULL_WIDTH)\n                }\n              }\n            }\n            featuredImageUrl {\n              childImageSharp {\n                gatsbyImageData(layout: FULL_WIDTH)\n              }\n            }\n            fields {\n              slug\n            }\n          }\n        }\n      }\n    }\n  `)\n\n  if (!filter)\n    return query.allMdx.edges.filter((edge) => {\n      return edge.node.frontmatter.isPrivate !== true\n    })\n\n  return query.allMdx.edges\n    .map((edge) => edge)\n    .filter((edge) => {\n      return edge.node.fields.slug.includes(filter) && edge.node.frontmatter.isPrivate !== true\n    })\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/data/use-tags.js",
    "content": "import { useStaticQuery, graphql } from 'gatsby'\n\nexport const useTags = (filter) => {\n  const query = useStaticQuery(graphql`\n    query tags {\n      allMdx(\n        filter: { frontmatter: { status: { ne: \"draft\" }, navigationLabel: { eq: null } } }\n        sort: { order: DESC, fields: [frontmatter___date] }\n      ) {\n        edges {\n          node {\n            frontmatter {\n              tags\n              date\n              status\n              isPrivate\n            }\n            fields {\n              slug\n            }\n          }\n        }\n      }\n    }\n  `)\n\n  if (!filter) return query.allMdx.edges.filter((edge) => edge.node.frontmatter.isPrivate !== true)\n\n  return query.allMdx.edges\n    .map((edge) => edge)\n    .filter((edge) => edge.node.fields.slug.includes(filter) && edge.node.frontmatter.isPrivate !== true)\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/data/use-words.js",
    "content": "import { useStaticQuery, graphql } from 'gatsby'\n\nexport const useWords = (filter) => {\n  const query = useStaticQuery(graphql`\n    query words {\n      allMdx(\n        filter: { frontmatter: { status: { ne: \"draft\" }, navigationLabel: { eq: null } } }\n        sort: { order: DESC, fields: [frontmatter___date] }\n      ) {\n        edges {\n          node {\n            timeToRead\n            wordCount {\n              words\n            }\n            frontmatter {\n              date\n              status\n              isPrivate\n            }\n            fields {\n              slug\n            }\n          }\n        }\n      }\n    }\n  `)\n\n  if (!filter) return query.allMdx.edges.filter((edge) => edge.node.frontmatter.isPrivate !== true)\n\n  return query.allMdx.edges\n    .map((edge) => edge)\n    .filter((edge) => edge.node.fields.slug.includes(filter) && edge.node.frontmatter.isPrivate !== true)\n}\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/gatsby-plugin-theme-ui/index.js",
    "content": "import codeTheme from '@theme-ui/prism/presets/night-owl.json'\nimport { lighten } from '@theme-ui/color'\n\nconst theme = {\n  borderWidths: [0, 1, 4],\n  colors: {\n    text: '#ffffff',\n    background: '#282a36',\n    muted: '#8394ca',\n    highlight: '#5a6084',\n    surface: '#323442',\n    primary: '#ff79c6',\n    secondary: '#8be9fd',\n    success: '#50fa7b',\n    error: '#ff5555',\n    black: '#000000',\n  },\n  fonts: {\n    body: 'Inconsolata, monospace',\n    heading: 'Inconsolata, monospace',\n    code: 'monospace',\n  },\n  fontWeights: {\n    body: 400,\n    heading: 700,\n    bold: 700,\n  },\n  lineHeights: {\n    body: 1.75,\n    heading: 1.125,\n  },\n  fontSizes: [12, 16, 18, 28],\n  space: [0, 4, 8, 16, 32, 48, 64],\n  shadows: [\n    `0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)`,\n    `0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)`,\n    `0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)`,\n    `0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)`,\n    `0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22)`,\n  ],\n\n  styles: {\n    root: {\n      fontFamily: 'body',\n      fontWeight: 'body',\n      fontSize: 1,\n      lineHeight: 'body',\n      'input:-webkit-autofill:first-line': {\n        color: (theme) => `${theme.colors.primary}!important`,\n      },\n      a: {\n        variant: 'styles.focus',\n      },\n      pre: {\n        ...codeTheme,\n        fontFamily: 'code',\n        borderRadius: 0,\n        overflow: 'auto',\n        fontSize: '13px',\n        overflow: 'auto',\n        p: 3,\n        my: '48px!important',\n      },\n    },\n    focus: {\n      transition: '.2s linear box-shadow',\n      ':focus': {\n        outline: 'none',\n        boxShadow: (theme) => `0 2px 0 0 ${theme.colors.primary}`,\n      },\n    },\n    h1: {\n      variant: 'text.specialHeading',\n      color: 'primary',\n      fontSize: 3,\n    },\n    h2: {\n      variant: 'text.specialHeading',\n      color: 'primary',\n    },\n    h3: {\n      variant: 'text.heading',\n      color: 'secondary',\n    },\n    h4: {\n      variant: 'text.heading',\n      color: 'text',\n    },\n    h5: {\n      variant: 'text.heading',\n      color: 'success',\n    },\n    h6: {\n      variant: 'text.heading',\n      color: 'error',\n    },\n    p: {\n      mt: 0,\n      mb: 3,\n      code: {\n        variant: 'styles.code',\n      },\n    },\n    small: {\n      color: 'muted',\n      fontSize: 0,\n    },\n    a: {\n      color: 'muted',\n      variant: 'styles.focus',\n    },\n    code: {\n      fontFamily: 'code',\n      color: 'inherit',\n      backgroundColor: 'surface',\n      fontSize: '13px',\n      p: 1,\n    },\n\n    hr: {\n      border: 'none',\n      mt: 0,\n      mb: 3,\n    },\n    ol: {\n      mt: 0,\n      mb: 3,\n      pl: 4,\n    },\n    ul: {\n      mt: 0,\n      mb: 3,\n      // special case so ul lines up with ol\n      pl: '24px',\n      listStyle: 'square',\n    },\n    li: {\n      mb: 1,\n      code: {\n        variant: 'styles.code',\n      },\n      pre: {\n        variant: 'styles.pre',\n      },\n    },\n    table: {\n      borderCollapse: 'collapse',\n      mb: 3,\n      border: 'none',\n      thead: {\n        backgroundColor: lighten('background', 0.03),\n        tr: {\n          th: {\n            border: (theme) => `${theme.borderWidths[1]}px solid ${theme.colors.surface}`,\n            padding: (theme) => `${theme.space[2]}px ${theme.space[3]}px`,\n          },\n        },\n        td: {\n          color: '#666',\n        },\n      },\n      tbody: {\n        'tr:nth-of-type(even)': {\n          backgroundColor: lighten('background', 0.01),\n        },\n        tr: {\n          td: {\n            padding: (theme) => `${theme.space[2]}px ${theme.space[3]}px`,\n            border: (theme) => `${theme.borderWidths[1]}px solid ${theme.colors.surface}`,\n          },\n        },\n      },\n    },\n    blockquote: {\n      borderRadius: 0,\n      borderLeftColor: 'muted',\n      borderLeftStyle: 'solid',\n      borderLeftWidth: 2,\n      mt: 0,\n      ml: 2,\n      mb: 3,\n      mr: 0,\n      p: {\n        p: 3,\n        mb: 0,\n      },\n    },\n    progress: {\n      primary: {\n        backgroundColor: 'surface',\n        color: 'primary',\n      },\n      secondary: {\n        backgroundColor: 'surface',\n        color: 'secondary',\n      },\n      success: {\n        backgroundColor: 'surface',\n        color: 'success',\n      },\n      error: {\n        backgroundColor: 'surface',\n        color: 'error',\n      },\n    },\n    donut: {\n      primary: {\n        color: 'primary',\n      },\n      secondary: {\n        color: 'secondary',\n      },\n      success: {\n        color: 'success',\n      },\n      error: {\n        color: 'error',\n      },\n    },\n\n    spinner: {\n      primary: {\n        color: 'primary',\n      },\n      secondary: {\n        color: 'secondary',\n      },\n      success: {\n        color: 'success',\n      },\n      error: {\n        color: 'error',\n      },\n    },\n  },\n\n  // components\n  alerts: {\n    primary: {\n      fontWeight: 'body',\n      borderRadius: 0,\n      px: 3,\n      py: 2,\n      color: 'text',\n      backgroundColor: 'primary',\n    },\n    secondary: {\n      variant: 'alerts.primary',\n      color: 'background',\n      backgroundColor: 'secondary',\n    },\n    success: {\n      variant: 'alerts.primary',\n      color: 'background',\n      backgroundColor: 'success',\n    },\n    error: {\n      variant: 'alerts.primary',\n      backgroundColor: 'error',\n    },\n  },\n\n  badges: {\n    primary: {\n      color: 'primary',\n      borderColor: 'primary',\n      fontSize: 0,\n      borderRadius: 0,\n      borderWidth: 1,\n      borderStyle: 'solid',\n      backgroundColor: 'transparent',\n      px: 2,\n      py: 1,\n    },\n    secondary: {\n      variant: 'badges.primary',\n      color: 'secondary',\n      borderColor: 'secondary',\n    },\n    success: {\n      variant: 'badges.primary',\n      color: 'success',\n      borderColor: 'success',\n    },\n    error: {\n      variant: 'badges.primary',\n      color: 'error',\n      borderColor: 'error',\n    },\n  },\n\n  buttons: {\n    focus: {\n      ':focus': {\n        outline: 'none',\n        transition: '.2s linear box-shadow',\n        boxShadow: (theme) => `0 0 0 2px ${theme.colors.muted}`,\n      },\n    },\n    primary: {\n      borderRadius: 0,\n      cursor: 'pointer',\n      minWidth: 120,\n      px: 3,\n      py: 2,\n      variant: 'buttons.focus',\n    },\n    secondary: {\n      variant: 'buttons.primary',\n      color: 'background',\n      backgroundColor: 'secondary',\n    },\n    success: {\n      variant: 'buttons.primary',\n      color: 'background',\n      backgroundColor: 'success',\n    },\n    error: {\n      variant: 'buttons.primary',\n      backgroundColor: 'error',\n    },\n    ghost: {\n      variant: 'buttons.primary',\n      backgroundColor: 'background',\n    },\n    icon: {\n      cursor: 'pointer',\n      borderRadius: 0,\n      variant: 'buttons.focus',\n    },\n    close: {\n      cursor: 'pointer',\n      borderRadius: 0,\n      variant: 'buttons.focus',\n    },\n    menu: {\n      cursor: 'pointer',\n      borderRadius: 0,\n      variant: 'buttons.focus',\n    },\n  },\n\n  cards: {\n    primary: {\n      boxShadow: 0,\n      backgroundColor: 'surface',\n    },\n  },\n\n  links: {\n    variant: 'styles.a',\n    nav: {\n      variant: 'styles.a',\n      fontWeight: 'body',\n      ':before': {\n        pr: [2, 2, 2, 0],\n        content: [`\"-\"`, `\"-\"`, `\"-\"`, `\"\"`],\n      },\n      ':after': {\n        pl: [0, 0, 0, 2],\n        content: [`\"\"`, `\"\"`, `\"\"`, `\"-\"`],\n      },\n      ':hover': {\n        color: 'text',\n        transition: '.2s linear color',\n      },\n      '&[aria-current=\"page\"]': {\n        color: 'text',\n        pointerEvents: 'none',\n      },\n    },\n  },\n\n  text: {\n    color: 'text',\n    heading: {\n      fontFamily: 'heading',\n      fontWeight: 'heading',\n      fontSize: 2,\n      mt: 0,\n      mb: 3,\n      a: {\n        color: 'inherit',\n      },\n    },\n    specialHeading: {\n      variant: 'text.heading',\n      '::before': {\n        content: `'→'`,\n        color: 'success',\n        mr: 2,\n      },\n      '::after': {\n        content: `'()'`,\n        color: 'secondary',\n        ml: 1,\n      },\n    },\n  },\n\n  images: {\n    avatar: {},\n  },\n\n  forms: {\n    label: {\n      fontWeight: 'bold',\n    },\n    input: {\n      borderRadius: 0,\n      borderColor: 'muted',\n      variant: 'styles.focus',\n    },\n    select: {\n      borderRadius: 0,\n      borderColor: 'muted',\n      variant: 'styles.focus',\n    },\n    textarea: {\n      borderRadius: 0,\n      borderColor: 'muted',\n      variant: 'styles.focus',\n    },\n    slider: {\n      backgroundColor: 'muted',\n    },\n    radio: {\n      color: 'muted',\n      backgroundColor: 'background',\n    },\n    checkbox: {\n      color: 'muted',\n      backgroundColor: 'background',\n    },\n  },\n\n  hr: {},\n\n  embed: {},\n\n  sizes: {\n    container: {},\n  },\n\n  layouts: {\n    container: {},\n  },\n\n  messages: {\n    default: {\n      borderRadius: 0,\n      backgroundColor: 'surface',\n    },\n    primary: {\n      variant: 'messages.default',\n      borderLeftColor: 'primary',\n    },\n    secondary: {\n      variant: 'messages.default',\n      borderLeftColor: 'secondary',\n    },\n    success: {\n      variant: 'messages.default',\n      borderLeftColor: 'success',\n    },\n    error: {\n      variant: 'messages.default',\n      borderLeftColor: 'error',\n    },\n  },\n}\n\nexport default theme\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/layouts/page-layout.js",
    "content": "/** @jsx jsx */\nimport { Fragment } from 'react'\nimport { jsx } from 'theme-ui'\nimport { Location } from '@reach/router'\nimport { ContextProvider } from '../context'\n\nimport { Seo } from '../components/seo'\nimport { Main } from '../components/main'\n\nimport { useConfig } from '../data'\n\nconst PageLayout = ({ children }) => {\n  const {\n    site: {\n      siteMetadata: { name, description, keywords, siteUrl, siteImage, lang },\n    },\n  } = useConfig()\n\n  return (\n    <ContextProvider>\n      <Main>\n        <Location>\n          {({ location }) => {\n            const { pathname } = location\n            const titleTemplate = pathname.replace(/\\//gm, '')\n\n            return (\n              <Fragment>\n                <Seo\n                  type=\"website\"\n                  title={name}\n                  titleTemplate={titleTemplate}\n                  description={description}\n                  siteUrl={siteUrl}\n                  canonical={pathname}\n                  image={siteImage}\n                  path={pathname}\n                  keywords={keywords || ['']}\n                  lang={lang}\n                />\n              </Fragment>\n            )\n          }}\n        </Location>\n        {children}\n      </Main>\n    </ContextProvider>\n  )\n}\n\nexport default PageLayout\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/layouts/source-layout.js",
    "content": "import React, { Fragment } from 'react'\nimport { Location } from '@reach/router'\nimport { graphql } from 'gatsby'\n\nimport { ContextProvider } from '../context'\n\nimport { Seo } from '../components/seo'\nimport { SourceArticle } from '../components/source-article'\n\nimport { useConfig } from '../data'\n\nimport { transformImages } from '../utils'\n\nconst IMAGE_KEY = 'image'\n\nconst SourceLayout = ({\n  data: {\n    mdx: {\n      body,\n      excerpt,\n      frontmatter,\n      featuredImageUrl,\n      embeddedImageUrls,\n      fields: { slug },\n      timeToRead,\n      wordCount,\n    },\n  },\n}) => {\n  const {\n    site: {\n      siteMetadata: { name, siteUrl, siteImage, lang },\n    },\n  } = useConfig()\n\n  const { title, tags, date, dateModified, author, isPrivate, featuredImage, embeddedImages } = frontmatter\n\n  const getSeoImage = () => {\n    if (featuredImage) {\n      return `${siteUrl}${featuredImage.childImageSharp.gatsbyImageData.images.fallback.src}`\n    }\n\n    if (featuredImageUrl) {\n      return `${siteUrl}${featuredImageUrl.childImageSharp.gatsbyImageData.images.fallback.src}`\n    }\n\n    return siteImage\n  }\n\n  const combinedEmbedded = [...(embeddedImages || []), ...(embeddedImageUrls || [])].filter((n) => n)\n\n  return (\n    <ContextProvider>\n      <Location>\n        {({ location }) => {\n          const { pathname } = location\n          return (\n            <Fragment>\n              <Seo\n                type=\"article\"\n                title={name}\n                titleTemplate={title}\n                description={excerpt}\n                siteUrl={siteUrl}\n                canonical={slug}\n                image=\"\"\n                image={getSeoImage()}\n                path={pathname}\n                keywords={tags || ['']}\n                lang={lang}\n              />\n              <SourceArticle\n                title={title}\n                tags={tags}\n                date={date}\n                dateModified={dateModified}\n                author={author}\n                isPrivate={isPrivate}\n                featuredImage={featuredImage}\n                featuredImageUrl={featuredImageUrl}\n                embedded={transformImages(combinedEmbedded)}\n                body={body}\n                timeToRead={timeToRead}\n                wordCount={wordCount}\n                slug={slug}\n              />\n            </Fragment>\n          )\n        }}\n      </Location>\n    </ContextProvider>\n  )\n}\n\n// {\n//   mdx(id: {eq: \"ff24e77a-aa63-564b-a244-24e2298aa659\"}) {\n//     frontmatter {\n//       url\n//     }\n//   }\n// }\n\nexport const singleMdx = graphql`\n  query singleMdx($id: String) {\n    mdx(id: { eq: $id }) {\n      id\n      body\n      excerpt\n      timeToRead\n      wordCount {\n        words\n      }\n      slug\n      frontmatter {\n        title\n        tags\n        date\n        dateModified\n        author\n        status\n        isPrivate\n        url\n        misc\n        pinned\n        featuredImage {\n          childImageSharp {\n            gatsbyImageData(layout: FULL_WIDTH)\n          }\n        }\n        embeddedImages {\n          childImageSharp {\n            gatsbyImageData(layout: FULL_WIDTH)\n          }\n        }\n      }\n      featuredImageUrl {\n        childImageSharp {\n          gatsbyImageData(layout: FULL_WIDTH)\n        }\n      }\n      embeddedImageUrls {\n        childImageSharp {\n          gatsbyImageData\n        }\n      }\n      fields {\n        slug\n      }\n    }\n  }\n`\n\nexport default SourceLayout\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/pages/404.js",
    "content": "import React from 'react'\n\nexport default () => <div>404 page not found</div>\n"
  },
  {
    "path": "@pauliescanlon/gatsby-theme-terminal/src/utils/index.js",
    "content": "const IMAGE_KEY = 'image'\n\nexport const transformImages = (imageArray) => {\n  if (Array.isArray(imageArray)) {\n    return imageArray.reduce((images, image, index) => {\n      images[`${IMAGE_KEY}${index + 1}`] =\n        images[`${IMAGE_KEY}${index + 1}`] || image\n          ? image.url\n            ? image.url[0].childImageSharp\n            : image.childImageSharp\n          : null\n\n      return images\n    }, {})\n  }\n  return {}\n}\n"
  },
  {
    "path": "README.md",
    "content": "<a href=\"https://gatsbythemeterminal.gatsbyjs.io/\" target=\"_blank\">\n<img src=\"https://gatsbythemeterminal.gatsbyjs.io/images/terminal-open-graph-image.jpg\" alt=\"gatsby-theme-termninal main image\" />\n</a>\n\n## gatsby-theme-terminal\n\nGatsby Theme Terminal aims to be a **zero component theme**. It provides _data_ components to aid in the abstraction of\npresentational and data layers which together provide the most flexibility\n\nThe theme handles the data but how it's displayed is up to you!\n\nYou can create any page layout or component combination you like using your own components or components provided by\n[theme-ui/components](https://theme-ui.com/components)\n\n## 👀 Preview\n\n- [Live Demo](https://gatsbythemeterminal.gatsbyjs.io/)\n\n## 🚀 Getting started\n\nTo help you get started you can either clone the starter\n[gatsby-starter-terminal](https://github.com/PaulieScanlon/gatsby-starter-terminal) or read the below.\n\n### Install\n\n```\nnpm install @pauliescanlon/gatsby-theme-terminal\n```\n\n### Install Peer Dependencies\n\n```\nnpm install @mdx-js/mdx @mdx-js/react gatsby gatsby-plugin-mdx gatsby-source-filesystem react react-dom\n```\n\n## Setup\n\n### gatsby-config.js\n\nAdd the `siteMetaData` and `@pauliescanlon/gatsby-theme-terminal` to your `gatsby-config.js`\n\n```\n// gatsby-config.js\nmodule.exports = {\n  siteMetadata: {\n    name: \"Your blog title\",\n    description: \"I like tech\",\n    keywords: [\"tech\", \"blog\", \"boop\"],\n    siteUrl: 'https://gatsby-theme-terminal.netlify.com',\n    siteImage: 'name-of-open-graph-image.jpg', // pop an image in the static folder to use it as the og:image,\n    profileImage: 'name-of-profile-image.jpg'\n    lang: `eng`,\n    config: {\n      sidebarWidth: 240 // optional,\n    },\n  },\n  plugins: ['@pauliescanlon/gatsby-theme-terminal']\n}\n```\n\n### directory structure\n\nTo add pages create `.mdx` files in the `src/pages` directory. You need at least one file called `index.mdx` located at\n`src/pages` or you'll see a GraphQL error.\n\n<!-- prettier-ignore -->\n```\n|-- src\n    |-- pages\n        |-- index.mdx\n        |-- about.mdx\n        |-- contact.mdx \n\n```\n\n### frontmatter setup\n\n#### Pages\n\nPages must include `navigationLabel` in the `frontmatter`\n\n```\n// src/pages/about.mdx\n---\nnavigationLabel: About\n---\n\n# About\n\nThis is about page\n\n```\n\n#### Theme options\n\nAdditional `.mdx` can be sourced from _anywhere_ outside the `pages` directory but you need to tell the theme where to\nsource these files from.\n\nUse the `source` option in `gatsby-config.js`\n\n```\n// gatsby-config.js\n...\n  plugins: [\n    {\n      resolve: `@pauliescanlon/gatsby-theme-terminal`,\n      options: {\n        source: [\n          {\n            name: \"posts\",\n            dir: \"posts\",\n          },\n          {\n            name: \"projects\",\n            dir: \"projects\",\n          },\n        ] // can be an object or array of objects\n\n      },\n    },\n  ],\n}\n```\n\nThen create the relevant files and directories\n\n<!-- prettier-ignore -->\n```\n|-- src\n    |-- pages\n    ...\n    |-- posts \n      |--2020\n        |--02\n          |-- some-post.mdx\n          |-- featuredImage: markus-spiske-466ENaLuhLY-unsplash.jpg\n          |-- markus-spiske-FXFz-sW0uwo-unsplash.jpg\n    |-- projects\n      |-- some-project.mdx  \n\n```\n\nAny file that is _not_ sourced from `pages` can contain any of the following `frontmatter` but a `title` is required,\nthis is how the theme distinguishes between pages and other `.mdx` files\n\n<!-- prettier-ignore -->\n```\n// src/posts/2020/02/some-post.mdx\n---\ntitle: Some Post\ntags: [\"JavaScript\", \"React\", \"GatsbyJs\", \"HTML\", \"CSS\", \"theme-ui\"]\ndate: 2020-01-01\ndateModified: 20-20-2020\nauthor: Paul Scanlon\nstatus: draft // => means it won't be rendered\nisPrivate: // => it will be rendered but you can use this prop as a filter\nurl: \"https://example.com\"  // => could be an external url\nmisc: \"Ahoy\" // => use how you wish\npinned: false // => Could be used as a filter for pinned posts\nfeaturedImage: markus-spiske-466ENaLuhLY-unsplash.jpg\nfeaturedImageUrl: https://via.placeholder.com/936x528\nembeddedImages:\n  - markus-spiske-FXFz-sW0uwo-unsplash.jpg\nembeddedImageUrls:\n  - https://via.placeholder.com/468x264\n---\n```\n\n### Embedded Images\n\nBy using the The `<GatsbyImage />` component from `gatsby-plugin-image` you can pass the image data queried by GraphQL\nand pass it on via the `image` prop\n\nThe `gatsbyImageData`, data is available via `props.embedded.image(n)`\n\n```\n<GatsbyImage image={props.embedded.image1} />\n```\n\nYou can also use the Theme UI `<Image />` component by passing it a `src`\n\n```\n<Image src={props.embedded.image1.gatsbyImageData.images.fallback.src} />\n```\n\n`image1` in this example would be `markus-spiske-FXFz-sW0uwo-unsplash.jpg`\n\nEmbeddedImages can also be sourced from a remote url, in this case use the `<Image />` component and pass it the same\nprops\n\n```\n<Image src={props.embedded.image2.gatsbyImageData.images.fallback.src} />\n```\n\n### markdown\n\nThe theme supports the complete markdown spec and you can see how to use markdown in the\n[demo](https://gatsbythemeterminal.gatsbyjs.io/markdown/)\n\n### theme-ui/components\n\nThe theme supports _all_ the components provided by [theme-ui/components](https://theme-ui.com/components) and you can\nsee in the [demo](https://gatsbythemeterminal.gatsbyjs.io/theme-ui-components/) how they are used.\n\n### gatsby-theme-terminal/components\n\nThe theme also comes with it's own components _but_... These are purely to provide access to the source nodes. What you\nchoose to render is completely up to you!\n\nFor example to display a list of _all_ files sourced from the `source` theme option you _could_ do something like this.\nThis component can be used in ANY `.mdx` file 😎\n\n```javascript\n<SourceList>\n  {(source) => (\n    <ul>\n      {source.map((edge, index) => {\n        const {\n          frontmatter: { title },\n        } = edge.node\n        return <li key={index}>{title}</li>\n      })}\n    </ul>\n  )}\n</SourceList>\n```\n\nYou can see more about how to use the theme components in the\n[demo](https://gatsbythemeterminal.gatsbyjs.io/components/)\n\n### Component Shadowing\n\nThere is very little to shadow because almost everything is exposed by the components but you might want to add your own\nlogo.\n\nTo do this create the following directories `@pauliescanlon/gatsby-theme-terminal/components/Logo` in the `src`\ndirectory of your project and then create a `Logo.js` file. You can do anything you like in here.\n\n```\n|-- src\n    |-- @pauliescanlon\n      |-- gatsby-theme-terminal\n        |-- components\n          |-- Logo\n            |-- Logo.js\n```\n\nIf you would like to customize any part of the theme you can do so by shadowing the theme file.\n\nTo do this create the following directory `src/gatsby-plugin-theme-ui` and then create an `index.js`\n\n```javascript\n// src/gatsby-plugin-theme-ui/index.js\n\nimport baseTheme from '@pauliescanlon/gatsby-theme-terminal/src/gatsby-plugin-theme-ui'\n\nexport default {\n  ...baseTheme,\n  colors: {\n    ...baseTheme.colors,\n    primary: '#FF4081',\n    secondary: '#03A9F4',\n    success: '#FFEB3B',\n    background: '#232323',\n    surface: '#393939',\n  },\n}\n```\n\n### favicon\n\nfavicon(s) need to be saved in `static/images` and named `favicon-16x16.png` and `favicon-32x32.png` along with an\n`.icon` file called `favicon.ico`\n\nIf you're using **gatsby-theme-terminal** in your project i'd love to hear from you\n[@pauliescanlon](https://twitter.com/PaulieScanlon)\n\n[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P31B7G8)\n"
  },
  {
    "path": "copy-readme.js",
    "content": "const fs = require('fs')\n\nfs.copyFile('./README.md', './@pauliescanlon/gatsby-theme-terminal/README.md', (err) => {\n  if (err) {\n    throw err\n  }\n  console.log('README copied to theme ok!')\n})\n"
  },
  {
    "path": "demo/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 gatsbyjs\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "demo/README.md",
    "content": "<!-- AUTO-GENERATED-CONTENT:START (STARTER) -->\n<p align=\"center\">\n  <a href=\"https://www.gatsbyjs.org\">\n    <img alt=\"Gatsby\" src=\"https://www.gatsbyjs.org/monogram.svg\" width=\"60\" />\n  </a>\n</p>\n<h1 align=\"center\">\n  Gatsby's default starter\n</h1>\n\nKick off your project with this default boilerplate. This starter ships with the main Gatsby configuration files you might need to get up and running blazing fast with the blazing fast app generator for React.\n\n_Have another more specific idea? You may want to check out our vibrant collection of [official and community-created starters](https://www.gatsbyjs.org/docs/gatsby-starters/)._\n\n## 🚀 Quick start\n\n1.  **Create a Gatsby site.**\n\n    Use the Gatsby CLI to create a new site, specifying the default starter.\n\n    ```shell\n    # create a new Gatsby site using the default starter\n    gatsby new my-default-starter https://github.com/gatsbyjs/gatsby-starter-default\n    ```\n\n1.  **Start developing.**\n\n    Navigate into your new site’s directory and start it up.\n\n    ```shell\n    cd my-default-starter/\n    gatsby develop\n    ```\n\n1.  **Open the source code and start editing!**\n\n    Your site is now running at `http://localhost:8000`!\n\n    _Note: You'll also see a second link: _`http://localhost:8000/___graphql`_. This is a tool you can use to experiment with querying your data. Learn more about using this tool in the [Gatsby tutorial](https://www.gatsbyjs.org/tutorial/part-five/#introducing-graphiql)._\n\n    Open the `my-default-starter` directory in your code editor of choice and edit `src/pages/index.js`. Save your changes and the browser will update in real time!\n\n## 🧐 What's inside?\n\nA quick look at the top-level files and directories you'll see in a Gatsby project.\n\n    .\n    ├── node_modules\n    ├── src\n    ├── .gitignore\n    ├── .prettierrc\n    ├── gatsby-browser.js\n    ├── gatsby-config.js\n    ├── gatsby-node.js\n    ├── gatsby-ssr.js\n    ├── LICENSE\n    ├── package-lock.json\n    ├── package.json\n    └── README.md\n\n1.  **`/node_modules`**: This directory contains all of the modules of code that your project depends on (npm packages) are automatically installed.\n\n2.  **`/src`**: This directory will contain all of the code related to what you will see on the front-end of your site (what you see in the browser) such as your site header or a page template. `src` is a convention for “source code”.\n\n3.  **`.gitignore`**: This file tells git which files it should not track / not maintain a version history for.\n\n4.  **`.prettierrc`**: This is a configuration file for [Prettier](https://prettier.io/). Prettier is a tool to help keep the formatting of your code consistent.\n\n5.  **`gatsby-browser.js`**: This file is where Gatsby expects to find any usage of the [Gatsby browser APIs](https://www.gatsbyjs.org/docs/browser-apis/) (if any). These allow customization/extension of default Gatsby settings affecting the browser.\n\n6.  **`gatsby-config.js`**: This is the main configuration file for a Gatsby site. This is where you can specify information about your site (metadata) like the site title and description, which Gatsby plugins you’d like to include, etc. (Check out the [config docs](https://www.gatsbyjs.org/docs/gatsby-config/) for more detail).\n\n7.  **`gatsby-node.js`**: This file is where Gatsby expects to find any usage of the [Gatsby Node APIs](https://www.gatsbyjs.org/docs/node-apis/) (if any). These allow customization/extension of default Gatsby settings affecting pieces of the site build process.\n\n8.  **`gatsby-ssr.js`**: This file is where Gatsby expects to find any usage of the [Gatsby server-side rendering APIs](https://www.gatsbyjs.org/docs/ssr-apis/) (if any). These allow customization of default Gatsby settings affecting server-side rendering.\n\n9.  **`LICENSE`**: Gatsby is licensed under the MIT license.\n\n10. **`package-lock.json`** (See `package.json` below, first). This is an automatically generated file based on the exact versions of your npm dependencies that were installed for your project. **(You won’t change this file directly).**\n\n11. **`package.json`**: A manifest file for Node.js projects, which includes things like metadata (the project’s name, author, etc). This manifest is how npm knows which packages to install for your project.\n\n12. **`README.md`**: A text file containing useful reference information about your project.\n\n## 🎓 Learning Gatsby\n\nLooking for more guidance? Full documentation for Gatsby lives [on the website](https://www.gatsbyjs.org/). Here are some places to start:\n\n- **For most developers, we recommend starting with our [in-depth tutorial for creating a site with Gatsby](https://www.gatsbyjs.org/tutorial/).** It starts with zero assumptions about your level of ability and walks through every step of the process.\n\n- **To dive straight into code samples, head [to our documentation](https://www.gatsbyjs.org/docs/).** In particular, check out the _Guides_, _API Reference_, and _Advanced Tutorials_ sections in the sidebar.\n\n## 💫 Deploy\n\n[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/gatsbyjs/gatsby-starter-default)\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n"
  },
  {
    "path": "demo/gatsby-browser.js",
    "content": "/**\n * Implement Gatsby's Browser APIs in this file.\n *\n * See: https://www.gatsbyjs.org/docs/browser-apis/\n */\n\n// You can delete this file if you're not using it\n"
  },
  {
    "path": "demo/gatsby-config.js",
    "content": "module.exports = {\n  siteMetadata: {\n    name: `gatsby-theme-terminal`,\n    description: `A zero component Gatsby theme for developers`,\n    keywords: [`gatsby`, `gatsbyjs`, `gatsby-theme`],\n    siteUrl: `https://gatsbythemeterminal.gatsbyjs.io`,\n    siteImage: `https://gatsbythemeterminal.gatsbyjs.io/images/terminal-open-graph-image.jpg`,\n    profileImage: `https://gatsbythemeterminal.gatsbyjs.io/images/terminal-profile-image.jpg`,\n    lang: `en`,\n    config: {\n      sidebarWidth: 280,\n    },\n  },\n  plugins: [\n    {\n      resolve: `@pauliescanlon/gatsby-theme-terminal`,\n      options: {\n        source: [\n          {\n            name: 'posts',\n            dir: 'posts',\n          },\n          {\n            name: 'projects',\n            dir: 'projects',\n          },\n        ],\n      },\n    },\n    {\n      resolve: 'gatsby-plugin-google-analytics',\n      options: {\n        trackingId: 'UA-76055934-8',\n      },\n    },\n  ],\n}\n"
  },
  {
    "path": "demo/gatsby-node.js",
    "content": "/**\n * Implement Gatsby's Node APIs in this file.\n *\n * See: https://www.gatsbyjs.org/docs/node-apis/\n */\n\n// You can delete this file if you're not using it\n"
  },
  {
    "path": "demo/gatsby-ssr.js",
    "content": "/**\n * Implement Gatsby's SSR (Server Side Rendering) APIs in this file.\n *\n * See: https://www.gatsbyjs.org/docs/ssr-apis/\n */\n\n// You can delete this file if you're not using it\n"
  },
  {
    "path": "demo/package.json",
    "content": "{\n  \"name\": \"demo\",\n  \"private\": true,\n  \"description\": \"A simple starter using gatsby-theme-terminal\",\n  \"version\": \"0.1.0\",\n  \"author\": \"Paul Scanlon <pauliescanlon@gmail.com>\",\n  \"dependencies\": {\n    \"@mdx-js/mdx\": \"^1.6.22\",\n    \"@mdx-js/react\": \"^1.6.22\",\n    \"@pauliescanlon/gatsby-theme-terminal\": \"*\",\n    \"date-fns\": \"^2.23.0\",\n    \"gatsby\": \"^4.0.0\",\n    \"gatsby-plugin-google-analytics\": \"^4.0.0\",\n    \"gatsby-plugin-mdx\": \"^3.0.0\",\n    \"gatsby-source-filesystem\": \"^4.0.0\",\n    \"react\": \"^17.0.0\",\n    \"react-dom\": \"^17.0.0\"\n  },\n  \"keywords\": [\n    \"gatsby\"\n  ],\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"gatsby build\",\n    \"develop\": \"gatsby develop\",\n    \"format\": \"prettier --write \\\"**/*.{js,jsx,json}\\\"\",\n    \"start\": \"npm run develop\",\n    \"serve\": \"gatsby serve\",\n    \"clean\": \"gatsby clean\",\n    \"test\": \"echo \\\"Write tests! -> https://gatsby.dev/unit-testing\\\" && exit 1\"\n  },\n  \"browserslist\": [\n    \">0.25%\",\n    \"not dead\",\n    \"IE 11\"\n  ]\n}\n"
  },
  {
    "path": "demo/src/@pauliescanlon/gatsby-theme-terminal/components/Logo/Logo.js",
    "content": "/** @jsx jsx */\nimport { Box, jsx } from 'theme-ui'\nimport { Link as GatsbyLink } from 'gatsby'\n\nexport const Logo = () => (\n  <Box\n    sx={{\n      a: {\n        ':focus': {\n          outline: 'none',\n        },\n      },\n    }}\n  >\n    <GatsbyLink to=\"/\">\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        viewBox=\"0 0 96 25\"\n        width=\"96\"\n        height=\"25\"\n        sx={{\n          mt: 2,\n        }}\n      >\n        <g>\n          <path\n            sx={{ fill: 'success' }}\n            d=\"M2.6,12.5c0-5.1,4.2-9.4,9.4-9.4l0,0V0.5c-3,0-5.6,1-7.8,2.9c-5,4.4-5.5,11.9-1.2,16.9l2-1.7\n\tC3.5,17,2.6,14.8,2.6,12.5z\"\n          />\n          <path\n            sx={{ fill: 'secondary' }}\n            d=\"M12,21.9c-2.8,0-5.4-1.2-7.1-3.2l-2,1.7c0.4,0.5,0.9,0.9,1.4,1.3c5,4.3,12.6,3.6,16.8-1.5l-2-1.7\n\tC17.4,20.6,14.8,21.9,12,21.9z\"\n          />\n          <path\n            sx={{ fill: 'primary' }}\n            d=\"M12,0.5v2.6c5.1,0,9.4,4.2,9.4,9.4c0,2.3-0.8,4.4-2.2,6l2,1.7c1.9-2.3,2.8-4.7,2.8-7.7\n\tC23.9,5.9,18.6,0.5,12,0.5z\"\n          />\n\n          <path sx={{ fill: 'text' }} d=\"M11.3,16V9.9h-2V8.8h5.3v1.1h-2V16H11.3z\" />\n        </g>\n\n        <g>\n          <path sx={{ fill: 'text' }} d=\"M32.4,18.5V9.6h-2.9V8h7.8v1.7h-3v8.9H32.4z\" />\n          <path\n            sx={{ fill: 'text' }}\n            d=\"M40.2,18.3c-0.6-0.3-1.1-0.8-1.4-1.4c-0.3-0.6-0.5-1.4-0.5-2.2c0-0.9,0.2-1.6,0.5-2.2c0.3-0.6,0.8-1.1,1.3-1.5\n\t\ts1.2-0.5,1.9-0.5c0.6,0,1.2,0.1,1.7,0.4c0.5,0.3,0.9,0.7,1.2,1.3c0.3,0.6,0.4,1.3,0.4,2.1c0,0.1,0,0.3,0,0.6l0,0.2h-5.2\n\t\tc0.1,0.7,0.3,1.3,0.7,1.6c0.4,0.4,0.8,0.6,1.3,0.6c0.4,0,0.7-0.1,1.1-0.3c0.4-0.2,0.7-0.4,0.9-0.7l1.1,1.1c-0.8,1-1.8,1.4-3,1.4\n\t\tC41.5,18.8,40.8,18.7,40.2,18.3z M43.5,13.7c0-0.3-0.1-0.6-0.2-0.9c-0.1-0.3-0.3-0.5-0.6-0.7c-0.2-0.2-0.5-0.3-0.8-0.3\n\t\tc-0.5,0-0.8,0.2-1.2,0.5c-0.3,0.3-0.5,0.8-0.5,1.3H43.5z\"\n          />\n          <path\n            sx={{ fill: 'text' }}\n            d=\"M53.3,13L53.3,13c-0.2-0.4-0.4-0.6-0.7-0.7c-0.2-0.1-0.5-0.2-0.9-0.2c-0.4,0-0.8,0.1-1.1,0.3\n\t\tc-0.3,0.2-0.6,0.5-0.8,0.8s-0.3,0.8-0.3,1.2v4.1h-1.9v-7.9h2v1.1c0.2-0.4,0.5-0.7,0.9-1c0.4-0.2,0.9-0.3,1.4-0.3\n\t\tc0.4,0,0.8,0.1,1.2,0.2c0.4,0.1,0.7,0.4,1,0.7L53.3,13z M53,13C53,13,53,13,53,13C53.1,13,53.1,13,53,13c0.1,0.1,0.2,0.1,0.2,0.1\n\t\tl0,0L53,13L53,13z M53.3,13c0,0.1,0,0.1,0,0.1c0,0,0,0,0,0C53.3,13.2,53.3,13.1,53.3,13L53.3,13z\"\n          />\n          <path\n            sx={{ fill: 'text' }}\n            d=\"M55.2,10.5h1.6V11c0.2-0.2,0.4-0.4,0.6-0.6c0.2-0.1,0.5-0.2,0.8-0.2c0.3,0,0.5,0.1,0.8,0.2\n\t\tc0.2,0.1,0.4,0.4,0.6,0.7c0.2-0.3,0.4-0.6,0.7-0.7c0.2-0.2,0.6-0.2,0.9-0.2c0.6,0,1,0.2,1.2,0.6c0.2,0.4,0.4,1,0.4,1.8v5.9H61V13\n\t\tc0-0.4,0-0.8-0.1-0.9s-0.2-0.3-0.4-0.3c-0.4,0-0.6,0.5-0.6,1.6v5.2h-1.7v-5.4c0-0.5,0-0.9-0.1-1s-0.2-0.3-0.4-0.3\n\t\tc-0.2,0-0.4,0.1-0.5,0.3c-0.1,0.2-0.2,0.6-0.2,1.2v5.3h-1.7V10.5z\"\n          />\n          <path\n            sx={{ fill: 'text' }}\n            d=\"M64.6,18.5V17h1.9v-4.9h-1.8v-1.5h3.7V17h1.7v1.5H64.6z M66.8,9.1c-0.2-0.1-0.3-0.2-0.4-0.4\n\t\tc-0.1-0.2-0.2-0.4-0.2-0.6c0-0.3,0.1-0.6,0.3-0.8C66.7,7.1,67,7,67.4,7C67.6,7,67.8,7,68,7.2c0.2,0.1,0.3,0.2,0.4,0.4\n\t\tc0.1,0.2,0.2,0.4,0.2,0.6c0,0.2-0.1,0.4-0.2,0.6C68.3,8.9,68.2,9,68,9.1c-0.2,0.1-0.4,0.2-0.6,0.2C67.2,9.2,67,9.2,66.8,9.1z\"\n          />\n          <path\n            sx={{ fill: 'text' }}\n            d=\"M72.6,10.6h1.9v0.8c0.3-0.3,0.6-0.6,1-0.7c0.4-0.2,0.8-0.3,1.3-0.3c0.8,0,1.4,0.3,1.8,0.8\n\t\tc0.5,0.5,0.7,1.4,0.7,2.5v4.8h-1.9v-4.8c0-0.6-0.1-1-0.3-1.3c-0.2-0.3-0.5-0.4-1-0.4c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5\n\t\ts-0.2,0.5-0.2,0.8v5.1h-1.9V10.6z\"\n          />\n          <path\n            sx={{ fill: 'text' }}\n            d=\"M86.7,11.1c0.6,0.5,0.9,1.4,0.9,2.6v4.8h-1.8v-0.7c-0.3,0.3-0.7,0.5-1.1,0.7c-0.4,0.2-0.9,0.2-1.4,0.2\n\t\tc-0.8,0-1.5-0.2-1.9-0.6c-0.4-0.4-0.6-1-0.6-1.7c0-0.6,0.2-1,0.5-1.4s0.9-0.7,1.5-0.9c0.7-0.2,1.5-0.3,2.4-0.3h0.6\n\t\tc-0.1-0.7-0.2-1.2-0.5-1.5c-0.3-0.3-0.7-0.4-1.3-0.4c-0.4,0-0.7,0.1-1.1,0.3c-0.4,0.2-0.8,0.5-1.1,0.8l-1-1.3c0.5-0.5,1-0.8,1.6-1\n\t\tc0.6-0.2,1.1-0.3,1.7-0.3C85.2,10.4,86.1,10.6,86.7,11.1z M85.3,16.8c0.3-0.4,0.5-0.9,0.6-1.7h-0.4c-1,0-1.7,0.1-2.1,0.3\n\t\ts-0.7,0.5-0.7,1c0,0.3,0.1,0.5,0.3,0.7c0.2,0.1,0.5,0.2,0.9,0.2C84.5,17.3,85,17.1,85.3,16.8z\"\n          />\n          <path sx={{ fill: 'text' }} d=\"M89.7,18.5v-1.5h2.2V8.6h-2.1V7.1h4v10H96v1.5H89.7z\" />\n        </g>\n      </svg>\n    </GatsbyLink>\n  </Box>\n)\n"
  },
  {
    "path": "demo/src/_temp/source-days.mdx",
    "content": "---\nnavigationLabel: SourceDays\n---\n\n<SourceDays>\n  {(sourceDays) => {\n    const currentYear = sourceDays[sourceDays.length - 1]\n    return (\n      <Box>\n        {currentYear\n          .sort((a, b) => a.number - b.number)\n          .map((day, index) => {\n            const { name, count, percent } = day\n            return (\n              <Flex\n                key={index}\n                sx={{\n                  backgroundColor: 'surface',\n                  flexDirection: 'column',\n                  mb: 2,\n                  position: 'relative',\n                }}\n              >\n                <Box\n                  sx={{\n                    backgroundColor: 'primary',\n                    height: '100%',\n                    position: 'absolute',\n                    width: `${percent}%`,\n                  }}\n                />\n                <Box\n                  sx={{\n                    position: 'relative',\n                    display: 'flex',\n                    justifyContent: 'space-between',\n                  }}\n                >\n                  <Text sx={{ textTransform: 'capitalize', pl: 2 }}>{name}</Text>\n                  <Text sx={{ pr: 2 }}>{`x${count}`}</Text>\n                </Box>\n              </Flex>\n            )\n          })}\n      </Box>\n    )\n  }}\n</SourceDays>\n"
  },
  {
    "path": "demo/src/_temp/source-list.mdx",
    "content": "---\nnavigationLabel: sourceList\n---\n\n<SourceList>\n  {(source) => (\n    <ul>\n      {source.map((edge, index) => {\n        const {\n          frontmatter: { title },\n        } = edge.node\n        return <li key={index}>{title}</li>\n      })}\n    </ul>\n  )}\n</SourceList>\n"
  },
  {
    "path": "demo/src/_temp/source-months.mdx",
    "content": "---\nnavigationLabel: SourceMonths\n---\n\n<SourceMonths>\n  {(sourceMonths) => {\n    const currentYear = sourceMonths[sourceMonths.length - 1]\n    return (\n      <Box sx={{ backgroundColor: 'surface', p: 3 }}>\n        <Heading variant=\"styles.h4\">{currentYear[0].year}</Heading>\n        <Box sx={{ display: 'flex', flex: '1 1 auto', height: 300 }}>\n          <Flex sx={{ flexWrap: 'wrap', width: '100%' }}>\n            {currentYear.map((month, index) => {\n              const { initial, count, percent } = month\n              return (\n                <Box\n                  key={index}\n                  sx={{\n                    display: 'flex',\n                    flexDirection: 'column',\n                    justifyContent: 'flex-end',\n                    pl: 1,\n                    pr: 1,\n                    width: `${100 / currentYear.length}%`,\n                  }}\n                >\n                  <Text\n                    sx={{\n                      textAlign: 'center',\n                    }}\n                  >\n                    {`x${count}`}\n                  </Text>\n                  <Box\n                    sx={{\n                      backgroundColor: 'primary',\n                      height: `${percent}%`,\n                      p: 1,\n                    }}\n                  />\n                  <Text\n                    sx={{\n                      textTransform: 'uppercase',\n                      textAlign: 'center',\n                    }}\n                  >\n                    {initial}\n                  </Text>\n                </Box>\n              )\n            })}\n          </Flex>\n        </Box>\n      </Box>\n    )\n  }}\n</SourceMonths>\n"
  },
  {
    "path": "demo/src/_temp/source-tags.mdx",
    "content": "---\nnavigationLabel: SourceTags\n---\n\n<SourceTags>\n  {(source) => (\n    <Flex sx={{ flexDirection: 'column' }}>\n      {source.map((tag, index) => {\n        const { name, count, percent } = tag\n        return (\n          <Box key={index}>\n            {`${name}  x${count}`}\n            <Box mb={2} bg=\"muted\" sx={{ width: `${percent}%`, height: 4 }}></Box>\n          </Box>\n        )\n      })}\n    </Flex>\n  )}\n</SourceTags>\n"
  },
  {
    "path": "demo/src/_temp/source-words.mdx",
    "content": "---\nnavigationLabel: SourceWords\n---\n\n<SourceWords>\n  {(source) => {\n    const { wordCountTotal, wordCountAverage, wordCountHighest, wordCountLowest, timeToReadTotal, timeToReadAverage } =\n      source\n    return (\n      <Flex\n        sx={{\n          flexWrap: 'wrap',\n          mx: (theme) => `-${theme.space[2]}px`,\n        }}\n      >\n        <Box\n          sx={{\n            display: 'flex',\n            flex: '1 1 auto',\n            flexDirection: 'column',\n            mb: 3,\n            px: 2,\n            width: ['100%', '50%', '33.333333333%'],\n          }}\n        >\n          <Flex\n            sx={{\n              alignItems: 'center',\n              backgroundColor: 'surface',\n              flex: '1 1 auto',\n              flexDirection: 'column',\n              justifyContent: 'center',\n              p: 3,\n              position: 'relative',\n            }}\n          >\n            <Heading as=\"h4\" variant=\"styles.h4\">\n              Average word count\n            </Heading>\n            <Donut sx={{ mx: 3, mb: 2 }} value={wordCountAverage / wordCountTotal} />\n            <Box sx={{ position: 'absolute' }}>\n              <Text\n                sx={{\n                  textAlign: 'center',\n                  color: 'primary',\n                  fontSize: '22px',\n                  fontWeight: 'bold',\n                  lineHeight: '1',\n                }}\n              >\n                {wordCountAverage}\n              </Text>\n              <Text sx={{ textAlign: 'center', color: 'primary', lineHeight: '1' }}>Words</Text>\n            </Box>\n            <Text sx={{ textAlign: 'center' }}>{`Total words: ${wordCountTotal}`}</Text>\n          </Flex>\n        </Box>\n        <Box\n          sx={{\n            display: 'flex',\n            flex: '1 1 auto',\n            flexDirection: 'column',\n            mb: 3,\n            px: 2,\n            width: ['100%', '50%', '33.333333333%'],\n          }}\n        >\n          <Flex\n            sx={{\n              alignItems: 'center',\n              backgroundColor: 'surface',\n              flex: '1 1 auto',\n              flexDirection: 'column',\n              justifyContent: 'center',\n              p: 3,\n              position: 'relative',\n            }}\n          >\n            <Heading as=\"h4\" variant=\"styles.h4\">\n              Average time to read\n            </Heading>\n            <Donut variant=\"styles.donut.secondary\" sx={{ mx: 3, mb: 2 }} value={timeToReadAverage / timeToReadTotal} />\n            <Box sx={{ position: 'absolute' }}>\n              <Text\n                sx={{\n                  textAlign: 'center',\n                  color: 'secondary',\n                  fontSize: '20px',\n                  fontWeight: 'bold',\n                  lineHeight: '1',\n                }}\n              >\n                {timeToReadAverage}\n              </Text>\n              <Text sx={{ textAlign: 'center', color: 'secondary', lineHeight: '1' }}>Minute</Text>\n            </Box>\n            <Text sx={{ textAlign: 'center' }}>{`Total read time: ${timeToReadTotal} mins`}</Text>\n          </Flex>\n        </Box>\n        <Box\n          sx={{\n            display: 'flex',\n            flex: '1 1 auto',\n            flexDirection: 'column',\n            mb: 3,\n            px: 2,\n            width: ['100%', '50%', '33.333333333%'],\n          }}\n        >\n          <Flex\n            sx={{\n              alignItems: 'center',\n              backgroundColor: 'surface',\n              flex: '1 1 auto',\n              flexDirection: 'column',\n              justifyContent: 'center',\n              p: 3,\n              position: 'relative',\n            }}\n          >\n            <Heading as=\"h4\" variant=\"styles.h4\">\n              Highest word count\n            </Heading>\n            <Donut variant=\"styles.donut.success\" sx={{ mx: 3, mb: 2 }} value={wordCountHighest / wordCountTotal} />\n            <Box sx={{ position: 'absolute' }}>\n              <Text\n                sx={{\n                  textAlign: 'center',\n                  color: 'success',\n                  fontSize: '20px',\n                  fontWeight: 'bold',\n                  lineHeight: '1',\n                }}\n              >\n                {wordCountHighest}\n              </Text>\n              <Text sx={{ textAlign: 'center', color: 'success', lineHeight: '1' }}>Words</Text>\n            </Box>\n            <Text sx={{ textAlign: 'center' }}>{`Total words: ${wordCountTotal}`}</Text>\n          </Flex>\n        </Box>\n      </Flex>\n    )\n  }}\n</SourceWords>\n"
  },
  {
    "path": "demo/src/pages/components.mdx",
    "content": "---\nnavigationLabel: Components\n---\n\n# [gatsby-theme-terminal](#-gatsby-theme-terminal)\n\ngatsby-theme-terminal has some of it's own components, and below is how you use them.\n\n## [SiteMetaData](#site-meta-data)\n\nThe `<SiteMetaData />` component returns all fields specified by `siteMetadata` in `gatsby-config.js`\n\n```javascript\n<SiteMetaData>\n  {(siteMetadata) => {\n    const { name, description } = siteMetadata\n    return (\n      <ul>\n        <li>{name}</li>\n        <li>{description}</li>\n      </ul>\n    )\n  }}\n</SiteMetaData>\n```\n\n<SiteMetaData>\n  {(siteMetadata) => {\n    const { name, description } = siteMetadata\n    return (\n      <ul>\n        <li>{name}</li>\n        <li>{description}</li>\n      </ul>\n    )\n  }}\n</SiteMetaData>\n\n<Divider />\n\n## [SourceList](#source-list)\n\nBy default the source list returns all `.mdx` found from the directories defined in `gatsby-config.js`. You can also use\nthe `filter` prop with this component eg: `<SourceList filter='posts' />`\n\n_NOTE:_ the `filter` source _must_ be one from your `gatsby-config.js`\n\n```javascript\n<SourceList>\n  {(source) => (\n    <ul>\n      {source.map((edge, index) => {\n        const {\n          frontmatter: { title },\n        } = edge.node\n        return <li key={index}>{title}</li>\n      })}\n    </ul>\n  )}\n</SourceList>\n```\n\n<SourceList>\n  {(source) => (\n    <ul>\n      {source.map((edge, index) => {\n        const {\n          frontmatter: { title },\n        } = edge.node\n        return <li key={index}>{title}</li>\n      })}\n    </ul>\n  )}\n</SourceList>\n\n<Divider />\n\n## [SourceDays](#source-days)\n\nBy default source days returns an accumulated count and percent of all `frontmatter` date fields grouped by year. You\ncan also use the `filter` prop with this component eg: `<SourceDays filter='posts' />`\n\n_NOTE:_ the `filter` source _must_ be one from your `gatsby-config.js`\n\n```javascript\n<SourceDays>\n  {(sourceDays) => {\n    const currentYear = sourceDays[sourceDays.length - 1]\n    return (\n      <Box>\n        {currentYear\n          .sort((a, b) => a.number - b.number)\n          .map((day, index) => {\n            const { name, count, percent } = day\n            return (\n              <Flex\n                key={index}\n                sx={{\n                  backgroundColor: 'surface',\n                  flexDirection: 'column',\n                  mb: 2,\n                  position: 'relative',\n                }}\n              >\n                <Box\n                  sx={{\n                    backgroundColor: 'primary',\n                    height: '100%',\n                    position: 'absolute',\n                    width: `${percent}%`,\n                  }}\n                />\n                <Box\n                  sx={{\n                    position: 'relative',\n                    display: 'flex',\n                    justifyContent: 'space-between',\n                  }}\n                >\n                  <Text sx={{ textTransform: 'capitalize', pl: 2 }}>{name}</Text>\n                  <Text sx={{ pr: 2 }}>{`x${count}`}</Text>\n                </Box>\n              </Flex>\n            )\n          })}\n      </Box>\n    )\n  }}\n</SourceDays>\n```\n\n<SourceDays>\n  {(sourceDays) => {\n    const currentYear = sourceDays[sourceDays.length - 1]\n    return (\n      <Box>\n        {currentYear\n          .sort((a, b) => a.number - b.number)\n          .map((day, index) => {\n            const { name, count, percent } = day\n            return (\n              <Flex\n                key={index}\n                sx={{\n                  backgroundColor: 'surface',\n                  flexDirection: 'column',\n                  mb: 2,\n                  position: 'relative',\n                }}\n              >\n                <Box\n                  sx={{\n                    backgroundColor: 'primary',\n                    height: '100%',\n                    position: 'absolute',\n                    width: `${percent}%`,\n                  }}\n                />\n                <Box\n                  sx={{\n                    position: 'relative',\n                    display: 'flex',\n                    justifyContent: 'space-between',\n                  }}\n                >\n                  <Text sx={{ textTransform: 'capitalize', pl: 2 }}>{name}</Text>\n                  <Text sx={{ pr: 2 }}>{`x${count}`}</Text>\n                </Box>\n              </Flex>\n            )\n          })}\n      </Box>\n    )\n  }}\n</SourceDays>\n\n<Divider />\n\n## [SourceMonths](#source-months)\n\nBy default source months returns an accumulated count and percent of all `frontmatter` date fields grouped by year. You\ncan also use the `filter` prop with this component eg: `<SourceMonths filter='posts' />`\n\n_NOTE:_ the `filter` source _must_ be one from your `gatsby-config.js`\n\n```javascript\n<SourceMonths>\n  {(sourceMonths) => {\n    const currentYear = sourceMonths[sourceMonths.length - 1]\n    return (\n      <Box sx={{ backgroundColor: 'surface', p: 3 }}>\n        <Heading variant=\"styles.h4\">{currentYear[0].year}</Heading>\n        <Box sx={{ display: 'flex', flex: '1 1 auto', height: 300 }}>\n          <Flex sx={{ flexWrap: 'wrap', width: '100%' }}>\n            {currentYear.map((month, index) => {\n              const { initial, count, percent } = month\n              return (\n                <Box\n                  key={index}\n                  sx={{\n                    display: 'flex',\n                    flexDirection: 'column',\n                    justifyContent: 'flex-end',\n                    pl: 1,\n                    pr: 1,\n                    width: `${100 / currentYear.length}%`,\n                  }}\n                >\n                  <Text\n                    sx={{\n                      textAlign: 'center',\n                    }}\n                  >\n                    {`x${count}`}\n                  </Text>\n                  <Box\n                    sx={{\n                      backgroundColor: 'primary',\n                      height: `${percent}%`,\n                      p: 1,\n                    }}\n                  />\n                  <Text\n                    sx={{\n                      textTransform: 'uppercase',\n                      textAlign: 'center',\n                    }}\n                  >\n                    {initial}\n                  </Text>\n                </Box>\n              )\n            })}\n          </Flex>\n        </Box>\n      </Box>\n    )\n  }}\n</SourceMonths>\n```\n\n<SourceMonths>\n  {(sourceMonths) => {\n    const currentYear = sourceMonths[sourceMonths.length - 1]\n    return (\n      <Box sx={{ backgroundColor: 'surface', p: 3 }}>\n        <Heading variant=\"styles.h4\">{currentYear[0].year}</Heading>\n        <Box sx={{ display: 'flex', flex: '1 1 auto', height: 300 }}>\n          <Flex sx={{ flexWrap: 'wrap', width: '100%' }}>\n            {currentYear.map((month, index) => {\n              const { initial, count, percent } = month\n              return (\n                <Box\n                  key={index}\n                  sx={{\n                    display: 'flex',\n                    flexDirection: 'column',\n                    justifyContent: 'flex-end',\n                    pl: 1,\n                    pr: 1,\n                    width: `${100 / currentYear.length}%`,\n                  }}\n                >\n                  <Text\n                    sx={{\n                      textAlign: 'center',\n                    }}\n                  >\n                    {`x${count}`}\n                  </Text>\n                  <Box\n                    sx={{\n                      backgroundColor: 'primary',\n                      height: `${percent}%`,\n                      p: 1,\n                    }}\n                  />\n                  <Text\n                    sx={{\n                      textTransform: 'uppercase',\n                      textAlign: 'center',\n                    }}\n                  >\n                    {initial}\n                  </Text>\n                </Box>\n              )\n            })}\n          </Flex>\n        </Box>\n      </Box>\n    )\n  }}\n</SourceMonths>\n\n<Divider />\n\n## [SourceTags](#tag-list)\n\nBy default source tags returns all tags found in the `.mdx` sourced from the directories defined in `gatsby-config.js.\n\nYou can also use the `filter` prop with this component eg: `<SourceTags filter='posts' />`\n\n_NOTE:_ the `filter` source _must_ be one from your `gatsby-config.js``\n\n```javascript\n<SourceTags>\n  {source => (\n    <Flex\n    sx={{flexDirection: 'column'}}\n    >\n      {\n        source.map((tag, index) => {\n          const {name, count, percent} = tag\n          return (<Box  key={index}>\n            {`${name}  x${count}`}\n            <Box mb={2}  bg='muted' sx={{width: `${percent}%`, height: 4}} />\n          </Box>\n        })\n      }\n    </Flex>\n  )}\n</SourceTags>\n```\n\n<SourceTags>\n  {(source) => (\n    <Flex sx={{ flexDirection: 'column' }}>\n      {source.map((tag, index) => {\n        const { name, count, percent } = tag\n        return (\n          <Box key={index}>\n            {`${name}  x${count}`}\n            <Box mb={2} bg=\"muted\" sx={{ width: `${percent}%`, height: 4 }}></Box>\n          </Box>\n        )\n      })}\n    </Flex>\n  )}\n</SourceTags>\n\n<Divider />\n\n## [embeddedImages](#embedded-images)\n\nUsing a frontmatter field called `embeddedImages` you can define a _list_ of locally sourced images to embed in the\n`.mdx` body.\n\n_NOTE:_ this method won't work for `.mdx` sourced from `src/pages`\n\n```javascript\n---\ntitle: Post 1\nembeddedImages:\n  - markus-spiske-FXFz-sW0uwo-unsplash.jpg\n---\n```\n\n<Divider />\n\nYou can then use the `<EmbeddedImage />` component like this in your `.mdx`.\n\nThe `image1` object key refers to the position in the `embeddedImages` list in frontmatter\n\n<Divider />\n\n```javascript\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi\n\n<EmbeddedImage src={props.embedded.image1} />\n```\n\n<Divider />\n\n## [SourceWords](#source-words)\n\nBy default source words returns a word count for all words found in the `.mdx` sourced from the directories defined in\n`gatsby-config.js.\n\nYou can also use the `filter` prop with this component eg: `<SourceTags filter='posts' />`\n\n_NOTE:_ the `filter` source _must_ be one from your `gatsby-config.js``\n\n```javascript\n<SourceWords>\n  {(source) => {\n    const { wordCountTotal, wordCountAverage, wordCountHighest, wordCountLowest, timeToReadTotal, timeToReadAverage } =\n      source\n    return (\n      <Box\n        sx={{\n          display: 'flex',\n          flex: '1 1 auto',\n          flexDirection: 'column',\n          mb: 3,\n          px: 2,\n          width: ['100%', '50%', '33.333333333%'],\n        }}\n      >\n        <Flex\n          sx={{\n            alignItems: 'center',\n            backgroundColor: 'surface',\n            flex: '1 1 auto',\n            flexDirection: 'column',\n            justifyContent: 'center',\n            p: 3,\n            position: 'relative',\n          }}\n        >\n          <Heading as=\"h4\" variant=\"styles.h4\">\n            Average word count\n          </Heading>\n          <Donut sx={{ mx: 3, mb: 2 }} value={wordCountAverage / wordCountTotal} />\n          <Box sx={{ position: 'absolute' }}>\n            <Text\n              sx={{\n                textAlign: 'center',\n                color: 'primary',\n                fontSize: '22px',\n                fontWeight: 'bold',\n                lineHeight: '1',\n              }}\n            >\n              {wordCountAverage}\n            </Text>\n            <Text sx={{ textAlign: 'center', color: 'primary', lineHeight: '1' }}>Words</Text>\n          </Box>\n          <Text sx={{ textAlign: 'center' }}>{`Total words: ${wordCountTotal}`}</Text>\n        </Flex>\n      </Box>\n    )\n  }}\n</SourceWords>\n```\n\n<SourceWords>\n  {(source) => {\n    const { wordCountTotal, wordCountAverage, wordCountHighest, wordCountLowest, timeToReadTotal, timeToReadAverage } =\n      source\n    return (\n      <Flex\n        sx={{\n          flexWrap: 'wrap',\n          mx: (theme) => `-${theme.space[2]}px`,\n        }}\n      >\n        <Box\n          sx={{\n            display: 'flex',\n            flex: '1 1 auto',\n            flexDirection: 'column',\n            mb: 3,\n            px: 2,\n            width: ['100%', '50%', '33.333333333%'],\n          }}\n        >\n          <Flex\n            sx={{\n              alignItems: 'center',\n              backgroundColor: 'surface',\n              flex: '1 1 auto',\n              flexDirection: 'column',\n              justifyContent: 'center',\n              p: 3,\n              position: 'relative',\n            }}\n          >\n            <Heading as=\"h4\" variant=\"styles.h4\">\n              Average word count\n            </Heading>\n            <Donut sx={{ mx: 3, mb: 2 }} value={wordCountAverage / wordCountTotal} />\n            <Box sx={{ position: 'absolute' }}>\n              <Text\n                sx={{\n                  textAlign: 'center',\n                  color: 'primary',\n                  fontSize: '22px',\n                  fontWeight: 'bold',\n                  lineHeight: '1',\n                }}\n              >\n                {wordCountAverage}\n              </Text>\n              <Text sx={{ textAlign: 'center', color: 'primary', lineHeight: '1' }}>Words</Text>\n            </Box>\n            <Text sx={{ textAlign: 'center' }}>{`Total words: ${wordCountTotal}`}</Text>\n          </Flex>\n        </Box>\n        <Box\n          sx={{\n            display: 'flex',\n            flex: '1 1 auto',\n            flexDirection: 'column',\n            mb: 3,\n            px: 2,\n            width: ['100%', '50%', '33.333333333%'],\n          }}\n        >\n          <Flex\n            sx={{\n              alignItems: 'center',\n              backgroundColor: 'surface',\n              flex: '1 1 auto',\n              flexDirection: 'column',\n              justifyContent: 'center',\n              p: 3,\n              position: 'relative',\n            }}\n          >\n            <Heading as=\"h4\" variant=\"styles.h4\">\n              Average time to read\n            </Heading>\n            <Donut variant=\"styles.donut.secondary\" sx={{ mx: 3, mb: 2 }} value={timeToReadAverage / timeToReadTotal} />\n            <Box sx={{ position: 'absolute' }}>\n              <Text\n                sx={{\n                  textAlign: 'center',\n                  color: 'secondary',\n                  fontSize: '20px',\n                  fontWeight: 'bold',\n                  lineHeight: '1',\n                }}\n              >\n                {timeToReadAverage}\n              </Text>\n              <Text sx={{ textAlign: 'center', color: 'secondary', lineHeight: '1' }}>Minute</Text>\n            </Box>\n            <Text sx={{ textAlign: 'center' }}>{`Total read time: ${timeToReadTotal} mins`}</Text>\n          </Flex>\n        </Box>\n        <Box\n          sx={{\n            display: 'flex',\n            flex: '1 1 auto',\n            flexDirection: 'column',\n            mb: 3,\n            px: 2,\n            width: ['100%', '50%', '33.333333333%'],\n          }}\n        >\n          <Flex\n            sx={{\n              alignItems: 'center',\n              backgroundColor: 'surface',\n              flex: '1 1 auto',\n              flexDirection: 'column',\n              justifyContent: 'center',\n              p: 3,\n              position: 'relative',\n            }}\n          >\n            <Heading as=\"h4\" variant=\"styles.h4\">\n              Highest word count\n            </Heading>\n            <Donut variant=\"styles.donut.success\" sx={{ mx: 3, mb: 2 }} value={wordCountHighest / wordCountTotal} />\n            <Box sx={{ position: 'absolute' }}>\n              <Text\n                sx={{\n                  textAlign: 'center',\n                  color: 'success',\n                  fontSize: '20px',\n                  fontWeight: 'bold',\n                  lineHeight: '1',\n                }}\n              >\n                {wordCountHighest}\n              </Text>\n              <Text sx={{ textAlign: 'center', color: 'success', lineHeight: '1' }}>Words</Text>\n            </Box>\n            <Text sx={{ textAlign: 'center' }}>{`Total words: ${wordCountTotal}`}</Text>\n          </Flex>\n        </Box>\n      </Flex>\n    )\n  }}\n</SourceWords>\n\n<Divider />\n\n```javascript\n<SourceWords>\n  {(sourceWords) => {\n    const currentYear = sourceWords.wordCountByMonth[sourceWords.wordCountByMonth.length - 1]\n    return (\n      <Box sx={{ backgroundColor: 'surface', p: 3 }}>\n        <Flex>\n          <Heading variant=\"styles.h4\" sx={{ mr: 2 }}>\n            {currentYear[0].year}\n          </Heading>\n          <Text>Word count by month</Text>\n        </Flex>\n        <Box sx={{ display: 'flex', flex: '1 1 auto', height: 300 }}>\n          <Flex sx={{ flexWrap: 'wrap', width: '100%' }}>\n            {currentYear.map((month, index) => {\n              const { initial, words } = month\n              return (\n                <Box\n                  key={index}\n                  sx={{\n                    display: 'flex',\n                    flexDirection: 'column',\n                    justifyContent: 'flex-end',\n                    pl: 1,\n                    pr: 1,\n                    width: `${100 / currentYear.length}%`,\n                  }}\n                >\n                  <Text\n                    sx={{\n                      textAlign: 'center',\n                    }}\n                  >\n                    {`x${words}`}\n                  </Text>\n                  <Box\n                    sx={{\n                      backgroundColor: 'primary',\n                      height: `${words}%`,\n                      p: 1,\n                    }}\n                  />\n                  <Text\n                    sx={{\n                      textTransform: 'uppercase',\n                      textAlign: 'center',\n                    }}\n                  >\n                    {initial}\n                  </Text>\n                </Box>\n              )\n            })}\n          </Flex>\n        </Box>\n      </Box>\n    )\n  }}\n</SourceWords>\n```\n\n<SourceWords>\n  {(sourceWords) => {\n    const currentYear = sourceWords.wordCountByMonth[sourceWords.wordCountByMonth.length - 1]\n    return (\n      <Box sx={{ backgroundColor: 'surface', p: 3 }}>\n        <Flex>\n          <Heading variant=\"styles.h4\" sx={{ mr: 2 }}>\n            {currentYear[0].year}\n          </Heading>\n          <Text>Word count by month</Text>\n        </Flex>\n        <Box sx={{ display: 'flex', flex: '1 1 auto', height: 300 }}>\n          <Flex sx={{ flexWrap: 'wrap', width: '100%' }}>\n            {currentYear.map((month, index) => {\n              const { initial, words } = month\n              return (\n                <Box\n                  key={index}\n                  sx={{\n                    display: 'flex',\n                    flexDirection: 'column',\n                    justifyContent: 'flex-end',\n                    pl: 1,\n                    pr: 1,\n                    width: `${100 / currentYear.length}%`,\n                  }}\n                >\n                  <Text\n                    sx={{\n                      textAlign: 'center',\n                    }}\n                  >\n                    {`x${words}`}\n                  </Text>\n                  <Box\n                    sx={{\n                      backgroundColor: 'primary',\n                      height: `${words}%`,\n                      p: 1,\n                    }}\n                  />\n                  <Text\n                    sx={{\n                      textTransform: 'uppercase',\n                      textAlign: 'center',\n                    }}\n                  >\n                    {initial}\n                  </Text>\n                </Box>\n              )\n            })}\n          </Flex>\n        </Box>\n      </Box>\n    )\n  }}\n</SourceWords>\n"
  },
  {
    "path": "demo/src/pages/index.mdx",
    "content": "---\nnavigationLabel: Home\n---\n\nimport { format } from 'date-fns'\n\n<Grid\n  sx={{\n    mb: 6\n  }}\n>\n\n<SiteMetaData>\n  {(siteMetadata) => {\n    const { name, description } = siteMetadata\n    return (\n      <Fragment>\n        <Heading variant=\"styles.h1\">{name}</Heading>\n        <Text>{description}</Text>\n      </Fragment>\n    )\n  }}\n</SiteMetaData>\n\n<Grid\n  sx={{ \n    alignItems: 'center',\n    gridTemplateColumns: 'auto 1fr'\n  }}\n>\n<Button\n  sx={{ mb: 2 }}\n  as=\"a\"\n  variant=\"success\"\n  href=\"https://github.com/PaulieScanlon/gatsby-theme-terminal\"\n  target=\"_blank\"\n>\n  View theme on GitHub\n</Button>\n\n<Link sx={{ whiteSpace: 'nowrap' }} href=\"https://github.com/PaulieScanlon/gatsby-theme-terminal\" target=\"_blank\">\n  gatsby-theme-terminal\n</Link>\n</Grid>\n\n<Alert variant=\"success\">Alert... My website is faster than yours!</Alert>\n\n</Grid>\n\n<Grid\n  sx={{\n    gap: 0,\n    mb: 6\n  }}\n>\n\n## About\n\nWrite anything you want in `src/pages/index.mdx` and it'll go here.\n\n</Grid>\n\n<Grid sx={{ gridTemplateColumns: ['1fr', '1fr', '1fr 1fr'] }}>  \n<Box>\n\n## Contact\n\n<Heading variant=\"styles.h3\" sx={{ mb: 0 }}>\n  Email\n</Heading>\n<Link href=\"mailto:******@gmail.com\" variant=\"styles.a\">\n  ******@gmail.com\n</Link>\n\n<Heading variant=\"styles.h3\" sx={{ mb: 0 }}>\n  Twitter\n</Heading>\n<Link href=\"https://twitter.com/PaulieScanlon/\" variant=\"styles.a\">\n  https://twitter.com/PaulieScanlon/\n</Link>\n\n<Heading variant=\"styles.h3\" sx={{ mb: 0 }}>\n  GitHub\n</Heading>\n<Link href=\"https://github.com/PaulieScanlon/\" variant=\"styles.a\">\n  https://github.com/PaulieScanlon/\n</Link>\n\n<Heading variant=\"styles.h3\" sx={{ mb: 0 }}>\n  LinkedIn\n</Heading>\n<Link href=\"https://www.linkedin.com/in/PaulieScanlon/\" variant=\"styles.a\">\n  https://linkedin.com/in/PaulieScanlon/\n</Link>\n\n</Box>\n\n<Box>\n\n## Top 5 tags\n\n<SourceTags filter=\"posts\">\n  {(tags) => (\n    <Flex sx={{ flexDirection: 'column' }}>\n      {tags\n        .splice(0, 5)\n        .sort((a, b) => b.percent - a.percent)\n        .map((tag, index) => {\n          const { name, count, percent } = tag\n          return (\n            <Box key={index} sx={{ color: 'muted', mb: 3, svg: { fill: 'muted' } }}>\n              <Flex sx={{ lineHeight: 'normal' }}>\n                <Text sx={{ color: 'secondary', mr: 2, mb: 0 }}>{`${name}`}</Text>\n                <Text sx={{ color: 'muted' }}>{percent}</Text>\n                <Text sx={{ color: 'error' }}>%</Text>\n              </Flex>\n              <Flex>\n                <Box>{'['}</Box>\n                <Box sx={{ flexBasis: '100%' }}>\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1200 8\" width=\"100%\" height=\"8\">\n                    <rect width={`${percent * 3}%`} height={4} />\n                  </svg>\n                </Box>\n                <Box> {']'}</Box>\n              </Flex>\n            </Box>\n          )\n        })}\n    </Flex>\n  )}\n</SourceTags>\n</Box>\n\n</Grid>\n"
  },
  {
    "path": "demo/src/pages/markdown.mdx",
    "content": "---\nnavigationLabel: Markdown\n---\n\n# [markdown](#markdown)\n\ngatsby-theme-terminal supports the full set of\n[markdown shortcodes](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)\n\n<hr />\n\n## [Heading](#heading)\n\n```markdown\n# h1\n\n## h2\n\n### h3\n\n#### h4\n\n##### h5\n\n###### h6\n\nAlternatively, for h1 and h2, an underline-ish style:\n\n# Alt-h1\n\nAlt-h2\n```\n\n# h1\n\n## h2\n\n### h3\n\n#### h4\n\n##### h5\n\n###### h6\n\nAlternatively, for h1 and h2, an underline-ish style:\n\n## [Alt-h1](#alt-h1)\n\nAlt-h2\n\n## [Emphasis](#emphasis)\n\n```markdown\nEmphasis, aka italics, with _asterisks_ or _underscores_.\n\nStrong emphasis, aka bold, with **asterisks** or **underscores**.\n\nCombined emphasis with **asterisks and _underscores_**.\n\nStrikethrough uses two tildes. ~~Scratch this.~~\n```\n\nEmphasis, aka italics, with _asterisks_ or _underscores_.\n\nStrong emphasis, aka bold, with **asterisks** or **underscores**.\n\nCombined emphasis with **asterisks and _underscores_**.\n\nStrikethrough uses two tildes. ~~Scratch this.~~\n\n<hr />\n\n## [Lists](#lists)\n\n(In this example, leading and trailing spaces are shown with with dots: ⋅)\n\n```markdown\n1. First ordered list item\n2. Another item\n3. Actual numbers don't matter, just that it's a number\n4. And another item.\n5. Code in list `boop`\n\n- Unordered list can use asterisks\n\n* Or minuses\n\n- Or pluses\n```\n\n1. First ordered list item\n2. Another item\n3. Actual numbers don't matter, just that it's a number\n4. And another item.\n5. Code in list `boop`\n\n- Unordered list can use asterisks\n\n* Or minuses\n\n- Or pluses\n\n<hr />\n\n## [Links](#links)\n\nThere are two ways to create links.\n\n```markdown\n[I'm an inline-style link](https://www.google.com)\n\n[I'm an inline-style link with title](https://www.google.com \"Google's Homepage\")\n\n[I'm a reference-style link][arbitrary case-insensitive reference text]\n\n[I'm a relative reference to a repository file](../blob/master/LICENSE)\n\n[You can use numbers for reference-style link definitions][1]\n\nOr leave it empty and use the [link text itself].\n\nURLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or\n<http://www.example.com> and sometimes example.com (but not on Github, for example).\n\nSome text to show that the reference links can follow later.\n\n[arbitrary case-insensitive reference text]: https://www.mozilla.org\n[1]: http://slashdot.org\n[link text itself]: http://www.reddit.com\n```\n\n[I'm an inline-style link](https://www.google.com)\n\n[I'm an inline-style link with title](https://www.google.com \"Google's Homepage\")\n\n[I'm a reference-style link][arbitrary case-insensitive reference text]\n\n[I'm a relative reference to a repository file](../blob/master/LICENSE)\n\n[You can use numbers for reference-style link definitions][1]\n\nOr leave it empty and use the [link text itself].\n\nURLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or\n<http://www.example.com> and sometimes example.com (but not on Github, for example).\n\nSome text to show that the reference links can follow later.\n\n[arbitrary case-insensitive reference text]: https://www.mozilla.org\n[1]: http://slashdot.org\n[link text itself]: http://www.reddit.com\n\n## [Images](#images)\n\n```markdown\nHere's our logo (hover to see the title text):\n\nInline-style:\n![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png 'Logo Title Text 1')\n\nReference-style: ![alt text][logo]\n\n[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png 'Logo Title Text 2'\n```\n\nHere's our logo (hover to see the title text):\n\nInline-style:\n![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png 'Logo Title Text 1')\n\nReference-style: ![alt text][logo]\n\n[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png 'Logo Title Text 2'\n\n## [Code and Syntax Highlighting](#code-and-syntax-highlighting)\n\nCode blocks are part of the Markdown spec, but syntax highlighting isn't.\n\n```markdown\nInline `code` has `back-ticks around` it.\n```\n\nInline `code` has `back-ticks around` it.\n\nBlocks of code are either fenced by lines with three back-ticks ```, or are indented with four spaces. I recommend only\nusing the fenced code blocks -- they're easier and only they support syntax highlighting, but you must provide a\nlanguage or none\n\n````markdown\n```javascript\nvar s = 'JavaScript syntax highlighting'\nalert(s)\n```\n\n```python\ns = \"Python syntax highlighting\"\nprint s\n```\n\n```html\n<div>HTML syntax highlighting</div>\n```\n\n```none\nvar s = \"JavaScript syntax highlighting\"\nalert(s)\n```\n````\n\n```javascript\nvar s = 'JavaScript syntax highlighting'\nalert(s)\n```\n\n```python\ns = \"Python syntax highlighting\"\nprint s\n```\n\n```html\n<div>HTML syntax highlighting</div>\n```\n\n```none\nvar s = \"JavaScript syntax highlighting\"\nalert(s)\n```\n\n## [Tables](#tables)\n\nTables aren't part of the core Markdown spec, but they are part of GFM and Markdown Here supports them. They are an easy\nway of adding tables to your email -- a task that would otherwise require copy-pasting from another application.\n\n```markdown\nColons can be used to align columns.\n\n| Tables        |      Are      |   Cool |\n| ------------- | :-----------: | -----: |\n| col 3 is      | right-aligned | \\$1600 |\n| col 2 is      |   centered    |   \\$12 |\n| zebra stripes |   are neat    |    \\$1 |\n\nThere must be at least 3 dashes separating each header cell. The outer pipes (|) are optional, and you don't need to\nmake the raw Markdown line up prettily. You can also use inline Markdown.\n\n| Markdown | Less      | Pretty     |\n| -------- | --------- | ---------- |\n| _Still_  | `renders` | **nicely** |\n| 1        | 2         | 3          |\n```\n\nColons can be used to align columns.\n\n| Tables        |      Are      |   Cool |\n| ------------- | :-----------: | -----: |\n| col 3 is      | right-aligned | \\$1600 |\n| col 2 is      |   centered    |   \\$12 |\n| zebra stripes |   are neat    |    \\$1 |\n\nThere must be at least 3 dashes separating each header cell. The outer pipes (|) are optional, and you don't need to\nmake the raw Markdown line up prettily. You can also use inline Markdown.\n\n| Markdown | Less      | Pretty     |\n| -------- | --------- | ---------- |\n| _Still_  | `renders` | **nicely** |\n| 1        | 2         | 3          |\n\n<hr />\n\n## [Blockquotes](#blockquotes)\n\n```markdown\n> Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.\n\nQuote break.\n\n> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this\n> is long enough to actually wrap for everyone. Oh, you can _put_ **Markdown** into a blockquote.\n```\n\n> Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.\n\nQuote break.\n\n> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this\n> is long enough to actually wrap for everyone. Oh, you can _put_ **Markdown** into a blockquote.\n\n## [Inline HTML](#inline-html)\n\nYou can also use raw HTML in your Markdown, and it'll mostly work pretty well.\n\n```markdown\n<dl>\n  <dt>Definition list</dt>\n  <dd>Is something people use sometimes.</dd>\n\n  <dt>Markdown in HTML</dt>\n  <dd>Does *not* work **very** well. Use HTML <em>tags</em>.</dd>\n</dl>\n```\n\n<dl>\n  <dt>Definition list</dt>\n  <dd>Is something people use sometimes.</dd>\n\n  <dt>Markdown in HTML</dt>\n  <dd>Does *not* work **very** well. Use HTML <em>tags</em>.</dd>\n</dl>\n\n<hr />\n\n## [Horizontal Rule](#horizontal-rule)\n\n```markdown\nThree or more...\n\n---\n\nHyphens\n\n---\n\nAsterisks\n\n---\n\nUnderscores\n```\n\nThree or more...\n\n---\n\nHyphens\n\n---\n\nAsterisks\n\n---\n\nUnderscores\n\n## [Line Breaks](#line-breaks)\n\nMy basic recommendation for learning how line breaks work is to experiment and discover -- hit `<Enter>` once (i.e.,\ninsert one newline), then hit it twice (i.e., insert two new lines), see what happens. You'll soon learn to get what you\nwant. \"Markdown Toggle\" is your friend.\n\n```markdown\nHere's a line for us to start with.\n\nThis line is separated from the one above by two newlines, so it will be a _separate paragraph_.\n\nThis line is also a separate paragraph, but... This line is only separated by a single newline, so it's a separate line\nin the _same paragraph_.\n```\n"
  },
  {
    "path": "demo/src/pages/posts.mdx",
    "content": "---\nnavigationLabel: Posts\n---\n\nimport { format } from 'date-fns'\n\n# posts\n\nYou can use the `<SourceList filter=\"posts\" />` component from any `.mdx`.\n\nHere we use it to return all the `posts` by using the filter prop\n\n<SourceList filter=\"posts\">\n  {(posts) => (\n    <Grid\n      sx={{\n        gridTemplateColumns: ['1fr', '1fr', '1fr 1fr'],\n      }}\n    >\n      {posts\n        .filter((edge) => !edge.node.frontmatter.isPrivate)\n        .reduce((routes, route) => {\n          return route.node.frontmatter.pinned ? [route, ...routes] : [...routes, route]\n        }, [])\n        .map((edge, index) => {\n          const {\n            featuredImageUrl,\n            frontmatter: { title, featuredImage, tags, date, pinned },\n            excerpt,\n            fields: { slug },\n          } = edge.node\n          return (\n            <Box\n              key={index}\n              sx={{\n                display: 'flex',\n                flex: '1 1 auto',\n                flexDirection: 'column',\n              }}\n            >\n              <Link\n                href={slug}\n                sx={{\n                  textDecoration: 'none',\n                  display: 'flex',\n                  flex: '1 1 auto',\n                  flexDirection: 'column',\n                  minHeight: '1px',\n                }}\n              >\n                <Card\n                  sx={{\n                    display: 'flex',\n                    flex: '1 1 auto',\n                    flexDirection: 'column',\n                    minHeight: '1px',\n                  }}\n                >\n                  <Box sx={{ minHeight: '1px' }}>\n                    {featuredImage ? <GatsbyImage alt={title} image={featuredImage.childImageSharp} /> : null}\n                    {featuredImageUrl ? <GatsbyImage alt={title} image={featuredImageUrl.childImageSharp} /> : null}\n                  </Box>\n                  <Box\n                    sx={{\n                      display: 'flex',\n                      flex: '1 1 auto',\n                      flexDirection: 'column',\n                      p: 3,\n                    }}\n                  >\n                    <Heading variant=\"styles.h4\" sx={{ color: pinned ? 'primary' : 'text' }}>\n                      {title}\n                    </Heading>\n                    <Text sx={{ mb: 1, color: 'muted' }}>{format(new Date(date), 'd-MMM-u')}</Text>\n                    <Text sx={{ mb: 1, color: 'text' }}>{excerpt}</Text>\n                  </Box>\n                  <Box sx={{ p: 3 }}>\n                    <Text>View Post</Text>\n                  </Box>\n                </Card>\n              </Link>\n            </Box>\n          )\n        })}\n    </Grid>\n  )}\n</SourceList>\n"
  },
  {
    "path": "demo/src/pages/projects.mdx",
    "content": "---\nnavigationLabel: Projects\n---\n\nimport { format } from 'date-fns'\n\n# projects\n\nYou can use the `<SourceList filter=\"projects\" />` component from any `.mdx`.\n\nHere we use it to return all the `projects` by using the filter prop\n\n<SourceList filter=\"projects\">\n  {(projects) => (\n    <Grid\n      sx={{\n        gridTemplateColumns: ['1fr', '1fr', '1fr 1fr'],\n      }}\n    >\n      {projects\n        .filter((edge) => !edge.node.frontmatter.isPrivate)\n        .reduce((routes, route) => {\n          return route.node.frontmatter.pinned ? [route, ...routes] : [...routes, route]\n        }, [])\n        .map((edge, index) => {\n          const {\n            featuredImageUrl,\n            frontmatter: { title, featuredImage, tags, date, pinned },\n            excerpt,\n            fields: { slug },\n          } = edge.node\n          return (\n            <Box\n              key={index}\n              sx={{\n                display: 'flex',\n                flex: '1 1 auto',\n                flexDirection: 'column',\n              }}\n            >\n              <Link\n                href={slug}\n                sx={{\n                  textDecoration: 'none',\n                  display: 'flex',\n                  flex: '1 1 auto',\n                  flexDirection: 'column',\n                  minHeight: '1px',\n                }}\n              >\n                <Card\n                  sx={{\n                    display: 'flex',\n                    flex: '1 1 auto',\n                    flexDirection: 'column',\n                    minHeight: '1px',\n                  }}\n                >\n                  <Box sx={{ minHeight: '1px' }}>\n                    {featuredImage ? <GatsbyImage alt={title} image={featuredImage.childImageSharp} /> : null}\n                    {featuredImageUrl ? <GatsbyImage alt={title} image={featuredImageUrl.url.childImageSharp} /> : null}\n                  </Box>\n                  <Box\n                    sx={{\n                      display: 'flex',\n                      flex: '1 1 auto',\n                      flexDirection: 'column',\n                      p: 3,\n                    }}\n                  >\n                    <Heading variant=\"styles.h4\" sx={{ color: pinned ? 'primary' : 'text' }}>\n                      {title}\n                    </Heading>\n                    <Text sx={{ mb: 1, color: 'muted' }}>{format(new Date(date), 'd-MMM-u')}</Text>\n                    <Text sx={{ mb: 1, color: 'text' }}>{excerpt}</Text>\n                  </Box>\n                  <Box sx={{ p: 3 }}>\n                    <Text>View Post</Text>\n                  </Box>\n                </Card>\n              </Link>\n            </Box>\n          )\n        })}\n    </Grid>\n  )}\n</SourceList>\n"
  },
  {
    "path": "demo/src/pages/theme-ui-components.mdx",
    "content": "---\nnavigationLabel: Theme UI\n---\n\n# [theme-ui/components](#theme-ui-components)\n\ngatsby-theme-terminal also supports the full set of [theme-ui/components](https://theme-ui.com/components) and below is\nhow you use them.\n\nIf you'd like to see the default theme `.js` that file can be found in\n[here](https://github.com/PaulieScanlon/gatsby-theme-terminal/blob/master/%40pauliescanlon/gatsby-theme-terminal/src/gatsby-plugin-theme-ui/index.js)\n\n## [Box](#box)\n\n```javascript\n<Box p={4} color=\"white\" bg=\"primary\">\n  Beep\n</Box>\n```\n\n<Box p={4} color=\"white\" bg=\"primary\">\n  Beep\n</Box>\n\n<Divider />\n\n## [Flex](#flex)\n\n```javascript\n<Flex>\n  <Box p={2} bg=\"primary\" sx={{ flex: '1 1 auto' }}>\n    Flex\n  </Box>\n  <Box p={2} bg=\"muted\">\n    Box\n  </Box>\n</Flex>\n```\n\n<Flex>\n  <Box p={2} bg=\"primary\" sx={{ flex: '1 1 auto' }}>\n    Flex\n  </Box>\n  <Box p={2} bg=\"muted\">\n    Box\n  </Box>\n</Flex>\n\n<Divider />\n\n## [Grid](#grid)\n\n```javascript\n<Grid gap={2} columns={[2, '1fr 2fr']}>\n  <Box bg=\"primary\">Box</Box>\n  <Box bg=\"muted\">Box</Box>\n</Grid>\n```\n\n<Grid gap={2} columns={[2, '1fr 2fr']}>\n  <Box bg=\"primary\">Box</Box>\n  <Box bg=\"muted\">Box</Box>\n</Grid>\n\n<Divider />\n\n## [Buttons](#buttons)\n\n```javascript\n<Button>primary</Button>\n<Button variant='secondary'>secondary</Button>\n<Button variant='success'>success</Button>\n<Button variant='error'>error</Button>\n<Button variant='ghost' />\n```\n\n<Grid sx={{ gridTemplateColumns: 'auto auto auto auto auto' }}>\n  <Button>primary</Button>\n  <Button variant=\"secondary\">secondary</Button>\n  <Button variant=\"success\">success</Button>\n  <Button variant=\"error\">error</Button>\n  <Button variant=\"ghost\">ghost</Button>\n</Grid>\n\n<Divider />\n\n## [Text](#text)\n\n```javascript\n<Text>Hello</Text>\n<Text as=\"p\" >Hello</Text>\n<Text as=\"p\">Hello <Link href='www.example.com'>www.example.com</Link></Text>\n<Text variant='styles.small'>Hello</Text>\n```\n\n<Text>Hello</Text>\n<Text as=\"p\">Hello</Text>\n<Text as=\"p\">\n  Hello <Link href=\"www.example.com\">www.example.com</Link>\n</Text>\n<Text variant=\"styles.small\">Hello</Text>\n\n<Divider />\n\n## [Heading](#heading)\n\n```javascript\n<Heading as='h1' variant='styles.h1'>h1</Heading>\n<Heading as='h2 'variant='styles.h2'>h2</Heading>\n<Heading as='h3 'variant='styles.h3'>h3</Heading>\n<Heading as='h4 'variant='styles.h4'>h4</Heading>\n<Heading as='h5 'variant='styles.h5'>h5</Heading>\n<Heading as='h6 'variant='styles.h6'>h6</Heading>\n```\n\n<Heading as=\"h1\" variant=\"styles.h1\">\n  h1\n</Heading>\n<Heading as=\"h2\" variant=\"styles.h2\">\n  h2\n</Heading>\n<Heading as=\"h3\" variant=\"styles.h3\">\n  h3\n</Heading>\n<Heading as=\"h4\" variant=\"styles.h4\">\n  h4\n</Heading>\n<Heading as=\"h5\" variant=\"styles.h5\">\n  h5\n</Heading>\n<Heading as=\"h6\" variant=\"styles.h6\">\n  h6\n</Heading>\n\n## [Link](#link)\n\n```javascript\n<Link href=\"#!\">Hello</Link>\n```\n\n<Link href=\"#!\">Hello</Link>\n\n<Divider />\n\n## [Image](#image)\n\n```javascript\n<Image src=\"https://placekitten.com/g/400/400\" />\n```\n\n<Image src=\"https://placekitten.com/g/400/400\" />\n\n<Divider />\n\n## [Card](#card)\n\n```javascript\n<Card\n  sx={{\n    maxWidth: 400,\n  }}\n>\n  <Image src=\"https://placekitten.com/g/800/600\" />\n  <Box p={3}>\n    <Heading variant=\"styles.h4\">Heading</Heading>\n    <Text>Text</Text>\n  </Box>\n</Card>\n```\n\n<Card\n  sx={{\n    maxWidth: 400,\n  }}\n>\n  <Image src=\"https://placekitten.com/g/800/600\" />\n  <Box p={3}>\n    <Heading variant=\"styles.h4\">Heading</Heading>\n    <Text>Text</Text>\n  </Box>\n</Card>\n\n<Divider />\n\n## [Forms](#forms)\n\n```javascript\n<Box as=\"form\">\n  <Label htmlFor=\"input\">Input</Label>\n  <Input name=\"username\" mb={3} />\n\n  <Label mb={3}>\n    <Checkbox />\n    Checkbox\n  </Label>\n\n  <Label mb={3}>\n    <Radio name=\"radio\" /> Radio A\n  </Label>\n  <Label mb={3}>\n    <Radio name=\"radio\" /> Radio B\n  </Label>\n\n  <Label htmlFor=\"select\">Select</Label>\n  <Select name=\"select\" mb={3}>\n    <option>Beep</option>\n    <option>Boop</option>\n    <option>Blip</option>\n  </Select>\n\n  <Label htmlFor=\"textarea\">Text Area</Label>\n  <Textarea name=\"textarea\" rows=\"6\" mb={3} />\n</Box>\n```\n\n<Box as='form' >\n<Label htmlFor='input'>Input</Label>\n<Input\n  name='username'\n  mb={3}\n/>\n\n<Label mb={3}>\n  <Checkbox />\n  Checkbox\n</Label>\n\n<Label mb={3}>\n  <Radio name=\"radio\" /> Radio A\n</Label>\n<Label mb={3}>\n  <Radio name=\"radio\" /> Radio B\n</Label>\n\n<Label htmlFor=\"select\">Select</Label>\n<Select name=\"select\" mb={3}>\n  <option>Beep</option>\n  <option>Boop</option>\n  <option>Blip</option>\n</Select>\n\n<Label htmlFor='textarea'>Text Area</Label>\n<Textarea\n  name='textarea'\n  rows='6'\n  mb={3}\n/>\n</Box>\n\n## [Label](#label)\n\n```javascript\n<Label htmlFor=\"input\">Label</Label>\n```\n\n<Label htmlFor=\"input\">Label</Label>\n\n<Divider />\n\n## [Input](#input)\n\n```javascript\n<Input name=\"username\" />\n```\n\n<Input name=\"username\" />\n\n<Divider />\n\n## [Select](#select)\n\n```javascript\n<Select defaultValue=\"Hello\">\n  <option>Hello</option>\n  <option>Hi</option>\n  <option>Beep</option>\n  <option>Boop</option>\n</Select>\n```\n\n<Select defaultValue=\"Hello\">\n  <option>Hello</option>\n  <option>Hi</option>\n  <option>Beep</option>\n  <option>Boop</option>\n</Select>\n\n<Divider />\n\n## [Textarea](#text-area)\n\n```javascript\n<Textarea defaultValue=\"Hello\" rows={8} />\n```\n\n<Textarea defaultValue=\"Hello\" rows={8} />\n\n<Divider />\n\n## [Radio](#radio)\n\n```javascript\n<Label mb={1}>\n  <Radio\n    name='dark-mode'\n    value='true'\n    defaultChecked={true}\n  />\n  Dark Mode\n</Label>\n<Label mb={1}>\n  <Radio\n    name='dark-mode'\n    value='false'\n  />\n  Light Mode\n</Label>\n```\n\n<Label mb={1}>\n  <Radio name=\"dark-mode\" value=\"true\" defaultChecked={true} />\n  Dark Mode\n</Label>\n<Label mb={1}>\n  <Radio name=\"dark-mode\" value=\"false\" />\n  Light Mode\n</Label>\n\n<Divider />\n\n## [Checkbox](#checkbox)\n\n```javascript\n<Label>\n  <Checkbox />\n  Checkbox\n</Label>\n```\n\n<Label>\n  <Checkbox />\n  Checkbox\n</Label>\n\n<Divider />\n\n## [Slider](#slider)\n\n```javascript\n<Slider defaultValue={25} />\n```\n\n<Slider defaultValue={25} />\n\n<Divider />\n\n## [Field](#field)\n\n```javascript\n<Field label=\"Email\" name=\"email\" defaultValue=\"\" />\n```\n\n<Field label=\"Email\" name=\"email\" defaultValue=\"\" />\n\n<Divider />\n\n## [Progress](#progress)\n\n```javascript\n<Progress max={1} value={1/2}> 50% </Progress>\n<Progress max={1} value={1/2} variant='styles.progress.secondary'> 50% </Progress>\n<Progress max={1} value={1/2} variant='styles.progress.success'> 50% </Progress>\n<Progress max={1} value={1/2} variant='styles.progress.error'> 50% </Progress>\n```\n\n<Progress max={1} value={1 / 2}>\n  {' '}\n  50%{' '}\n</Progress>\n<Divider />\n<Progress max={1} value={1 / 2} variant=\"styles.progress.secondary\">\n  {' '}\n  50%{' '}\n</Progress>\n<Divider />\n<Progress max={1} value={1 / 2} variant=\"styles.progress.success\">\n  {' '}\n  50%{' '}\n</Progress>\n<Divider />\n<Progress max={1} value={1 / 2} variant=\"styles.progress.error\">\n  {' '}\n  50%{' '}\n</Progress>\n\n<Divider />\n\n## [Donut](#donut)\n\n```javascript\n<Donut value={1/2}/>\n<Donut value={1/2} variant='styles.donut.secondary'/>\n<Donut value={1/2} variant='styles.donut.success'/>\n<Donut value={1/2} variant='styles.donut.error'/>\n```\n\n<Donut value={1 / 2} />\n<Donut value={1 / 2} variant=\"styles.donut.secondary\" />\n<Donut value={1 / 2} variant=\"styles.donut.success\" />\n<Donut value={1 / 2} variant=\"styles.donut.error\" />\n\n<Divider />\n\n## [Spinner](#spinner)\n\n```javascript\n<Spinner />\n<Spinner variant='styles.spinner.secondary'/>\n<Spinner variant='styles.spinner.success'/>\n<Spinner variant='styles.spinner.error'/>\n```\n\n<Spinner />\n<Spinner variant=\"styles.spinner.secondary\" />\n<Spinner variant=\"styles.spinner.success\" />\n<Spinner variant=\"styles.spinner.error\" />\n\n<Divider />\n\n## [Avatar](#avatar)\n\n```javascript\n<Avatar src=\"https://placekitten.com/g/50/50\" />\n```\n\n<Avatar src=\"https://placekitten.com/g/50/50\" />\n\n## [Badge](#badge)\n\nBadges need a variant, the default can't be styled at the moment\n\n```javascript\n<Badge variant='primary'>\n  Beep boop, this is an badge!\n</Badge>\n\n<Badge variant='secondary'>\n  Beep boop, this is an badge!\n</Badge>\n\n<Badge variant='success'>\n  Beep boop, this is an badge!\n</Badge>\n\n<Badge variant='error'>\n  Beep boop, this is an badge!\n</Badge>\n```\n\n<Grid sx={{gridTemplateColumns: 'auto auto auto auto'}}>\n<Badge variant='primary'>\n  Beep boop, this is an badge!\n</Badge>\n\n<Badge variant=\"secondary\">Beep boop, this is an badge!</Badge>\n\n<Badge variant=\"success\">Beep boop, this is an badge!</Badge>\n\n<Badge variant='error'>\n  Beep boop, this is an badge!\n</Badge>\n</Grid>\n\n<Divider />\n\n## [Alert](#alert)\n\n```javascript\n<Alert variant='primary' mb={2}>\n  Beep boop, this is an alert!\n</Alert>\n\n<Alert variant='secondary' mb={2}>\n  Beep boop, this is an alert!\n</Alert>\n\n<Alert variant='success' mb={2}>\n  Beep boop, this is an alert!\n</Alert>\n\n<Alert variant='error'>\n  Beep boop, this is an alert!\n</Alert>\n```\n\n<Alert variant=\"primary\" mb={2}>\n  Beep boop, this is an alert!\n</Alert>\n\n<Alert variant=\"secondary\" mb={2}>\n  Beep boop, this is an alert!\n</Alert>\n\n<Alert variant=\"success\" mb={2}>\n  Beep boop, this is an alert!\n</Alert>\n\n<Alert variant=\"error\">Beep boop, this is an alert!</Alert>\n\n<Divider />\n\n## [Divider](#divider)\n\n```javascript\n<Divider />\n```\n\n<Divider />\n\n<Divider />\n\n## Embed\n\n```javascript\n<Embed src=\"https://www.youtube.com/embed/GNCd_ERZvZM\" />\n```\n\n<Embed src=\"https://www.youtube.com/embed/GNCd_ERZvZM\" />\n\n<Divider />\n\n## [AspectRatio](#aspect-ratio)\n\n```javascript\n<AspectRatio ratio={16 / 9}>\n  <Image\n    src=\"https://placekitten.com/g/1200/1200\"\n    sx={{\n      objectFit: 'cover',\n    }}\n  />\n</AspectRatio>\n```\n\n<AspectRatio ratio={16 / 9}>\n  <Image\n    src=\"https://placekitten.com/g/1200/1200\"\n    sx={{\n      objectFit: 'cover',\n    }}\n  />\n</AspectRatio>\n\n<Divider />\n\n## [AspectImage](#aspect-image)\n\n```javascript\n<AspectImage ratio={4 / 3} src=\"https://placekitten.com/g/1200/1200\" />\n```\n\n<AspectImage ratio={4 / 3} src=\"https://placekitten.com/g/1200/1200\" />\n\n<Divider />\n\n## [Container](#container)\n\n```javascript\n<Container p={4} bg=\"surface\">\n  Centered container\n</Container>\n```\n\n<Container p={4} bg=\"surface\">\n  Centered container\n</Container>\n\n<Divider />\n\n## [NavLink](#nav-link)\n\n```javascript\n<Flex as=\"nav\">\n  <NavLink href=\"#!\" p={2}>\n    Home\n  </NavLink>\n  <NavLink href=\"#!\" p={2}>\n    Blog\n  </NavLink>\n  <NavLink href=\"#!\" p={2}>\n    About\n  </NavLink>\n</Flex>\n```\n\n<Flex as=\"nav\">\n  <NavLink href=\"#!\" p={2}>\n    Home\n  </NavLink>\n  <NavLink href=\"#!\" p={2}>\n    Blog\n  </NavLink>\n  <NavLink href=\"#!\" p={2}>\n    About\n  </NavLink>\n</Flex>\n\n<Divider />\n\n## [Message](#message)\n\n```javascript\n<Message variant='primary' mb={2}>\n  This is just a message for someone to read\n</Message>\n\n<Message variant='secondary' mb={2}>\n  This is just a message for someone to read\n</Message>\n\n<Message variant='success' mb={2}>\n  This is just a message for someone to read\n</Message>\n\n<Message variant='error' mb={2}>\n  This is just a message for someone to read\n</Message>\n```\n\n<Message variant=\"primary\" mb={2}>\n  This is just a message for someone to read\n</Message>\n\n<Message variant=\"secondary\" mb={2}>\n  This is just a message for someone to read\n</Message>\n\n<Message variant=\"success\" mb={2}>\n  This is just a message for someone to read\n</Message>\n\n<Message variant=\"error\" mb={2}>\n  This is just a message for someone to read\n</Message>\n\n<Divider />\n\n## [Close](#close)\n\n```javascript\n<Close />\n```\n\n<Close />\n\n<Divider />\n\n## [IconButton](#icon-button)\n\n```javascript\n<IconButton aria-label=\"Toggle dark mode\">\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"currentcolor\">\n    <circle r={11} cx={12} cy={12} fill=\"none\" stroke=\"currentcolor\" strokeWidth={2} />\n  </svg>\n</IconButton>\n```\n\n<IconButton aria-label=\"Toggle dark mode\">\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"currentcolor\">\n    <circle r={11} cx={12} cy={12} fill=\"none\" stroke=\"currentcolor\" strokeWidth={2} />\n  </svg>\n</IconButton>\n\n<Divider />\n\n## [MenuButton](#menu-button)\n\n```javascript\n<MenuButton aria-label=\"Toggle Menu\" />\n```\n\n<MenuButton aria-label=\"Toggle Menu\" />\n\n<Divider />\n"
  },
  {
    "path": "demo/src/posts/2019/03/a-pinned-post.mdx",
    "content": "---\ntitle: A Pinned Post\ntags: ['React', 'TypeScript']\nfeaturedImage: pankaj-patel-SXihyA4oEJs-unsplash.jpg\npinned: true\ndate: 2019-03-05\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\n\n- [/posts/post-1/](/posts/post-1/)\n- [/posts/2020/02/post-5/](/posts/2020/02/post-5/)\n- [https://example.com](https://example.com)\n- [http://example.com](http://example.com)\n\n## [Dummy Copy](#dummy-copy)\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas dui eros, rhoncus at ex eget, commodo lobortis justo.\nAenean eget aliquam risus. Aenean auctor luctus convallis. Pellentesque tincidunt odio ut risus pretium, id gravida quam\ncursus. Quisque at eros facilisis, auctor purus ut, sodales elit. Donec accumsan laoreet enim, ut dictum lacus feugiat\neget. Fusce magna ligula, molestie quis egestas eu, varius eget ante. Suspendisse massa lectus, sollicitudin vel aliquam\nat, convallis ac dui.\n\nOrci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas pellentesque congue\nblandit. Etiam facilisis dapibus dolor, vitae semper neque. Phasellus fermentum, odio quis pharetra aliquam, purus justo\ngravida risus, a fringilla nisl mi nec dui. Nunc suscipit condimentum fringilla. Duis sit amet porttitor ligula, sed\nmaximus velit. Sed at lectus diam. Donec malesuada euismod sodales. Etiam pretium gravida feugiat. Donec cursus enim\nconsequat hendrerit mollis. Quisque ultrices molestie neque et ullamcorper. Aenean fermentum lectus eget ultricies\nrutrum. Nullam blandit enim non vulputate dapibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nVestibulum finibus mattis feugiat. Vestibulum orci nibh, fermentum at fringilla a, malesuada id lacus. Donec sit amet\nmollis odio. Donec condimentum, est ultricies placerat accumsan, ipsum ex varius purus, ut convallis tellus diam in\nnisl. Donec gravida hendrerit leo, quis porttitor purus varius eget. Maecenas in lorem velit. Sed feugiat ac velit vitae\ntempus. In eget arcu vitae ipsum faucibus pretium sed eu sem. Phasellus nec lorem sollicitudin, vehicula odio in, ornare\nquam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam tristique\ncondimentum ipsum quis pellentesque. Morbi vestibulum id tellus ut tincidunt.\n\nMorbi sit amet pulvinar ex. Etiam aliquam est convallis quam placerat dictum. Sed ligula ante, laoreet sit amet laoreet\nquis, semper nec ex. Donec tristique dolor nec maximus sagittis. Duis dictum leo quis volutpat euismod. Praesent porta\nfelis et sem sodales, scelerisque sollicitudin odio porta. Curabitur ultricies nisl a ligula aliquam porttitor.\nCurabitur ligula urna, mattis aliquam dolor nec, scelerisque congue mi.\n\nDuis finibus sagittis tellus at faucibus. Ut sed consequat tellus. Aliquam nec erat dignissim, eleifend lorem sit amet,\nelementum felis. Morbi efficitur massa ut turpis facilisis, nec blandit massa cursus. Cras fringilla, ante a dignissim\ntincidunt, ligula libero blandit nunc, et egestas lectus tortor eget arcu. Nunc venenatis nibh mauris, quis euismod\nlectus congue at. Duis lacinia ligula non est lacinia elementum vitae a ipsum. Mauris et mi nisl. Vivamus facilisis,\nlorem at pellentesque dictum, erat nisl malesuada nisl, ac tincidunt dolor magna non libero. Mauris luctus felis vel\nmagna imperdiet, et molestie est cursus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere\ncubilia curae; Fusce vitae mattis nibh. Vestibulum quis augue nunc. Ut fringilla, neque ultrices mattis facilisis, felis\nlectus ullamcorper ante, et fermentum lectus justo at nibh.\n"
  },
  {
    "path": "demo/src/posts/2019/post-2.mdx",
    "content": "---\ntitle: Post 2\ntags: ['React', 'GatsbyJs', 'ES6', 'theme-ui']\nfeaturedImage: markus-spiske-70Rir5vB96U-unsplash.jpg\ndate: 2019-02-17\ndateModified: 2019-03-17\nauthor: Paul Scanlon\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis.\n"
  },
  {
    "path": "demo/src/posts/2020/01/post-3.mdx",
    "content": "---\ntitle: Post 3\ntags: ['React', 'HTML']\nfeaturedImage: florian-olivo-Ek9Znm8lQ1U-unsplash.jpg\ndate: 2020-01-17\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\n"
  },
  {
    "path": "demo/src/posts/2020/02/post-4.mdx",
    "content": "---\ntitle: Post 4\ntags: ['React', 'TypeScript']\nstatus: draft\ndate: 2020-02-12\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\n"
  },
  {
    "path": "demo/src/posts/2020/02/post-5.mdx",
    "content": "---\ntitle: Post 5\ntags: ['React', 'TypeScript', 'GraphQL', 'Fauna']\nfeaturedImage: pankaj-patel-_SgRNwAVNKw-unsplash.jpg\ndate: 2020-02-12\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nVivamus luctus tincidunt varius. In hac habitasse platea dictumst. Sed eu iaculis velit, in porttitor augue. Ut vitae\nsapien vestibulum, bibendum ipsum in, finibus arcu. Vestibulum euismod velit ex, et posuere elit iaculis vel. Donec\nsodales imperdiet posuere. Phasellus dui dolor, placerat in elementum vitae, gravida in quam\n\n<Button>Click me</Button>\n"
  },
  {
    "path": "demo/src/posts/2020/04/private.mdx",
    "content": "---\ntitle: Private\ntags: ['React', 'TypeScript', 'GraphQL', 'Fauna']\ndate: 2020-04-22\nisPrivate: true\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nVivamus luctus tincidunt varius. In hac habitasse platea dictumst. Sed eu iaculis velit, in porttitor augue. Ut vitae\nsapien vestibulum, bibendum ipsum in, finibus arcu. Vestibulum euismod velit ex, et posuere elit iaculis vel. Donec\nsodales imperdiet posuere. Phasellus dui dolor, placerat in elementum vitae, gravida in quam\n"
  },
  {
    "path": "demo/src/posts/2021/local-image-post.mdx",
    "content": "---\ntitle: Local Image Post\ndate: 2021-01-14\ntags: ['React', 'GatsbyJs', 'ES6', 'Css']\nfeaturedImage: pankaj-patel-SXihyA4oEJs-unsplash.jpg\nembeddedImages:\n  - pankaj-patel-SXihyA4oEJs-unsplash.jpg\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis.\n\n### Gatsby\n\n```javascript\n<GatsbyImage alt='...' image={...}/>\n```\n\n`<GatsbyImage alt='...' image={...}/>`\n\n<Box>\n  <GatsbyImage alt=\"embedded-image-1\" image={props.embedded.image1} />\n</Box>\n\n<Box as=\"pre\">{JSON.stringify(props.embedded.image1, null, 2)}</Box>\n\n### Theme UI\n\n`<Image src={...} />`\n\n<Box>\n  <Image src={props.embedded.image1.gatsbyImageData.images.fallback.src} />\n</Box>\n\n<Box as=\"pre\">{JSON.stringify(props.embedded.image1.gatsbyImageData.images.fallback.src, null, 2)}</Box>\n"
  },
  {
    "path": "demo/src/posts/2021/remote-image-post.mdx",
    "content": "---\ntitle: Remote Image Post\ndate: 2021-01-13\nauthor: Paul Scanlon\ntags: ['JavaScript', 'React', 'GatsbyJs', 'HTML', 'CSS', 'theme-ui']\nfeaturedImageUrl: https://res.cloudinary.com/www-paulie-dev/image/upload/v1603273280/paulie.dev/placeholder_ekfnq2.jpg\nembeddedImageUrls:\n  - https://res.cloudinary.com/www-paulie-dev/image/upload/v1603273280/paulie.dev/placeholder_ekfnq2.jpg\n  - https://res.cloudinary.com/www-paulie-dev/image/upload/v1603273280/paulie.dev/placeholder_ekfnq2.jpg\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis. Donec non tellus\njusto. Ut sit amet elit mauris. Praesent eleifend cursus luctus. Praesent posuere rhoncus maximus. Donec nec felis nec\nmetus semper pharetra ut ut libero. Ut hendrerit dui ut tincidunt egestas. Donec interdum pharetra arcu, vel egestas\nturpis ornare a. Phasellus quis euismod diam, sed convallis dolor.\n\n<GatsbyImage alt=\"\" image={props.embedded.image1} />\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis. Donec non tellus\njusto. Ut sit amet elit mauris. Praesent eleifend cursus luctus. Praesent posuere rhoncus maximus. Donec nec felis nec\nmetus semper pharetra ut ut libero. Ut hendrerit dui ut tincidunt egestas. Donec interdum pharetra arcu, vel egestas\nturpis ornare a. Phasellus quis euismod diam, sed convallis dolor.\n\n<GatsbyImage alt=\"\" image={props.embedded.image2} />\n"
  },
  {
    "path": "demo/src/posts/post-1.mdx",
    "content": "---\ntitle: Post 1\ndate: 2020-04-26\ndateModified: 2020-05-05\nauthor: Paul Scanlon\ntags: ['JavaScript', 'React', 'GatsbyJs', 'HTML', 'CSS', 'theme-ui']\nfeaturedImage: markus-spiske-466ENaLuhLY-unsplash.jpg\nembeddedImages:\n  - markus-spiske-FXFz-sW0uwo-unsplash.jpg\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis. Donec non tellus\njusto. Ut sit amet elit mauris. Praesent eleifend cursus luctus. Praesent posuere rhoncus maximus. Donec nec felis nec\nmetus semper pharetra ut ut libero. Ut hendrerit dui ut tincidunt egestas. Donec interdum pharetra arcu, vel egestas\nturpis ornare a. Phasellus quis euismod diam, sed convallis dolor.\n\n```sh\nnpm install aThing `aThing` 'aThing' \"aThing\"\n```\n\n```javascript\n<SourceArticle\n  title={title}\n  tags={tags}\n  date={date}\n  dateModified={dateModified}\n  author={author}\n  isPrivate={isPrivate}\n  featuredImage={featuredImage}\n  embedded={embedded}\n  body={body}\n  timeToRead={timeToRead}\n  wordCount={wordCount}\n/>\n```\n\n<Grid sx={{ gridTemplateColumns: ['1fr', '1fr 1fr'] }}>\n  <Box>\n    Donec nec felis nec metus semper pharetra ut ut libero. Ut hendrerit dui ut tincidunt egestas. Donec interdum\n    pharetra arcu, vel egestas turpis ornare a. Phasellus quis euismod diam, sed convallis dolor.\n  </Box>\n  <Box>\n    <GatsbyImage alt=\"embedded-image-1\" image={props.embedded.image1} />\n  </Box>\n</Grid>\n\n### [Gatsby](#gatsby)\n\n`<GatsbyImage alt='...' image={...}/>`\n\n<Box as=\"pre\">{JSON.stringify(props.embedded.image1, null, 2)}</Box>\n"
  },
  {
    "path": "demo/src/projects/2019/project-2.mdx",
    "content": "---\ntitle: Project 2\ntags: ['Automotive', 'FinTech', 'Publishing']\ndate: 2019-01-29\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis. Donec non tellus\njusto. Ut sit amet elit mauris. Praesent eleifend cursus luctus. Praesent posuere rhoncus maximus. Donec nec felis nec\nmetus semper pharetra ut ut libero. Ut hendrerit dui ut tincidunt egestas. Donec interdum pharetra arcu, vel egestas\nturpis ornare a. Phasellus quis euismod diam, sed convallis dolor.\n"
  },
  {
    "path": "demo/src/projects/2020/01/project-3.mdx",
    "content": "---\ntitle: Project 3\ntags: ['Automotive']\ndate: 2020-01-26\nurl: https://example.com\nmisc: Ahoy\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis. Donec non tellus\njusto. Ut sit amet elit mauris. Praesent eleifend cursus luctus. Praesent posuere rhoncus maximus. Donec nec felis nec\nmetus semper pharetra ut ut libero. Ut hendrerit dui ut tincidunt egestas. Donec interdum pharetra arcu, vel egestas\nturpis ornare a. Phasellus quis euismod diam, sed convallis dolor.\n"
  },
  {
    "path": "demo/src/projects/project-1.mdx",
    "content": "---\ntitle: Project 1\ntags: ['Publishing']\ndate: 2020-02-27\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi id enim et mauris elementum lobortis. Donec non tellus\njusto. Ut sit amet elit mauris. Praesent eleifend cursus luctus. Praesent posuere rhoncus maximus. Donec nec felis nec\nmetus semper pharetra ut ut libero. Ut hendrerit dui ut tincidunt egestas. Donec interdum pharetra arcu, vel egestas\nturpis ornare a. Phasellus quis euismod diam, sed convallis dolor.\n"
  },
  {
    "path": "netlify.toml",
    "content": "[build]\n  command = \"yarn build\"\n  publish = \"demo/public\"\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"private\": true,\n  \"scripts\": {\n    \"clean\": \"yarn workspace demo clean\",\n    \"serve\": \"yarn workspace demo serve\",\n    \"develop\": \"yarn workspace demo develop\",\n    \"build\": \"yarn workspace demo build\",\n    \"prettier\": \"prettier --config ./.prettierrc.js --ignore-path ./.prettierignore --write \\\"**/*.{json,js,ts,tsx,mdx}\\\"\",\n    \"release\": \"node copy-readme.js && yarn workspace @pauliescanlon/gatsby-theme-terminal publish\"\n  },\n  \"postinstall\": \"husky install\",\n  \"workspaces\": [\n    \"@pauliescanlon/gatsby-theme-terminal\",\n    \"demo\"\n  ],\n  \"devDependencies\": {\n    \"@commitlint/cli\": \"^12.1.4\",\n    \"@commitlint/config-conventional\": \"^12.1.4\",\n    \"husky\": \"^7.0.1\",\n    \"prettier\": \"^2.3.2\"\n  }\n}\n"
  }
]