changeSlide(index)}\n onFocus={() => changeSlide(index)}\n //In sliders with fade effect apply loading to the first card only\n loading={props.fade ? (index === 0 ? loading : undefined) : loading}\n {...node}\n {...rest}\n />\n ))\n\n //Cards List (Fixed or Slider)\n const CardList = () => (\n \n {slider ? (\n changeSlide(index)}\n {...rest}\n >\n {cards}\n \n ) : (\n cards\n )}\n \n )\n\n return title ? (\n \n ) : (\n \n )\n})\n\nexport default CardList\n\nCardList.defaultProps = {\n variant: 'vertical',\n columns: [1],\n aside: false\n}\n\nCardList.propTypes = {\n variant: PropTypes.oneOfType([\n PropTypes.array,\n PropTypes.oneOf([\n 'horizontal',\n 'horizontal-aside',\n 'horizontal-md',\n 'horizontal-lg',\n 'horizontal-cover',\n 'horizontal-cover-hero',\n 'horizontal-cover-wide',\n 'horizontal-hero',\n 'vertical-cover',\n 'vertical',\n 'search'\n ])\n ]),\n loading: PropTypes.oneOf(['lazy', 'auto', 'eager']),\n columns: PropTypes.array,\n title: PropTypes.string,\n withTitleLink: PropTypes.bool,\n nodes: PropTypes.array,\n distinct: PropTypes.bool,\n limit: PropTypes.number,\n skip: PropTypes.number,\n aside: PropTypes.bool\n}\n","import dedupe from 'dedupe'\n\nexport default (array, { limit, skip, distinct }) => {\n if (!array) return null\n\n if (!limit && !skip && !distinct) return array\n\n let newArray = array\n\n //Remove duplicate array\n if (distinct) {\n newArray = dedupe(newArray, node => node.id)\n }\n\n // Skip specified number of first elements\n if (skip) {\n newArray = newArray.slice(skip)\n }\n\n //Limit total number of array\n if (limit) {\n newArray = newArray.slice(0, limit)\n }\n\n return newArray\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Heading, Text, Badge } from 'theme-ui'\n\nconst styles = {\n count: {\n fontSize: 4\n },\n subheader: {\n fontWeight: `body`,\n color: `omegaDark`\n },\n runninghead: {\n fontWeight: `body`,\n color: `omegaDark`,\n mb: 0\n }\n}\n\nconst PageTitle = ({ header, subheader, running, totalCount }) => {\n return (\n \n \n {header}{' '}\n {totalCount && (\n \n {' '}\n {totalCount}\n \n )}\n \n {subheader && (\n \n {subheader}\n \n )}\n {running && (\n \n {running}\n \n )}\n
\n )\n}\n\nexport default PageTitle\n\nPageTitle.propTypes = {\n title: PropTypes.string,\n subheader: PropTypes.string,\n running: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n totalCount: PropTypes.number\n}\n","// normalize use of trailing slash\nexport default slug => slug.replace(/\\/*$/, `/`)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Link } from 'gatsby'\nimport { Button, Flex, Box } from 'theme-ui'\nimport { FaChevronLeft, FaChevronRight } from 'react-icons/fa'\nimport normalizeSlug from '@components/utils/normalizeSlug'\n\nconst pagingParam = 'page'\n\nconst styles = {\n wrapper: {\n justifyContent: `space-between`,\n alignItems: `center`,\n textAlign: `center`,\n borderRadius: `full`,\n bg: `contentBg`,\n maxWidth: [`none`, 500],\n mx: `auto`,\n p: 1\n },\n item: {\n width: `1/3`\n },\n number: {\n py: 2\n },\n button: {\n minWidth: `full`\n }\n}\n\nconst Pagination = ({\n currentPage,\n pageCount,\n hasPreviousPage,\n hasNextPage,\n basePath = '',\n slug = ''\n}) => {\n if (!hasNextPage && !hasPreviousPage) return ''\n let prefixPath = normalizeSlug(basePath + slug)\n let pagingPath = normalizeSlug(prefixPath + pagingParam)\n\n const prevLink =\n currentPage >= 3 ? `${pagingPath}${currentPage - 1}` : prefixPath\n const nextLink = `${pagingPath}${currentPage + 1}`\n\n return (\n \n \n {hasPreviousPage && (\n \n )}\n \n \n Page {currentPage} of {pageCount}\n \n \n {hasNextPage && (\n \n )}\n \n \n )\n}\n\nexport default Pagination\n\nPagination.propTypes = {\n currentPage: PropTypes.number,\n pageCount: PropTypes.number,\n hasPreviousPage: PropTypes.bool,\n hasNextPage: PropTypes.bool,\n slug: PropTypes.string,\n pagingParam: PropTypes.string\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { GatsbyImage as Img } from 'gatsby-plugin-image'\nimport { Box, css } from 'theme-ui'\nimport MemphisPattern from '@components/MemphisPattern'\nimport getImageVariant from '@components/utils/getImageVariant'\n\n//Base size to keep all layers aligned easier\nconst bs = x => `${x * 0.35}rem`\n\nconst styles = {\n wrapper: {\n position: `relative`,\n zIndex: 2,\n textAlign: `center`,\n mb: bs(3)\n },\n pattern: {\n backgroundSize: `8rem`,\n opacity: 0.15\n },\n circle: ({ width }) => ({\n width: [bs(30), `full`],\n height: `full`,\n maxWidth: width,\n borderRadius: `full`,\n position: `absolute`,\n transform: `translate(-50%) scale(0.98)`,\n left: `50%`,\n top: bs(3),\n bg: `alpha`\n }),\n arc: ({ width }) => ({\n width: [bs(30), `full`],\n height: `full`,\n maxWidth: width,\n borderRadius: `full`,\n position: `absolute`,\n zIndex: 2,\n left: `50%`,\n transform: `translate(-50%)`,\n mt: bs(-1),\n ml: bs(-2),\n boxShadow: t => `\n\t\t\t${bs(2)}\n\t\t\t${bs(4)}\n\t\t\t${t.colors.omegaLight}\n\t\t`\n }),\n imageWrapper: {\n mx: `auto`,\n img: {\n borderRadius: `9999px 9999px 9999px 9999px`\n }\n }\n}\n\nconst Avatar = ({\n avatar,\n withPattern,\n patternStyles = {},\n size,\n width,\n loading,\n alt\n}) => {\n const image = avatar && getImageVariant(avatar, size)\n\n if (!image) return null\n\n width = width || image.width\n\n return (\n \n \n {withPattern && (\n \n )}\n
\n \n \n )\n}\n\nexport default Avatar\n\nAvatar.defaultProps = {\n size: 'regular',\n withPattern: false\n}\n\nAvatar.propTypes = {\n size: PropTypes.oneOf([false, 'small', 'regular']),\n width: PropTypes.number,\n withPattern: PropTypes.bool,\n patternStyles: PropTypes.object,\n loading: PropTypes.string,\n alt: PropTypes.string\n}\n","import React from 'react'\nimport { Link as GLink } from 'gatsby'\nimport { Flex, Box, Text, Heading, Card, Badge, Link } from 'theme-ui'\nimport MemphisPattern from '@components/MemphisPattern'\nimport Avatar from '@components/Avatar'\nimport Navigation from '@components/Navigation'\nimport attachSocialIcons from '@helpers/attachSocialIcons'\n\nconst styles = {\n card: {\n position: `relative`\n },\n wrapper: {\n flexDirection: [`column`, `row`],\n position: `relative`,\n zIndex: 3\n },\n avatarColumn: {\n flexBasis: `1/3`\n },\n infoColumn: {\n flexBasis: `2/3`\n },\n innerBox: {\n flexBasis: `1/2`,\n flexGrow: 1,\n px: [0, 3],\n mt: [3, 0]\n },\n subheader: {\n color: `omegaDark`\n },\n name: {\n textAlign: [`center`, `left`],\n mt: [3, 0],\n px: 3\n },\n bio: {\n textAlign: [`center`, `left`]\n },\n socialList: {\n a: {\n m: 0\n }\n },\n link: {\n position: `absolute`,\n top: 10,\n right: 10,\n zIndex: 3\n },\n pattern: {\n borderRadius: `lg`\n },\n gradient: {\n size: `full`,\n borderRadius: `lg`,\n position: `absolute`,\n left: 0,\n top: 0,\n zIndex: 2,\n background: [\n t =>\n `linear-gradient(0deg, ${t.colors.contentBg} 20%, rgba(255, 255, 255, 0) 80%)`,\n t =>\n `linear-gradient(270deg, ${t.colors.contentBg} 20%, rgba(255, 255, 255, 0) 100%)`\n ]\n }\n}\n\nconst Subheader = ({ children }) => (\n \n {children}\n \n)\n\nconst AuthorAvatar = ({ name, thumbnail, slug }) =>\n thumbnail ? (\n \n \n \n \n \n ) : null\n\nconst AuthorName = ({ name, slug }) => (\n \n \n \n {name}\n \n \n \n)\n\nconst AuthorBio = ({ title, description }) => (\n \n {title}\n {description}\n \n)\n\nconst AuthorSkills = ({ skills }) =>\n skills ? (\n \n Expertise\n {skills.map(skill => (\n {skill}\n ))}\n \n ) : null\n\nconst AuthorSocialMedia = ({ social }) =>\n social ? (\n \n Social Media\n \n \n ) : null\n\nconst AuthorExpanded = ({ author, withLink }) => {\n if (!author) return null\n\n const { skills, social } = author\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n {(social || skills) && (\n \n \n \n \n \n \n )}\n \n \n \n {withLink && (\n \n View Posts\n \n )}\n \n \n \n )\n}\n\nexport default AuthorExpanded\n"],"sourceRoot":""}