{"version":3,"sources":["webpack:///./src/components/bookmark_state.js","webpack:///./node_modules/gatsby-image/index.js","webpack:///./src/components/project.js","webpack:///./src/components/icon.js","webpack:///./src/components/bookmark_icon.js"],"names":["key","useState","loaded","setLoaded","useContext","EdgeStateContext","state","setState","useLocalStorage","lsBookmarked","setLsBookmarked","bookmarked","setBookmarked","bookmark","a","url","URL","window","location","fetch","pathname","method","unbookmark","newState","filter","k","includes","immutable","useEffect","kvBookmarked","find","parse","toggleBookmark","_interopRequireDefault","require","exports","__esModule","default","io","_assertThisInitialized2","_inheritsLoose2","_objectWithoutPropertiesLoose2","_extends2","_react","_propTypes","convertProps","props","convertedProps","resolutions","sizes","critical","fixed","fluid","loading","groupByMedia","concat","matchesMedia","_ref","media","isBrowser","matchMedia","matches","getImageCacheKey","_ref2","srcData","getCurrentSrcData","src","currentData","Array","isArray","some","image","hasArtDirectionSupport","foundMedia","findIndex","noMedia","imageCache","Object","create","inImageCache","cacheKey","hasNativeLazyLoadSupport","HTMLImageElement","prototype","hasIOSupport","IntersectionObserver","listeners","WeakMap","generateImageSources","imageVariants","map","_ref3","srcSet","srcSetWebp","createElement","Fragment","type","withMedia","without","forEach","variant","push","generateTracedSVGSources","_ref4","tracedSVG","generateBase64Sources","_ref5","base64","generateNoscriptSource","_ref6","isWebp","listenToIntersections","el","cb","observer","entries","entry","has","target","get","isIntersecting","intersectionRatio","unobserve","delete","rootMargin","observe","set","noscriptImg","title","alt","width","height","crossOrigin","draggable","join","Placeholder","forwardRef","ref","generateSources","spreadProps","ariaHidden","baseImage","Img","length","style","onLoad","onError","otherProps","position","top","left","objectFit","objectPosition","propTypes","object","func","Image","_React$Component","_this","call","this","seenBefore","isCritical","addNoScript","fadeIn","useIOSupport","isVisible","imgLoaded","imgCached","isHydrated","imageRef","createRef","placeholderRef","handleImageLoaded","bind","handleRef","_proto","componentDidMount","onStartLoad","wasCached","img","current","complete","componentWillUnmount","cleanUpListeners","_this2","imageInCache","currentSrc","render","_convertProps","className","_convertProps$style","_convertProps$imgStyl","imgStyle","_convertProps$placeho","placeholderStyle","placeholderClassName","backgroundColor","durationFadeIn","Tag","itemProp","shouldReveal","shouldFadeIn","imageStyle","opacity","transition","bgColor","delayHideStyle","transitionDelay","imagePlaceholderStyle","placeholderImageProps","overflow","maxWidth","maxHeight","JSON","stringify","paddingBottom","aspectRatio","bottom","right","dangerouslySetInnerHTML","__html","divStyle","display","Component","defaultProps","fixedObject","shape","number","isRequired","string","srcWebp","fluidObject","requireFixedOrFluid","originalPropTypes","propName","componentName","_PropTypes$checkPropT","Error","checkPropTypes","oneOfType","arrayOf","bool","oneOf","_default","Project","isInitialRoute","project","thumbnail","asset","name","slug","shortDescription","useBookmarkState","to","withGradientFill","withShadow","uniqueReadableID","prefix","Math","random","toString","split","substr","Icon","gradientID","shadowID","pathID","xmlns","viewBox","id","x1","x2","y1","y2","offset","stopColor","x","y","filterUnits","dy","in","result","stdDeviation","values","d","pathD","fill","href","BookmarkIcon"],"mappings":"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","file":"e83f1949531ad7fbdbaad16f64ff29de6095c9f9-803a996a19ebad218659.js","sourcesContent":["import { EdgeStateContext } from \"./edge_state\"\nimport { useContext, useEffect, useState } from \"react\"\nimport { useLocalStorage } from \"../utils\"\n\nexport default key => {\n const [loaded, setLoaded] = useState(false)\n const [state, setState] = useContext(EdgeStateContext)\n const [lsBookmarked, setLsBookmarked] = useLocalStorage(key, false)\n const [bookmarked, setBookmarked] = useState(false)\n\n const bookmark = async () => {\n const url = new URL(window.location)\n setLsBookmarked(\"bookmarked\")\n setState([key])\n\n await fetch(url.pathname + \"/bookmark\", {\n method: \"POST\",\n })\n\n return false\n }\n\n const unbookmark = async () => {\n const url = new URL(window.location)\n setLsBookmarked(\"unbookmarking\")\n const newState = state.filter(k => !k.includes(key))\n setState(newState, { immutable: false })\n\n await fetch(url.pathname + \"/unbookmark\", {\n method: \"POST\",\n })\n\n return false\n }\n\n useEffect(() => {\n async function parse() {\n setLoaded(true)\n\n const kvBookmarked = state && !!state.find(k => k.includes(key))\n\n switch (lsBookmarked) {\n case \"bookmarked\":\n return setBookmarked(true)\n case \"unbookmarking\":\n return setBookmarked(false)\n default:\n if (kvBookmarked) {\n setBookmarked(kvBookmarked)\n return setLsBookmarked(\"bookmarked\")\n }\n }\n }\n\n parse()\n }, [key, lsBookmarked, setLsBookmarked, state])\n\n const toggleBookmark = bookmarked ? unbookmark : bookmark\n return { bookmarked, loaded, toggleBookmark }\n}\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar logDeprecationNotice = function logDeprecationNotice(prop, replacement) {\n if (process.env.NODE_ENV === \"production\") {\n return;\n }\n\n console.log(\"\\n The \\\"\" + prop + \"\\\" prop is now deprecated and will be removed in the next major version\\n of \\\"gatsby-image\\\".\\n \");\n\n if (replacement) {\n console.log(\"Please use \" + replacement + \" instead of \\\"\" + prop + \"\\\".\");\n }\n}; // Handle legacy props during their deprecation phase\n\n\nvar convertProps = function convertProps(props) {\n var convertedProps = (0, _extends2.default)({}, props);\n var resolutions = convertedProps.resolutions,\n sizes = convertedProps.sizes,\n critical = convertedProps.critical;\n\n if (resolutions) {\n convertedProps.fixed = resolutions;\n logDeprecationNotice(\"resolutions\", \"the gatsby-image v2 prop \\\"fixed\\\"\");\n delete convertedProps.resolutions;\n }\n\n if (sizes) {\n convertedProps.fluid = sizes;\n logDeprecationNotice(\"sizes\", \"the gatsby-image v2 prop \\\"fluid\\\"\");\n delete convertedProps.sizes;\n }\n\n if (critical) {\n logDeprecationNotice(\"critical\", \"the native \\\"loading\\\" attribute\");\n convertedProps.loading = \"eager\";\n } // convert fluid & fixed to arrays so we only have to work with arrays\n\n\n if (convertedProps.fluid) {\n convertedProps.fluid = groupByMedia([].concat(convertedProps.fluid));\n }\n\n if (convertedProps.fixed) {\n convertedProps.fixed = groupByMedia([].concat(convertedProps.fixed));\n }\n\n return convertedProps;\n};\n/**\n * Checks if fluid or fixed are art-direction arrays.\n *\n * @param currentData {{media?: string}[]} The props to check for images.\n * @return {boolean}\n */\n\n\nvar hasArtDirectionSupport = function hasArtDirectionSupport(currentData) {\n return !!currentData && Array.isArray(currentData) && currentData.some(function (image) {\n return typeof image.media !== \"undefined\";\n });\n};\n/**\n * Tries to detect if a media query matches the current viewport.\n * @property media {{media?: string}} A media query string.\n * @return {boolean}\n */\n\n\nvar matchesMedia = function matchesMedia(_ref) {\n var media = _ref.media;\n return media ? isBrowser && !!window.matchMedia(media).matches : false;\n};\n/**\n * Find the source of an image to use as a key in the image cache.\n * Use `the first image in either `fixed` or `fluid`\n * @param {{fluid: {src: string, media?: string}[], fixed: {src: string, media?: string}[]}} args\n * @return {string?} Returns image src or undefined it not given.\n */\n\n\nvar getImageCacheKey = function getImageCacheKey(_ref2) {\n var fluid = _ref2.fluid,\n fixed = _ref2.fixed;\n var srcData = getCurrentSrcData(fluid || fixed || []);\n return srcData && srcData.src;\n};\n/**\n * Returns the current src - Preferably with art-direction support.\n * @param currentData {{media?: string}[], maxWidth?: Number, maxHeight?: Number} The fluid or fixed image array.\n * @return {{src: string, media?: string, maxWidth?: Number, maxHeight?: Number}}\n */\n\n\nvar getCurrentSrcData = function getCurrentSrcData(currentData) {\n if (isBrowser && hasArtDirectionSupport(currentData)) {\n // Do we have an image for the current Viewport?\n var foundMedia = currentData.findIndex(matchesMedia);\n\n if (foundMedia !== -1) {\n return currentData[foundMedia];\n } // No media matches, select first element without a media condition\n\n\n var noMedia = currentData.findIndex(function (image) {\n return typeof image.media === \"undefined\";\n });\n\n if (noMedia !== -1) {\n return currentData[noMedia];\n }\n } // Else return the first image.\n\n\n return currentData[0];\n}; // Cache if we've seen an image before so we don't bother with\n// lazy-loading & fading in on subsequent mounts.\n\n\nvar imageCache = Object.create({});\n\nvar inImageCache = function inImageCache(props) {\n var convertedProps = convertProps(props);\n var cacheKey = getImageCacheKey(convertedProps);\n return imageCache[cacheKey] || false;\n};\n\nvar activateCacheForImage = function activateCacheForImage(props) {\n var convertedProps = convertProps(props);\n var cacheKey = getImageCacheKey(convertedProps);\n\n if (cacheKey) {\n imageCache[cacheKey] = true;\n }\n}; // Native lazy-loading support: https://addyosmani.com/blog/lazy-loading/\n\n\nvar hasNativeLazyLoadSupport = typeof HTMLImageElement !== \"undefined\" && \"loading\" in HTMLImageElement.prototype;\nvar isBrowser = typeof window !== \"undefined\";\nvar hasIOSupport = isBrowser && window.IntersectionObserver;\nvar io;\nvar listeners = new WeakMap();\n\nfunction getIO() {\n if (typeof io === \"undefined\" && typeof window !== \"undefined\" && window.IntersectionObserver) {\n io = new window.IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (listeners.has(entry.target)) {\n var cb = listeners.get(entry.target); // Edge doesn't currently support isIntersecting, so also test for an intersectionRatio > 0\n\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(entry.target);\n listeners.delete(entry.target);\n cb();\n }\n }\n });\n }, {\n rootMargin: \"200px\"\n });\n }\n\n return io;\n}\n\nfunction generateImageSources(imageVariants) {\n return imageVariants.map(function (_ref3) {\n var src = _ref3.src,\n srcSet = _ref3.srcSet,\n srcSetWebp = _ref3.srcSetWebp,\n media = _ref3.media,\n sizes = _ref3.sizes;\n return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {\n key: src\n }, srcSetWebp && /*#__PURE__*/_react.default.createElement(\"source\", {\n type: \"image/webp\",\n media: media,\n srcSet: srcSetWebp,\n sizes: sizes\n }), srcSet && /*#__PURE__*/_react.default.createElement(\"source\", {\n media: media,\n srcSet: srcSet,\n sizes: sizes\n }));\n });\n} // Return an array ordered by elements having a media prop, does not use\n// native sort, as a stable sort is not guaranteed by all browsers/versions\n\n\nfunction groupByMedia(imageVariants) {\n var withMedia = [];\n var without = [];\n imageVariants.forEach(function (variant) {\n return (variant.media ? withMedia : without).push(variant);\n });\n\n if (without.length > 1 && process.env.NODE_ENV !== \"production\") {\n console.warn(\"We've found \" + without.length + \" sources without a media property. They might be ignored by the browser, see: https://www.gatsbyjs.org/packages/gatsby-image/#art-directing-multiple-images\");\n }\n\n return [].concat(withMedia, without);\n}\n\nfunction generateTracedSVGSources(imageVariants) {\n return imageVariants.map(function (_ref4) {\n var src = _ref4.src,\n media = _ref4.media,\n tracedSVG = _ref4.tracedSVG;\n return /*#__PURE__*/_react.default.createElement(\"source\", {\n key: src,\n media: media,\n srcSet: tracedSVG\n });\n });\n}\n\nfunction generateBase64Sources(imageVariants) {\n return imageVariants.map(function (_ref5) {\n var src = _ref5.src,\n media = _ref5.media,\n base64 = _ref5.base64;\n return /*#__PURE__*/_react.default.createElement(\"source\", {\n key: src,\n media: media,\n srcSet: base64\n });\n });\n}\n\nfunction generateNoscriptSource(_ref6, isWebp) {\n var srcSet = _ref6.srcSet,\n srcSetWebp = _ref6.srcSetWebp,\n media = _ref6.media,\n sizes = _ref6.sizes;\n var src = isWebp ? srcSetWebp : srcSet;\n var mediaAttr = media ? \"media=\\\"\" + media + \"\\\" \" : \"\";\n var typeAttr = isWebp ? \"type='image/webp' \" : \"\";\n var sizesAttr = sizes ? \"sizes=\\\"\" + sizes + \"\\\" \" : \"\";\n return \"\";\n}\n\nfunction generateNoscriptSources(imageVariants) {\n return imageVariants.map(function (variant) {\n return (variant.srcSetWebp ? generateNoscriptSource(variant, true) : \"\") + generateNoscriptSource(variant);\n }).join(\"\");\n}\n\nvar listenToIntersections = function listenToIntersections(el, cb) {\n var observer = getIO();\n\n if (observer) {\n observer.observe(el);\n listeners.set(el, cb);\n }\n\n return function () {\n observer.unobserve(el);\n listeners.delete(el);\n };\n};\n\nvar noscriptImg = function noscriptImg(props) {\n // Check if prop exists before adding each attribute to the string output below to prevent\n // HTML validation issues caused by empty values like width=\"\" and height=\"\"\n var src = props.src ? \"src=\\\"\" + props.src + \"\\\" \" : \"src=\\\"\\\" \"; // required attribute\n\n var sizes = props.sizes ? \"sizes=\\\"\" + props.sizes + \"\\\" \" : \"\";\n var srcSet = props.srcSet ? \"srcset=\\\"\" + props.srcSet + \"\\\" \" : \"\";\n var title = props.title ? \"title=\\\"\" + props.title + \"\\\" \" : \"\";\n var alt = props.alt ? \"alt=\\\"\" + props.alt + \"\\\" \" : \"alt=\\\"\\\" \"; // required attribute\n\n var width = props.width ? \"width=\\\"\" + props.width + \"\\\" \" : \"\";\n var height = props.height ? \"height=\\\"\" + props.height + \"\\\" \" : \"\";\n var crossOrigin = props.crossOrigin ? \"crossorigin=\\\"\" + props.crossOrigin + \"\\\" \" : \"\";\n var loading = props.loading ? \"loading=\\\"\" + props.loading + \"\\\" \" : \"\";\n var draggable = props.draggable ? \"draggable=\\\"\" + props.draggable + \"\\\" \" : \"\";\n var sources = generateNoscriptSources(props.imageVariants);\n return \"\" + sources + \"\";\n}; // Earlier versions of gatsby-image during the 2.x cycle did not wrap\n// the `Img` component in a `picture` element. This maintains compatibility\n// until a breaking change can be introduced in the next major release\n\n\nvar Placeholder = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n var src = props.src,\n imageVariants = props.imageVariants,\n generateSources = props.generateSources,\n spreadProps = props.spreadProps,\n ariaHidden = props.ariaHidden;\n\n var baseImage = /*#__PURE__*/_react.default.createElement(Img, (0, _extends2.default)({\n ref: ref,\n src: src\n }, spreadProps, {\n ariaHidden: ariaHidden\n }));\n\n return imageVariants.length > 1 ? /*#__PURE__*/_react.default.createElement(\"picture\", null, generateSources(imageVariants), baseImage) : baseImage;\n});\n\nvar Img = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n var sizes = props.sizes,\n srcSet = props.srcSet,\n src = props.src,\n style = props.style,\n onLoad = props.onLoad,\n onError = props.onError,\n loading = props.loading,\n draggable = props.draggable,\n ariaHidden = props.ariaHidden,\n otherProps = (0, _objectWithoutPropertiesLoose2.default)(props, [\"sizes\", \"srcSet\", \"src\", \"style\", \"onLoad\", \"onError\", \"loading\", \"draggable\", \"ariaHidden\"]);\n return /*#__PURE__*/_react.default.createElement(\"img\", (0, _extends2.default)({\n \"aria-hidden\": ariaHidden,\n sizes: sizes,\n srcSet: srcSet,\n src: src\n }, otherProps, {\n onLoad: onLoad,\n onError: onError,\n ref: ref,\n loading: loading,\n draggable: draggable,\n style: (0, _extends2.default)({\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center\"\n }, style)\n }));\n});\n\nImg.propTypes = {\n style: _propTypes.default.object,\n onError: _propTypes.default.func,\n onLoad: _propTypes.default.func\n};\n\nvar Image = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(Image, _React$Component);\n\n function Image(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this; // If this image has already been loaded before then we can assume it's\n // already in the browser cache so it's cheap to just show directly.\n\n _this.seenBefore = isBrowser && inImageCache(props);\n _this.isCritical = props.loading === \"eager\" || props.critical;\n _this.addNoScript = !(_this.isCritical && !props.fadeIn);\n _this.useIOSupport = !hasNativeLazyLoadSupport && hasIOSupport && !_this.isCritical && !_this.seenBefore;\n var isVisible = _this.isCritical || isBrowser && (hasNativeLazyLoadSupport || !_this.useIOSupport);\n _this.state = {\n isVisible: isVisible,\n imgLoaded: false,\n imgCached: false,\n fadeIn: !_this.seenBefore && props.fadeIn,\n isHydrated: false\n };\n _this.imageRef = /*#__PURE__*/_react.default.createRef();\n _this.placeholderRef = props.placeholderRef || /*#__PURE__*/_react.default.createRef();\n _this.handleImageLoaded = _this.handleImageLoaded.bind((0, _assertThisInitialized2.default)(_this));\n _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n var _proto = Image.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.setState({\n isHydrated: isBrowser\n });\n\n if (this.state.isVisible && typeof this.props.onStartLoad === \"function\") {\n this.props.onStartLoad({\n wasCached: inImageCache(this.props)\n });\n }\n\n if (this.isCritical) {\n var img = this.imageRef.current;\n\n if (img && img.complete) {\n this.handleImageLoaded();\n }\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this.cleanUpListeners) {\n this.cleanUpListeners();\n }\n } // Specific to IntersectionObserver based lazy-load support\n ;\n\n _proto.handleRef = function handleRef(ref) {\n var _this2 = this;\n\n if (this.useIOSupport && ref) {\n this.cleanUpListeners = listenToIntersections(ref, function () {\n var imageInCache = inImageCache(_this2.props);\n\n if (!_this2.state.isVisible && typeof _this2.props.onStartLoad === \"function\") {\n _this2.props.onStartLoad({\n wasCached: imageInCache\n });\n } // imgCached and imgLoaded must update after isVisible,\n // Once isVisible is true, imageRef becomes accessible, which imgCached needs access to.\n // imgLoaded and imgCached are in a 2nd setState call to be changed together,\n // avoiding initiating unnecessary animation frames from style changes.\n\n\n _this2.setState({\n isVisible: true\n }, function () {\n _this2.setState({\n imgLoaded: imageInCache,\n // `currentSrc` should be a string, but can be `undefined` in IE,\n // !! operator validates the value is not undefined/null/\"\"\n // for lazyloaded components this might be null\n // TODO fix imgCached behaviour as it's now false when it's lazyloaded\n imgCached: !!(_this2.imageRef.current && _this2.imageRef.current.currentSrc)\n });\n });\n });\n }\n };\n\n _proto.handleImageLoaded = function handleImageLoaded() {\n activateCacheForImage(this.props);\n this.setState({\n imgLoaded: true\n });\n\n if (this.props.onLoad) {\n this.props.onLoad();\n }\n };\n\n _proto.render = function render() {\n var _convertProps = convertProps(this.props),\n title = _convertProps.title,\n alt = _convertProps.alt,\n className = _convertProps.className,\n _convertProps$style = _convertProps.style,\n style = _convertProps$style === void 0 ? {} : _convertProps$style,\n _convertProps$imgStyl = _convertProps.imgStyle,\n imgStyle = _convertProps$imgStyl === void 0 ? {} : _convertProps$imgStyl,\n _convertProps$placeho = _convertProps.placeholderStyle,\n placeholderStyle = _convertProps$placeho === void 0 ? {} : _convertProps$placeho,\n placeholderClassName = _convertProps.placeholderClassName,\n fluid = _convertProps.fluid,\n fixed = _convertProps.fixed,\n backgroundColor = _convertProps.backgroundColor,\n durationFadeIn = _convertProps.durationFadeIn,\n Tag = _convertProps.Tag,\n itemProp = _convertProps.itemProp,\n loading = _convertProps.loading,\n draggable = _convertProps.draggable;\n\n var imageVariants = fluid || fixed; // Abort early if missing image data (#25371)\n\n if (!imageVariants) {\n return null;\n }\n\n var shouldReveal = this.state.fadeIn === false || this.state.imgLoaded;\n var shouldFadeIn = this.state.fadeIn === true && !this.state.imgCached;\n var imageStyle = (0, _extends2.default)({\n opacity: shouldReveal ? 1 : 0,\n transition: shouldFadeIn ? \"opacity \" + durationFadeIn + \"ms\" : \"none\"\n }, imgStyle);\n var bgColor = typeof backgroundColor === \"boolean\" ? \"lightgray\" : backgroundColor;\n var delayHideStyle = {\n transitionDelay: durationFadeIn + \"ms\"\n };\n var imagePlaceholderStyle = (0, _extends2.default)({\n opacity: this.state.imgLoaded ? 0 : 1\n }, shouldFadeIn && delayHideStyle, imgStyle, placeholderStyle);\n var placeholderImageProps = {\n title: title,\n alt: !this.state.isVisible ? alt : \"\",\n style: imagePlaceholderStyle,\n className: placeholderClassName,\n itemProp: itemProp\n }; // Initial client render state needs to match SSR until hydration finishes.\n // Once hydration completes, render again to update to the correct image.\n // `imageVariants` is always an Array type at this point due to `convertProps()`\n\n var image = !this.state.isHydrated ? imageVariants[0] : getCurrentSrcData(imageVariants);\n\n if (fluid) {\n return /*#__PURE__*/_react.default.createElement(Tag, {\n className: (className ? className : \"\") + \" gatsby-image-wrapper\",\n style: (0, _extends2.default)({\n position: \"relative\",\n overflow: \"hidden\",\n maxWidth: image.maxWidth ? image.maxWidth + \"px\" : null,\n maxHeight: image.maxHeight ? image.maxHeight + \"px\" : null\n }, style),\n ref: this.handleRef,\n key: \"fluid-\" + JSON.stringify(image.srcSet)\n }, /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n style: {\n width: \"100%\",\n paddingBottom: 100 / image.aspectRatio + \"%\"\n }\n }), bgColor && /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n title: title,\n style: (0, _extends2.default)({\n backgroundColor: bgColor,\n position: \"absolute\",\n top: 0,\n bottom: 0,\n opacity: !this.state.imgLoaded ? 1 : 0,\n right: 0,\n left: 0\n }, shouldFadeIn && delayHideStyle)\n }), image.base64 && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.base64,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateBase64Sources\n }), image.tracedSVG && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.tracedSVG,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateTracedSVGSources\n }), this.state.isVisible && /*#__PURE__*/_react.default.createElement(\"picture\", null, generateImageSources(imageVariants), /*#__PURE__*/_react.default.createElement(Img, {\n alt: alt,\n title: title,\n sizes: image.sizes,\n src: image.src,\n crossOrigin: this.props.crossOrigin,\n srcSet: image.srcSet,\n style: imageStyle,\n ref: this.imageRef,\n onLoad: this.handleImageLoaded,\n onError: this.props.onError,\n itemProp: itemProp,\n loading: loading,\n draggable: draggable\n })), this.addNoScript && /*#__PURE__*/_react.default.createElement(\"noscript\", {\n dangerouslySetInnerHTML: {\n __html: noscriptImg((0, _extends2.default)({\n alt: alt,\n title: title,\n loading: loading\n }, image, {\n imageVariants: imageVariants\n }))\n }\n }));\n }\n\n if (fixed) {\n var divStyle = (0, _extends2.default)({\n position: \"relative\",\n overflow: \"hidden\",\n display: \"inline-block\",\n width: image.width,\n height: image.height\n }, style);\n\n if (style.display === \"inherit\") {\n delete divStyle.display;\n }\n\n return /*#__PURE__*/_react.default.createElement(Tag, {\n className: (className ? className : \"\") + \" gatsby-image-wrapper\",\n style: divStyle,\n ref: this.handleRef,\n key: \"fixed-\" + JSON.stringify(image.srcSet)\n }, bgColor && /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n title: title,\n style: (0, _extends2.default)({\n backgroundColor: bgColor,\n width: image.width,\n opacity: !this.state.imgLoaded ? 1 : 0,\n height: image.height\n }, shouldFadeIn && delayHideStyle)\n }), image.base64 && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.base64,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateBase64Sources\n }), image.tracedSVG && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.tracedSVG,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateTracedSVGSources\n }), this.state.isVisible && /*#__PURE__*/_react.default.createElement(\"picture\", null, generateImageSources(imageVariants), /*#__PURE__*/_react.default.createElement(Img, {\n alt: alt,\n title: title,\n width: image.width,\n height: image.height,\n sizes: image.sizes,\n src: image.src,\n crossOrigin: this.props.crossOrigin,\n srcSet: image.srcSet,\n style: imageStyle,\n ref: this.imageRef,\n onLoad: this.handleImageLoaded,\n onError: this.props.onError,\n itemProp: itemProp,\n loading: loading,\n draggable: draggable\n })), this.addNoScript && /*#__PURE__*/_react.default.createElement(\"noscript\", {\n dangerouslySetInnerHTML: {\n __html: noscriptImg((0, _extends2.default)({\n alt: alt,\n title: title,\n loading: loading\n }, image, {\n imageVariants: imageVariants\n }))\n }\n }));\n }\n\n return null;\n };\n\n return Image;\n}(_react.default.Component);\n\nImage.defaultProps = {\n fadeIn: true,\n durationFadeIn: 500,\n alt: \"\",\n Tag: \"div\",\n // We set it to `lazy` by default because it's best to default to a performant\n // setting and let the user \"opt out\" to `eager`\n loading: \"lazy\"\n};\n\nvar fixedObject = _propTypes.default.shape({\n width: _propTypes.default.number.isRequired,\n height: _propTypes.default.number.isRequired,\n src: _propTypes.default.string.isRequired,\n srcSet: _propTypes.default.string.isRequired,\n base64: _propTypes.default.string,\n tracedSVG: _propTypes.default.string,\n srcWebp: _propTypes.default.string,\n srcSetWebp: _propTypes.default.string,\n media: _propTypes.default.string\n});\n\nvar fluidObject = _propTypes.default.shape({\n aspectRatio: _propTypes.default.number.isRequired,\n src: _propTypes.default.string.isRequired,\n srcSet: _propTypes.default.string.isRequired,\n sizes: _propTypes.default.string.isRequired,\n base64: _propTypes.default.string,\n tracedSVG: _propTypes.default.string,\n srcWebp: _propTypes.default.string,\n srcSetWebp: _propTypes.default.string,\n media: _propTypes.default.string,\n maxWidth: _propTypes.default.number,\n maxHeight: _propTypes.default.number\n});\n\nfunction requireFixedOrFluid(originalPropTypes) {\n return function (props, propName, componentName) {\n var _PropTypes$checkPropT;\n\n if (!props.fixed && !props.fluid) {\n throw new Error(\"The prop `fluid` or `fixed` is marked as required in `\" + componentName + \"`, but their values are both `undefined`.\");\n }\n\n _propTypes.default.checkPropTypes((_PropTypes$checkPropT = {}, _PropTypes$checkPropT[propName] = originalPropTypes, _PropTypes$checkPropT), props, \"prop\", componentName);\n };\n} // If you modify these propTypes, please don't forget to update following files as well:\n// https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-image/index.d.ts\n// https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-image/README.md#gatsby-image-props\n// https://github.com/gatsbyjs/gatsby/blob/master/docs/docs/gatsby-image.md#gatsby-image-props\n\n\nImage.propTypes = {\n resolutions: fixedObject,\n sizes: fluidObject,\n fixed: requireFixedOrFluid(_propTypes.default.oneOfType([fixedObject, _propTypes.default.arrayOf(fixedObject)])),\n fluid: requireFixedOrFluid(_propTypes.default.oneOfType([fluidObject, _propTypes.default.arrayOf(fluidObject)])),\n fadeIn: _propTypes.default.bool,\n durationFadeIn: _propTypes.default.number,\n title: _propTypes.default.string,\n alt: _propTypes.default.string,\n className: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.object]),\n // Support Glamor's css prop.\n critical: _propTypes.default.bool,\n crossOrigin: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),\n style: _propTypes.default.object,\n imgStyle: _propTypes.default.object,\n placeholderStyle: _propTypes.default.object,\n placeholderClassName: _propTypes.default.string,\n backgroundColor: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),\n onLoad: _propTypes.default.func,\n onError: _propTypes.default.func,\n onStartLoad: _propTypes.default.func,\n Tag: _propTypes.default.string,\n itemProp: _propTypes.default.string,\n loading: _propTypes.default.oneOf([\"auto\", \"lazy\", \"eager\"]),\n draggable: _propTypes.default.bool\n};\nvar _default = Image;\nexports.default = _default;","import React from \"react\"\nimport { Link } from \"gatsby\"\nimport Img from \"gatsby-image\"\n\nimport useBookmarkState from \"./bookmark_state\"\nimport BookmarkIcon from \"./bookmark_icon\"\n\nimport \"./project.css\"\n\nconst Project = ({ isInitialRoute, project }) => {\n const {\n thumbnail: {\n asset: { fluid },\n },\n name,\n slug,\n shortDescription,\n } = project\n\n const { bookmarked } = useBookmarkState(project.slug)\n\n return (\n \n
\n
\n \n
\n\n
\n

{name}

\n

{shortDescription}

\n
\n\n {bookmarked && (\n
\n \n
\n )}\n
\n \n )\n}\n\nexport default Project\n","import React from \"react\"\n\nimport \"./icon.css\"\n\nconst randomString = () => Math.random().toString().split('.')[1].substr(0, 6)\nconst uniqueReadableID = (prefix) => `${prefix}-${randomString()}`\n\nconst Icon = (props) => {\n const gradientID = uniqueReadableID('gradient')\n const shadowID = uniqueReadableID('shadow')\n const pathID = uniqueReadableID('path')\n\n return (\n \n \n {props.withGradientFill &&\n \n \n \n \n }\n {props.withShadow &&\n \n \n \n \n \n }\n \n \n {props.withShadow &&\n \n }\n \n \n )\n}\n\nexport default Icon\n","import React from \"react\"\n\nimport Icon from \"./icon\"\n\nconst BookmarkIcon = props => (\n \n)\n\nexport default BookmarkIcon\n"],"sourceRoot":""}