diff --git a/gatsby-browser.js b/gatsby-browser.js new file mode 100644 index 0000000..6701837 --- /dev/null +++ b/gatsby-browser.js @@ -0,0 +1 @@ +import "./src/styles/global.css" \ No newline at end of file diff --git a/gatsby-config.js b/gatsby-config.js index 42ec303..6653fa8 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -6,5 +6,15 @@ module.exports = { /* Your site config here */ - plugins: [], + plugins: [ + `gatsby-transformer-json`, + { + resolve: `gatsby-source-filesystem`, + options: { + name: `jsondata`, + path: `./src/data`, + }, + }, + `gatsby-plugin-react-helmet`, + ], } diff --git a/package-lock.json b/package-lock.json index 662c3de..fb6bf65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,9 @@ "license": "0BSD", "dependencies": { "gatsby": "^2.26.1", + "gatsby-plugin-react-helmet": "^3.5.0", + "gatsby-source-filesystem": "^2.6.1", + "gatsby-transformer-json": "^2.6.0", "react": "^16.12.0", "react-dom": "^16.12.0" }, @@ -1910,6 +1913,11 @@ "node": ">=6" } }, + "node_modules/@tokenizer/token": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.1.1.tgz", + "integrity": "sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w==" + }, "node_modules/@turist/fetch": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.1.7.tgz", @@ -2072,6 +2080,15 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/readable-stream": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.9.tgz", + "integrity": "sha512-sqsgQqFT7HmQz/V5jH1O0fvQQnXAJO46Gg9LRO/JPfjmVmGUlcx831TZZO3Y3HtWhIkzf3kTsNT0Z0kzIhIvZw==", + "dependencies": { + "@types/node": "*", + "safe-buffer": "*" + } + }, "node_modules/@types/rimraf": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz", @@ -7277,6 +7294,23 @@ "node": ">= 4" } }, + "node_modules/file-type": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.0.1.tgz", + "integrity": "sha512-rwXqMZiizJd0uXZE52KN2DtPBAV99qz9cUTHHt8pSyaQzgVYrHJGR0qt2p4N/yzHEL/tGrlB/TgawQb4Fnxxyw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.0.3", + "token-types": "^2.0.0", + "typedarray-to-buffer": "^3.1.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -7780,9 +7814,9 @@ } }, "node_modules/gatsby-core-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.4.0.tgz", - "integrity": "sha512-wU6huyGZ8aJ/8Izfc7D39ujxaCz/jFtznufmMSXLnEBwLF5MWGsmECx4i2nfTb2kkkTFc+n0i/rx///UnPUURg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.5.0.tgz", + "integrity": "sha512-hCt44m7I9Kmra/iVJwrmHXK8WFK9I1JwXQZquIVZ/JaG8UgqroxW1wpsY7ColbHGMATOmp13Efqn02VNPnms5Q==", "dependencies": { "ci-info": "2.0.0", "configstore": "^5.0.1", @@ -7880,6 +7914,21 @@ "node": ">=10" } }, + "node_modules/gatsby-plugin-react-helmet": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.5.0.tgz", + "integrity": "sha512-/gv+CpW1/F+r6e8hH0XTgvycAq0/yfkOukTCIh1p6a4j9ivPonyZ9zAJgRUiW2IuxCFOeUGWJu2mTTuIpbwkWg==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "gatsby": "^2.0.0", + "react-helmet": "^5.1.3 || ^6.0.0" + } + }, "node_modules/gatsby-plugin-typescript": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.6.0.tgz", @@ -8117,6 +8166,64 @@ "node": ">=8.3.0" } }, + "node_modules/gatsby-source-filesystem": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.6.1.tgz", + "integrity": "sha512-XQvQewST3uH8bDjyLMv5srqc0Hh1eIzVkPLMXpcWoszlUX/MSCdY8+boZjLAx8YK0O65MLCr66sV9qFDBldjAw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "better-queue": "^3.8.10", + "chokidar": "^3.4.2", + "file-type": "^16.0.0", + "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.5.0", + "got": "^9.6.0", + "md5-file": "^5.0.0", + "mime": "^2.4.6", + "pretty-bytes": "^5.4.1", + "progress": "^2.0.3", + "valid-url": "^1.0.9", + "xstate": "^4.13.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "gatsby": "^2.2.0" + } + }, + "node_modules/gatsby-source-filesystem/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gatsby-source-filesystem/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/gatsby-telemetry": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.4.1.tgz", @@ -8143,6 +8250,21 @@ "node": ">=10.13.0" } }, + "node_modules/gatsby-transformer-json": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/gatsby-transformer-json/-/gatsby-transformer-json-2.6.0.tgz", + "integrity": "sha512-hSaMk5/rVhTkNrY/xF0W6BIyhKlUdEcRM8te4j2Xw9l7VGduwPo8jHMBanapQwY4mhJqaFODjSfw4OefYH46NQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "bluebird": "^3.7.2" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "gatsby": "^2.0.15" + } + }, "node_modules/gatsby/node_modules/ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -12275,6 +12397,14 @@ "node": ">=0.12" } }, + "node_modules/peek-readable": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-3.1.0.tgz", + "integrity": "sha512-KGuODSTV6hcgdZvDrIDBUkN0utcAVj1LL7FfGbM0viKTtCHmtZcuEJ+lGqsp0fTFkGqesdtemV2yUSMeyy3ddA==", + "engines": { + "node": ">=8" + } + }, "node_modules/physical-cpu-count": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", @@ -13203,6 +13333,17 @@ "node": ">=10.13.0" } }, + "node_modules/pretty-bytes": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", + "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", @@ -13848,6 +13989,27 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-3.0.0.tgz", "integrity": "sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw==" }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==", + "peer": true + }, + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "peer": true, + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, "node_modules/react-hot-loader": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.13.0.tgz", @@ -13892,6 +14054,15 @@ "node": ">=0.10.0" } }, + "node_modules/react-side-effect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "peer": true, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0" + } + }, "node_modules/read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -14014,6 +14185,31 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.0.tgz", + "integrity": "sha512-HNmLb3n0SteGAs8HQlErYPGeO+y7cvL/mVUKtXeUkl0iCZ/2GIgKGrCFHyS7UXFnO8uc9U+0y3pYIzAPsjFfvA==", + "dependencies": { + "@types/readable-stream": "^2.3.9", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -15801,6 +15997,24 @@ "node": ">=8" } }, + "node_modules/strtok3": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.0.4.tgz", + "integrity": "sha512-rqWMKwsbN9APU47bQTMEYTPcwdpKDtmf1jVhHzNW2cL1WqAxaM9iBb9t5P2fj+RV2YsErUWgQzHD5JwV0uCTEQ==", + "dependencies": { + "@tokenizer/token": "^0.1.1", + "@types/debug": "^4.1.5", + "peek-readable": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strtok3/node_modules/@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" + }, "node_modules/style-loader": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", @@ -16265,6 +16479,18 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-2.0.0.tgz", + "integrity": "sha512-WWvu8sGK8/ZmGusekZJJ5NM6rRVTTDO7/bahz4NGiSDb/XsmdYBn6a1N/bymUHuWYTWeuLUg98wUzvE4jPdCZw==", + "dependencies": { + "@tokenizer/token": "^0.1.0", + "ieee754": "^1.1.13" + }, + "engines": { + "node": ">=0.1.98" + } + }, "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -20062,6 +20288,11 @@ "defer-to-connect": "^1.0.1" } }, + "@tokenizer/token": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.1.1.tgz", + "integrity": "sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w==" + }, "@turist/fetch": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.1.7.tgz", @@ -20224,6 +20455,15 @@ "csstype": "^3.0.2" } }, + "@types/readable-stream": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.9.tgz", + "integrity": "sha512-sqsgQqFT7HmQz/V5jH1O0fvQQnXAJO46Gg9LRO/JPfjmVmGUlcx831TZZO3Y3HtWhIkzf3kTsNT0Z0kzIhIvZw==", + "requires": { + "@types/node": "*", + "safe-buffer": "*" + } + }, "@types/rimraf": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz", @@ -24625,6 +24865,17 @@ } } }, + "file-type": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.0.1.tgz", + "integrity": "sha512-rwXqMZiizJd0uXZE52KN2DtPBAV99qz9cUTHHt8pSyaQzgVYrHJGR0qt2p4N/yzHEL/tGrlB/TgawQb4Fnxxyw==", + "requires": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.0.3", + "token-types": "^2.0.0", + "typedarray-to-buffer": "^3.1.5" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -25198,9 +25449,9 @@ } }, "gatsby-core-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.4.0.tgz", - "integrity": "sha512-wU6huyGZ8aJ/8Izfc7D39ujxaCz/jFtznufmMSXLnEBwLF5MWGsmECx4i2nfTb2kkkTFc+n0i/rx///UnPUURg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.5.0.tgz", + "integrity": "sha512-hCt44m7I9Kmra/iVJwrmHXK8WFK9I1JwXQZquIVZ/JaG8UgqroxW1wpsY7ColbHGMATOmp13Efqn02VNPnms5Q==", "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", @@ -25282,6 +25533,14 @@ } } }, + "gatsby-plugin-react-helmet": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.5.0.tgz", + "integrity": "sha512-/gv+CpW1/F+r6e8hH0XTgvycAq0/yfkOukTCIh1p6a4j9ivPonyZ9zAJgRUiW2IuxCFOeUGWJu2mTTuIpbwkWg==", + "requires": { + "@babel/runtime": "^7.12.5" + } + }, "gatsby-plugin-typescript": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.6.0.tgz", @@ -25476,6 +25735,54 @@ } } }, + "gatsby-source-filesystem": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.6.1.tgz", + "integrity": "sha512-XQvQewST3uH8bDjyLMv5srqc0Hh1eIzVkPLMXpcWoszlUX/MSCdY8+boZjLAx8YK0O65MLCr66sV9qFDBldjAw==", + "requires": { + "@babel/runtime": "^7.12.5", + "better-queue": "^3.8.10", + "chokidar": "^3.4.2", + "file-type": "^16.0.0", + "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.5.0", + "got": "^9.6.0", + "md5-file": "^5.0.0", + "mime": "^2.4.6", + "pretty-bytes": "^5.4.1", + "progress": "^2.0.3", + "valid-url": "^1.0.9", + "xstate": "^4.13.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + } + } + }, "gatsby-telemetry": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.4.1.tgz", @@ -25498,6 +25805,15 @@ "uuid": "3.4.0" } }, + "gatsby-transformer-json": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/gatsby-transformer-json/-/gatsby-transformer-json-2.6.0.tgz", + "integrity": "sha512-hSaMk5/rVhTkNrY/xF0W6BIyhKlUdEcRM8te4j2Xw9l7VGduwPo8jHMBanapQwY4mhJqaFODjSfw4OefYH46NQ==", + "requires": { + "@babel/runtime": "^7.12.5", + "bluebird": "^3.7.2" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -28728,6 +29044,11 @@ "sha.js": "^2.4.8" } }, + "peek-readable": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-3.1.0.tgz", + "integrity": "sha512-KGuODSTV6hcgdZvDrIDBUkN0utcAVj1LL7FfGbM0viKTtCHmtZcuEJ+lGqsp0fTFkGqesdtemV2yUSMeyy3ddA==" + }, "physical-cpu-count": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", @@ -29514,6 +29835,11 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==" }, + "pretty-bytes": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", + "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==" + }, "pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", @@ -30056,6 +30382,24 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-3.0.0.tgz", "integrity": "sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw==" }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==", + "peer": true + }, + "react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "peer": true, + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + } + }, "react-hot-loader": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.13.0.tgz", @@ -30093,6 +30437,13 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" }, + "react-side-effect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "peer": true, + "requires": {} + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -30189,6 +30540,27 @@ "util-deprecate": "~1.0.1" } }, + "readable-web-to-node-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.0.tgz", + "integrity": "sha512-HNmLb3n0SteGAs8HQlErYPGeO+y7cvL/mVUKtXeUkl0iCZ/2GIgKGrCFHyS7UXFnO8uc9U+0y3pYIzAPsjFfvA==", + "requires": { + "@types/readable-stream": "^2.3.9", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -31761,6 +32133,23 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, + "strtok3": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.0.4.tgz", + "integrity": "sha512-rqWMKwsbN9APU47bQTMEYTPcwdpKDtmf1jVhHzNW2cL1WqAxaM9iBb9t5P2fj+RV2YsErUWgQzHD5JwV0uCTEQ==", + "requires": { + "@tokenizer/token": "^0.1.1", + "@types/debug": "^4.1.5", + "peek-readable": "^3.1.0" + }, + "dependencies": { + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" + } + } + }, "style-loader": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", @@ -32134,6 +32523,15 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "token-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-2.0.0.tgz", + "integrity": "sha512-WWvu8sGK8/ZmGusekZJJ5NM6rRVTTDO7/bahz4NGiSDb/XsmdYBn6a1N/bymUHuWYTWeuLUg98wUzvE4jPdCZw==", + "requires": { + "@tokenizer/token": "^0.1.0", + "ieee754": "^1.1.13" + } + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", diff --git a/package.json b/package.json index 7bd1511..3ab943d 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,9 @@ }, "dependencies": { "gatsby": "^2.26.1", + "gatsby-plugin-react-helmet": "^3.5.0", + "gatsby-source-filesystem": "^2.6.1", + "gatsby-transformer-json": "^2.6.0", "react": "^16.12.0", "react-dom": "^16.12.0" }, diff --git a/src/components/bodyBuilder/index.js b/src/components/bodyBuilder/index.js new file mode 100644 index 0000000..b940e63 --- /dev/null +++ b/src/components/bodyBuilder/index.js @@ -0,0 +1,75 @@ +import React from "react" + +import MainBanner from "../bodyComponents/mainBanner" +import TextBlockBtn from "../bodyComponents/textBlockBtn" +import Purchase from "../bodyComponents/purchase" +import FeaturedTalks from "../bodyComponents/featuredTalks" +import FeaturedSpeakers from "../bodyComponents/featuredSpeakers" + +const bodyBuilder = (props) => { + let section = null + + switch (props.sectionType) { + case('mainBanner'): + section = ( + + ) + break; + + case ('textBlockBtn'): + section = ( + + ) + break + + case ('purchase'): + section = ( + + ) + break + + case ('featuredTalks'): + section = ( + + ) + break + + case ('featuredSpeakers'): + section = ( + + ) + break + + default: + section = null + + } + + return ( + <> + { section } + + ) +} + +export default bodyBuilder \ No newline at end of file diff --git a/src/components/bodyComponents/featuredSpeakers/featuredSpeakers.module.css b/src/components/bodyComponents/featuredSpeakers/featuredSpeakers.module.css new file mode 100644 index 0000000..0205ca8 --- /dev/null +++ b/src/components/bodyComponents/featuredSpeakers/featuredSpeakers.module.css @@ -0,0 +1,86 @@ +.featuredSpeakers { + display: grid; + grid-template-colums: 100%; + align-items: center; + justify-content: center; + background-color: white; + padding: 50px 20px; +} + +.featuredTalks h1 { +} + +.cardsSection { + max-width: 1240px; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: auto; + grid-gap: 20px; +} + +@media only screen and (min-width: 500px) { + .cardsSection { + grid-template-columns: 1fr 1fr; + } +} + +@media only screen and (min-width: 900px) { + .cardsSection { + grid-template-columns: 1fr 1fr 1fr 1fr; + } +} + +@media only screen and (min-width: 1230px) { + .cardsSection { + grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; + } +} + +.singleCard { + background: #fff; + border-radius: 6px; + text-decoration: none; + color: #444; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + min-height: 100%; + position: relative; + top: 0; + transition: all .1s ease-in; + overflow: hidden; + +} + +.singleCard:hover{ + top: -2px; + box-shadow: 0 4px 5px rgba(0,0,0,0.2); +} + +.singleCard img { + height: 200px; + width: 100%; + object-fit: cover; +} + +.singleCardText { + padding: 0 20px 20px; + text-align: center; +} + +.singleCard h2 { + text-size: 1.2rem; +} + +.singleCard p {} +.position{ + font-weight: bold; +} + +.company{ + font-style: italic; +} + +.speakerBio { + display: none; +} \ No newline at end of file diff --git a/src/components/bodyComponents/featuredSpeakers/index.js b/src/components/bodyComponents/featuredSpeakers/index.js new file mode 100644 index 0000000..337f1f2 --- /dev/null +++ b/src/components/bodyComponents/featuredSpeakers/index.js @@ -0,0 +1,25 @@ +import React from "react" + +import styles from "./featuredSpeakers.module.css" + +const featuredSpeakers = (props) => ( +
+

{props.currentSectionData.textH1}

+
+ {props.currentSectionData.speakersCards.map(card => ( +
+ {card.imgAlt +
+

{card.speaker}

+
{card.position}
+
{card.company}
+
{card.speakerBio}
+
+
+ )) + } +
+
+) + +export default featuredSpeakers \ No newline at end of file diff --git a/src/components/bodyComponents/featuredTalks/featuredTalks.module.css b/src/components/bodyComponents/featuredTalks/featuredTalks.module.css new file mode 100644 index 0000000..dba70b9 --- /dev/null +++ b/src/components/bodyComponents/featuredTalks/featuredTalks.module.css @@ -0,0 +1,86 @@ +.featuredTalks { + display: grid; + grid-template-colums: 100%; + align-items: center; + justify-content: center; + background-color: #0080bf; + padding: 50px 20px; +} + +.featuredTalks h1 { + color: white; +} + +.cardsSection { + max-width: 1240px; + display: grid; + grid-template-columns: 290px; + grid-template-rows: auto; + grid-gap: 20px; +} + +@media only screen and (min-width: 500px) { + .cardsSection { + grid-template-columns: 290px 290px; + } +} + +@media only screen and (min-width: 900px) { + .cardsSection { + grid-template-columns: 290px 290px 290px; + } +} + +@media only screen and (min-width: 1230px) { + .cardsSection { + grid-template-columns: 290px 290px 290px 290px; + } +} + +.singleCard { + background: #fff; + border-radius: 6px; + text-decoration: none; + color: #444; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + min-height: 100%; + position: relative; + top: 0; + transition: all .1s ease-in; + overflow: hidden; + +} + +.singleCard:hover{ + top: -2px; + box-shadow: 0 4px 5px rgba(0,0,0,0.2); +} + +.singleCard img { + height: 200px; + width: 100%; + object-fit: cover; +} + +.singleCardText { + padding: 0 20px 20px; +} + +.singleCard h2 { + text-size: 1.2rem; +} + +.singleCard p {} +.author{ + font-weight: bold; +} + +.position{ + font-style: italic; +} +.moreDetails{ + text-align: center; + font-weight: bold; +} diff --git a/src/components/bodyComponents/featuredTalks/index.js b/src/components/bodyComponents/featuredTalks/index.js new file mode 100644 index 0000000..5539e0c --- /dev/null +++ b/src/components/bodyComponents/featuredTalks/index.js @@ -0,0 +1,26 @@ +import React from "react" + +import styles from "./featuredTalks.module.css" + +const featuredTalks = (props) => ( +
+

{props.currentSectionData.textH1}

+
+ {props.currentSectionData.talksCards.map(card => ( +
+ {card.imgAlt +
+

{card.topic}

+
{card.author}
+
{card.position} @ {card.company}
+

{card.brief}

+
More details
+
+
+ )) + } +
+
+) + +export default featuredTalks \ No newline at end of file diff --git a/src/components/bodyComponents/mainBanner/index.js b/src/components/bodyComponents/mainBanner/index.js new file mode 100644 index 0000000..01fc7fd --- /dev/null +++ b/src/components/bodyComponents/mainBanner/index.js @@ -0,0 +1,17 @@ +import React from "react" + +import styles from "./mainBanner.module.css" + +const mainBanner = ( props ) => ( +
+

{props.currentSectionData.textH1}

+ {props.currentSectionData.imgAlt +
+) + + +export default mainBanner \ No newline at end of file diff --git a/src/components/bodyComponents/mainBanner/mainBanner.module.css b/src/components/bodyComponents/mainBanner/mainBanner.module.css new file mode 100644 index 0000000..287cd96 --- /dev/null +++ b/src/components/bodyComponents/mainBanner/mainBanner.module.css @@ -0,0 +1,15 @@ +.mainBanner { + display: flex; + flex-flow: column; + align-items: center; + padding: 0 0 50px 0; +} + +.mainBanner h1 { + color: rgba(149,76,214,1); +} + +.mainBanner img { + width: 860px; + +} \ No newline at end of file diff --git a/src/components/bodyComponents/purchase/index.js b/src/components/bodyComponents/purchase/index.js new file mode 100644 index 0000000..8882683 --- /dev/null +++ b/src/components/bodyComponents/purchase/index.js @@ -0,0 +1,47 @@ +import React from "react" + +import styles from "./purchase.module.css" + +const purchase = (props) => ( +
+

I can't keep your reservation forever - hurry up! ;)

+
+ {props.currentSectionData.ticketSalesOpen ? + props.currentSectionData.ticketTypes.map(ticket => ( +
+
{ticket.ticketName}
+ {ticket.ticketType === "purchase" ? + <> +
{new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD' + }).format(ticket.price)}
+ + + : + <> +
No value
+ + + } +
+ )) + :
We will start selling tickets very soon. Come back in mid-January to reserve your spot!
+ } +
+
+ ) + + +export default purchase \ No newline at end of file diff --git a/src/components/bodyComponents/purchase/purchase.module.css b/src/components/bodyComponents/purchase/purchase.module.css new file mode 100644 index 0000000..b593d64 --- /dev/null +++ b/src/components/bodyComponents/purchase/purchase.module.css @@ -0,0 +1,84 @@ +.purchaseMain { + display: grid; + grid-template-colums: 100%; + align-items: center; + justify-content: center; + background-color: white; + padding: 50px 20px; +} + +.purchaseMain h1 { + color: rgba(149,76,214,1); +} + +.items { + max-width: 1240px; + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + grid-gap: 20px; +} + +@media only screen and (min-width: 500px) { + .items { + grid-template-columns: 1fr 1fr; + } +} + +@media only screen and (min-width: 900px) { + .items { + grid-template-columns: 1fr 1fr 1fr 1fr; + } +} + +.item { + background: #fff; + border-radius: 6px; + border: 3px solid #f37055; + text-decoration: none; + color: #444; + display: flex; + flex-direction: column; + align-items: center; + align-content: space-between; + min-height: 130px; + min-width: 180px; + position: relative; +} + +.item:hover{ + box-shadow: 0 0 5px 5px rgba(243, 112, 85, 0.2); +} + +.ticketName { + padding: 10px 0; + font-weight: 600; +} + +.price { + padding-bottom: 10px; + font-weight: 400; +} + +.buyNow { + width: 150px; + height: 30px; + font-size: 1rem; + text-transform: uppercase; + background: linear-gradient(60deg, + #f79533, #f37055, #ef4e7b, #a166ab, + #5073b8, #1098ad, #07b39b, #6fba82); + background-size: 400% 400%; + text-align: center; + --borderWidth: 3px; + position: relative; + border-radius: var(--borderWidth); + color: white; +} + +/* Motion frames */ +@keyframes gradient { + 0% {background-position: 0% 50%;} + 50% {background-position: 100% 50%;} + 100% {background-position: 0% 50%;} +} \ No newline at end of file diff --git a/src/components/bodyComponents/textBlockBtn/index.js b/src/components/bodyComponents/textBlockBtn/index.js new file mode 100644 index 0000000..6cd2022 --- /dev/null +++ b/src/components/bodyComponents/textBlockBtn/index.js @@ -0,0 +1,20 @@ +import React from "react" +import { navigate } from "gatsby" + +import styles from "./textBlockBtn.module.css" + +const mainBanner = ( props ) => ( +
+

{props.currentSectionData.textH1}

+

{props.currentSectionData.textP}

+
navigate(props.currentSectionData.btnLinkTo)} + aria-hidden="true" + > + {props.currentSectionData.btnText} +
+
+) + +export default mainBanner \ No newline at end of file diff --git a/src/components/bodyComponents/textBlockBtn/textBlockBtn.module.css b/src/components/bodyComponents/textBlockBtn/textBlockBtn.module.css new file mode 100644 index 0000000..8f7f272 --- /dev/null +++ b/src/components/bodyComponents/textBlockBtn/textBlockBtn.module.css @@ -0,0 +1,42 @@ +.textBlockBtn { + display: flex; + flex-flow: column; + align-items: center; + padding: 50px 0 50px 0; +} + +.textBlockBtn h1 { + color: rgba(149,76,214,1); +} + +.textBlockBtn p { + width: 860px; +} + +.textBlockBtn .button { + display: flex; + align-items: center; + justify-content: center; + width: 200px; + height: 50px; + font-size: 1.2rem; + font-weight: bold; + text-transform: uppercase; + background: linear-gradient(60deg, + #f79533, #f37055, #ef4e7b, #a166ab, + #5073b8, #1098ad, #07b39b, #6fba82); + background-size: 400% 400%; + text-align: center; + --borderWidth: 3px; + position: relative; + border-radius: var(--borderWidth); + animation: gradient 3s ease-in-out infinite; + color: white; +} + +/* Motion frames */ +@keyframes gradient { + 0% {background-position: 0% 50%;} + 50% {background-position: 100% 50%;} + 100% {background-position: 0% 50%;} +} \ No newline at end of file diff --git a/src/components/footer/footer.module.css b/src/components/footer/footer.module.css new file mode 100644 index 0000000..935abb7 --- /dev/null +++ b/src/components/footer/footer.module.css @@ -0,0 +1,12 @@ +.footer { + margin: 20px 20px; + display: flex; + flex-flow: row; + justify-content: space-evenly; + color: white; +} + +.footer a { + text-decoration: none; + color: white; +} \ No newline at end of file diff --git a/src/components/footer/index.js b/src/components/footer/index.js new file mode 100644 index 0000000..604edc3 --- /dev/null +++ b/src/components/footer/index.js @@ -0,0 +1,30 @@ +import React from "react" +import { Link } from "gatsby" + +import { useFooterMetadata } from "../../hooks/use-footer-metadata.js" + +import styles from "./footer.module.css" + +const Footer = () => { + const {footer} = useFooterMetadata() + + return ( +
+
+
+ {footer.disclaimer} +
+ {footer.links.map(link =>( +
+ + {link.name} + +
+ ))} +
+
+ ) + +} + +export default Footer \ No newline at end of file diff --git a/src/components/navigation/Logo/index.js b/src/components/navigation/Logo/index.js new file mode 100644 index 0000000..82c784e --- /dev/null +++ b/src/components/navigation/Logo/index.js @@ -0,0 +1,12 @@ +import React from "react" + +import styles from "./logo.module.css" + +const logo = (props) => ( +
+ {props.alt +
+ ) + + +export default logo \ No newline at end of file diff --git a/src/components/navigation/Logo/logo.module.css b/src/components/navigation/Logo/logo.module.css new file mode 100644 index 0000000..b15ff14 --- /dev/null +++ b/src/components/navigation/Logo/logo.module.css @@ -0,0 +1,9 @@ +.logo { + padding: 8px; + height: 100%; + box-sizing: border-box; +} + +.logo img { + height: 100%; +} \ No newline at end of file diff --git a/src/components/navigation/navbar/index.js b/src/components/navigation/navbar/index.js new file mode 100644 index 0000000..7609d6f --- /dev/null +++ b/src/components/navigation/navbar/index.js @@ -0,0 +1,32 @@ +import React from "react" + +import Logo from "../logo" +import NavigationItems from "../navigationItems" + +import styles from "./navbar.module.css" + +const navbar = (props) => ( +
+
+
+ +
+

{props.navigationData.conferenceTitle}

+
+ +
+) + + +export default navbar \ No newline at end of file diff --git a/src/components/navigation/navbar/navbar.module.css b/src/components/navigation/navbar/navbar.module.css new file mode 100644 index 0000000..bd0c239 --- /dev/null +++ b/src/components/navigation/navbar/navbar.module.css @@ -0,0 +1,36 @@ +.navbar { + height: 70px; + width: 100%; + position: fixed; + top: 0; + left: 0; + display: flex; + justify-content: space-between; + align-items: center; + box-sizing: border-box; + z-index:90; +} + +.leftSection { + margin: 0 0 0 20px; + padding: 0; + list-style: none; + display: flex; + flex-flow: row; + align-items: center; + height: 100%; +} + +.leftSection h1 { + color: white; +} + + +.navbar nav { + height: 100%; +} + +.logo { + height: 200%; +} + diff --git a/src/components/navigation/navigationItems/index.js b/src/components/navigation/navigationItems/index.js new file mode 100644 index 0000000..e48eea6 --- /dev/null +++ b/src/components/navigation/navigationItems/index.js @@ -0,0 +1,37 @@ +import React from "react" +import { Link } from "gatsby" + +import styles from "./navigationItems.module.css" + +const navigationItems = (props) => ( +
    + {props.linksList.map(link => ( +
  • + {link.sublinks.length !== 0 ? +
    + +
      + {link.sublinks.map(sublink => ( +
    • + + {sublink.name} + +
    • + ))} +
    +
    + : + {link.name} + } +
  • + ) + ) + } +
+) + +export default navigationItems \ No newline at end of file diff --git a/src/components/navigation/navigationItems/navigationItems.module.css b/src/components/navigation/navigationItems/navigationItems.module.css new file mode 100644 index 0000000..bad2c34 --- /dev/null +++ b/src/components/navigation/navigationItems/navigationItems.module.css @@ -0,0 +1,86 @@ +.navigationItems { + margin: 0 20px; + padding: 0; + list-style: none; + display: flex; + flex-flow: row; + align-items: center; + height: 100%; +} + +.navigationItem { + margin: 0; + box-sizing: border-box; + display: flex; + height: 100%; + width: auto; + align-items: center; +} + +.navigationItem:hover, +.navigationItem a:active{ + border-bottom: 4px solid white; + color: white; +} + +.navigationItem a { + color: white; + text-decoration: none; + padding: 16px 10px; + font-size: 16px; +} + +.dropdown { + position: relative; + display: inline-block; + float: right; +} + +.dropbtn{ + color: white; + text-decoration: none; + padding: 16px 10px; + border: none; + outline: none; + background-color: inherit; + font-family: inherit; + font-size: 16px; + margin: 0; + cursor: pointer; +} + +.dropdown + +.dropdownContents { + display: none; + position: absolute; + right: 0; + margin: 0; + padding: 0; +} + +.dropdownContent { + box-sizing: border-box; + list-style: none; + right: 0; + min-width: 160px; + background-color: #f9f9f9; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 91; +} + +.dropdownContent a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; +} + +.dropdownContents a:hover {background-color: #ddd;} + +.dropdown:hover .dropdownContents {display: block;} + + + + + diff --git a/src/components/seo/index.js b/src/components/seo/index.js new file mode 100644 index 0000000..17853d1 --- /dev/null +++ b/src/components/seo/index.js @@ -0,0 +1,54 @@ +import React from "react" +import PropTypes from "prop-types" +import { Helmet } from "react-helmet" + +import { usePageMetadata } from "../../hooks/use-page-metadata.js" + +const SEO = ({ description, lang, meta, title }) => { + const seoData = usePageMetadata() + + const metaDescription = description || seoData.seo.description + + return ( + + ) +} + +SEO.defaultProps = { + lang: `en`, + meta: [], + description: ``, +} + +SEO.propTypes = { + description: PropTypes.string, + lang: PropTypes.string, + meta: PropTypes.arrayOf(PropTypes.object), + title: PropTypes.string.isRequired, +} + +export default SEO \ No newline at end of file diff --git a/src/data/indexpage.json b/src/data/indexpage.json new file mode 100755 index 0000000..87c6719 --- /dev/null +++ b/src/data/indexpage.json @@ -0,0 +1,317 @@ +{ + "siteWideProps":{ + "footer":{ + "backgroundColor":"#333333", + "disclaimer":"Copyright GopherCon 2051", + "links":[ + { + "id":1, + "name":"Need a ticket?", + "linkTo":"/tickets", + "onClick":"" + }, + { + "id":2, + "name":"Contact the organizer", + "linkTo":"", + "onClick":"contactForm" + } + ] + } + }, + "pages":[ + { + "id":1, + "page":"index", + "seo":{ + "title":"GopherCon - proposed website", + "description":"The non-official site of the GopherCon (only as the proposed version for the future development)", + "author":"Alex, the friendly gopher ;)" + }, + "header": + { + "bg":"black", + "logoImg":"gophercon2020-logo.webp", + "logoAlt": false, + "logoLnk":"/", + "conferenceTitle": "GopherCon 2051", + "links":[ + { + "id":1, + "name":"TOPICS", + "linkTo":"/topics/", + "sublinks": [] + }, + { + "id":2, + "name":"DISCOVER", + "linkTo":"/discover/", + "sublinks":[ + { + "id": 1, + "name":"AGENDA", + "linkTo":"/agenda" + }, + { + "id":2, + "name":"SPONSORS", + "linkTo":"/sponsors" + }, + { + "id":3, + "name":"PREVIOUS EVENTS", + "linkTo":"/previous-events" + } + ] + } + ] + }, + "testsection": [{"id": false}], + "sections":[ + { + "id":1, + "sectionType":"mainBanner", + "sectionData": { + "textH1":"Welcome to the official page of the GopherCon", + "backgroundColor":"rgba(214,184,240,1)", + "imgPath":"https://s3.amazonaws.com/bizzabo.users.files/0aRpnT1T6WDavN3uuEUl_Banner%20Website%20-%201920%20x%201080.png", + "imgAlt": false + } + }, + { + "id":2, + "sectionType":"textBlockBtn", + "sectionData": { + "textH1":"GoVirCon Store", + "textP":"GoVirCon wouldn't be GopherCon without swag! So we've designed some attire and swag you can purchase as a memento of this year's conference. Typically our in-person store raises funds for our scholarship program, but since online merchandising is more expensive, this store is just for fun! ", + "btnText":"Read more", + "btnLinkTo":"/gophercon-store", + "backgroundColor":"#f1f1f1" + } + }, + { + "id":3, + "sectionType":"purchase", + "sectionData": { + "ticketSalesOpen": true, + "ticketTypes":[ + { + "id":1, + "ticketType":"purchase", + "ticketName":"Student discounted", + "price":99.99 + }, + { + "id":2, + "ticketType":"purchase", + "ticketName":"Regular ticket", + "price":499.99 + }, + { + "id":3, + "ticketType":"purchase", + "ticketName":"VIP ticket ", + "price":999.99 + }, + { + "id":4, + "ticketType":"prepaid", + "ticketName":"Redeem your voucher", + "price":0 + } + ], + "backgroundColor":"#f1f1f1" + } + }, + { + "id":4, + "sectionType":"featuredTalks", + "sectionData": { + "textH1":"The following key talks are the most awaited:", + "talksCards":[ + { + "id":1, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583289369/e7typxgajbfl3c3gn3hw.jpg", + "imgAlt": false, + "topic":"Typing Generic Go", + "author":"Robert Griesemer", + "position":"Software Engineer", + "company":"Google Inc", + "brief":"Earlier this year the Go team announced the latest generics design draft. The key feature is the notion of constrained type parameters which enable generic functions and types. In this talk we explain how type parameters fit into Go's existing type system and how a compiler goes about type-checking generic Go code. If you are interested in a deeper understanding of generics for Go, this talk is for you!" + }, + { + "id":2, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1601322676/tlzrrz4h9eisybi3cy3b.png", + "imgAlt": false, + "topic":"The Quest for the Fastest Deployment Time", + "author":"L Körbes", + "position":"DevRel", + "company":"Tilt", + "brief":"When a developer changes a line of code, how long does it take for that code to run in their development cluster? L Körbes, an expert in Kubernetes development tooling, has seen the answers to that question vary between 1 second and… infinity. So how do you get your team’s code to stay on the 1 second side? In this talk, L will explore every avenue to make our “from code change to process running” benchmark faster, and show you whether to…" + }, + { + "id":3, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583294158/np2bnmhxasavzxf8qq9n.png", + "imgAlt": false, + "topic":"Write Once, Use Many: A Simple & Useful Package to Call Internal HTTP APIs", + "author":"Michael Richman", + "position":"Sr. Tech Lead", + "company":"Bitly", + "brief":"It’s a common pattern at most engineering organizations to have one service making calls to other, internal services. This talk is an introduction to a simple but powerful package we wrote at Bitly to make sure our calls are consistent, simple to write and easy to extend and maintain." + }, + { + "id":4, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1601322676/tlzrrz4h9eisybi3cy3b.png", + "imgAlt": false, + "topic":"The Quest for the Fastest Deployment Time", + "author":"L Körbes", + "position":"DevRel", + "company":"Tilt", + "brief":"When a developer changes a line of code, how long does it take for that code to run in their development cluster? L Körbes, an expert in Kubernetes development tooling, has seen the answers to that question vary between 1 second and… infinity. So how do you get your team’s code to stay on the 1 second side? In this talk, L will explore every avenue to make our “from code change to process running” benchmark faster, and show you whether to…" + }, + { + "id":5, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583289369/e7typxgajbfl3c3gn3hw.jpg", + "imgAlt": false, + "topic":"Typing Generic Go", + "author":"Robert Griesemer", + "position":"Software Engineer", + "company":"Google Inc", + "brief":"Earlier this year the Go team announced the latest generics design draft. The key feature is the notion of constrained type parameters which enable generic functions and types. In this talk we explain how type parameters fit into Go's existing type system and how a compiler goes about type-checking generic Go code. If you are interested in a deeper understanding of generics for Go, this talk is for you!" + }, + { + "id":6, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583294158/np2bnmhxasavzxf8qq9n.png", + "imgAlt": false, + "topic":"Write Once, Use Many: A Simple & Useful Package to Call Internal HTTP APIs", + "author":"Michael Richman", + "position":"Sr. Tech Lead", + "company":"Bitly", + "brief":"It’s a common pattern at most engineering organizations to have one service making calls to other, internal services. This talk is an introduction to a simple but powerful package we wrote at Bitly to make sure our calls are consistent, simple to write and easy to extend and maintain." + }, + { + "id":7, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583289369/e7typxgajbfl3c3gn3hw.jpg", + "imgAlt": false, + "topic":"Typing Generic Go", + "author":"Robert Griesemer", + "position":"Software Engineer", + "company":"Google Inc", + "brief":"Earlier this year the Go team announced the latest generics design draft. The key feature is the notion of constrained type parameters which enable generic functions and types. In this talk we explain how type parameters fit into Go's existing type system and how a compiler goes about type-checking generic Go code. If you are interested in a deeper understanding of generics for Go, this talk is for you!" + }, + { + "id":8, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1601322676/tlzrrz4h9eisybi3cy3b.png", + "imgAlt": false, + "topic":"The Quest for the Fastest Deployment Time", + "author":"L Körbes", + "position":"DevRel", + "company":"Tilt", + "brief":"When a developer changes a line of code, how long does it take for that code to run in their development cluster? L Körbes, an expert in Kubernetes development tooling, has seen the answers to that question vary between 1 second and… infinity. So how do you get your team’s code to stay on the 1 second side? In this talk, L will explore every avenue to make our “from code change to process running” benchmark faster, and show you whether to…" + } + ] + } + }, + { + "id":5, + "sectionType":"featuredSpeakers", + "sectionData": { + "textH1":"Meet our featured speakers:", + "speakersCards":[ + { + "id":1, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583289369/e7typxgajbfl3c3gn3hw.jpg", + "imgAlt": false, + "speaker":"Robert Griesemer", + "position":"Software Engineer", + "company":"Google Inc", + "speakerBio":"Robert Griesemer is one of the designers of the Go programming language. Before Go, Robert worked on Google's V8 JavaScript engine and the domain-specific language Sawzall. He was a founding member of the team that created the Java HotSpot virtual machine and the Strongtalk system. Currently, Robert is mostly focusing on generics for Go. He likes things that \"just work.\"" + }, + { + "id":2, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1601322676/tlzrrz4h9eisybi3cy3b.png", + "imgAlt": false, + "speaker":"L Körbes", + "position":"DevRel", + "company":"Tilt", + "speakerBio":"L Körbes does DevRel at Tilt. Having worked at both Garden and Tilt—two of the few companies 100% focused on development experience with Kubernetes—L is immersed in developer-facing issues, and constantly working on them. L got their start with Kubernetes by writing code for kubectl, in a SIG CLI internship. They've since spoken about Go and Kubernetes at many world-famous events." + }, + { + "id":3, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583294158/np2bnmhxasavzxf8qq9n.png", + "imgAlt": false, + "speaker":"Michael Richman", + "position":"Sr. Tech Lead", + "company":"Bitly", + "speakerBio":"Michael is a senior engineer at Bitly. He’s been working in Go for about 5 years. He’s been writing software for about 20 years. Bitly, the link management platform, was an early adopter of Go. Michael lives in Denver and works in the Bitly Denver office." + }, + { + "id":4, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1601322676/tlzrrz4h9eisybi3cy3b.png", + "imgAlt": false, + "speaker":"L Körbes", + "position":"DevRel", + "company":"Tilt", + "speakerBio":"L Körbes does DevRel at Tilt. Having worked at both Garden and Tilt—two of the few companies 100% focused on development experience with Kubernetes—L is immersed in developer-facing issues, and constantly working on them. L got their start with Kubernetes by writing code for kubectl, in a SIG CLI internship. They've since spoken about Go and Kubernetes at many world-famous events." + }, + { + "id":5, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583289369/e7typxgajbfl3c3gn3hw.jpg", + "imgAlt": false, + "speaker":"Robert Griesemer", + "position":"Software Engineer", + "company":"Google Inc", + "speakerBio":"Robert Griesemer is one of the designers of the Go programming language. Before Go, Robert worked on Google's V8 JavaScript engine and the domain-specific language Sawzall. He was a founding member of the team that created the Java HotSpot virtual machine and the Strongtalk system. Currently, Robert is mostly focusing on generics for Go. He likes things that \"just work.\"" + }, + { + "id":6, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583294158/np2bnmhxasavzxf8qq9n.png", + "imgAlt": false, + "speaker":"Michael Richman", + "position":"Sr. Tech Lead", + "company":"Bitly", + "speakerBio":"Michael is a senior engineer at Bitly. He’s been working in Go for about 5 years. He’s been writing software for about 20 years. Bitly, the link management platform, was an early adopter of Go. Michael lives in Denver and works in the Bitly Denver office." + }, + { + "id":7, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583289369/e7typxgajbfl3c3gn3hw.jpg", + "imgAlt": false, + "speaker":"Robert Griesemer", + "position":"Software Engineer", + "company":"Google Inc", + "speakerBio":"Robert Griesemer is one of the designers of the Go programming language. Before Go, Robert worked on Google's V8 JavaScript engine and the domain-specific language Sawzall. He was a founding member of the team that created the Java HotSpot virtual machine and the Strongtalk system. Currently, Robert is mostly focusing on generics for Go. He likes things that \"just work.\"" + }, + { + "id":8, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1601322676/tlzrrz4h9eisybi3cy3b.png", + "imgAlt": false, + "speaker":"L Körbes", + "position":"DevRel", + "company":"Tilt", + "speakerBio":"L Körbes does DevRel at Tilt. Having worked at both Garden and Tilt—two of the few companies 100% focused on development experience with Kubernetes—L is immersed in developer-facing issues, and constantly working on them. L got their start with Kubernetes by writing code for kubectl, in a SIG CLI internship. They've since spoken about Go and Kubernetes at many world-famous events." + }, + { + "id":9, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1583294158/np2bnmhxasavzxf8qq9n.png", + "imgAlt": false, + "speaker":"Michael Richman", + "position":"Sr. Tech Lead", + "company":"Bitly", + "speakerBio":"Michael is a senior engineer at Bitly. He’s been working in Go for about 5 years. He’s been writing software for about 20 years. Bitly, the link management platform, was an early adopter of Go. Michael lives in Denver and works in the Bitly Denver office." + }, + { + "id":10, + "imgPath":"https://res.cloudinary.com/bizzaboprod/image/upload/c_crop,g_custom,f_auto/v1601322676/tlzrrz4h9eisybi3cy3b.png", + "imgAlt": false, + "speaker":"L Körbes", + "position":"DevRel", + "company":"Tilt", + "speakerBio":"L Körbes does DevRel at Tilt. Having worked at both Garden and Tilt—two of the few companies 100% focused on development experience with Kubernetes—L is immersed in developer-facing issues, and constantly working on them. L got their start with Kubernetes by writing code for kubectl, in a SIG CLI internship. They've since spoken about Go and Kubernetes at many world-famous events." + } + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/hooks/use-footer-metadata.js b/src/hooks/use-footer-metadata.js new file mode 100644 index 0000000..71e0e3d --- /dev/null +++ b/src/hooks/use-footer-metadata.js @@ -0,0 +1,28 @@ +import { graphql, useStaticQuery } from "gatsby" + +export const useFooterMetadata = () => { + const query = useStaticQuery( + graphql` + { + allDataJson{ + edges { + node { + siteWideProps { + footer { + backgroundColor + disclaimer + links { + id + name + linkTo + onClick + } + } + } + } + } + } + } + `) + return query.allDataJson.edges[0].node.siteWideProps +} \ No newline at end of file diff --git a/src/hooks/use-page-metadata.js b/src/hooks/use-page-metadata.js new file mode 100644 index 0000000..3fde988 --- /dev/null +++ b/src/hooks/use-page-metadata.js @@ -0,0 +1,85 @@ +import { graphql, useStaticQuery } from "gatsby" + +export const usePageMetadata = () => { + const query = useStaticQuery( + graphql` + { + allDataJson(filter: { + pages: { + elemMatch: {page: {eq: "index"}, + sections: {elemMatch: {id: {eq: 1}}}}}} + ) { + edges { + node { + pages { + id + page + seo { + title + description + author + } + sections { + id + sectionType + sectionData { + imgPath + textH1 + textP + backgroundColor + imgPath + imgAlt + btnText + btnLinkTo + ticketSalesOpen + ticketTypes { + id + ticketType + ticketName + price + } + talksCards { + id + imgPath + imgAlt + topic + author + position + company + brief + } + speakersCards { + id + imgPath + speaker + position + company + speakerBio + } + } + } + header { + bg + logoImg + logoLnk + logoAlt + conferenceTitle + links { + id + name + linkTo + sublinks { + id + name + linkTo + } + } + } + } + } + } + } + } + `) + return query.allDataJson.edges[0].node.pages[0] +} \ No newline at end of file diff --git a/src/pages/index.js b/src/pages/index.js index 8729fdc..6ec5dbf 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -1,5 +1,36 @@ import React from "react" -export default function Home() { - return
Hello world!
-} +import { usePageMetadata } from "../hooks/use-page-metadata.js" + +import SEO from '../components/seo/' +import Navbar from '../components/navigation/navbar' +import Bodysections from '../components/bodyBuilder' +import Footer from '../components/footer' + +export default () => { + const pageBuildingProps = usePageMetadata() + + return ( + <> + + +
+ { pageBuildingProps.sections.map (section => ( + + ))} +
+