diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000..b85c6b9 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,39 @@ +# https://docs.codeclimate.com/docs/default-analysis-configuration +# https://docs.codeclimate.com/docs/advanced-configuration + +version: '2' # required to adjust maintainability checks +checks: + complex-logic: + config: + threshold: 8 + method-complexity: + config: + threshold: 8 + method-lines: + config: + threshold: 40 + +exclude_patterns: + - 'config/' + - 'db/' + - 'dist/' + - 'features/' + - '**/node_modules/' + - 'script/' + - '**/spec/' + - '**/test/' + - '**/tests/' + - 'Tests/' + - '**/vendor/' + - '**/*_test.go' + - '**/*.d.ts' + - '**/@types/' + - '**/interfaces/' + - '**/_types.*' + - '**/*.stories.*' + - '**/*.test.*' + - '.storybook/' + - 'tests/' + - 'coverage/' + - '.next/' + - '.swc/' diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index ae12b32..0000000 --- a/.dockerignore +++ /dev/null @@ -1,15 +0,0 @@ -node_modules -npm-debug.log -Dockerfile* -docker-compose* -.dockerignore -.git -.gitignore -README.md -LICENSE -.vscode -public -.cache -package-lock.json -README.md -coverage diff --git a/.env.example b/.env.example index f1fc489..d1bd552 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,2 @@ -GATSBY_GITHUB_TOKEN=xxx -GATSBY_TYPEKIT_ID=xxx \ No newline at end of file +GITHUB_TOKEN=xxx +NEXT_PUBLIC_TYPEKIT_ID=xxx \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index f49eb76..0000000 --- a/.eslintrc +++ /dev/null @@ -1,31 +0,0 @@ -{ - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:testing-library/dom", - "plugin:testing-library/react" - ], - "plugins": ["react", "graphql", "prettier", "react-hooks", "testing-library"], - "parserOptions": { - "sourceType": "module", - "ecmaFeatures": { "jsx": true } - }, - "env": { - "browser": true, - "node": true, - "es2020": true, - "jest": true - }, - "rules": { - "prettier/prettier": "error", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn", - "testing-library/no-node-access": "off", - "testing-library/no-container": "off" - }, - "settings": { - "react": { - "version": "detect" - } - } -} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd28088..a215593 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,8 +20,8 @@ jobs: with: node-version: '16' - - name: Cache node modules - uses: actions/cache@v1 + - name: Cache node_modules + uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} @@ -60,43 +60,40 @@ jobs: with: node-version: '16' - - name: Cache node modules - uses: actions/cache@v1 + - name: Cache node_modules & Next.js build output + uses: actions/cache@v3 with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: ${{ runner.os }}-node- - - - name: Cache Gatsby build output - uses: actions/cache@v1 - with: - path: public - key: ${{ runner.os }}-public + path: | + ~/.npm + ${{ github.workspace }}/.next/cache + key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} + restore-keys: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}- - run: npm ci - run: npm run build env: - GATSBY_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NEXT_PUBLIC_TYPEKIT_ID: ${{ secrets.NEXT_PUBLIC_TYPEKIT_ID }} - - uses: actions/upload-artifact@v1 - if: github.ref == 'refs/heads/main' - with: - name: public - path: public + # - uses: actions/upload-artifact@v1 + # if: github.ref == 'refs/heads/main' + # with: + # name: public + # path: public - deploy: - needs: build - if: success() && github.ref == 'refs/heads/main' - runs-on: ubuntu-latest + # deploy: + # needs: build + # if: success() && github.ref == 'refs/heads/main' + # runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/download-artifact@v1 - with: - name: public - - name: Deploy to S3 - run: npm run deploy:s3 - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }} + # steps: + # - uses: actions/checkout@v2 + # - uses: actions/download-artifact@v1 + # with: + # name: public + # - name: Deploy to S3 + # run: npm run deploy:s3 + # env: + # AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + # AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + # AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }} diff --git a/.gitignore b/.gitignore index f6505e3..ea226ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,40 @@ -# Project dependencies -.cache -node_modules -yarn-error.log +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -# Build directory -/public +# dependencies +/node_modules +/.pnp +.pnp.js +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug npm-debug.log* yarn-debug.log* -plugins/gatsby-plugin-matomo -coverage -.env -static/matomo.js +yarn-error.log* +.pnpm-debug.log* +# local env files +.env*.local +.env + +# vercel .vercel -size-plugin.json \ No newline at end of file + +# typescript +*.tsbuildinfo +.swc +coverage +public/matomo.js +public/favicon/ \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..19c7bdb --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +16 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 390f23f..0000000 --- a/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Dockerfile for local development just installing dependencies. -# Use together with `docker-compose up` -FROM node:alpine - -RUN mkdir -p /portfolio -WORKDIR /portfolio -COPY package.json . - -RUN apk add --no-cache --virtual .build-deps \ - g++ \ - make \ - autoconf \ - automake \ - libtool \ - nasm \ - libc6-compat \ - libjpeg-turbo-dev \ - libpng-dev \ - git \ - bash \ - && rm -rf /var/cache/apk/* \ - && npm install \ - && npm cache clean --force \ - && apk del .build-deps diff --git a/README.md b/README.md index c1214c1..d75dc68 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@
matthiaskretschmann.com @@ -13,17 +13,16 @@
+--- + - [🎉 Features](#-features) - [💍 One data file to rule all pages](#-one-data-file-to-rule-all-pages) - - [🗂 JSON Resume](#-json-resume) + - [🖼 Project images](#-project-images) - [🐱 GitHub repositories](#-github-repositories) - [📍 Location](#-location) - [💅 Theme switcher](#-theme-switcher) - [🏆 SEO component](#-seo-component) - [📇 Client-side vCard creation](#-client-side-vcard-creation) - - [💫 Page transitions](#-page-transitions) - - [📈 Matomo (formerly Piwik) analytics tracking](#-matomo-formerly-piwik-analytics-tracking) - - [🖼 Project images](#-project-images) - [💎 Importing SVG assets](#-importing-svg-assets) - [🍬 Typekit component](#-typekit-component) - [✨ Development](#-development) @@ -37,28 +36,27 @@ ## 🎉 Features -The whole [portfolio](https://matthiaskretschmann.com) is a React-based single page app built with [Gatsby v3](https://www.gatsbyjs.org). +The whole [portfolio](https://matthiaskretschmann.com) is a React-based single page app built with [Next.js](https://nextjs.org) in Typescript, using only statically generated pages. -Most metadata is powered by one `resume.json` file based on [🗂 JSON Resume](#-json-resume), and one `projects.yml` file to [define the displayed projects](#-one-data-file-to-rule-all-pages). +If you are looking for the former Gatsby-based app, it is archived in the [`gatsby-deprecated`](https://github.com/kremalicious/portfolio/tree/gatsby-deprecated) branch. ### 💍 One data file to rule all pages All displayed project content is powered by one YAML file where all the portfolio's projects are defined. The project description itself is transformed from Markdown written inside the YAML file into HTML on build time. -Gatsby automatically creates pages from each item in that file utilizing the [`{ProjectsYaml.slug}.jsx`](src/pages/{ProjectsYaml.slug}.jsx) template. +Next.js automatically creates pages from each item in that file utilizing the [`[slug].tsx`](src/pages/[slug].tsx) template. -- [`content/projects.yml`](content/projects.yml) -- [`src/pages/{ProjectsYaml.slug}.jsx`](src/pages/{ProjectsYaml.slug}.jsx) +- [`_content/projects.yml`](_content/projects.yml) +- [`src/pages/[slug].tsx`](src/pages/[slug].tsx) -### 🗂 JSON Resume +### 🖼 Project images -Most site metadata and social profiles are defined in [`content/resume.json`](content/resume.json) based on the [JSON Resume](https://jsonresume.org) standard and used throughout the site as a custom React hook. Additionally, a resume page is created under `/resume`. +All project images live under `public/images` and are automatically attached to each project based on the inclusion of the project's `slug` in their filenames. -If you want to know how, have a look at the respective components: +Next.js with `next/image` generates all required image sizes for delivering responsible, responsive images to visitors, including lazy loading of all images. For this to work, images are analyzed on build time and various image metadata is passed down as props. -- [`content/resume.json`](content/resume.json) -- [`src/pages/resume/index.jsx`](src/pages/resume/index.jsx) -- [`src/hooks/use-resume.js`](src/hooks/use-resume.js) +- [`src/components/ProjectImage/index.tsx`](src/components/ProjectImage/index.tsx) +- [`src/lib/content.ts`](src/lib/content.ts) ### 🐱 GitHub repositories @@ -68,20 +66,20 @@ On build time, all my public repositories are fetched from GitHub, then filtered If you want to know how, have a look at the respective components: -- [`gatsby-node.js`](gatsby-node.js) -- [`content/repos.yml`](content/repos.yml) -- [`src/components/molecules/Repository.jsx`](src/components/molecules/Repository.jsx) +- [`src/lib/github.ts`](src/lib/github.ts) +- [`_content/repos.json`](_content/repos.json) +- [`src/components/Repository/index.tsx`](src/components/Repository/index.tsx) ### 📍 Location On client-side, my current and, if known, my next physical location on a city level is fetched from my (private) [nomadlist.com](https://nomadlist.com) profile and displayed in the header. -Fetching is split up into a serverless function, a hook, and display component. Fetching is done with a serverless function as to not expose the whole profile response into the browser. +Fetching is split up into an external serverless function, a hook, and display component. Fetching is done with a serverless function as to not expose the whole profile response into the browser. If you want to know how, have a look at the respective components: -- [`src/hooks/useLocation.js`](src/hooks/useLocation.js) -- [`src/components/molecules/Location.jsx`](src/components/molecules/Location.jsx) +- [`src/hooks/useLocation.ts`](src/hooks/useLocation.ts) +- [`src/components/Location/index.tsx`](src/components/Location/index.tsx) - [kremalicious/location](https://github.com/kremalicious/location) ### 💅 Theme switcher @@ -90,8 +88,8 @@ Includes a theme switcher which allows user to toggle between a light and a dark If you want to know how, have a look at the respective components: -- [`src/components/molecules/ThemeSwitch.jsx`](src/components/molecules/ThemeSwitch.jsx) - [`src/hooks/useDarkMode.js`](src/hooks/useDarkMode.js) +- [`src/components/ThemeSwitch/index.tsx`](src/components/ThemeSwitch/index.tsx) ### 🏆 SEO component @@ -99,7 +97,7 @@ Includes a SEO component which automatically switches all required `meta` tags f If you want to know how, have a look at the respective component: -- [`src/components/atoms/SEO.jsx`](src/components/atoms/SEO.jsx) +- [`src/components/Meta/index.tsx`](src/components/Meta/index.tsx) ### 📇 Client-side vCard creation @@ -107,44 +105,14 @@ The _Add to addressbook_ link in the footer automatically creates a downloadable If you want to know how, have a look at the respective component: -- [`src/components/atoms/Vcard.jsx`](src/components/atoms/Vcard.jsx) - -### 💫 Page transitions - -Includes mechanism for transitioning between route changes with full page transitions defined with [Framer Motion](https://www.framer.com/motion/). - -If you want to know how, have a look at the respective components: - -- [`src/components/Layout.jsx`](src/components/Layout.jsx) -- [`src/helpers/wrapPageElement.jsx`](src/helpers/wrapPageElement.jsx) -- [`gatsby-browser.js`](gatsby-browser.js) -- [`gatsby-ssr.js`](gatsby-ssr.js) - -### 📈 Matomo (formerly Piwik) analytics tracking - -Site sends usage statistics to my own [Matomo](https://matomo.org) installation. To make this work in Gatsby, I created and open sourced a plugin, [gatsby-plugin-matomo](https://github.com/kremalicious/gatsby-plugin-matomo), which is in use on this site. - -- [gatsby-plugin-matomo](https://github.com/kremalicious/gatsby-plugin-matomo) - -### 🖼 Project images - -All project images live under `content/images` and are automatically attached to each project based on the inclusion of the project's `slug` in their filenames. - -All project images make use of the excellent [gatsby-plugin-image](https://www.gatsbyjs.com/docs/reference/built-in-components/gatsby-plugin-image/) plugin, working in tandem with [gatsby-plugin-sharp](https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-plugin-sharp) and [gatsby-transformer-sharp](https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-transformer-sharp). - -All together, Gatsby automatically generates all required image sizes for delivering responsible, responsive images to visitors, including lazy loading of all images. Also includes the [intersection-observer polyfill](https://github.com/w3c/IntersectionObserver) to make lazy loading work properly in Safari. - -All project images use one single component where one main GraphQL query fragment is defined, which then gets used throughout other GraphQL queries. - -- [`src/components/atoms/ProjectImage.jsx`](src/components/atoms/ProjectImage.jsx) +- [`src/components/Vcard/index.tsx`](src/components/Vcard/index.tsx) ### 💎 Importing SVG assets -All SVG assets under `src/images/` will be converted to React components with the help of [gatsby-plugin-svgr](https://github.com/zabute/gatsby-plugin-svgr). Makes use of [SVGR](https://github.com/smooth-code/svgr) so SVG assets can be imported like so: +All SVG assets will be converted to React components with the help of [@svgr/webpack](https://react-svgr.com). Makes use of [SVGR](https://github.com/smooth-code/svgr) so SVG assets can be imported like so: ```js -import { ReactComponent as Logo } from './components/svg/Logo' - +import Logo from './components/svg/Logo' return{description}
-+
{name === 'portfolio' || name === 'blog' ? null : !isExternal && @@ -43,7 +43,3 @@ export default function Repository({ repo }) {
- {basics.label.toLowerCase()} -
- -Résumé
-- {item.language} - {item.fluency} -
- ))} -- You might want to check the url, or{' '} - go back to the homepage. Or just check out some{' '} - {tag} gifs, entirely your choice. -
- - - -Since 2017 I'm leading the UI design & development of Ocean Protocol, iterating on a components-based UI design system spanning all of Ocean Protocol's web properties. Additionally, I conceptualize, execute and iterate on the creative and visual direction of the Ocean Protocol brand.
\nMost web interfaces are single-page JavaScript applications built with React, pulling their data from multiple sources. All design & development is embedded in continuous deployment processes via GitHub, Travis, Kubernetes, and Vercel.
\nIn 2020 I was leading the refresh of Ocean Protocol's visual identity for the release of v3 and the Ocean Market.
\nInitial website in collaboration with Balance. Key visuals in collaboration with Wojciech Hupert.
\n", - "excerpt": "Since 2017 I'm leading the UI design & development of Ocean Protocol, iterating on a components-based UI design system spanning all of Ocean Protocol's web properties. Additionally, I conceptualize, execute and iterate on the creative and visual direction of the Ocean Protocol brand.\nMost web interfaces are..." + "title": "Ocean Market", + "description": "As part of Ocean Protocol v3, I was leading the planning and execution of the Ocean Market product and decentralized web app in 2020. Ocean Market allows simple tokenization, secure sharing, and monetization of data assets within the Ethereum network with the help of data tokens.\nAssets can be exposed to dynamic price discovery by attaching Automated Market Maker (AMM) pools to them. Metadata is stored on-chain, and all actions like downloading or Compute-to-Data are done via exchanging data tokens, creating trustless provenance records in the process.\nThe market project is open-source and has been forked and used to create further data marketplaces on top of Ocean Protocol.", + "descriptionHtml": "As part of Ocean Protocol v3, I was leading the planning and execution of the Ocean Market product and decentralized web app in 2020. Ocean Market allows simple tokenization, secure sharing, and monetization of data assets within the Ethereum network with the help of data tokens.\nAssets can be exposed to dynamic price discovery by attaching Automated Market Maker (AMM) pools to them. Metadata is stored on-chain, and all actions like downloading or Compute-to-Data are done via exchanging data tokens, creating trustless provenance records in the process.\nThe market project is open-source and has been forked and used to create further data marketplaces on top of Ocean Protocol.
\n", + "slug": "oceanprotocol-market", + "techstack": [ + "HTML", + "CSS", + "formatScript", + "React", + "Ethereum", + "Web3", + "3Box", + "Polygon", + "Binance Smart Chain" + ], + "links": [ + { + "title": "Ocean Makes Multi-Network Even Easier", + "icon": "FileText", + "url": "https://kremalicious.com/ocean-makes-multi-network-even-easier" }, - "links": [ - { - "title": "oceanprotocol.com", - "url": "https://oceanprotocol.com", - "icon": "Compass" - }, - { - "title": "Styleguide", - "url": "https://oceanprotocol.com/art", - "icon": null - }, - { - "title": "docs.oceanprotocol.com", - "url": "https://docs.oceanprotocol.com", - "icon": "Compass" - }, - { - "title": "@oceanprotocol/art", - "url": "https://github.com/oceanprotocol/art", - "icon": "GitHub" - }, - { - "title": "@oceanprotocol/docs", - "url": "https://github.com/oceanprotocol/docs", - "icon": "GitHub" - } - ], - "techstack": [ - "Sketch", - "Affinity Designer", - "React", - "Gatsby", - "Next.js", - "HTML", - "SCSS", - "JavaScript", - "TypeScript", - "Travis", - "AWS S3", - "Cloudflare", - "Ethereum", - "Docker", - "Kubernetes", - "IPFS" - ], - "img": { - "childImageSharp": { - "twitterImage": { - "src": "/static/674f679841915ed59da7394e937f8f8f/ccef1/oceanprotocol-v1-01.png" - } - } + { + "title": "Ocean Market: An Open-Source Community Marketplace for Data", + "icon": "FileText", + "url": "https://blog.oceanprotocol.com/ocean-market-an-open-source-community-marketplace-for-data-4b99bedacdc3" + }, + { + "title": "market.oceanprotocol.com", + "icon": "Compass", + "url": "https://market.oceanprotocol.com" + }, + { + "title": "@oceanprotocol/market", + "icon": "GitHub", + "url": "https://github.com/oceanprotocol/market" } - }, - "projectImages": { - "edges": [ - { - "node": { - "id": "0bb861dd-385c-5081-96c6-e6e6d87bf227", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/c2aed5f899971799a903fd8ced8f3114/ce694/oceanprotocol-commons-01.png", - "srcSet": "/static/c2aed5f899971799a903fd8ced8f3114/40caa/oceanprotocol-commons-01.png 360w,\n/static/c2aed5f899971799a903fd8ced8f3114/c5f5d/oceanprotocol-commons-01.png 720w,\n/static/c2aed5f899971799a903fd8ced8f3114/ce694/oceanprotocol-commons-01.png 1440w,\n/static/c2aed5f899971799a903fd8ced8f3114/cf037/oceanprotocol-commons-01.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/c2aed5f899971799a903fd8ced8f3114/f5d1b/oceanprotocol-commons-01.webp 360w,\n/static/c2aed5f899971799a903fd8ced8f3114/0b212/oceanprotocol-commons-01.webp 720w,\n/static/c2aed5f899971799a903fd8ced8f3114/ca3cc/oceanprotocol-commons-01.webp 1440w,\n/static/c2aed5f899971799a903fd8ced8f3114/5c5e9/oceanprotocol-commons-01.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "b7c89abb-87e4-5af7-a4db-74ba3ad8cd7f", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/0dda6c1f4f857d25fec71f2f16f7b3e5/ce694/oceanprotocol-commons-02.png", - "srcSet": "/static/0dda6c1f4f857d25fec71f2f16f7b3e5/40caa/oceanprotocol-commons-02.png 360w,\n/static/0dda6c1f4f857d25fec71f2f16f7b3e5/c5f5d/oceanprotocol-commons-02.png 720w,\n/static/0dda6c1f4f857d25fec71f2f16f7b3e5/ce694/oceanprotocol-commons-02.png 1440w,\n/static/0dda6c1f4f857d25fec71f2f16f7b3e5/cf037/oceanprotocol-commons-02.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/0dda6c1f4f857d25fec71f2f16f7b3e5/f5d1b/oceanprotocol-commons-02.webp 360w,\n/static/0dda6c1f4f857d25fec71f2f16f7b3e5/0b212/oceanprotocol-commons-02.webp 720w,\n/static/0dda6c1f4f857d25fec71f2f16f7b3e5/ca3cc/oceanprotocol-commons-02.webp 1440w,\n/static/0dda6c1f4f857d25fec71f2f16f7b3e5/5c5e9/oceanprotocol-commons-02.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "39a06cc4-7b33-5402-b291-e281883f40df", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/57ca1cf313ffe317506e5c3136458172/ce694/oceanprotocol-commons-03.png", - "srcSet": "/static/57ca1cf313ffe317506e5c3136458172/40caa/oceanprotocol-commons-03.png 360w,\n/static/57ca1cf313ffe317506e5c3136458172/c5f5d/oceanprotocol-commons-03.png 720w,\n/static/57ca1cf313ffe317506e5c3136458172/ce694/oceanprotocol-commons-03.png 1440w,\n/static/57ca1cf313ffe317506e5c3136458172/cf037/oceanprotocol-commons-03.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/57ca1cf313ffe317506e5c3136458172/f5d1b/oceanprotocol-commons-03.webp 360w,\n/static/57ca1cf313ffe317506e5c3136458172/0b212/oceanprotocol-commons-03.webp 720w,\n/static/57ca1cf313ffe317506e5c3136458172/ca3cc/oceanprotocol-commons-03.webp 1440w,\n/static/57ca1cf313ffe317506e5c3136458172/5c5e9/oceanprotocol-commons-03.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "65b2eb63-5836-5c1c-94bf-69297a361c9a", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/f154f589e85335d2bfa0458934fe5098/ce694/oceanprotocol-commons-04.png", - "srcSet": "/static/f154f589e85335d2bfa0458934fe5098/40caa/oceanprotocol-commons-04.png 360w,\n/static/f154f589e85335d2bfa0458934fe5098/c5f5d/oceanprotocol-commons-04.png 720w,\n/static/f154f589e85335d2bfa0458934fe5098/ce694/oceanprotocol-commons-04.png 1440w,\n/static/f154f589e85335d2bfa0458934fe5098/cf037/oceanprotocol-commons-04.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/f154f589e85335d2bfa0458934fe5098/f5d1b/oceanprotocol-commons-04.webp 360w,\n/static/f154f589e85335d2bfa0458934fe5098/0b212/oceanprotocol-commons-04.webp 720w,\n/static/f154f589e85335d2bfa0458934fe5098/ca3cc/oceanprotocol-commons-04.webp 1440w,\n/static/f154f589e85335d2bfa0458934fe5098/5c5e9/oceanprotocol-commons-04.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "1195af99-ad24-58a1-91c8-363404b5a9d7", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/c83aaf5a493aef55d3433f5294924354/ce694/oceanprotocol-commons-05.png", - "srcSet": "/static/c83aaf5a493aef55d3433f5294924354/40caa/oceanprotocol-commons-05.png 360w,\n/static/c83aaf5a493aef55d3433f5294924354/c5f5d/oceanprotocol-commons-05.png 720w,\n/static/c83aaf5a493aef55d3433f5294924354/ce694/oceanprotocol-commons-05.png 1440w,\n/static/c83aaf5a493aef55d3433f5294924354/cf037/oceanprotocol-commons-05.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/c83aaf5a493aef55d3433f5294924354/f5d1b/oceanprotocol-commons-05.webp 360w,\n/static/c83aaf5a493aef55d3433f5294924354/0b212/oceanprotocol-commons-05.webp 720w,\n/static/c83aaf5a493aef55d3433f5294924354/ca3cc/oceanprotocol-commons-05.webp 1440w,\n/static/c83aaf5a493aef55d3433f5294924354/5c5e9/oceanprotocol-commons-05.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "e140eb7b-cf21-5198-909f-2220ff5476cd", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#181818", - "images": { - "fallback": { - "src": "/static/76ebcd707f5a3e8b65e786c1772d243b/ce694/oceanprotocol-ipfs-01.png", - "srcSet": "/static/76ebcd707f5a3e8b65e786c1772d243b/40caa/oceanprotocol-ipfs-01.png 360w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/c5f5d/oceanprotocol-ipfs-01.png 720w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/ce694/oceanprotocol-ipfs-01.png 1440w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/cf037/oceanprotocol-ipfs-01.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/76ebcd707f5a3e8b65e786c1772d243b/f5d1b/oceanprotocol-ipfs-01.webp 360w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/0b212/oceanprotocol-ipfs-01.webp 720w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/ca3cc/oceanprotocol-ipfs-01.webp 1440w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/5c5e9/oceanprotocol-ipfs-01.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "83175de1-8822-59fc-9ecb-268302d187a0", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/135a70a331a1c4ffcc1ebf4c02460e05/ce694/oceanprotocol-ipfs-02.png", - "srcSet": "/static/135a70a331a1c4ffcc1ebf4c02460e05/40caa/oceanprotocol-ipfs-02.png 360w,\n/static/135a70a331a1c4ffcc1ebf4c02460e05/c5f5d/oceanprotocol-ipfs-02.png 720w,\n/static/135a70a331a1c4ffcc1ebf4c02460e05/ce694/oceanprotocol-ipfs-02.png 1440w,\n/static/135a70a331a1c4ffcc1ebf4c02460e05/cf037/oceanprotocol-ipfs-02.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/135a70a331a1c4ffcc1ebf4c02460e05/f5d1b/oceanprotocol-ipfs-02.webp 360w,\n/static/135a70a331a1c4ffcc1ebf4c02460e05/0b212/oceanprotocol-ipfs-02.webp 720w,\n/static/135a70a331a1c4ffcc1ebf4c02460e05/ca3cc/oceanprotocol-ipfs-02.webp 1440w,\n/static/135a70a331a1c4ffcc1ebf4c02460e05/5c5e9/oceanprotocol-ipfs-02.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "83a39174-a39e-547a-9cc8-3e0cf795b45c", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/674f679841915ed59da7394e937f8f8f/ce694/oceanprotocol-v1-01.png", - "srcSet": "/static/674f679841915ed59da7394e937f8f8f/40caa/oceanprotocol-v1-01.png 360w,\n/static/674f679841915ed59da7394e937f8f8f/c5f5d/oceanprotocol-v1-01.png 720w,\n/static/674f679841915ed59da7394e937f8f8f/ce694/oceanprotocol-v1-01.png 1440w,\n/static/674f679841915ed59da7394e937f8f8f/cf037/oceanprotocol-v1-01.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/674f679841915ed59da7394e937f8f8f/f5d1b/oceanprotocol-v1-01.webp 360w,\n/static/674f679841915ed59da7394e937f8f8f/0b212/oceanprotocol-v1-01.webp 720w,\n/static/674f679841915ed59da7394e937f8f8f/ca3cc/oceanprotocol-v1-01.webp 1440w,\n/static/674f679841915ed59da7394e937f8f8f/5c5e9/oceanprotocol-v1-01.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "7bec1ade-3ab4-589f-80fd-3ea2b34e62cb", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#181818", - "images": { - "fallback": { - "src": "/static/32988a616cc5bc2354e02d16149dbcd6/ce694/oceanprotocol-v1-02.png", - "srcSet": "/static/32988a616cc5bc2354e02d16149dbcd6/40caa/oceanprotocol-v1-02.png 360w,\n/static/32988a616cc5bc2354e02d16149dbcd6/c5f5d/oceanprotocol-v1-02.png 720w,\n/static/32988a616cc5bc2354e02d16149dbcd6/ce694/oceanprotocol-v1-02.png 1440w,\n/static/32988a616cc5bc2354e02d16149dbcd6/cf037/oceanprotocol-v1-02.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/32988a616cc5bc2354e02d16149dbcd6/f5d1b/oceanprotocol-v1-02.webp 360w,\n/static/32988a616cc5bc2354e02d16149dbcd6/0b212/oceanprotocol-v1-02.webp 720w,\n/static/32988a616cc5bc2354e02d16149dbcd6/ca3cc/oceanprotocol-v1-02.webp 1440w,\n/static/32988a616cc5bc2354e02d16149dbcd6/5c5e9/oceanprotocol-v1-02.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "4ae20cbb-bf65-58c0-9ecf-0e12fca45d55", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#181818", - "images": { - "fallback": { - "src": "/static/cb2de0894d8c65a935c1fb52c9f67319/ce694/oceanprotocol-v1-03.png", - "srcSet": "/static/cb2de0894d8c65a935c1fb52c9f67319/40caa/oceanprotocol-v1-03.png 360w,\n/static/cb2de0894d8c65a935c1fb52c9f67319/c5f5d/oceanprotocol-v1-03.png 720w,\n/static/cb2de0894d8c65a935c1fb52c9f67319/ce694/oceanprotocol-v1-03.png 1440w,\n/static/cb2de0894d8c65a935c1fb52c9f67319/cf037/oceanprotocol-v1-03.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/cb2de0894d8c65a935c1fb52c9f67319/f5d1b/oceanprotocol-v1-03.webp 360w,\n/static/cb2de0894d8c65a935c1fb52c9f67319/0b212/oceanprotocol-v1-03.webp 720w,\n/static/cb2de0894d8c65a935c1fb52c9f67319/ca3cc/oceanprotocol-v1-03.webp 1440w,\n/static/cb2de0894d8c65a935c1fb52c9f67319/5c5e9/oceanprotocol-v1-03.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "afd37263-cbbc-5e65-9a9b-81ffb8dbe3a0", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#181818", - "images": { - "fallback": { - "src": "/static/cb7b8721aa4d44eb86e870364672ff52/ce694/oceanprotocol-v1-04.png", - "srcSet": "/static/cb7b8721aa4d44eb86e870364672ff52/40caa/oceanprotocol-v1-04.png 360w,\n/static/cb7b8721aa4d44eb86e870364672ff52/c5f5d/oceanprotocol-v1-04.png 720w,\n/static/cb7b8721aa4d44eb86e870364672ff52/ce694/oceanprotocol-v1-04.png 1440w,\n/static/cb7b8721aa4d44eb86e870364672ff52/cf037/oceanprotocol-v1-04.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/cb7b8721aa4d44eb86e870364672ff52/f5d1b/oceanprotocol-v1-04.webp 360w,\n/static/cb7b8721aa4d44eb86e870364672ff52/0b212/oceanprotocol-v1-04.webp 720w,\n/static/cb7b8721aa4d44eb86e870364672ff52/ca3cc/oceanprotocol-v1-04.webp 1440w,\n/static/cb7b8721aa4d44eb86e870364672ff52/5c5e9/oceanprotocol-v1-04.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "5295d766-6bfa-5bdf-8a73-ae6cf0bd4092", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#181828", - "images": { - "fallback": { - "src": "/static/efd50223e7de013c9e2511cffe3c035f/ce694/oceanprotocol-v1-05.png", - "srcSet": "/static/efd50223e7de013c9e2511cffe3c035f/40caa/oceanprotocol-v1-05.png 360w,\n/static/efd50223e7de013c9e2511cffe3c035f/c5f5d/oceanprotocol-v1-05.png 720w,\n/static/efd50223e7de013c9e2511cffe3c035f/ce694/oceanprotocol-v1-05.png 1440w,\n/static/efd50223e7de013c9e2511cffe3c035f/cf037/oceanprotocol-v1-05.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/efd50223e7de013c9e2511cffe3c035f/f5d1b/oceanprotocol-v1-05.webp 360w,\n/static/efd50223e7de013c9e2511cffe3c035f/0b212/oceanprotocol-v1-05.webp 720w,\n/static/efd50223e7de013c9e2511cffe3c035f/ca3cc/oceanprotocol-v1-05.webp 1440w,\n/static/efd50223e7de013c9e2511cffe3c035f/5c5e9/oceanprotocol-v1-05.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "da6697fa-fd1f-5b93-b682-ea1c56f95b83", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#181818", - "images": { - "fallback": { - "src": "/static/c6298808496bc5a8dd0d7a707cb9e0bf/ce694/oceanprotocol-v1-06.png", - "srcSet": "/static/c6298808496bc5a8dd0d7a707cb9e0bf/40caa/oceanprotocol-v1-06.png 360w,\n/static/c6298808496bc5a8dd0d7a707cb9e0bf/c5f5d/oceanprotocol-v1-06.png 720w,\n/static/c6298808496bc5a8dd0d7a707cb9e0bf/ce694/oceanprotocol-v1-06.png 1440w,\n/static/c6298808496bc5a8dd0d7a707cb9e0bf/cf037/oceanprotocol-v1-06.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/c6298808496bc5a8dd0d7a707cb9e0bf/f5d1b/oceanprotocol-v1-06.webp 360w,\n/static/c6298808496bc5a8dd0d7a707cb9e0bf/0b212/oceanprotocol-v1-06.webp 720w,\n/static/c6298808496bc5a8dd0d7a707cb9e0bf/ca3cc/oceanprotocol-v1-06.webp 1440w,\n/static/c6298808496bc5a8dd0d7a707cb9e0bf/5c5e9/oceanprotocol-v1-06.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - }, - { - "node": { - "id": "1ca0c411-255d-50ca-8c79-9a2a3586fba0", - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#083838", - "images": { - "fallback": { - "src": "/static/1531cd220bd930dc463b75b0eb57c6ca/ce694/oceanprotocol-v1-07.png", - "srcSet": "/static/1531cd220bd930dc463b75b0eb57c6ca/40caa/oceanprotocol-v1-07.png 360w,\n/static/1531cd220bd930dc463b75b0eb57c6ca/c5f5d/oceanprotocol-v1-07.png 720w,\n/static/1531cd220bd930dc463b75b0eb57c6ca/ce694/oceanprotocol-v1-07.png 1440w,\n/static/1531cd220bd930dc463b75b0eb57c6ca/cf037/oceanprotocol-v1-07.png 2880w", - "sizes": "(min-width: 1440px) 1440px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/1531cd220bd930dc463b75b0eb57c6ca/f5d1b/oceanprotocol-v1-07.webp 360w,\n/static/1531cd220bd930dc463b75b0eb57c6ca/0b212/oceanprotocol-v1-07.webp 720w,\n/static/1531cd220bd930dc463b75b0eb57c6ca/ca3cc/oceanprotocol-v1-07.webp 1440w,\n/static/1531cd220bd930dc463b75b0eb57c6ca/5c5e9/oceanprotocol-v1-07.webp 2880w", - "type": "image/webp", - "sizes": "(min-width: 1440px) 1440px, 100vw" - } - ] - }, - "width": 1440, - "height": 800 - } - } - } - ] - }, - "extensions": {} + ], + "images": [ + { + "src": "/images/oceanprotocol-market-01.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIklEQVR4nGPYs3u3o4NjcnLyuXPnGM6dOyckJGRqagrkAACh+gwx3PBT3AAAAABJRU5ErkJggg==" + }, + { + "src": "/images/oceanprotocol-market-02.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIUlEQVR4nGPg4+MzMzVTU1FjZGRk4OPje/bs+aFDh4AcADwVBmUswjyuAAAAAElFTkSuQmCC" + }, + { + "src": "/images/oceanprotocol-market-03.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAI0lEQVR4nGPg4+Pbu2/f1CnT+fj4GFhZWD79/P3g3iNRYREAefgKHUsXFTIAAAAASUVORK5CYII=" + }, + { + "src": "/images/oceanprotocol-market-04.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAI0lEQVR4nGNgYGKSkpJ6+fLVnz9/GDiYOGSkZV89e/Xv7z8Ae1oMHMU2B+IAAAAASUVORK5CYII=" + }, + { + "src": "/images/oceanprotocol-market-05.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAI0lEQVR4nGP4////u3fvpKWkOdnYGf7////h3QdJCSkmJmYAwiIMS8eeLo0AAAAASUVORK5CYII=" + } + ] } diff --git a/tests/__fixtures__/projectImageFiles.json b/tests/__fixtures__/projectImageFiles.json deleted file mode 100644 index 4aa9d71..0000000 --- a/tests/__fixtures__/projectImageFiles.json +++ /dev/null @@ -1,361 +0,0 @@ -{ - "projectImageFiles": { - "edges": [ - { - "node": { - "name": "meta" - } - }, - { - "node": { - "name": "projects" - } - }, - { - "node": { - "name": "chartmogul-05" - } - }, - { - "node": { - "name": "ezeep-05" - } - }, - { - "node": { - "name": "ezeep-06" - } - }, - { - "node": { - "name": "ipixelpad-01" - } - }, - { - "node": { - "name": "allinnia-02" - } - }, - { - "node": { - "name": "ezeep-03" - } - }, - { - "node": { - "name": "ipdb-04" - } - }, - { - "node": { - "name": "allinnia-03" - } - }, - { - "node": { - "name": "ezeep-07" - } - }, - { - "node": { - "name": "unihalle-03" - } - }, - { - "node": { - "name": "oceanprotocol-05" - } - }, - { - "node": { - "name": "apertureloupe-01" - } - }, - { - "node": { - "name": "coffeecup-01" - } - }, - { - "node": { - "name": "ipdb-01" - } - }, - { - "node": { - "name": "ezeep-04" - } - }, - { - "node": { - "name": "mrreader-01" - } - }, - { - "node": { - "name": "mrreader-02" - } - }, - { - "node": { - "name": "unihalle-02" - } - }, - { - "node": { - "name": "chartmogul-02" - } - }, - { - "node": { - "name": "ipdb-03" - } - }, - { - "node": { - "name": "bigchaindb-02" - } - }, - { - "node": { - "name": "chartmogul-03" - } - }, - { - "node": { - "name": "ipdb-02" - } - }, - { - "node": { - "name": "oceanprotocol-02" - } - }, - { - "node": { - "name": "bigchaindb-03" - } - }, - { - "node": { - "name": "ezeep-08" - } - }, - { - "node": { - "name": "ezeep-02" - } - }, - { - "node": { - "name": "oceanprotocol-03" - } - }, - { - "node": { - "name": "outofwhaleoil-02" - } - }, - { - "node": { - "name": "bigchaindb-05" - } - }, - { - "node": { - "name": "oceanprotocol-04" - } - }, - { - "node": { - "name": "outofwhaleoil-01" - } - }, - { - "node": { - "name": "9984-02" - } - }, - { - "node": { - "name": "niepces-camera-obscura-01" - } - }, - { - "node": { - "name": "niepces-camera-obscura-02" - } - }, - { - "node": { - "name": "adiumeetie-01" - } - }, - { - "node": { - "name": "oceanprotocol-01" - } - }, - { - "node": { - "name": "outofwhaleoil-03" - } - }, - { - "node": { - "name": "unihalle-01" - } - }, - { - "node": { - "name": "ezeep-01" - } - }, - { - "node": { - "name": "chartmogul-01" - } - }, - { - "node": { - "name": "bigchaindb-04" - } - }, - { - "node": { - "name": "9984-01" - } - }, - { - "node": { - "name": "chartmogul-04" - } - }, - { - "node": { - "name": "mrreader-03" - } - }, - { - "node": { - "name": "bigchaindb-01" - } - }, - { - "node": { - "name": "projectpurple-01" - } - }, - { - "node": { - "name": "biv-01" - } - }, - { - "node": { - "name": "sharethemeal-01" - } - }, - { - "node": { - "name": "allinnia-01" - } - }, - { - "node": { - "name": "package" - } - }, - { - "node": { - "name": "day" - } - }, - { - "node": { - "name": "download" - } - }, - { - "node": { - "name": "blog" - } - }, - { - "node": { - "name": "dribbble" - } - }, - { - "node": { - "name": "email" - } - }, - { - "node": { - "name": "favicon" - } - }, - { - "node": { - "name": "github" - } - }, - { - "node": { - "name": "index" - } - }, - { - "node": { - "name": "info" - } - }, - { - "node": { - "name": "logo" - } - }, - { - "node": { - "name": "images" - } - }, - { - "node": { - "name": "night" - } - }, - { - "node": { - "name": "link" - } - }, - { - "node": { - "name": "twitter-card" - } - }, - { - "node": { - "name": "twitter" - } - }, - { - "node": { - "name": "styleguide" - } - }, - { - "node": { - "name": "github-header" - } - }, - { - "node": { - "name": "avatar" - } - } - ] - } -} diff --git a/tests/__fixtures__/projects.json b/tests/__fixtures__/projects.json index a841e15..b7300e9 100644 --- a/tests/__fixtures__/projects.json +++ b/tests/__fixtures__/projects.json @@ -1,956 +1,128 @@ -{ - "allProjectsYaml": { - "edges": [ +[ + { + "title": "Ocean Market", + "slug": "oceanprotocol-market", + "description": "As part of Ocean Protocol v3, I was leading the planning and execution of the Ocean Market product and decentralized web app in 2020. Ocean Market allows simple tokenization, secure sharing, and monetization of data assets within the Ethereum network with the help of data tokens.\n\nAssets can be exposed to dynamic price discovery by attaching Automated Market Maker (AMM) pools to them. Metadata is stored on-chain, and all actions like downloading or Compute-to-Data are done via exchanging data tokens, creating trustless provenance records in the process.\n\nThe market project is open-source and has been forked and used to create further data marketplaces on top of Ocean Protocol.\n", + "descriptionHtml": "As part of Ocean Protocol v3, I was leading the planning and execution of the Ocean Market product and decentralized web app in 2020. Ocean Market allows simple tokenization, secure sharing, and monetization of data assets within the Ethereum network with the help of data tokens.\n\nAssets can be exposed to dynamic price discovery by attaching Automated Market Maker (AMM) pools to them. Metadata is stored on-chain, and all actions like downloading or Compute-to-Data are done via exchanging data tokens, creating trustless provenance records in the process.\n\nThe market project is open-source and has been forked and used to create further data marketplaces on top of Ocean Protocol.
", + "techstack": [ + "HTML", + "CSS", + "formatScript", + "React", + "Ethereum", + "Web3", + "3Box", + "Polygon", + "Binance Smart Chain" + ], + "links": [ { - "node": { - "title": "Ocean Protocol - IPFS Integration", - "slug": "/oceanprotocol-ipfs/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#181818", - "images": { - "fallback": { - "src": "/static/76ebcd707f5a3e8b65e786c1772d243b/53a0b/oceanprotocol-ipfs-01.png", - "srcSet": "/static/76ebcd707f5a3e8b65e786c1772d243b/6f0a4/oceanprotocol-ipfs-01.png 185w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/556c8/oceanprotocol-ipfs-01.png 370w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/53a0b/oceanprotocol-ipfs-01.png 740w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/d4077/oceanprotocol-ipfs-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/76ebcd707f5a3e8b65e786c1772d243b/b09fa/oceanprotocol-ipfs-01.webp 185w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/407fa/oceanprotocol-ipfs-01.webp 370w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/a550a/oceanprotocol-ipfs-01.webp 740w,\n/static/76ebcd707f5a3e8b65e786c1772d243b/63a41/oceanprotocol-ipfs-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } + "title": "Ocean Makes Multi-Network Even Easier", + "icon": "FileText", + "url": "https://kremalicious.com/ocean-makes-multi-network-even-easier" }, { - "node": { - "title": "Ocean Protocol - Commons", - "slug": "/oceanprotocol-commons/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/c2aed5f899971799a903fd8ced8f3114/53a0b/oceanprotocol-commons-01.png", - "srcSet": "/static/c2aed5f899971799a903fd8ced8f3114/6f0a4/oceanprotocol-commons-01.png 185w,\n/static/c2aed5f899971799a903fd8ced8f3114/556c8/oceanprotocol-commons-01.png 370w,\n/static/c2aed5f899971799a903fd8ced8f3114/53a0b/oceanprotocol-commons-01.png 740w,\n/static/c2aed5f899971799a903fd8ced8f3114/d4077/oceanprotocol-commons-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/c2aed5f899971799a903fd8ced8f3114/b09fa/oceanprotocol-commons-01.webp 185w,\n/static/c2aed5f899971799a903fd8ced8f3114/407fa/oceanprotocol-commons-01.webp 370w,\n/static/c2aed5f899971799a903fd8ced8f3114/a550a/oceanprotocol-commons-01.webp 740w,\n/static/c2aed5f899971799a903fd8ced8f3114/63a41/oceanprotocol-commons-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } + "title": "Ocean Market: An Open-Source Community Marketplace for Data", + "icon": "FileText", + "url": "https://blog.oceanprotocol.com/ocean-market-an-open-source-community-marketplace-for-data-4b99bedacdc3\n" }, { - "node": { - "title": "Ocean Protocol v1", - "slug": "/oceanprotocol-v1/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/674f679841915ed59da7394e937f8f8f/53a0b/oceanprotocol-v1-01.png", - "srcSet": "/static/674f679841915ed59da7394e937f8f8f/6f0a4/oceanprotocol-v1-01.png 185w,\n/static/674f679841915ed59da7394e937f8f8f/556c8/oceanprotocol-v1-01.png 370w,\n/static/674f679841915ed59da7394e937f8f8f/53a0b/oceanprotocol-v1-01.png 740w,\n/static/674f679841915ed59da7394e937f8f8f/d4077/oceanprotocol-v1-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/674f679841915ed59da7394e937f8f8f/b09fa/oceanprotocol-v1-01.webp 185w,\n/static/674f679841915ed59da7394e937f8f8f/407fa/oceanprotocol-v1-01.webp 370w,\n/static/674f679841915ed59da7394e937f8f8f/a550a/oceanprotocol-v1-01.webp 740w,\n/static/674f679841915ed59da7394e937f8f8f/63a41/oceanprotocol-v1-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } + "title": "market.oceanprotocol.com", + "icon": "Compass", + "url": "https://market.oceanprotocol.com" }, { - "node": { - "title": "IPDB", - "slug": "/ipdb/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#084858", - "images": { - "fallback": { - "src": "/static/acb1835345fea2d0585c1091a7a5e2c1/53a0b/ipdb-01.png", - "srcSet": "/static/acb1835345fea2d0585c1091a7a5e2c1/6f0a4/ipdb-01.png 185w,\n/static/acb1835345fea2d0585c1091a7a5e2c1/556c8/ipdb-01.png 370w,\n/static/acb1835345fea2d0585c1091a7a5e2c1/53a0b/ipdb-01.png 740w,\n/static/acb1835345fea2d0585c1091a7a5e2c1/d4077/ipdb-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/acb1835345fea2d0585c1091a7a5e2c1/b09fa/ipdb-01.webp 185w,\n/static/acb1835345fea2d0585c1091a7a5e2c1/407fa/ipdb-01.webp 370w,\n/static/acb1835345fea2d0585c1091a7a5e2c1/a550a/ipdb-01.webp 740w,\n/static/acb1835345fea2d0585c1091a7a5e2c1/63a41/ipdb-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } + "title": "@oceanprotocol/market", + "icon": "GitHub", + "url": "https://github.com/oceanprotocol/market" + } + ], + "images": [ + { + "src": "/images/oceanprotocol-market-01.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIklEQVR4nGPYs3u3o4NjcnLyuXPnGM6dOyckJGRqagrkAACh+gwx3PBT3AAAAABJRU5ErkJggg==" }, { - "node": { - "title": "Berlin Innovation Ventures", - "slug": "/biv/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#283848", - "images": { - "fallback": { - "src": "/static/ed917fad5fb6829ce2234fabcbea9b49/53a0b/biv-01.png", - "srcSet": "/static/ed917fad5fb6829ce2234fabcbea9b49/6f0a4/biv-01.png 185w,\n/static/ed917fad5fb6829ce2234fabcbea9b49/556c8/biv-01.png 370w,\n/static/ed917fad5fb6829ce2234fabcbea9b49/53a0b/biv-01.png 740w,\n/static/ed917fad5fb6829ce2234fabcbea9b49/d4077/biv-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/ed917fad5fb6829ce2234fabcbea9b49/b09fa/biv-01.webp 185w,\n/static/ed917fad5fb6829ce2234fabcbea9b49/407fa/biv-01.webp 370w,\n/static/ed917fad5fb6829ce2234fabcbea9b49/a550a/biv-01.webp 740w,\n/static/ed917fad5fb6829ce2234fabcbea9b49/63a41/biv-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } + "src": "/images/oceanprotocol-market-02.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIUlEQVR4nGPg4+MzMzVTU1FjZGRk4OPje/bs+aFDh4AcADwVBmUswjyuAAAAAElFTkSuQmCC" }, { - "node": { - "title": "9984 >> Summit 2017", - "slug": "/9984/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#e8e8e8", - "images": { - "fallback": { - "src": "/static/ce6c8319412d8d0b8c659f67d173a97c/53a0b/9984-01.png", - "srcSet": "/static/ce6c8319412d8d0b8c659f67d173a97c/6f0a4/9984-01.png 185w,\n/static/ce6c8319412d8d0b8c659f67d173a97c/556c8/9984-01.png 370w,\n/static/ce6c8319412d8d0b8c659f67d173a97c/53a0b/9984-01.png 740w,\n/static/ce6c8319412d8d0b8c659f67d173a97c/d4077/9984-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/ce6c8319412d8d0b8c659f67d173a97c/b09fa/9984-01.webp 185w,\n/static/ce6c8319412d8d0b8c659f67d173a97c/407fa/9984-01.webp 370w,\n/static/ce6c8319412d8d0b8c659f67d173a97c/a550a/9984-01.webp 740w,\n/static/ce6c8319412d8d0b8c659f67d173a97c/63a41/9984-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } + "src": "/images/oceanprotocol-market-03.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAI0lEQVR4nGPg4+Pbu2/f1CnT+fj4GFhZWD79/P3g3iNRYREAefgKHUsXFTIAAAAASUVORK5CYII=" }, { - "node": { - "title": "BigchainDB", - "slug": "/bigchaindb/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#485868", - "images": { - "fallback": { - "src": "/static/fad33c2d37f62e5be6f9c155583ba3fc/53a0b/bigchaindb-01.png", - "srcSet": "/static/fad33c2d37f62e5be6f9c155583ba3fc/6f0a4/bigchaindb-01.png 185w,\n/static/fad33c2d37f62e5be6f9c155583ba3fc/556c8/bigchaindb-01.png 370w,\n/static/fad33c2d37f62e5be6f9c155583ba3fc/53a0b/bigchaindb-01.png 740w,\n/static/fad33c2d37f62e5be6f9c155583ba3fc/d4077/bigchaindb-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/fad33c2d37f62e5be6f9c155583ba3fc/b09fa/bigchaindb-01.webp 185w,\n/static/fad33c2d37f62e5be6f9c155583ba3fc/407fa/bigchaindb-01.webp 370w,\n/static/fad33c2d37f62e5be6f9c155583ba3fc/a550a/bigchaindb-01.webp 740w,\n/static/fad33c2d37f62e5be6f9c155583ba3fc/63a41/bigchaindb-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } + "src": "/images/oceanprotocol-market-04.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAI0lEQVR4nGNgYGKSkpJ6+fLVnz9/GDiYOGSkZV89e/Xv7z8Ae1oMHMU2B+IAAAAASUVORK5CYII=" }, { - "node": { - "title": "ChartMogul", - "slug": "/chartmogul/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/65f6e4c810abdf72631369b5b196a0fa/53a0b/chartmogul-01.png", - "srcSet": "/static/65f6e4c810abdf72631369b5b196a0fa/6f0a4/chartmogul-01.png 185w,\n/static/65f6e4c810abdf72631369b5b196a0fa/556c8/chartmogul-01.png 370w,\n/static/65f6e4c810abdf72631369b5b196a0fa/53a0b/chartmogul-01.png 740w,\n/static/65f6e4c810abdf72631369b5b196a0fa/d4077/chartmogul-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/65f6e4c810abdf72631369b5b196a0fa/b09fa/chartmogul-01.webp 185w,\n/static/65f6e4c810abdf72631369b5b196a0fa/407fa/chartmogul-01.webp 370w,\n/static/65f6e4c810abdf72631369b5b196a0fa/a550a/chartmogul-01.webp 740w,\n/static/65f6e4c810abdf72631369b5b196a0fa/63a41/chartmogul-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "ShareTheMeal", - "slug": "/sharethemeal/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/d00971ec082602b2f0757e795ef3669e/53a0b/sharethemeal-01.png", - "srcSet": "/static/d00971ec082602b2f0757e795ef3669e/6f0a4/sharethemeal-01.png 185w,\n/static/d00971ec082602b2f0757e795ef3669e/556c8/sharethemeal-01.png 370w,\n/static/d00971ec082602b2f0757e795ef3669e/53a0b/sharethemeal-01.png 740w,\n/static/d00971ec082602b2f0757e795ef3669e/d4077/sharethemeal-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/d00971ec082602b2f0757e795ef3669e/b09fa/sharethemeal-01.webp 185w,\n/static/d00971ec082602b2f0757e795ef3669e/407fa/sharethemeal-01.webp 370w,\n/static/d00971ec082602b2f0757e795ef3669e/a550a/sharethemeal-01.webp 740w,\n/static/d00971ec082602b2f0757e795ef3669e/63a41/sharethemeal-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "ezeep", - "slug": "/ezeep/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/0bf3f682179b1dd551b43b3533d0f103/53a0b/ezeep-01.png", - "srcSet": "/static/0bf3f682179b1dd551b43b3533d0f103/6f0a4/ezeep-01.png 185w,\n/static/0bf3f682179b1dd551b43b3533d0f103/556c8/ezeep-01.png 370w,\n/static/0bf3f682179b1dd551b43b3533d0f103/53a0b/ezeep-01.png 740w,\n/static/0bf3f682179b1dd551b43b3533d0f103/d4077/ezeep-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/0bf3f682179b1dd551b43b3533d0f103/b09fa/ezeep-01.webp 185w,\n/static/0bf3f682179b1dd551b43b3533d0f103/407fa/ezeep-01.webp 370w,\n/static/0bf3f682179b1dd551b43b3533d0f103/a550a/ezeep-01.webp 740w,\n/static/0bf3f682179b1dd551b43b3533d0f103/63a41/ezeep-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Mr. Reader", - "slug": "/mrreader/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#d8d8c8", - "images": { - "fallback": { - "src": "/static/7d47f4d930476068faaa9e3b76a0c639/53a0b/mrreader-01.png", - "srcSet": "/static/7d47f4d930476068faaa9e3b76a0c639/6f0a4/mrreader-01.png 185w,\n/static/7d47f4d930476068faaa9e3b76a0c639/556c8/mrreader-01.png 370w,\n/static/7d47f4d930476068faaa9e3b76a0c639/53a0b/mrreader-01.png 740w,\n/static/7d47f4d930476068faaa9e3b76a0c639/d4077/mrreader-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/7d47f4d930476068faaa9e3b76a0c639/b09fa/mrreader-01.webp 185w,\n/static/7d47f4d930476068faaa9e3b76a0c639/407fa/mrreader-01.webp 370w,\n/static/7d47f4d930476068faaa9e3b76a0c639/a550a/mrreader-01.webp 740w,\n/static/7d47f4d930476068faaa9e3b76a0c639/63a41/mrreader-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "iPixelPad", - "slug": "/ipixelpad/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#e8e8f8", - "images": { - "fallback": { - "src": "/static/6f255d7df0c12b2ec3bd78e92e87e121/53a0b/ipixelpad-01.png", - "srcSet": "/static/6f255d7df0c12b2ec3bd78e92e87e121/6f0a4/ipixelpad-01.png 185w,\n/static/6f255d7df0c12b2ec3bd78e92e87e121/556c8/ipixelpad-01.png 370w,\n/static/6f255d7df0c12b2ec3bd78e92e87e121/53a0b/ipixelpad-01.png 740w,\n/static/6f255d7df0c12b2ec3bd78e92e87e121/d4077/ipixelpad-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/6f255d7df0c12b2ec3bd78e92e87e121/b09fa/ipixelpad-01.webp 185w,\n/static/6f255d7df0c12b2ec3bd78e92e87e121/407fa/ipixelpad-01.webp 370w,\n/static/6f255d7df0c12b2ec3bd78e92e87e121/a550a/ipixelpad-01.webp 740w,\n/static/6f255d7df0c12b2ec3bd78e92e87e121/63a41/ipixelpad-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Out Of Whale Oil", - "slug": "/outofwhaleoil/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#588858", - "images": { - "fallback": { - "src": "/static/86ce88b849146660420149407ae47868/5cdf2/outofwhaleoil-01.jpg", - "srcSet": "/static/86ce88b849146660420149407ae47868/a8510/outofwhaleoil-01.jpg 185w,\n/static/86ce88b849146660420149407ae47868/99090/outofwhaleoil-01.jpg 370w,\n/static/86ce88b849146660420149407ae47868/5cdf2/outofwhaleoil-01.jpg 740w,\n/static/86ce88b849146660420149407ae47868/1f62b/outofwhaleoil-01.jpg 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/86ce88b849146660420149407ae47868/b09fa/outofwhaleoil-01.webp 185w,\n/static/86ce88b849146660420149407ae47868/407fa/outofwhaleoil-01.webp 370w,\n/static/86ce88b849146660420149407ae47868/a550a/outofwhaleoil-01.webp 740w,\n/static/86ce88b849146660420149407ae47868/63a41/outofwhaleoil-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Martin-Luther-Universität Halle-Wittenberg", - "slug": "/unihalle/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#f8f8f8", - "images": { - "fallback": { - "src": "/static/abcea3265322bfbc06599d7eb173e57a/53a0b/unihalle-01.png", - "srcSet": "/static/abcea3265322bfbc06599d7eb173e57a/6f0a4/unihalle-01.png 185w,\n/static/abcea3265322bfbc06599d7eb173e57a/556c8/unihalle-01.png 370w,\n/static/abcea3265322bfbc06599d7eb173e57a/53a0b/unihalle-01.png 740w,\n/static/abcea3265322bfbc06599d7eb173e57a/d4077/unihalle-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/abcea3265322bfbc06599d7eb173e57a/b09fa/unihalle-01.webp 185w,\n/static/abcea3265322bfbc06599d7eb173e57a/407fa/unihalle-01.webp 370w,\n/static/abcea3265322bfbc06599d7eb173e57a/a550a/unihalle-01.webp 740w,\n/static/abcea3265322bfbc06599d7eb173e57a/63a41/unihalle-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Coffee Cup", - "slug": "/coffeecup/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#888898", - "images": { - "fallback": { - "src": "/static/c6b5a93dc77983bf55a511a6847cbbbe/53a0b/coffeecup-01.png", - "srcSet": "/static/c6b5a93dc77983bf55a511a6847cbbbe/6f0a4/coffeecup-01.png 185w,\n/static/c6b5a93dc77983bf55a511a6847cbbbe/556c8/coffeecup-01.png 370w,\n/static/c6b5a93dc77983bf55a511a6847cbbbe/53a0b/coffeecup-01.png 740w,\n/static/c6b5a93dc77983bf55a511a6847cbbbe/d4077/coffeecup-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/c6b5a93dc77983bf55a511a6847cbbbe/b09fa/coffeecup-01.webp 185w,\n/static/c6b5a93dc77983bf55a511a6847cbbbe/407fa/coffeecup-01.webp 370w,\n/static/c6b5a93dc77983bf55a511a6847cbbbe/a550a/coffeecup-01.webp 740w,\n/static/c6b5a93dc77983bf55a511a6847cbbbe/63a41/coffeecup-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Project Purple", - "slug": "/projectpurple/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#382838", - "images": { - "fallback": { - "src": "/static/8cc647e8b1490931daa6580a40883e29/53a0b/projectpurple-01.png", - "srcSet": "/static/8cc647e8b1490931daa6580a40883e29/6f0a4/projectpurple-01.png 185w,\n/static/8cc647e8b1490931daa6580a40883e29/556c8/projectpurple-01.png 370w,\n/static/8cc647e8b1490931daa6580a40883e29/53a0b/projectpurple-01.png 740w,\n/static/8cc647e8b1490931daa6580a40883e29/d4077/projectpurple-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/8cc647e8b1490931daa6580a40883e29/b09fa/projectpurple-01.webp 185w,\n/static/8cc647e8b1490931daa6580a40883e29/407fa/projectpurple-01.webp 370w,\n/static/8cc647e8b1490931daa6580a40883e29/a550a/projectpurple-01.webp 740w,\n/static/8cc647e8b1490931daa6580a40883e29/63a41/projectpurple-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Allinnia Creative Group", - "slug": "/allinnia/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#484848", - "images": { - "fallback": { - "src": "/static/d86855c9ee74e8dfbf169ded0631f5c3/53a0b/allinnia-01.png", - "srcSet": "/static/d86855c9ee74e8dfbf169ded0631f5c3/6f0a4/allinnia-01.png 185w,\n/static/d86855c9ee74e8dfbf169ded0631f5c3/556c8/allinnia-01.png 370w,\n/static/d86855c9ee74e8dfbf169ded0631f5c3/53a0b/allinnia-01.png 740w,\n/static/d86855c9ee74e8dfbf169ded0631f5c3/d4077/allinnia-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/d86855c9ee74e8dfbf169ded0631f5c3/b09fa/allinnia-01.webp 185w,\n/static/d86855c9ee74e8dfbf169ded0631f5c3/407fa/allinnia-01.webp 370w,\n/static/d86855c9ee74e8dfbf169ded0631f5c3/a550a/allinnia-01.webp 740w,\n/static/d86855c9ee74e8dfbf169ded0631f5c3/63a41/allinnia-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Aperture Loupe", - "slug": "/apertureloupe/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#384848", - "images": { - "fallback": { - "src": "/static/04fa21ff7752ace46c954f5995deb0d5/53a0b/apertureloupe-01.png", - "srcSet": "/static/04fa21ff7752ace46c954f5995deb0d5/6f0a4/apertureloupe-01.png 185w,\n/static/04fa21ff7752ace46c954f5995deb0d5/556c8/apertureloupe-01.png 370w,\n/static/04fa21ff7752ace46c954f5995deb0d5/53a0b/apertureloupe-01.png 740w,\n/static/04fa21ff7752ace46c954f5995deb0d5/d4077/apertureloupe-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/04fa21ff7752ace46c954f5995deb0d5/b09fa/apertureloupe-01.webp 185w,\n/static/04fa21ff7752ace46c954f5995deb0d5/407fa/apertureloupe-01.webp 370w,\n/static/04fa21ff7752ace46c954f5995deb0d5/a550a/apertureloupe-01.webp 740w,\n/static/04fa21ff7752ace46c954f5995deb0d5/63a41/apertureloupe-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Adiumeetie", - "slug": "/adiumeetie/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#b8b8b8", - "images": { - "fallback": { - "src": "/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/53a0b/adiumeetie-01.png", - "srcSet": "/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/6f0a4/adiumeetie-01.png 185w,\n/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/556c8/adiumeetie-01.png 370w,\n/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/53a0b/adiumeetie-01.png 740w,\n/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/d4077/adiumeetie-01.png 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/b09fa/adiumeetie-01.webp 185w,\n/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/407fa/adiumeetie-01.webp 370w,\n/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/a550a/adiumeetie-01.webp 740w,\n/static/d58bb3fcb97a3fbaa31ec8f1e4703c7e/63a41/adiumeetie-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } - }, - { - "node": { - "title": "Niépce's Camera Obscura", - "slug": "/niepces-camera-obscura/", - "img": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "constrained", - "backgroundColor": "#282828", - "images": { - "fallback": { - "src": "/static/d40b5eff60152eada7bbbc6c03f5c8a8/5cdf2/niepces-camera-obscura-01.jpg", - "srcSet": "/static/d40b5eff60152eada7bbbc6c03f5c8a8/a8510/niepces-camera-obscura-01.jpg 185w,\n/static/d40b5eff60152eada7bbbc6c03f5c8a8/99090/niepces-camera-obscura-01.jpg 370w,\n/static/d40b5eff60152eada7bbbc6c03f5c8a8/5cdf2/niepces-camera-obscura-01.jpg 740w,\n/static/d40b5eff60152eada7bbbc6c03f5c8a8/1f62b/niepces-camera-obscura-01.jpg 1480w", - "sizes": "(min-width: 740px) 740px, 100vw" - }, - "sources": [ - { - "srcSet": "/static/d40b5eff60152eada7bbbc6c03f5c8a8/b09fa/niepces-camera-obscura-01.webp 185w,\n/static/d40b5eff60152eada7bbbc6c03f5c8a8/407fa/niepces-camera-obscura-01.webp 370w,\n/static/d40b5eff60152eada7bbbc6c03f5c8a8/a550a/niepces-camera-obscura-01.webp 740w,\n/static/d40b5eff60152eada7bbbc6c03f5c8a8/63a41/niepces-camera-obscura-01.webp 1480w", - "type": "image/webp", - "sizes": "(min-width: 740px) 740px, 100vw" - } - ] - }, - "width": 740, - "height": 411 - } - } - } - } + "src": "/images/oceanprotocol-market-05.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAI0lEQVR4nGP4////u3fvpKWkOdnYGf7////h3QdJCSkmJmYAwiIMS8eeLo0AAAAASUVORK5CYII=" } ] }, - "projectImageFiles": { - "edges": [ - { - "node": { - "name": "repos" - } - }, - { - "node": { - "name": "meta" - } - }, - { - "node": { - "name": "resume" - } - }, - { - "node": { - "name": "chartmogul-05" - } - }, - { - "node": { - "name": "ezeep-06" - } - }, - { - "node": { - "name": "ezeep-05" - } - }, - { - "node": { - "name": "ipixelpad-01" - } - }, - { - "node": { - "name": "projects" - } - }, - { - "node": { - "name": "allinnia-02" - } - }, - { - "node": { - "name": "ezeep-03" - } - }, - { - "node": { - "name": "ipdb-04" - } - }, - { - "node": { - "name": "oceanprotocol-commons-02" - } - }, - { - "node": { - "name": "oceanprotocol-commons-04" - } - }, - { - "node": { - "name": "oceanprotocol-ipfs-02" - } - }, - { - "node": { - "name": "oceanprotocol-v1-06" - } - }, - { - "node": { - "name": "allinnia-03" - } - }, - { - "node": { - "name": "ezeep-07" - } - }, - { - "node": { - "name": "unihalle-03" - } - }, - { - "node": { - "name": "apertureloupe-01" - } - }, - { - "node": { - "name": "ipdb-01" - } - }, - { - "node": { - "name": "oceanprotocol-commons-03" - } - }, - { - "node": { - "name": "oceanprotocol-ipfs-01" - } - }, - { - "node": { - "name": "oceanprotocol-v1-04" - } - }, - { - "node": { - "name": "coffeecup-01" - } - }, - { - "node": { - "name": "oceanprotocol-v1-03" - } - }, - { - "node": { - "name": "bigchaindb-02" - } - }, - { - "node": { - "name": "ezeep-04" - } - }, - { - "node": { - "name": "ipdb-03" - } - }, - { - "node": { - "name": "mrreader-01" - } - }, - { - "node": { - "name": "oceanprotocol-commons-01" - } - }, - { - "node": { - "name": "unihalle-02" - } - }, - { - "node": { - "name": "chartmogul-02" - } - }, - { - "node": { - "name": "mrreader-02" - } - }, - { - "node": { - "name": "chartmogul-03" - } - }, - { - "node": { - "name": "ezeep-02" - } - }, - { - "node": { - "name": "oceanprotocol-v1-02" - } - }, - { - "node": { - "name": "bigchaindb-05" - } - }, - { - "node": { - "name": "ipdb-02" - } - }, - { - "node": { - "name": "outofwhaleoil-01" - } - }, - { - "node": { - "name": "outofwhaleoil-02" - } - }, - { - "node": { - "name": "9984-02" - } - }, - { - "node": { - "name": "bigchaindb-03" - } - }, - { - "node": { - "name": "ezeep-08" - } - }, - { - "node": { - "name": "niepces-camera-obscura-01" - } - }, - { - "node": { - "name": "niepces-camera-obscura-02" - } - }, - { - "node": { - "name": "oceanprotocol-v1-01" - } - }, - { - "node": { - "name": "unihalle-01" - } - }, - { - "node": { - "name": "adiumeetie-01" - } - }, - { - "node": { - "name": "outofwhaleoil-03" - } - }, - { - "node": { - "name": "ezeep-01" - } - }, - { - "node": { - "name": "chartmogul-01" - } - }, - { - "node": { - "name": "oceanprotocol-commons-05" - } - }, - { - "node": { - "name": "9984-01" - } - }, - { - "node": { - "name": "oceanprotocol-v1-05" - } - }, - { - "node": { - "name": "bigchaindb-04" - } - }, - { - "node": { - "name": "chartmogul-04" - } - }, - { - "node": { - "name": "oceanprotocol-v1-07" - } - }, - { - "node": { - "name": "sharethemeal-01" - } - }, - { - "node": { - "name": "mrreader-03" - } - }, - { - "node": { - "name": "projectpurple-01" - } - }, - { - "node": { - "name": "bigchaindb-01" - } - }, - { - "node": { - "name": "biv-01" - } - }, - { - "node": { - "name": "allinnia-01" - } - }, - { - "node": { - "name": "favicon" - } - }, - { - "node": { - "name": "github-header" - } - }, - { - "node": { - "name": "twitter-card" - } - }, - { - "node": { - "name": "index" - } - }, - { - "node": { - "name": "logo" - } - }, - { - "node": { - "name": "avatar" - } + { + "title": "Ocean Protocol - IPFS Integration", + "slug": "oceanprotocol-ipfs", + "description": "In 2019 I was leading the integration of IPFS into the Ocean Protocol stack, from the core to the libraries, up to the UI in multiple touchpoints. \n\nFor making IPFS as decentralized file storage solution as seemless as possible to use within Ocean Protocol, a public IPFS node was created with a simple user-facing UI and API. The integration was completed by allowing users to add their files to IPFS directly in the [Commons](/oceanprotocol-commons/) publish flow.\n", + "descriptionHtml": "In 2019 I was leading the integration of IPFS into the Ocean Protocol stack, from the core to the libraries, up to the UI in multiple touchpoints. \n\nFor making IPFS as decentralized file storage solution as seemless as possible to use within Ocean Protocol, a public IPFS node was created with a simple user-facing UI and API. The integration was completed by allowing users to add their files to IPFS directly in the [Commons](/oceanprotocol-commons/) publish flow.
", + "techstack": [ + "HTML", + "CSS", + "formatScript", + "React", + "Next.js", + "Docker", + "Kubernetes", + "Jest", + "IPFS" + ], + "links": [ + { + "title": "Ocean Protocol and IPFS, Sitting In The Merkle Tree", + "icon": "FileText", + "url": "https://kremalicious.com/ocean-protocol-and-ipfs-sitting-in-the-merkle-tree\n" + }, + { + "title": "ipfs.oceanprotocol.com", + "icon": "Compass", + "url": "https://ipfs.oceanprotocol.com" + }, + { + "title": "@oceanprotocol/ipfs", + "icon": "GitHub", + "url": "https://github.com/oceanprotocol/ipfs" + } + ], + "images": [ + { + "src": "/images/oceanprotocol-ipfs-01.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAI0lEQVR4nGP4+vXr7p07c7Nzr127zjBz5kxlZWVRUdH+/n4AytEM9VH+hkgAAAAASUVORK5CYII=" + }, + { + "src": "/images/oceanprotocol-ipfs-02.png", + "width": 2880, + "height": 1600, + "format": "png", + "blurDataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAIAAADwyuo0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGklEQVR4nGMoKirS09UrAgOGoqKi+WAA5AAAgRQK8sS0QUEAAAAASUVORK5CYII=" } ] - }, - "extensions": {} -} + } +] diff --git a/tests/__fixtures__/resume.json b/tests/__fixtures__/resume.json deleted file mode 100644 index a38dfd3..0000000 --- a/tests/__fixtures__/resume.json +++ /dev/null @@ -1,264 +0,0 @@ -{ - "contentJson": { - "basics": { - "name": "Matthias Kretschmann", - "label": "Designer & Developer", - "picture": { - "childImageSharp": { - "gatsbyImageData": { - "layout": "fixed", - "images": { - "fallback": { - "src": "/static/b45f45aa8d98d4e4019a242d38f2f248/68974/avatar.jpg", - "srcSet": "/static/b45f45aa8d98d4e4019a242d38f2f248/68974/avatar.jpg 256w,\n/static/b45f45aa8d98d4e4019a242d38f2f248/3c367/avatar.jpg 512w", - "sizes": "256px" - }, - "sources": [ - { - "srcSet": "/static/b45f45aa8d98d4e4019a242d38f2f248/22bfc/avatar.webp 256w,\n/static/b45f45aa8d98d4e4019a242d38f2f248/d689f/avatar.webp 512w", - "type": "image/webp", - "sizes": "256px" - } - ] - }, - "width": 256, - "height": 256 - } - } - }, - "email": "m@kretschmann.io", - "website": "https://matthiaskretschmann.com", - "summary": "", - "profiles": [ - { - "network": "Blog", - "url": "https://kremalicious.com", - "username": null - }, - { - "network": "Twitter", - "url": "https://twitter.com/kremalicious", - "username": "kremalicious" - }, - { - "network": "GitHub", - "url": "https://github.com/kremalicious", - "username": "kremalicious" - } - ], - "location": { - "city": "Berlin", - "countryCode": "DE" - } - }, - "education": [ - { - "institution": "Self-taught", - "area": "UI Design & Web Development", - "studyType": "Autodidactic", - "startDate": "1999-01-01", - "endDate": "2004-01-01" - }, - { - "institution": "Martin Luther University Halle-Wittenberg", - "area": "Media/Communication Science & Art History", - "studyType": "Bachelor of Arts", - "startDate": "2008-01-01", - "endDate": "2012-01-01" - }, - { - "institution": "Martin Luther University Halle-Wittenberg", - "area": "Political Science & Sociology", - "studyType": "Magister Artium", - "startDate": "2006-01-01", - "endDate": "2008-01-01" - } - ], - "languages": [ - { - "language": "English", - "fluency": "Advanced speaker" - }, - { - "language": "German", - "fluency": "Native speaker" - } - ], - "skills": [ - { - "name": "Design", - "level": "Master", - "keywords": [ - "Product Design", - "Service Design", - "Interface Design", - "User Experience Design", - "Communication Design", - "Interaction Design", - "Information Architecture", - "Icon Design", - "Web Design", - "Typography", - "Design management" - ] - }, - { - "name": "Web Development", - "level": "Master", - "keywords": [ - "HTML", - "CSS", - "Javascript", - "Node.js", - "npm ecosystem", - "SASS/SCSS", - "Less", - "Stylus", - "Gulp", - "Gatsby", - "React", - "Styled Components", - "JAMstack" - ] - }, - { - "name": "General Software Development", - "level": "Master", - "keywords": [ - "Git", - "GitHub", - "Bash", - "UNIX", - "Agile: Kanban & Scrum", - "Prototyping", - "Incremental" - ] - }, - { - "name": "DevOps", - "level": "Intermediate", - "keywords": [ - "AWS", - "Now", - "Serverless", - "Cloudflare", - "NGINX", - "Apache" - ] - } - ], - "work": [ - { - "company": "Ocean Protocol Foundation", - "position": "Lead UI Designer & Developer", - "website": "https://oceanprotocol.com", - "startDate": "2017-01-01", - "endDate": null, - "summary": "Co-Founded the Ocean Protocol project and as a core developer leading the execution of [multiple user interfaces](/oceanprotocol) and core components.\n\nIn general, leading the UI design & development of Ocean Protocol's user interfaces, iterating on a components-based UI design system spanning all of Ocean Protocol's web properties. This also includes the conceptualization, execution and iteration of the creative and visual direction of the Ocean Protocol visual brand." - }, - { - "company": "BigchainDB GmbH", - "position": "Lead UI Designer & Developer", - "website": "https://bigchaindb.com", - "startDate": "2016-12-01", - "endDate": "2018-12-31", - "summary": "Leading the UI design & development of all BigchainDB web properties. I created the initial BigchainDB brand and further conceptualized, executed and iterated on the creative and visual direction of BigchainDB. This included creating and iterating on a components-based UI design system for all of [BigchainDB's user interfaces](/bigchaindb)." - }, - { - "company": "ascribe GmbH", - "position": "UI Designer & Developer", - "website": "https://ascribe.io", - "startDate": "2016-01-01", - "endDate": "2017-12-31", - "summary": "Leading the technical architecture of ascribe's web presence, and maintaining the front-end of the product." - }, - { - "company": "ChartMogul Ltd.", - "position": "Lead UI Engineer", - "website": "https://chartmogul.com", - "startDate": "2015-07-15", - "endDate": "2017-02-01", - "summary": "Co-designing and leading the UI design & development of various [ChartMogul web properties](/chartmogul), helping the company to position itself as a market leader. This included the creation of a components-based UI design system and implementing it across all web touch points.\n\nBesides designing and implementing new features, I maintained the front-end of the ChartMogul application and implemented the UI design system by refactoring most of its front-end codebase." - }, - { - "company": "UN World Food Programme/ShareTheMeal", - "position": "UI Engineer", - "website": "https://sharethemeal.org", - "startDate": "2014-10-01", - "endDate": "2015-06-01", - "summary": "Leading the creation of the [website for ShareTheMeal](/sharethemeal) and assisting in building and consulting for the iOS and Android app." - }, - { - "company": "ezeep GmbH", - "position": "Lead Designer & Front End Developer", - "website": "https://ezeep.com", - "startDate": "2012-01-01", - "endDate": "2014-09-01", - "summary": "Creating an unprecedented, market-leading & award-winning user experience around printing based on the principles of emotional design way ahead of all competitors.\n\nThis included defining the product based on user & market research in an iterative process and designing & building [ezeep’s numerous touch points](/ezeep), like the web app, web site, desktop apps for Windows & Mac OS X and apps for iOS & Android.\n\nOn top of that I created the corporate identity and a consistent visual branding, including the logo." - }, - { - "company": "Martin Luther University Halle-Wittenberg", - "position": "UI/UX Designer & Front End Developer", - "website": null, - "startDate": "2009-02-01", - "endDate": "2012-01-01", - "summary": "Conceptualizing & implementing [numerous in-house and public facing interfaces](/unihalle) for thousands of students and staff. Additionally, conceptualizing, creating and maintaining the blog network & community for all students & staff." - }, - { - "company": "Harz University of Applied Sciences", - "position": "Consultant & Teacher", - "website": null, - "startDate": "2011-02-01", - "endDate": "2011-05-01", - "summary": "Conceptualizing a web design & development university seminar and building a [responsive & fluid grid framework](https://github.com/kremalicious/hsresponsive) with a basic HTML/CSS template for students of Media Informatics at the Harz University of Applied Sciences to learn and use." - }, - { - "company": "Martin Luther University Halle-Wittenberg", - "position": "Consultant & Teacher", - "website": null, - "startDate": "2011-02-01", - "endDate": "2011-05-01", - "summary": "Conceptualizing a WordPress-based web design university seminar and building a minimal starting theme for students of media & communication science at the MLU Halle-Wittenberg to learn and use." - }, - { - "company": "Shortmoves", - "position": "Web Designer & Developer", - "website": null, - "startDate": "2009-01-01", - "endDate": "2010-01-01", - "summary": "Creating & managing the web presence and marketing material of the International Shortfilm Festival Shortmoves in Halle (Saale), Germany." - }, - { - "company": "Agentur Ahron", - "position": "Co-Founder & Photojournalist & Photographer", - "website": null, - "startDate": "2005-01-01", - "endDate": "2008-12-31", - "summary": "Co-founded and built up a photo agency from the ground up and worked as a photographer ranging from journalistic works for news agencies & newspapers to photographic work for private clients." - }, - { - "company": "Freelance", - "position": "Designer & Developer", - "website": null, - "startDate": "2004-01-01", - "endDate": null, - "summary": "Numerous projects and clients as a UI/UX Designer, Front End Developer, Icon Designer & Photographer." - } - ], - "awards": [ - { - "title": "German Design Award", - "date": "2015-11-01", - "awarder": "ezeep GmbH", - "summary": "Nominated in the category _Interactive User Experience (Excellent Communications Design)_" - }, - { - "title": "CeBIT Preview Award", - "date": "2013-11-01", - "awarder": "ezeep GmbH", - "summary": null - } - ] - }, - "extensions": {} -} diff --git a/tests/__mocks__/file-mock.js b/tests/__mocks__/file-mock.js deleted file mode 100644 index 6f60e34..0000000 --- a/tests/__mocks__/file-mock.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'div' diff --git a/tests/__mocks__/gatsby.js b/tests/__mocks__/gatsby.js deleted file mode 100644 index 1c0680a..0000000 --- a/tests/__mocks__/gatsby.js +++ /dev/null @@ -1,27 +0,0 @@ -const React = require('react') -const gatsby = jest.requireActual('gatsby') - -module.exports = { - ...gatsby, - graphql: jest.fn(), - Link: jest.fn().mockImplementation( - // these props are invalid for an `a` tag - ({ - activeClassName, - activeStyle, - getProps, - innerRef, - partiallyActive, - // ref, - replace, - to, - ...rest - }) => - React.createElement('a', { - ...rest, - href: to - }) - ), - StaticQuery: jest.fn(), - useStaticQuery: jest.fn() -} diff --git a/tests/__mocks__/matchMedia.ts b/tests/__mocks__/matchMedia.ts new file mode 100644 index 0000000..e4341f4 --- /dev/null +++ b/tests/__mocks__/matchMedia.ts @@ -0,0 +1,27 @@ +const matchMediaMock = Object.defineProperty(window, 'matchMedia', { + writable: true, + value: jest + .fn() + .mockImplementationOnce((query) => ({ + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), // deprecated + removeListener: jest.fn(), // deprecated + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn() + })) + .mockImplementation((query) => ({ + matches: true, + media: query, + onchange: null, + addListener: jest.fn(), // deprecated + removeListener: jest.fn(), // deprecated + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn() + })) +}) + +export default matchMediaMock diff --git a/tests/__mocks__/svgr-mock.js b/tests/__mocks__/svgr-mock.js deleted file mode 100644 index d067fa0..0000000 --- a/tests/__mocks__/svgr-mock.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = { ReactComponent: 'svg' } diff --git a/tests/__mocks__/svgr-mock.tsx b/tests/__mocks__/svgr-mock.tsx new file mode 100644 index 0000000..84cc9f4 --- /dev/null +++ b/tests/__mocks__/svgr-mock.tsx @@ -0,0 +1,10 @@ +import React, { SVGProps } from 'react' + +const SvgrMock = React.forwardRef