(isDark ? `4px solid ${t.colors.toggleIcon}` : `none`),\n backgroundColor: isDark ? `toggleIcon` : `transparent`,\n transform: isDark ? `scale(0.55)` : `scale(1)`,\n transition: `all 0.45s ease`,\n overflow: isDark ? `visible` : `hidden`,\n boxShadow: (t) => (isDark ? `none` : `inset 8px -8px 0px 0px ${t.colors.toggleIcon}`),\n \"&:before\": {\n content: `\"\"`,\n position: `absolute`,\n right: `-9px`,\n top: `-9px`,\n height: `24px`,\n width: `24px`,\n border: (t) => (isDark ? `2px solid ${t.colors.toggleIcon}` : `none`),\n borderRadius: `50%`,\n transform: isDark ? `translate(14px, -14px)` : `translate(0, 0)`,\n opacity: isDark ? 0 : 1,\n transition: `transform 0.45s ease`,\n },\n \"&:after\": {\n content: `\"\"`,\n width: `8px`,\n height: `8px`,\n borderRadius: `50%`,\n margin: `-4px 0 0 -4px`,\n position: `absolute`,\n top: `50%`,\n left: `50%`,\n boxShadow: (t) =>\n `0 -23px 0 ${t.colors.toggleIcon}, 0 23px 0 ${t.colors.toggleIcon}, 23px 0 0 ${t.colors.toggleIcon}, -23px 0 0 ${t.colors.toggleIcon}, 15px 15px 0 ${t.colors.toggleIcon}, -15px 15px 0 ${t.colors.toggleIcon}, 15px -15px 0 ${t.colors.toggleIcon}, -15px -15px 0 ${t.colors.toggleIcon}`,\n transform: isDark ? `scale(1)` : `scale(0)`,\n transition: `all 0.35s ease`,\n },\n }}\n />\n \n)\n\nexport default ColorModeToggle\n","/** @jsx jsx */\nimport * as React from \"react\"\nimport { jsx, Link as TLink } from \"theme-ui\"\nimport { Link } from \"gatsby\"\nimport useMinimalBlogConfig from \"../hooks/use-minimal-blog-config\"\nimport replaceSlashes from \"../utils/replaceSlashes\"\n\ntype NavigationProps = {\n nav: {\n title: string\n slug: string\n }[]\n}\n\nfunction AsLink(props: any) {\n return
\n}\n\nconst Navigation = ({ nav }: NavigationProps) => {\n const { basePath } = useMinimalBlogConfig()\n\n return (\n
\n {nav && nav.length > 0 && (\n \n )}\n \n )\n}\n\nexport default Navigation\n","/** @jsx jsx */\nimport { Link } from \"gatsby\"\nimport { jsx } from \"theme-ui\"\nimport replaceSlashes from \"../utils/replaceSlashes\"\nimport useSiteMetadata from \"../hooks/use-site-metadata\"\nimport useMinimalBlogConfig from \"../hooks/use-minimal-blog-config\"\n\nconst HeaderTitle = () => {\n const { siteTitle } = useSiteMetadata()\n const { basePath } = useMinimalBlogConfig()\n\n return (\n
\n
{siteTitle}
\n \n )\n}\n\nexport default HeaderTitle\n","/** @jsx jsx */\nimport * as React from \"react\"\nimport { jsx, Link as TLink } from \"theme-ui\"\nimport useMinimalBlogConfig from \"../hooks/use-minimal-blog-config\"\n\nconst HeaderExternalLinks = () => {\n const { externalLinks } = useMinimalBlogConfig()\n\n return (\n
\n {externalLinks && externalLinks.length > 0 && (\n \n {externalLinks.map((link) => (\n \n {link.name}\n \n ))}\n
\n )}\n \n )\n}\n\nexport default HeaderExternalLinks\n","/** @jsx jsx */\nimport { jsx, useColorMode, Flex } from \"theme-ui\"\nimport useMinimalBlogConfig from \"../hooks/use-minimal-blog-config\"\nimport ColorModeToggle from \"./colormode-toggle\"\nimport Navigation from \"./navigation\"\nimport HeaderTitle from \"./header-title\"\nimport HeaderExternalLinks from \"./header-external-links\"\n\nconst Header = () => {\n const { navigation: nav } = useMinimalBlogConfig()\n const [colorMode, setColorMode] = useColorMode()\n const isDark = colorMode === `dark`\n const toggleColorMode = (e: any) => {\n e.preventDefault()\n setColorMode(isDark ? `light` : `dark`)\n }\n\n return (\n
\n \n \n \n \n \n \n \n
\n \n )\n}\n\nexport default Header\n","/** @jsx jsx */\nimport { jsx, Link } from \"theme-ui\"\nimport useSiteMetadata from \"../hooks/use-site-metadata\"\n\nconst Footer = () => {\n const { siteTitle } = useSiteMetadata()\n\n return (\n
\n )\n}\n\nexport default Footer\n","import { tint } from \"@theme-ui/color\"\n\nconst code = {\n \"[data-name='live-editor']\": {\n fontSize: 1,\n \"textarea, pre\": {\n padding: (t: any) => `${t.space[3]} !important`,\n },\n },\n \"[data-name='live-preview']\": {\n padding: (t: any) => `calc(${t.space[2]} + 10px) !important`,\n backgroundColor: tint(`primary`, 0.7),\n },\n \".prism-code\": {\n fontSize: [1, 1, 2],\n padding: `2rem 1rem 1rem 1rem`,\n webkitOverflowScrolling: `touch`,\n backgroundColor: `transparent`,\n minWidth: `100%`,\n mb: 0,\n mt: 0,\n overflow: `auto`,\n '&[data-linenumber=\"false\"]': {\n \".token-line\": {\n pl: 3,\n },\n },\n },\n \".gatsby-highlight[data-language=''], .gatsby-highlight[data-language='noLineNumbers']\": {\n \".prism-code\": {\n pt: `1rem`,\n },\n },\n \".token\": {\n display: `inline-block`,\n },\n \"p > code, li > code\": {\n bg: `gray.2`,\n color: `gray.8`,\n px: 2,\n py: 1,\n borderRadius: `2px`,\n },\n \".gatsby-highlight\": {\n fontSize: [1, 1, 2],\n position: `relative`,\n webkitOverflowScrolling: `touch`,\n bg: `rgb(1, 22, 39)`,\n borderRadius: `2px`,\n mx: [0, 0, 0, -3],\n \".token-line\": {\n mx: -3,\n minWidth: `100%`,\n },\n \"pre code\": {\n float: `left`,\n minWidth: `100%`,\n },\n 'pre[class*=\"language-\"]:before': {\n bg: `white`,\n borderRadius: `0 0 0.25rem 0.25rem`,\n color: `black`,\n fontSize: `12px`,\n letterSpacing: `0.025rem`,\n padding: `0.1rem 0.5rem`,\n position: `absolute`,\n left: `1rem`,\n textAlign: `right`,\n textTransform: `uppercase`,\n top: 0,\n },\n 'pre[class~=\"language-javascript\"]:before, pre[class~=\"language-js\"]:before': {\n content: `\"js\"`,\n background: `#f7df1e`,\n color: `black`,\n },\n 'pre[class~=\"language-jsx\"]:before': {\n content: `\"jsx\"`,\n background: `#61dafb`,\n color: `black`,\n },\n 'pre[class~=\"language-ts\"]:before': {\n content: `\"ts\"`,\n background: `#61dafb`,\n color: `black`,\n },\n 'pre[class~=\"language-tsx\"]:before': {\n content: `\"tsx\"`,\n background: `#61dafb`,\n color: `black`,\n },\n 'pre[class~=\"language-html\"]:before': {\n content: `\"html\"`,\n background: `#005a9c`,\n color: `white`,\n },\n 'pre[class~=\"language-xml\"]:before': {\n content: `\"xml\"`,\n background: `#005a9c`,\n color: `white`,\n },\n 'pre[class~=\"language-svg\"]:before': {\n content: `\"svg\"`,\n background: `#005a9c`,\n color: `white`,\n },\n 'pre[class~=\"language-graphql\"]:before': {\n content: `\"GraphQL\"`,\n background: `#E10098`,\n },\n 'pre[class~=\"language-css\"]:before': {\n content: `\"css\"`,\n background: `#ff9800`,\n color: `black`,\n },\n 'pre[class~=\"language-mdx\"]:before': {\n content: `\"mdx\"`,\n background: `#f9ac00`,\n color: `black`,\n },\n 'pre[class~=\"language-php\"]:before': {\n content: `\"php\"`,\n background: `#777bb3`,\n color: `black`,\n },\n 'pre[class~=\"language-py\"]:before, pre[class~=\"language-python\"]:before': {\n content: `\"py\"`,\n background: `#306998`,\n color: `white`,\n },\n 'pre[class~=\"language-text\"]:before': {\n content: `\"text\"`,\n },\n \"pre[class~='language-shell']:before\": {\n content: `'shell'`,\n },\n \"pre[class~='language-sh']:before\": {\n content: `'sh'`,\n },\n \"pre[class~='language-bash']:before\": {\n content: `'bash'`,\n },\n \"pre[class~='language-yaml']:before\": {\n content: `'yaml'`,\n background: `#ffa8df`,\n },\n \"pre[class~='language-yml']:before\": {\n content: `'yml'`,\n background: `#ffa8df`,\n },\n \"pre[class~='language-markdown']:before\": {\n content: `'md'`,\n },\n \"pre[class~='language-json']:before, pre[class~='language-json5']:before\": {\n content: `'json'`,\n background: `linen`,\n },\n \"pre[class~='language-diff']:before\": {\n content: `'diff'`,\n background: `#e6ffed`,\n },\n },\n '.gatsby-highlight > code[class*=\"language-\"], .gatsby-highlight > pre[class=*=\"language-\"]': {\n wordSpacing: `normal`,\n wordBreak: `normal`,\n overflowWrap: `normal`,\n lineHeight: 1.5,\n tabSize: 4,\n hyphens: `none`,\n },\n \".gatsby-highlight pre::-webkit-scrollbar\": {\n width: 2,\n height: 2,\n },\n \".gatsby-highlight pre::-webkit-scrollbar-thumb\": {\n backgroundColor: `primary`,\n },\n \".gatsby-highlight pre::-webkit-scrollbar-track\": {\n background: `rgb(1, 22, 39)`,\n },\n \".line-number-style\": {\n display: `inline-block`,\n width: `3em`,\n userSelect: `none`,\n opacity: 0.3,\n textAlign: `center`,\n position: `relative`,\n },\n \".code-title\": {\n backgroundColor: tint(`primary`, 0.7),\n color: `black`,\n fontSize: 0,\n px: 3,\n py: 2,\n fontFamily: `monospace`,\n mx: [0, 0, 0, -3],\n },\n \"[data-name='live-preview'], [data-name='live-editor']\": {\n mx: [0, 0, 0, -3],\n fontSize: [1, 1, 2],\n },\n \".token-line\": {\n pr: 3,\n },\n \".highlight-line\": {\n backgroundColor: `rgb(2, 55, 81)`,\n borderLeft: `4px solid rgb(2, 155, 206)`,\n \".line-number-style\": {\n width: `calc(3em - 4px)`,\n opacity: 0.5,\n left: `-2px`,\n },\n },\n \".react-live-wrapper\": {\n position: `relative`,\n },\n \".react-live-wrapper .code-copy-button\": {\n right: [0, 0, 0, -3],\n },\n}\n\nexport default code\n","/** @jsx jsx */\nimport { jsx } from \"theme-ui\"\nimport * as React from \"react\"\n\ntype SkipNavLinkProps = {\n children: React.ReactNode\n}\n\nconst skipNavStyles = {\n border: 0,\n clip: `react(0 0 0 0)`,\n height: `1px`,\n width: `1px`,\n margin: `-1px`,\n padding: 0,\n overflow: `hidden`,\n position: `absolute`,\n \"&:focus\": {\n padding: 3,\n position: `fixed`,\n top: `15px`,\n left: `15px`,\n backgroundColor: `heading`,\n color: `background`,\n zIndex: 1,\n width: `auto`,\n height: `auto`,\n clip: `auto`,\n textDecoration: `none`,\n },\n}\n\nconst SkipNavLink = ({ children, ...props }: SkipNavLinkProps) => (\n
\n {children}\n \n)\n\nexport default SkipNavLink\n","/** @jsx jsx */\nimport * as React from \"react\"\nimport { Global } from \"@emotion/react\"\nimport { Box, Container, jsx } from \"theme-ui\"\nimport Seo from \"./seo\"\nimport Header from \"./header\"\nimport Footer from \"./footer\"\nimport CodeStyles from \"../styles/code\"\nimport SkipNavLink from \"./skip-nav\"\n\ntype LayoutProps = { children: React.ReactNode; className?: string }\n\nconst Layout = ({ children, className = `` }: LayoutProps) => (\n
\n ({\n \"*\": {\n boxSizing: `inherit`,\n },\n html: {\n WebkitTextSizeAdjust: `100%`,\n },\n img: {\n borderStyle: `none`,\n },\n pre: {\n fontFamily: `monospace`,\n fontSize: `1em`,\n },\n \"[hidden]\": {\n display: `none`,\n },\n \"::selection\": {\n backgroundColor: theme.colors.text,\n color: theme.colors.background,\n },\n a: {\n transition: `all 0.3s ease-in-out`,\n color: `text`,\n },\n })}\n />\n \n Skip to content\n \n \n \n {children}\n \n \n \n \n)\n\nexport default Layout\n","/** @jsx jsx */\nimport * as React from \"react\"\nimport { jsx, Link as TLink, Box } from \"theme-ui\"\nimport { Link } from \"gatsby\"\nimport ItemTags from \"./item-tags\"\n\ntype BlogListItemProps = {\n post: {\n slug: string\n title: string\n date: string\n excerpt: string\n description: string\n timeToRead?: number\n tags?: {\n name: string\n slug: string\n }[]\n }\n showTags?: boolean\n}\n\nconst BlogListItem = ({ post, showTags = true }: BlogListItemProps) => (\n
\n \n {post.title}\n \n \n \n {post.tags && showTags && (\n \n {` — `}\n \n \n )}\n
\n \n)\n\nexport default BlogListItem\n","/** @jsx jsx */\nimport { jsx } from \"theme-ui\"\nimport BlogListItem from \"./blog-list-item\"\n\ntype ListingProps = {\n posts: {\n slug: string\n title: string\n date: string\n excerpt: string\n description: string\n timeToRead?: number\n tags?: {\n name: string\n slug: string\n }[]\n }[]\n className?: string\n showTags?: boolean\n}\n\nconst Listing = ({ posts, className = ``, showTags = true }: ListingProps) => (\n
\n {posts.map((post) => (\n \n ))}\n \n)\n\nexport default Listing\n","import * as React from \"react\"\nimport { Helmet } from \"react-helmet\"\nimport { withPrefix } from \"gatsby\"\nimport useSiteMetadata from \"../hooks/use-site-metadata\"\n\ntype SEOProps = {\n title?: string\n description?: string\n pathname?: string\n image?: string\n children?: React.ReactNode\n canonicalUrl?: string\n}\n\nconst Seo = ({\n title = ``,\n description = ``,\n pathname = ``,\n image = ``,\n children = null,\n canonicalUrl = ``,\n}: SEOProps) => {\n const site = useSiteMetadata()\n\n const {\n siteTitle,\n siteTitleAlt: defaultTitle,\n siteUrl,\n siteDescription: defaultDescription,\n siteLanguage,\n siteImage: defaultImage,\n author,\n } = site\n\n const seo = {\n title: title || defaultTitle,\n description: description || defaultDescription,\n url: `${siteUrl}${pathname || ``}`,\n image: `${siteUrl}${image || defaultImage}`,\n }\n return (\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n {canonicalUrl ?
: null}\n {children}\n \n )\n}\n\nexport default Seo\n","import { graphql, useStaticQuery } from \"gatsby\"\n\ntype UseSiteMetadataProps = {\n site: {\n siteMetadata: {\n siteTitle: string\n siteTitleAlt: string\n siteHeadline: string\n siteUrl: string\n siteDescription: string\n siteLanguage: string\n siteImage: string\n author: string\n [key: string]: unknown\n }\n }\n}\n\nconst useSiteMetadata = () => {\n const data = useStaticQuery
(graphql`\n query {\n site {\n siteMetadata {\n siteTitle\n siteTitleAlt\n siteHeadline\n siteUrl\n siteDescription\n siteLanguage\n siteImage\n author\n }\n }\n }\n `)\n\n return data.site.siteMetadata\n}\n\nexport default useSiteMetadata\n","/**\n * Replace double slashes // with one slash /\n * @description This prevents double slashes as users might add e.g. the basePath as \"/blog\" or \"blog\"\n * @param input\n * @return {string} - Sanitized string\n */\nfunction replaceSlashes(input: string): string {\n return input.replace(/\\/\\/+/g, `/`)\n}\n\nexport default replaceSlashes\n"],"names":["posts","useMinimalBlogConfig","tagsPath","basePath","title","sx","alignItems","justifyContent","flexFlow","as","variant","marginY","Link","to","replaceSlashes","mt","props","allPost","data","nodes","tags","map","tag","i","key","slug","name","isDark","toggle","onClick","type","opacity","position","borderRadius","width","height","display","transition","border","outline","background","cursor","padding","appearance","t","colors","toggleIcon","backgroundColor","transform","overflow","boxShadow","content","right","top","margin","left","AsLink","activeClassName","nav","length","mr","fontSize","color","item","siteTitle","useSiteMetadata","textDecoration","my","fontWeight","externalLinks","ml","link","url","href","navigation","useColorMode","colorMode","setColorMode","mb","e","preventDefault","boxSizing","a","flexDirection","Date","getFullYear","space","tint","webkitOverflowScrolling","minWidth","pl","pt","bg","px","py","mx","float","letterSpacing","textAlign","textTransform","wordSpacing","wordBreak","overflowWrap","lineHeight","tabSize","hyphens","userSelect","fontFamily","pr","borderLeft","skipNavStyles","clip","zIndex","children","className","styles","theme","html","WebkitTextSizeAdjust","img","borderStyle","pre","text","id","CodeStyles","post","showTags","date","description","pathname","image","canonicalUrl","site","defaultTitle","siteTitleAlt","siteUrl","defaultDescription","siteDescription","siteLanguage","defaultImage","siteImage","author","seo","titleTemplate","lang","property","rel","sizes","withPrefix","useStaticQuery","siteMetadata","input","replace"],"sourceRoot":""}