{"version":3,"sources":["webpack:///./src/pages/built-with.js","webpack:///./node_modules/gatsby-image/index.js","webpack:///./src/components/bookmark_state.js","webpack:///./src/components/icon.js","webpack:///./src/components/bookmark_icon.js","webpack:///./node_modules/core-js/modules/es6.string.fixed.js","webpack:///./src/components/project.js"],"names":["query","BuiltWithPage","data","allSanityCollection","allSanityProject","sanityLayout","allCollections","flatten","collections","map","collection","find","id","normalizeCollection","title","className","href","i","key","name","projects","slice","PROJECTS_PER_COLLECTION","project","isInitialRoute","_interopRequireDefault","require","exports","__esModule","io","_assertThisInitialized2","_inheritsLoose2","_objectWithoutPropertiesLoose2","_extends2","_react","_propTypes","convertProps","props","convertedProps","resolutions","sizes","critical","fixed","fluid","loading","groupByMedia","concat","getImageSrcKey","_ref","src","imageCache","Object","create","inImageCache","hasNativeLazyLoadSupport","HTMLImageElement","prototype","isBrowser","window","hasIOSupport","IntersectionObserver","listeners","WeakMap","generateImageSources","imageVariants","_ref2","srcSet","srcSetWebp","media","createElement","Fragment","type","withMedia","without","forEach","variant","push","generateTracedSVGSources","_ref3","tracedSVG","generateBase64Sources","_ref4","base64","generateNoscriptSource","_ref5","isWebp","listenToIntersections","el","cb","observer","entries","entry","has","target","get","isIntersecting","intersectionRatio","unobserve","rootMargin","observe","set","noscriptImg","alt","width","height","crossOrigin","draggable","join","Placeholder","_ref6","generateSources","spreadProps","baseImage","Img","length","forwardRef","ref","style","onLoad","onError","onClick","otherProps","position","top","left","objectFit","objectPosition","propTypes","object","func","Image","_React$Component","_this","call","this","seenBefore","isCritical","addNoScript","fadeIn","useIOSupport","isVisible","state","imgLoaded","imgCached","imageRef","createRef","handleImageLoaded","bind","handleRef","_proto","componentDidMount","onStartLoad","wasCached","img","current","complete","componentWillUnmount","cleanUpListeners","_this2","imageInCache","setState","currentSrc","render","_convertProps","_convertProps$style","_convertProps$imgStyl","imgStyle","_convertProps$placeho","placeholderStyle","placeholderClassName","backgroundColor","durationFadeIn","Tag","itemProp","shouldReveal","shouldFadeIn","imageStyle","opacity","transition","bgColor","delayHideStyle","transitionDelay","imagePlaceholderStyle","placeholderImageProps","image","overflow","JSON","stringify","paddingBottom","aspectRatio","bottom","right","dangerouslySetInnerHTML","__html","_imageVariants","_image","divStyle","display","Component","defaultProps","fixedObject","shape","number","isRequired","string","srcWebp","fluidObject","oneOfType","arrayOf","bool","oneOf","_default","useState","loaded","setLoaded","useContext","EdgeStateContext","useLocalStorage","lsBookmarked","setLsBookmarked","bookmarked","setBookmarked","bookmark","a","url","URL","location","fetch","pathname","method","unbookmark","newState","filter","k","includes","immutable","useEffect","kvBookmarked","parse","toggleBookmark","uniqueReadableID","prefix","Math","random","toString","split","substr","Icon","gradientID","shadowID","pathID","xmlns","viewBox","withGradientFill","x1","x2","y1","y2","offset","stopColor","withShadow","x","y","filterUnits","dy","in","result","stdDeviation","values","d","pathD","fill","BookmarkIcon","createHTML","Project","thumbnail","asset","slug","shortDescription","useBookmarkState","to"],"mappings":"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","file":"component---src-pages-built-with-js-48aedfc3a048e2a7cf08.js","sourcesContent":["import React from \"react\"\nimport { graphql } from \"gatsby\"\n\nimport { isInitialRoute } from \"../components/route-update-history\"\n\nimport Layout from \"../components/layout\"\nimport Project from \"../components/project\"\nimport SEO from \"../components/seo\"\n\nimport { flatten, normalizeCollection, PROJECTS_PER_COLLECTION } from \"../utils\"\n\nimport \"./built-with-workers-page.css\"\nimport \"./collections.css\"\nimport \"./collection.css\"\n\nconst BuiltWithPage = ({\n data: {\n allSanityCollection,\n allSanityProject,\n sanityLayout,\n },\n}) => {\n const allCollections = flatten(allSanityCollection)\n let collections = sanityLayout.collections.map(collection =>\n allCollections.find(({ id }) => id === collection.id)\n )\n collections = collections.map(collection =>\n normalizeCollection(collection, flatten(allSanityProject))\n )\n\n return (\n \n \n\n
\n
\n

Built with Workers

\n

Projects across the web utilizing Cloudflare Workers.

\n

Submit a project

\n
\n\n
\n {collections.map((collection, i) => (\n
\n
\n
\n

{collection.name}

\n
\n\n
\n {collection.projects.slice(0, PROJECTS_PER_COLLECTION).map(project => (\n
\n \n
\n ))}\n
\n
\n
\n ))}\n
\n
\n
\n )\n}\n\nexport const query = graphql`\n fragment Feature on SanityFeature {\n id\n name\n description\n slug\n image {\n asset {\n fluid(maxWidth: 200) {\n ...GatsbySanityImageFluid\n }\n }\n }\n }\n\n fragment Project on SanityProject {\n id\n name\n shortDescription\n longDescription\n slug\n developer\n thumbnail: image {\n asset {\n fluid(maxWidth: 440) {\n ...GatsbySanityImageFluid\n }\n }\n }\n image {\n asset {\n fluid(maxWidth: 952) {\n ...GatsbySanityImageFluid\n }\n }\n }\n links {\n primary\n linkType\n url\n }\n features {\n id\n name\n slug\n }\n }\n\n fragment Collection on SanityCollection {\n id\n name\n projects {\n id\n }\n }\n\n query Homepage {\n allSanityProject {\n edges {\n node {\n ...Project\n }\n }\n }\n\n allSanityCollection {\n edges {\n node {\n ...Collection\n }\n }\n }\n\n sanityLayout(page_id: { eq: \"homepage\" }) {\n collections {\n id\n }\n }\n }\n`\n\nexport default BuiltWithPage\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 delete convertedProps.resolutions;\n }\n\n if (sizes) {\n convertedProps.fluid = sizes;\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 * 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}[], fixed: {src: string}[]}} args\n * @return {string}\n */\n\n\nvar getImageSrcKey = function getImageSrcKey(_ref) {\n var fluid = _ref.fluid,\n fixed = _ref.fixed;\n var data = fluid && fluid[0] || fixed && fixed[0];\n return data.src;\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); // Find src\n\n var src = getImageSrcKey(convertedProps);\n return imageCache[src] || false;\n};\n\nvar activateCacheForImage = function activateCacheForImage(props) {\n var convertedProps = convertProps(props); // Find src\n\n var src = getImageSrcKey(convertedProps);\n imageCache[src] = true;\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 (_ref2) {\n var src = _ref2.src,\n srcSet = _ref2.srcSet,\n srcSetWebp = _ref2.srcSetWebp,\n media = _ref2.media,\n sizes = _ref2.sizes;\n return _react[\"default\"].createElement(_react[\"default\"].Fragment, {\n key: src\n }, srcSetWebp && _react[\"default\"].createElement(\"source\", {\n type: \"image/webp\",\n media: media,\n srcSet: srcSetWebp,\n sizes: sizes\n }), _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 (_ref3) {\n var src = _ref3.src,\n media = _ref3.media,\n tracedSVG = _ref3.tracedSVG;\n return _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 (_ref4) {\n var src = _ref4.src,\n media = _ref4.media,\n base64 = _ref4.base64;\n return _react[\"default\"].createElement(\"source\", {\n key: src,\n media: media,\n srcSet: base64\n });\n });\n}\n\nfunction generateNoscriptSource(_ref5, isWebp) {\n var srcSet = _ref5.srcSet,\n srcSetWebp = _ref5.srcSetWebp,\n media = _ref5.media,\n sizes = _ref5.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 = function Placeholder(_ref6) {\n var src = _ref6.src,\n imageVariants = _ref6.imageVariants,\n generateSources = _ref6.generateSources,\n spreadProps = _ref6.spreadProps;\n\n var baseImage = _react[\"default\"].createElement(Img, (0, _extends2[\"default\"])({\n src: src\n }, spreadProps));\n\n return imageVariants.length > 1 ? _react[\"default\"].createElement(\"picture\", null, generateSources(imageVariants), baseImage) : baseImage;\n};\n\nvar Img = _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 onClick = props.onClick,\n loading = props.loading,\n draggable = props.draggable,\n otherProps = (0, _objectWithoutPropertiesLoose2[\"default\"])(props, [\"sizes\", \"srcSet\", \"src\", \"style\", \"onLoad\", \"onError\", \"onClick\", \"loading\", \"draggable\"]);\n return _react[\"default\"].createElement(\"img\", (0, _extends2[\"default\"])({\n sizes: sizes,\n srcSet: srcSet,\n src: src\n }, otherProps, {\n onLoad: onLoad,\n onError: onError,\n onClick: onClick,\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 onClick: _propTypes[\"default\"].func,\n onLoad: _propTypes[\"default\"].func\n};\n\nvar Image =\n/*#__PURE__*/\nfunction (_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 };\n _this.imageRef = _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 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 return _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 imgCached: !!_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 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 };\n\n if (fluid) {\n var imageVariants = fluid;\n var image = imageVariants[0];\n return _react[\"default\"].createElement(Tag, {\n className: (className ? className : \"\") + \" gatsby-image-wrapper\",\n style: (0, _extends2[\"default\"])({\n position: \"relative\",\n overflow: \"hidden\"\n }, style),\n ref: this.handleRef,\n key: \"fluid-\" + JSON.stringify(image.srcSet)\n }, _react[\"default\"].createElement(Tag, {\n style: {\n width: \"100%\",\n paddingBottom: 100 / image.aspectRatio + \"%\"\n }\n }), bgColor && _react[\"default\"].createElement(Tag, {\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 && _react[\"default\"].createElement(Placeholder, {\n src: image.base64,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateBase64Sources\n }), image.tracedSVG && _react[\"default\"].createElement(Placeholder, {\n src: image.tracedSVG,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateTracedSVGSources\n }), this.state.isVisible && _react[\"default\"].createElement(\"picture\", null, generateImageSources(imageVariants), _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 onClick: this.props.onClick,\n itemProp: itemProp,\n loading: loading,\n draggable: draggable\n })), this.addNoScript && _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 _imageVariants = fixed;\n var _image = _imageVariants[0];\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 _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 && _react[\"default\"].createElement(Tag, {\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 && _react[\"default\"].createElement(Placeholder, {\n src: _image.base64,\n spreadProps: placeholderImageProps,\n imageVariants: _imageVariants,\n generateSources: generateBase64Sources\n }), _image.tracedSVG && _react[\"default\"].createElement(Placeholder, {\n src: _image.tracedSVG,\n spreadProps: placeholderImageProps,\n imageVariants: _imageVariants,\n generateSources: generateTracedSVGSources\n }), this.state.isVisible && _react[\"default\"].createElement(\"picture\", null, generateImageSources(_imageVariants), _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 onClick: this.props.onClick,\n itemProp: itemProp,\n loading: loading,\n draggable: draggable\n })), this.addNoScript && _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});\n\nImage.propTypes = {\n resolutions: fixedObject,\n sizes: fluidObject,\n fixed: _propTypes[\"default\"].oneOfType([fixedObject, _propTypes[\"default\"].arrayOf(fixedObject)]),\n fluid: _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 onClick: _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 { 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","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","'use strict';\n// B.2.3.6 String.prototype.fixed()\nrequire('./_string-html')('fixed', function (createHTML) {\n return function fixed() {\n return createHTML(this, 'tt', '', '');\n };\n});\n","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"],"sourceRoot":""}